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 ...
stephdes
Messages : 253
Enregistré le : 06 oct. 2016, 20:50

Re: Domotique Piscine

Message par stephdes » 30 juin 2017, 16:02

deennoo a écrit :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

Ah bah je vais peut-être attendre alors ! :D

La seule difficulté que je vois de mon côté c'est la commande "'sqlite3 '..dbPath..' je ne sais pas si elle va passer nativement dans windows après installation de Sqlite... La dbpath, pas de problème mais la fonction en elle-même...

Ca me rappelle vaguement ma tentative de rebooter automatiquement la freebox. j'ai passé des heures et des heures à essayer. J'ai réussi mais une seule fois... Depuis ça ne fonctionne plus et je ne sais pas pourquoi :evil:
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.


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

Re: Domotique Piscine

Message par deennoo » 06 juil. 2017, 09:26

stephdes a écrit :passer nativement dans windows :
C'est peut être la cause de ton problème, il y a peu de tuto pour faire les bidouilles avec windows...
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr

vicentix
Messages : 5
Enregistré le : 21 juin 2017, 16:38

Re: Domotique Piscine

Message par vicentix » 06 juil. 2017, 13:08

Bonjour,
Pour ma part j'ai un soucis de compteur que je n'arriva pas à comprendre. J'ai beau être complètement noob, je me creuse pourtant la tête mais ... rien ne sort et je pense que je vais finir par aplatir mon PI3 a grand coups de pelle...

En fait, si je suis pas trop boulet, au moment de lire la variable constante de conso, il arrive pas a câbler celle définie dans la définition des variables.

Puisque je parle pas trop votre language LUAestraterrestre, ça donne:
017-07-06 12:52:00.185 Error: EventSystem: in Script piscine pompe: [string "--[[ Script de gestion de la piscine ..."]:111: attempt to concatenate field '?' (a nil value)
Et quand je mets un print dans la boucle de la fonction ConsoDev pour savoir ou j'en suis, il me dit que mon interrupteur est OFF alors qu'il est bien ON comme si il arrivait pas a lire l'état de l'inter pour piloter la pompe ....

Deuxième point, même si je force les deux branche a aller chercher la valeur "ConsoMarche", toujours pareil, même message et sur mon print de la valeur j'ai toujours 0 et non pas les 800 que j'ai mit dans l'init:
-- Réglages du temps de filtration
local cst_PpeFl_Qn=13 -- 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

Je subodore un pb avec la base SQL mais j'ai rien lu pour sa mise en place ou son init.

En revanche, pour moi, il a été nécessaire de rajouter une variable d'init du compteur sinon erreur dès la 86 pour retour de chaine nil ! (soyez indulgent il m'a fallut 2 jours pour comprendre ça ...):
if (otherdevices_svalues[device] ~= nil) then
u1, u2, p1, p2 = string.match(otherdevices_svalues[device],"(.-);(.-);(.-);(.-);.*")
end

Comme je l'ai déjà dit, je suis une vrai chèvre en prog (ben en fait c la première fois que je touche a un programme) alors je cherche une âme charitable pour me débloquer


Edit: Bon quand je force les 2 a "ConsoMarche", j'ai bien ma valeur 800 mais du coup c'est bien que je récupère pas l'état de mon inter

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

Re: Domotique Piscine

Message par chacal1985 » 06 juil. 2017, 13:46

Bonjour,

Moi aussi j'ai mis du temps à faire fonctionner le script correctement. Mais à force de persévérer j'y suis enfin arrivé (enfin presque).
J'ai juste un soucis avec 2 capteurs textes et je ne vois pas pourquoi.

Pour commencer :
Il faut installer sqlite3 et le déclarer dans le PATH
Ensuite il te faut créer les variables ( attention aux nom et bien renseigner le type et la valeur)
Créer les dispositifs avec les bons noms

Ensuite dans le script, il faut bien indiquer l'emplacement de la base de données domoticz.
Bien renseigner les noms des dispositifs.
Ah oui et le script le passer en Time.

Si tu utilise une sonde 1-wire il te faut modifier la ligne "Val_TEau" en mettant ça à la place ligne en 180 et 190 suivant le script que tu as pris :

val_TEau=tonumber(otherdevices_svalues[dev_TEau])

Sinon, met sur le forum ton script complet, des copies d'écran des interrupteurs,temperature, mesures, variables et logs des erreurs.
Il nous sera plus facile de voir ce qu'il ne va pas.

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.


vicentix
Messages : 5
Enregistré le : 21 juin 2017, 16:38

Re: Domotique Piscine

Message par vicentix » 06 juil. 2017, 13:55

Bonjour et merci de ta réponse,
Sur PC je te déclare tous les paths que tu veux mais ma solution repose sur un Rapi PI3 et les paths sous linux .... c'est pas mon truc ! Une idée ??

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

Re: Domotique Piscine

Message par chacal1985 » 06 juil. 2017, 16:04

Alors tu suis le chapitre V .
http://www.commentcamarche.net/faq/3585 ... ement-path

Pour indiquer sqlite3

