Code : Tout sélectionner
// Inclure les librairies.
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
// Déclaration des constantes, données à adapter à votre réseau.
// ------------------------------------------------------------
const char* ssid = "_MON_SSID_"; // SSID du réseau Wifi
const char* password = "_MOT_DE_PASSE_WIFI_"; // Mot de passe du réseau Wifi.
const char* mqtt_server = "_IP_DU_BROKER_"; // Adresse IP ou DNS du Broker.
const int mqtt_port = 1883; // Port du Brocker MQTT
const char* mqtt_login = "_LOGIN_"; // Login de connexion à MQTT.
const char* mqtt_password = "_PASSWORD_"; // Mot de passe de connexion à MQTT.
// ------------------------------------------------------------
// Variables et constantes utilisateur :
String nomModule = "Module relais"; // Nom usuel de ce module.
char* topicIn = "domoticz/out"; // Nom du topic envoyé par Domoticz
char* topicOut = "domoticz/in"; // Nom du topic écouté par Domoticz
// ------------------------------------------------------------
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE (50)
char msg[MSG_BUFFER_SIZE];
int value = 0;
int idx;
int nvalue;
const char* svalue;
const char* svalue1;
const char* svalue2;
const char* svalue3;
const char* name;
void setup() {
pinMode(pinRelais, OUTPUT);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}
void setup_wifi() {
// Connexion au réseau Wifi
delay(10);
Serial.println();
Serial.print("Connection au réseau : ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
// Tant que l'on est pas connecté, on boucle.
delay(500);
Serial.print(".");
}
// Initialise la séquence Random
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connecté");
Serial.print("Addresse IP : ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
// Message reçu du Broker.
String string;
// On vérifie qu'il vient bien de Domoticz.
int valeur = strcmp(topic, topicIn);
if (valeur == 0) {
Serial.print("Message arrivé [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
string+=((char)payload[i]);
}
// Affiche le message entrant - display incoming message
Serial.println(string);
DynamicJsonDocument root(1024);
DeserializationError error = deserializeJson(root, string);
if (!error) {
idx = root["idx"];
name = root["name"];
nvalue = root["nvalue"];
switch (idx) {
case 225:
Serial.print("Idx : ");
Serial.print(idx);
Serial.print(" - Nom Device : ");
Serial.print(name);
Serial.print(" - Valeur : ");
Serial.println(nvalue);
break;
//temperature/hum
case 308:
svalue1 = root["svalue1"];
svalue2 = root["svalue2"];
svalue3 = root["svalue3"];
Serial.print("Idx : ");
Serial.print(idx);
Serial.print(" - Nom Device : ");
Serial.print(name);
Serial.print(" - Valeurs : ");
Serial.print(" temp : ");
Serial.print(svalue1);
Serial.print(" - hum : ");
Serial.print(svalue2);
Serial.print(" - PA : ");
Serial.println(svalue3);
break;
//Station météo temperature/hum
case 359:
svalue = root["svalue"];
Serial.print("Idx : ");
Serial.print(idx);
Serial.print(" - Nom Device : ");
Serial.print(name);
Serial.print(" - Valeur : ");
Serial.println(svalue);
break;
//variateur
case 445:
svalue1 = root["svalue1"];
Serial.print("Idx : ");
Serial.print(idx);
Serial.print(" - Nom Device : ");
Serial.print(name);
Serial.print(" - Valeur : ");
Serial.print(svalue1);
Serial.println(" %");
break;
//Hauteur d'eau cuve
case 507:
svalue = root["svalue"];
Serial.print("Idx : ");
Serial.print(idx);
Serial.print(" - Nom Device : ");
Serial.print(name);
Serial.print(" - Valeur : ");
Serial.print(svalue);
Serial.println(" Cm");
break;
//Pourcentage d'eau cuve
case 505:
svalue1 = root["svalue1"];
Serial.print("Idx : ");
Serial.print(idx);
Serial.print(" - Nom Device : ");
Serial.print(name);
Serial.print(" - Valeur : ");
Serial.print(svalue1);
Serial.println(" %");
break;
//Nombre litres d'eau cuve
case 506:
svalue1 = root["svalue1"];
Serial.print("Idx : ");
Serial.print(idx);
Serial.print(" - Nom Device : ");
Serial.print(name);
Serial.print(" - Valeur : ");
Serial.print(svalue1);
Serial.println(" litres");
break;
default:
// Serial.print("Reçu information autre Device : ");
// Serial.println(idx);
break;
}
} else {
Serial.println("Erreur de lecture du JSON !");
// Serial.println(string);
}
}
}
void reconnect() {
// Boucle jusqu'à la connexion MQTT
while (!client.connected()) {
Serial.print("Tentative de connexion MQTT...");
// Création d'un ID client aléatoire
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Tentative de connexion
if (client.connect(clientId.c_str(), mqtt_login, mqtt_password)) {
Serial.println("connecté");
// Connexion effectuée, publication d'un message...
String message = "Connexion MQTT de "+ nomModule + " réussi sous référence technique : " + clientId + ".";
// String message = "Connexion MQTT de "+ nomModule + " réussi.";
StaticJsonDocument<256> root;
// On renseigne les variables.
root["command"] = "addlogmessage";
root["message"] = message;
// On sérialise la variable JSON
String messageOut;
if (serializeJson(root, messageOut) == 0)
{
Serial.println("Erreur lors de la création du message de connexion pour Domoticz");
} else {
// Convertion du message en Char pour envoi dans les Log Domoticz.
char messageChar[messageOut.length()+1];
messageOut.toCharArray(messageChar,messageOut.length()+1);
client.publish(topicOut, messageChar);
}
// On souscrit (écoute)
client.subscribe("#");
} else {
Serial.print("Erreur, rc=");
Serial.print(client.state());
Serial.println(" prochaine tentative dans 5s");
// Pause de 5 secondes
delay(5000);
}
}
}