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 ...
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Arduino & Domoticz

Message par Keros »

Peut-être le type de widget utilisé ??

J'ai rédigé un guide pour insérer des images ou des fichiers sur le forum. Voir le lien dans ma signature.
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
boum
Messages : 233
Inscription : 18 janv. 2019, 11:34
Localisation : France

Re: Arduino & Domoticz

Message par boum »

Bobardui a écrit : Petite question : le chiffre [11] correspond à quoi ?
C'est le 12e caractère de la chaîne

Code : Tout sélectionner

                       v– ça c'est messageFuite[0]
char messageFuite[] = "Fuite zone 0";
                                  ^– et on a donc messageFuite[11]
Domoticz v2022.2 sur linux-mint / Z-Wave-JS / RFXCom / Zigbee2MQTT
Bobardui
Messages : 28
Inscription : 23 févr. 2024, 21:18

Re: Arduino & Domoticz

Message par Bobardui »

Bonsoir,
Après une semaine d'essai, ce soir c'est ma soirée question / réponse
Peut-être le type de widget utilisé ??
Fuite Zone.jpg
Fuite Zone.jpg (25.25 Kio) Consulté 3323 fois
Les widgets "texte" n'aurait pas de "notification" ?
C'est le 12e caractère de la chaîne
de quelle chaîne ?
send(msgFuiteZone1.set(zoneIndex));
Après l'avoir mis opérationnel dans arduino, j'ai une action "on " ou "off" sur un interrupteur dans Domoticz, mais je n'arrive pas à savoir à quel moment cela se produit

Code : Tout sélectionner

#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);

#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 = 1000;  // 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:
          const int zoneIndex = &zone - zones + 1;
          //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(zoneIndex);  // affiche numéro de zone
          //A placer a l'endroit de ton code ou tu veux remonter la fuite dans domoticz:
          send(msgFuiteZone1.set(zoneIndex));
          char messageFuite[] = "Fuite zone 0";
          messageFuite[11] += zoneIndex; 
          send(msgFuiteTexte.set(messageFuite));
          //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
          //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"));
          // 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++;
  }
//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);
}
Dernière question
Oui les pins TX et RX,(UART) comme le port USB(SERIAL) de l'arduino permettent une communication série.
Donc en principe tout ce que tu as pu lire ci-dessus est applicable aux 2 branchements.

Avec un rappel sur l'UART, il te faudra probablement adapter les niveaux de tensions 3v3/5v.
En utilisant mon cable USB de l'arduino connecté au Raspberry, je ne peux pas télécharger le code dans l'Arduino, et vice versa
Puis-je utiliser les broches TX et RX de l'arduino et du Raspberry pour moyen de communication entre les deux ?
Si oui, merci de me confirmer que la broche TX d'un doit être reliée à RX de l'autre , et vice versa ?

Ce n'est peut-être pas trop sympa de ma part de vous solliciter autant en week-end !!, mais votre aide est trop précieuse pour comprendre tous ces langages
Merci encore
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Arduino & Domoticz

Message par Keros »

Ah bien oui, je n'ai pas de widget text, donc je n'ai pas qu'il pouvait y en avoir sans notification.

Tu peux essayer de passer avec un widget Alerte. Tu auras les notifications, mais le changement d'icône n'est pas facile : il faut passer par un script (il y a un sujet sur le forum qui en parle).

Tu peux mettre un widget switch : tu auras les icônes, les notifications, mais ce ne sera pas simple pour indiquer la zone de fuite. Soit, tu fais plusieurs widgets (1 par zone de fuite) soit tu peux essayer de modifier le titre du widget pour indiquer la zone en question.

Le reste, je ne peux pas répondre. Et ce n'est pas grave si c'est le soir ou le weekend :mrgreen:
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 »

