MQTT implementation. MQTT message sends only when there is a data update. Also update conf in Homeassistant

This commit is contained in:
nago 2025-04-16 00:39:37 +02:00
parent 6f41843cd5
commit 46ac08ac9c
3 changed files with 70 additions and 18 deletions

View File

@ -19,6 +19,10 @@ ESP8266WebServer server(HTTP_PORT);
WiFiClient espClient; WiFiClient espClient;
PubSubClient mqttclient(espClient); PubSubClient mqttclient(espClient);
unsigned long previousMillis = 0;
unsigned long previousForceMillis = 0;
const long interval = 1000;
void mqttConnect() { void mqttConnect() {
// Loop until we're reconnected // Loop until we're reconnected
while (!mqttclient.connected()) { while (!mqttclient.connected()) {
@ -165,15 +169,32 @@ void loop() {
server.handleClient(); server.handleClient();
readTicPort(); readTicPort();
unsigned long currentMillis = millis();
//Interface MQTT
if (!mqttclient.connected()) { if (currentMillis - previousMillis >= interval) {
mqttConnect(); // save the last time you blinked the LED
previousMillis = currentMillis;
//Interface MQTT
if (!mqttclient.connected()) {
mqttConnect();
}
mqttPublish(&mqttclient);
} }
//mqttPublish(&mqttclient); if (currentMillis - previousForceMillis >= (30*interval)) {
mqttclient.loop(); // save the last time you blinked the LED
previousForceMillis = currentMillis;
//Interface MQTT
if (!mqttclient.connected()) {
mqttConnect();
}
mqttForcePublish(&mqttclient);
}
mqttclient.loop();
/* /*
// Si aucune requête n'est en cours, mettre l'ESP8266 en mode deep sleep // Si aucune requête n'est en cours, mettre l'ESP8266 en mode deep sleep

53
tic.cpp
View File

@ -116,14 +116,33 @@ static void processTrame(String &data) {
} }
// If a match is found, update the corresponding TicValues entry // If a match is found, update the corresponding TicValues entry
if (t < NB_ETIQUETTE) { if (t < NB_ETIQUETTE) {
TicValues[t] = gd; //If there is a value update
// Depending on the group name, call the appropriate processing function if (TicValues[t].value.compareTo(gd.value) != 0) {
if (gd.name == "STGE") { //There is some noise on instantaneous value, filter
processStge(&regStatus, gd.value); if (SelectedEtiquette[t] == "SINSTS" || SelectedEtiquette[t] == "SINSTS1" || SelectedEtiquette[t] == "SINSTS2" || SelectedEtiquette[t] == "SINSTS3") {
} else if (gd.name == "RELAIS") { int oldval = TicValues[t].value.toInt();
processRelais(&relaisStatus, gd.value); int newcal = (gd.value.toInt() + oldval) / 2;
} else if (gd.name == "PJOURF+1") { if (newcal < oldval*0.92 || newcal > oldval*1.02){
processActionsCalendrier(gd.value); gd.updated = true;
TicValues[t] = gd;
}
else {
TicValues[t].value = String(newcal);
}
} else {
gd.updated = true;
TicValues[t] = gd;
// Depending on the group name, call the appropriate processing function
if (gd.name == "STGE") {
processStge(&regStatus, gd.value);
} else if (gd.name == "RELAIS") {
processRelais(&relaisStatus, gd.value);
} else if (gd.name == "PJOURF+1") {
processActionsCalendrier(gd.value);
}
}
} else {
TicValues[t].updated = false;
} }
} }
data = data.substring(index + 1); data = data.substring(index + 1);
@ -317,15 +336,25 @@ String ticBasicValuesAsJson() {
void mqttPublish(PubSubClient *mqttclient) { void mqttPublish(PubSubClient *mqttclient) {
for (int i = 0; i < NB_ETIQUETTE; ++i) { for (int i = 0; i < NB_ETIQUETTE; ++i) {
if (SelectedEtiquette[i] == "LTARF" || SelectedEtiquette[i] == "EAST" || SelectedEtiquette[i] == "EASF01" || SelectedEtiquette[i] == "EASF02" || SelectedEtiquette[i] == "EASF03" || SelectedEtiquette[i] == "EASF04" || SelectedEtiquette[i] == "EASD01" || SelectedEtiquette[i] == "EASD02" || SelectedEtiquette[i] == "EASD03" || SelectedEtiquette[i] == "EASD04" || SelectedEtiquette[i] == "EAIT" || SelectedEtiquette[i] == "ERQ1" || SelectedEtiquette[i] == "ERQ2" || SelectedEtiquette[i] == "ERQ3" || SelectedEtiquette[i] == "ERQ4" || SelectedEtiquette[i] == "IRMS1" || SelectedEtiquette[i] == "IRMS2" || SelectedEtiquette[i] == "IRMS3" || SelectedEtiquette[i] == "URMS1" || SelectedEtiquette[i] == "URMS2" || SelectedEtiquette[i] == "URMS3" || SelectedEtiquette[i] == "SINSTS" || SelectedEtiquette[i] == "SINSTSI" || SelectedEtiquette[i] == "SINSTS1" || SelectedEtiquette[i] == "SINSTS2" || SelectedEtiquette[i] == "SINSTS3" || SelectedEtiquette[i] == "SINSTSI") { if (TicValues[i].updated) {
String topic= MQTT_TOPIC; String topic = MQTT_TOPIC;
topic += "/", topic += "/",
topic += SelectedEtiquette[i]; topic += SelectedEtiquette[i];
mqttclient->publish(topic.c_str(), TicValues[i].value.c_str()); mqttclient->publish(topic.c_str(), TicValues[i].value.c_str());
TicValues[i].updated = false;
} }
} }
} }
void mqttForcePublish(PubSubClient *mqttclient) {
for (int i = 0; i < NB_ETIQUETTE; ++i) {
String topic = MQTT_TOPIC;
topic += "/",
topic += SelectedEtiquette[i];
mqttclient->publish(topic.c_str(), TicValues[i].value.c_str());
}
}
/** /**
* Reads data from the TicPort and processes it according to specific control characters. * Reads data from the TicPort and processes it according to specific control characters.
* *

2
tic.h
View File

@ -32,6 +32,7 @@ struct GroupDetail {
String name; // Nom de l'étiquette String name; // Nom de l'étiquette
String value; // Valeur associée à l'étiquette String value; // Valeur associée à l'étiquette
String horodate; // Horodatage de la valeur String horodate; // Horodatage de la valeur
bool updated;
}; };
// Structure pour les bits de statut du registre // Structure pour les bits de statut du registre
@ -161,4 +162,5 @@ void readTicPort();
String ticValuesAsJson(); String ticValuesAsJson();
String ticBasicValuesAsJson(); String ticBasicValuesAsJson();
void mqttPublish(PubSubClient *mqttclient); void mqttPublish(PubSubClient *mqttclient);
void mqttForcePublish(PubSubClient *mqttclient);
#endif #endif