Page 1 sur 2

Problème d'activation switch virtuel

Publié : 14 mars 2019, 06:41
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.

Re: Problème d'activation switch virtuel

Publié : 14 mars 2019, 07:13
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

Re: Problème d'activation switch virtuel

Publié : 14 mars 2019, 18:40
par lmet
Bonjour,
Quelle est la nature de la uservariables['jf']=='true' ?
Est-ce une chaine qui vaut "true" ou une autre valeur ?

Re: Problème d'activation switch virtuel

Publié : 14 mars 2019, 19:55
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

Re: Problème d'activation switch virtuel

Publié : 15 mars 2019, 15:01
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

Re: Problème d'activation switch virtuel

Publié : 15 mars 2019, 16:03
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 :)

Re: Problème d'activation switch virtuel

Publié : 15 mars 2019, 17:16
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é ?)

Re: Problème d'activation switch virtuel

Publié : 15 mars 2019, 19:18
par garycooper
Merci vil1driver ! Oui, le lundi est travaillé

Re: Problème d'activation switch virtuel

Publié : 15 mars 2019, 19:40
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.

Re: Problème d'activation switch virtuel

Publié : 15 mars 2019, 21:25
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.