Page 2 sur 2

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

Publié : 08 juil. 2016, 08:00
par gawel3164
Salut,
j'ai un problème de syntaxe.... :oops:
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:

Code : Tout sélectionner

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
voici le script:

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")
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:
Image

Si un pro du code pouvait me donner un coup de main svp! ;)

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

Publié : 08 juil. 2016, 13:19
par gawel3164
j'ai trouvé

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

Publié : 10 juil. 2016, 08:10
par jacques68
Salut

J'ai l'intention de faire la meme chose que toi. Pourrais tu faire un tutos sur le branchement et l'implantation de my sensor dans Domoticz?

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

Publié : 10 juil. 2016, 09:40
par gawel3164
Salut Jacques,
Je n'ai rien contre faire un tuto, mais ça à déjà été très bien fait ici:
- http://easydomoticz.com/mysensors-et-domoticz/
- http://easydomoticz.com/domoticz-raspbe ... -partie-1/
- http://easydomoticz.com/domoticz-arduin ... asserelle/
-http://easydomoticz.com/domoticz-arduin ... -capteurs/

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.

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

Publié : 18 juil. 2016, 18:04
par jacques68
Merci de ta réponse.
Je connais déjà tout cela et utilise la passerelle my sensor :D
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

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

Publié : 20 juil. 2016, 16:05
par gawel3164
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.

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