Domotique Piscine
Re: Domotique Piscine
Re: Domotique Piscine
Je relance le script et te tiens informé de la suite
Zigbee Conbee II + Philips hue +Variateurs +smart buttons
Station meteo Netatmo
Plusieurs ESP8266 sous ESPEASY + DS18B20 + BMP280 +Relais
Re: Domotique Piscine
retour d'info suite a la correction du compteur marche pompe par un "P1 compteur intelligent":
- plus d'erreurs dans les log , ça fonctionne , les valeurs sont désormais bien enregistrées dans la domoticz.db (devicerowid =78)
Cependant, sur un autre sujet j'ai la variable "PpePiscStart" qui ne s'est pas mise à jour à 00:01:
Code : Tout sélectionner
2020-04-10 00:01:00.605 Error: EventSystem: Error updating variable PpePiscStart: Not a valid time notation (HH:MM)
definition de la user variable dans domoticz :
idx Nom de la variable Type de variable Valeur actuelle Dernière mise à jour
2 PpePiscStart Heure 00:00 2020-04-08 18:28:54
nommage de la variable dans le script:
Code : Tout sélectionner
local var_PPStart = "PpePiscStart" -- Variable contenant l'heure de départ de la filtration
voici ce que donnent les log
Code : Tout sélectionner
Status: LUA: Script Piscine : Calcul de la filtration
Status: LUA: Température moyenne hier : 16.4 °C
Status: LUA: Durée de filtration : 280.0 min
Status: EventSystem: Script event triggered: Filtration_Piscine
Error: EventSystem: Error updating variable PpePiscStart: Not a valid time notation (HH:MM)
Code : Tout sélectionner
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
UpdateVar(var_PPStart,HDebFilt)
UpdateVar(var_PPDuree,dureeFiltration)
end
je remets mon code complet si besoin :
Code : 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 = "Module Extérieur" --"Température Extérieure" idx 1 -- Température extérieure (nécessaire seulement pour le mode hors gel)
--print(otherdevices_svalues[dev_TAir])-- for debug
--print(string.match(otherdevices_svalues[dev_TAir], "(%d+%.*%d*)"))-- for debug
local dev_TEau = "Temperature Piscine" --"Température piscine" idx 67-- Température eau piscine
--print(otherdevices_svalues[dev_TEau])-- for debug
--print(string.match(otherdevices_svalues[dev_TEau], "(%d+%.*%d*)")) -- for debug
local dev_PpeFl = "Pompe Piscine" --"Filtration piscine" idx 71-- Interrupteur de commande de la pompe
local dev_ModeFl = "Mode filtration piscine" --"Mode filtration piscine" idx 76-- Selecteur du mode de la pompe (Manu/Auto HC/AutoHP)
local dev_cptFl = "Consommation Piscine" --"Consommation Piscine" idx 83-- Compteur de consommation électrique piscine
local dev_HC = "Heures creuses EDF" --"Heures creuses EDF" idx 77-- Indicateur d'heure creuses EdF
local tps_Fl = "Temps filtration" -- idx 79 Capteur texte pour afficher le temps de filtration
local rest_Fl = "Restant filtration" -- idx 80 Capteur texte pour afficher le temps restant de filtration
local heure_Fl = "Debut filtration" -- idx 81 Capteur texte pour afficher l'heure de début de filtration
local fin_Fl = "Fin filtration" -- idx 82 Capteur texte pour afficher l'heure de fin 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=18 -- Débit nominal de la pompe de filtration en m3/h
local cst_Pisc_V =75 -- volume du bassin, en m3
local cst_Adj =0.175 -- Coefficient à ajuster en + ou en - pour filtrer plus ou moins longtemps
local cst_PpeFl_W =750 -- Puissance électrique de la pompe piscine
-- -------------------------------
-- Bibliothèque de fonctions
-- -------------------------------
local CmdIdx=1
local debug=1
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[CmdIdx] = {[device] = commande}
CmdIdx=CmdIdx+1
end
function UpdateVar(variable,valeur)
--Update une variable Domoticz
commandArray[CmdIdx] = {['Variable:'..variable] = tostring(valeur)}
CmdIdx=CmdIdx+1
end
function UpdateDev(device,nvalue,svalues)
--Met à jour un device numérique Domotica
commandArray[CmdIdx] = {['UpdateDevice'] = otherdevices_idx[device]..'|'..tostring(nvalue)..'|'..tostring(svalues)}
CmdIdx=CmdIdx+1
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[CmdIdx] = {['UpdateDevice'] = otherdevices_idx[device]..'|0|'..tostring(u1+conso*freq/60)..';'..tostring(u2)..';'..tostring(p1+prod*freq/60)..';'..tostring(p2)..';'..tostring(conso)..';'..tostring(prod)}
CmdIdx=CmdIdx+1
else
commandArray[CmdIdx] = {['UpdateDevice'] = otherdevices_idx[device]..'|0|'..tostring(u1)..';'..tostring(u2+conso*freq/60)..';'..tostring(p1)..';'..tostring(p2+prod*freq/60)..';'..tostring(conso)..';'..tostring(prod)}
CmdIdx=CmdIdx+1
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('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 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")
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
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
print("Script Piscine : Gestion de la filtration")
PpeDuree=tonumber(uservariables[var_PPDuree])
if (otherdevices[dev_ModeFl] ~= "Manu") then
--val_TEau = string.match(otherdevices_svalues[dev_TEau], "(%d+%.*%d*)") --- modif
val_TEau = tonumber(otherdevices_svalues[dev_TEau])
val_PpeFl= otherdevices[dev_PpeFl]
if (val_TEau >= 12) then
print('device => '..dev_TEau.. '-svalues dev_TEau => '..otherdevices_svalues[dev_TEau]..'-')
-- 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")
Dummy='sqlite3 '..dbPath..' "select sum(value3) from multimeter where devicerowid='..otherdevices_idx[dev_cptFl]..' and Date(date)=\''..today..'\'"'
print("Requette sqlite",Dummy)
PpeFait=os.capture('sqlite3 '..dbPath..' "select sum(value3) from multimeter where devicerowid='..otherdevices_idx[dev_cptFl]..' and Date(date)=\''..today..'\'"')*5/cst_PpeFl_W
print("Déjà effectué : "..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
-- Calcul de l'heure de début de filtration
HDebFilt=os.date("%H:%M", PpeStart*60-3600)
print("Début de filtration : "..HDebFilt)
commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[heure_Fl]..'|0|'..HDebFilt}
-- Calcul de l'heure de fin de filtration
HFinFilt=os.date("%H:%M", ((PpeStart*60-3600)+(PpeDuree*60)))
print("Fin de la filtration a : "..HFinFilt)
commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[fin_Fl]..'|0|'..HFinFilt}
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 = string.match(otherdevices_svalues[dev_TAir], "(%d+%.*%d*)")
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==8 and time.min ==4 then CalcFiltration() end ---modif time 0 and min 0
-- 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
Merci encore pour votre aide
Zigbee Conbee II + Philips hue +Variateurs +smart buttons
Station meteo Netatmo
Plusieurs ESP8266 sous ESPEASY + DS18B20 + BMP280 +Relais
Re: Domotique Piscine
il me manquait les lignes :
Code : Tout sélectionner
HDebFilt=os.date("%H:%M", DebutFiltration*60-3600)
print("Début de filtration : "..HDebFilt)
dans la function CalcFiltration() , avant:
Code : Tout sélectionner
UpdateVar(var_PPStart,HDebFilt)
UpdateVar(var_PPDuree,dureeFiltration)
Zigbee Conbee II + Philips hue +Variateurs +smart buttons
Station meteo Netatmo
Plusieurs ESP8266 sous ESPEASY + DS18B20 + BMP280 +Relais
Re: Domotique Piscine
Apres ajustement des réglages de filtration ( cst_PpeFl_Qn, cst_Pisc_V , local cst_Adj, local cst_PpeFl_W) j'ai effectué differents tests pour confirmer le bon fonctionnement du script .
Pour le moment c'est quasi parfait ! :
- Calcul temps filtration coherent
- Pompe qui passe bien à ON/OFF on timer
- Reprise de la filtration la ou on s'est arreté
- Compteur Conso Watt pompe : ok
- Affichage Debut,Reste,Fin filtration :Ok ( même si le Restant filtration m'affiche jusqu'a 11 chiffres après la virgule

- etc...
Il me reste juste à régler le problème d'affichage sur capteur text local tps_Fl = "Temps de filtration ", il reste à "Hello World" Je n'ai pas encore réussi a trouver d'ou cela pouvait venir . Je pense pourtant avoir bien inseré le code de Jeff.
Jeff a écrit : ↑15 mai 2017, 20:00 J'ai rajouté des capteurs text dans domoticz et je les ai déclaré au début du script après les "dev" :Puis ceci après le calcul de la filtration :Code : Tout sélectionner
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
Ceci après l'heure de début de filtration :Code : Tout sélectionner
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'}
Et ceci pour calculer le temps restant, en ayant rajouter PpeRest après la déclaration des local dans la fonction :Code : Tout sélectionner
HDebFilt=os.date("%H:%M", DebutFiltration*60-3600) --print("Début de filtration : "..HDebFilt) commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[heure_Fl]..'|0|'..HDebFilt}
Le résultat est celui-ciCode : Tout sélectionner
-- Calcul du temps restant de filtration PpeRest=PpeDuree-PpeFait if (PpeRest > 0) then print("Temps restant de filtration : "..PpeRest.." minutes ") commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[rest_Fl]..'|0|'..tonumber(PpeRest)..' min'} else print("Filtration finie") commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[rest_Fl]..'|0|'..'Arrêtée'} end
piscine.jpg
Si quelqu'un a rencontré le meme soucis ... je suis preneur.


