Plugin MQTT de Lunarok

2015 : MQTT - Forum Communauté Jeedom
un groupir, un suivie (ou une nouvelle boite a lettre) sur le plugin.

Bonjour

oui merci ah Lunarok pour le boulot.
je découvre Mqtt et Jeedom et arduino, mis en service depuis 3/4j et c impec.

une recopie d’écran

les sondes DHT22 avec le filtre en PI sur arduino

le JeeDom sur OdroidC2 en réseau filaire Ethernet (Futur en Bus CAN)

et le super croquis Arduino, une recopie/modif pour adapter a plusieurs capteurs.
https://wiki.fhem.de/wiki/MQTT_Einführung_Teil_3

un texte sympa :slight_smile:
« Un autre avantage est que la charge du réseau est réduite. À titre de comparaison, je voudrais énumérer les capteurs Jeelink ici, mais aussi de nombreux capteurs 433 MHz qui envoient simplement leurs valeurs dans le « cycle de quelques secondes ». À partir de là, l’utilisation des techniques MQTT peut réduire la pollution radio dans l’environnement. D’une part, vous contribuez moins à la « pollution sensorielle de l’air », d’autre part, vous libérez également votre FHEM de la tâche de rejeter d’abord les valeurs inutiles. »

//
//
//  Arduino avec Mqtt et des capteurs DHT22 (temp/humidite )
//
//  Exemple de reconnexion MQTT - non bloquant
//  une recopie-modif du wiki FHEM : https://wiki.fhem.de/wiki/MQTT_Einführung_Teil_3
//
//  base par: Rince du forum FHEM  / adapt. par JeeLet
//
//  les bibliothèques :  
//    
//  "Ethernet.h" pour le shield Ethernet, et  "SPI.h" pour la com entre le shield et arduino Uno
//
//  "PubSubClient.h" (Ver.:3.1 de NickOLeary) 
//  permet de créer un client MQTT pour publier et de souscrire à un topic.
//  
//  "dhtnew.h" (Ver:0.1.5 de Rob Tillaart)
//  une biblio commune a DHT11 et DHT22; ajout de l'offSet de décalage, notion d'objet pour les sondes,
//  indicateur d'activation/désactivation (voir *//github.com/RobTillaart/Arduino/tree/master/libraries/DHTNEW )
//
//  date/version du croquis: 20/02/20 - Ver01
//
// Ce croquis montre comment garder le client connecté en utilisant
// une fonction de reconnexion non bloquante, Si le client perd sa connexion,
// il tente de se reconnecter toutes les 5 secondes sans bloquer la boucle principale.
//
//  modification :
//  x remplacer "isnan" par le control d'erreur de la nouvelle Lib.
//  - faire une tempo pour les messages de panne capteur ..
//  - voir la gestion pour 4 capteurs (ou plus) ...
//  - ...
//  - ...
//  
// --------------  ARDUINO n°1 "Uno" ---------------

  /*-----( Import libraries )-----*/

  #include <SPI.h>
  #include <Ethernet.h>
  #include <PubSubClient.h>	// version de NickOLeary
  #include <dhtnew.h>		// nouvelle version de Rob Tillaart's 
 
 /*--------------------( Declare objects et Pin )-------------------------*/
  DHTNEW dht1  (6);
 
