Problème d'activation switch virtuel

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
garycooper
Messages : 453
Inscription : 07 août 2017, 23:58

Problème d'activation switch virtuel

Message par garycooper »

Bonjour, pour gérer les températures de chauffage selon les périodes, j'ai créé un switch virtuel "Programmateur chauffage". Quand il est actif, la consigne de température est celle du thermostat confort et quand il est inactif c'est le thermostat eco.
Sur les périodes identifiées comme "travaillées", le switch est bien activé que sur les plages horaires souhaitées. Par contre, lorsqu'il s'agit de période "non travaillées" (ex : week-end, jour férié, vacances scolaires ...), le switch change d'état à chaque minute parce que deux conditions se contredisent (à priori).

Le script complet est celui-là :

Code : Tout sélectionner

- script pour activer le device "Programmateur chauffage" 

local programmateur_chauffage = 'Programmateur chauffage'
local vacances_scolaires = 'Aujourdhui vacances scolaires'

-- retourne le jour actuel
days = {"dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"}
jour = days[(os.date("%w")+1)]
-- retourne l'heure actuelle ex: "12:45"
heure = string.sub(os.date("%X"), 1, 5)


commandArray = {}

-- si le chauffage est en marche entre minuit et 6h du matin, alors
        if otherdevices[programmateur_chauffage]=='On' and (heure >= '00:00' and heure < '06:00') then
-- on arrête le chauffage
                commandArray[programmateur_chauffage] = 'Off'
		print("il est l heure de dormir, je mets le chauffage en mode eco")
        end

-- si le chauffage est arrêté entre 6h et 7h30 du matin, alors
        if otherdevices[programmateur_chauffage]=='Off' and (heure >= '06:00' and heure < '07:30') then
-- on met le chauffage en marche
                commandArray[programmateur_chauffage] = 'On'
		print("il est 6h du matin, je chauffe pour que vous soyez bien")
        end

-- si le chauffage est arrêté entre 16h30 et minuit, alors
        if otherdevices[programmateur_chauffage]=='Off' and (heure >= '16:30' and heure <= '23:59') then
-- on met le chauffage en marche
                commandArray[programmateur_chauffage] = 'On'
        end

-- si le chauffage est arrêté entre 7h30 et 16h30 et qu'il s'agit d'un jour chômé, alors
        if (otherdevices[programmateur_chauffage]=='Off') and (heure >= '07:30' and heure < '16:30') and (otherdevices[vacances_scolaires]=='On' or uservariables['jf']=='true' or jour=='mercredi' or jour=='vendredi' or jour=='samedi' or jour=='dimanche') then
-- on met le chauffage en marche
                commandArray[programmateur_chauffage] = 'On'
		print("vous etes a la maison, je maintien en temperature confort")
        end

-- si le chauffage est en fonctionnement entre 7h30 et 16h30 et qu'il s'agit d'un jour travaillé, alors
  if (otherdevices[programmateur_chauffage]=='On') and (heure >= '07:30' and heure < '16:30') and (otherdevices[vacances_scolaires]=='Off' or uservariables['jf']=='false' or jour=='mardi' or jour=='jeudi') then
                commandArray[programmateur_chauffage] = 'Off'
		print("vous travaillez, je mets le chauffage en mode eco")
        end

return commandArray
et sur les logs, je vois que c'est les conditions suivantes qui activent et désactivent le switch :

Code : Tout sélectionner

-- si le chauffage est arrêté entre 7h30 et 16h30 et qu'il s'agit d'un jour chômé, alors
        if (otherdevices[programmateur_chauffage]=='Off') and (heure >= '07:30' and heure < '16:30') and (otherdevices[vacances_scolaires]=='On' or uservariables['jf']=='true' or jour=='mercredi' or jour=='vendredi' or jour=='samedi' or jour=='dimanche') then
-- on met le chauffage en marche
                commandArray[programmateur_chauffage] = 'On'
		print("vous etes a la maison, je maintien en temperature confort")
        end

-- si le chauffage est en fonctionnement entre 7h30 et 16h30 et qu'il s'agit d'un jour travaillé, alors
  if (otherdevices[programmateur_chauffage]=='On') and (heure >= '07:30' and heure < '16:30') and (otherdevices[vacances_scolaires]=='Off' or uservariables['jf']=='false' or jour=='mardi' or jour=='jeudi') then
                commandArray[programmateur_chauffage] = 'Off'
		print("vous travaillez, je mets le chauffage en mode eco")
        end
j'en déduis que ça vient de la ligne qui demande la mise à l'arrêt du switch mais je ne comprends pas quelle est la condition validée qui conduit à cette mise à l'arrêt (le switch "vacances scolaires" n'est pas activé).

Merci pour votre aide parce que ça fait plusieurs semaines que j'ai ce problème et j'ai beau essayer de changer le contrôle de conditions, je n'y arrive pas.
Tonio16
Messages : 349
Inscription : 13 oct. 2017, 17:00

Re: Problème d'activation switch virtuel

Message par Tonio16 »

Salut,

Cela fait beaucoup de conditions le tout sans un seul else je trouve. Mettre un else permet de gérer ses conditions plus finement ce qui semble ici le souci. https://fr.wikipedia.org/wiki/Instructi ... rammation)

J'utiliserais aussi un switch virtuel gérer par un autre script ou le planing pour indiquer la présence ou non de quelqu'un dans ta maison, cela devrait simplifier ton script et le rendre plus lisible/compréhensible.

Antoine
Dernière modification par Tonio16 le 14 mars 2019, 18:43, modifié 1 fois.
Domoticz V2020.2 sous raspbian-Buster
Raspberry Pi B+ avec Clé Zigate 3.1d Plugin 4.11.011
lmet
Messages : 252
Inscription : 30 juin 2017, 18:16
Localisation : Val d'Oise
Contact :

