From eec04de0442dfe9cf49c4ed4f55297e41ea2a83a Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Mon, 3 Oct 2022 18:51:32 +0200 Subject: [PATCH] Added MQTT Topic to turn inverter on and off --- docs/MQTT_Topics.md | 3 ++- src/MqttSettings.cpp | 29 ++++++++++++++++++----------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/docs/MQTT_Topics.md b/docs/MQTT_Topics.md index e4c8302..6d9243c 100644 --- a/docs/MQTT_Topics.md +++ b/docs/MQTT_Topics.md @@ -66,4 +66,5 @@ cmd topics are used to set values. Status topics are updated from values set in | [serial]/cmd/limit_persistent_relative | W | Set the inverter limit as a percentage of total production capability. The value will survive the night without power. The updated value will show up in the web GUI and limit_relative topic immediatly. | % | | [serial]/cmd/limit_persistent_absolute | W | Set the inverter limit as a absolute value. The value will survive the night without power. The updated value will show up in the web GUI and limit_relative topic after around 4 minutes. | Watt (W) | | [serial]/cmd/limit_nonpersistent_relative | W | Set the inverter limit as a percentage of total production capability. The value will reset to the last persistent value at night without power. The updated value will show up in the web GUI and limit_relative topic immediatly. | % | -| [serial]/cmd/limit_nonpersistent_absolute | W | Set the inverter limit as a absolute value. The value will reset to the last persistent value at night without power. The updated value will show up in the web GUI and limit_relative topic after around 4 minutes. | Watt (W) | \ No newline at end of file +| [serial]/cmd/limit_nonpersistent_absolute | W | Set the inverter limit as a absolute value. The value will reset to the last persistent value at night without power. The updated value will show up in the web GUI and limit_relative topic after around 4 minutes. | Watt (W) | +| [serial]/cmd/power | W | Turn the inverter on (1) or off (0) | 0 or 1 | \ No newline at end of file diff --git a/src/MqttSettings.cpp b/src/MqttSettings.cpp index e571d6e..650d035 100644 --- a/src/MqttSettings.cpp +++ b/src/MqttSettings.cpp @@ -14,6 +14,7 @@ #define TOPIC_SUB_LIMIT_PERSISTENT_ABSOLUTE "limit_persistent_absolute" #define TOPIC_SUB_LIMIT_NONPERSISTENT_RELATIVE "limit_nonpersistent_relative" #define TOPIC_SUB_LIMIT_NONPERSISTENT_ABSOLUTE "limit_nonpersistent_absolute" +#define TOPIC_SUB_POWER "power" MqttSettingsClass::MqttSettingsClass() { @@ -44,6 +45,7 @@ void MqttSettingsClass::onMqttConnect(bool sessionPresent) mqttClient->subscribe(String(topic + "+/cmd/" + TOPIC_SUB_LIMIT_PERSISTENT_ABSOLUTE).c_str(), 0); mqttClient->subscribe(String(topic + "+/cmd/" + TOPIC_SUB_LIMIT_NONPERSISTENT_RELATIVE).c_str(), 0); mqttClient->subscribe(String(topic + "+/cmd/" + TOPIC_SUB_LIMIT_NONPERSISTENT_ABSOLUTE).c_str(), 0); + mqttClient->subscribe(String(topic + "+/cmd/" + TOPIC_SUB_POWER).c_str(), 0); } void MqttSettingsClass::onMqttDisconnect(espMqttClientTypes::DisconnectReason reason) @@ -118,38 +120,43 @@ void MqttSettingsClass::onMqttMessage(const espMqttClientTypes::MessagePropertie char* strlimit = new char[len + 1]; memcpy(strlimit, payload, len); strlimit[len] = '\0'; - uint32_t limit = strtol(strlimit, NULL, 10); + uint32_t payload_val = strtol(strlimit, NULL, 10); delete[] strlimit; if (!strcmp(setting, TOPIC_SUB_LIMIT_PERSISTENT_RELATIVE)) { // Set inverter limit relative persistent - limit = min(100, limit); - Serial.printf("Limit Persistent: %d %%\n", limit); - inv->sendActivePowerControlRequest(Hoymiles.getRadio(), limit, PowerLimitControlType::RelativPersistent); + payload_val = min(100, payload_val); + Serial.printf("Limit Persistent: %d %%\n", payload_val); + inv->sendActivePowerControlRequest(Hoymiles.getRadio(), payload_val, PowerLimitControlType::RelativPersistent); } else if (!strcmp(setting, TOPIC_SUB_LIMIT_PERSISTENT_ABSOLUTE)) { // Set inverter limit absolute persistent - Serial.printf("Limit Persistent: %d W\n", limit); - inv->sendActivePowerControlRequest(Hoymiles.getRadio(), limit, PowerLimitControlType::AbsolutPersistent); + Serial.printf("Limit Persistent: %d W\n", payload_val); + inv->sendActivePowerControlRequest(Hoymiles.getRadio(), payload_val, PowerLimitControlType::AbsolutPersistent); } else if (!strcmp(setting, TOPIC_SUB_LIMIT_NONPERSISTENT_RELATIVE)) { // Set inverter limit relative non persistent - limit = min(100, limit); - Serial.printf("Limit Non-Persistent: %d %%\n", limit); + payload_val = min(100, payload_val); + Serial.printf("Limit Non-Persistent: %d %%\n", payload_val); if (!properties.retain) { - inv->sendActivePowerControlRequest(Hoymiles.getRadio(), limit, PowerLimitControlType::RelativNonPersistent); + inv->sendActivePowerControlRequest(Hoymiles.getRadio(), payload_val, PowerLimitControlType::RelativNonPersistent); } else { Serial.println("Ignored because retained"); } } else if (!strcmp(setting, TOPIC_SUB_LIMIT_NONPERSISTENT_ABSOLUTE)) { // Set inverter limit absolute non persistent - Serial.printf("Limit Non-Persistent: %d W\n", limit); + Serial.printf("Limit Non-Persistent: %d W\n", payload_val); if (!properties.retain) { - inv->sendActivePowerControlRequest(Hoymiles.getRadio(), limit, PowerLimitControlType::AbsolutNonPersistent); + inv->sendActivePowerControlRequest(Hoymiles.getRadio(), payload_val, PowerLimitControlType::AbsolutNonPersistent); } else { Serial.println("Ignored because retained"); } + + } else if(!strcmp(setting, TOPIC_SUB_POWER)) { + // Turn inverter on or off + Serial.printf("Set inverter power to: %d\n", payload_val); + inv->sendPowerControlRequest(Hoymiles.getRadio(), payload_val > 0); } }