volume eau de pluie récupérée

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
gawel3164
Messages : 325
Inscription : 07 janv. 2016, 19:51

volume eau de pluie récupérée

Message par gawel3164 »

Salut,
l'apprentissage du lua me demandera encore un peu de temps visiblement.... :D
Je récupère l'eau de pluie dans une cuve et je souhaiterais connaitre le volume d'eau récupéré quotidiennement et aussi le cumul. Un capteur ultrason (mysensors) mesure la hauteur d'eau dans la cuve. Mon script devrait mesurer les hauteurs d'eau entre deux arrosages et en déduire le volume. Mais j'ai l'erreur suivante: Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_time_recup_eau.lua: /home/pi/domoticz/scripts/lua/script_time_recup_eau.lua:33: attempt to perform arithmetic on global 'depth' (a nil value)
Le problème est au niveau de la récupération des deux hauteurs d'eau permettant de calculer le volume...mais je ne sais pas comment écrire autrement ces lignes.
Une âme charitable pourrait me donner un conseil svp???

Code : Tout sélectionner

-- Input devices: 

depth_sensor = 'Hauteur eau cuve arrosage'
 
-- Output devices: volume.

volume_sensor = 'compteur 1'
volume_sensor_id = 118
 
-- Tank dimensions
tank_height = 120
tank_area = 40 * 40
 
-----------------------------------------------------------------------------------
commandArray = {}
time = os.date("*t")

--condition d'heure : peu APRES l'arrosage de fin de journée

if (time.hour % 6 ==0 and time.min == 48) then
   depth = otherdevices_svalues[depth_sensor]
end

--condition d'heure : peu AVANT le nouvel arrosage

if (time.hour % 7 ==0 and time.min == 00) then
   depth2 = otherdevices_svalues[depth_sensor]

 
-- Calcul du volume d'eau récupéré
      volume = (depth2 - depth) * tank_area / 1000
 
  
-- Mise a jour du compteur  
      commandArray[2] = {['UpdateDevice'] = volume_sensor_id .. "|0|" .. volume}

end
 
return commandArray
Dernière modification par gawel3164 le 08 juil. 2016, 10:51, modifié 2 fois.
Domoticz 2022.1/RFlink V1.1_R48/ prises: DIO, SCS/caméras IP/station météo Auriol/sondes Oregon/PIR/ZK1PA/Relevé compteur Gaz/téléinfo EDF/Mysensors:RGB-3D,Temp.,IR/Arrosage autonome/Google home/ ESP: IR,Temp.,relai,distance,OLED/Withings Ws30
ganq
Messages : 385
Inscription : 01 avr. 2015, 14:20

Re: volume eau de pluie récupérée

Message par ganq »

Un petit print (depth) permettrait de savoir ce que contient cette variable avant le calcul... Elle ne serait pas vide, par hasard...
domoticien amateur option bidouille
jackslayter
Messages : 1040
Inscription : 30 sept. 2014, 14:40
Localisation : Isère (38)

Re: volume eau de pluie récupérée

Message par jackslayter »

essaye un tonumber(volume)
Raspberry Pi + RFLink + Domoticz Beta
Oregon - 3x Thgr122Nx / Chacon - micromodule 200w, télécommande 3b et 16b, 2x module 1000w, détecteur de fumée, contact de porte, 2x prise 3500w / OWL - CM180 / TRC02 v2 RGB 3M / Cheap - PIR, contact de porte
gawel3164
Messages : 325
Inscription : 07 janv. 2016, 19:51

Re: volume eau de pluie récupérée

Message par gawel3164 »

