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 ...
aleph0
Messages : 202
Enregistré le : 27 avr. 2016, 08:06
Localisation : Hérault (34)

Re: Domotique Piscine

Message par aleph0 » 20 juin 2017, 21:44

Alors, voici le script d'origine complet avec la modif dans la fonction ChkFiltration pour corriger le bug d'une filtration qui se prolongerai après minuit :

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      = "/var/domoticz/domoticz.db"
local gst_HorsGel = true                      -- gestion ou non du mode hors gel

local dev_TAir    = "Température Extérieure"  -- Température extérieure (nécessaire seulement pour le mode hors gel)
local dev_TEau    = "Température piscine"     -- Température eau piscine
local dev_PpeFl   = "Filtration piscine"      -- Interrupteur de commande de la pompe
local dev_ModeFl  = "Mode filtration piscine" -- Selecteur du mode de la pompe (Manu/Auto HC/AutoHP)
local dev_cptFl   = "Consommation Piscine"    -- Compteur de consommation électrique piscine
local dev_HC      = "Heures creuses EDF"      -- Indicateur d'heure creuses EdF

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=6      -- 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.175  -- Coefficient à ajuster en + ou en - pour filtrer plus ou moins longtemps
local cst_PpeFl_W =312    -- 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
    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(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)

            if (MinDuJour >= PpeStart and PpeFait < PpeDuree and val_PpeFl == "Off") then
                print("Filtration piscine : Démarrage par timer")
                UpdateSw(dev_PpeFl,'On')
            elseif val_PpeFl == "On" and (PpeFait >= PpeDuree or MinDuJour>=Min_last_stop) then
                print("Filtration piscine : Arrêt par timer")
                UpdateSw(dev_PpeFl,'Off')
            end
        else
            if gst_HorsGel then
                --[[ La température de l'eau est <12°C : on utilise la température 
                Démarrage si température d'air <= 1
                Arrêt si température d'air >= 1.5 et température eau >= 0.5
                --]]               
                val_Tair = tonumber(otherdevices_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 

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.


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

Re: Domotique Piscine

Message par aleph0 » 20 juin 2017, 21:49

chacal1985 a écrit : Le problème est que je souhaite limité le temps de filtration à 12 heures du moment que le calcul du temps de filtration est supérieur à 12h, car cela fait 2 ans que je pratique cela et ma piscine n'a jamais tournée.
tu peux utiliser la méthode indiquée par Jeff (en remplaçant 600 par 720 ;) ) ou celle ci : Dans la fonction CalcFiltration, remplace la formule de calcul de la durée par celle-ci :

Code : Tout sélectionner

dureeFiltration=round(60*math.max(0,math.min(12,cst_Adj*cst_Pisc_V/cst_PpeFl_Qn*(val_TEau-10))),0) -- Résultat en minutes 
où math.max(0, ...) : Le 0 est la durée minimale de filtration autorisée (0h)
et math.min(12,...) : Le 12 est la durée maximale de filtration autorisée (12h)

Jeff
Messages : 575
Enregistré le : 17 nov. 2016, 20:54
Localisation : Rennes (35)

Re: Domotique Piscine

Message par Jeff » 20 juin 2017, 21:59

Tu es sur une autre planète que nous en programmation @aleph0 :geek:
En tout cas merci pr le script :D
12×60 = 600 :? Elle est où l'erreur !
Version: 3.81.53; KMTronic usb ; RFXCOM Rfxtrx433e ext/1007 ; Zwave (Z-stick GEN5, Fibaro...) DIO ; OREGON/4 THGN/PCR800; DIY/3 temp, Teleinfo usb; RFLink; MYSensors v2.0/GW Lan/Power meter/RGB 3D; ESPeasy Oled, Nextion...

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

Re: Domotique Piscine

Message par aleph0 » 20 juin 2017, 22:06

Jeff a écrit : 12×60 = 600 :? Elle est où l'erreur !
Ben, justement : 12x60=720 ;) c'est 10x60 qui font 600 :P
Jeff a écrit :En tout cas merci pr le script :D
Et merci à toi pour les améliorations que tu y apportes :)

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.


chacal1985
Messages : 114
Enregistré le : 10 juin 2017, 11:22

Re: Domotique Piscine

Message par chacal1985 » 21 juin 2017, 00:13

Merci beaucoup pour votre aide.
Le script à l'air de fonctionner. Il me faudrait maintenant faire le branchement électrique sur le coffret de filtration.
Prochaine étape = Faire fonctionner Monitor avec les infos de la Piscine, je vais essayer de regarde ça de plus prés,mais je pense y passer un petit moment.

Merci

chacal1985
Messages : 114
Enregistré le : 10 juin 2017, 11:22

Re: Domotique Piscine

Message par chacal1985 » 21 juin 2017, 18:14

Bonjour,

Alors je continue mes questions :

Je n'arrive pas à faire fonctionner le capteur texte pour connaitre l'heure de fin de filtration.
Faut-il creer une variable utilisateur dans domoticz ?
Peut être que j'ai oublié quelque chose dans le scipt, mais je ne vois pas quoi, ou peut être que j'ai mal rajouter le bout de script ????

