Browse Source

Improve MQTT Power Limit Handling

pull/157/head^2
Andreas Schiffler 3 years ago
parent
commit
16d348dc0b
  1. 19
      tools/esp8266/app.cpp
  2. 8
      tools/esp8266/defines.h

19
tools/esp8266/app.cpp

@ -432,7 +432,6 @@ void app::cbMqtt(char* topic, byte* payload, unsigned int length) {
if (std::strcmp(token,"devcontrol")==0){ if (std::strcmp(token,"devcontrol")==0){
token = strtok(NULL, "/"); token = strtok(NULL, "/");
uint8_t iv_id = std::stoi(token); uint8_t iv_id = std::stoi(token);
uint8_t powerLimitControl = 0;
if (iv_id >= 0 && iv_id <= MAX_NUM_INVERTERS){ if (iv_id >= 0 && iv_id <= MAX_NUM_INVERTERS){
Inverter<> *iv = this->mSys->getInverterByPos(iv_id); Inverter<> *iv = this->mSys->getInverterByPos(iv_id);
if(NULL != iv) { if(NULL != iv) {
@ -442,24 +441,24 @@ void app::cbMqtt(char* topic, byte* payload, unsigned int length) {
case ActivePowerContr: // Active Power Control case ActivePowerContr: // Active Power Control
token = strtok(NULL, "/"); // get ControlMode aka "PowerPF.Desc" in DTU-Pro Code from topic string token = strtok(NULL, "/"); // get ControlMode aka "PowerPF.Desc" in DTU-Pro Code from topic string
if (token == NULL) // default via mqtt ommit the LimitControlMode if (token == NULL) // default via mqtt ommit the LimitControlMode
powerLimitControl = AbsolutNonPersistent; iv->powerLimit[1] = AbsolutNonPersistent;
else else
powerLimitControl = std::stoi(token); iv->powerLimit[1] = std::stoi(token);
// 0x0001 -> relativ limit in percent DPRINTLN(DBG_VERBOSE, F("iv->powerLimit[1]=") + String(iv->powerLimit[1]));
// 0x0000 -> absolut limit in Watt DPRINTLN(DBG_VERBOSE, F("length=") + String(length));
// 0x0101 -> persisten limit in percent (?) if (length<=5){ // if (std::stoi((char*)payload) > 0) more error handling powerlimit needed?
// ... if (iv->powerLimit[1] >= AbsolutNonPersistent && iv->powerLimit[1] <= RelativPersistent){
if (true){ // if (std::stoi((char*)payload) > 0) error handling powerlimit needed?
iv->devControlCmd = ActivePowerContr; iv->devControlCmd = ActivePowerContr;
iv->powerLimit[0] = std::stoi((char*)payload); iv->powerLimit[0] = std::stoi((char*)payload);
if (powerLimitControl >= AbsolutNonPersistent && powerLimitControl <= RelativNonPersistent)
iv->powerLimit[1] = powerLimitControl;
if (iv->powerLimit[1] & 0x0001) if (iv->powerLimit[1] & 0x0001)
DPRINTLN(DBG_INFO, F("Power limit for inverter ") + String(iv->id) + F(" set to ") + String(iv->powerLimit[0]) + F("%") ); DPRINTLN(DBG_INFO, F("Power limit for inverter ") + String(iv->id) + F(" set to ") + String(iv->powerLimit[0]) + F("%") );
else else
DPRINTLN(DBG_INFO, F("Power limit for inverter ") + String(iv->id) + F(" set to ") + String(iv->powerLimit[0]) + F("W") ); DPRINTLN(DBG_INFO, F("Power limit for inverter ") + String(iv->id) + F(" set to ") + String(iv->powerLimit[0]) + F("W") );
} }
iv->devControlRequest = true; iv->devControlRequest = true;
} else {
DPRINTLN(DBG_INFO, F("Invalid mqtt payload recevied: ") + String((char*)payload));
}
break; break;
case TurnOn: // Turn On case TurnOn: // Turn On
iv->devControlCmd = TurnOn; iv->devControlCmd = TurnOn;

8
tools/esp8266/defines.h

@ -58,10 +58,10 @@ typedef enum {
} DevControlCmdType; } DevControlCmdType;
typedef enum { // ToDo: to be verified by field tests typedef enum { // ToDo: to be verified by field tests
AbsolutNonPersistent = 0x0000, // 0 AbsolutNonPersistent = 0UL, // 0x0000
RelativNonPersistent = 0x0001, // 1 RelativNonPersistent = 1UL, // 0x0001
AbsolutPersistent = 0x0100, // 256 AbsolutPersistent = 256UL, // 0x0100
RelativPersistent = 0x0101 // 257 RelativPersistent = 257UL // 0x0101
} PowerLimitControlType; } PowerLimitControlType;
// minimum serial interval // minimum serial interval

Loading…
Cancel
Save