Domotique Piscine

Vous avez des questions concernant les scripts dans Domoticz, posez vos questions ici, quelque soit le langage nous tenterons des réponses pertinentes ...
MAidEN91
Messages : 98
Enregistré le : 01 sept. 2015, 20:50

Re: Domotique Piscine

Message par MAidEN91 » 21 août 2019, 14:17

aleph0 a écrit :
20 août 2019, 10:33
match... ? Ça devrait pas être string.match plutôt ?

Envoyé de mon moto g(6) en utilisant Tapatalk
Effectivement c'est bien string.match et pas match tout court bien vu! ;)

Je continue le debug !
Domoticz Stable
RPi 2 / RFXTrx433e
Sondes Oregon / 1 Wire / Prises Chacon
Téléinfo / Custom Page

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


samourai47
Messages : 39
Enregistré le : 04 déc. 2018, 19:44

Re: Domotique Piscine

Message par samourai47 » 29 sept. 2019, 10:23

Hello
Allez je me lance. Piscine de cet été et je vais mettre à profit l'automne pour installer ce script sur mon RP1 2. J'ai pris me semble t il la dernière version dispo en page 16 (compile de gardaux)

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    = "T° Terrasse"           --"Température Extérieure"  idx 46 -- Température extérieure (nécessaire seulement pour le mode hors gel)
local dev_TEau    = "T° Piscine IN"            --"Température piscine"     idx 106-- Température eau piscine
local dev_PpeFl   = "Pompe"                 --"Filtration piscine"      idx 110-- Interrupteur de commande de la pompe
local dev_ModeFl  = "Auto_HC/HP"            --"Mode filtration piscine" idx 104-- Selecteur du mode de la pompe (Manu/Auto HC/AutoHP)
local dev_cptFl   = "Conso_Piscine"         --"Consommation Piscine"    idx 109-- Compteur de consommation électrique piscine
local dev_HC      = "Témoin_HC"             --"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=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, 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

    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
    
    print("Script Piscine : Gestion de la filtration")

    PpeDuree=tonumber(uservariables[var_PPDuree])

    if (otherdevices[dev_ModeFl] ~= "Manu") then
        val_TEau = tonumber(string.match(otherdevices_svalues[dev_TEau],"(%d+.%d*);.*"))
        val_PpeFl=otherdevices[dev_PpeFl]

        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)
         
            -- 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 = tonumber(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 ==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
Déjà plusieurs problèmes.

---- Le script installé en time s'execute bien mais j'ai ce message
Error: EventSystem: in Filtration: [string "--[[ Script de gestion de la piscine..."]:216: attempt to compare number with nil

Le path est déclaré dans le script, sqlite3 installé. Dois je le déclarer ailleurs?

----- Le compteur de consommation est mis a jour régulièrement mais avec une valeur de 0. Par contre les autres compteurs texte n'ont pas etes mis a jour depuis leur création. (hier)

La sonde température piscine est une ds18b20

---- Dans les logs je n'ai aucune valeur qui s'affiche...

---- quand je veux modifier la valeur du selecteur MAnu/Hc/Hp, j'ai un message d'erreur
Erreur d'envoi de la commande à l’interrupteur, vérifiez le dispositif/matériel !

C'est un selecteur Light/sxtch /switch/ selector....

Bizarre

Bref un petit (gos coup de main ) sera le bienvenu
Merci d'avance

samourai47
Messages : 39
Enregistré le : 04 déc. 2018, 19:44

Re: Domotique Piscine

Message par samourai47 » 29 sept. 2019, 10:56

Bon je commence a me répondre.....
J'ai confondu presence du paquet sql et installation. Du coup le paquet n'etait pas installé ce qui est le cas maintenant
- toujours l'erreur toutes les 15 minutes
2019-09-29 12:16:00.161 Error: EventSystem: in Filtration: [string "--[[ Script de gestion de la piscine..."]:216: attempt to compare number with nil
2019-09-29 12:31:00.378 Error: EventSystem: in Filtration: [string "--[[ Script de gestion de la piscine..."]:216: attempt to compare number with nil
- Les valeurs restent a 0 et rien ne s'affiche dans les logs
- Probleme du selecteur toujours présent

denis_brasseur
Messages : 236
Enregistré le : 24 déc. 2018, 17:05
Localisation : (26)

Re: Domotique Piscine

Message par denis_brasseur » 29 sept. 2019, 14:44

samourai47 a écrit :
29 sept. 2019, 10:56
Bon je commence a me répondre.....
J'ai confondu presence du paquet sql et installation. Du coup le paquet n'etait pas installé ce qui est le cas maintenant
- toujours l'erreur toutes les 15 minutes
2019-09-29 12:16:00.161 Error: EventSystem: in Filtration: [string "--[[ Script de gestion de la piscine..."]:216: attempt to compare number with nil
2019-09-29 12:31:00.378 Error: EventSystem: in Filtration: [string "--[[ Script de gestion de la piscine..."]:216: attempt to compare number with nil
- Les valeurs restent a 0 et rien ne s'affiche dans les logs
- Probleme du selecteur toujours présent
Essaie un

Code : Tout sélectionner

print('device => -'..dev_TEau.. '-svalues dev_TEau => -'..otherdevices_svalues[dev_TEau]..'-')
juste avant la ligne 216

Code : Tout sélectionner

if (val_TEau >= 12) then
et donne nous tes logs
Domoticz + Raspberry Pi3 + Disque Dur PiDrive + RFXtrx433
10 Getdio 54755 (gestion chauffage)
2 CHACON 34131 (détecteur fumées)
5 Bresser Capteur thermo/hygro RC 5CH
2 CHACON DiO 54781 (contacteur porte)
OWL Micro+ CM180
Module D2L LINKY

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


samourai47
Messages : 39
Enregistré le : 04 déc. 2018, 19:44

Re: Domotique Piscine

Message par samourai47 » 29 sept. 2019, 15:37

2019-09-29 15:31:00.271 Status: LUA: Script Piscine : Gestion de la filtration
2019-09-29 15:31:00.271 Status: LUA: device => -T° Piscine IN-svalues dev_TEau => -23.9-
2019-09-29 15:31:00.271 Error: EventSystem: in Filtration: [string "--[[ Script de gestion de la piscine..."]:216: attempt to compare number with nil

A priori il trouve bien la valeur de la température de l'eau?

De plus ce capteur de selection m'enervait. Je l'ai supprimé et recree differement. Il fonctionne et me donne bien la valeur HP ou HC ou MAnu

J'avance......

samourai47
Messages : 39
Enregistré le : 04 déc. 2018, 19:44

Re: Domotique Piscine

Message par samourai47 » 29 sept. 2019, 18:10

Bien alors. J'ai modifie la ligne de la température de l'eau car j'ai une sonde sans humidité. J'ai donc mis ceci

Code : Tout sélectionner

--val_TEau = tonumber(string.match(otherdevices_svalues[dev_TEau],"(%d+.%d*);.*"))
val_TEau=tonumber(otherdevices_svalues[dev_TEau])
Du coup plus d'erreur et apparaisent les capteurs txt qui sont mis a jour (sauf celui du temps de filtration). Mais ils sont à 0
J'attends demain pour voir si ca a bougé?

2019-09-29 18:01:00.310 Status: LUA: Script Piscine : Gestion de la filtration
2019-09-29 18:01:00.310 Status: LUA: device => -T° Piscine IN-svalues dev_TEau => -23.9-
2019-09-29 18:01:00.349 Status: LUA: Déjà effectué : 0 minutes sur 0
2019-09-29 18:01:00.349 Status: LUA: Filtration piscine finie
2019-09-29 18:01:00.349 Status: LUA: Début de filtration : 00:00
2019-09-29 18:01:00.349 Status: LUA: Fin de la filtration a : 00:00
2019-09-29 18:01:00.362 Status: EventSystem: Script event triggered: Filtration

samourai47
Messages : 39
Enregistré le : 04 déc. 2018, 19:44

Re: Domotique Piscine

Message par samourai47 » 30 sept. 2019, 11:05

J'avance bien mais...
Le script c'est bien lancé ce matin, les variables bien claculéés (466mn) (10h03) et l'interrupteur démarré à 10h16 .
Me reste des petits soucis
-> dans les logs ne sont pas affichés malgré un print les valeurs de température moyenne et de temps de flitration
-> Du coup le capteur txt du temps de filtration n'est pas mis à jour, alors que celui ci est bien calculé

2019-09-30 11:00:46.081 (Capteur luminosite) Lux (Capteur Luminosité Domo)
2019-09-30 11:01:00.630 Status: LUA: Script Piscine : Gestion de la filtration
2019-09-30 11:01:00.670 Status: LUA: Déjà effectué : 45 minutes sur 466
2019-09-30 11:01:00.670 Status: LUA: Temps restant de filtration piscine : 421 minutes
2019-09-30 11:01:00.670 Status: LUA: Début de filtration : 10:03
2019-09-30 11:01:00.670 Status: LUA: Fin de la filtration a : 17:49
2019-09-30 11:01:00.683 Status: EventSystem: Script event triggered: Filtration
2019-09-30 11:01:04.083 (Module Rfxcom) Temp (T° Chambre Parentale)

Le script

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    = "T° Terrasse"           --"Température Extérieure"  idx 46 -- Température extérieure (nécessaire seulement pour le mode hors gel)
local dev_TEau    = "T° Piscine IN"            --"Température piscine"     idx 106-- Température eau piscine
local dev_PpeFl   = "Pompe"                 --"Filtration piscine"      idx 110-- Interrupteur de commande de la pompe
local dev_ModeFl  = "Auto_HC/HP"            --"Mode filtration piscine" idx 104-- Selecteur du mode de la pompe (Manu/Auto HC/AutoHP)
local dev_cptFl   = "Conso_Piscine"         --"Consommation Piscine"    idx 109-- Compteur de consommation électrique piscine
local dev_HC      = "Témoin_HC"             --"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=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, 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

    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
    
    print("Script Piscine : Gestion de la filtration")

    PpeDuree=tonumber(uservariables[var_PPDuree])

    if (otherdevices[dev_ModeFl] ~= "Manu") then
       --val_TEau = tonumber(string.match(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
            -- 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 = tonumber(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 ==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

samourai47
Messages : 39
Enregistré le : 04 déc. 2018, 19:44

Re: Domotique Piscine

Message par samourai47 » 01 oct. 2019, 09:40

Bon je me sent un peu tout seul mais je continue et j'avance petit à petit

Donc le script a fonctionné impec hier. J'ai rajouté deux capteurs txt pour afficher la température moyenne et la duréee de filtration prévue;
Mais ca ne s'est pas mis à jour cette nuit.... comprends pas pourquoi
LA moyenne

Code : Tout sélectionner

 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")
    commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[temp_moye]..'|0|'..tonumber(val_TEau)..' °'}
La durée

Code : Tout sélectionner

dureeFiltration=round(60*math.max(0,cst_Adj*cst_Pisc_V/cst_PpeFl_Qn*(val_TEau-10)),0) -- Résultat en minutes 
    print("Durée de filtration : "..dureeFiltration.." min")
    commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[tps_Fl]..'|0|'..tonumber(dureeFiltration)..' min'}
Et comme je n'ai que 3 heures de logs qui s'affichent.... dur de voir ce qui se passe à 00:01. Je vais essayer de modifier cette heure pour faire des essais?

Enfin une question sur le mode Manu. quel est son rôle exact?

Merci d'avance

aleph0
Messages : 231
Enregistré le : 27 avr. 2016, 08:06
Localisation : Hérault (34)

Re: Domotique Piscine

Message par aleph0 » 01 oct. 2019, 10:16

Salut !

Non, t'inquiète, tu n'es pas tout seul :P on te regarde progresser du coin de l'œil et si tu bloques sur un truc, on sera là pour te débloquer ;-) La façon dont tu progresse est la meilleure pour prendre en main le script et comprendre comment il marche :-)

Pour voir dans les logs plus loin que 3h il faut aller voir le fichier de log de domoticz dans linux, pas seulement lire dans le navigateur web. L'emplacement du fichier dépends de ta config, chez moi il est dans /opt/domoticz/log/domoticz.log mais je crois pas que c'est le standard :-P

Pour l'affichage dans les capteurs textes, remplace to_number(val_TEau) par to_string(val_TEau), ça devrait aller mieux

samourai47
Messages : 39
Enregistré le : 04 déc. 2018, 19:44

Re: Domotique Piscine

Message par samourai47 » 01 oct. 2019, 16:59

Ouf je suis rassuré...
J'ai fait la modif et je verrai demain si le capteur est bien mis a jour

Essayant de comprendre, je lis la formule de calcul de la durée de filtration. Pour une pompe de 12 un bassin de 48m3 et une tempéraure moyenne par exemple de 24° si je retranscrit la ligne de calcul

dureeFiltration=round(60*math.max(0,cst_Adj*cst_Pisc_V/cst_PpeFl_Qn*(val_TEau-10)),0) -- Résultat en minutes

Ça devrait ressembler à ceci?
60 (0,175*48/12*(24-10))
Mais çà me donne pas de résultat cohérent puisque je devrais avoir environ 550/600 minutes

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Répondre