Electrovanne bi-stable et contrôle du bon fonctionnement

Forum dédie aux capteurs et gateway mysensors.org
Gilles BILLARD
Messages : 75
Inscription : 09 oct. 2017, 09:34
Localisation : 45km sud Paris

Electrovanne bi-stable et contrôle du bon fonctionnement

Message par Gilles BILLARD »

Bonjour,
Je vais encore avoir besoin de vos lumières;
J'ai quelques questions, mais avant tout je vous situe le sujet:
Je souhaite piloter une (pour commencer) électrovanne bistable et contrôler son bon fonctionnement.
J'utilise MySensors + Arduino pro-mini; J'y ajoute un Hbridge commandé par 2 sortie binaires (D4 et D5) et un débimètre low-cost connecté a la 2emme interruption (D3);
Dans l'attente du Hbridge, je connecte des leds sur D4 D5 et j'envoie des niveaux plutôt que des impulsions pour monitorer les états.
J'ai ecrit un petit bout de code pour vérifier le bon fonctionnement du débimètre (mesure débit et totalisateur de volume)
Et comme ca marche bien je l'intègre dans mon node.
Le node est commandé depuis Domoticz par un petit script en Blocky qui commande ouverture/fermeture en fonction de température (a terme, ce sera plutot en fonction de l'heure et/ou de l'humidité de la terre)
Le retour vers la GateWay se fait sous forme d'info binaire de bon ou de mauvais fonctionnement selon la logique suivante: si la vanne doit etre ouverte alors le débimètre doit tourner et dans ce cas, pas d'erreur (un zéro est renvoyé a la centrale) et inversement (après trois tentatives infructueuses).
Vu que je teste sur table, si je commande la vanne a la fermeture, il n'y a pas de débit et donc tout est OK
Mais si je demande une ouverture, alors un erreur doit etre renvoyée puisque le débimètre ne tourne pas....
Premier problème: En cas d'erreur, l'alarme n'est pas activée dans Domoticz
J'instancie les classes Mymessage de la façon suivante

Code : Tout sélectionner

MyMessage flowMsg(CHILD_ID_FLOW, V_FLOW);
MyMessage volMsg(CHILD_ID_VOLUME, V_VOLUME);
MyMessage errorEVMsg(CHILD_ID_EV_Status, V_STATUS);
Je présente mon node ainsi

Code : Tout sélectionner

void presentation()
{
    sendSketchInfo("Arrosage", "1.0");// Send the sketch version information to the gateway and Controller
    present(CHILD_ID_EV_Status, S_BINARY);  
    present (CHILD_ID_FLOW, S_WATER);
    present(CHILD_ID_VOLUME,S_WATER);
    present (CHILD_ID_STATUS,S_BINARY);
}
Et la partie du code qui ne déclenche rien est le suivant:

Code : Tout sélectionner

