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 "Huawei_can.h"
// #include "Failsafe.h"
#include "WebApi_Huawei.h"
#include <ctime>
#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);
}
}
}

View File

@ -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();