Re: Problème d'activation switch virtuel

Message par lmet »

Bonjour,
Quelle est la nature de la uservariables['jf']=='true' ?
Est-ce une chaine qui vaut "true" ou une autre valeur ?
Domoticz : V4.10717
Zigate : V4.11230 plugin:4.5.4 firmware:031a
Mon petit blog domotique
garycooper
Messages : 453
Inscription : 07 août 2017, 23:58

Re: Problème d'activation switch virtuel

Message par garycooper »

c'est une variable créée avec le script "jour férié" que j'ai trouvé ici :
https://easydomoticz.com/forum/viewtopi ... 3%A9#p7162.

La valeur est bien "false" quand ce n'est pas un jour férié.

Du coup, je teste ça :

Code : Tout sélectionner

-- si le chauffage est arrêté entre 7h30 et 16h30 et qu'il s'agit d'un jour chômé, alors
        if ((otherdevices[programmateur_chauffage]=='Off') and (heure >= '07:30' and heure < '16:30')) and (otherdevices[vacances_scolaires]=='On' or uservariables['jf']=='true' or jour=='mercredi' or jour=='vendredi' or jour=='samedi' or jour=='dimanche') then
-- on met le chauffage en marche
                commandArray[programmateur_chauffage] = 'On'
		print("vous etes a la maison, je maintien en temperature confort")
        end

-- si le chauffage est en fonctionnement entre 7h30 et 16h30 et qu'il s'agit d'un jour travaillé, alors
  if ((otherdevices[programmateur_chauffage]=='On') and (heure >= '07:30' and heure < '16:30')) and (otherdevices[vacances_scolaires]=='Off' or uservariables['jf']=='false' or jour=='mardi' or jour=='jeudi') then
                commandArray[programmateur_chauffage] = 'Off'
		print("vous travaillez, je mets le chauffage en mode eco")
        end
lmet
Messages : 252
Inscription : 30 juin 2017, 18:16
Localisation : Val d'Oise
Contact :

Re: Problème d'activation switch virtuel

Message par lmet »

Salut,

Je teste ton script depuis hier --> RAS
Pour l'instant je vois qu'il manque une condition pour le lundi si travaillé.

A voir sur la durée
Domoticz : V4.10717
Zigate : V4.11230 plugin:4.5.4 firmware:031a
Mon petit blog domotique
garycooper
Messages : 453
Inscription : 07 août 2017, 23:58

Re: Problème d'activation switch virtuel

Message par garycooper »

Salut Imet, c'est sympa de tester mon script !

Aujourd'hui encore, j'ai l'alternance des mise en et hors service du switch avec les logs "vous travaillez, je mets le chauffage en mode eco" et "vous etes a la maison, je maintien en temperature confort" qui précèdent les activations de switch.

Pour ce qui est du lundi, tu as raison, il est oublié dans le script. Je le rajoute. Je te confirme que la variable de type chaine "jf" ne change pas d'état pendant la période et le switch "vacances scolaires" non plus.

La vérité est donc ailleurs :)
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Problème d'activation switch virtuel

Message par vil1driver »

garycooper a écrit : 14 mars 2019, 06:41 je ne comprends pas quelle est la condition validée qui conduit à cette mise à l'arrêt
Dans ce cas rajoute des print
Print absolument tout..
jour, heure, jf, vacances etc...

J'essaie dans le we de te proposer une version de ton script à ma façon, pour essai (le lundi est travaillé ?)
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
garycooper
Messages : 453
Inscription : 07 août 2017, 23:58

Re: Problème d'activation switch virtuel

Message par garycooper »

Merci vil1driver ! Oui, le lundi est travaillé
lmet
Messages : 252
Inscription : 30 juin 2017, 18:16
Localisation : Val d'Oise
Contact :

Re: Problème d'activation switch virtuel

Message par lmet »

Ca y est ! En attendant le super script de notre ami vil1driver.

Tu as dit que vacances_scolaires était à "Off" donc :

Code : Tout sélectionner

if (otherdevices[programmateur_chauffage]=='On') and (heure >= '07:30' and heure < '16:30') and (otherdevices[vacances_scolaires]=='Off' or uservariables['jf']=='false' or jour=='mardi' or jour=='jeudi') then
La condition vacances_scolaires == "Off" : On rentre dans la boucle --> Interrupteur "Off"

1 minute plus tard :

Code : Tout sélectionner

if (otherdevices[programmateur_chauffage]=='Off') and (heure >= '07:30' and heure < '16:30') and (otherdevices[vacances_scolaires]=='On' or uservariables['jf']=='true' or jour=='mercredi' or jour=='vendredi' or jour=='samedi' or jour=='dimanche') then
La condition "vendredi" est true : On rentre dans la boucle --> Interrupteur "On"

CQFD ;)

Sinon j'avais amélioré un script qui retourne une seule uservariable (Vrai ou Faux) pour d'éventuels congés, jours fériés et vacances scolaires.
Domoticz : V4.10717
Zigate : V4.11230 plugin:4.5.4 firmware:031a
Mon petit blog domotique
garycooper
Messages : 453
Inscription : 07 août 2017, 23:58

Re: Problème d'activation switch virtuel

Message par garycooper »

Bien vu Imet ! Je ne l'avais pas analysé comme ça... En fait, il faudrait que je mette un "et" pour associer le jour et le fait en vacances ou un jour férié ?

Merci pour ton script. Je l'avais vu et envisagé pour n'avoir qu'une variable mais l'avantage du script vacances scolaires que j'avais trouvé est que les dates des vacances scolaires sont récupérées automatiquement sur le site de l'éducation nationale via un fichier XML.
Répondre