[Résolu] Quelle communication pour une réalisation perso capteurs multiples avec un Arduino ou PI zero?

Bonjour @ tous et merci de m’accueillir.

Je vous prie de bien vouloir m’excuser si je me suis trompé de forum pour mon post.
Je vous précise que je n’ai pas de connaissance en domotique et j’aimerai bien débuter avec Jeedom.

Je suis un électronicien « du dimanche » et je travaille actuellement à la réalisation d’un module unique multi-capteurs qui me permettrait de surveiller les paramètres suivants : température, pression, luminosité, CO2, humidité, fumées, ouverture/fermeture et capteur ultrason.

Je souhaiterais privilégier, si possible, un microcontrolleur de chez ATmel (Arduino) pour relever tous ces paramètres plutôt qu’un PI zero uniquement pour des considérations de consommation électrique et un peu à cause des coûts. Mais je ne ferme pas la porte au PI zero.

En revanche, il est pour moi impératif que la communication / la transmission entre mon module multi-capteurs et Jeedom se fasse par un port Ethernet 10/100 Mb. Les bus SPI, I2C et autre 1-wire sont impossible et je refuse d’utiliser un protocole radio.

Comment mettre automatiquement à disposition de Jeedom les valeurs de chacun des capteurs ? Comment les intégrer / les faire remonter dans Jeedom pour que celui-ci « réagisse » automatiquement ?

Dois je passer par une base de données (MySQL ou Mariadb) et demander à Jeedom de l’interroger à intervalle régulier ? Ce qui me parait pas idéal car en cas d’événement sur un ou plusieurs capteurs, sa/leurs prise(s) en compte par Jeedom serait trop retardé.

Dois-je avoir recourt au protocole MQTT ? Je ne le connais pas mais je crois que cela permet d’envoyer des infos sur un réseau et c’est chaque périphérique présent sur le réseau qui « choisissent » ce qui les intéresse dans le flot des infos qui sont diffusées.

Existe t il une autre méthode / manière de faire qui soit plus adaptée à Jeedom ? (si possible pas trop compliqué et stable !!)

Je vous remercie par avance pour votre aide.

bonjour @christophehgt

j’ai un PI 3B et des capteurs de pression, T° et humidité, je remonte les infos vers Jeedom en Python avec des requêtes HTTP. (sondes DS18B20 et bme280)

Exemple code Python:
#Envoie Température à Jeedom toute les 5 minutes


Bonne soirée

Hello et bienvenue a toi

Je ne pourrais pas te dire la meilleure façon de faire, mais je vais re donner ma façon de faire.

Je code plutôt sur des ESP en wifi, mais tu peux aussi le faire avec de l’Ethernet.

Je crée un équipement virtuel par ESP, puis j’envoie les données avec des requêtes http en vérifiant que la valeurs a changé entre chaque passage de boucles pour éviter les requêtes inutiles.

Salut,
Et pourquoi pas en utilisant le plugin jeedouino? C’est très simple.

Pour ma part, j’ai l’habitude de programmer moi même, donc je me suis jamais trop penché dessus mais c’est une des options pour ton projet

Bonjour @ tous

Grand merci pour vos retours très instructifs qui me donnent les 2 cas concrets correspondants aux 2 solutions que j’ai envisagées, Microcontroleur et PI zero.

Permettez moi de vous faire une réponse collégiale personnalisée !

Merci Patrick57.
Je vois qu’il y a une solution avec Python pour faire remonter les informations à Jedoom. C’est la grande souplesse qu’offre l’ordinateur (PI) grâce à la programmation. Nous pouvons faire ce que l’on veut à partir du moment qu’on est capable de le coder ! N’étant pas encore un crack en Python, je vois qu’il faut faire remonter les valeurs des capteurs une par une.
Qu’elles sont les manipulations côté Jeedom pour recevoir et traiter ces valeurs en fonction du/des scénario/is ? Création de capteurs virtuels ? Autres ? (Je rappelle que je ne connais pas encore la domotique et encore moins Jeedom)
Naturellement ma contradiction ne vous a pas échappée. En effet, je vous indique que je souhaite faire uniquement du filaire Ethernet avec… un PI zero. Ce qui en soit n’est pas possible ! Le PI zero ne possède pas de port Ethernet. Il va de soit que je suis donc obligé de passer par un adaptateur ou carte fille d’extension.