je repartage mon code si besoin .
note: il est à jour , j'y ai apporté toutes les ameliorations proposées et corrigé tous les bugs identifiés depuis sur les 26 pages de ce post.
Code : 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 = "Module Extérieur" --"Température Extérieure" idx 1 -- Température extérieure (nécessaire seulement pour le mode hors gel)
--print(otherdevices_svalues[dev_TAir])-- for debug
--print(string.match(otherdevices_svalues[dev_TAir], "(%d+%.*%d*)"))-- for debug
local dev_TEau = "Temperature Piscine" --"Température piscine" idx 67-- Température eau piscine
--print(otherdevices_svalues[dev_TEau])-- for debug en fonction du type de sonde
--print(string.match(otherdevices_svalues[dev_TEau], "(%d+%.*%d*)")) --for debug en fonction du type de sonde
local dev_PpeFl = "Pompe Piscine" --"Filtration piscine" idx 71-- Interrupteur de commande de la pompe
local dev_ModeFl = "Mode filtration piscine" --"Mode filtration piscine" idx 76-- Selecteur du mode de la pompe (Manu/Auto HC/AutoHP)
local dev_cptFl = "Consommation Piscine" --"Consommation Piscine" idx 83-- Compteur de consommation électrique piscine
local dev_HC = "Heures creuses EDF" --"Heures creuses EDF" idx 77-- Indicateur d'heure creuses EdF
local tps_Fl = "Temps filtration" -- idx 79 Capteur texte pour afficher le temps de filtration
local rest_Fl = "Restant filtration" -- idx 80 Capteur texte pour afficher le temps restant de filtration
local heure_Fl = "Debut filtration" -- idx 81 Capteur texte pour afficher l'heure de début de filtration
local fin_Fl = "Fin filtration" -- idx 82 Capteur texte pour afficher l'heure de fin 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=16,5 -- Débit nominal de la pompe de filtration en m3/h
local cst_Pisc_V =75 -- volume du bassin, en m3
local cst_Adj =0.25 -- Coefficient à ajuster en + ou en - pour filtrer plus ou moins longtemps
local cst_PpeFl_W =590 -- Puissance électrique de la pompe piscine
-- -------------------------------
-- Bibliothèque de fonctions
-- -------------------------------
local CmdIdx=1
local debug=1
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[CmdIdx] = {[device] = commande}
CmdIdx=CmdIdx+1
end
function UpdateVar(variable,valeur)
--Update une variable Domoticz
commandArray[CmdIdx] = {['Variable:'..variable] = tostring(valeur)}
CmdIdx=CmdIdx+1
end
function UpdateDev(device,nvalue,svalues)
--Met à jour un device numérique Domotica
commandArray[CmdIdx] = {['UpdateDevice'] = otherdevices_idx[device]..'|'..tostring(nvalue)..'|'..tostring(svalues)}
CmdIdx=CmdIdx+1
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[CmdIdx] = {['UpdateDevice'] = otherdevices_idx[device]..'|0|'..tostring(u1+conso*freq/60)..';'..tostring(u2)..';'..tostring(p1+prod*freq/60)..';'..tostring(p2)..';'..tostring(conso)..';'..tostring(prod)}
CmdIdx=CmdIdx+1
else
commandArray[CmdIdx] = {['UpdateDevice'] = otherdevices_idx[device]..'|0|'..tostring(u1)..';'..tostring(u2+conso*freq/60)..';'..tostring(p1)..';'..tostring(p2+prod*freq/60)..';'..tostring(conso)..';'..tostring(prod)}
CmdIdx=CmdIdx+1
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('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 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'} -- ajout pour tps_Fl (capteur texte)
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)
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
local Min_last_stop=23*60+45 -- Heure maxi pour arrêter la filtration en minute
print("Script Piscine : Gestion de la filtration")
PpeDuree=tonumber(uservariables[var_PPDuree])
if (otherdevices[dev_ModeFl] ~= "Manu") then
--val_TEau = string.match(otherdevices_svalues[dev_TEau], "(%d+%.*%d*)") --- modif par val_TEau = tonumber(otherdevices_svalues[dev_TEau])
val_TEau = tonumber(otherdevices_svalues[dev_TEau])
val_PpeFl= otherdevices[dev_PpeFl]
if (val_TEau >= 12) then
print('device => '..dev_TEau.. '-svalues dev_TEau => '..otherdevices_svalues[dev_TEau]..'-')
-- 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")
-- Dummy='sqlite3 '..dbPath..' "select sum(value3) from multimeter where devicerowid='..otherdevices_idx[dev_cptFl]..' and Date(date)=\''..today..'\'"'
--print("Requette sqlite",Dummy)
PpeFait=os.capture('sqlite3 '..dbPath..' "select sum(value3) from multimeter where devicerowid='..otherdevices_idx[dev_cptFl]..' and Date(date)=\''..today..'\'"')*5/cst_PpeFl_W
print("Déjà effectué : "..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
-- Calcul de l'heure de début de filtration
HDebFilt=os.date("%H:%M", PpeStart*60-3600)
print("Début de filtration : "..HDebFilt)
commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[heure_Fl]..'|0|'..HDebFilt}
-- Calcul de l'heure de fin de filtration
HFinFilt=os.date("%H:%M", ((PpeStart*60-3600)+(PpeDuree*60)))
print("Fin de la filtration a : "..HFinFilt)
commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[fin_Fl]..'|0|'..HFinFilt}
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 = string.match(otherdevices_svalues[dev_TAir], "(%d+%.*%d*)")
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
Zigbee Conbee II + Philips hue +Variateurs +smart buttons
Station meteo Netatmo
Plusieurs ESP8266 sous ESPEASY + DS18B20 + BMP280 +Relais
-
- Messages : 628
- Enregistré le : 24 déc. 2018, 17:05
- Localisation : (26)
Re: Domotique Piscine
Utilise round (arrondi) :
Code : Tout sélectionner
PpeRest=PpeDuree-PpeFait
PpeRest=round(PpeRest,0)
Code : Tout sélectionner
print("Durée de filtration : "..dureeFiltration.." min")
Code : Tout sélectionner
commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[tps_Fl]..'|0|'..tonumber(dureeFiltration)..' min'} -- ajout pour tps_Fl (capteur texte)
Code : Tout sélectionner
commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[tps_Fl]..'|0|'..dureeFiltration..' min'} -- ajout pour tps_Fl (capteur texte)
Code : Tout sélectionner
local tps_Fl = "Temps filtration" -- idx 79 Capteur texte pour afficher le temps de filtration
7 Modules fil pilote ZMNHJD1
2 détecteur fumées CHACON 34131
5 Bresser Capteur thermo/hygro
1 contacteur porte Philio PST02-1A Z
OWL Micro+ CM180
D2L LINKY
FGR-223 "Roller Shutter 3"
Re: Domotique Piscine
Utilise round (arrondi) :
Code : Tout sélectionner
PpeRest=PpeDuree-PpeFait
PpeRest=round(PpeRest,0)