effectivement....
Si je fais un print(depth) juste après la lecture de la distance j'ai la valeur de depth (2016-06-10 08:18:00.341 LUA: 27.0), mais si je mets print(depth) , print(depth2) et print(tank_area) juste avant le calcul du volume, je n'obtiens les valeurs que de depth2 (2016-06-10 08:19:00.513 LUA: 13.0) et tank_area (2016-06-10 08:19:00.513 LUA: 1600). La valeur de depth s'est evaporée.
Domoticz 2022.1/RFlink V1.1_R48/ prises: DIO, SCS/caméras IP/station météo Auriol/sondes Oregon/PIR/ZK1PA/Relevé compteur Gaz/téléinfo EDF/Mysensors:RGB-3D,Temp.,IR/Arrosage autonome/Google home/ ESP: IR,Temp.,relai,distance,OLED/Withings Ws30
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: volume eau de pluie récupérée

Message par vil1driver »

Salut,


Si tu veux mémoriser une valeur pour la réutiliser plus tard dans ton script tu dois la stocker dans une variable utilisateur.

C'est normal de ne pas retrouver deph car la condition n'est pas vrai au moment où celle pour deph2 est vrai

Mais même si les 2 conditions s'exécutaient,
dans ton script deph = deph2 donc la différence serait nulle
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
ganq
Messages : 385
Inscription : 01 avr. 2015, 14:20

Re: volume eau de pluie récupérée

Message par ganq »

Bien vu, je n'avais pas assez lu le script !
domoticien amateur option bidouille
gawel3164
Messages : 325
Inscription : 07 janv. 2016, 19:51

Re: volume eau de pluie récupérée

Message par gawel3164 »

Merci! Je vais donc aller potasser un nouveau chapitre: les variables utilisateur! :D ;)
Domoticz 2022.1/RFlink V1.1_R48/ prises: DIO, SCS/caméras IP/station météo Auriol/sondes Oregon/PIR/ZK1PA/Relevé compteur Gaz/téléinfo EDF/Mysensors:RGB-3D,Temp.,IR/Arrosage autonome/Google home/ ESP: IR,Temp.,relai,distance,OLED/Withings Ws30
jackslayter
Messages : 1040
Inscription : 30 sept. 2014, 14:40
Localisation : Isère (38)

Re: volume eau de pluie récupérée

Message par jackslayter »

récupérer la variable

Code : Tout sélectionner

local hauteur_actuelle = uservariables["nom_de_la_variable_dans_Dz"]
ou

Code : Tout sélectionner

uservariables["nom_de_la_variable"]
mettre à jour la variable

Code : Tout sélectionner

commandArray['Variable:nom_de_la_variable']= (hauteur_actuelle + pluie)
ou

Code : Tout sélectionner

commandArray[1] = { ['Variable:nom_de_la_variable'] = (hauteur_actuelle + pluie) }
ou en bash
récupérer la variable

Code : Tout sélectionner

hauteur_actuelle=$(curl "http://192.168.0.3:8080/json.htm?type=command&param=getuservariable&idx=NUM")
mettre à jour la variable

Code : Tout sélectionner

curl "http://192.168.0.3:8083/json.htm?type=command&param=updateuservariable&idx=NUM&vname=nom_de_la_variable_dans_Dz&vtype=2&vvalue="($hauteur_actuelle + $pluie)
Raspberry Pi + RFLink + Domoticz Beta
Oregon - 3x Thgr122Nx / Chacon - micromodule 200w, télécommande 3b et 16b, 2x module 1000w, détecteur de fumée, contact de porte, 2x prise 3500w / OWL - CM180 / TRC02 v2 RGB 3M / Cheap - PIR, contact de porte
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: volume eau de pluie récupérée

Message par vil1driver »

petit complément,

on stocke toujours une chaîne dans une variable (quelque soit son type) donc il faut faire la conversion au besoin
donc comme ceci plutôt

Code : Tout sélectionner

commandArray['Variable:nom_de_la_variable'] = tostring( hauteur_actuelle + pluie )
une variable utilisateur est toujours récupérée sous forme de chaîne (quelque soit son type) donc pas de calcule direct possible
donc pour obtenir la valeur numérique tu peux faire comme ceci

Code : Tout sélectionner

