[LUA] YASDC (Yes Another Script De Chauffage) !

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
Nissa
Messages : 96
Inscription : 21 déc. 2015, 23:38
Localisation : Bordeaux

Re: YASDC (Yes Another Script De Chauffage) !

Message par Nissa »

Merci Vil1driver, j'ai retiré le double -[[ en trop.
Pour xav999, je vois pas trop où la condition pose problème, mais comme je suis en vacances j'ai du mal a rentrer dans la boucle ;)
Ce script tourne depuis 2 ans chez moi, je n'avais pas remarqué de cycle trop rapide.
Des que je rentre je me penche dessus.
A+
Domoticz sur RPI4 / Rflink / Rftrxcom / Sondes thermo sur 1Wire / Volets Somfy rts / Divers modules 433 mhz pas chers / Poele à pellets Ravelli domotisé / Volets Bubendorf / SonOff / Arrosage enterré sur SonOff 4 / Robot piscine domotisé
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: YASDC (Yes Another Script De Chauffage) !

Message par vil1driver »

le truc c'est que lorsque tu es dans la plage d'hystérésis le script ne sais pas s'il est en phase de chauffe ou non..
je pense que le plus simple est de prendre en compte l'état du chauffage à ce moment là
ou alors utiliser une variable utilisateur.
tout ça dans le but de renvoyer la commande qui va bien à chaque exécution du script..
ou alors tu laisses couler, tu ne commandes qu'en dehors de la plage..
comme tu le fais actuellement..
en fin cela est une autre histoire..

mais effectivement xav999 à raison, ceci est de trop, ton script coupe dès que l'on dépasse la température de remise en marche du chauffage.
on atteint donc jamais la consigne, donc encore moins + hystérésis..

Code : Tout sélectionner

else
         commandArray[radiateur]='Off'
         status = 0
         log = '***                              Le Radiateur est arrêté'   
         if (debug) then print('>>>>>>>>ELSE>>>>>>>>>>>>>>>>>>>>>>>>>>>> Radiateur arrêté ! '..valeur) end
      
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
Nissa
Messages : 96
Inscription : 21 déc. 2015, 23:38
Localisation : Bordeaux

Re: YASDC (Yes Another Script De Chauffage) !

Message par Nissa »

Bonjour,
Suite à la remarque pertinente de XAV999 et grâce aux conseils de VILLDRIVER (merci à lui) j'ai modifié le script :
MAJ du 19/11/2017/2017
Ajout de la vérification de l'état du poêle avant action pour éviter des commutations trop fréquentes
Ajout de variables d'état pour rendre le code plus lisible
sinon fonctionnement identique
A+
Domoticz sur RPI4 / Rflink / Rftrxcom / Sondes thermo sur 1Wire / Volets Somfy rts / Divers modules 433 mhz pas chers / Poele à pellets Ravelli domotisé / Volets Bubendorf / SonOff / Arrosage enterré sur SonOff 4 / Robot piscine domotisé
valentin44
Messages : 15
Inscription : 23 févr. 2018, 21:30

Re: YASDC (Yes Another Script De Chauffage) !

Message par valentin44 »

Bonjour à tous, je vais dénicher un dossier :)

First :) un Grand merci à tout ceux qui participe sur le forum, car je me suis lancé depuis 2 semaine dans la domotique avec un Pi 3 et une carte RFXcom et j'ai non seulement fait quelques trucs sympa, mais j'ai aussi compris ce que j'ai réalisé donc => merci

sinon je me suis lancé à suivre le tuto pour faire une régulation du chauffage de mon salon (pour commencer ) sans fonctionnement
au lieu de brancher mon radiateur j'ai branché une lumière pour tester
j'ai une sonde Oregon
j'ai créé les Switchs virtuel
j'ai créé les capteurs virtuel .
j'ai copié le Script dans l'event en LUA (voir ci dessous )

et j'obtiens l'erreur suivante

2018-02-23 21:45:15.516 Error: EventSystem: in script_time_test: [string "--[[ ..."]:57: bad argument #1 to 'sub' (string expected, got nil)

ci dessous le code

Merci à tous d'avance

Code : Tout sélectionner

--[[ 
par Nissa MAJ du 19/11/2017
Ajout de la verification de l'état du poele avant action
Ajout de variables d'état pour rendre le code plus lisible

Type:          time
Name:          chauffage
Algorythme :
         Si Chauffage=ON et Calendrier=ON   
               Consigne=confort (19)
            sinon
               Consigne=eco(17)
         sinon 
            Consigne=eco+(15)
            
NOTA : Ce script est volontairement tres verbeux afin d'avoir dans les logs le statut de chaque radiateur
(toutes les minutes !). On peut l eviter en initialisant la variable 'verbose' a false.  
Sinon, il est fortement conseille de commenter l option log de domoticz (dans domoticz.sh) afin de ne pas 
saturer l espace de stockage  par un fichier log trop important
--]]
 
