Domotique Piscine
-
samourai47
- Messages : 286
- Inscription : 04 déc. 2018, 19:44
Re: Domotique Piscine
donc avec le premier. le print n'affiche aucune valeur. je l'ai mis en 2 eme ligne
2020-01-23 19:40:00.148 Error: EventSystem: in filtration2: [string "--[[ Script de gestion de la piscine..."]:222: attempt to compare nil with number
Avec le deuxieme
2020-01-23 19:43:00.189 Error: EventSystem: in filtration2: [string "--[[ Script de gestion de la piscine..."]:221: bad argument #1 to 'match' (string expected, got nil)
Meme en prenant un capteur temperature sans humidite, meme resultat
2020-01-23 19:40:00.148 Error: EventSystem: in filtration2: [string "--[[ Script de gestion de la piscine..."]:222: attempt to compare nil with number
Avec le deuxieme
2020-01-23 19:43:00.189 Error: EventSystem: in filtration2: [string "--[[ Script de gestion de la piscine..."]:221: bad argument #1 to 'match' (string expected, got nil)
Meme en prenant un capteur temperature sans humidite, meme resultat
-
denis_brasseur
- Messages : 898
- Inscription : 24 déc. 2018, 17:05
- Localisation : (26)
Re: Domotique Piscine
Dans la définition des variables locales, vérifie que la valeur de dev_TAir corresponde bien au nom de ta sonde de température extérieure.
Juste après la définition de cette variable, ajoute les 2 lignes
Code : Tout sélectionner
local dev_TAir = "T° Terrasse" --"Température Extérieure" idx 46 -- Température extérieure (nécessaire seulement pour le mode hors gel)Code : Tout sélectionner
print(otherdevices_svalues[dev_TAir])
print(string.match(otherdevices_svalues[dev_TAir], "(%d+%.*%d*)"))Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
-
samourai47
- Messages : 286
- Inscription : 04 déc. 2018, 19:44
Re: Domotique Piscine
2020-01-24 08:46:00.111 Status: LUA: 10.2;69;3
2020-01-24 08:46:00.111 Status: LUA: 10.2
Ce qui correspond bien aux valeurs de la sonde
2020-01-24 08:46:00.111 Status: LUA: 10.2
Ce qui correspond bien aux valeurs de la sonde
-
denis_brasseur
- Messages : 898
- Inscription : 24 déc. 2018, 17:05
- Localisation : (26)
Re: Domotique Piscine
Ligne 293, remplacesamourai47 a écrit : 24 janv. 2020, 08:47 2020-01-24 08:46:00.111 Status: LUA: 10.2;69;3
2020-01-24 08:46:00.111 Status: LUA: 10.2
Ce qui correspond bien aux valeurs de la sonde
Code : Tout sélectionner
val_Tair = tonumber(otherdevices_svalues[dev_TAir])Code : Tout sélectionner
val_Tair = string.match(otherdevices_svalues[dev_TAir], "(%d+%.*%d*)")Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
-
samourai47
- Messages : 286
- Inscription : 04 déc. 2018, 19:44
Re: Domotique Piscine
je comprends rien du tout.... Ca me soule comme on dit.... Lol
2020-01-25 10:03:00.141 Error: EventSystem: in filtration2: [string "--[[ Script de gestion de la piscine..."]:241: bad argument #1 to 'match' (string expected, got nil)
De plus je suis donc reparti sur une version de base, puis rajoute ligne par ligne les durees restant et autre calculs. Tout a bien marché jusqu'a 18h01
depuis seuls les capteurs de calcul de conso se mettent a jour toute les 5 minutes. Les calculs de 0h01 se font bien egalement et sont bien stockés dans les variables
Les autres capteurs ne sont plus mis a jour.... un vrai casse tête
Je suis sous buster? Une explication?
Bizarre quand même
2020-01-25 10:03:00.141 Error: EventSystem: in filtration2: [string "--[[ Script de gestion de la piscine..."]:241: bad argument #1 to 'match' (string expected, got nil)
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
--]]
-- Paramètres
local dbPath = "/home/pi/domoticz/domoticz.db"
local gst_HorsGel = false -- gestion ou non du mode hors gel
local dev_TAir = "T° Terrasse" -- Température extérieure (nécessaire seulement pour le mode hors gel)
--print(otherdevices_svalues[dev_TAir])
--print(string.match(otherdevices_svalues[dev_TAir], "(%d+%.*%d*)"))
local dev_TEau = "T° Bassin" -- Température eau piscine
local dev_PpeFl = "Pompe" -- Interrupteur de commande de la pompe
local dev_ModeFl = "Auto_HC/HP" -- Selecteur du mode de la pompe (Manu/Auto HC/AutoHP)
local dev_cptFl = "Conso_Piscine" -- Compteur de consommation électrique piscine
local dev_HC = "Témoin_HC" -- Indicateur d'heure creuses EdF
local tps_Fl = "Durée filtration" -- Capteur texte pour afficher le temps de filtration en minutes
local eff_Fl = "Filtration effectuée" -- Capteur texte pour afficher le temps en cours de filtration
local rest_Fl = "Restant filtration"
local heure_Fl = "Debut filtration" -- Capteur texte pour afficher l'heure de début de filtration
local fin_Fl = "Fin filtration" -- Capteur texte pour afficher l'heure de fin de filtration
local tp_moye = "T° Moyenne Piscine" -- Capteur texte pour afficher la température moyenne de la piscine
local tps_Flh = "Durée filtration hh" -- Capteur texte pour afficher la durée de filtration en heuree moyenne de la piscine
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=12 -- Débit nominal de la pompe de filtration en m3/h
local cst_Pisc_V =48 -- 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 =800 -- 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, dev_TAir, 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")
UpdateDev('T° moyenne Piscine', 0, val_TEau)
--dureeFiltration=round(60*math.max(2,cst_Adj*cst_Pisc_V/cst_PpeFl_Qn*(val_TEau-10)),0) -- Résultat en minutes
dureeFiltration=round(60*math.max(2,math.min(12,cst_Adj*cst_Pisc_V/cst_PpeFl_Qn*(val_TEau-10))),0) -- limite à 12h par jour, min 2h
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
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, dev_TAir, val_TAir, eff_Fl, PpeRest, PpeRestH, HFinFilt, HDebFilt,PpeStartH
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=tonumber(otherdevices_svalues[dev_TEau])
val_PpeFl=otherdevices[dev_PpeFl]
print('device => -'..dev_TEau.. '-svalues dev_TEau => -'..otherdevices_svalues[dev_TEau]..'-')
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('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)
UpdateDev('Filtration effectuée', 0, PpeFait.." minutes sur "..PpeDuree)
-- Calcul du temps restant de filtration
PpeRest=PpeDuree-PpeFait
PpeRestH=os.date("%H:%M", PpeRest*60-3600)
if (PpeRest > 0) then
print("Temps restant de filtration piscine : "..PpeRestH.." heures ")
commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[rest_Fl]..'|0|'..tonumber(PpeRestH)..' heures'}
else
print("Filtration piscine finie")
commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[rest_Fl]..'|0|'..'Arrêtée'}
end
-- Calcul de l'heure de fin de filtration
HFinFilt=os.date("%H:%M", ((PpeStart*60-3600)+(PpeDuree*60)))
PpeStartH=os.date("%H:%M", PpeStart*60-3600)
print("Fin de la filtration a : "..HFinFilt)
commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[fin_Fl]..'|0|'..HFinFilt}
commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[tps_Fl]..'|0|'..'Début: '..PpeStartH..';'..' Fin: '..HFinFilt..';'..'\n Durée: '..PpeDuree..';'..' sur: '..PpeFait}
if (MinDuJour >= PpeStart and PpeFait < PpeDuree and val_PpeFl == "Off") then
print("Filtration piscine : Démarrage par timer")
UpdateSw(dev_PpeFl,'On')
elseif val_PpeFl == "On" and (PpeFait >= PpeDuree or MinDuJour>=Min_last_stop) 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_temperature[dev_TAir])
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 ==01 then CalcFiltration() end
-- Marche/Arrêt de la pompe de filtration tous les quart d'heures
if (((time.min-1) % 1)== 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 depuis seuls les capteurs de calcul de conso se mettent a jour toute les 5 minutes. Les calculs de 0h01 se font bien egalement et sont bien stockés dans les variables
Les autres capteurs ne sont plus mis a jour.... un vrai casse tête
Je suis sous buster? Une explication?
Bizarre quand même
-
samourai47
- Messages : 286
- Inscription : 04 déc. 2018, 19:44
Re: Domotique Piscine
Je suis désolé j'ai un peu l'impression de spammer mais je comprends pas mes soucis..
Bon le mode hors gel buge pour moi mais c'est pas essentiel
Je suis reparti sur une version neuve, rajouté les differents calculs. Tout a bien fonctionne pendant 3 jours. (je force 2 heure de filtration par jour)
Aujiourd'hui demarrage normale de la fonction chkfiltration à 12h19 pour 2h
Dernièere mise a jour des capteurs 14h16 (reste 15mn, normal...).
Depuis plus rien. Le capteur restant de filtration (et les autres) m'affiche ; Restant 15mn. Ce qui me fait dire que la fonction checkfliration n'est plus executée depuis 14h16. Alors que celle de la consomation fonctionne normalement
Et bien evidemment pas de message d'erreur si ce n'est ceci
Bon le mode hors gel buge pour moi mais c'est pas essentiel
Je suis reparti sur une version neuve, rajouté les differents calculs. Tout a bien fonctionne pendant 3 jours. (je force 2 heure de filtration par jour)
Aujiourd'hui demarrage normale de la fonction chkfiltration à 12h19 pour 2h
Dernièere mise a jour des capteurs 14h16 (reste 15mn, normal...).
Depuis plus rien. Le capteur restant de filtration (et les autres) m'affiche ; Restant 15mn. Ce qui me fait dire que la fonction checkfliration n'est plus executée depuis 14h16. Alors que celle de la consomation fonctionne normalement
Et bien evidemment pas de message d'erreur si ce n'est ceci
Code : Tout sélectionner
2020-01-27 18:52:00.400 Status: LUA: Script Piscine : Gestion de la filtration
2020-01-27 18:52:00.403 Status: EventSystem: Script event triggered: filtration2 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
--]]
-- Paramètres
local dbPath = "/home/pi/domoticz/domoticz.db"
local gst_HorsGel = false -- gestion ou non du mode hors gel
local dev_TAir = "T° Terrasse" -- Température extérieure (nécessaire seulement pour le mode hors gel)
--print(otherdevices_svalues[dev_TAir])
--print(string.match(otherdevices_svalues[dev_TAir], "(%d+%.*%d*)"))
local dev_TEau = "T° Bassin" -- Température eau piscine
local dev_PpeFl = "Pompe" -- Interrupteur de commande de la pompe
local dev_ModeFl = "Auto_HC/HP" -- Selecteur du mode de la pompe (Manu/Auto HC/AutoHP)
local dev_cptFl = "Conso_Piscine" -- Compteur de consommation électrique piscine
local dev_HC = "Témoin_HC" -- Indicateur d'heure creuses EdF
local tps_Fl = "Durée filtration" -- Capteur texte pour afficher le temps de filtration en minutes
local eff_Fl = "Filtration effectuée" -- Capteur texte pour afficher le temps en cours de filtration
local rest_Fl = "Restant filtration"
local heure_Fl = "Debut filtration" -- Capteur texte pour afficher l'heure de début de filtration
local fin_Fl = "Fin filtration" -- Capteur texte pour afficher l'heure de fin de filtration
local tp_moye = "T° Moyenne Piscine" -- Capteur texte pour afficher la température moyenne de la piscine
local tps_Flh = "Durée filtration hh" -- Capteur texte pour afficher la durée de filtration en heuree moyenne de la piscine
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=12 -- Débit nominal de la pompe de filtration en m3/h
local cst_Pisc_V =48 -- 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 =800 -- 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, dev_TAir, 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")
UpdateDev('T° moyenne Piscine', 0, val_TEau)
--dureeFiltration=round(60*math.max(2,cst_Adj*cst_Pisc_V/cst_PpeFl_Qn*(val_TEau-10)),0) -- Résultat en minutes
dureeFiltration=round(60*math.max(2,math.min(12,cst_Adj*cst_Pisc_V/cst_PpeFl_Qn*(val_TEau-10))),0) -- limite à 12h par jour, min 2h
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
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, dev_TAir, val_TAir, eff_Fl, PpeRest, PpeRestH, HFinFilt, HDebFilt,PpeStartH
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=tonumber(otherdevices_svalues[dev_TEau])
val_PpeFl=otherdevices[dev_PpeFl]
print('device => -'..dev_TEau.. '-svalues dev_TEau => -'..otherdevices_svalues[dev_TEau]..'-')
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('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)
UpdateDev('Filtration effectuée', 0, PpeFait.." minutes sur "..PpeDuree)
-- Calcul du temps restant de filtration
PpeRest=PpeDuree-PpeFait
PpeRestH=os.date("%H:%M", PpeRest*60-3600)
if (PpeRest > 0) then
print("Temps restant de filtration piscine : "..PpeRestH.." heures ")
commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[rest_Fl]..'|0|'..PpeRestH..' heures'}
else
print("Filtration piscine finie")
commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[rest_Fl]..'|0|'..'Arrêtée'}
end
-- Calcul de l'heure de fin de filtration
HFinFilt=os.date("%H:%M", ((PpeStart*60-3600)+(PpeDuree*60)))
PpeStartH=os.date("%H:%M", PpeStart*60-3600)
print("Fin de la filtration a : "..HFinFilt)
commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[fin_Fl]..'|0|'..HFinFilt}
commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[tps_Fl]..'|0|'..'Début: '..PpeStartH..';'..' Fin: '..HFinFilt..';'..'\n Durée: '..PpeDuree..';'..' Fait: '..PpeFait}
if (MinDuJour >= PpeStart and PpeFait < PpeDuree and val_PpeFl == "Off") then
print("Filtration piscine : Démarrage par timer")
UpdateSw(dev_PpeFl,'On')
elseif val_PpeFl == "On" and (PpeFait >= PpeDuree or MinDuJour>=Min_last_stop) 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_temperature[dev_TAir])
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 ==01 then CalcFiltration() end
-- Marche/Arrêt de la pompe de filtration tous les quart d'heures
if (((time.min-1) % 1)== 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 commandArraycode]-
samourai47
- Messages : 286
- Inscription : 04 déc. 2018, 19:44
Re: Domotique Piscine
Hello, suite
Pour info j'ai remplacé tous les
--commandArray[#commandArray+1]
de la fonction chclefiltration par des
UpdateDev(
et depuis trois jours tous les 1/4 heures les script fonctionne parfaitement et du coup mets bien les capteurs a jour
Je comprends bien evidemment pas pour quoi mais j'epère que ca va durer
Me reste à me repencher sur le mode hors gel
Pour info j'ai remplacé tous les
--commandArray[#commandArray+1]
de la fonction chclefiltration par des
UpdateDev(
et depuis trois jours tous les 1/4 heures les script fonctionne parfaitement et du coup mets bien les capteurs a jour
Je comprends bien evidemment pas pour quoi mais j'epère que ca va durer
Me reste à me repencher sur le mode hors gel
-
samourai47
- Messages : 286
- Inscription : 04 déc. 2018, 19:44
Re: Domotique Piscine
Et zut...
Aujourd'hui, le script ne s'est pas mis à jour (enfin la fonction chkfiltration) derniere analyse a 18h16 et depuis plus rien
C'est a n'y rien comprendre.....
Je crois bien que je vais laisser tomber...car je ne suis pas pro de lau et un probleme aleatoire comme ca c'est a devenir fou.... Ca a marcher tiptop du 24 janvier au 4 février
Aujourd'hui, le script ne s'est pas mis à jour (enfin la fonction chkfiltration) derniere analyse a 18h16 et depuis plus rien
C'est a n'y rien comprendre.....
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
--]]
-- Paramètres
local dbPath = "/home/pi/domoticz/domoticz.db"
local gst_HorsGel = false -- gestion ou non du mode hors gel
local dev_TAir = "T° Terrasse" -- Température extérieure (nécessaire seulement pour le mode hors gel)
--print(otherdevices_svalues[dev_TAir])
--print(string.match(otherdevices_svalues[dev_TAir], "(%d+%.*%d*)"))
local dev_TEau = "T° Bassin" -- Température eau piscine
local dev_PpeFl = "Pompe" -- Interrupteur de commande de la pompe
local dev_ModeFl = "Auto_HC/HP" -- Selecteur du mode de la pompe (Manu/Auto HC/AutoHP)
local dev_cptFl = "Conso_Piscine" -- Compteur de consommation électrique piscine
local dev_HC = "Témoin_HC" -- Indicateur d'heure creuses EdF
local tps_Fl = "Durée filtration" -- Capteur texte pour afficher le temps de filtration en minutes
local eff_Fl = "Filtration effectuée" -- Capteur texte pour afficher le temps en cours de filtration
local rest_Fl = "Restant filtration"
local heure_Fl = "Debut filtration" -- Capteur texte pour afficher l'heure de début de filtration
local fin_Fl = "Fin filtration" -- Capteur texte pour afficher l'heure de fin de filtration
local tp_moye = "T° Moyenne Piscine" -- Capteur texte pour afficher la température moyenne de la piscine
local tp_moyen = "T° Piscine moyenne"
local tps_Flh = "Durée filtration hh" -- Capteur texte pour afficher la durée de filtration en heuree moyenne de la piscine
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=12 -- Débit nominal de la pompe de filtration en m3/h
local cst_Pisc_V =48 -- 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 =800 -- 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, dev_TAir, MidiSol, DebutFiltration, dureeFiltration, HDebFilt, dureeFiltrationH
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")
UpdateDev('T° moyenne Piscine', 0, val_TEau)
--UpdateDev('T° Piscine moyenne', 0, val_TEau)
--dureeFiltration=round(60*math.max(2,cst_Adj*cst_Pisc_V/cst_PpeFl_Qn*(val_TEau-10)),0) -- Résultat en minutes
dureeFiltration=round(60*math.max(2,math.min(12,cst_Adj*cst_Pisc_V/cst_PpeFl_Qn*(val_TEau-10))),0) -- limite à 12h par jour, min 2h
dureeFiltrationH=os.date("%H:%M", dureeFiltration*60-3600)
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
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, dev_TAir, val_TAir, eff_Fl, PpeRest, PpeRestH, HFinFilt, HDebFilt,PpeStartH
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=tonumber(otherdevices_svalues[dev_TEau])
val_PpeFl=otherdevices[dev_PpeFl]
--print('device => -'..dev_TEau.. '-svalues dev_TEau => -'..otherdevices_svalues[dev_TEau]..'-')
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('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)
--UpdateDev('Filtration effectuée', 0, PpeFait.." minutes sur "..PpeDuree)
-- Calcul du temps restant de filtration
PpeRest=PpeDuree-PpeFait
PpeRestH=os.date("%H:%M", PpeRest*60-3600)
PpeFaitH=os.date("%H:%M", PpeFait*60-3600)
PpeDureeH=os.date("%H:%M", PpeDuree*60-3600)
if (PpeRest > 0) then
print("Temps restant de filtration piscine : " ..PpeRestH.." heures ")
UpdateDev('Restant filtration', 0, PpeRestH.." heures ")
--commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[rest_Fl]..'|0|'..PpeRestH..' heures'}
else
print("Filtration piscine finie")
UpdateDev('Restant filtration', 0, 'Arrêtée')
--commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[rest_Fl]..'|0|'..'Arrêtée'}
end
-- Calcul de l'heure de fin de filtration
HFinFilt=os.date("%H:%M", ((PpeStart*60-3600)+(PpeDuree*60)))
PpeStartH=os.date("%H:%M", PpeStart*60-3600)
print("Fin de la filtration a : "..HFinFilt)
--UpdateDev('Fin filtration', 0, HFinFilt)
--commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[fin_Fl]..'|0|'..HFinFilt}
UpdateDev('Bilan filtration', 0, "Début:"..PpeStartH.." Fin: "..HFinFilt.."\n Fait: "..PpeFaitH.." sur: "..PpeDureeH)
--commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[tps_Fl]..'|0|'..'Début: '..PpeStartH..';'..' Fin: '..HFinFilt..';'..'\n Durée: '..PpeDuree..';'..' Fait: '..PpeFait}
if (MinDuJour >= PpeStart and PpeFait < PpeDuree and val_PpeFl == "Off") then
print("Filtration piscine : Démarrage par timer")
UpdateSw(dev_PpeFl,'On')
elseif val_PpeFl == "On" and (PpeFait >= PpeDuree or MinDuJour>=Min_last_stop) 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
-- Conversion température piscine depuis la variable en nombre
Temp_piscine_H = tonumber(uservariables['temppiscine'])
-- Conversion températeure piscine temps réel en nombre
Temp_piscine = tonumber(Temp_piscine)
--]]
--val_TAir = tonumber(otherdevices_temperature[dev_TAir])
--val_TAir = tonumber(dev_TAir)
--val_TAir = tonumber(uservariables['dev_TAir'])
val_TAir = tonumber(otherdevices_svalues[dev_TAir])
--val_TAir = string.match(otherdevices_svalues[dev_TAir], "(%d+%.*%d*)")
--print("temperature de l'air" ..otherdevices_svalues[dev_TAir])
--print("temperature de l'air" .. val_TAir)
print('device => -'..dev_TAir.. '-svalues dev_TEau => -'..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 ==01 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
Bonjour,
il me semble que j'ai le même problème. Cependant, en voyant vos commentaires et solutions préconisées je ne pense pas être capable de résoudre ce mystère
Que pensez-vous des nouveaux robots de piscine avec système de filtration intégré? mon bassin de 12m est de taille idéal pour un électrique, je me disais que ce pourrait être une solution facile et rapide à mon problème
il me semble que j'ai le même problème. Cependant, en voyant vos commentaires et solutions préconisées je ne pense pas être capable de résoudre ce mystère
Que pensez-vous des nouveaux robots de piscine avec système de filtration intégré? mon bassin de 12m est de taille idéal pour un électrique, je me disais que ce pourrait être une solution facile et rapide à mon problème
Re: Domotique Piscine
Bonjour,
Après avoir installé le script (p.16) je rencontre l'erreur suivante :
cela correspond à cette ligne :
j'ai réussi à debugger d'autres erreurs , mais je bloque sur celle-ci ...
Est-ce en lien avec Sqlite3 ?
j'ai bien Sqlite3 d'installé et j'ai indiqué le chemin de la domoticz.db dans les parametres du script ("local dbPath"). Y-a-t-il autre chose à faire à ce niveau là ?
voici le script complet :
merci d'avance pour votre aide.
Après avoir installé le script (p.16) je rencontre l'erreur suivante :
Code : Tout sélectionner
Error: EventSystem: in Filtration_Piscine: [string "--[[ Script de gestion de la piscine ..."]:229: attempt to perform arithmetic on a string valueCode : Tout sélectionner
PpeFait=os.capture('sqlite3 '..dbPath..' "select sum(value3) from multimeter where devicerowid='..otherdevices_idx[dev_cptFl]..' and Date(date)=\''..today..'\'"')*5/cst_PpeFl_W
Est-ce en lien avec Sqlite3 ?
j'ai bien Sqlite3 d'installé et j'ai indiqué le chemin de la domoticz.db dans les parametres du script ("local dbPath"). Y-a-t-il autre chose à faire à ce niveau là ?
voici le script complet :
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 = false -- gestion ou non du mode hors gel
local dev_TAir = "Module Extérieur" --"Température Extérieure" idx 46 -- Température extérieure (nécessaire seulement pour le mode hors gel)
--print(otherdevices_svalues[dev_TAir])
--print(string.match(otherdevices_svalues[dev_TAir], "(%d+%.*%d*)"))
local dev_TEau = "Temperature Piscine" --"Température piscine" idx 106-- Température eau piscine
--print(otherdevices_svalues[dev_TEau])
--print(string.match(otherdevices_svalues[dev_TEau], "(%d+%.*%d*)"))
local dev_PpeFl = "Pompe Piscine" --"Filtration piscine" idx 110-- Interrupteur de commande de la pompe
local dev_ModeFl = "Mode filtration piscine" --"Mode filtration piscine" idx 104-- Selecteur du mode de la pompe (Manu/Auto HC/AutoHP)
local dev_cptFl = "Consommation Piscine" --"Consommation Piscine" idx 109-- Compteur de consommation électrique piscine
local dev_HC = "Heures creuses EDF" --"Heures creuses EDF" idx 108-- 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 fin_Fl = "Fin filtration" -- 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 08/04/2020 22:01
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")
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 merci d'avance pour votre aide.
Pi3b+ SSD
Zigbee Conbee II + Philips hue +Variateurs +smart buttons
Station meteo Netatmo
Plusieurs ESP8266 sous ESPEASY + DS18B20 + BMP280 +Relais
Zigbee Conbee II + Philips hue +Variateurs +smart buttons
Station meteo Netatmo
Plusieurs ESP8266 sous ESPEASY + DS18B20 + BMP280 +Relais