void receive(const MyMessage &message)
{
    if (message.getType()==V_STATUS) {                // vérification de l'ordre
        if (message.getBool()== true) {               // Ordre d'ouverture
          for (int i=1; i <= nbTentatives; i++) {     // tentatives
            myElectrovanne.off();                       // TODO LIGNE TEST  A SUPPRIMER
            myElectrovanne.open();                      // envoi d'un pulse de 50ms
            Serial.println ("ouverture EV "); 
  //          wait (dureePulseEV);                                // TODO OTER LE REM DE CES 2 LIGNES
  //          myElectrovanne.off();
            wait (delayFlowMetre);                                // attente pleine ouverture
            if (myDebimetre.actif == false){              // si pas bien ouverte
              send(errorEVMsg.set(1));                  // Panne electrovanne
              Serial.println ("La vanne ne s'est pas ouverte ");
            }  
            else{  .....
La ligne send(errorEVMsg.set(1)); // Panne electrovanne est supposée déclancher le baculement du switch associé dans Domoticz mais ca ne marche pas alors que le moniteur série affiche:
ouverture EV
La vanne ne s'est pas ouverte
ouverture EV
La vanne ne s'est pas ouverte
ouverture EV
La vanne ne s'est pas ouverte
et le log du GW dit:

Code : Tout sélectionner

2021-05-02 12:27:58.047 GiBi-Home: Temp (Temp N°2 (Serre tunnel))
2021-05-02 12:27:58.051 EventSystem: Event triggered: Script #1_2
2021-05-02 12:27:59.061 GiBi-Home: Light/Switch (Electrovanne (Serre tunnel))
2021-05-02 12:28:00.037 GiBi-Home: Light/Switch (Electrovanne (Serre tunnel))
Qu'est ce que je n'ai pas compris ?

(d'autres questions a venir car ceci est déjà bien assez long a lire)

PS: Le sketch mis a jour au fur et a mesure de son avancement comme conseillé plus bas dans ce fil de discussion:

Code : Tout sélectionner

/*
Sketch MySensor pour activer et monitorer une électrovanne (d'arrosage)suivie d'un débimètre numérique.
Pour etre bien certain qu'une électtrovanne bistable se trouve dans la position voulue, il faut une information en retour
Un ordre donné par la centrale peut très bien etre arrivé a destination sans que l'électrovanne n'ait suivi;
Une solution consiste a monitorer le passage de l'eau au moyen d'un débimètre low-cost pour boucler le système.
BOM:
Electrovanne bistable (récup Gardena ou low-cost chinois) 
Débimetre chinois a 450 impulsions par litre (https://fr.aliexpress.com/item/32873453373.html?spm=a2g0s.9042311.0.0.4f676c377Zowm9)
30 l.mn Max soit 225 Hz max (4.44ms de prériode mini entre 2 impulsions)
Pour les tests sur table, cabler led verte en pin 4 et led rouge en pin 5
En réel, cabler un pont en H (H-bridge) a la place des leds

Version 1.0 Initiale
Version 1.1 
Version 1.2 
 */

#define MY_RADIO_RF24               // Enable and select radio type attached
//#define MY_RADIO_NRF5_ESB
//#define MY_RADIO_RFM69
//#define MY_RADIO_RFM95
#define MY_REPEATER_FEATURE         // Repeater functionality valid (for far watering points)

#define CHILD_ID_EV_Cmd 0           // Commande de l'élecrovanne
#define CHILD_ID_EV_Status 1        // Status de l'Electro-Vanne
#define CHILD_ID_FLOW 2             // débit (non utilisé pour l'instant)
#define CHILD_ID_VOLUME 3           // volume

#include <MySensors.h>
#define DIGITAL_INPUT_SENSOR 3      // Entrée interruption du débimètre
#define Open_PIN 4                  // Sortie H bridge vers électrovanne
#define Close_PIN 5                 // Sortie H bridge vers électrovanne
//*******Options utilisateur**********
double ppl = 450;                   // ppl (Pulses per liter) comme défini pas la notice du capteur
double miniFlow = 0;                // seuil de détection de débit (en tics par seconde)
byte nbTentatives = 3;              // nombre de tentative pour ouvrir la vanne avant renvoi d'une erreur
byte dureePulseEV = 50;             // (ms) durée de l'impulsion pour activer l'EV (CF notice fabriquant)
short delayFlowMetre = 1000;        // (ms) tempo de mise en route du flot et donc du débimètre
//************************************
volatile unsigned int ticsCount = 0;
short pulseCount = 0;
uint32_t oldPulseCount = 0;
double flow = 0;
double vol=0;
double oldflow = 0;
double oldvolume =0;
MyMessage cmdMsg(CHILD_ID_EV_Cmd, V_STATUS);
MyMessage flowMsg(CHILD_ID_FLOW, V_FLOW);
MyMessage volMsg(CHILD_ID_VOLUME, V_VOLUME);
MyMessage errorEVMsg(CHILD_ID_EV_Status, V_TRIPPED);

class electrovanne {
  private:
    byte Open_Pin;
    byte Close_Pin;
  public:
    bool position;
    electrovanne (byte O_pin, byte C_pin){ // constructeur
      Open_Pin = O_pin;
      Close_Pin = C_pin;
      init();    
    }
    void init() {
      pinMode(Open_Pin, OUTPUT);
      pinMode(Close_Pin, OUTPUT); 
      off ();    
    }
    void open(){
      digitalWrite(Close_Pin, LOW);
      digitalWrite(Open_Pin, HIGH);
    }
    void close() {
      digitalWrite(Open_Pin, LOW);
      digitalWrite(Close_Pin, HIGH);  
    }
    void off() {
      digitalWrite(Close_Pin, LOW);
      digitalWrite(Open_Pin, LOW);      
    }    
};

class debimetre {
  private: 
    byte inputPin;
  public:
    bool actif = false;
    double volume = 0;
    double flow = 0;
    debimetre(byte I_pin) {                 // constructeur
      inputPin =  I_pin;
      init();
    }
  void init () {
    pinMode (inputPin, INPUT);
  }
}; 

debimetre myDebimetre(DIGITAL_INPUT_SENSOR);          // Instanciation du débimètre
electrovanne myElectrovanne(Open_PIN,Close_PIN);      // Instanciation de l'electrovanne

void setup(){
  pinMode(DIGITAL_INPUT_SENSOR, INPUT_PULLUP); // pour etre certain de détecter un  front descendant
  pulseCount = oldPulseCount = 0;
  attachInterrupt(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), isr, FALLING);
  Serial.begin(115200);  
}

void presentation(){
    sendSketchInfo("Arrosage", "1.0");// Send the sketch version information to the gateway and Controller
    present(CHILD_ID_EV_Cmd, S_BINARY);
    present(CHILD_ID_EV_Status, S_DOOR);  
    present (CHILD_ID_FLOW, S_WATER);
    present(CHILD_ID_VOLUME,S_WATER);
}

//*************************************
void loop()
{
  pulseCount = ticsCount;                         // sauvegarde et raz du compteur d'impulsions
  ticsCount = 0;
  vol = pulseCount/ppl;                           // débit par seconde
  flow = vol*60;                                  // débit en litres.minute   
  if (flow != oldflow) oldflow = flow;            // calcul du débit instantané (en cas de besoin ultérieur)
  if (pulseCount != 0) {                          // En cas de mesure...
    oldPulseCount = oldPulseCount + pulseCount;
    myDebimetre.volume = ((double)oldPulseCount/((double)ppl));    
    pulseCount=0; 
    myDebimetre.actif = true;   
//    Serial.println ("OUVERT");     
    } 
    else { 
      myDebimetre.actif = false;
//      Serial.println ("FERME");  
    } 
    delay(1000);                                    // une mesure par seconde                                                                          
}
//*************************************
//*************************************
void isr()
{
  ticsCount++;
}
//*************************************
//*************************************
void receive(const MyMessage &message)
{
    if (message.getType()==V_STATUS) {                // vérification du type de msg
      if (message.getBool()== true) {                 // Ordre d'ouverture
          for (int i=1; i <= nbTentatives; i++) {     // tentatives...
          myElectrovanne.off();                       // TODO (ligne pour test sur table à supprimer)
          myElectrovanne.open();                      // envoi d'un pulse de 50ms
//        Serial.println ("ouverture EV "); 
//        wait (dureePulseEV);                        // TODO(mis en rem pour test sur table)
//          myElectrovanne.off();
            wait (delayFlowMetre);                    // attente pleine ouverture
            if (myDebimetre.actif == false){          // si pas bien ouverte...
              send(errorEVMsg.set(1));                // Panne electrovanne
//              Serial.println ("La vanne ne s'est pas ouverte ");
            }  
            else{  
              send(errorEVMsg.set(0));                // Electrovanne OK
//              Serial.println ("La vanne s'est bien ouverte ");
              break;
            }
             
          }
        }
        else {                                        // Orde de fermeture
          for (int i=1; i <= nbTentatives; i++) {     // tentatives
            myElectrovanne.off();                     // TODO LIGNE TEST  A SUPPRIMER (ou mettre en rem)
            myElectrovanne.close();                   // envoi d'un pulse de 50ms
//           Serial.println ("fermeture EV "); 
//          wait (dureePulseEV);                      // TODO 
//          myElectrovanne.off(); 
            wait (delayFlowMetre);                                // attente pleine ouverture
            if (myDebimetre.actif == true) {           // si pas bien fermée
              send(errorEVMsg.set(1));                 // En voie d'une alerte Panne electrovanne
              Serial.println ("La vanne ne s'est pas fermée ");
            }
            else{
//             Serial.println (myDebimetre.volume); 
              send(volMsg.set(myDebimetre.volume,1));
              send(errorEVMsg.set(0));                 // Electrovanne OK
//             Serial.println ("La vanne s'est bien fermée ");
              myDebimetre.volume=0;                    // RAZ du volumed'eau qui est passé durant la période ouverte
              myDebimetre.flow=0;                      // RAZ du débit
              break;
            }
          } 
          // TODO sleep(.....)        // faire dormir le node et envoyer un hartbeat au réveil...                         
        }
    }
}
Dernière modification par Gilles BILLARD le 06 mai 2021, 11:37, modifié 2 fois.
Gilles BILLARD
Messages : 75
Inscription : 09 oct. 2017, 09:34
Localisation : 45km sud Paris

Re: Electrovanne bi-stable et contrôle du bon fonctionnement

Message par Gilles BILLARD »

ca y est, j'ai trouvé;
hormis le doublon dans la présentation, vous ne pouviez pas m'aider avec ce que j'ai écrit; J'ai juste oublié de mettre les déclarations et c'est là que se situait le pb ;
J'avais:

Code : Tout sélectionner

#define CHILD_ID_EV_Statut 0        // statut de l'Electro-Vanne
#define CHILD_ID_FLOW 2             // débit
#define CHILD_ID_VOLUME 3           // volume
J'ai mis:

Code : Tout sélectionner

#define CHILD_ID_EV_Statut 1        // statut de l'Electro-Vanne
#define CHILD_ID_FLOW 2             // débit
#define CHILD_ID_VOLUME 3           // volume
Le 0 étant pris, je suppose par le canal de réception... (a confirmer)
Gilles BILLARD
Messages : 75
Inscription : 09 oct. 2017, 09:34
Localisation : 45km sud Paris

Re: Electrovanne bi-stable et contrôle du bon fonctionnement

Message par Gilles BILLARD »

Deuxième problème:
Comme je veux que les dispositifs soient auto alimentés (panneau solaire+ accu), il me faut mettre en sommeil l'électronique;
Mais, dès lors, le node n'est plus accessible depuis la centrale car, si j'ai bien lu(est-ce bien le cas?), il n'est pas possible de réveiller un node qui "dors";
Alors j'ai pensé envoyer un hardbeat au controleur a chaque réveil et si un ordre d'ouverture est pendant alors l'ordre est envoyé durant la période d'activité du node que je peux faire durer le temps d'etre certain de pouvoir recevoir un ordre potentiel...
Est-ce jouable ainsi ?
PS:J'ai recu mes H-bridges; Je vais pouvoir faire des essais sur table...
boum
Messages : 233
Inscription : 18 janv. 2019, 11:34
Localisation : France

Re: Electrovanne bi-stable et contrôle du bon fonctionnement

Message par boum »

Pour le bug, c'est pour ça qu'il est conseillé de fournir le schéma en entier (pareil pour les scripts domoticz). Le child ID 0 n'est pas réservé, le 255 oui. Il y a peut-être une variable non initialisée qq part.

Pour le sommeil des dispositifs, la philosophie de mySensors est d'avoir tous les actionneurs réveillés en permanence pour pourvoir recevoir les messages de la passerelle. Les capteurs peuvent dormir.

Un moyen de contourner cela est bien de réveiller périodiquement le nœud. Mais plutôt que d'attendre un certain temps un hypothétique message, il est possible de demander une donnée à un autre nœud (dont la passerelle).

https://www.mysensors.org/download/sens ... sting-data
Quand la vanne se réveille (périodiquement ou changement d'état), elle envoie un request(), attend 1s (ou moins) le temps de recevoir la donnée dans le receive().

Il faut que la passerelle ou un autre nœud alimenté en permanence puisse gérer cette demande, par exemple en stockant le dernier ordre envoyé par le controleur à la passerelle.
Domoticz v2022.2 sur linux-mint / Z-Wave-JS / RFXCom / Zigbee2MQTT
Gilles BILLARD
Messages : 75
Inscription : 09 oct. 2017, 09:34
Localisation : 45km sud Paris

Re: Electrovanne bi-stable et contrôle du bon fonctionnement

Message par Gilles BILLARD »

Merci Boum, tu confirmes donc que je suis sur la bonne piste pour atteindre mon objectif; Comme je sais pas comment faire pour demander a la Gateway de stocker un ordre jusqu'au réveil du noeud, je vais creuser le sujet et revenir ici si je ne trouve pas tout seul;
Pour ce qui est du sketch en entier, je ne voulais tout simplement pas encombrer le serveur avec trop de contenu dans chaque post; Mais voila mon sketch (fortement commenté pour que je m'y retrouve car j'ai peu de mémoire a court terme).
***********
VOIR EN TOUTE FIN DU 1er POST DE CE FIL DE DISCUSSION
***********
A ce stade, l'ensemble fonctionne comme je le souhaite, mais je constate un comportement normal mais inopportun: Depuis le panneau de contrôle des "Switches" dans Domoticz, si, par erreur je clique sur l'indicateur de panne d'électrovanne, Domoticz envoie un ordre qui est reçu par le noeud comme s'il s'agissait d'une commande de vanne d'arrosage; Existe-t-il un moyen d'empêcher ca ?
Image
Dernière modification par Gilles BILLARD le 06 mai 2021, 11:41, modifié 1 fois.
boum
Messages : 233
Inscription : 18 janv. 2019, 11:34
Localisation : France

Re: Electrovanne bi-stable et contrôle du bon fonctionnement

Message par boum »

Gilles BILLARD a écrit : Depuis le panneau de contrôle des "Switches" dans Domoticz, si, par erreur je clique sur l'indicateur de panne d'électrovanne, Domoticz envoie un ordre qui est reçu par le noeud comme s'il s'agissait d'une commande de vanne d'arrosage; Existe-t-il un moyen d'empêcher ca ?
Oui, de plusieurs manières 8-)
  • du côté Domoticz, en modifiant l'interrupteur. Changer son type en Contact ou Door contact et il devient lecture seul, on ne peut plus cliquer dessus.
  • dans le schéma. La fonction receive() traite tous les messages de type V_STATUS comme une commande. Tu peux remplacer le if (message.getType()==V_STATUS) par un if ((message.getSensor()==CHILD_ID_EV_Cmd) && (message.getType()==V_STATUS)) pour déterminer quel est la cible du message et ignorer si le contrôleur envoie un message sur le statut.
Domoticz v2022.2 sur linux-mint / Z-Wave-JS / RFXCom / Zigbee2MQTT
boum
Messages : 233
Inscription : 18 janv. 2019, 11:34
Localisation : France

Re: Electrovanne bi-stable et contrôle du bon fonctionnement

Message par boum »

(et pour ce qui est d'encombrer le serveur, le schéma fait 8Ko alors que la capture fait 42Ko :lol:. Une paille. Au pire, plutôt que d'envoyer la totalité du fichier texte à chaque fois, tu peux le mettre dans le premier message et l'éditer à chaque nouvelle version. L'idéal étant un dépôt Git pour sauvegarder et partager des sources.)
Gilles BILLARD
Messages : 75
Inscription : 09 oct. 2017, 09:34
Localisation : 45km sud Paris

Re: Electrovanne bi-stable et contrôle du bon fonctionnement

Message par Gilles BILLARD »

Dépot GIT, houla, tu me causes en chinois ;-)
Pour la solution, c'est du coté de la seconde proposition que je cherchais sans trouver; Je voulais mettre un "&&" sans trop savoir comment; Rien trouvé ICI... ou est donc la doc traitant de "message.getSensor()" ?
Merci pour l'astuce ainsi que pour celle de l'indicateur coté Domoticz
Je vais donc mettre ceinture ET bretelles en implémentant les deux.
boum
Messages : 233
Inscription : 18 janv. 2019, 11:34
Localisation : France

Re: Electrovanne bi-stable et contrôle du bon fonctionnement

Message par boum »

Gilles BILLARD a écrit : Dépot GIT, houla, tu me causes en chinois ;-)
Git est un gestionnaire de sources comme il en existe beaucoup (CVS, subversion, mercurial, perforce…). Celui-ci a gagné en visibilité car il était utilisé à l'origine pour archiver les sources du noyau Linux.

Un gestionnaire de sources (SCM — source control management) permet de garder l'historique de tous les changements. Un peu comme Time machine sur Mac, mais spécialisé pour les fichiers textes.

Ça ne semble pas très utile pour les programmeurs du dimanche (pas au sens péjoratif, mais plutôt en terme de quantité de production). Mais on se rend vite compte de l'intérêt quand dans le répertoire il y a 20 fichiers avec des noms à la script_01_dernier_essai_3_test.lua :lol:

On peut aussi les utiliser pour stocker les fichiers de configuration (j'ai commencé par ça).

Github est un portail pour les dépôts git. Ce qui permet d'avoir en plus une sauvegarde distante. Les dépôts peuvent être privés, mais c'est comme tout, il faut éviter d'y stocker des données sensibles. Pour le partage, c'est pratique, on peut donner des liens vers des fichiers:
https://github.com/mysensors/MySensors/ ... tuator.ino
Gilles BILLARD a écrit : Pour la solution, c'est du coté de la seconde proposition que je cherchais sans trouver; Je voulais mettre un "&&" sans trop savoir comment; Rien trouvé ICI... ou est donc la doc traitant de "message.getSensor()" ?
C'est vrai que la documentation est fragmentaire dès qu'on sort un peu des clous. Ça parle de setSensor() — sans vraiment expliquer son usage — mais pas de sa contre-partie getSensor().

La doc complète est là :
https://www.mysensors.org/apidocs/classMyMessage.html

Mais elle est générée à partir des sources. Donc le plus simple est de chercher directement dans les fichiers en-tête de MySensors :
https://github.com/mysensors/MySensors/ ... age.h#L531
Domoticz v2022.2 sur linux-mint / Z-Wave-JS / RFXCom / Zigbee2MQTT
Gilles BILLARD
Messages : 75
Inscription : 09 oct. 2017, 09:34
Localisation : 45km sud Paris

Re: Electrovanne bi-stable et contrôle du bon fonctionnement

Message par Gilles BILLARD »

Mais c'est bien sur !!!
J'étais déjà allé fouiner dans le source MyMessage.h pour comprendre un truc (je ne sais plus lequel);
***********
J'ai donc fait comme recommandé ci-dessus et mis le sketch dès la fin du 1 post après l'avoir mis a jour.
J'en ai profité pour changer également l'instance errorEVMsg pour qu'elle envoie un V_TRIPPED qui est plus causant qu'un V_STATUS.
Pour info, c'est OK dans le control Panel Domoticz, l'alarme n'est plus "clickable"
Répondre