Page 4 sur 5

Re: Arduino & Domoticz

Publié : 03 mars 2024, 08:59
par Keros
Je pense que oui, mais je ne l'ai pas testé.

Ce serait un très bon exemple pour commencer à faire des scripts : quand le widget change, je mets une ligne d'info dans les logs. Ensuite, dans un deuxième temps, tu pourras rajouter le code pour envoyer la notification.

Re: Arduino & Domoticz

Publié : 03 mars 2024, 11:27
par Bobardui
Bonjour Keros
Je n'ai pas tout compris
LOG01.png
LOG01.png (50 Kio) Consulté 3143 fois
C'est à partir de cela que je dois recherché un changement ?

Re: Arduino & Domoticz

Publié : 03 mars 2024, 11:59
par Keros
J'essayais de te guider pour commencer ton script. Cela se rapproche de ce que j'explique dans mon petit guide pour débuter en programmation : commencer très simple (même si cela ne répond pas tout de suite à ton besoin) et ensuite rajouter d'autres fonctions pour arriver à faire ce que tu souhaites.

C'est ton script qui doit se lancer quand il y aura un changement sur ton Widget.

Re: Arduino & Domoticz

Publié : 04 mars 2024, 18:58
par Bobardui
Bonsoir,
J'ai tenté un script qui me permet l'identification du texte contenu dans mon Widget Mesure " Fuite Zone "

Code : Tout sélectionner

return {
	on = {
		devices = {
			'Fuite Zone'
		}
	},
	logging = {
		level = domoticz.LOG_INFO,
		marker = 'template',
	},
	execute = function(domoticz, device)
		domoticz.log('Fuite Zone' .. device.name .. ' was changed', domoticz.LOG_INFO)
	end
}
Ci joint la copie d'écran des logs du device
LOG Widget.png
LOG Widget.png (26.9 Kio) Consulté 3123 fois
et la copie d'écran des Logs dans " LOG "
LOG logs.png
LOG logs.png (85.68 Kio) Consulté 3123 fois
Mon problème c'est que dans les logs, il y a beaucoup trop de lignes, et souvent il faut attendre très longtemps pour voir afficher le nouveau changement qui a bien eu lieu dans les logs du Widget

Ai-je loupé quelque chose ?

Ps : comment faire pour lire les logs sur plusieurs minutes ?

Re: Arduino & Domoticz

Publié : 04 mars 2024, 19:31
par Flying Domotic
Ton script est correct, et fonctionne.

S'il est déclenché aussi souvent, c'est que le device "Fuite Zone" doit être changé très souvent aussi. Comme les valeurs semblent identiques, il n'est pas impossible qu'un script/évènement extérieur ait tendance à le réécrire à la même valeur en quasi permanence, même lorsqu'il ne change pas.

Peux-tu nous dire qui "écrit" Fuite zone, et à quel intervalle ?

Pour voir le log en complet, tout dépend de la façon dont le deamon a été lancé. C'est (en principe) indiqué dans le fichier domoticz.sh, qui se trouve (toujours en général) dans le répertoire /etc/init.d/domoticz.sh.

Par défaut, la lignes suivante est commentée :

Code : Tout sélectionner

#DAEMON_ARGS="$DAEMON_ARGS -log /tmp/domoticz.txt"
Enlever le commentaire (supprimer le #), enregistrer la modification, mettre à jour le système de gestion de service par la commande

Code : Tout sélectionner

sudo systemctl deamon_reload
et relancer Domoticz

Code : Tout sélectionner

sudo service domoticz restart
On devrait ensuite avoir un fichier /tmp/domoticz.txt, qu'on peut visualiser par

Code : Tout sélectionner

cat /tmp/domoticz.tmp
On peut aussi ne voir que les 100 dernières lignes par

Code : Tout sélectionner

tail -n 100 /tmp/domoticz.tmp
ou voir les 100 dernières lignes et toutes celles qui arriveront ensuite par

Code : Tout sélectionner

tail -n 100 -f /tmp/domoticz.tmp

Re: Arduino & Domoticz

Publié : 04 mars 2024, 20:15
par Keros
Pour les logs, merci de regarder la section Bien utiliser le forum pour rédiger votre message.

Normalement, il ne devrait pas y avoir de décalages. Ton DomoticZ tourne sur quel système ?

C'est quoi qui est trop bavard dans tes logs ? C'est le nombre d'exécutions de ton script ? C'est autre chose ?

Re: Arduino & Domoticz

Publié : 04 mars 2024, 21:24
par Bobardui
Re,
Peux-tu nous dire qui "écrit" Fuite zone, et à quel intervalle ?
C'est le programme ci joint

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;
};

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));
          //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;
              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);
}
Mais autre problème, j'ai modifié
Par défaut, la lignes suivante est commentée :
CODE : TOUT SÉLECTIONNER

#DAEMON_ARGS="$DAEMON_ARGS -log /tmp/domoticz.txt"
Enlever le commentaire (supprimer le #), enregistrer la modification, mettre à jour le système de gestion de service par la commande
CODE : TOUT SÉLECTIONNER

sudo systemctl deamon_reload
et relancer Domoticz
CODE : TOUT SÉLECTIONNER

sudo service domoticz restart
et voici le résultat " Warning " et comme je ne suis pas un pro (eh bien je suis sous l'eau )
Daemon.jpg
Daemon.jpg (183.88 Kio) Consulté 3115 fois

Re: Arduino & Domoticz

Publié : 04 mars 2024, 21:30
par Flying Domotic
En ce qui concerne l'erreur, je me suis trompé dans la commande "deamon_reload". Il faut exécuter

Code : Tout sélectionner

sudo systemctl daemon-reload
avec un "-" et pas un "_" comme écrit initialement.

Pour le code, je regarde, mais il n'est pas impossible que les mises à jour soient permanentes.

Re: Arduino & Domoticz

Publié : 04 mars 2024, 21:47
par Bobardui
Ouuuufff !!

Merci....je continue

Re: Arduino & Domoticz

Publié : 04 mars 2024, 21:59
par Bobardui
Normalement, il ne devrait pas y avoir de décalages. Ton DomoticZ tourne sur quel système ?
Raspberry PI 3B+

Petite explication sur mon programme Arduino en amont :
Quand la broche d'information de la zone d'arrosage est activée et que le débit est supérieur au débit paramétré, la " case STOP " est activée avec l'envoi d'une information de "fuite Zone x "
Cette information est désactivée par un " reset " sur la broche 4