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();
if (currentMillis - previousMillis >= interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
//Interface MQTT //Interface MQTT
if (!mqttclient.connected()) { if (!mqttclient.connected()) {
mqttConnect(); mqttConnect();
} }
//mqttPublish(&mqttclient); mqttPublish(&mqttclient);
mqttclient.loop(); }
if (currentMillis - previousForceMillis >= (30*interval)) {
// 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

33
tic.cpp
View File

@ -116,6 +116,21 @@ 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) {
//If there is a value update
if (TicValues[t].value.compareTo(gd.value) != 0) {
//There is some noise on instantaneous value, filter
if (SelectedEtiquette[t] == "SINSTS" || SelectedEtiquette[t] == "SINSTS1" || SelectedEtiquette[t] == "SINSTS2" || SelectedEtiquette[t] == "SINSTS3") {
int oldval = TicValues[t].value.toInt();
int newcal = (gd.value.toInt() + oldval) / 2;
if (newcal < oldval*0.92 || newcal > oldval*1.02){
gd.updated = true;
TicValues[t] = gd;
}
else {
TicValues[t].value = String(newcal);
}
} else {
gd.updated = true;
TicValues[t] = gd; TicValues[t] = gd;
// Depending on the group name, call the appropriate processing function // Depending on the group name, call the appropriate processing function
if (gd.name == "STGE") { if (gd.name == "STGE") {
@ -126,6 +141,10 @@ static void processTrame(String &data) {
processActionsCalendrier(gd.value); 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