local hauteur_actuelle = tonumber( uservariables["nom_de_la_variable_dans_Dz"] )
au sujet du type c'est du formatage,
exemple, si je veux stocker 2.5 dans une variable de type entier, elle ne va finalement contenir que 2
donc à moins d'avoir explicitement besoin de ce comportement, perso toutes mes variables sont de type chaîne
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
gawel3164
Messages : 325
Inscription : 07 janv. 2016, 19:51

Re: volume eau de pluie récupérée

Message par gawel3164 »

Merci à tous pour toutes ces indications qui font progresser les débutants!
Désolé Vil1driver, je n'avais pas vu ton dernier post et j'ai "bricolé" un stockage et une récupération de la variable utilisateur...mais ça fonctionne. Promis, je vais peaufiner et faire ça dans les règles de l'art! :lol: ;) .
En attendant, je partage le script qui fonctionne. J'y reviendrai surement car j'aurais souhaité avoir sur le même compteur, la valeur d'eau accumulée par jour et le global d'accumulation depuis la mise en place du compteur.....mais je n'ai que des problèmes avec mes compteurs donc on verra plus tard. :lol: Faut déjà que je règle mon compteur gaz qui compte le global mais pas le journalier.... :evil:

Code : Tout sélectionner

--Ce script permet de calculer et d'afficher sur un compteur, le volume quotidien d'eau de pluie emmagasiné dans une cuve 
--Pour utiliser ce script, il faut:
     -- un capteur de distance qui mesure la distance entre le haut de la cuve et l'eau (ici nommé: Hauteur eau cuve arrosage). Voir Mysensors :https://www.mysensors.org/build/distance
     -- un compteur d'eau de type compteur incrémental(ici nommé: Gain Eau pluie cuve       /jour). NB: mettez en concordance l'ID de votre compteur ligne 17
     -- modifiez les dimensions de la base de votre cuve (longueur et largeur) ligne 20
     -- modifiez les heures de prise de mesure des deux hauteurs d'eau qui vont permettre de calculer le volume d'eau emmagasiné. Les deux valeurs devront impérativement être prise ENTRE DEUX ARROSAGES pour ne pas fausser les mesures. lignes 28 et 38
     -- créer une variable utilisateur nommée depth qui permettra de stocker une des deux hauteur d'eau nécessaire au calcul


-- Input devices: 

depth_sensor = 'Hauteur eau cuve arrosage'
 
-- Output devices: volume.

volume_sensor = 'Gain Eau pluie cuve       /jour'
volume_sensor_id = 123
 
-- Tank dimensions
tank_area = 40 * 40
 
-----------------------------------------------------------------------------------
commandArray = {}
time = os.date("*t")

--condition d'heure : peu APRES l'arrosage de fin de journée (ici arrosage à minuit)

if (time.hour ==0 and time.min == 15) then
depth = otherdevices_svalues[depth_sensor]
print(depth)

--stockage dans une variable utilisateur appelée aussi depth
commandArray['Variable:depth']= (depth)
end

--condition d'heure : peu AVANT le nouvel arrosage

if (time.hour ==23 and time.min == 45) then
--rappel de la valeur de la variable utilisateur depth
depth=uservariables["depth"]
depth2 = otherdevices_svalues[depth_sensor]
print(depth)
print(depth2)
print(tank_area) 

-- Calcul du volume d'eau récupéré
      volume = (depth - depth2) * tank_area / 1000
 
  
-- Mise a jour du compteur  
      commandArray[2] = {['UpdateDevice'] = volume_sensor_id .. "|0|" .. volume}

end
 
return commandArray
Domoticz 2022.1/RFlink V1.1_R48/ prises: DIO, SCS/caméras IP/station météo Auriol/sondes Oregon/PIR/ZK1PA/Relevé compteur Gaz/téléinfo EDF/Mysensors:RGB-3D,Temp.,IR/Arrosage autonome/Google home/ ESP: IR,Temp.,relai,distance,OLED/Withings Ws30
Répondre