Arduino & Domoticz
Re: Arduino & Domoticz
mon Raspberry avec Sata SSD 500 Gb
-
Flying Domotic
- Messages : 772
- Inscription : 10 mars 2020, 15:26
Re: Arduino & Domoticz
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 ?
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
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
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
Nos réponses se sont croisées ...
Une tentative pour n'envoyer qu'une seule fois le message :
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);
}
Re: Arduino & Domoticz
Merci Flying
ça fonctionne, cela me permet de comprendre une autre solution de programmation
Merci de cette aide
ça fonctionne, cela me permet de comprendre une autre solution de programmation
Merci de cette aide
Re: Arduino & Domoticz
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
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) Merci de votre aide
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 )"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) Merci de votre aide
Re: Arduino & Domoticz
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
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
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Re: Arduino & Domoticz
Bonsoir Keros
Je patine.......
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 mailRegarde la documentation DzVents
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éroulantedevice.text, device.value
Je patine.......
Re: Arduino & Domoticz
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
Ci dessous les infos dans les logs avec le " T "
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 )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 TRe: Arduino & Domoticz
La documentation DzVents pour un widget text indique deux arguments possibles :
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.
Si device est la variable correspondant à ton widget, alors :
- text: String
- updateText(text): Function*. Supports command options.
- device.text contient le texte du widget
- updateText("Mon texte") permettra de mettre à jour le widget avec "Mon texte"
- 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
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
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Re: Arduino & Domoticz
Merci Keros pour toutes ces précisions qui me font comprendre les possibilités de programmation d'un script