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

Re: Arduino & Domoticz

Message par Bobardui »

mon Raspberry avec Sata SSD 500 Gb
Raspberry02.jpg
Raspberry02.jpg (211.99 Kio) Consulté 5910 fois
Raspberry01.jpg
Raspberry01.jpg (323.47 Kio) Consulté 5910 fois
Flying Domotic
Messages : 772
Inscription : 10 mars 2020, 15:26

Re: Arduino & Domoticz

Message par Flying Domotic »

J'ai analysé le code.

Il tourne toutes les "intervalle" ms (=500 ms, soit 0,5 s).

Toutes les 500 ms, on récupère le nombre d'impulsions sur la broche et on cumule dans un total.

Après, on lit sur des broches qui n'ont pas été déclarées en entrée : c'est pas bloquant mais c'est pas propre.

Visiblement, il y a un "truc" externe qui commande 6 vannes, connectées sur des broches de l'Arduino. J'espère que c'est du 5V, sinon il va faire tiède côté Arduino ;-) Je suppose qu'il y a un sélecteur de zones à l'extérieur, et que les 6 entrées sont connectées sur ce sélecteur. C'est le cas ?

A priori, le code regarde quelle(s) broche(s) externe(s) est(sont) active(s). Pour chaque broche active, on compare le débit instantané à une valeur donnée (étrangement positionnée par ailleurs ;-), et si elle est dépassée, ferme la vanne, et si le débit n'a toujours pas baissé après 2 secondes, indique qu'il y a une fuite ... 2 fois par seconde ... tant qu'on n'appuie pas sur le bouton.

Les trucs qui pourraient clocher (en plus du signal 2 fois par secondes), c'est qu'il n'y ait pas de remise à zéro de l'état dans Domoticz, donc qu'on aura du mal à détecter une seconde fuite sur le même circuit, et qu'il signalera toujours une fuite alors qu'elle aura était effacée par le bouton.

Par ailleurs, le résultat risque d'être amusant si on a plus d'une voie active en même temps, ou plus d'une fuite en même temps ... Pareil, l'appui sur le bouton effacera toutes les fuites en même temps.

Y'a probablement à regarder ce qui serait gênant (ou pas), déterminer quand et comment remettre à zéro les fuites, et surtout ne signaler une erreur qu'une seule fois plutôt que 2 fois par secondes ...

Qu'est ce qui serait raisonnable ?
Flying Domotic
Messages : 772
Inscription : 10 mars 2020, 15:26

Re: Arduino & Domoticz

Message par Flying Domotic »

Nos réponses se sont croisées ...

Une tentative pour n'envoyer qu'une seule fois le message :

Code : Tout sélectionner

// 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
#define NODE_ID_FUITE_SELECTOR         5

//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);
MyMessage msgFuiteSelector(NODE_ID_FUITE_SELECTOR, V_PERCENTAGE);

#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;
  bool emis;
};

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


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));
          // On ne signale l'erreur que si ça n'a pas déjà été fait
          if (zone.emis == false) {
            char messageFuite[] = "Fuite zone 0";
            messageFuite[11] += zoneIndex; 
            send(msgFuiteTexte.set(messageFuite));
            zone.emis = true;
          }
          //send(msgFuiteSelector.set(zoneIndex));
          //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;
              zone.emis = false;
              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);
  present(NODE_ID_FUITE_SELECTOR, S_DIMMER);
}
Bobardui
Messages : 28
Inscription : 23 févr. 2024, 21:18

Re: Arduino & Domoticz

Message par Bobardui »

Merci Flying

ça fonctionne, cela me permet de comprendre une autre solution de programmation

Merci de cette aide
Bobardui
Messages : 28
Inscription : 23 févr. 2024, 21:18

Re: Arduino & Domoticz

Message par Bobardui »

Bonsoir,
Je vais encore vous solliciter pour comprendre , puis programmer la ligne de code pour notifier par mail le changement de mon Widget
J'ai essayé plusieurs paramètres sur la ligne de code, mais votre éclairage doit m'aider à comprendre

Voici la ligne

Code : Tout sélectionner

		domoticz.notify('Fuite Zone ' .. device.name .. ' was template', domoticz.LOG_INFO )
