Skip to content

Commit

Permalink
POC common topic path w,w/o HA auto discovery
Browse files Browse the repository at this point in the history
  • Loading branch information
ohAnd committed Jun 10, 2024
1 parent f4f965d commit 6d0261c
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 52 deletions.
8 changes: 4 additions & 4 deletions include/mqttHandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ class MQTTHandler {
public:
MQTTHandler(const char *broker, int port, const char *user, const char *password, bool useTLS, const char *sensorUniqueName);
void setup(bool autoDiscovery);
void loop(bool autoDiscovery);
void publishDiscoveryMessage(const char *sensor_type, const char *entity, const char *entityName, const char *unit, bool deleteMessage, const char *icon=NULL, const char *deviceClass=NULL);
void publishSensorData(String typeName, String value);
void loop(bool autoDiscovery, String mainTopicPath);
void publishDiscoveryMessage(const char *sensor_type, const char *mainTopicPath, const char *entity, const char *entityName, const char *unit, bool deleteMessage, const char *icon=NULL, const char *deviceClass=NULL);
void publishSensorData(String mainTopicPath, String typeName, String value);
void publishStandardData(String topicPath, String value);

// Setters for runtime configuration
Expand All @@ -21,7 +21,7 @@ class MQTTHandler {
void setPassword(const char* password);
void setUseTLS(bool useTLS);

void reconnect(bool autoDiscovery, bool autoDiscoveryRemove=false);
void reconnect(bool autoDiscovery, String mainTopicPath, bool autoDiscoveryRemove=false);

private:
const char* mqtt_broker;
Expand Down
4 changes: 2 additions & 2 deletions include/version.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
#define VERSION "1.6.0_localDev"
#define BUILDTIME "09.06.2024 - 19:02:30"
#define BUILDTIMESTAMP "1717952550"
#define BUILDTIME "10.06.2024 - 22:55:37"
#define BUILDTIMESTAMP "1718052937"
2 changes: 1 addition & 1 deletion include/version.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"version": "1.6.0_localDev",
"versiondate": "09.06.2024 - 19:02:30",
"versiondate": "10.06.2024 - 22:55:37",
"linksnapshot": "https://github.com/ohAnd/dtuGateway/releases/download/snapshot/dtuGateway_snapshot_1.6.0_localDev.bin",
"link": "https://github.com/ohAnd/dtuGateway//releases/latest/download/dtuGateway_release_1.6.0_localDev.bin"
}
23 changes: 13 additions & 10 deletions src/dtuGateway.ino
Original file line number Diff line number Diff line change
Expand Up @@ -486,7 +486,7 @@ void handleUpdateBindingsSettings()
Serial.println("handleUpdateBindingsSettings - HAautoDiscovery new state: " + String(userConfig.mqttHAautoDiscoveryON));
// mqttHAautoDiscoveryON going from on to off - send one time the delete messages
if (!userConfig.mqttHAautoDiscoveryON && mqttHAautoDiscoveryONlastState)
mqttHandler.reconnect(userConfig.mqttHAautoDiscoveryON , true);
mqttHandler.reconnect(userConfig.mqttHAautoDiscoveryON, userConfig.mqttBrokerMainTopic , true);

String JSON = "{";
JSON = JSON + "\"openhabActive\": " + userConfig.openhabActive + ",";
Expand All @@ -500,7 +500,7 @@ void handleUpdateBindingsSettings()
JSON = JSON + "\"mqttBrokerPassword\": \"" + userConfig.mqttBrokerPassword + "\",";
JSON = JSON + "\"mqttBrokerMainTopic\": \"" + userConfig.mqttBrokerMainTopic + "\",";
JSON = JSON + "\"mqttHAautoDiscoveryON\": " + userConfig.mqttHAautoDiscoveryON;

JSON = JSON + "}";

server.send(200, "application/json", JSON);
Expand Down Expand Up @@ -1026,7 +1026,7 @@ void updateValuesToMqtt(boolean haAutoDiscovery = false)
{
if (haAutoDiscovery)
{
mqttHandler.publishSensorData((pair.first).c_str(), (pair.second).c_str());
mqttHandler.publishSensorData(userConfig.mqttBrokerMainTopic, (pair.first).c_str(), (pair.second).c_str());
}
else
{
Expand Down Expand Up @@ -1166,9 +1166,12 @@ void startServices()
WiFi.scanNetworks(true);

initializeWebServer();
Serial.println(F("setup mqtt:"));

if (userConfig.mqttActive)
{
Serial.println(F("setup mqtt:"));
mqttHandler.setup(userConfig.mqttHAautoDiscoveryON);
}
}
else
{
Expand Down Expand Up @@ -1437,7 +1440,7 @@ void loop()

// runner for mqttClient to hold a already etablished connection
if (userConfig.mqttActive)
mqttHandler.loop(userConfig.mqttHAautoDiscoveryON);
mqttHandler.loop(userConfig.mqttHAautoDiscoveryON, userConfig.mqttBrokerMainTopic);
}

unsigned long currentMillis = millis();
Expand Down Expand Up @@ -1556,11 +1559,11 @@ void loop()
}

// for testing
// globalData.grid.power = globalData.grid.power + 1;
// if (userConfig.mqttActive)
// updateValuesToMqtt(userConfig.mqttHAautoDiscoveryON);
// if (globalData.grid.power > 450)
// globalData.grid.power = 0;
globalData.grid.power = globalData.grid.power + 1;
if (userConfig.mqttActive)
updateValuesToMqtt(userConfig.mqttHAautoDiscoveryON);
if (globalData.grid.power > 450)
globalData.grid.power = 0;
}

