dbreux Posté(e) le 6 mars 2017 Signaler Posté(e) le 6 mars 2017 Bonjour, jusqu'à maintenant j'utilisais les blocs pour faire mes "petits" scénarios. cette fois je suis passé au LUA pour la gestion de ma chaudière et la pompe de circulation. j'ai conservé un thermostat programmable (jour/heure/temp/manu/auto..) et je récupère le contact sec sur un fgbs-001, qui me sert également (avec deux sondes) à mesurer sur un tuyau la température (eau chauffé) et une autre pour la température d'ambiance. au déclenchement thermostat je démarre la chaudière et la pompe de circulation, ça fonctionne. température du thermostat atteinte, arret chaudière mais la pompe continue à fonctionner et quand la température arrive en dessous d'une valeur (pour l'instant 40 degrés), j'arrete la pompe. c'est l'arret de la pompe qui ne fonctionne pas, voici mon code de débutant de chez débutant - merci de votre aide (je ne connais que les fonctions qui sont dans ce script) Didier --[[ %% properties 342 value 329 value %% events %% globals --]] -- 327 = Pompe circulation -- 329 = Chaudière / Bruleur -- 342 = Thermostat radiateur cuisine -- 345 = Température circulation local MarchePompe --Déclaration variable "MarchePompe" local Thermostat --Déclaration thermostat en chauffe local ChaudiereEnMarche --Déclaration chaudière en marche local TemperatureCirculation -- Déclaration température circulation MarchePompe = fibaro:getValue(327, 'value') ChaudiereEnMarche = fibaro:getValue(329, 'value') Thermostat = fibaro:getValue(342, 'value') TemperatureCirculation = fibaro:getValue(345, 'value') if (Thermostat == '0') then fibaro:call(329, 'turnOn') -- Marche chaudière fibaro:debug('Thermostat 1er if = ' .. Thermostat) fibaro:debug('Chaudière en Marche 1er if = ' .. ChaudiereEnMarche) if (ChaudiereEnMarche == '1') or (Thermostat == '0') then fibaro:call(327, 'turnOn') -- Marche pompe circulation fibaro:debug('Pompe circulation 2e if = ' .. MarchePompe) end else fibaro:call(329, 'turnOff') -- Arret Chaudière fibaro:debug('Chaudière en Marche else = ' .. ChaudiereEnMarche) -- fibaro:sleep(60000) -- tempo avant arret pompe 60 secondes if tonumber (TemperatureCirculation) < 40 then fibaro:call(327, 'turnOff') --- Arret pompe de circulation fibaro:debug('Pompe circulation tonumber = ' .. MarchePompe) end end fibaro:debug('Thermostat2 = ' .. Thermostat) fibaro:debug('Température Circulation2 = ' .. TemperatureCirculation)
jjacques68 Posté(e) le 7 mars 2017 Signaler Posté(e) le 7 mars 2017 Tu arrives a rentrer dans la boucle ? Il y a 8 heures, dbreux a dit : if tonumber (TemperatureCirculation) < 40 then Il dit quoi le debug ?
dbreux Posté(e) le 7 mars 2017 Auteur Signaler Posté(e) le 7 mars 2017 Oui, il rentre dans la boucle, car le debug m'affiche chaudière à 0 dans le Else .En fait je ne suis pas sur justement, j'ai remarqué que quand je clique dans start pour voir les debugs et que les conditions sont réunies pour arrêter la pompe, la, la pompe s'arrete (je suis pas sur n'étant pas certains ce que fait le "start" à noter quand j'utilise le sleep, ça fonctionne la pompe s'arrete bien, c'est mon if avec Tonumber qui semble ne pas fonctionner merci
pepite Posté(e) le 7 mars 2017 Signaler Posté(e) le 7 mars 2017 Bonjour, Que souhaites tu faire exactement ? Dans ton entete tu as mis 329 et 342, tu souhaites donc que ta scene demarre sur le changement de propriétes de ta chaudiere ou de ton thermostat cuisine ? Puis ce que je comprends : - SI thermostat cuisine (342) = 0 alors allume la chaudiere (329) --> si chaudiere (329) en marche ou si thermostat (342) = 0 alors allumage pompe (327) - SINON (donc si thermostat 342 = 1 ou autre) alors extinction chaudiere (329) --> si temperature circulation < 40 alors arret pompe (327) C'est bien ca ?
dbreux Posté(e) le 7 mars 2017 Auteur Signaler Posté(e) le 7 mars 2017 J'ai ajouté dans l'en-tête la chaudière un peu comme ça pour voir... C'est l'état du thermostat qui effectivement démarre ma scène Oui oui pour le fonctionnement que tu précises Merci Envoyé de mon SM-G935F en utilisant Tapatalk
pepite Posté(e) le 7 mars 2017 Signaler Posté(e) le 7 mars 2017 D'accord, Et Thermostat (342) prend bien les valeurs 0 et 1 ? donc : - quand tu passes le thermostat à 1 tu veux que ca allume la chaudiere et la pompe ? - quand le thermostat est à 0 tu eteins la chaudiere puis la pompe quand < 40 ?
pepite Posté(e) le 7 mars 2017 Signaler Posté(e) le 7 mars 2017 (modifié) Essaie cela. ATTENTION Postulat de base, THERMOSTAT = 1 pour allumage chaudiere et pompe Plus toutes les erreurs de syntaxe eventuelles ;-) --[[ %% properties 342 value %% events %% globals --]] -- 327 = Pompe circulation -- 329 = Chaudière / Bruleur -- 342 = Thermostat radiateur cuisine -- 345 = Température circulation local Source = fibaro:getSourceTrigger() local Pompe = tonumber(fibaro:getValue(327, 'value')) --Déclaration variable Pompe local Chaudiere = tonumber(fibaro:getValue(329, 'value')) --Déclaration thermostat local Thermostat = tonumber(fibaro:getValue(342, 'value')) > 0 --Déclaration chaudière en marche local TemperatureCirculation = tonumber(fibaro:getValue(345, 'value')) -- Déclaration température circulation function Run() if Thermostat then fibaro:call(329, 'turnOn') -- Marche chaudière fibaro:call(327, 'turnOn') -- Marche pompe circulation fibaro:debug(" Mise en marche Pompe : " ..Pompe.. " - Chaudiere : " ..Chaudiere) else fibaro:call(329, 'turnOff') -- Arret Chaudière fibaro:debug("Arret chaudiere : " ..Chaudiere) end setTimeout(function() if (Chaudiere == 0) and (TemperatureCirculation < 40) then fibaro:call(327, 'turnOff') --- Arret pompe de circulation fibaro:debug("Arrêt Pompe 60 secs après arrêt chaudiere: " ..Pompe) end end, 60*1000) -- tempo avant arret pompe 60 secondes end if Source["type"] == "property" then Run() end Modifié le 7 mars 2017 par pepite
jjacques68 Posté(e) le 7 mars 2017 Signaler Posté(e) le 7 mars 2017 Il y a 8 heures, dbreux a dit : c'est mon if avec Tonumber qui semble ne pas fonctionner Si tu fais un debug de ce tonumber tu obtiens quoi ? @pepite, le setTimeout va te faire un bouclage toutes les 60 secondes, nan ? moi j'aurai, dans ce cas, laisser un sleep dans la condition : Il y a 2 heures, pepite a dit : if (Chaudiere == 0) and (TemperatureCirculation < 40) then Ou alors j'ai mal compris !?
pepite Posté(e) le 7 mars 2017 Signaler Posté(e) le 7 mars 2017 (modifié) @jjacques68, Non pas dans ce cas là (sauf erreur comme d'hab). Placé comme il est et écrit comme ceci setTimeout(function()..... if...then.. end end, delay*1000) La lecture du code DANS le setTimeout ne se fera qu'apres le delai (delay). En fait c'est une pause MAIS qui ne met pas le code en pause. Je m'explique : un code : if...then...end setTimeout(function()... if..then..end end, delay*1000) if ...then...end le code va faire 1- le 1er IF 2- le 2eme IF 3 - settimeout après le delai Avec un sleep if...then...end sleep() if then end if then end le code fait : 1- 1er IF 2- ARRET du delai du sleep 3- 2eme IF 4- 3eme IF Pour boucler avec un setTimeout, il faut appeler LA fonction concernée en paramètre du setTimeout au sein même de la fonction declaree..heuuu function Run() if..then .... end setTimeout(Run, delay*1000) end Run() la fonction Run() contenant le settimeout dans sa propre declaration va boucler Modifié le 7 mars 2017 par pepite
jjacques68 Posté(e) le 7 mars 2017 Signaler Posté(e) le 7 mars 2017 il y a 5 minutes, pepite a dit : Pour boucler avec un setTimeout, il faut appeler 1 fonction declarée precedemment en paramètre du setTimeout oui c'est vrai ! c'est que je fais souvent en plus ! mais alors pour la première explication, je savais pas du tout ! J'ai du mal à comprendre... ce foutu setTimeout n'a jamais été vraiment expliqué nul part... Mais alors quel est l'intérêt d'avoir une condition qui s'exécute après un délais alors que le reste du code continue à tourner... !? D'ailleur pour le bouclage, on pourrait aussi utiliser un while true do non ? Avec un sleep dedans ?
dbreux Posté(e) le 8 mars 2017 Auteur Signaler Posté(e) le 8 mars 2017 Merci de vos retours, je vais tester fin semaine Envoyé de mon SM-G935F en utilisant Tapatalk
dbreux Posté(e) le 12 mars 2017 Auteur Signaler Posté(e) le 12 mars 2017 J'ai pas encore trouvé le temps de tester vos différents propositions. Envoyé de mon SM-G935F en utilisant Tapatalk
Steven Posté(e) le 13 mars 2017 Signaler Posté(e) le 13 mars 2017 Il y a un soucis au code proposé. Si après 60 secondes la température n'est pas en dessous des 40 ... plus rien ne se passe. Il faudrait relancer le "Run()" dans le setTimeout(). setTimeout(function() if (Chaudiere == 0) and (TemperatureCirculation < 40) then fibaro:call(327, 'turnOff') --- Arret pompe de circulation fibaro:debug("Arrêt Pompe 60 secs après arrêt chaudiere: " ..Pompe) else Run() end end, 60*1000) -- tempo avant arret pompe 60 secondes 1
pepite Posté(e) le 13 mars 2017 Signaler Posté(e) le 13 mars 2017 Merci master, @Steven, J'ai certainement mal compris le besoin, dans son 1er code, il disait que cela s'arretait ;-) donc je n'ai aps relance le run ;-) Mais suis d'accord, ceinture et bretelle, comme ca, au cas où ca eteint ;-)
dbreux Posté(e) le 14 mars 2017 Auteur Signaler Posté(e) le 14 mars 2017 Le sleep est provisoire c'est juste en attendant de trouver la bonne solution, actuellement dans mon programme c'est le sleep qui arrête bien la pompe La finalité, (pas de sleep) c'est quand la température est inférieure à mon consigne, je coupe la pompe, c'est ça qui ne fonctionne pas Merci Envoyé de mon SM-G935F en utilisant Tapatalk
Steven Posté(e) le 14 mars 2017 Signaler Posté(e) le 14 mars 2017 Alors si tu reprends le script de @pepite (<-- bien joué) et que tu le modifie un tout petit peu, cela fait exactement ce que tu veux. Juste qu'il va vérifier toutes les minutes la température et il stoppe la pompe quand elle sera en dessous des 40. Si tu trouves que toutes les 60 secondes c'est trop ou pas assez, tu n'as plus qu'à changer la valeur "local rafraichissement = 60" par le nombre de secondes de ton choix. --[[ %% properties 342 value %% events %% globals --]] -- 327 = Pompe circulation -- 329 = Chaudière / Bruleur -- 342 = Thermostat radiateur cuisine -- 345 = Température circulation local rafraichissement = 60 local Source = fibaro:getSourceTrigger() local Pompe = tonumber(fibaro:getValue(327, 'value')) --Déclaration variable Pompe function Run() local Chaudiere = tonumber(fibaro:getValue(329, 'value')) --Déclaration thermostat local Thermostat = tonumber(fibaro:getValue(342, 'value')) > 0 --Déclaration chaudière en marche local TemperatureCirculation = tonumber(fibaro:getValue(345, 'value')) -- Déclaration température circulation if Thermostat then fibaro:call(329, 'turnOn') -- Marche chaudière fibaro:call(327, 'turnOn') -- Marche pompe circulation fibaro:debug(" Mise en marche Pompe : " ..Pompe.. " - Chaudiere : " ..Chaudiere) else fibaro:call(329, 'turnOff') -- Arret Chaudière fibaro:debug("Arret chaudiere : " ..Chaudiere) end setTimeout(function() if (Chaudiere == 0) and (TemperatureCirculation < 40) then fibaro:call(327, 'turnOff') --- Arret pompe de circulation fibaro:debug("Arrêt Pompe 60 secs après arrêt chaudiere: " ..Pompe) else Run() end end, rafraichissement*1000) -- tempo avant arret pompe 60 secondes end if Source["type"] == "property" then Run() end 2
dbreux Posté(e) le 17 mars 2017 Auteur Signaler Posté(e) le 17 mars 2017 Me revoilà je vais tester le script à steven ce week end. toutefois comme je vous le disais je débute en lua, j'aimerai comprendre certaines lignes et avoir quelques explications pourquoi mon script ne marchait pas et comprendre la fonction run particulièrement j'ai repris une partie des lignes avec en face mon commentaire dont quelques explications me seraient utiles - local rafraichissement = 60 <-- je suppose qu'on charge 60 dans la variable local Source = fibaro:getSourceTrigger() <-- ??? function Run() <-- ??? setTimeout(function() <-- ??? else Run() <--- ?? end end, rafraichissement*1000) -- tempo avant arret pompe 60 secondes <-- ?? end if Source["type"] == "property" then <-- ?? Run() end Merci pour vos explications
dbreux Posté(e) le 18 mars 2017 Auteur Signaler Posté(e) le 18 mars 2017 (modifié) Je viens de tester le script y a quelques disfonctionnement : le script est en position off le thermostat est déclenché (contact sec ouvert) Pompe et chaudière off ------- je passe le script en position on il se passe rien ------- le thermostat s'enclenche (contact sec fermé) debut : Arret chaudière = 0 Pompe et chaudiière off 60 secondes plus tard debut : Arrêt Pompe 60 secs après arrêt chaudiere = 0 Pompe et chaudière off ------ le thermostat est déclenché (contact sec ouvert) debut : Mise en marche Pompe : " ..Pompe.. " = 0 - Chaudiere : " ..Chaudiere) = 0 Pompe et chaudière ON 60 seconces plus tard debut : Arrêt Pompe 60 secs après arrêt chaudiere = 0 Pompe OFF & chaudière ON ----- j'ai forcément arreté tout puisque la pompe de circulation était en off. ------ Modifié le 18 mars 2017 par dbreux
dbreux Posté(e) le 21 mars 2017 Auteur Signaler Posté(e) le 21 mars 2017 Help@steven merci Envoyé de mon SM-G935F en utilisant Tapatalk
pepite Posté(e) le 21 mars 2017 Signaler Posté(e) le 21 mars 2017 Le 18/3/2017 à 10:57, dbreux a dit : je passe le script en position on il se passe rien Bonjour, Je ne comprends pas comment tu lances le script ? La scene se lance sur changement de valeur de ton module 342 J'ai du mal à suivre, qu'est-ce qui ne fonctionne pas...j'essaie de me remettre dedans
pepite Posté(e) le 21 mars 2017 Signaler Posté(e) le 21 mars 2017 J'ai relu tranquillement ;-) En fait que tu enclenches le thermostat, il fait le "ELSE" de la fonction "Run", soit l'arret de la chaudiere : 329 Quelle est la valeur de "value" de ton module 342, soit ton thermostat lorsque tu l'enclenches donc ON ? Dans le code : - SI 342 > 0 alors : --> mise en route de la chaudiere (329) --> mise en route de la pompe (327) -- SINON : --> arret de la chaudiere
dbreux Posté(e) le 21 mars 2017 Auteur Signaler Posté(e) le 21 mars 2017 Quand le contact se ferme le thermostat passe à 0 (demande de chauffe), quand le contact s'ouvre le thermostat passe à 1 (température ambiante atteinte)
dbreux Posté(e) le 21 mars 2017 Auteur Signaler Posté(e) le 21 mars 2017 (modifié) j'ai modifié : ajouter : local Thermostat supprimer :local Thermostat = tonumber(fibaro:getValue(342, 'value')) > 0 et remplacer if Thermostat then par if (Thermostat == '0') then ça a l'air de fonctionner (je continue de surveiller) reste qu'il y des fonctions dont je ne sais pas leur fonction Modifié le 21 mars 2017 par dbreux
pepite Posté(e) le 21 mars 2017 Signaler Posté(e) le 21 mars 2017 A priori oui, si demande de chauffe est 0 c'est bien cela ;-) leur fonction ?
dbreux Posté(e) le 21 mars 2017 Auteur Signaler Posté(e) le 21 mars 2017 j'ai repris une partie des lignes avec en face mon commentaire dont quelques explications me seraient utiles - local rafraichissement = 60 <-- je suppose qu'on charge 60 dans la variable local Source = fibaro:getSourceTrigger() <-- ??? function Run() <-- ??? setTimeout(function() <-- ??? else Run() <--- ?? end end, rafraichissement*1000) -- tempo avant arret pompe 60 secondes <-- ?? end if Source["type"] == "property" then <-- ?? Run() end
Messages recommandés