Merci Keros pour ta réactivité,
De plus j'avance, de plus je découvre des possibilités
C'est très enrichissant
Maintenant je dois comprendre le fonctionnement et la méthode d'écrire un script à partir des différents exemples, à moins qu'il y ai une documentation sur le sujet
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Arduino & Domoticz

Message par Keros »

Une fois le principe compris, les seules limites sont l'imagination, le temps et le budget :mrgreen:

Pour les scripts, je te propose de regarder les petits guides que j'ai écrits dans ma présentation (lien dans ma signature).
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 »

Keros,
Mes excuses, je n'ai pas lu, relu, rerelu ton commentaire, puis j'ai découvert ton tuto sur les scripts

Bonne soirée
petrapi
Messages : 19
Inscription : 10 mars 2018, 16:41

Re: Arduino & Domoticz

Message par petrapi »

Bonsoir Bobardui,
En utilisant mon cable USB de l'arduino connecté au Raspberry, je ne peux pas télécharger le code dans l'Arduino, et vice versa
Puis-je utiliser les broches TX et RX de l'arduino et du Raspberry pour moyen de communication entre les deux ?
Si oui, merci de me confirmer que la broche TX d'un doit être reliée à RX de l'autre , et vice versa ?
Et oui ce n'est pas très pratique, cela dit c'est ponctuel, quand tout marchera le code arduino ne devrai pas être mis a jour tous les jours ;)
Sinon oui il te faut croiser les RX/TX, et utiliser un "level shifter" 3v3/5v, c'est pas très cher, en mettant le 5V coté arduino et le 3v3 coté pi. Sauf bien sur si tu as un arduino en 3v3, mais ils ne sont pas courant.
send(msgFuiteZone1.set(zoneIndex));
Je pense que c'est ne que 0 ou 1 (fuite ou pas fuite) a mettre dans le set().
Mais en principe le widget associé a cette commande devrait avoir le fameux icône "notifications".

Dans le cas du widget "text", tu devrais t'en sortir facilement avec un peu de Lua dans domoticz.
Par exemple tu peux créer un Dzvents de type device: Configuration/Plus d'options/Evenements, puis tu ajoutes un nouveau script de type dvVents/Device.
Et tu adaptes légèrement:
le nom du widget: 'myDevice' => 'Fuite Zone'
pour recevoir des mails: domoticz.log( => domoticz.notify(

Sinon j'y pense tu as encore une 3eme option, avec un widget de type selector.
le code arduino serai:

Code : Tout sélectionner

#define NODE_ID_FUITE_SELECTOR         5
MyMessage msgFuiteSelector(NODE_ID_FUITE_SELECTOR, V_PERCENTAGE);
void presentation()
{
  present(NODE_ID_FUITE_SELECTOR, S_DIMMER);
}

//Pour annoncer ta fuite:
send(msgFuiteSelector.set(zoneIndex));
(Je crois que quand ton widget se créer, c'est a toi a lui rentrer les niveaux souhaités: 1,2,3,4... avec les noms que tu veux: zone1,2 etc..)
Bobardui
Messages : 28
Inscription : 23 févr. 2024, 21:18

Re: Arduino & Domoticz

Message par Bobardui »

Bonjour Petrapi

Merci pour toutes ces réponses et propositions
Je vais digérer tout cela et te fera un retour de mes choix (qui sont changeant en découvrant les possibilités de Domoticz)

Ps : du plus je pédale moins vite, "du moins" j'avance plus vite (grâce à vous tous)
Bobardui
Messages : 28
Inscription : 23 févr. 2024, 21:18

Re: Arduino & Domoticz

Message par Bobardui »

Bonjour
Est-ce que l'on peut écrire un script pour lire une information d'un widget "TEXT" pour ensuite envoyer une notification

Exemple,
Fuite Zone.jpg
Fuite Zone.jpg (25.25 Kio) Consulté 3275 fois
En lisant "Fuite Zone 2 " ou " Zone 2" ou " 2" , Domoticz m'envoie une notification d'alerte par mail

Bon dimanche
Répondre