// mid task
Expand Down
91 changes: 56 additions & 35 deletions src/mqttHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,34 +4,48 @@

MQTTHandler::MQTTHandler(const char *broker, int port, const char *user, const char *password, bool useTLS, const char *sensorUniqueName)
: mqtt_broker(broker), mqtt_port(port), mqtt_user(user), mqtt_password(password), useTLS(useTLS),
client(useTLS ? wifiClientSecure : wifiClient), sensor_uniqueName(sensorUniqueName) {}
// client(useTLS ? wifiClientSecure : wifiClient), sensor_uniqueName(sensorUniqueName) {
sensor_uniqueName(sensorUniqueName)
{
if (useTLS)
{
wifiClientSecure.setInsecure();
client.setClient(wifiClientSecure);
}
else
client.setClient(wifiClient);
}

void MQTTHandler::setup(bool autoDiscovery)
{
client.setServer(mqtt_broker, mqtt_port);
reconnect(autoDiscovery);
// reconnect(autoDiscovery);
}

void MQTTHandler::loop(bool autoDiscovery)
void MQTTHandler::loop(bool autoDiscovery, String mainTopicPath)
{
if (!client.connected())
{
reconnect(autoDiscovery);
reconnect(autoDiscovery, mainTopicPath);
}
client.loop();
}