----------------------------------------------
------          Configuration          ------
----------------------------------------------
local piece={}     -- Tableau Rajouter ici les radiateurs 
   piece['0']='Chambre_salon'
   --piece['1']='Chambre_AniLou'



local watt={}     -- Tableau Rajouter ici la puissance en watts du radiateur (L'index doit correspondre a celui de la piece ci-dessus)
   watt['0']='1000'

   
-- consignes de thermostat virtuels
local consigne_confort = 'Thermo_confort'           
local consigne_eco = 'Thermo_eco'
local consigne_ecoplus = 'Thermo_ecoplus'
local conso = 'Chauffage_conso'         -- nom du capteur virtuel de consommation électrique (type= instant + counter)
local conso_id = 00082036                    -- idx du capteur virtuel de consommation électrique
local reset = false                     -- force la mise à zero de la consomation instantané (laisser à false pour un fonctionnement normal) true/false
local hysteresis = 0.4                -- Valeur seuil pour éviter que le relais ne cesse de commuter dans les 2 sens
local debug = true                       -- true or false pour voir tous les messages debug dans le log
local verbose = true                  -- Print ou non des logs
-- email
local mail = 'xxxxxxxxxxx.fr'  -- pour réception alerte sonde muette (chauffage coupé)

-- domoticz
local url = '192.xxx.x.xx:8080'         -- user:pass@ip:port de domoticz, pour la création des variables

----------------------------------------------
--       Fin de la partie configuration       --
----------------------------------------------

function timedifference(d)
   s = otherdevices_lastupdate[d]
   year = string.sub(s, 1, 4)
   month = string.sub(s, 6, 7)
   day = string.sub(s, 9, 10)
   hour = string.sub(s, 12, 13)
   minutes = string.sub(s, 15, 16)
   seconds = string.sub(s, 18, 19)
   t1 = os.time()
   t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
   difference = os.difftime (t1, t2)
   return difference
end

cumul_power = 0   -- initialisation de la puissance instantanee des radiateurs en fonctionnement
   
for key, valeur in pairs(piece) do
   -- Maj des variables en fonction de la valeur de la table 
   local le_radiateur_est_sur_ON = false      -- Etat du radiateur false ou true
   local sonde_KO = false                     -- Sonde de temperature HS
   local sonde = string.format("%s%s", "Temperature_salon", valeur)                   -- Nom de la sonde de température
   local presence = string.format("%s%s", "Chauffage_on_off_salon", valeur)         -- Interrupteur manuel indiquant la presence
   local calendrier = string.format("%s%s", "Chauffage_calendrier_salon", valeur)
   local radiateur = string.format("%s%s", "Radiateur_chambre_salon", valeur)       -- Nom de l'interrupteur de chauffage
   log = '***'
   log2 = '***'
   
   local heure = string.sub(os.date("%X"), 1, 5)   -- Recuperation de l'heure du systeme
   local lastSeen = string.sub(os.date("!%X", timedifference(sonde)), 1, 5)    -- Heure de la derniere releve de la sonde de temperature
   
   puissance=tonumber(watt[key])  -- Puissance en watt du radiateur
   
   commandArray = {}
   
   if (debug) then print ('>>>>>>>>>>>>>>>Initialisation '..puissance..' Radiateur>'..valeur) end
   
----------------------------------------------
------         Alerte mail              ------
--     si la sonde est muette depuis 30'    --
----------------------------------------------

   if (lastSeen >= '00:30' and lastSeen < '00:32') then
      commandArray['SendEmail']='Domoticz Alerte#Alerte sonde chambre '..piece..' muette#'..mail
      if (debug) then print('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Envoi mail probleme de sonde ') end
   end

----------------------------------------------
------          Gestion consigne        ------
----------------------------------------------
      
   -- récupération de la valeur du thermostat
   
    if (otherdevices[presence] == 'On') then          -- si la presence est active (interrupteur manuel 'Chauffage_on_off_XXXX')

      if (otherdevices[calendrier] == 'On') then       -- ET calendrier ON (Chauffage_calendrier_XXXX)
         consigne = tonumber(otherdevices_svalues[consigne_confort])
      else
         consigne = tonumber(otherdevices_svalues[consigne_eco])
        end

   else     -- presence = OFF
      consigne = tonumber(otherdevices_svalues[consigne_ecoplus])

   end   
    
   if (debug) then print('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Initialisation Consigne chambre '..valeur..' > '..consigne) end
   
   -- on récupère la température fournie par la sonde
    local temperature = math.floor(10*tonumber(otherdevices_temperature[sonde]))/10
   
    if (debug) then print('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Recup valeur sonde chambre '..valeur..' > '..temperature) end

----------------------------------------------
--  Inititialisation des Variables d etat  --
----------------------------------------------

   if (otherdevices[radiateur] == 'On') then le_radiateur_est_sur_ON = true end 
   
   if lastSeen > '00:10' then 
      local sonde_KO = true 
      log2 = '***        Sonde muette '
   end

----------------------------------------------
------       Gestion du radiateur       ------
--- selon temperature relevee et consigne   --
----------------------------------------------
   
   if (le_radiateur_est_sur_ON) and not (sonde_KO) then
      log = '*** IF 1 >                        Le Radiateur est en marche'
      status = 1
      if temperature >= (consigne + hysteresis) then
         commandArray[radiateur]='Off'  
         log = '*** IF 2 >                    Arret du Radiateur'
         status = 0  -- Pour eviter le delai de la Maj du device (variable utilisee dans le if du calcul de conso)
      end
   else
      log = '*** IF 3 >                 Le Radiateur est arrete'
      status = 0
      if temperature <= (consigne - hysteresis) and not (sonde_KO) then
         commandArray[radiateur]='On'
         log = '*** IF 4 >                 Allumage du Radiateur'
         status = 1
      end
   end
      
     -- calcul de la conso (npower = puissance actuelle / energy = puissance cumulee)

      npower, energy = string.match(otherdevices_svalues[conso], "(%d+%.*%d*);(%d+%.*%d*)") -- extraction des valeurs stockees dans le device conso
   
      if (status == 1) then  -- le radiateur est allume
         cumul_power = tonumber(cumul_power + puissance)
         energy = tonumber(energy + (puissance / 60))   -- puissance journaliere cumulee 
      else                   -- Le radiateur est eteint
         energy = tonumber(energy)
      end   
      
      power = tonumber(cumul_power)                  -- puissance instantanee 
         
   -- envoi de la conso dans le capteur virtuel d'énergie

   if (reset) then
      power = 0
     energy = 0
   end   
   
   commandArray[3]={['UpdateDevice'] = conso_id .. '|0|' .. power .. ';' .. energy}
   
   -- logs
   if (verbose) then
      print ' '
      print('********************* Chauffage '..valeur..' *********************')
      print('***                 Il fait '..temperature..'°C pour une consigne de '..consigne..'°C souhaités')
      print(log,log2)
      print('********************************************************************')
   end

end -- fin de tableau
   return commandArray

Nissa
Messages : 96
Inscription : 21 déc. 2015, 23:38
Localisation : Bordeaux

Re: YASDC (Yes Another Script De Chauffage) !

Message par Nissa »

Bonsoir Valentin,
Il s'agit d'une erreur au niveau de la déclaration des variables.
Vérifie bien chaque ligne, l'orthographe des noms de switchs, il doit y avoir une incohérence dans ces déclarations.
A+
Domoticz sur RPI4 / Rflink / Rftrxcom / Sondes thermo sur 1Wire / Volets Somfy rts / Divers modules 433 mhz pas chers / Poele à pellets Ravelli domotisé / Volets Bubendorf / SonOff / Arrosage enterré sur SonOff 4 / Robot piscine domotisé
valentin44
Messages : 15
Inscription : 23 févr. 2018, 21:30

Re: YASDC (Yes Another Script De Chauffage) !

Message par valentin44 »

j'ai trouvé

je n'avais pas compris le système variable fix _ Variable mobile

"temperature_" ne bouge pas et on vient rajouter les pièces

super astuces et super flexible


Un grand merci
Nissa
Messages : 96
Inscription : 21 déc. 2015, 23:38
Localisation : Bordeaux

Re: YASDC (Yes Another Script De Chauffage) !

Message par Nissa »

[quote="valentin44"]j'ai trouvé

je n'avais pas compris le système variable fix _ Variable mobile

"temperature_" ne bouge pas et on vient rajouter les pièces

super astuces et super flexible


Un grand merci[/quote

:-)
Domoticz sur RPI4 / Rflink / Rftrxcom / Sondes thermo sur 1Wire / Volets Somfy rts / Divers modules 433 mhz pas chers / Poele à pellets Ravelli domotisé / Volets Bubendorf / SonOff / Arrosage enterré sur SonOff 4 / Robot piscine domotisé
jeff0077
Messages : 1
Inscription : 25 févr. 2018, 18:31

Re: YASDC (Yes Another Script De Chauffage) !

Message par jeff0077 »

Bonjour à tous,

Tous d'abord bravo pour le travail effectué, j'ai deux petite question :

1ere : Dans le tuto on demande d'associé le switch on_off au radiateur mais dans quelle sens ? dans le switch on_off ou dans le switch radiateur? je l'ai fait dans le on_off et il se coupe quand j'arrive a température.

2eme : j'ai le log suivant que j'arrive pas a comprendre :
2018-02-28 11:20:00.387 LUA: >>>>>>>>>>>>>>>Initialisation 1500 Radiateur>Chambre_Parents
2018-02-28 11:20:00.387 LUA: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Initialisation Consigne chambre Chambre_Parents > 19
2018-02-28 11:20:00.387 LUA: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Recup valeur sonde chambre Chambre_Parents > 19
2018-02-28 11:20:00.387 LUA:
2018-02-28 11:20:00.387 LUA: ********************* Chauffage Chambre_Parents *********************
2018-02-28 11:20:00.387 LUA: *** Il fait 19°C pour une consigne de 19°C souhaités
2018-02-28 11:20:00.387 LUA: *** IF 1 > Le Radiateur est en marche
2018-02-28 11:20:00.387 LUA: *** Sonde muette
2018-02-28 11:20:00.387 LUA: ********************************************************************
2018-02-28 11:20:00.387 LUA: >>>>>>>>>>>>>>>Initialisation 1500 Radiateur>SDB
2018-02-28 11:20:00.387 LUA: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Initialisation Consigne chambre SDB > 19
2018-02-28 11:20:00.387 LUA: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Recup valeur sonde chambre SDB > 19.7
2018-02-28 11:20:00.387 LUA:
2018-02-28 11:20:00.387 LUA: ********************* Chauffage SDB *********************
2018-02-28 11:20:00.387 LUA: *** Il fait 19.7°C pour une consigne de 19°C souhaités
2018-02-28 11:20:00.387 LUA: *** IF 3 > Le Radiateur est arrete
2018-02-28 11:20:00.387 LUA: *** Sonde muette
2018-02-28 11:20:00.387 LUA: ******************************************************************************************************
Si j'ai bien compris c'est parce que ma sonde de température a été mise à jour il y a plus de 10 min, c'est ca?
Nissa
Messages : 96
Inscription : 21 déc. 2015, 23:38
Localisation : Bordeaux

Re: YASDC (Yes Another Script De Chauffage) !

Message par Nissa »

Bonsoir,
Concernant la 1ère question, le switch on-off est celui qui active le module radio que tu as connecté à ton radiateur.
Pour le switch on-off au vu des logs, il y a sans doute un problème dans tes déclarations de variables, car il récupère bien la température de ta sdb mais il dit sonde-ko ?!! Vérifie tes variables. La racine du nom des interrupteurs est toujours identique (Chauffage_calendrier_ , Chauffage_on_off_ , Radiateur_chambre_ ). Ils ne sont distingués dans le programme que par la désignation finale (valeur, dans le tableau piece)
De toute évidence, ton script récupère bien la température de la sonde mais le test de l'âge de la sonde est erroné (last seen)
A+
Domoticz sur RPI4 / Rflink / Rftrxcom / Sondes thermo sur 1Wire / Volets Somfy rts / Divers modules 433 mhz pas chers / Poele à pellets Ravelli domotisé / Volets Bubendorf / SonOff / Arrosage enterré sur SonOff 4 / Robot piscine domotisé
valentin44
Messages : 15
Inscription : 23 févr. 2018, 21:30

Re: YASDC (Yes Another Script De Chauffage) !

Message par valentin44 »

Bonjour à tous

voila après quelques jours d'utilisation la régulation de la chauffe marche super,

Pour Information, j'utilise le fameux fil pilote donc
Quand Radiateur = on => pas de chauffe
Quand Radiateur =Off => chauffe

Astuce Évidente pour certain :D j'ai rajouté un Switch virtuel "Radiateur_inverseur" puis un petit programme en bloc rapide
Quand radiateur_inverseur est en "On" alors Radiateur du salon est en off => donc allumé
sinon l'inverse
comme cela sur la page d’accueil quand je vois le logo "on" du "radiateur inverseur " je me pose pas la question c'est en chauffe moiahhh :lol:


Juste une question le capteur virtuel "Chauffage_conso" n'évolue pas avez - vous une idée ? dans le programme il n'y a que la dénomination à MAJ et le numéro Idx
local conso = 'Chauffage_conso' -- nom du capteur virtuel de consommation électrique (type= instant + counter)
local conso_id = 00082044 -- idx du capteur virtuel de consommation électrique

coté de l'interupteur virtuel quand je clique sur modifier il y a comme renseignement :
Type : utilisation
Energy read : frome device

Des avis ?

merci
Répondre