Arduino & Domoticz

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 ...
Bobardui
Messages : 28
Inscription : 23 févr. 2024, 21:18

Arduino & Domoticz

Message par Bobardui »

Bonjour,
Je suis un jeune utilisateur de Domoticz, et je fais des montages sous Arduino
Actuellement, j'ai conçu un contrôleur de débit d'eau qui ferme la vanne principale en cas de dépassement d'un débit défini.
A noter que ce contrôleur est piloté par plusieurs zones d'arrosage donc plusieurs débit différents. Chaque surconsommation donne lieu à une information visuelle sur mon LCD " Fuite Zone 1 " ou " zone 2 " etc...
Plusieurs Zones, un seul débitmètre, une seule Vanne Principale . Cette dernière n'est fermée que si la zone en "défaut" est activée, ce qui n'interdit pas l'arrosage sur les autres zones
Toutes ces précisions pour vous demander conseil sur le mode opératoire de transférer ces informations sur mon Domoticz et ainsi être averti par Mail d'une " Fuite sur Zone "x " "
Ce n'est pas une solution "clé en main" que je recherche, mais seulement un aiguillage pour ne pas me perdre dans des solutions scabreuses.
Merci par avance pour votre éclairage
A noter que j'utilise un PI 3B+ avec un SSD pour sauvegarde
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Arduino & Domoticz

Message par Keros »

Bonjour Bobardui et bienvenu sur le forum :)

Je viens de déplacer ton sujet dans la section dédiée au DIY.

Tu aurais quel moyen de communication entre ton système et ton serveur DomoticZ ?

Si tu as du Wifi et que ton montage peut communiquer dessus, tu peux utiliser l'API de DomoticZ pour envoyer des infos.
Tu as aussi les petites cartes à base d'ESP 32 (wemos D1 mini par exemple) avec une puce wifi sur lesquels on peut mettre ESPEasy ou Tasmota. Il faudrait alors que ton fonctionnement d'arrosage soit réécrit sous forme de règles.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Bobardui
Messages : 28
Inscription : 23 févr. 2024, 21:18

Re: Arduino & Domoticz

Message par Bobardui »

Bonjour Keros
Je vais communiquer en filaire avec une connexion sur un GPIO du raspberry si cela est possible, et ainsi éviter les quelques problèmes de communication en Wifi
Maintenant reste à savoir comment faire pour qu'une information provenant d'un arduino Uno soit lue et traduite vers Domoticz
Merci de votre aide
petrapi
Messages : 19
Inscription : 10 mars 2018, 16:41

Re: Arduino & Domoticz

Message par petrapi »

Bonjour Bobardui,

Dans des montages similaires au tiens, j'ai utilisé la librairie MySensors sur l'arduino, par câble usb, en coupant le fil d'alim si l'arduino a déjà sa propre alimentation.
Les gpio de la plupart des arduinos sont en 5v, et ceux des pi sont en 3v3.

Je ne sais pas si c'est un bon conseil que je te donne, parce que j'ai l'impression que MySensors devient "old school". Mais enfin cela fonctionne très bien, et très simple a mettre en œuvre avec domoticz. Tu pourras garder ton code, simplement y déclarer avec la librairie tes objets que tu veux voir apparaître.
Bobardui
Messages : 28
Inscription : 23 févr. 2024, 21:18

Re: Arduino & Domoticz

Message par Bobardui »

Bonjour petrapi,

