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;
PubSubClient mqttclient(espClient);
unsigned long previousMillis = 0;
unsigned long previousForceMillis = 0;
const long interval = 1000;
void mqttConnect() {
// Loop until we're reconnected
while (!mqttclient.connected()) {
@ -165,15 +169,32 @@ void loop() {
server.handleClient();
readTicPort();
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
//Interface MQTT
if (!mqttclient.connected()) {
mqttConnect();
}
//mqttPublish(&mqttclient);
mqttclient.loop();
mqttPublish(&mqttclient);
}
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

31
tic.cpp
View File

@ -116,6 +116,21 @@ static void processTrame(String &data) {
}
// If a match is found, update the corresponding TicValues entry
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;
// Depending on the group name, call the appropriate processing function
if (gd.name == "STGE") {
@ -126,6 +141,10 @@ static void processTrame(String &data) {
processActionsCalendrier(gd.value);
}
}
} else {
TicValues[t].updated = false;
}
}
data = data.substring(index + 1);
}
}
@ -317,15 +336,25 @@ String ticBasicValuesAsJson() {
void mqttPublish(PubSubClient *mqttclient) {
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;
topic += "/",
topic += SelectedEtiquette[i];
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.
*

2
tic.h
View File

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