Bonjour à tous,
Déjà merci à @aleph0 pour sont script fort inspirant !
donc j'ai pour objectif de contrôler la pompe de filtration de la piscine (tiens donc !)
mais je ne souhaite pas aller aussi loin et partir sur quelque chose de plus simple, du moins plus adapté à mon utilisation.
Le but :
en mode "normal" : filtration calculé en divisant la température moyenne par 2. Début calculer en fonction du midi solaire ça change pas.
par contre du coup je filtre jusqu'à midi et reprends à partir de 14H. (pour être tranquille le midi car la pompe fait un peu de bruit) .
en cas de température eau < 12 ° du coup je passe en filtrage 2H matin 2h soir.
le script génère 4 variable avec les heures de démarrage arrêt.
Code : Tout sélectionner
local dbPath = "/opt/domoticz/domoticz.db"
local gst_HorsGel = true -- gestion ou non du mode hors gel
local dev_TAir = "Temperature Jardin" -- Température extérieure (nécessaire seulement pour le mode hors gel)
local dev_TEau = "Piscine Temp" -- Température eau piscine
local var_PPStart = "PpePiscStart" -- Variable contenant l'heure de départ de la filtration
local var_PPStop = "PpePiscStop" -- Variable contenant l'heure de fin de la filtration
local var_PPStart_midi = "PpePiscStart_midi" -- Variable contenant l'heure de départ de la filtration après midi (14h ou 16h en hyvernage)
local var_PPStop_midi = "PpePiscStop_midi" -- Variable contenant l'heure de fin de la filtration à midi (ou 11h en hyvernage)
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 CalcFiltration()
local val_TEau, DebutFiltration, dureeFiltration, val_TAir
val_TAir=os.capture('sqlite3 '..dbPath..' "select temp_avg from temperature_calendar where devicerowid='..otherdevices_idx[dev_TAir]..' order by date desc limit 1"')
val_TAir=round(val_TAir,1)
print("Température AIR moyenne hier : "..val_TAir.." °C")
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 EAU moyenne hier : "..val_TEau.." °C")
--val_TEau2 = tonumber(string.match(otherdevices_svalues[dev_TEau],"(%d+.%d*);.*"))
--print("Val_TEau2 : "..val_TEau2.." °C")
if (val_TEau >= 12) then
-- if (val_TEau >= 25) then
dureeFiltration=val_TEau/2*60 -- Résultat en minutes
print("Durée de filtration : "..dureeFiltration.." min")
MidiSol=round((timeofday['SunriseInMinutes']+timeofday['SunsetInMinutes'])/2,0) -- en minutes
DebutFiltration=round(MidiSol-dureeFiltration/2,0) -- en minutes
print("VAR debut filtration : "..DebutFiltration)
FinFiltration=(dureeFiltration-(720-DebutFiltration))+840
print("VAR fin filtration : "..FinFiltration)
HDebFilt=os.date("%H:%M", DebutFiltration*60-3600)
HFinFilt=os.date("%H:%M", FinFiltration*60-3600)
print("Début de filtration : "..HDebFilt)
print("Début de filtration : "..HFinFilt)
UpdateVar(var_PPStart,HDebFilt)
UpdateVar(var_PPStop,HFinFilt)
UpdateVar(var_PPStart_midi,"14:00")
UpdateVar(var_PPStop_midi,"12:00")
else
print("température eau < 12 : mode hyvernage")
UpdateVar(var_PPStart,"09:00")
UpdateVar(var_PPStop,"18:00")
UpdateVar(var_PPStart_midi,"16:00")
UpdateVar(var_PPStop_midi,"11:00")
end
end
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 ==37 then CalcFiltration() end
return commandArray
j'ai repris une grosse partie du code (dont des fonction que je n'utilise pas, je ferais le ménage plus tard)
maintenant il faut que je contrôle la pompe, je souhaite faire un sélecteur 4 états :
- Full OFF (pour la maintenance) : aucun déclenchement de la pompe accepter
- mode AUTO : gestion via les 4 variables
- mode MANU : pompe à ON
- j'ai dis 4 état car j'ai réfléchit à ça cette nuit mais je ne me rappelle plus pourquoi xD j'éditerais si ça me reviens
du coup là par contre je ne sais pas trop comment gérer le truc. Si il y a une âme charitable qui pourrais m'accompagner dans cette tâche ce serait super sympa (sans forcément pondre un code tout prêt déjà une idée de comment gérer le truc)
Vous remerciant par avance
Cordialement
edit :
bon je pense avoir trouver, je lance la fonction ChkFiltration toute les minutes, et dedans quelques if et ça marche
Code : Tout sélectionner
local dbPath = "/opt/domoticz/domoticz.db"
local gst_HorsGel = true -- gestion ou non du mode hors gel
local dev_TAir = "Temperature Jardin" -- Température extérieure (nécessaire seulement pour le mode hors gel)
local dev_TEau = "Piscine Temp" -- Température eau piscine
local dev_ModeFl = "Filtration Piscine" -- Selecteur du mode de la pompe (Manu/Auto/Off)
local var_PPStart = "PpePiscStart" -- Variable contenant l'heure de départ de la filtration
local var_PPStop = "PpePiscStop" -- Variable contenant l'heure de fin de la filtration
local var_PPStart_midi = "PpePiscStart_midi" -- Variable contenant l'heure de départ de la filtration après midi (14h ou 16h en hyvernage)
local var_PPStop_midi = "PpePiscStop_midi" -- Variable contenant l'heure de fin de la filtration à midi (ou 11h en hyvernage)
local dev_PpeFl = "Pompe Piscine" -- Interrupteur de commande de la pompe
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 CalcFiltration()
local val_TEau, DebutFiltration, dureeFiltration, val_TAir
val_TAir=os.capture('sqlite3 '..dbPath..' "select temp_avg from temperature_calendar where devicerowid='..otherdevices_idx[dev_TAir]..' order by date desc limit 1"')
val_TAir=round(val_TAir,1)
print("Température AIR moyenne hier : "..val_TAir.." °C")
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 EAU moyenne hier : "..val_TEau.." °C")
--val_TEau2 = tonumber(string.match(otherdevices_svalues[dev_TEau],"(%d+.%d*);.*"))
--print("Val_TEau2 : "..val_TEau2.." °C")
if (val_TEau >= 12) then
-- if (val_TEau >= 25) then
dureeFiltration=val_TEau/2*60 -- Résultat en minutes
print("Durée de filtration : "..dureeFiltration.." min")
MidiSol=round((timeofday['SunriseInMinutes']+timeofday['SunsetInMinutes'])/2,0) -- en minutes
DebutFiltration=round(MidiSol-dureeFiltration/2,0) -- en minutes
-- print("VAR debut filtration : "..DebutFiltration)
FinFiltration=(dureeFiltration-(720-DebutFiltration))+840
-- print("VAR fin filtration : "..FinFiltration)
HDebFilt=os.date("%H:%M", DebutFiltration*60-3600)
HFinFilt=os.date("%H:%M", FinFiltration*60-3600)
-- print("Début de filtration : "..HDebFilt)
-- print("Début de filtration : "..HFinFilt)
UpdateVar(var_PPStart,HDebFilt)
UpdateVar(var_PPStop,HFinFilt)
UpdateVar(var_PPStart_midi,"14:00")
UpdateVar(var_PPStop_midi,"12:00")
else
print("température eau < 12 : mode hyvernage")
UpdateVar(var_PPStart,"09:00")
UpdateVar(var_PPStop,"18:00")
UpdateVar(var_PPStart_midi,"16:00")
UpdateVar(var_PPStop_midi,"11:00")
end
end
function ChkFiltration()
local MinDuJour, PpeStart, PpeStop_midi, PpeStart_midi, PpeStop
-- print("Script Piscine : Gestion de la filtration")
PpeStart=tonumber(string.sub(uservariables[var_PPStart],1,2))*60+tonumber(string.sub(uservariables[var_PPStart],4,5))
PpeStop_midi=tonumber(string.sub(uservariables[var_PPStop_midi],1,2))*60+tonumber(string.sub(uservariables[var_PPStop_midi],4,5))
PpeStart_midi=tonumber(string.sub(uservariables[var_PPStart_midi],1,2))*60+tonumber(string.sub(uservariables[var_PPStart_midi],4,5))
PpeStop=tonumber(string.sub(uservariables[var_PPStop],1,2))*60+tonumber(string.sub(uservariables[var_PPStop],4,5))
-- print("debut filtration : "..PpeStart.." min")
-- print("fin filtration midi : "..PpeStop_midi.." min")
-- print("debut filtration midi : "..PpeStart_midi.." min")
-- print("fin filtration : "..PpeStop.." min")
MinDuJour=60*time.hour+time.min
-- print("MinDuJour : "..MinDuJour.." min")
if (otherdevices[dev_ModeFl] == "Auto") then
if (MinDuJour == PpeStart or MinDuJour == PpeStart_midi) then
UpdateSw(dev_PpeFl,'On')
print("Démarrage de la pompe piscine")
else
if (MinDuJour == PpeStop_midi or MinDuJour >= PpeStop and otherdevices[dev_PpeFl] == "On") then -- >= à PpeStop pour stop la pompe même si l'heure est passé etle check de dev_PpeFl à ON permet d'éviter le spam de log "stop"
UpdateSw(dev_PpeFl,'Off')
print("Arrêt de la pompe piscine")
end
end
end
end
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 check toute les minutes
if(time.min) % 1 == 0 then ChkFiltration() end
return commandArray
un autre script me permet de gérer les mode OFF et Manuel du selecteur (mode device)
Code : Tout sélectionner
commandArray = {}
-- Commande Selector Switch
if (devicechanged['Filtration Piscine'] == 'Off' ) then
commandArray[1]={['Pompe Piscine']='Off'}
else
if (devicechanged['Filtration Piscine'] == 'Manuel' ) then
commandArray[1]={['Pompe Piscine']='On'}
end
end
return commandArray
check toute les minutes c'est peut être pas le plus optimum mais ça doit faire le café. A voir les prochaines jours si ça fait ce que je veux
