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