Domotique Piscine

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
vwstepha
Messages : 85
Inscription : 20 nov. 2014, 15:15

Re: Domotique Piscine

Message par vwstepha »

Salut a tous
Apres des péripéties personnelles, j'ai avancé un peu
Je me suis créer un bypass ou j'ai mis 3 collier de prise en charge en 50mm diamètre (acheté 2€80 pièce chez Irijardin) sans vouloir faire de la pub - mais c'est pas cher!)
j'ai percer et mis ma sonde étanche ds18b90 raccordé un Wemos d1 (non pro) - je capte le wifi -89 dB (vraiment limite mais c est ok)
Mais la ca se corse
J'ai acheté une sonde PH et une sonde ORP chez Aliexpress
J'ai finalement acheté 2 phidget 1350 comme carte adaptatrice pour ces 2 sondes
les phidgets sont connecte a un ads1115 pour adapter la tension
mais je comprends pas trop les valeurs relevées et la formule que je dois écrire dans Espeasy

Code : Tout sélectionner

valeur affiché dans EspEasy         type liquide            valeur PH etalonnée
6405                                              citron jaune dilué                2.7   
6475                                               citron vert                            2.8
7705                                               eau distillé                           3.6
12600                                              tube demi vide                    6.8
12880                                              tampon                                7.0
12917                                               eau piscine                           7.1
13218                                               eau robinet                           7.3
Je sais pas comment determiné la formule que je dois mettre tout en bas de EspEasy

Si quelqu'un pourrait m'aider? MErci :roll:
Rpi 2B Dz V2023.2 master ;)
Rpi 3B Dz V2023.2 slave + Rflink + USB ZWAVE+ + Rflink RTS (marche pas..} :ugeek:
Rpi 3B with RapItow 8-)
Xiaomi V2 + acc
SP3
2xVR + 3xPC DIO Chacon
5x1 voie Sonoff (4 d'origine....1 seul flashé)
yan1950
Messages : 235
Inscription : 15 mai 2017, 14:56
Localisation : Anjou

Re: Domotique Piscine

Message par yan1950 »

Bonsoir
As-tu regardé ce sujet;
https://easydomoticz.com/forum/viewtopi ... 043#p98043
Bonne nuit
Yannick
Darkneo
Messages : 68
Inscription : 16 déc. 2018, 08:50

Re: Domotique Piscine

Message par Darkneo »

Hello à tous,

Je sais que le topic est (assez) vieux, mais je viens tout juste de me lancer dans la domotisation de ma piscine, principalement pour le temps de filtration !

Et comme pas mal de monde, j'aurai aimé faire quelques adaptations, mais je sais pas trop par ou commencé (et je sais même pas si aleph0 est encore sur le forum...

En gros, j'aimerai pouvoir adapter les HP et les HC à mon cas. De ce que je semble avoir compris du script, la pompe tourne de minuit à 7h, et plus si besoin (en HP du coup). Dans mon cas, mes HC sont de 3.00 a 8.00 le matin, et de 13.30 a 16.30.

Au final, je voudrais:
- Maximiser le fonctionnement entre 13.30 et 16.30 (en fonction de la valeur de dureeFiltration)
- Si besoin (mais normalement ca sera la cas) faire le complément de dureeFiltration entre 3.00 et 8.00.
- Si encore besoin, rajouter le reste de dureeFiltration après 16.30.

Je pense qu'il faut changer le passage

Code : Tout sélectionner

    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)
mais j'avoue avoir du mal a savoir comment gérer la mise à jour du bloc de code... Je ne sais pas si quelqu'un a déjà fait une modif similaire, ou pourrait m'orienter pour gérer ce cas de figure?

Merci d'avance
Martial
Messages : 201
Inscription : 03 mars 2017, 18:58

Re: Domotique Piscine

Message par Martial »

Bonjour @Darkneo,
Perso, je trouve contre productif de filtrer la nuit.
Il a toujours été conseillé de filtrer en priorité pendant les périodes ensoleillées et de baignade.
Toi, tu as de l'HC entre 13h30 et 16h30, c'est une chance.
Je pense que le mieux est que tu centres ta filtration non pas sur le midi solaire (cas HP) mais sur 15h, le milieu de ta tranche HC

Code : Tout sélectionner

 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=math.max(540,round(MidiSol-dureeFiltration/2,0)) -- en minutes
    end
