adding basic mqtt support

This commit is contained in:
MalteSchm 2023-03-26 11:02:40 +02:00
parent bbf3d44d69
commit 3b57550ead
2 changed files with 36 additions and 20 deletions

View File

@ -7,6 +7,7 @@
#include "MqttSettings.h" #include "MqttSettings.h"
#include "Huawei_can.h" #include "Huawei_can.h"
// #include "Failsafe.h" // #include "Failsafe.h"
#include "WebApi_Huawei.h"
#include <ctime> #include <ctime>
#define TOPIC_SUB_LIMIT_ONLINE_VOLTAGE "limit_online_voltage" #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_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)); 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); _lastPublish = millis();
//digitalWrite(13,HIGH);
} }
void MqttHandleHuaweiClass::loop() void MqttHandleHuaweiClass::loop()
{ {
if (!MqttSettings.getConnected() ) { if (!MqttSettings.getConnected() ) {
return; return;
} }
const CONFIG_T& config = Configuration.get(); // FIXME - Some memory issue when this is enabled
const RectifierParameters_t& rp = HuaweiCan.get(); return;
if (millis() - _lastPublish > (config.Mqtt_PublishInterval * 1000)) { String json_string;
MqttSettings.publish("huawei/data_age", String((millis() - HuaweiCan.getLastUpdate()) / 1000)); const CONFIG_T& config = Configuration.get();
MqttSettings.publish("huawei/input_voltage", String(rp.input_voltage)); const RectifierParameters_t *rp = HuaweiCan.get();
MqttSettings.publish("huawei/input_current", String(rp.input_current));
MqttSettings.publish("huawei/input_power", String(rp.input_power)); if ((millis() - _lastPublish) > (config.Mqtt_PublishInterval * 1000) ) {
MqttSettings.publish("huawei/output_voltage", String(rp.output_voltage)); DynamicJsonDocument doc(256);
MqttSettings.publish("huawei/output_current", String(rp.output_current)); doc["data_age"] = (millis() - HuaweiCan.getLastUpdate()) / 1000;
MqttSettings.publish("huawei/max_output_current", String(rp.max_output_current)); doc[F("input_voltage")] = rp->input_voltage;
MqttSettings.publish("huawei/output_power", String(rp.output_power)); doc[F("input_current")] = rp->input_current;
MqttSettings.publish("huawei/input_temp", String(rp.input_temp)); doc[F("input_power")] = rp->input_power;
MqttSettings.publish("huawei/output_temp", String(rp.output_temp)); doc[F("output_voltage")] = rp->output_voltage;
MqttSettings.publish("huawei/efficiency", String(rp.efficiency)); 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(); yield();
_lastPublish = millis(); _lastPublish = millis();
@ -98,7 +106,11 @@ void MqttHandleHuaweiClass::onMqttMessage(const espMqttClientTypes::MessagePrope
HuaweiCan.setValue(payload_val, HUAWEI_ONLINE_CURRENT); HuaweiCan.setValue(payload_val, HUAWEI_ONLINE_CURRENT);
} else if (!strcmp(setting, TOPIC_SUB_POWER)) { } else if (!strcmp(setting, TOPIC_SUB_POWER)) {
// Control power on/off // Control power on/off
MessageOutput.printf("Limit Current: %f A\r\n", payload_val); MessageOutput.printf("Power: %f A\r\n", payload_val);
//digitalWrite(13, payload_val > 0); if(payload_val > 0) {
HuaweiCan.setPower(true);
} else {
HuaweiCan.setPower(false);
}
} }
} }

View File

@ -14,6 +14,7 @@
#include "MqttHandleVedirectHass.h" #include "MqttHandleVedirectHass.h"
#include "MqttHandleInverter.h" #include "MqttHandleInverter.h"
#include "MqttHandleVedirect.h" #include "MqttHandleVedirect.h"
#include "MqttHandleHuawei.h"
#include "MqttSettings.h" #include "MqttSettings.h"
#include "NetworkSettings.h" #include "NetworkSettings.h"
#include "NtpSettings.h" #include "NtpSettings.h"
@ -100,6 +101,7 @@ void setup()
MqttHandleVedirect.init(); MqttHandleVedirect.init();
MqttHandleHass.init(); MqttHandleHass.init();
MqttHandleVedirectHass.init(); MqttHandleVedirectHass.init();
MqttHandleHuawei.init();
MessageOutput.println(F("done")); MessageOutput.println(F("done"));
// Initialize WebApi // Initialize WebApi
@ -163,8 +165,8 @@ void setup()
// Initialize Huawei AC-charger PSU / CAN bus // Initialize Huawei AC-charger PSU / CAN bus
MessageOutput.println(F("Initialize Huawei AC charger interface... ")); MessageOutput.println(F("Initialize Huawei AC charger interface... "));
if (PinMapping.isValidHuaweiConfig()) { 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); 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); HuaweiCan.init(pin.huawei_miso, pin.huawei_mosi, pin.huawei_clk, pin.huawei_irq, pin.huawei_cs, pin.huawei_power);
MessageOutput.println(F("done")); MessageOutput.println(F("done"));
} else { } else {
MessageOutput.println(F("Invalid pin config")); MessageOutput.println(F("Invalid pin config"));
@ -195,6 +197,8 @@ void loop()
yield(); yield();
MqttHandleVedirectHass.loop(); MqttHandleVedirectHass.loop();
yield(); yield();
MqttHandleHuawei.loop();
yield();
WebApi.loop(); WebApi.loop();
yield(); yield();
Display.loop(); Display.loop();