Le compteur virtuel P1 smart counter, semble ne pas fonctionner correctement, il m'indique : en haut à droite 750 WATT et en bleu 187.687, Aujourd'hui: 149.750 KWh
Le résultat est bien trop élevé, pourtant j'ai mi dans la puissance de la pompe sur le script 750.
Comprend pas :?

Et enfin le monitor :
Facile à installer, par contre je ne comprend pas tout,
-Pour modifier les pages , faut-il modifier : frontpage_setting.js
ou directement les pages 1,2,3,4,5,6,canevas,clock,freeRemote,iframe,pluie,trafic ?
-Serait-il possible d'avoir les icones qui vont bien avec la piscine ? ( si quelqu'un les a)

Je crois que pour le moment ça ira.


Merci

chacal1985
Messages : 114
Enregistré le : 10 juin 2017, 11:22

Re: Domotique Piscine

Message par chacal1985 » 22 juin 2017, 15:15

Bonjour,

Désolé de vous embêter encore une fois...

Alors, tout d'abord pour deennoo :

Je n'arrive pas a insérer le script pour avoir l'heure de fin de filtration, le capteur texte m'indique tout le temps Hello World.
Serait il possible de mettre ton code script complet pour voir ou j'ai pu faire l'erreur ?


Ensuite, pour tout le monde :
J'ai une erreur dans le log, je lance le script, pas d'erreur , il m'indique la température relevée, et le temps de filtration, mais au bout de 15 minutes, il me mais une erreur : voir capture d'écran
Image


Quelqu'un peut me dire pourquoi ? Car je ne vois pas, pourquoi car la température de l'eau est trouvée.



Ensuite, quelqu'un peut me dire pourquoi j'ai toutes ces lignes qui se répètent dans le log ? Car toutes ces données sont bien écrites dans un fichier ? Au final le fichier va énorme ? Voir capture d'écran
Image



Ensuite, Lorsque je lance le script, la température est relevée, le temps de filtration est calculé, mais le switch Pompe piscine reste sur off alors que le sélecteur est sur Auto HP et le switch Heures creuses est sur off.
Le switch Pompe piscine ne devrait il pas passer sur ON ? Ou faut-il attendre le lendemain pour que cela fonctionne ? ( car j'ai modifié l'heure de relève de température ex: 15h00 à la place de 00h01 )

Et pour terminer, je suis toujours en galère avec monitor, mais j'ai de l'amélioration. ;)


Merci

deennoo
Messages : 3993
Enregistré le : 25 janv. 2015, 02:00

Re: Domotique Piscine

Message par deennoo » 23 juin 2017, 00:32

On prepare quelque chose avec alphe0. Soit patient.

Mon bout de code ce met juste apres celui de jeff qui calcule le temps restant dans la fonction chkfiltration

Je suis resté avec le script de la page 2 pour le moment
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr

chacal1985
Messages : 114
Enregistré le : 10 juin 2017, 11:22

Re: Domotique Piscine

Message par chacal1985 » 23 juin 2017, 13:03

Merci deennoo.

Ben en fait, je pense que le script ne marche pas du tout chez moi.
Mais je n'ai pas de code erreur.

Il me faudrait peut être reprendre depuis le début.
Peut être un soucis avec sqlite3 ??? Comment fait t'on pour le déclarer dans le PATH ?

Ce qui est bizarre, c'est que le calcul de la durée de filtration se fait ( donc je pense qu'il y a un accés à la bd ? ), mais les capteurs textes ne bougent pas, je vois juste le résultat dans le log.
Puis interrupteur lui aussi ne passe pas sur ON.

Est ce que je n'ai pas aussi un soucis avec Teau , j'ai une DS18b20 ?

stephdes
Messages : 255
Enregistré le : 06 oct. 2016, 20:50

Re: Domotique Piscine

Message par stephdes » 30 juin 2017, 15:49

Bon, en ce qui me concerne, la piscine est en place !

Il me tarde de commencer de la domotiser... Je vais déjà détourner l'interrupteur "Manuel - 0 - Auto" pour connecter un Wemos + relais + capteur de pression

Faut que je vois ça ce week-end. Ensuite, week-end prochain, le wemos + sonde de température dans le skimmer + capteurs de niveau

Ensuite je vais intégrer le (les) scripts d'Aleph. Il va falloir que je le rendre compatible windows surtout au niveau de Sqlite. Je n'ai jamais trop touché à ce truc...

J'en profite pour remercier Aleph et tous les intervenants pour leur aide qui font gagner beaucoup de temps aux débutants !
MiniPC W10 + RFXCom 433e Ext1013 + RFLINK R45; 1 temp Bresser + 4 Banggood, lumières+volets+prises:Blyss
Autre modules volets chinois - RM Mini3 + RM PRO 2
Conso élec : OWL 180+ -- 2 Wattmètres OTIO
Imperihome+Sarah+MDAH+Domoticz (merci easydomoticz !)

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