From 3b57550ead0a856d8d76db049841a7dc01371bda Mon Sep 17 00:00:00 2001 From: MalteSchm Date: Sun, 26 Mar 2023 11:02:40 +0200 Subject: [PATCH] adding basic mqtt support --- src/MqttHandleHuawei.cpp | 48 +++++++++++++++++++++++++--------------- src/main.cpp | 8 +++++-- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/MqttHandleHuawei.cpp b/src/MqttHandleHuawei.cpp index f6779b3b..2ecd4f49 100644 --- a/src/MqttHandleHuawei.cpp +++ b/src/MqttHandleHuawei.cpp @@ -7,6 +7,7 @@ #include "MqttSettings.h" #include "Huawei_can.h" // #include "Failsafe.h" +#include "WebApi_Huawei.h" #include #define TOPIC_SUB_LIMIT_ONLINE_VOLTAGE "limit_online_voltage" @@ -29,32 +30,39 @@ void MqttHandleHuaweiClass::init() MqttSettings.subscribe(String(topic + "huawei/cmd/" + TOPIC_SUB_LIMIT_ONLINE_CURRENT).c_str(), 0, std::bind(&MqttHandleHuaweiClass::onMqttMessage, this, _1, _2, _3, _4, _5, _6)); MqttSettings.subscribe(String(topic + "huawei/cmd/" + TOPIC_SUB_POWER).c_str(), 0, std::bind(&MqttHandleHuaweiClass::onMqttMessage, this, _1, _2, _3, _4, _5, _6)); - //pinMode(13, OUTPUT); - //digitalWrite(13,HIGH); + _lastPublish = millis(); } + void MqttHandleHuaweiClass::loop() { if (!MqttSettings.getConnected() ) { return; } - const CONFIG_T& config = Configuration.get(); - const RectifierParameters_t& rp = HuaweiCan.get(); + // FIXME - Some memory issue when this is enabled + return; - if (millis() - _lastPublish > (config.Mqtt_PublishInterval * 1000)) { - MqttSettings.publish("huawei/data_age", String((millis() - HuaweiCan.getLastUpdate()) / 1000)); - MqttSettings.publish("huawei/input_voltage", String(rp.input_voltage)); - MqttSettings.publish("huawei/input_current", String(rp.input_current)); - MqttSettings.publish("huawei/input_power", String(rp.input_power)); - MqttSettings.publish("huawei/output_voltage", String(rp.output_voltage)); - MqttSettings.publish("huawei/output_current", String(rp.output_current)); - MqttSettings.publish("huawei/max_output_current", String(rp.max_output_current)); - MqttSettings.publish("huawei/output_power", String(rp.output_power)); - MqttSettings.publish("huawei/input_temp", String(rp.input_temp)); - MqttSettings.publish("huawei/output_temp", String(rp.output_temp)); - MqttSettings.publish("huawei/efficiency", String(rp.efficiency)); + String json_string; + const CONFIG_T& config = Configuration.get(); + const RectifierParameters_t *rp = HuaweiCan.get(); + + if ((millis() - _lastPublish) > (config.Mqtt_PublishInterval * 1000) ) { + DynamicJsonDocument doc(256); + doc["data_age"] = (millis() - HuaweiCan.getLastUpdate()) / 1000; + doc[F("input_voltage")] = rp->input_voltage; + doc[F("input_current")] = rp->input_current; + doc[F("input_power")] = rp->input_power; + doc[F("output_voltage")] = rp->output_voltage; + doc[F("output_current")] = rp->output_current; + doc[F("max_output_current")] = rp->max_output_current; + doc[F("output_power")] = rp->output_power; + doc[F("input_temp")] = rp->input_temp; + doc[F("output_temp")] = rp->output_temp; + doc[F("efficiency")] = rp->efficiency; + serializeJson(doc, json_string); + MqttSettings.publish("huawei", json_string); yield(); _lastPublish = millis(); @@ -98,7 +106,11 @@ void MqttHandleHuaweiClass::onMqttMessage(const espMqttClientTypes::MessagePrope HuaweiCan.setValue(payload_val, HUAWEI_ONLINE_CURRENT); } else if (!strcmp(setting, TOPIC_SUB_POWER)) { // Control power on/off - MessageOutput.printf("Limit Current: %f A\r\n", payload_val); - //digitalWrite(13, payload_val > 0); + MessageOutput.printf("Power: %f A\r\n", payload_val); + if(payload_val > 0) { + HuaweiCan.setPower(true); + } else { + HuaweiCan.setPower(false); + } } } \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 3ebc1842..083c6ba9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -14,6 +14,7 @@ #include "MqttHandleVedirectHass.h" #include "MqttHandleInverter.h" #include "MqttHandleVedirect.h" +#include "MqttHandleHuawei.h" #include "MqttSettings.h" #include "NetworkSettings.h" #include "NtpSettings.h" @@ -100,6 +101,7 @@ void setup() MqttHandleVedirect.init(); MqttHandleHass.init(); MqttHandleVedirectHass.init(); + MqttHandleHuawei.init(); MessageOutput.println(F("done")); // Initialize WebApi @@ -163,8 +165,8 @@ void setup() // Initialize Huawei AC-charger PSU / CAN bus MessageOutput.println(F("Initialize Huawei AC charger interface... ")); if (PinMapping.isValidHuaweiConfig()) { - MessageOutput.printf("Huawei AC-charger miso = %d, mosi = %d, clk = %d, irq = %d, cs = %d\r\n", pin.huawei_miso, pin.huawei_mosi, pin.huawei_clk, pin.huawei_irq, pin.huawei_cs); - HuaweiCan.init(pin.huawei_miso, pin.huawei_mosi, pin.huawei_clk, pin.huawei_irq, pin.huawei_cs); + MessageOutput.printf("Huawei AC-charger miso = %d, mosi = %d, clk = %d, irq = %d, cs = %d, power_pin = %d\r\n", pin.huawei_miso, pin.huawei_mosi, pin.huawei_clk, pin.huawei_irq, pin.huawei_cs, pin.huawei_power); + HuaweiCan.init(pin.huawei_miso, pin.huawei_mosi, pin.huawei_clk, pin.huawei_irq, pin.huawei_cs, pin.huawei_power); MessageOutput.println(F("done")); } else { MessageOutput.println(F("Invalid pin config")); @@ -195,6 +197,8 @@ void loop() yield(); MqttHandleVedirectHass.loop(); yield(); + MqttHandleHuawei.loop(); + yield(); WebApi.loop(); yield(); Display.loop();