Page 1 sur 1

Declenchement permanent de script de type "device

Publié : 22 avr. 2020, 13:46
par Sherco49
Bonjour

Je fais un script qui est sensé mettre à jour un device virtuel (Pompe Duree)de type custom, comptant le temps de fonctionnement d'une pompe.
Je fais donc un script lua , trigger sur device", déclenché sur un test devicechanged (On/Off)de l'état de ma pompe (Piscine_Pompe de type switch), et en m'aidant d'une variable utilisateur initialisée quand la pompe passe à On, je calcule la durée jusqu'au Off suivant et ajoute cette durée à la durée déjà existante.
Tout ceci fonctionnerait bien si.... mon script ne se déclenchait pas en permanence ( toutes les secondes ?) au lieu de se déclencher sur un changement d'état

2020-04-22 13:31:12.413 Status: LUA: 811
2020-04-22 13:31:12.414 Status: LUA: 806
2020-04-22 13:31:12.414 Status: LUA: 11.01
2020-04-22 13:31:12.477 Status: EventSystem: Script event triggered: Pompe Piscine temps

2020-04-22 13:31:13.851 Status: LUA: 811
2020-04-22 13:31:13.851 Status: LUA: 806
2020-04-22 13:31:13.851 Status: LUA: 11.06
2020-04-22 13:31:13.958 Status: EventSystem: Script event triggered: Pompe Piscine temps

ci dessous mon code

Code : Tout sélectionner

 --retourne une valeur sur 2 digit (exemple 1 retourne 01)
function deuxDigits(nombre)
	nombre = string.format("%02d",nombre)
	return nombre
end

commandArray = {}

-- Si Piscine_Pompe= 'On'
if devicechanged['Piscine_Pompe'] == 'On' then
  -- alors on met la variable PompeOn avec l'heure de début
     commandArray['Variable:PompeOn'] = (os.date('%H:%M'))
-- sinon ( Piscine_Pompe='Off'
else
  -- alors on récupère l'heure d'arret
     local SFin = (os.date('%H:%M'))
  -- transformation en minutes 
     local MFin=tonumber(string.sub(SFin, 1, 2))*60+tonumber(string.sub(SFin,4,5))
     print (tostring(MFin))
  -- on récupère l'heure de début
     local SDebut= uservariables['PompeOn']
  -- transformation en minutes 
     local MDebut=tonumber(string.sub(SDebut, 1, 2))*60+tonumber(string.sub(SDebut,4,5))
          print (tostring(MDebut))

  -- on fait la fifférence
     local MDuree=MFin-MDebut
  -- on lit la valeur dejà enregistreée
     local SCumul=otherdevices_svalues['Pompe Duree']
     local MCumul=tonumber(string.sub(SCumul, 1, 2))*60+tonumber(string.sub(SCumul,4,5))
     local MCumul=MCumul+MDuree
  -- on convertit la différence au format 'hh.mm'
     local hh = math.floor(MCumul/60)
	 local mm = MCumul % 60
	 -- on formatte la chaine heure
     local SCumul=tostring(deuxDigits(hh))..'.'..tostring(deuxDigits(mm))
     print (SCumul)
  -- on met à jour le device 'Pompe temps de marche'
     commandArray[129] = {['UpdateDevice'] = 129 .. '|0|' .. SCumul}
end

return commandArray
....

Le script déroule que la pompe soit Off ou On

Ou me trompeje ?

Re: Declenchement permanent de script de type "device

Publié : 22 avr. 2020, 14:31
par boum
Le script se déclenche à chaque fois qu'un dispositif est modifié : pompe, mais aussi température, interrupteur…

Du coup, le système interprète ton script ainsi :

Code : Tout sélectionner

commandArray = {}

if devicechanged['Piscine_Pompe'] == 'On' then
  -- le dispositif Piscine_Pompe est modifié et son nouvel état est On
else
  -- n'importe quel dispositif est modifié ou Piscine_Pompe est Off
end
return commandArray
Il suffit de modifier ainsi :

Code : Tout sélectionner

local pompe = devicechanged['Piscine_Pompe']
if not pompe then return commandArray end -- ce n'est pas la pompe qui a changé d'état
if pompe == 'On' then
  -- le dispositif Piscine_Pompe est modifié et son nouvel état est On
else
  -- le dispositif Piscine_Pompe est modifié et son état n'est pas On
end
Ou ainsi — c'est selon le gout de chacun :

Code : Tout sélectionner

local pompe = devicechanged['Piscine_Pompe']
if pompe == 'On' then
  -- le dispositif Piscine_Pompe est modifié et son nouvel état est On
elseif pompe == 'Off' then
  -- le dispositif Piscine_Pompe est modifié et son état est Off
end

Re: Declenchement permanent de script de type "device

Publié : 22 avr. 2020, 15:01
par Sherco49
Un grand merci pour l'explication sur le déclenchement des devices, je n'avais pas compris que l'ensemble des scripts se déclenchaient.
Du coup, je venais juste de trouver une autre solution:

Code : Tout sélectionner

if devicechanged['Piscine_Pompe'] then
    if  otherdevices['Piscine_Pompe'] == "On" then
ca ressemble à ta solution

ce qui ne déclenche plus en permanence, reste a voir si le reste fonctionne encore

Re: Declenchement permanent de script de type "device

Publié : 22 avr. 2020, 17:55
par vil1driver
Salut,

Le script peut n'être déclanché que par ta pompe s'il est nommé exactement comme ta pompe.
En tout cas s'il s'agit d'un fichier.
Je ne sais pas ce qu'il en est des scripts en db.

Autrement j'avais partagé un script universel à cet usage.
https://easydomoticz.com/forum/viewtopi ... +virtuelle