void MQTTHandler::publishDiscoveryMessage(const char *sensor_type, const char *entity, const char *entityName, const char *unit, bool deleteMessage, const char *icon, const char *deviceClass)
void MQTTHandler::publishDiscoveryMessage(const char *sensor_type, const char *mainTopicPath, const char *entity, const char *entityName, const char *unit, bool deleteMessage, const char *icon, const char *deviceClass)
{
String uniqueID = String(sensor_type) + "_" + String(entity);

char config_topic[100];
snprintf(config_topic, sizeof(config_topic), "homeassistant/sensor/%s/config", uniqueID.c_str());
String pathLevel1 = String(entity).substring(0, String(entity).indexOf("_"));
String pathLevel2 = String(entity).substring(String(entity).indexOf("_") + 1);
String stateTopic = String(mainTopicPath) + "/" + pathLevel1 + "/" + pathLevel2;

JsonDocument doc;
doc["name"] = String(entityName);
doc["unique_id"] = uniqueID;
doc["state_topic"] = "homeassistant/sensor/" + uniqueID + "/state";
// doc["state_topic"] = "homeassistant/sensor/" + uniqueID + "/state";
doc["state_topic"] = stateTopic;
doc["unit_of_measurement"] = unit;
if (deviceClass != NULL)
{
Expand All @@ -41,7 +55,7 @@ void MQTTHandler::publishDiscoveryMessage(const char *sensor_type, const char *e
if (icon != NULL)
doc["icon"] = icon;

doc["device"]["name"] = "HMS-xxxxW-2T";
doc["device"]["name"] = "HMS-xxxxW-2T (" + String(sensor_type) + ")";
doc["device"]["identifiers"] = String(sensor_type);
doc["device"]["manufacturer"] = "ohAnd";
doc["device"]["model"] = "dtuGateway ESP8266/ESP32";
Expand All @@ -65,10 +79,16 @@ void MQTTHandler::publishDiscoveryMessage(const char *sensor_type, const char *e
}
}

void MQTTHandler::publishSensorData(String typeName, String value)
void MQTTHandler::publishSensorData(String mainTopicPath, String typeName, String value)
{
char state_topic[100];
snprintf(state_topic, sizeof(state_topic), "homeassistant/sensor/%s_%s/state", sensor_uniqueName, typeName.c_str());
// snprintf(state_topic, sizeof(state_topic), "homeassistant/sensor/%s_%s/state", sensor_uniqueName, typeName.c_str());

String pathLevel1 = String(typeName).substring(0, String(typeName).indexOf("_"));
String pathLevel2 = String(typeName).substring(String(typeName).indexOf("_") + 1);
String stateTopic = String(mainTopicPath) + "/" + pathLevel1 + "/" + pathLevel2;

snprintf(state_topic, sizeof(state_topic), stateTopic.c_str());

const char *charValue = value.c_str();
client.publish(state_topic, charValue, true);
Expand All @@ -81,12 +101,12 @@ void MQTTHandler::publishStandardData(String topicPath, String value)
client.publish(charTopic, charValue, true);
}

void MQTTHandler::reconnect(bool autoDiscovery, bool autoDiscoveryRemove)
void MQTTHandler::reconnect(bool autoDiscovery, String mainTopicPath, bool autoDiscoveryRemove)
{
if (!client.connected())
{
Serial.print("Attempting MQTT connection... (HA AutoDiscover: " + String(autoDiscovery) + ") ... ");
if (client.connect("dtuGateway", mqtt_user, mqtt_password))
if (client.connect(sensor_uniqueName, mqtt_user, mqtt_password))
{
Serial.println("connected");

Expand All @@ -98,30 +118,30 @@ void MQTTHandler::reconnect(bool autoDiscovery, bool autoDiscoveryRemove)
Serial.println("removing devices for HA MQTT auto discovery");

// Publish MQTT auto-discovery messages
publishDiscoveryMessage(sensor_uniqueName, "timestamp", "Time stamp", "s", autoDiscoveryRemove, "mdi:clock-time-ten", "timestamp");
publishDiscoveryMessage(sensor_uniqueName, "grid_U", "Grid voltage", "V", autoDiscoveryRemove,NULL,"voltage");
publishDiscoveryMessage(sensor_uniqueName, "pv0_U", "Panel 0 voltage ", "V", autoDiscoveryRemove,NULL,"voltage");
publishDiscoveryMessage(sensor_uniqueName, "pv1_U", "Panel 1 voltage", "V", autoDiscoveryRemove,NULL,"voltage");

publishDiscoveryMessage(sensor_uniqueName, "grid_I", "Grid current", "A", autoDiscoveryRemove, NULL, "current");
publishDiscoveryMessage(sensor_uniqueName, "pv0_I", "Panel 0 current", "A", autoDiscoveryRemove, "mdi:current-dc", "current");
publishDiscoveryMessage(sensor_uniqueName, "pv1_I", "Panel 1 current", "A", autoDiscoveryRemove, "mdi:current-dc", "current");

publishDiscoveryMessage(sensor_uniqueName, "grid_P", "Grid power", "W", autoDiscoveryRemove, NULL, "power");
publishDiscoveryMessage(sensor_uniqueName, "pv0_P", "Panel 0 power", "W", autoDiscoveryRemove, "mdi:solar-power", "power");
publishDiscoveryMessage(sensor_uniqueName, "pv1_P", "Panel 1 power", "W", autoDiscoveryRemove, "mdi:solar-power", "power");

publishDiscoveryMessage(sensor_uniqueName, "grid_dailyEnergy", "Grid current daily yield", "kWh", autoDiscoveryRemove, NULL, "energy");
publishDiscoveryMessage(sensor_uniqueName, "pv0_dailyEnergy", "Panel 0 current daily yield", "kWh", autoDiscoveryRemove, "mdi:import", "energy");
publishDiscoveryMessage(sensor_uniqueName, "pv1_dailyEnergy", "Panel 1 current daily yield", "kWh", autoDiscoveryRemove, "mdi:import", "energy");

publishDiscoveryMessage(sensor_uniqueName, "grid_totalEnergy", "Grid total yield", "kWh", autoDiscoveryRemove, "mdi:import", "energy");
publishDiscoveryMessage(sensor_uniqueName, "pv0_totalEnergy", "Panel 0 total yield", "kWh", autoDiscoveryRemove, "mdi:import", "energy");
publishDiscoveryMessage(sensor_uniqueName, "pv1_totalEnergy", "Panel 1 total yield", "kWh", autoDiscoveryRemove, "mdi:import", "energy");

publishDiscoveryMessage(sensor_uniqueName, "inverter_Temp", "Inverter temperature", "°C", autoDiscoveryRemove, "mdi:thermometer","temperature");
publishDiscoveryMessage(sensor_uniqueName, "inverter_PowerLimit", "Inverter current power limit", "%", autoDiscoveryRemove, "mdi:car-speed-limiter","power_factor");
publishDiscoveryMessage(sensor_uniqueName, "inverter_WifiRSSI", "Inverter WiFi connection strength", "%", autoDiscoveryRemove, "mdi:wifi");
publishDiscoveryMessage(sensor_uniqueName, mainTopicPath.c_str(), "timestamp", "Time stamp", "s", autoDiscoveryRemove, "mdi:clock-time-ten", "timestamp");
publishDiscoveryMessage(sensor_uniqueName, mainTopicPath.c_str(), "grid_U", "Grid voltage", "V", autoDiscoveryRemove, NULL, "voltage");
publishDiscoveryMessage(sensor_uniqueName, mainTopicPath.c_str(), "pv0_U", "Panel 0 voltage ", "V", autoDiscoveryRemove, NULL, "voltage");
publishDiscoveryMessage(sensor_uniqueName, mainTopicPath.c_str(), "pv1_U", "Panel 1 voltage", "V", autoDiscoveryRemove, NULL, "voltage");

publishDiscoveryMessage(sensor_uniqueName, mainTopicPath.c_str(), "grid_I", "Grid current", "A", autoDiscoveryRemove, NULL, "current");
publishDiscoveryMessage(sensor_uniqueName, mainTopicPath.c_str(), "pv0_I", "Panel 0 current", "A", autoDiscoveryRemove, "mdi:current-dc", "current");
publishDiscoveryMessage(sensor_uniqueName, mainTopicPath.c_str(), "pv1_I", "Panel 1 current", "A", autoDiscoveryRemove, "mdi:current-dc", "current");

publishDiscoveryMessage(sensor_uniqueName, mainTopicPath.c_str(), "grid_P", "Grid power", "W", autoDiscoveryRemove, NULL, "power");
publishDiscoveryMessage(sensor_uniqueName, mainTopicPath.c_str(), "pv0_P", "Panel 0 power", "W", autoDiscoveryRemove, "mdi:solar-power", "power");
publishDiscoveryMessage(sensor_uniqueName, mainTopicPath.c_str(), "pv1_P", "Panel 1 power", "W", autoDiscoveryRemove, "mdi:solar-power", "power");

publishDiscoveryMessage(sensor_uniqueName, mainTopicPath.c_str(), "grid_dailyEnergy", "Grid current daily yield", "kWh", autoDiscoveryRemove, NULL, "energy");
publishDiscoveryMessage(sensor_uniqueName, mainTopicPath.c_str(), "pv0_dailyEnergy", "Panel 0 current daily yield", "kWh", autoDiscoveryRemove, "mdi:import", "energy");
publishDiscoveryMessage(sensor_uniqueName, mainTopicPath.c_str(), "pv1_dailyEnergy", "Panel 1 current daily yield", "kWh", autoDiscoveryRemove, "mdi:import", "energy");

publishDiscoveryMessage(sensor_uniqueName, mainTopicPath.c_str(), "grid_totalEnergy", "Grid total yield", "kWh", autoDiscoveryRemove, "mdi:import", "energy");
publishDiscoveryMessage(sensor_uniqueName, mainTopicPath.c_str(), "pv0_totalEnergy", "Panel 0 total yield", "kWh", autoDiscoveryRemove, "mdi:import", "energy");
publishDiscoveryMessage(sensor_uniqueName, mainTopicPath.c_str(), "pv1_totalEnergy", "Panel 1 total yield", "kWh", autoDiscoveryRemove, "mdi:import", "energy");

publishDiscoveryMessage(sensor_uniqueName, mainTopicPath.c_str(), "inverter_Temp", "Inverter temperature", "°C", autoDiscoveryRemove, "mdi:thermometer", "temperature");
publishDiscoveryMessage(sensor_uniqueName, mainTopicPath.c_str(), "inverter_PowerLimit", "Inverter current power limit", "%", autoDiscoveryRemove, "mdi:car-speed-limiter", "power_factor");
publishDiscoveryMessage(sensor_uniqueName, mainTopicPath.c_str(), "inverter_WifiRSSI", "Inverter WiFi connection strength", "%", autoDiscoveryRemove, "mdi:wifi");
}
}
else
Expand All @@ -134,6 +154,7 @@ void MQTTHandler::reconnect(bool autoDiscovery, bool autoDiscoveryRemove)

void MQTTHandler::stopConnection()
{
Serial.println("... stopped MQTT connection");
if (client.connected())
{
client.disconnect();
Expand Down

0 comments on commit 6d0261c

Please sign in to comment.