2025-02-03 17:51:36 +01:00

160 lines
4.9 KiB
C++

/**
* @copyright Utilitech AS 2023
* License: Fair Source
*
*/
#ifndef _HOMEASSISTANTMQTTHANDLER_H
#define _HOMEASSISTANTMQTTHANDLER_H
#include "AmsMqttHandler.h"
#include "HomeAssistantStatic.h"
#include "AmsConfiguration.h"
#include "hexutils.h"
class HomeAssistantMqttHandler : public AmsMqttHandler {
public:
#if defined(AMS_REMOTE_DEBUG)
HomeAssistantMqttHandler(MqttConfig& mqttConfig, RemoteDebug* debugger, char* buf, uint8_t boardType, HomeAssistantConfig config, HwTools* hw, AmsFirmwareUpdater* updater) : AmsMqttHandler(mqttConfig, debugger, buf, updater) {
#else
HomeAssistantMqttHandler(MqttConfig& mqttConfig, Stream* debugger, char* buf, uint8_t boardType, HomeAssistantConfig config, HwTools* hw) : AmsMqttHandler(mqttConfig, debugger, buf) {
#endif
this->boardType = boardType;
this->hw = hw;
setHomeAssistantConfig(config);
};
bool publish(AmsData* data, AmsData* previousState, EnergyAccounting* ea, PriceService* ps);
bool publishTemperatures(AmsConfiguration*, HwTools*);
bool publishPrices(PriceService*);
bool publishSystem(HwTools* hw, PriceService* ps, EnergyAccounting* ea);
bool publishRaw(String data);
bool publishFirmware();
bool postConnect();
void onMessage(String &topic, String &payload);
uint8_t getFormat();
void setHomeAssistantConfig(HomeAssistantConfig config);
private:
uint8_t boardType;
String pubTopic;
String subTopic;
String deviceName;
String deviceModel;
String deviceUid;
String manufacturer;
String deviceUrl;
String statusTopic;
String sensorTopic;
String updateTopic;
String sensorNamePrefix;
bool l1Init, l2Init, l2eInit, l3Init, l3eInit, l4Init, l4eInit, rtInit, rteInit, pInit, sInit, rInit, fInit;
bool tInit[32] = {false};
bool prInit[38] = {false};
uint32_t lastThresholdPublish = 0;
HwTools* hw;
bool publishList1(AmsData* data, EnergyAccounting* ea);
bool publishList2(AmsData* data, EnergyAccounting* ea);
bool publishList3(AmsData* data, EnergyAccounting* ea);
bool publishList4(AmsData* data, EnergyAccounting* ea);
String getMeterModel(AmsData* data);
bool publishRealtime(AmsData* data, EnergyAccounting* ea, PriceService* ps);
void publishSensor(const HomeAssistantSensor sensor);
void publishList1Sensors();
void publishList1ExportSensors();
void publishList2Sensors();
void publishList2ExportSensors();
void publishList3Sensors();
void publishList3ExportSensors();
void publishList4Sensors();
void publishList4ExportSensors();
void publishRealtimeSensors(EnergyAccounting* ea, PriceService* ps);
void publishRealtimeExportSensors(EnergyAccounting* ea, PriceService* ps);
void publishTemperatureSensor(uint8_t index, String id);
void publishPriceSensors(PriceService* ps);
void publishSystemSensors();
void publishThresholdSensors();
String boardTypeToString(uint8_t b) {
switch(b) {
case 5:
#if defined(ESP8266)
return F("Pow-K");
#elif defined(ESP32)
return F("Pow-K+");
#endif
case 7:
#if defined(ESP8266)
return F("Pow-U");
#elif defined(ESP32)
return F("Pow-U+");
#endif
case 6:
return F("Pow-P1");
case 51:
return F("S2 mini");
case 50:
return F("ESP32-S2");
case 201:
return F("LOLIN D32");
case 202:
return F("HUZZAH32");
case 203:
return F("DevKitC");
case 200:
return F("ESP32");
case 2:
return F("HAN Reader 2.0 by Max Spencer");
case 0:
return F("Custom hardware by Roar Fredriksen");
case 1:
return F("Kamstrup module by Egil Opsahl");
case 3:
return F("Pow-K");
case 4:
return F("Pow-U");
case 101:
return F("D1 mini");
case 100:
return F("ESP8266");
case 70:
return F("ESP32-C3");
case 71:
return F("ESP32-C3-DevKitM-1");
case 80:
return F("ESP32-S3");
}
#if defined(ESP8266)
return F("ESP8266");
#elif defined(ESP32)
return F("ESP32");
#endif
};
String boardManufacturerToString(uint8_t b) {
if(b >= 3 && b <= 7)
return F("amsleser.no");
if(b < 50)
return F("Custom");
switch(b) {
case 51:
case 101:
case 201:
return F("Wemos");
case 202:
return F("Adafruit");
}
return F("Espressif");
};
};
#endif