vicentix
Messages : 5
Enregistré le : 21 juin 2017, 16:38

Re: Domotique Piscine

Message par vicentix » 07 juil. 2017, 09:49

Bonjour,
Vu que je peux exécuter la commande Sqlite3 depuis n'importe quel emplacement, mon path est forcément bon ...
Comment peut-on visualiser le contenu de la BD pour voir les tables et autre ?

J'avoue que sur oracle je saurai faire mais sous raspi je suis un peu .....

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

Re: Domotique Piscine

Message par chacal1985 » 07 juil. 2017, 10:12

Moi depuis que j'ai fait ça ,cela a résolu mon problème.
Car dans le script il utilise la commande sqlite3, si tu ne le déclare pas dans le path, il te faut mettre le chemin d'accès.

Sinon tu nous mets des captures d'écran et je pense que tu aura du monde pour voir ce qu'il ne va pas.

Pour lire ta base de donnée, il y a ce tuto :https://easydomoticz.com/sqlite-manager/

Par contre l'application pour chrome n'existe plus, prend le programme pour windows, j'ai fais comme ça.
Mais bon, moi je pensais avoir une soucis de BD, mais il n'y avait pas de soucis de ce coté là.

le belge
Messages : 304
Enregistré le : 12 déc. 2016, 19:02

Re: Domotique Piscine

Message par le belge » 12 juil. 2017, 19:30

Bonjour ,

j'ai du changer de raspberry (pi2 => pi3)
et depuis j'ai un souci avec le script ....

2017-07-12 00:01:00.456 Error: EventSystem: in gestion piscine: [string "--[[ Script de gestion de la piscine ..."]:190: attempt to concatenate field '?' (a nil value)

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

et pas moyen de faire tourner la pompe , pourtant dans les capteurs textes j'ai 575min de temps de filtration ... et arrêtée dans restant filtration

les logs :

2017-07-12 19:16:00.207 LUA: Temps effectué de filtration piscine de : 0 minutes sur 0
2017-07-12 19:16:00.207 LUA: Filtration piscine finie
2017-07-12 19:16:00.209 EventSystem: Script event triggered: gestion piscine
2017-07-12 19:17:00.246 EventSystem: Script event triggered: gestion piscine

Mike

le belge
Messages : 304
Enregistré le : 12 déc. 2016, 19:02

Re: Domotique Piscine

Message par le belge » 06 oct. 2017, 19:20

Bonjour/bonsoir ,

le script à bien fonctionné cet été , mais la depuis que les T° sont basse (eau de la piscine à 11.12°) , j'ai une erreur :

Code : Tout sélectionner

2017-10-06 19:16:00.155 Error: EventSystem: in gestion piscine: [string "--[[ Script de gestion de la piscine ..."]:257: attempt to compare nil with number
la ligne en question

Code : Tout sélectionner

                if (val_TAir <= 1) and val_PpeFl == "Off" then
le script complet :

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    = "Alecto V1 Extérieur"  -- Température extérieure (nécessaire seulement pour le mode hors gel)
local dev_TEau    = "t° 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 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 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=14      -- Débit nominal de la pompe de filtration en m3/h
local cst_Pisc_V  =18     -- volume du bassin, en m3
local cst_Adj     =0.250  -- Coefficient à ajuster en + ou en - pour filtrer plus ou moins longtemps
local cst_PpeFl_W =560    -- Puissance électrique de la pompe piscine

-- -------------------------------
-- Bibliothèque de fonctions
-- -------------------------------
local CmdIdx=1
local debug=0

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[#commandArray+1] = {[device] = commande}
end

function UpdateVar(variable,valeur)
    --Update une variable Domoticz
    commandArray[#commandArray+1] = {['Variable:'..variable] = tostring(valeur)}
end

function UpdateDev(device,nvalue,svalues)
    --Met à jour un device numérique Domotica
    commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[device]..'|'..tostring(nvalue)..'|'..tostring(svalues)}
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[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[device]..'|0|'..tostring(u1+conso*freq/60)..';'..tostring(u2)..';'..tostring(p1+prod*freq/60)..';'..tostring(p2)..';'..tostring(conso)..';'..tostring(prod)}
     else
        commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[device]..'|0|'..tostring(u1)..';'..tostring(u2+conso*freq/60)..';'..tostring(p1)..';'..tostring(p2+prod*freq/60)..';'..tostring(conso)..';'..tostring(prod)}
     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('/usr/bin/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 de la piscine 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'}
    
    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)
   commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[heure_Fl]..'|0|'..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, PpeRest
    
    --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_TEau=tonumber(otherdevices_svalues[dev_TEau])
      
      --print(otherdevices_svalues[dev_TEau])
      --print("Temperature piscine = " .. val_TEau)
        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('/usr/bin/sqlite3 '..dbPath..' "select sum(value3) from multimeter where devicerowid='..otherdevices_idx[dev_cptFl]..' and Date(date)=\''..today..'\'"')*5/cst_PpeFl_W
            print("Temps effectué de filtration piscine de : "..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
        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 
Mike

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