J'aimerai connaitre le langage utilisé par Arduino pour envoyer une info à Domoticz, et à ce sujet, pourrais-tu m'envoyer un exemple de code Arduino (à partir d'un de tes montages ) qui me permettrait de comprendre et ainsi faire des essais sans mettre en péril les deux applications
Actuellement je dispose d'une information " Fuite Zone 1 " que je souhaite avoir en alerte Mail de Domoticz
Je te joint l'intégralité du code Arduino, qui peut servir à d'autres utilisateurs

Code : Tout sélectionner

 //detection de fuite avec bouton de réactivation pour plusieurs Zones avec plusieurs seuils de débit maxi lcd 20X4


#include <Wire.h>               // Bibliothèque pour la communication I2C
#include <LiquidCrystal_I2C.h>  // Bibliothèque pour le contrôle de l'écran LCD en mode I2C

LiquidCrystal_I2C lcd(0x27, 20, 4);  // Adresse I2C de l'écran LCD 20x4

const int brocheDebit = 2;         // Broche de la sonde de débit d'eau
const int brocheElectrovanne = 3;  // Broche pour contrôler l'électrovanne
const int brocheBouton = 4;        // Broche du bouton-poussoir pour remise à zéro

unsigned int compteImpulsions = 0;
float debitInstantane = 0.0;
float totalLitres = 0.0;  // Changement d'unité de litres à mètres cubes
unsigned long tempsPrecedent = 0;
const long intervalle = 500;                            // Intervalle d'échantillonnage en millisecondes
const unsigned long delaiFermetureElectrovanne = 5000;  // Délai de fermeture de l'électrovanne en millisecondes

enum Etat { REPOS,   
            ACTIF,
            STOP };

// tous les éléments contenus dans la structure seront identifiés par un . précédant le nom de l'élément à rechercher
//par exemple, pour identifier le "seuilDebitCoupe", on inscrit "digitalRead(zone.seuilDebitCoupe)" 
struct SZone {            
  const byte broche;    // N° de la broche pour information de la zone d'arrosage
  const float seuilDebitCoupe;  // Débit maxi autorisé
  Etat etat;                    //
  unsigned long tempsDebutDebit;
  unsigned long tempsDebutEtat;
};

SZone zones[] = {
  {5, 1.1, REPOS, 0, 0},  // N° broche , Débit maxi, Etat etat , temps début débit, temps début Etat 
  {6, 2.1, REPOS, 0, 0},
  {7, 3.1, REPOS, 0, 0},
  {8, 4.1, REPOS, 0, 0},
  {9, 5.1, REPOS, 0, 0},
  {10, 6.1, REPOS, 0, 0}
};


void setup() {
  lcd.begin(20, 4);  // Initialisation de l'écran LCD 16x2
  lcd.print("Debit: 0.0 m3/h");
  lcd.setCursor(0, 1);
  lcd.print("Total: 0.0 m3");

  pinMode(brocheDebit, INPUT);
  pinMode(brocheElectrovanne, OUTPUT);
  pinMode(brocheBouton, INPUT_PULLUP);
  
  attachInterrupt(digitalPinToInterrupt(brocheDebit), compteurImpulsions, FALLING);
}

void loop() {
  unsigned long tempsActuel = millis();  // Obtient le temps actuel en millisecondes

if (tempsActuel - tempsPrecedent >= intervalle) {
    // calcul et affichage du débit
    noInterrupts();
    unsigned int compteurLocal = compteImpulsions;  // Conversion du nombre d'impulsions en débit instantané en Litres par minute
    compteImpulsions = 0;
    interrupts();
    tempsPrecedent = tempsActuel;

    float volume=compteurLocal/450.0;   // volume en litre
    debitInstantane=volume/intervalle*1000*60;  // débit en l/mn
    totalLitres += volume;

    lcd.clear();
    lcd.print("Debit: ");
    lcd.print(debitInstantane, 0);
    lcd.print(" L/mn");

    lcd.setCursor(0, 1);
    lcd.print("Total: ");
    lcd.print(totalLitres, 0);
    lcd.print(" L");
  }

  for (auto &zone : zones)  // effectue le traitement pour toutes les zones
  {

    if (digitalRead(zone.broche) == HIGH) {  //Lecture de l'information de l'arrosage de la Zone

      switch (zone.etat) {
        case REPOS:
          digitalWrite(brocheElectrovanne, HIGH);
          if (debitInstantane > zone.seuilDebitCoupe) {
            zone.tempsDebutDebit = tempsActuel;
            zone.etat = ACTIF;
          }
          break;

        case ACTIF:
          if (debitInstantane > zone.seuilDebitCoupe) {
            if (tempsActuel - zone.tempsDebutDebit >= delaiFermetureElectrovanne) {
              digitalWrite(brocheElectrovanne, LOW);
              zone.etat = STOP;
              zone.tempsDebutEtat = tempsActuel;
            }
          } else {
            zone.etat = REPOS;
          }
          break;

        case STOP:
          //lcd.clear();  // Effacer l'écran après le message de démarrage
          lcd.setCursor(0, 2);
          lcd.print("Fuite Zone");       // Affiche un avertissement de fuite
          lcd.print(&zone - zones + 1);  // affiche numéro de zone
          // Nouvelle condition pour la réinitialisation avec maintien de 2 secondes
          if (digitalRead(brocheBouton) == LOW) {
            if (tempsActuel - zone.tempsDebutEtat >= 2000) {
              digitalWrite(brocheElectrovanne, HIGH);
              zone.etat = REPOS;
              lcd.setCursor(0, 0);
              lcd.print("                 ");  // Efface le texte "Fuite" lors du retour à l'état REPOS
              lcd.setCursor(0, 1);
              lcd.print("                 ");  // Efface le texte "Fuite" lors du retour à l'état REPOS
            }
          } else {
            zone.tempsDebutEtat = tempsActuel;
          }
          break;
      }
    }
  }
}

  void compteurImpulsions() {
    compteImpulsions++;
  }

Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Arduino & Domoticz

Message par Keros »

Je viens de retrouver ce sujet qui se rapproche de ce que tu cherches à faire.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
petrapi
Messages : 19
Inscription : 10 mars 2018, 16:41

Re: Arduino & Domoticz

Message par petrapi »

Le sujet retrouvé par Keros et intéressant oui, c'est bon a savoir merci ^^.
Et du coup Mysensors est potentiellement une sur-couche inutile.

Enfin si tu veux un exemple voici toujours:

Code : Tout sélectionner

// Enable debug prints to serial monitor
//#define MY_DEBUG

// Enable serial gateway
#define MY_GATEWAY_SERIAL
#include <MySensors.h>

//Definition des NODES:
#define NODE_ID_FUITE_ZONE1         1
#define NODE_ID_FUITE_TEXTE         4

//https://www.mysensors.org/download/serial_api_20
// pour une node fuite d'eau il faut utiliser V_TRIPPED ou V_ARMED
MyMessage msgFuiteZone1(NODE_ID_FUITE_ZONE1, V_TRIPPED);
MyMessage msgFuiteTexte(NODE_ID_FUITE_TEXTE, V_TEXT);

//Fonction de presentation a rajouter
void presentation()
{
  // Present locally attached sensors
  present(NODE_ID_FUITE_ZONE1, S_WATER_LEAK);
  present(NODE_ID_FUITE_TEXTE, S_INFO);
}

//A placer a l'endroit de ton code ou tu veux remonter la fuite dans domoticz:
send(msgFuiteZone1.set(1));
send(msgFuiteTexte.set("Fuite zone 1"));
J'ai adapté le code a ton cas, sans le tester.
A noter que soit tu créées autant d'objets de type "S_WATER_LEAK" que tu as de zones, soit tu utilises un seul "S_INFO" dans lequel tu met le texte que tu veux.

Dans domoticz, tu ajoutes un Matériel de type MySensors, tu configures le nom du port, et normalement tes "nodes" apparaissent dans les dispositifs.
Bobardui
Messages : 28
Inscription : 23 févr. 2024, 21:18

Re: Arduino & Domoticz

Message par Bobardui »

Bonjour,
Merci pour votre retour,
Si je comprends bien, je dois ajouter un code dans l'arduino, mais aussi créer un code dans Domoticz.
Si c'est bien cela, à quel endroit je dois ajouter un code dans Domoticz ?
Je dois me faire une schématique de fonctionnement pour avancer et ne pas dépendre que des autres.
Y a-t-il des tutos qui expliquent les modes de programmation ?
petrapi
Messages : 19
Inscription : 10 mars 2018, 16:41

Re: Arduino & Domoticz

Message par petrapi »

Avec MySensors non tu ajoutes seulement du code coté arduino.
Après dans domoticz tu utilises l'interface normalement pour ajouter un "matériel", dans la liste disponible tu sélectionnes Mysensors.
Bobardui
Messages : 28
Inscription : 23 févr. 2024, 21:18

Re: Arduino & Domoticz

Message par Bobardui »

Re
Je mélange peut-être un peu tout.....mais j'ai lu à quelque part que les pin "TX " et " RX " pouvaient être utilisés pour transférer des informations ?
Est-ce une solution ?
Si oui où trouver les modes opératoires pour mettre en œuvre cette possibilité ?
Répondre