Code : Tout sélectionner
print("Durée de filtration : "..dureeFiltration.." min")
il me retourne ça :
Code : Tout sélectionner
Status: LUA: Durée de filtration : 450.0 min
Code : Tout sélectionner
commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[tps_Fl]..'|0|'..tonumber(dureeFiltration)..' min'} -- ajout pour tps_Fl (capteur texte)
Code : Tout sélectionner
commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[tps_Fl]..'|0|'..dureeFiltration..' min'} -- ajout pour tps_Fl (capteur texte)
Verifie bien le nom de ton device "Temps filtration", pas d'espace qui se balade, avant ou après ?
Code : Tout sélectionner
local tps_Fl = "Temps filtration" -- idx 79 Capteur texte pour afficher le temps de filtration
tout semble ok à ce niveau :/
Zigbee Conbee II + Philips hue +Variateurs +smart buttons
Station meteo Netatmo
Plusieurs ESP8266 sous ESPEASY + DS18B20 + BMP280 +Relais
-
- Messages : 628
- Enregistré le : 24 déc. 2018, 17:05
- Localisation : (26)
Re: Domotique Piscine
Code : Tout sélectionner
local dureeFiltration = 450.0
local tps_Fl = "Temps filtration"
commandArray = {}
print("Durée de filtration : "..dureeFiltration.." min")
commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[tps_Fl]..'|0|'..dureeFiltration..' min'} -- ajout pour tps_Fl (capteur texte)
return commandArray
Par contre, si erreur dans le nom du device, j'ai bien l'onglet Statut des log2020-04-11 07:26:01.636 Status: LUA: Durée de filtration : 450 min
mais j'ai également une erreur dans l'onglet Erreur des log2020-04-11 07:27:01.636 Status: LUA: Durée de filtration : 450 min
Aucun message d'erreur chez toi ?2020-04-11 07:27:01.224 Error: EventSystem: in __toute_les_minutes: [string " ..."]:65: attempt to concatenate field '?' (a nil value)
Et ceci pour tester sans les variables ?
Code : Tout sélectionner
commandArray[#commandArray+1] = {['UpdateDevice'] = '79|0|450 min'}
7 Modules fil pilote ZMNHJD1
2 détecteur fumées CHACON 34131
5 Bresser Capteur thermo/hygro
1 contacteur porte Philio PST02-1A Z
OWL Micro+ CM180
D2L LINKY
FGR-223 "Roller Shutter 3"
Re: Domotique Piscine
Donc j'ai modifié les valeurs time.hour==9 and time.min ==51 afin de déclencher la partie CalcFiltration()
voici une capture de mes log , où le status durée de filtration est bien affiché , mais pas d'erreur associée:

j'ai également testé la ligne sans les variables ( avec maj de l'IDX car hier soir j'ai supprimé/re-créé ce dummy pour test) :
Code : Tout sélectionner
commandArray[#commandArray+1] = {['UpdateDevice'] = '85|0|450 min'}

Zigbee Conbee II + Philips hue +Variateurs +smart buttons
Station meteo Netatmo
Plusieurs ESP8266 sous ESPEASY + DS18B20 + BMP280 +Relais
Re: Domotique Piscine
Code : Tout sélectionner
local dureeFiltration = 450.0
local tps_Fl = "Temps filtration"
commandArray = {}
print("Durée de filtration : "..dureeFiltration.." min")
commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[tps_Fl]..'|0|'..dureeFiltration..' min'} -- ajout pour tps_Fl (capteur texte)
return commandArray
Zigbee Conbee II + Philips hue +Variateurs +smart buttons
Station meteo Netatmo
Plusieurs ESP8266 sous ESPEASY + DS18B20 + BMP280 +Relais