Aller au contenu
dbreux

Mon premier script LUA ça marche presque

Recommended Posts

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)
 

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ?

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ?

 

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ?

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par pepite

Partager ce message


Lien à poster
Partager sur d’autres sites
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 !?

Partager ce message


Lien à poster
Partager sur d’autres sites

@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é par pepite

Partager ce message


Lien à poster
Partager sur d’autres sites
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 ?

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci de vos retours, je vais tester fin semaine

Envoyé de mon SM-G935F en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai pas encore trouvé le temps de tester vos différents propositions.

Envoyé de mon SM-G935F en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

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

 

 

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

 

  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par dbreux

Partager ce message


Lien à poster
Partager sur d’autres sites
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

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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)

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par dbreux

Partager ce message


Lien à poster
Partager sur d’autres sites

A priori oui, si demande de chauffe est 0 c'est bien cela ;-)

 

leur fonction ? 

Partager ce message


Lien à poster
Partager sur d’autres sites

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
 
 

Partager ce message


Lien à poster
Partager sur d’autres sites

×