MQTT implementation. MQTT message sends only when there is a data update. Also update conf in Homeassistant
This commit is contained in:
parent
6f41843cd5
commit
46ac08ac9c
@ -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
53
tic.cpp
@ -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(®Status, 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(®Status, 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
2
tic.h
@ -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
|
Loading…
Reference in New Issue
Block a user