Domotique Piscine
Re: RE: Re: Domotique Piscine
Edit : suppression du doublon
Dernière modification par aleph0 le 06 oct. 2017, 20:09, modifié 1 fois.
Re: RE: Re: Domotique Piscine
Elle est curieuse la ligne if (val_Tair ... que tu as posté dans le script complet ?! Tu peux nous confirmer que tu as lz ligne complète dans ton script ?le belge a écrit :Bonjour/bonsoir ,
le script à bien fonctionné cet été , mais la depuis que les T° sont basse (eau de la piscine à 11.12°) , j'ai une erreur :
la ligne en questionCode : Tout sélectionner
2017-10-06 19:16:00.155 Error: EventSystem: in gestion piscine: [string "--[[ Script de gestion de la piscine ..."]:257: attempt to compare nil with numberle script complet :Code : Tout sélectionner
if (val_TAir <= 1) and val_PpeFl == "Off" then
MikeCode : Tout sélectionner
--[[ Script de gestion de la piscine Fonctions : 1. Gestion de la filtration 1.1 Calculer la durée et la période optimale de filtration 1.2 Démarrer / arrêter la filtration Si température eau > 12°C, selon planning calculé au dessus Sinon, marche si température air <1°C, arrêt si >2°C 1/ Les devices : - dev_Tair et dev_Teau de type thermomètres, ras - dev_PpeFl : le switch qui commande la pompe de filtration , de type On/Off - dev_ModeFl : un interrupteur selecteur pour le mode de filtration. Doit contenir 4 niveaux : * Off (Caché) * Manu (Level 10) Dans ce mode, le script fait seulement les calculs de durée et de début, mais ne gère pas la pompe * Auto HC (Level 20) pour filtration en heures creuses * Auto HP (Level 30) pour filtration en journée - dev_HC : Un switch on/off avec planning pour indiquer les heures pleines ou creuses (On=HC, Off=HP) - dev_cptFl : Un P1 smart counter pour comptabiliser la consommation électrique de la pompe Le script a été conçu pour qu'on puisse à tout moment prendre la pompe en manuel (pour passer l'aspirateur, nettoyer les filtres, etc) et faire ce qu'on veut (arrêter, démarrer comme on veut) et, lorsqu'on repasse en mode automatique, il reprends la filtration là où elle avait élé laissée. Il faut donc un compteur qui stocke le temps de filtration effectué chaque jour pour pouvoir le comparer au temps calculé à minuit. La version la plus simple aurait été d'accumuler des minutes dans une variable. Mais finalement, la gestion qui consiste plutôt à accumuler des kWh dans un compteur n'est pas beaucoup plus compliquée, et elle donne l'avantage d'avoir un historique de la filtration ainsi que les rapports de coûts de celle-ci. C'est pour ça que j'ai choisi un compteur électrique plutôt qu'un compteur de minutes. En divisant les kWh par la puissance de la pompe, on retrouve la durée de filtration effectuée. 2/ Les variables : 2 variables à définir : - var_PPStart, de type "Heure" stocke l'heure de début de filtration calculée à minuit - var_PPDuree, de type "Entier" stocke la durée de filtration calculée, en minutes 3/ Les constantes Elles servent à calculer la durée de filtration en fonction des caractéristiques du bassin et de la pompe : - cst_PpeFl_Q Le débit nominal de la pompe de filtration en m3/h - cst_Pisc_V Le volume du bassin, en m3 - cst_PpeFl_W La puissance électrique de la pompe piscine, pour pouvoir calculer la durée de filtration quotidienne ainsi que la consommation électrique correspondante - cst_Adj Un coefficient à ajuster en + ou en - pour filtrer plus ou moins longtemps --]] -- Paramètres local dbPath = "/home/pi/domoticz/domoticz.db" local gst_HorsGel = true -- gestion ou non du mode hors gel local dev_TAir = "Alecto V1 Extérieur" -- Température extérieure (nécessaire seulement pour le mode hors gel) local dev_TEau = "t° piscine" -- Température eau piscine local dev_PpeFl = "filtration piscine" -- Interrupteur de commande de la pompe local dev_ModeFl = "Mode filtration piscine" -- Selecteur du mode de la pompe (Manu/Auto HC/AutoHP) local dev_cptFl = "Consommation Piscine" -- Compteur de consommation électrique piscine local dev_HC = "Heures creuses EDF" -- Indicateur d'heure creuses EdF local tps_Fl = "Temps filtration" -- Capteur texte pour afficher le temps de filtration local rest_Fl = "Restant filtration" -- Capteur texte pour afficher le temps restant de filtration local heure_Fl = "Debut filtration" -- Capteur texte pour afficher l'heure de début de filtration local var_PPStart = "PpePiscStart" -- Variable contenant l'heure de départ de la filtration local var_PPDuree = "PpePiscDuree" -- Variable contenant la durée de la filtration -- Réglages du temps de filtration local cst_PpeFl_Qn=14 -- Débit nominal de la pompe de filtration en m3/h local cst_Pisc_V =18 -- volume du bassin, en m3 local cst_Adj =0.250 -- Coefficient à ajuster en + ou en - pour filtrer plus ou moins longtemps local cst_PpeFl_W =560 -- Puissance électrique de la pompe piscine -- ------------------------------- -- Bibliothèque de fonctions -- ------------------------------- local CmdIdx=1 local debug=0 function round(num, dec) if num == 0 then return 0 else local mult = 10^(dec or 0) return math.floor(num * mult + 0.5) / mult end end function os.capture(cmd, raw) local f = assert(io.popen(cmd, 'r')) local s = assert(f:read('*a')) f:close() if raw then return s end s = string.gsub(s, '^%s+', '') s = string.gsub(s, '%s+$', '') s = string.gsub(s, '[\n\r]+', ' ') return s end function UpdateSw(device,commande) --Update un switch Domoticz commandArray[#commandArray+1] = {[device] = commande} end function UpdateVar(variable,valeur) --Update une variable Domoticz commandArray[#commandArray+1] = {['Variable:'..variable] = tostring(valeur)} end function UpdateDev(device,nvalue,svalues) --Met à jour un device numérique Domotica commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[device]..'|'..tostring(nvalue)..'|'..tostring(svalues)} end function UpdateP1(device,HC,conso,prod,freq) -- Met à jour un P1 smart counter -- device : nom du compteur -- HC : "On" si heures creuses, "Off" si heures pleines -- conso : consommation instantannée -- prod : production instantannée -- freq : frequence d'exécution du script (en minutes) local u1, u2, p1, p2 local dbg=0 u1, u2, p1, p2 = string.match(otherdevices_svalues[device],"(.-);(.-);(.-);(.-);.*") -- Utile pour les compteurs nouvellement crées u1=u1 or 0 u2=u2 or 0 p1=p1 or 0 p2=p2 or 0 if dbg == 1 then print("Mise à jour de "..tostring(device)) print("u1 "..tostring(u1)) print("u2 "..tostring(u2)) print("p1 "..tostring(p1)) print("p2 "..tostring(p2)) print("conso "..tostring(conso)) print("prod "..tostring(prod)) end if otherdevices[HC] == 'Off' then -- svalue=USAGE1;USAGE2;RETURN1;RETURN2;CONS;PROD commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[device]..'|0|'..tostring(u1+conso*freq/60)..';'..tostring(u2)..';'..tostring(p1+prod*freq/60)..';'..tostring(p2)..';'..tostring(conso)..';'..tostring(prod)} else commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[device]..'|0|'..tostring(u1)..';'..tostring(u2+conso*freq/60)..';'..tostring(p1)..';'..tostring(p2+prod*freq/60)..';'..tostring(conso)..';'..tostring(prod)} end end function ConsoDev(switch,ConsoMarche,ConsoVeille) -- Retourne la consommation d'un appareil commandé -- selon qu'il est en marche ou en veille if otherdevices[switch] == 'On' then return ConsoMarche else return ConsoVeille end end function CalcFiltration() --[[ Calcule * La durée optimale de filtration en fonction de la Température de l'eau, du débit de la pompe et du volume du bassin * L'heure de début de la filtration selon qu'on veut filtrer en heure creuses ou pleines Utilise les variables globales suivantes dev_Teau : device du thermomètre d'eau dev_ModeFl : le sélecteur de mode de filtration cst_PpeFl_Qn: débit nominal de la pompe en m3/h cst_Pisc_V : Volume du bassin en m3 cst_Adj : Coefficient d'ajustement var_PPStart : Nom de la variable qui va stocker l'heure de départ de la filtration var_PPDuree : Nom de la vatiable qui va stocker la durée de filtration --]] local val_TEau, MidiSol, DebutFiltration, dureeFiltration, HDebFilt --print("Script Piscine : Calcul de la filtration") val_TEau=os.capture('/usr/bin/sqlite3 '..dbPath..' "select temp_avg from temperature_calendar where devicerowid='..otherdevices_idx[dev_TEau]..' order by date desc limit 1"') val_TEau=round(val_TEau,1) print("Température moyenne de la piscine hier : "..val_TEau.." °C") dureeFiltration=round(60*math.max(0,cst_Adj*cst_Pisc_V/cst_PpeFl_Qn*(val_TEau-10)),0) -- Résultat en minutes --print("Durée de filtration : "..dureeFiltration.." min") commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[tps_Fl]..'|0|'..tonumber(dureeFiltration)..' min'} if otherdevices[dev_ModeFl] == "Auto HC" then -- Mode Auto Heures Creuses -- On filtre jusqu'à 7h00 si possible (=420 min), et on déborde si nécessaire DebutFiltration=math.max(10,420-dureeFiltration) else -- Mode Auto Heures Pleines ou Manu -- On filtre en journée, centré sur le midi solaire MidiSol=round((timeofday['SunriseInMinutes']+timeofday['SunsetInMinutes'])/2,0) -- en minutes DebutFiltration=round(MidiSol-dureeFiltration/2,0) -- en minutes end HDebFilt=os.date("%H:%M", DebutFiltration*60-3600) --print("Début de filtration : "..HDebFilt) commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[heure_Fl]..'|0|'..HDebFilt} UpdateVar(var_PPStart,HDebFilt) UpdateVar(var_PPDuree,dureeFiltration) end function ChkFiltration() --[[Gestion de la filtration Start / Stop de la pompe Demandes de chloration automaique --]] -- Mode de la filtration : -- Manu / Auto HC / Auto HP local PpeDuree, val_TEau, val_PpeFl, MinDuJour, PpeStart, today, PpeFait, PpeRest --print("Script Piscine : Gestion de la filtration") PpeDuree=tonumber(uservariables[var_PPDuree]) if (otherdevices[dev_ModeFl] ~= "Manu") then --val_TEau = tonumber(string.match(otherdevices_svalues[dev_TEau],"(%d+.%d*);.*")) val_TEau=tonumber(otherdevices_svalues[dev_TEau]) --print(otherdevices_svalues[dev_TEau]) --print("Temperature piscine = " .. val_TEau) val_PpeFl=otherdevices[dev_PpeFl] if (val_TEau >= 12) then -- La témpérature d'eau est >=12°C : on utilise la temporisation MinDuJour=60*time.hour+time.min PpeStart=tonumber(string.sub(uservariables[var_PPStart],1,2))*60+tonumber(string.sub(uservariables[var_PPStart],4,5)) -- Calcul de la durée de fonctionnement de la pompe aujourd'hui -- Basé sur le compteur de puissance piscine today = os.date("%Y-%m-%d") PpeFait=os.capture('/usr/bin/sqlite3 '..dbPath..' "select sum(value3) from multimeter where devicerowid='..otherdevices_idx[dev_cptFl]..' and Date(date)=\''..today..'\'"')*5/cst_PpeFl_W print("Temps effectué de filtration piscine de : "..PpeFait.." minutes sur "..PpeDuree) -- Calcul du temps restant de filtration PpeRest=PpeDuree-PpeFait if (PpeRest > 0) then print("Temps restant de filtration piscine : "..PpeRest.." minutes ") commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[rest_Fl]..'|0|'..tonumber(PpeRest)..' min'} else print("Filtration piscine finie") commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[rest_Fl]..'|0|'..'Arrêtée'} end if (MinDuJour >= PpeStart and PpeFait < PpeDuree and val_PpeFl == "Off") then print("Filtration piscine : Démarrage par timer") UpdateSw(dev_PpeFl,'On') elseif (PpeFait >= PpeDuree and val_PpeFl == "On") then print("Filtration piscine : Arrêt par timer") UpdateSw(dev_PpeFl,'Off') end else if gst_HorsGel then --[[ La température de l'eau est <12°C : on utilise la température Démarrage si température d'air <= 1 Arrêt si température d'air >= 1.5 et température eau >= 0.5 --]] val_TAir = tonumber(otherdevices_svalues[dev_TAir]) if (val_TAir <= 1) and val_PpeFl == "Off" then print("Filtration piscine : Démarrage par température") UpdateSw(dev_PpeFl,'On') elseif (val_TAir >= 1.5) and (val_TEau>=0.5) and val_PpeFl == "On" then print("Filtration piscine : Arrêt par température") UpdateSw(dev_PpeFl,'Off') end end end -- filtration timer/temperature else print("Mode manu, pas de changement") end -- end mode auto/manu end -- ------------------------------- -- Fin bibliothèque de fonctions -- ------------------------------- commandArray = {} time = os.date("*t") --Calcul de la durée optimale de filtration et de l'heure de démarrage tous le jours à minuit une if time.hour==0 and time.min ==1 then CalcFiltration() end -- Marche/Arrêt de la pompe de filtration tous les quart d'heures if (((time.min-1) % 15)== 0) then ChkFiltration() end -- Mise à jour du compteur de consommation de la piscine toutes les 5min if (((time.min-2) % 5)== 0) then UpdateP1(dev_cptFl,dev_HC,ConsoDev(dev_PpeFl,cst_PpeFl_W,0),0,5) end return commandArray
Re: Domotique Piscine
Salut ,
merci de te pencher sur mon problème ...
j'ai posté exactement ce que j'ai dans mon script , pourquoi trouves-tu ça bizarre ?
merci de te pencher sur mon problème ...
j'ai posté exactement ce que j'ai dans mon script , pourquoi trouves-tu ça bizarre ?
Re: RE: Re: Domotique Piscine
Parce qu'il en manque un boutle belge a écrit :Salut ,
merci de te pencher sur mon problème ...
j'ai posté exactement ce que j'ai dans mon script , pourquoi trouves-tu ça bizarre ?
Re: Domotique Piscine
Je vais vérifier quand même , pas de souci ça ne presse pas ...
Re: Domotique Piscine
Bon, c'est pas ça ; c'était la consultation sur le téléphone qui tronquait le script !
Rajoute un print(otherdevices_svalues[dev_TAir]) entre la ligne val_TAir = tonumber(otherdevices_svalues[dev_TAir]) et if (val_TAir <= 1) and val_PpeFl == "Off" then pour voir ce que ça dit ?
Rajoute un print(otherdevices_svalues[dev_TAir]) entre la ligne val_TAir = tonumber(otherdevices_svalues[dev_TAir]) et if (val_TAir <= 1) and val_PpeFl == "Off" then pour voir ce que ça dit ?
Re: Domotique Piscine
'soir ,
je viens de mettre le print , à suivre ...
Mike
je viens de mettre le print , à suivre ...
Mike
Re: Domotique Piscine
'soir ,
@aleph0
je viens de m'apercevoir que je ne t'avais pas donné de nouvelles à propos de mon erreur !!
voici mes logs avec le print :
la température de l'eau est à 10.94°
la température de l'air est à 14.2°
ce ne serait pas un problème de virgule ??
Mike
@aleph0
je viens de m'apercevoir que je ne t'avais pas donné de nouvelles à propos de mon erreur !!
voici mes logs avec le print :
Code : Tout sélectionner
2017-10-24 18:46:00.197 dzVents: 14.2;93;3
2017-10-24 18:46:00.198 Error: EventSystem: in gestion piscine: [string "--[[ Script de gestion de la piscine ..."]:258: attempt to compare nil with number
2017-10-24 18:47:33.995 (RFlink ) Temp (Auriol V2)
2017-10-24 18:48:30.897 (RFlink ) Temp (Auriol V2)
2017-10-24 18:48:43.398 (RFlink ) Temp (chambre Loulou)
2017-10-24 18:49:26.825 (RFlink ) Temp (chambre Loulou)
2017-10-24 18:49:27.722 (RFlink ) Temp (Auriol V2)
2017-10-24 18:49:37.033 User: domoticz initiated a switch command (742/Radio/Set Level)
2017-10-24 18:49:37.166 (virtuel) Light/Switch (Radio)
2017-10-24 18:49:37.255 Executing script: /home/pi/domoticz/scripts/stop_radio.sh
2017-10-24 18:50:10.663 (RFlink ) Temp (chambre Loulou)
2017-10-24 18:50:24.924 (RFlink ) Temp (Auriol V2)
2017-10-24 18:51:21.723 (RFlink ) Temp (Auriol V2)
2017-10-24 18:54:32.682 (RFlink ) Temp (chambre Loulou)
2017-10-24 18:58:00.732 (RFlink ) Temp (Auriol V2)
2017-10-24 18:58:10.869 (RFlink ) Temp (chambre Loulou)
2017-10-24 18:59:54.733 (RFlink ) Temp (Auriol V2)
2017-10-24 19:01:00.245 dzVents: 14.2;93;3
2017-10-24 19:01:00.245 Error: EventSystem: in gestion piscine: [string "--[[ Script de gestion de la piscine ..."]:258: attempt to compare nil with number
2017-10-24 19:01:49.046 (RFlink ) Temp (Auriol V2)
2017-10-24 19:03:42.732 (RFlink ) Temp (Auriol V2)
2017-10-24 19:04:44.158 (RFlink ) Temp (chambre Loulou)
2017-10-24 19:07:38.847 (RFlink ) Temp (chambre Loulou)
2017-10-24 19:12:44.309 (RFlink ) Temp (chambre Loulou)
2017-10-24 19:16:00.071 dzVents: 14.2;93;3
2017-10-24 19:16:00.071 Error: EventSystem: in gestion piscine: [string "--[[ Script de gestion de la piscine ..."]:258: attempt to compare nil with number
2017-10-24 19:19:17.715 (RFlink ) Temp (chambre Loulou)
2017-10-24 19:20:01.161 (RFlink ) Temp (chambre Loulou)
2017-10-24 19:20:45.082 (RFlink ) Temp (chambre Loulou)la température de l'air est à 14.2°
ce ne serait pas un problème de virgule ??
Mike
Re: Domotique Piscine
Bonjour et un grand merci à tous (particulièrement aleph0)
Je viens d'implémenter tout cela pour ma piscine, en attendant de pouvoir m'y baigner !
J'ai ajouter en actions sur le switch de selection du mode de filtration, une mise en service de ma pompe lors du passage en manuel et un arret lors du passage en HC ou HP.
J'ai fait des simulations en forçant des températures et tout semble parfait.
Après le passage d'un été complet et d'une première partie d'hiver, êtes vous tous toujours satisfaits de ce script et/ou y avez vous apporter d'autres améliorations ?
Cordialement
Je viens d'implémenter tout cela pour ma piscine, en attendant de pouvoir m'y baigner !
J'ai ajouter en actions sur le switch de selection du mode de filtration, une mise en service de ma pompe lors du passage en manuel et un arret lors du passage en HC ou HP.
J'ai fait des simulations en forçant des températures et tout semble parfait.
Après le passage d'un été complet et d'une première partie d'hiver, êtes vous tous toujours satisfaits de ce script et/ou y avez vous apporter d'autres améliorations ?
Cordialement
Re: Domotique Piscine
Bonjour,
j'ai un soucis avec le script mais pour le coup, je vois pas ou est le soucis
vous avez une idée ?
Pi, je suis sous Domoticz V3.8153 sur un Pi 0 W. ma base de donnée est dans /home/domoticz/domoticz/domoticz.db
Merci
j'ai un soucis avec le script mais pour le coup, je vois pas ou est le soucis
2018-04-20 11:17:10.565 Error: EventSystem: in Gestion piscine: [string "--[[ Script de gestion de la piscine ..."]:88: bad argument #1 to 'match' (string expected, got nil).
Code : Tout sélectionner
u1, u2, p1, p2 = string.match(otherdevices_svalues[device],"(.-);(.-);(.-);(.-);.*")Pi, je suis sous Domoticz V3.8153 sur un Pi 0 W. ma base de donnée est dans /home/domoticz/domoticz/domoticz.db
Merci