Domoticz vers ESP8266

Forum dédié aux bricolages d'objets connectés IOT et leurs communications avec DomoticZ :
- Remplacement de firmware des prises, modules relais ...
- Fabrication à base d'ESP8266, de NodeMCU, de Weemos et consorts ...
megabombus
Messages : 6
Inscription : 10 sept. 2020, 09:06

Re: Domoticz vers ESP8266

Message par megabombus »

je vous joint le prog et merci encore.

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);
    }
  }
}
Dernière modification par Keros le 07 juil. 2023, 06:26, modifié 1 fois.
Raison : Ajout des balises code
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: Domoticz vers ESP8266

Message par Neutrino »

Salut,
Ton problème ne vient pas de ton code.
Tes sondes manquantes sont alimentées dans domoticz via le topic domoticz/in et tu écoutes le domoticz/out.
Pour éviter les boucles, ce qui rentre par le in, n'est pas renvoyé sur le out.
On est d'accord, c'est une implémentation particulère de MQTT par Domoticz.

Une solution serait d'écouter aussi le topic domoticz/in dans ton code.
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
megabombus
Messages : 6
Inscription : 10 sept. 2020, 09:06

Re: Domoticz vers ESP8266

Message par megabombus »

Salut Neutrino

j'ai remplacé le Out par le In et la, magie, super ça marche,

Grand merci à toi Neutrino.

Je vais pouvoir maintenant travailler sur la suite de mes projets ruche connectée et station météo avec retour sur un Il9341.

Encore merci et très bonne journée.
e111111
Messages : 225
Inscription : 11 déc. 2018, 19:44

Re: Domoticz vers ESP8266

Message par e111111 »

Bonjour tout le monde,

je me permet de me greffer sur ce sujet car j'ai un pb du même domaine à résoudre et j'ai passé pas mal de temps dessus déjà et je ne m'en sort pas:

Je cherchais à sauvegarder une valeur depuis un dummy espeasy par mqtt dans une variable user domoticz, ça c'est fait.
Je récupère aussi dans une autre variable le uptime de espeasy, histoire de voir s'il a rebooté, jusque là tout va bien.
Par contre pour remonter la valeur de la variable user par mqtt vers le dummy espeasy, j'ai beau avoir essayé toutes les syntaxes possible et imaginables, rien à faire, pas de message d'erreur coté DZ, mais rien coté esp...

Je précise que mon script est en LUA.

Une bonne âme aurait elle une solution à partager ?

Merci d'avance
Domoticz V4.10 sur Synology DS216j (DSM 6.3), clef Z-Wave Sigma
megabombus
Messages : 6
Inscription : 10 sept. 2020, 09:06

Re: Domoticz vers ESP8266

Message par megabombus »

Bonsoir

J'ai pas tout compris mais si ton souhait est de récupérer une donnée d'un capteur de domoticz dans espeasy, cherche du côté du device "Generic-MQTT" dans espeasy.
megabombus
Messages : 6
Inscription : 10 sept. 2020, 09:06

Re: Domoticz vers ESP8266

Message par megabombus »

"Generic MQTT Import", j'ai mangé un mot
e111111
Messages : 225
Inscription : 11 déc. 2018, 19:44

Re: Domoticz vers ESP8266

Message par e111111 »

Dommage j'ai pas ça dans ma release, je vais être obligé de recompiler...

Merci pour l'info, je vais tester ...
Domoticz V4.10 sur Synology DS216j (DSM 6.3), clef Z-Wave Sigma
megabombus
Messages : 6
Inscription : 10 sept. 2020, 09:06

Re: Domoticz vers ESP8266

Message par megabombus »

si ça peut t'aider

viewtopic.php?t=13107
e111111
Messages : 225
Inscription : 11 déc. 2018, 19:44

Re: Domoticz vers ESP8266

Message par e111111 »

Bonjour et merci megabombus;
j'ai donc recompilé mon espeasy et j'ai bien le bon device ajouté, par contre là ou je capte pas, c'est quelle commande
il faut envoyer en LUA à l'ESP pour qu'il récupère la valeur.. Il me semble qu'avec ce truc là c'est l'ESP qui va lire la valeur dans Domoticz , ou j'ai tout faux ? Moi ça doit être du conditionnel, Dz envoie la valeur si la condition est remplie ..
Ma donnée est dans une variable utilisateur, et bien qu'elles aient aussi un IDX je ne suis pas certain que MQTT import sache la retrouver...
Domoticz V4.10 sur Synology DS216j (DSM 6.3), clef Z-Wave Sigma
e111111
Messages : 225
Inscription : 11 déc. 2018, 19:44

Re: Domoticz vers ESP8266

Message par e111111 »

Bon, j'ai trouvé,
après avoir vainement testé les "eventvalue" dont je n'ai pas réussi à trouver la syntaxe exacte,
j'ai finalement réussi avec le "taskvalueset" en direct, ça respecte donc les conditions souhaitées et est envoyé par le script LUA quand nécessaire :

Code : Tout sélectionner

commandArray['OpenURL']=("http://192.168.x.x/control?cmd=TaskValueSet,13,1,"..uservariables["Pluie_Total_Backup"])
Voilà, si ça peut servir à quelqu'un ...
Domoticz V4.10 sur Synology DS216j (DSM 6.3), clef Z-Wave Sigma
Répondre