Voici ce que j'ai cru comprendre :
"Fuite Zone" => 1ère partie du texte à envoyer par mail
" Device.name" => Nom du device qui est en 2ème partie du Texte
" Was template " => 3ème partie du texte envoyé
" domoticz.LOG_INFO " => adresse pour voir l'ensemble du texte dans les LOG

Ai-je bien compris ?
Je recherche à insérer la donnée du device ( Fuite Zone 3)
Donnée du Device.jpg
Donnée du Device.jpg (24.74 Kio) Consulté 5834 fois
Merci de votre aide
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Arduino & Domoticz

Message par Keros »

domoticz.LOG_INFO, c'est pour le niveau de log (debug, info, error)

Regarde la documentation DzVents pour trouver la fonction correspondant à ton widget : device.text, device.value, ou autre
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 »

Bonsoir Keros
Regarde la documentation DzVents
J'ai bien trouvé quelque chose , mais qui n'est pas explicite de la construction du code pour avoir l'information que je souhaite recevoir par mail
device.text, device.value
Je pensais pouvoir saisir ces info " .text " ou " .value " mais elles ne sont pas acceptées ou plutôt ne sont pas proposées dans la liste déroulante

Je patine.......
Bobardui
Messages : 28
Inscription : 23 févr. 2024, 21:18

Re: Arduino & Domoticz

Message par Bobardui »

Re ,
J'avance à petit pas
En choisissant autre chose que la liste déroulante, cela fonctionne avec ".text"
Mais maintenant je ne comprends pas l'utilité du format texte qui est après le "device.text".
J'ai bien essayé de tout supprimé, mais cela fait un code erreur dans les logs

Code : Tout sélectionner

		domoticz.notify('Alerte ' .. device.text .. ' T', domoticz.LOG_INFO )
Ci dessous les infos dans les logs avec le " T "

Code : Tout sélectionner

2024-03-12 20:56:00.129 Status: dzVents: Write file: /home/pi/domoticz/scripts/dzVents/generated_scripts/Script Fuite.lua
2024-03-12 20:56:31.984 Status: dzVents: Info: Handling events for: "Fuite Zone", value: "Fuite zone 3"
2024-03-12 20:56:31.984 Status: dzVents: Info: template: ------ Start internal script: Script Fuite: Device: "Fuite Zone (Débitmètre)", Index: 15
2024-03-12 20:56:31.984 Status: dzVents: Info: template: Fuite ZoneFuite Zone was changed
2024-03-12 20:56:31.984 Status: dzVents: Info: template: ------ Finished Script Fuite
2024-03-12 20:56:31.985 Status: EventSystem: Script event triggered: /home/pi/domoticz/dzVents/runtime/dzVents.lua
2024-03-12 20:56:31.991 Status: Notification: Alerte Fuite zone 3 T
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Arduino & Domoticz

Message par Keros »

La documentation DzVents pour un widget text indique deux arguments possibles :
  • text: String
  • updateText(text): Function*. Supports command options.
Si device est la variable correspondant à ton widget, alors :
  • device.text contient le texte du widget
  • updateText("Mon texte") permettra de mettre à jour le widget avec "Mon texte"
Concernant ta ligne domoticz.notify('Alerte ' .. device.text .. ' T', domoticz.LOG_INFO )
  • domoticz.notify() va créer une notification
    'Alerte ' .. device.text .. ' T' est le text qui sera mis dans la notification
    domoticz.LOG_INFO indique le niveau de la notification
Mais, en regardant le premier exemple de la documentation, domoticz.LOG_INFO ne semble pas aller avec domoticz.notify.
Soit, tu souhaites faire une ligne de log > domoticz.log('Alerte ' .. device.text .. ' T', domoticz.LOG_INFO )
Soit, tu souhaites faire une notification > domoticz.notify('Alerte ' .. device.text .. ' T', domoticz.PRIORITY_LOW )

Concernant le texte 'Alerte ' .. device.text .. ' T' les .. servent à concaténer des chaines de caractères (les ajouter les unes aux autres). Tu as donc Alerte (en caractère) puis la valeur de device.text puis à nouveau les caractères T. Voilà pourquoi tu as un T dans la ligne de log.
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 toutes ces précisions qui me font comprendre les possibilités de programmation d'un script
Répondre