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 <\>.
Salut,
j'ai un problème de syntaxe....
Les valeurs de mon capteur de distance oscillent de 1cm par moment. Du coup le script calcule qu'on a récupéré de l'eau même s'il n'a pas plu...
Je voudrais donc inclure la condition de ne faire le calcul que s'il a plu.
J'ai donc relevé la valeur de la pluie du jour et j'ai essayé de le mettre en condition mais j'ai une erreur:
2016-07-08 07:55:00.563 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_time_recup_eau.lua: /home/pi/domoticz/scripts/lua/script_time_recup_eau.lua:30: attempt to compare number with nil
--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")
pluiedujour = otherdevices_svalues['Pluie']
print(pluiedujour)
--condition d'heure : peu APRES l'arrosage de fin de journée (ici arrosage à 21h)
if (time.hour ==7 and time.min == 55 and (tonumber(pluiedujour)) > 0) 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 ==20 and time.min == 55) 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)*2 --j'ai deux cuves en vase communiquant donc il faut multiplier par deux
-- Mise a jour du compteur
commandArray[2] = {['UpdateDevice'] = volume_sensor_id .. "|0|" .. volume}
end
quand je fais un print(pluiedujour) j'obtiens deux valeurs:
Si un pro du code pouvait me donner un coup de main svp!
C'est aussi très bien expliqué sur le site mysensors lui même et c'est assez simple a réaliser. tu as même des liens pour commander le matériel adéquat. https://www.mysensors.org/
N'hésite pas a poser des questions en cas de doutes ou difficultés.
Merci de ta réponse.
Je connais déjà tout cela et utilise la passerelle my sensor
Quand j'avais testé l'année dernière chez moi ça ne fonctionnait pas. Mais je vais reprendre ton code et voir si j'arrive à quelque chose
j'ai mis a jour le code puisque tout ne fonctionnait pas correctement:
- mise en place d'un compteur avec index (cumul comme sur un vrai compteur d'eau) + volume quotidien emmagasiné
- prise en compte de l'instabilité du capteur ultrason (oscillation de la mesure: 1cm d'erreur par moment). On ne fait le calcul de gain de volume que quand on est sur qu'il a plu (weatherunderground). Si le volume du gain est négatif, on garde l'index déjà existant.
--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 20
-- modifiez les dimensions de la base de votre cuve (longueur et largeur) ligne 23
-- 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 44 et 55
-- créer une variable utilisateur nommée depth qui permettra de stocker une des deux hauteur d'eau nécessaire au calcul
-- créer une varibale utilisateur nommée index_eau_pluie et la mettre à zéro dans un premier temps. Indiquer le volume déjà emmagasiné si vous le connaissez. L'index du compteur indiquera cette valeur
--le calcul du volume n'est effectué que s'il a plu (weatherunderground) car le capteur ultrason oscille et on pourrait avoir un gain même s'il n'a pas plu
--si le volume est négatif (fuite ou évaporation) le volume est forcé à zéro.
-- 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 = {}
function split(source, delimiters)
local elements = {}
local pattern = '([^'..delimiters..']+)'
string.gsub(source, pattern, function(value) elements[#elements + 1] = value; end);
return elements
end
time = os.date("*t")
pluiedujour = otherdevices_svalues['Pluie']; --récupération du cumul de pluie du jour auprès de la station météo
local result = split(pluiedujour, ';') ; --séparation des deux valeurs
pluiedujour = tonumber(result[2]); --on récupère la deuxième valeur des deux valeurs envoyées par la station météo. Elle a le format 0.0 en millimètres
--condition d'heure : peu APRES l'arrosage de fin de journée (ici arrosage à 21h)
if ((time.hour ==21) and (time.min == 30) ) 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 ==20) and (time.min == 55) and (tonumber(pluiedujour)) >=1)then --on n'effectue le calcul que s'il est l'heure et qu'il a plu (sinon les variations du capteur ultrason influent sur la mesure)
depth=uservariables["depth"] --rappel de la valeur de la variable utilisateur depth
depth2 = otherdevices_svalues[depth_sensor]
print(depth)
print(depth2)
print(tank_area)
index_eau_pluie=otherdevices_svalues['Gain Eau pluie cuve /jour'] -- stockage de l'index du compteur
commandArray['Variable:index_eau_pluie']=tostring(index_eau_pluie)
-- Calcul du volume d'eau récupéré
volume = ((depth - depth2) * tank_area / 1000)*2 --j'ai deux cuves en vase communiquant donc il faut multiplier par deux
print(volume)
if (volume<0) then -- si évaporation ou fuite, on peut avoir un volume inférieur à zéro qui serait comptabilisé positivement
volume=0 --si le volume est négatif, on le force à zéro
index_eau_pluie=tonumber(uservariables["index_eau_pluie"]) + (tonumber(volume))
commandArray['Variable:index_eau_pluie']= tostring(index_eau_pluie) --mise a jour de l'index dans la variable utilisateur
-- Mise a jour du compteur
commandArray[2] = {['UpdateDevice'] = volume_sensor_id .. "|0|" .. index_eau_pluie}
end
index_eau_pluie=tonumber(uservariables["index_eau_pluie"]) + (tonumber(volume)) --si le volume n'est pas négatif, calcul du nouvel index avec le volume calculé
print(index_eau_pluie)
commandArray['Variable:index_eau_pluie']= tostring(index_eau_pluie) --mise a jour de l'index dans la variable utilisateur
-- Mise a jour du compteur
commandArray[2] = {['UpdateDevice'] = volume_sensor_id .. "|0|" .. index_eau_pluie}
end
return commandArray