Page 1 sur 1

Dzvent: conditions sur multiple device.id et boucles

Posté : 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

Posté : 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

Posté : 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

Posté : 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

Posté : 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

Posté : 15 sept. 2019, 15:26
par hestia
:D

Re: Dzvent: conditions sur multiple device.id et boucles

Posté : 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

Posté : 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

Posté : 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 !!!!