Declenchement permanent de script de type "device

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 <\>.
Sherco49
Messages : 46
Inscription : 18 mars 2018, 16:29

Declenchement permanent de script de type "device

Message 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 ?
boum
Messages : 233
Inscription : 18 janv. 2019, 11:34
Localisation : France

Re: Declenchement permanent de script de type "device

Message 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
Domoticz v2022.2 sur linux-mint / Z-Wave-JS / RFXCom / Zigbee2MQTT
Sherco49
Messages : 46
Inscription : 18 mars 2018, 16:29

Re: Declenchement permanent de script de type "device

Message 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
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Declenchement permanent de script de type "device

Message 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
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
Répondre