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
jeedom_mqtt_TB_exemple01

les sondes DHT22 avec le filtre en PI sur arduino
DHT22_AlimPI5v

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

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 !!??