Je pense que l'adaptation de cette partie du code est simple: tu fais MidiSol=15*60 et le tour est joué.
Darkneo
Messages : 68
Inscription : 16 déc. 2018, 08:50

Re: Domotique Piscine

Message par Darkneo »

Hello @Martial et merci pour la réponse (rapide!)

Je suis assez d'accord, filtrer la nuit est à mon avis aussi un non sens... De plus, on m'a toujours conseillé de "morceler" la filtration, chose qu'il faudrait aussi que j'adapte dans le script...

Et je suis en train de me demander si ce script va fonctionner sur mon infra de toute façon (pour l'anecdote, Domoticz est sur un Synology, et sauf erreur je ne pense pas avoir SQLITE3 dessus...).

Donc plus je triture le code, et plus je me dis qu'au final ce n'est pas "vraiment" ce que je recherche. Je vais donc très certainement m'orienter vers celui d'Olivier81 (ici: https://easydomoticz.com/forum/viewtopic.php?t=6567) et y adapter mes heures de filtration (reste que la moyenne de température de la veille me plaisait bien, mais je suis sur que je dois pouvoir trouver un truc avec ce que me remonte mon capteur de température sans passer par une requête dans la DB)
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Domotique Piscine

Message par Keros »

Perso, j'ai fait 3 plannings horaires et en fonction de la température prévue de la journée, je récupère les infos d'un planning ou d'un autre. De cette façon, s'il fait 20°C (comme en ce moment), la piscine tourne 10 heures et quand il faisait plus de 30° c'est 10h-20h en continu plus 4 heures la nuit.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Darkneo
Messages : 68
Inscription : 16 déc. 2018, 08:50

Re: Domotique Piscine

Message par Darkneo »

Hello et merci pour vos retours.

Je ne désespère pas. Je pense que je vais faire 2 scripts: Un pour le planning de filtration et un pour le calcul de la moyenne de température.

Pourquoi? Ben parcequ'en cherchant, je suis tombé sur ca:
https://www.domoticz.com/wiki/DzVents:_ ... les_API.29

Donc au final, en 4 lignes, je récupère la valeur AVG de ma température de piscine (que j'exécuterai à 23h) pour stocker dans une variable temperature_veille.

A minuit, quand je calcule le planning de filtration, je n'ai plus qu'à tester sur la variable temperature_veille pour savoir quel programme de filtration je lance...

Il ne me reste plus qu'à mettre tout ca en oeuvre :oops:
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Domotique Piscine

Message par Keros »

L'avantage du DzVents est qu'un script peut avoir de multiples déclencheurs. Chaque déclencheur peut exécuter une partie de script. Ainsi, pas besoin d'avoir deux scripts différents pour ce que tu veux faire : tu peux tout mettre dans un script "piscine".

Bon code ;)
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
albebert
Messages : 17
Inscription : 11 nov. 2017, 15:48

Re: Domotique Piscine

Message par albebert »

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 :)
vwstepha
Messages : 85
Inscription : 20 nov. 2014, 15:15

Re: Domotique Piscine

Message par vwstepha »

Salut!
As tu eu le résultat souhaitait?

Pour ma part j'ai pris le script de la page 16
Etonnamment pas d'erreur à l'horizon mais un temps de filtration pour aujourd'hui de seulement 1 minute....

Code : Tout sélectionner

2024-05-11 10:01:00.577  Status: LUA: sqlite3 /home/pi/domoticz/domoticz.db "select sum(value3) from multimeter where devicerowid=91 and Date(date)='2024-05-11'"
2024-05-11 10:01:00.595  Status: LUA: Déjà effectué : 5.0 minutes sur 1
2024-05-11 10:01:00.595  Status: LUA: Filtration piscine finie
2024-05-11 10:01:00.595  Status: LUA: Début de filtration : 10:14
2024-05-11 10:01:00.595  Status: LUA: Fin de la filtration a : 10:15
puis à 13h le temps augmente à 15 minutres

Code : Tout sélectionner

2024-05-11 13:01:00.668  Status: LUA: device => -Temperature Piscine-svalues dev_TEau => -16.25-
2024-05-11 13:01:00.668  Status: LUA: device => Temperature Piscine-svalues dev_TEau => 16.25-
2024-05-11 13:01:00.668  Status: LUA: Requette sqlite
2024-05-11 13:01:00.668  Status: LUA: sqlite3 /home/pi/domoticz/domoticz.db "select sum(value3) from multimeter where devicerowid=91 and Date(date)='2024-05-11'"
2024-05-11 13:01:00.687  Status: LUA: Déjà effectué : 15.0 minutes sur 1
2024-05-11 13:01:00.687  Status: LUA: Filtration piscine finie
2024-05-11 13:01:00.687  Status: LUA: Filtration piscine : Arrêt par timer
2024-05-11 13:01:00.687  Status: LUA: Début de filtration : 10:14
2024-05-11 13:01:00.687  Status: LUA: Fin de la filtration a : 10:15
2024-05-11 13:01:00.713  Status: EventSystem: Script event triggered: alephO
et encore un chagement 15 min plus tard

Code : Tout sélectionner

2024-05-11 13:16:00.212  Status: LUA: Script Piscine : Gestion de la filtration
2024-05-11 13:16:00.213  Status: LUA: device => -Temperature Piscine-svalues dev_TEau => -16.19-
2024-05-11 13:16:00.213  Status: LUA: device => Temperature Piscine-svalues dev_TEau => 16.19-
2024-05-11 13:16:00.213  Status: LUA: Requette sqlite
2024-05-11 13:16:00.213  Status: LUA: sqlite3 /home/pi/domoticz/domoticz.db "select sum(value3) from multimeter where devicerowid=91 and Date(date)='2024-05-11'"
2024-05-11 13:16:00.231  Status: LUA: Déjà effectué : 20.0 minutes sur 1
2024-05-11 13:16:00.231  Status: LUA: Filtration piscine finie
2024-05-11 13:16:00.231  Status: LUA: Filtration piscine : Arrêt par timer
2024-05-11 13:16:00.231  Status: LUA: Début de filtration : 10:14
2024-05-11 13:16:00.231  Status: LUA: Fin de la filtration a : 10:15
2024-05-11 13:16:00.240  Status: EventSystem: Script event triggered: alephO
A cette heure ci, plus de changement.
Par contre mes afficheurs se sont mis à jour qu'a 18h. Seul "Temps filtration" est resté sur Hello World
Etrange, je pensais que le temps de filtration était calculé qu'une seule fois....
voici mon code

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    = "Extérieur"           --"Température Extérieure"  idx 39 -- 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 92-- 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 73-- Interrupteur de commande de la pompe
local dev_ModeFl  = "Mode filtration piscine"            --"Mode filtration piscine" idx 97-- Selecteur du mode de la pompe (Manu/Auto HC/AutoHP)
local dev_cptFl   = "Consommation Piscine"         --"Consommation Piscine"    idx 91-- Compteur de consommation électrique piscine
local dev_HC      = "Heures creuses EDF"             --"Heures creuses EDF"      idx 100-- Indicateur d'heure creuses EdF
local tps_Fl      = "Temps filtration"      -- idx 93 Capteur texte pour afficher le temps de filtration
local rest_Fl     = "Restant filtration"    -- idx 94 Capteur texte pour afficher le temps restant de filtration
local heure_Fl    = "Debut filtration"      -- idx 95 Capteur texte pour afficher l'heure de début de filtration
local fin_Fl      = "Fin filtration"      -- idx 96 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=8               -- Débit nominal de la pompe de filtration en m3/h
local cst_Pisc_V  =24               -- 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 =900              -- 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 automatique --]]

    -- 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]
       print('device => -'..dev_TEau.. '-svalues dev_TEau => -'..otherdevices_svalues[dev_TEau]..'-')
        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 
Si vous avez une idée!
Dernière modification par Keros le 11 mai 2024, 18:57, modifié 2 fois.
Raison : Enorme citation supprimée. Merci de ne pas citer le message précédent lors d'une réponse directe.
Rpi 2B Dz V2023.2 master ;)
Rpi 3B Dz V2023.2 slave + Rflink + USB ZWAVE+ + Rflink RTS (marche pas..} :ugeek:
Rpi 3B with RapItow 8-)
Xiaomi V2 + acc
SP3
2xVR + 3xPC DIO Chacon
5x1 voie Sonoff (4 d'origine....1 seul flashé)
Répondre