/*--------------------( Config parametre du LAN ethernet )-------------------------*/  
  byte mac[]    = { 0x90, 0xA2, 0xDA, 0x0D, 0x84, 0xFF }; // adresses mac
  IPAddress ip{ 192, 168, 1, 34};     //ip du client
  IPAddress server{ 192, 168, 1, 21}; //ip du serveur MQTT (le Broker)

        // ------------- mqtt ---------------//

   void callback(char* topic, byte* payload, unsigned int length)
   {
   // gérer le message est arrivé
   }

   EthernetClient ethClient;
   PubSubClient client(ethClient);

 //----- sous loop de reconnection au courtier mqtt ---------//

   long lastReconnectAttempt = 0;

   boolean reconnect()
  {
    if (client.connect("Arduino_1", "home/Arduino_1", 0, true, "offline")) 
    {      
      client.publish("home/Arduino_1","online", true); // ...
      client.subscribe("inTopic"); // ... and resubscribe
    }
    return client.connected();
  }

 //----- Réservez la zone de stockage pour sauver la clôture ---------//
 
  // capteur1
    static char capt_h1[15]; 
    static char capt_t1[15];
    float h1 = 0.0;
    float h1_alt = 0.0;
    float t1 = 0.0;
    float t1_alt = 0.0;
  
    unsigned long previousMillis = 0;	//reset du compteur des millisecondes.
    
    const long interval = 3000;	// <-----fréquence d'utilisation du capteur (60000millisecondes=1mn)
       
 void setup()   /******************* SETUP *************************/
 {
   client.setServer(server, 1883);
   client.setCallback(callback);

   Ethernet.begin(mac, ip);
   delay(1500);
   lastReconnectAttempt = 0;
  
   Serial.begin(9600);  // mise en service du terminal
   Serial.println("  DHT22 - Test!  ");
 }

 void loop()  /********************** LOOP ************************/
 {
   if (!client.connected())
      { long now = millis();
        if (now - lastReconnectAttempt > 500) // <------ tempo pour reconnection client
         {
          lastReconnectAttempt = now;
          if (reconnect())  // Tentative de reconnexion
           {
           lastReconnectAttempt = 0;
           }
         }
      }

   else
       {
       client.loop(); // Client connected
       }
       
 //----- interval de lecture du capteur DHT22 ---------//
       
        unsigned long currentMillis = millis();
     if (currentMillis - previousMillis >= interval) // calcul temps ecouler du capteur
       {
        previousMillis = currentMillis; 
      
       // dht1.read();            // lecture capteurs  
       h1 = dht1.humidity ;    //humidite 1
       t1 = dht1.temperature;  //Temperature 1
       }

 // ------ control du  capteur  ---------// 
    const int error = dht1.read(); 
  
     if (error == DHTLIB_ERROR_CHECKSUM)
       { 
        Serial.println("DHTLIB_ERROR_CHECKSUM");
        Serial.println(" erreur Checksum sur DHT22 ");
      return;
       }
     
     if (error == DHTLIB_ERROR_TIMEOUT) 
       {
        Serial.println("DHTLIB_ERROR_TIMEOUT");
        Serial.println(" erreur Timeout sur DHT22 ");
      return;
       }
        
     if (error == true ) //  erreurs capteur
       {
       client.publish("home/Arduino_1","Erreur capteur",true); 
        //"true" envoie le message conservé, c'est-à-dire que le message reste sur le courtier ...
        // ....jusqu'à ce que quelque chose de nouveau arrive.
      return;
       }
      
    else if (h1 == h1_alt && t1 == t1_alt ) // compar anci/nouv valeurs 
       {
         //ne fais rien
       }
    
    else
       {
        client.publish("home/Arduino_1","en Ligne", true);
    
        dtostrf(h1,6, 1, capt_h1); // conversions "float" pour PubSubClient...
        dtostrf(t1,6, 1, capt_t1); // ... 6 chiffres et 1 décimal
              
        client.publish("home/Arduino_1/cuisine/humidite",capt_h1, true);
        client.publish("home/Arduino_1/cuisine/Temperature",capt_h1, true);
        
        h1_alt = h1;       // annuler l'ancienne lecture ...
        t1_alt = t1;       // ... pour ne réagir qu'aux changements
    
 // ------------ Visu sur terminal ------------------ 

        Serial.print("humidite 1 : "); 
        Serial.print(h1);
        Serial.print(" %\t");
        Serial.print("Temperature 1 : "); 
        Serial.print(t1);
        Serial.println(" C");
    
       }
 }
 //        *********( Fin du Pgm )*********** //

bonsoir
modif du croquis avec la Lib. dhtnew.h de RobTillaart

reste encore des trucs a voir et je passe en bus CAN pour les satellites Arduino
(un arduino mega en Ethernet pour la passerelle avec JeeDom)

quelqu’un a-t-il déjà appliquée cette architecture !!??