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 ...
ALP40
Messages : 10
Enregistré le : 25 oct. 2019, 13:32
Localisation : Landes (40)

Re: Domotique Piscine

Message par ALP40 »

Houp .... :roll: :roll: je pense que la valeur est vide et que je doive attendre demain pour vérifier ...
Merci encore d'avoir répondu si rapidement.

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

Re: Domotique Piscine

Message par aleph0 »

C'est possible ça ;-) rendez-vous demain !

ALP40
Messages : 10
Enregistré le : 25 oct. 2019, 13:32
Localisation : Landes (40)

Re: Domotique Piscine

Message par ALP40 »

Bonsoir,

J'ai simulé deux deux cycles, et une nouvelel erreur ..... grrrrrrrrrrrr :?: :?: :?: :?: :?: :?:

2019-11-15 21:01:00.176 Status: LUA: Script Piscine : Gestion de la filtration
2019-11-15 21:01:00.176 Status: LUA: device => -Temp. Piscine-svalues dev_TEau => -20.6-
2019-11-15 21:01:00.327 Status: LUA: Déjà effectué : 150 minutes sur 211
2019-11-15 21:01:00.328 Status: LUA: Temps restant de filtration piscine : 61 minutes
2019-11-15 21:01:00.328 Status: LUA: Début de filtration : 03:29
2019-11-15 21:01:00.344 Status: EventSystem: Script event triggered: Filtration
2019-11-15 21:01:00.328 Error: EventSystem: in Filtration: [string "--[[ Script de gestion de la piscine..."]:248: attempt to concatenate field '?' (a nil value)
2019-11-15 21:01:15.390 (Temperature Jardin) Temp + Humidity + Baro (Temp. Jardin)

La ligne en cause : commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[heure_Fl]..'|0|'..HDebFilt}

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

Une idée ? car le newbie il séche :? :? :?

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

Re: Domotique Piscine

Message par aleph0 »

Est-ce que heure_Fl est correctement défini ?
Rajoute un print(otherdevices_idx[heure_Fl]) pour voir

ALP40
Messages : 10
Enregistré le : 25 oct. 2019, 13:32
Localisation : Landes (40)

Re: Domotique Piscine

Message par ALP40 »

Bonsoir,
Print génère l'erreur :

Error: EventSystem: in Filtration: [string "--[[ Script de gestion de la piscine..."]:247: attempt to concatenate global 'HDebFilt' (a nil value)

Une solution je séche ....

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

Re: Domotique Piscine

Message par aleph0 »

La, je comprends plus... Dans le post d'avant, HDebFilt était correctement affiché :-/

Copie colle le script en entier, tel que te l'as dans ton domoticz stp, qu'on y voit plus clair

Envoyé de mon moto g(6) en utilisant Tapatalk


ALP40
Messages : 10
Enregistré le : 25 oct. 2019, 13:32
Localisation : Landes (40)

Re: Domotique Piscine

Message par ALP40 »

Je pense que l'erreur vient de heure_Fl
Mais je vois pas ou elle est défini ....

L'erreur :
019-11-16 20:46:00.656 Error: EventSystem: in Filtration: [string "--[[ Script de gestion de la piscine..."]:249: attempt to concatenate field '?' (a nil value)

La ligne en erreur :
commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[heure_Fl]..'|0|'..HDebFilt}

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$

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 électri$
- cst_Adj Un coefficient à ajuster en + ou en - pour filtrer plus ou moins longtemps
- cst_PpeFl_W La puissance électrique de la pompe piscine, pour pouvoir calculer la durée de filtration quotidienne ainsi que la consommation électri$
- 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    = "Temp. Jardin"      -- Température extérieure (nécessaire seulement pour le mode hors gel)
local dev_TEau    = "Temp. Piscine"     -- Température eau piscine
local dev_PpeFl   = "Filtration"              -- 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 ENEDIS"   -- 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=20              -- Débit nominal de la pompe de filtration en m3/h
local cst_Pisc_V  =39              -- 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 =850             -- 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] ~= "Manuel") and (otherdevices[dev_ModeFl] ~= "Off") then
        val_TEau=tonumber(otherdevices_svalues[dev_TEau])
        val_PpeFl=otherdevices[dev_PpeFl]
        print('device => -'..dev_TEau.. '-svalues dev_TEau => -'..otherdevices_svalues[dev_TEau]..'C°')
        print(otherdevices_idx[heure_Fl])
        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(otherdevices_idx[heure_Fl])
            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==11 and time.min ==22 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
Modifié en dernier par Neutrino le 17 nov. 2019, 10:19, modifié 1 fois.
Raison : Ajout balises code

ALP40
Messages : 10
Enregistré le : 25 oct. 2019, 13:32
Localisation : Landes (40)

Re: Domotique Piscine

Message par ALP40 »

Bonsoir

2019-11-18 21:46:00.548 Status: LUA: Script Piscine : Gestion de la filtration
2019-11-18 21:46:00.548 Status: LUA: device => -Temp. Piscine => -20.8C°
2019-11-18 21:46:00.672 Status: LUA: Déjà effectué : 225 minutes sur 217
2019-11-18 21:46:00.672 Status: LUA: Filtration piscine finie
2019-11-18 21:46:00.673 Status: LUA: Début de filtration : 10:59

Le script s'exécute jusqu'à la ligne print("Début de filtration : "..HDebFilt).
L'erreur se produit juste après : commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[heure_Fl]..'|0|'..HDebFilt}

Extrait du script :
-- 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

Hormis PPStart et PPDuree y a-t-il d'autres variables a déclarer dans les variables utilisateurs ?

Merci d'avance

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

Re: Domotique Piscine

Message par denis_brasseur »

ALP40 a écrit : 18 nov. 2019, 22:19
Hormis PPStart et PPDuree y a-t-il d'autres variables a déclarer dans les variables utilisateurs ?

Code : Tout sélectionner

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
Je ne vois que ces 2 variables dans le code, elles doivent se nommer PpePiscStart et PpePiscDuree, et non pas PPStart et PPDuree d'après ton code :

Code : Tout sélectionner

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
Pi3 + DD PiDrive + RFXtrx433 + AEON Labs ZW090
7 Modules fil pilote ZMNHJD1
2 détecteur fumées CHACON 34131
5 Bresser Capteur thermo/hygro
1 contacteur porte Philio PST02-1A Z
OWL Micro+ CM180
D2L LINKY
FGR-223 "Roller Shutter 3"

ALP40
Messages : 10
Enregistré le : 25 oct. 2019, 13:32
Localisation : Landes (40)

Re: Domotique Piscine

Message par ALP40 »

Bonsoir,

Les variables sont bien définies dans les variables utilisateurs :
PpePiscStart format heure 00:00
et
PpePiscDuree format entier 0

Donc c'est pas les variables ... Merci

Répondre