Page 1 sur 2
volume eau de pluie récupérée
Publié : 10 juin 2016, 07:00
par gawel3164
Salut,
l'apprentissage du lua me demandera encore un peu de temps visiblement....
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
Re: volume eau de pluie récupérée
Publié : 10 juin 2016, 07:27
par ganq
Un petit print (depth) permettrait de savoir ce que contient cette variable avant le calcul... Elle ne serait pas vide, par hasard...
Re: volume eau de pluie récupérée
Publié : 10 juin 2016, 08:12
par jackslayter
essaye un tonumber(volume)
Re: volume eau de pluie récupérée
Publié : 10 juin 2016, 08:16
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.
Re: volume eau de pluie récupérée
Publié : 10 juin 2016, 10:41
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
Re: volume eau de pluie récupérée
Publié : 10 juin 2016, 10:48
par ganq
Bien vu, je n'avais pas assez lu le script !
Re: volume eau de pluie récupérée
Publié : 10 juin 2016, 10:52
par gawel3164
Merci! Je vais donc aller potasser un nouveau chapitre: les variables utilisateur!

Re: volume eau de pluie récupérée
Publié : 10 juin 2016, 11:06
par jackslayter
récupérer la variable
Code : Tout sélectionner
local hauteur_actuelle = uservariables["nom_de_la_variable_dans_Dz"]
ou
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¶m=getuservariable&idx=NUM")
mettre à jour la variable
Code : Tout sélectionner
curl "http://192.168.0.3:8083/json.htm?type=command¶m=updateuservariable&idx=NUM&vname=nom_de_la_variable_dans_Dz&vtype=2&vvalue="($hauteur_actuelle + $pluie)
Re: volume eau de pluie récupérée
Publié : 10 juin 2016, 11:13
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
Re: volume eau de pluie récupérée
Publié : 12 juin 2016, 08:29
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!

.
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.

Faut déjà que je règle mon compteur gaz qui compte le global mais pas le journalier....
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