Merci Foulek57.
Comme je disais à Patrick57, l’avantage de passer par une « puce programmable » est que l’on peut lui faire faire tout ce que l’on désire à partir du moment où l’on est en capacité de le traduire en ligne de code. J’aime beaucoup ton astuce de n’envoyer la valeur d’un capteur si et uniquement si elle est différente de l’envoie précédent. Cela limite le trafic et donc économise la bande passante, les cycles lectures/écriture, la ressource et donc influe sur la consommation électrique.

Tu dis :

Peux tu préciser pour mon cas ? Ton ESP à toi c’est un micro (Arduino) pour moi. Ce micro devra collecter les valeurs de plusieurs capteurs différents. Si je transpose ta manière de faire, dois je créer un équipement virtuel par capteur (gérés par un même micro) ou par micro (qui gère plusieurs capteurs) ?

Merci minipouch.
En fait comme je ne connais pas Jeedom et la domotique en général j’avoue ne pas m’être attardé sur cette notion de plugging. D’autre part et au risque de passer pour un parano, je suis un peu dans le même état d’esprit que Foulek57, je préfère programmer moi même ce dont j’ai besoin. Car non seulement je maitrise totalement la fonction mais en plus le jour ou ça plante je suis aussi le mieux placé (normalement ! ) pour debuger. Du coup je ne dépends pas de la bonne volonté et du temps de quelqu’un autre…
En revanche, je partage toujours mon travail de manière à rendre service à celui qui ne sait pas ou pour bénéficier des améliorations ou recommandations ou observations éventuellement apportées par un autre.

Je finirai cette réponse collégiale par une question tout aussi… collégiale !

Pourquoi n’avez-vous pas pensé / opté / utilisé le protocole MQTT ?
Du peu que j’ai pu en lire, il semblerait que cela soit un protocole de plus en plus utilisé pour des systèmes domotiques et qu’il lui est d’ailleurs prédit un bel avenir dans ce domaine. Si je ne fais pas erreur, il existe un plugging MQTT pour Jeedom…

Merci @ tous pour vos nouvelles réponses, je suis impatient de vous lire.

Christophe.

Hello,

J’avais adapter mon Sketch pour un ami pour des capteur dht qui avait le montage sur un Arduino Uno avec une carte Ethernet justement.

J’ai pas accès tout de suite mais je te le partagerai demain ça t’aidera sûrement.

Et oui pour l’esp c’est en gros un Arduino avec une puce WiFi car j’aime pas les fils :grin:

J’utilise principalement des carte nodeMCU.

Pour MQTT je ne connais pas plus que ça et je ne me suis pas penché dessus, voilà pourquoi je n’utilise pas :wink:

Bonjour Foulek57,
Désolé pour ces jours de silence mais la situation sanitaire actuelle impact lourdement sur mes journées et mes nuits.

C’est avec grand plaisir si tu veux bien partager ton sketch.
Peux tu également m’apporter la précision sur ta mise en oeuvre avec Jeedom (dans mon dernier post) :

Merci @ toi.

Salut.

Ah ça m’est sorti de la tête… Je te partage ça demain ( je met un rappel cet fois…)

Je vais prendre l’exemple de mon garage pour imager la chose. Le micro Arduino (esp) me sert a plusieurs choses.

Capteur dht pour envoyer la température a jeedom
Contacteur simple pour remonter l’état de ma porte, si elle est ouverte ou fermée
Un relais pour commander ma porte de garage (contact sec) pour ce dernier je l’actionne de jeedom avec un script qui fait une simple requête http

Côté jeedom pour le capteur de température et le capteur d’état j’ai crée un équipement virtuel avec 2 commande info.

Donc un équipement virtuel = 1 micro Arduino.

Voici le sketch, si tu as des question n’hésite pas.

// Libraries
#include <Arduino.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <SPI.h>
#include <Ethernet.h>
#include <Bridge.h>
#include <HttpClient.h>


// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
//IPAddress server(74,125,232,128);  // numeric IP for Google (no DNS)
char server[] = "www.google.com";    // name address for Google (using DNS)

// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192, 168, 0, 177);
IPAddress myDns(192, 168, 0, 1);

#define DHT1PIN 2     // Pin du DHT
#define DHT2PIN 4     // Pin du DHT
#define DHT3PIN 7     // Pin du DHT
#define DHT4PIN 8     // Pin du DHT

#define DHTTYPE    DHT22    // ou DHT 11 à modifer en fonction

DHT dht1(DHT1PIN, DHTTYPE);
DHT dht2(DHT2PIN, DHTTYPE);
DHT dht3(DHT3PIN, DHTTYPE);
DHT dht4(DHT4PIN, DHTTYPE);


// Comme ça c'est alloué une bonne fois pour toute dès la compilation, 
// et il n'y aura pas d'allocation dynamique avec les effets de bords du à l'utilisation de String. Donc plus fiable, pas de comportement suspicieux ensuite.
// En réalité les microcontroleurs n'aime pas trop les String, elles sont consommatrices de mémoire sur le long terme (alloc dynamique, duplication etc)
// Il est préférable d'utiliser des array de char, mais on est obligé de fixer la taille
const char API_KEY[] = "TONAPIKEYJEEDOM";  // ici la taille est fixé à la compilation par la valeur qu'on lui a attribué. Ne
const char BASE_URL[] =  "GET /core/api/jeeApi.php?plugin=virtual&apikey=";
const char HOST[] =  "Host: jee.jeedom.com";

const char URL_SUFFIX[] = "&type=virtual&id=";
const char URL_VALUE[] = "&value=";
const char HTTP[] = " HTTP/1.1";

char stringBuffer[200];  // Attention : bien dimensionner le tableau. Ne peut être changé lors de l'execution

EthernetClient client;

void setup(){

  Serial.begin(9600);
// start the Ethernet connection:
  Serial.println("Initialize Ethernet with DHCP:");
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // Check for Ethernet hardware present
    if (Ethernet.hardwareStatus() == EthernetNoHardware) {
      Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
      while (true) {
        delay(1); // do nothing, no point running without Ethernet hardware
      }
    }
    if (Ethernet.linkStatus() == LinkOFF) {
      Serial.println("Ethernet cable is not connected.");
    }
    // try to congifure using IP address instead of DHCP:
    Ethernet.begin(mac, ip, myDns);
  } else {
    Serial.print("  DHCP assigned IP ");
    Serial.println(Ethernet.localIP());
  }

  // Serial port for debugging purposes
  dht1.begin();
  dht2.begin();
  dht3.begin();
  dht4.begin();
  
}
 
void loop(){  
  // Exemple non bloquant (delay bloque l'execution du programme, c'est à dire, pendant ce temps le micro ne fait rien, ne peut rien recevoir etc
  // pas grave quand il s'agit de millisec mais pourrait être bloquant si l'on voudrait faire quelque chose sur la réception d'une commande
  // pas le cas ici, si c'est juste pour envoyer des valeurs, mais c'est pour l'exemple
  // on pourrait par exemple vouloir laisser la possibilité à l'utilisateur d'envoyer des commandes/mettre à jour des paramètres depuis jeedom (changer la valeur du timer etc)
  
  // static variable : ne sera pas réinitialisée à chaque loop
  static unsigned long previousMillis = 0; 
  
  // variable contenant le temps
  unsigned long currentMillis = millis();
  
  unsigned long interval = 10000;
  
  // on vérifie le temps écoulé, et on effectue la tache si c'est le cas
  if (currentMillis - previousMillis >= interval) {
        // on met à jour notre variable contenant le temps
    previousMillis = currentMillis;
    
    // sensors
    readAndSendSensors();
  }
    

}

