Page 1 sur 1
Dzvent: conditions sur multiple device.id et boucles
Publié : 13 sept. 2019, 17:55
par Loky31200
Bonjour a tous,
Faisant quelque scripts en Dzvent j'ai constaté que certaine typologie ne marchaient pas alors que pourtant cela me paraissait assez logique...
Par exemple :
"if (device.id == (1 or 2 or 3 or 4)) then"
Ou encore
"if (device.id ~= (1 and 2 and 3 and 4)) then"
Est ce normal? ou alors je m'y prends à contre sens?
De même je n'arrive pas a faire fonctionner les boucles for du type:
for i= {1, 5 ,8 , 14, 19} do
block de code
end
Là aussi, je dois écrire un truc indigeste mais sans le savoir

Merci de votre aide.
Re: Dzvent: conditions sur multiple device.id et boucles
Publié : 13 sept. 2019, 19:26
par hestia
bonjour
un exemple
Code : Tout sélectionner
local LIGHTS= { 112 , 713}
return {
on = { timer = { "every minute" },
devices = LIGHTS
},
logging = { level = domoticz.LOG_DEBUG,
marker = "ZwaveTestSilent" },
execute = function(dz, item)
local zwaveDevice
if item.isTimer then
for i1, l1 in ipairs(LIGHTS) do
zwaveDevice = dz.devices(l1)
dz.log('Device '.. zwaveDevice.name .. " (" .. zwaveDevice.id .. ")" , dz.LOG_DEBUG)
zwaveDevice.toggleSwitch().silent()
dz.log('State of Device '.. zwaveDevice.name .. " (" .. zwaveDevice.id .. ") will be changed. Now: " .. zwaveDevice.state, dz.LOG_DEBUG)
end
else
dz.log(".............. This should not happen !! " .. item.id .. " " .. item.name .. " " .. item.state, dz.LOG_ERROR)
end
end
}
Pour le test de l'égalité multiple, le faire dans la boucle
Re: Dzvent: conditions sur multiple device.id et boucles
Publié : 15 sept. 2019, 00:00
par Loky31200
Merci beaucoup pour l'exemple
Avant d'appliquer, j'aimerai comprendre la ligne :
for i1, l1 in ipairs(LIGHTS) do
C'est les l1 égaux aux id des devices dans "Lights" qui vont être utilisés, c'est bien ca?
Un petite traduction de cette ligne m'aiderai
Désolé pour les questions de noob :s
Re: Dzvent: conditions sur multiple device.id et boucles
Publié : 15 sept. 2019, 12:07
par hestia
je dirai le contraire, il n'y a pas de risque à essayer pour comprendre
dzVent est basé sur LUA que je ne connais pas et je ne suis pas un codeur...
"C'est les l1 égaux aux id des devices dans "Lights" qui vont être utilisés, c'est bien ca?" => oui
Voici un autre script à lancer avec tes idx en regardant le résultat des print on comprend ... j'espère sinon on en reparle
Code : Tout sélectionner
local LIGHTS= {112, 453, 142, 569, 645, 631, 478, 170, 662}
return {
on = { timer = { "every minute" }
},
logging = {level = domoticz.LOG_DEBUG},
execute = function(dz, item)
local dzDevice
for i, idx in ipairs(LIGHTS) do
dzDevice = dz.devices(idx)
print('i= ' .. i .. ' idx= ' .. idx .. ' device= '.. dzDevice.name .. " (" .. dzDevice.id .. ")")
end
end
}
Re: Dzvent: conditions sur multiple device.id et boucles
Publié : 15 sept. 2019, 12:29
par Loky31200
Merci pour les explications
C'est bon j'ai capté la mécanique, très pratique !!
Jusque là je ne m'étais pas posé la question car j'avais au maxi deux à trois capteurs a vérifier, donc je faisais cela à l'ancienne
Merci encore !
Re: Dzvent: conditions sur multiple device.id et boucles
Publié : 15 sept. 2019, 15:26
par hestia
Re: Dzvent: conditions sur multiple device.id et boucles
Publié : 16 sept. 2019, 10:57
par Loky31200
Tiens quitte à rentrer dans le sujet, autant aller jusqu'au bout
Comment cela marche si je veux utiliser des "doublettes" ou "triplets" ?
Typiquement lier la proba de pluie à 1h avec la température et le vent qu'il y 'aura à 1H et enchainer avec les combinaisons suivantes à 2H, 4H etc
Est ce que je peux déclarer quelque chose du genre:
local previsions = {{1,5,6},{2,4,8}}
ou alors je suis complètement à coté de la plaque?
Du coup la ligne "for i1, l1 in ipairs(LIGHTS) do" ressemblerait à quoi ?
J'imagine l1,l2,l3 à la place de l1? Ou du l1[1]?
Je pose la question plutôt que de tattoner des heures avant que "ça tombe en marche"

Re: Dzvent: conditions sur multiple device.id et boucles
Publié : 16 sept. 2019, 12:19
par boum
Si tu sais que les valeurs de ton tableau sont des tableaux à 3 éléments, tu peux accéder directement aux valeurs :
Code : Tout sélectionner
local previsions = {{1,5,6},{2,4,8}}
for i1,triplet in ipairs(previsions) do
locat value1 = triplet[1]
locat value2 = triplet[2]
locat value3 = triplet[3]
-- ...
end
Sinon, il faut itérer de façon générique :
Code : Tout sélectionner
local previsions = {{1,5,6},{2,4,8}}
for i1,value1 in ipairs(previsions) do
for i2,value2 in ipairs(value1) do
-- ici on aura 1, 5 puis 6 à la première itération
end
end
Note que dans le premier cas, tu peux rendre la lecture du script plus lisible qu'avec des index entiers :
Code : Tout sélectionner
local previsions = {
{heure=1, temperature=5, vent =6},
{heure=2, temperature = 4, vent=8},
}
for i1,prevision in ipairs(previsions) do
locat timer = prevision.heure
locat temp = prevision.temperature
locat vent = prevision.vent
-- on peut aussi accéder avec prevision['vent']
-- ou faire une boucle avec for cle,valeur in pairs(prevision) do end
-- ...
end
Re: Dzvent: conditions sur multiple device.id et boucles
Publié : 16 sept. 2019, 19:35
par Loky31200
Alors pour moi qui ne suis pas codeur à l'origine, comment te dire que tes explications et exemples sont justes magiques
Au dela d'avoir compris comment faire mon petit bout de code, je viens de comprendre comment font les mecs dans leurs codes savants où j'étais totalement perdu
Muchas gracias !!!!