Re: Arduino & Domoticz
Publié : 04 mars 2024, 22:21
mon Raspberry avec Sata SSD 500 Gb
Reprenez le contrôle de votre domotique
https://easydomoticz.com/forum/
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);
}
Code : Tout sélectionner
domoticz.notify('Fuite Zone ' .. device.name .. ' was template', domoticz.LOG_INFO )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
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 TSi device est la variable correspondant à ton widget, alors :
- text: String
- updateText(text): Function*. Supports command options.