void readAndSendSensors() {

  int id1t = 1; // id du virtuel 
  int value1t = dht1.readTemperature();
  int id2t = 2; // id du virtuel 
  int value2t = dht2.readTemperature();
  int id3t = 3; // id du virtuel 
  int value3t = dht3.readTemperature();
  int id4t = 4; // id du virtuel 
  int value4t = dht4.readTemperature();
  sendToJeedom(value1t, id1t);
  sendToJeedom(value2t, id2t);
  sendToJeedom(value3t, id3t);
  sendToJeedom(value4t, id4t);

  int id1h = 5; // id du virtuel 
  int value1h = dht1.readHumidity();
  int id2h = 6; // id du virtuel 
  int value2h = dht2.readHumidity();
  int id3h = 7; // id du virtuel 
  int value3h = dht3.readHumidity();
  int id4h = 8; // id du virtuel 
  int value4h = dht4.readHumidity();
  sendToJeedom(value1h, id1h);
  sendToJeedom(value2h, id2h);
  sendToJeedom(value3h, id3h);
  sendToJeedom(value4h, id4h);  
}


void sendToJeedom(int value, int id)
{
  sprintf(stringBuffer, "%s%s%s%d%s%d%s", BASE_URL, API_KEY, URL_SUFFIX, id, URL_VALUE, value, HTTP); // concaténation
  
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.print("connecting to ");
  Serial.print(server);
  Serial.println("...");

  // if you get a connection, report back via serial:
  if (client.connect(server, 80)) {
    Serial.print("connected to ");
    Serial.println(client.remoteIP());
    // Make a HTTP request:
    client.println(stringBuffer);
    client.println(HOST);
    client.println("Connection: close");
    client.println();
  } else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }

  //client.get(stringBuffer);

  Serial.println(stringBuffer);  // ou on peut aussi utiliser  printf("Send to %s\n", buff);
}

Le code à été amélioré par un ami qui s’y connait vraiment bien, car au début je passais pas des String et mon code était blocant, les modifications sont expliquées.

Je te remercie pour ton partage. Je l’étudierai dès que j’aurai retrouvé un peu de sérénité.

Je mets mon post en résolu car vos observations m’ont bien aidé. Je n’ai plus qu’a m’y mettre…

Merci @ tous pour votre participation.

Salut
J’arrive sur le tard mais je recommande MQTT sans hésiter.
Un poil plus lourd à mettre en œuvre que les requêtes HTTP (car nécessite l’installation d’un broker) mais tellement plus puissant et adapté à du IoT à mon avis.
Regarde mon projet ici pour du code: https://github.com/Loic74650/PoolMaster

Bonjour Loic74,

Ton intervention est d’autant plus la bienvenue qu’elle complète parfaitement le fil de ma discussion abordant ainsi le seul aspect non encore évoqué… Le MQTT !

J’ai très rapidement parcouru ton projet et il semble que tu ais réalisé un système très complet qui demande à être lu attentivement.

Je suis persuadé que grâce aux éléments déjà apportés par Foulek57, minipouch et Patrick57 vous m’avez tous donné suffisamment de retours d’expériences pour me permettre à présent de faire un choix judicieux en fonction de mes besoins et contraintes.

Dès que j’aurais été en mesure d’apporté l’attention nécessaire à la bonne compréhension de ton projet, je me permettrai de revenir vers toi pour peut être certaines précisions.

Grand Merci.
Christophe

Hello Foulek, je rebondis sur ce code pour mon projet perso.
Deja Merci pour le partage de ce code :slight_smile:

Je l’ai essayé, en remplacant DHT12 par DHT11 comme indiqué, dans les deux cas j’ai :

sketch_may02a:32:20: error: ‹ DHT11 › was not declared in this scope
#define DHTTYPE DHT11 // ou DHT 11 à modifer en fonction
H:\DOMO\JEEDOM\Arduino full perso\sketch_may02a\sketch_may02a.ino:36:19: note: in expansion of macro ‹ DHTTYPE ›

DHT dht3(DHT3PIN, DHTTYPE);
`
Je aimerais savoir d’ou viens ce problème, si ce dernier vient des librairies, les quelles utilises tu ?

Merci d’avance :slight_smile:

Ok,c’était bien un problème de bibliothèques, j’ai changé de librairie pour le dht et ça compil !
Cool, maintenant mon problème c’est que c’est un code pour le shield ethernet sauf que moi j’ai un mini module ethernet ENC28J60 …

Je serais incapable de changer le code pour qu’il fonctionne avec mon module ethernet, quelqu’un à une idée ?

J’ai deja reusssi a faire fonctionner ce module avec la librairie UIPEthernet.h