Berale64 Posté(e) le 21 novembre 2015 Signaler Posté(e) le 21 novembre 2015 Je me demande si Fibaro va, un jour, corriger cette inconsistance dans les VD. Pour modifier une étiquette, on utilise son ID: fibaro:call(IDVD, "setProperty", "ui.Label1.value"," blabla"); Par contre pour actionner un bouton, il faut connaitre sa position dans le VD: fibaro:call(IDVD, "pressButton", 3); Pourquoi pas son ID, ce qui rend les modifs beaucoup plus souples. Étrangement, en mode Bloc, c'est bien l'ID du bouton qui est utilisé; Peut être les pros du LUA ont une idée pour scanner le contenu d'un VD, rechercher un ID particulier et en retourner le numéro qui va bien. 1
Lazer Posté(e) le 21 novembre 2015 Signaler Posté(e) le 21 novembre 2015 Le scan serait une boucle facile à faire (grâce à la lecture du device via l'API), mais ça oblige à mettre ces quelques lignes de LUA dans chaque bouton, chaque main loop, et chaque scène qui va cliquer sur le boutons grâce à leur ID.... donc un peu lourd. Je suis d'accord, ça serait bien que Fibaro fasse évoluer cette fonction. Est-ce que ça leur a déjà été soumis ?
Berale64 Posté(e) le 22 novembre 2015 Auteur Signaler Posté(e) le 22 novembre 2015 J'ai quelques problèmes dépatouiller le json des devices. Voilà la structure: {"id":248,"name":"Pluviometrie","roomID":3,"type":"virtual_device","visible":true,"enabled":true,"properties":{"deviceIcon":1052,"ip":"","port":80,"log":"","logTemp":"","currentIcon":"1052","log":"","logTemp":"","mainLoop":"","ui.Label1.value":"0 mm","ui.Label2.value":"21 mm","ui.Label3.value":"21 mm","ui.Label4.value":"11/22/15 10:00:28","ui.Label5.value":"2 mm","visible":"true", "rows":[{"type":"label","elements":[{"id":1,"lua":false,"waitForResponse":false,"caption":"Today","name":"Label1","favourite":false,"main":false}]}, {"type":"label","elements":[{"id":2,"lua":false,"waitForResponse":false,"caption":"Last Day","name":"Label5","favourite":false,"main":false}]}, {"type":"label","elements":[{"id":3,"lua":false,"waitForResponse":false,"caption":"Last 7 days","name":"Label2","favourite":false,"main":false}]}, {"type":"label","elements":[{"id":4,"lua":false,"waitForResponse":false,"caption":"Last 30 days","name":"Label3","favourite":false,"main":false}]}, {"type":"button","elements":[{"id":5,"lua":true,"waitForResponse":false,"caption":"Refresh","name":"Button11","empty":false,"msg":"---- Data WU ---\nlocal cle_api = \"e165a5bb1d584e41\" -- cle api de chez Wunderground\nlocal pws = \"ICOULOUN7\" -- station ID et voilà le code: --[[ %% properties %% globals --]] local devicesJSon = api.get("/devices") for k, v in pairs(devicesJSon) do if (v.type == "virtual_device") then fibaro:debug(v.name); Rows = v.properties.rows; fibaro:debug(#Rows); for k2, v2 in pairs(Rows) do -- fibaro:debug(v2.type); if (v2.type == "button") then fibaro:debug(v2.elements["name"]); end end end end mais j'obtiens "nil" quand j'imprime le nom du bouton. J'ai pas encore tout compris dans les structures json !!!
jojo Posté(e) le 22 novembre 2015 Signaler Posté(e) le 22 novembre 2015 c'est déjàici que tu as le problème ? fibaro:debug(v.name); essaye dans un VD, car je sais que les requêtes http dans les scènes c'est plus complexe
Berale64 Posté(e) le 22 novembre 2015 Auteur Signaler Posté(e) le 22 novembre 2015 Non, c'est àla ligne 22 quand je cherche le nom du bouton.
Lazer Posté(e) le 22 novembre 2015 Signaler Posté(e) le 22 novembre 2015 elements est un tableau, qui ne semble comporter qu'un seul élément. Essaye comme ceci : fibaro:debug(v2.elements[1].name)
jojo Posté(e) le 22 novembre 2015 Signaler Posté(e) le 22 novembre 2015 j'ai test la solution du non développeur Lazer, et ça fonctionne --[[ %% properties %% globals --]] local devicesJSon = api.get("/devices") for _, v in pairs(devicesJSon) do if (v.type == "virtual_device") then fibaro:debug(v.name.." ["..v.id.."]") Rows = v.properties.rows fibaro:debug("#rows : " ..#Rows) for _, v2 in pairs(Rows) do fibaro:debug("Row type : " ..v2.type) if (v2.type == "button") then fibaro:debug(v2.elements[1].name) end end end end
Berale64 Posté(e) le 22 novembre 2015 Auteur Signaler Posté(e) le 22 novembre 2015 Youpi !!!! Lazer, the best ... Merci. Merci Jojo. Il va falloir que j’approfondisse car quand on a plusieurs boutons sur la même ligne je n'imprime que le premier.
Lazer Posté(e) le 22 novembre 2015 Signaler Posté(e) le 22 novembre 2015 voilàpourquoi elements est un tableau. Il que que tu parcours le tableau elements avec un boucle for, afin de détecter tous les boutons de la même ligne (4 maxi)
Berale64 Posté(e) le 22 novembre 2015 Auteur Signaler Posté(e) le 22 novembre 2015 Et voilà. ça roule: --[[ %% properties %% globals --]] local devicesJSon = api.get("/devices") for k, v in pairs(devicesJSon) do if (v.type == "virtual_device") then fibaro:debug("----"..v.name); Rows = v.properties.rows; fibaro:debug(#Rows); for k2, v2 in pairs(Rows) do -- fibaro:debug(v2.type); if (v2.type == "button") then n = #v2.elements; for i = 1,n do fibaro:debug(v2.elements[i].name.." "..v2.elements[i].id); end end end end end L'idée, maintenant, serait de faire une variable globale, comme les IDs pour GEA, avec juste le nom des boutons, mais ils doivent être tous différents ou alors nom du VD concaténé avec nom du bouton.
Lazer Posté(e) le 22 novembre 2015 Signaler Posté(e) le 22 novembre 2015 oui je te conseille plutôt de concaténer avec le nom du VD. Sinon il est quasi certain que tu auras des boutons en double (un exemple : tous mes fils pilotes ont chacun un VD qui sont tous identiques) pour la variable globale, il y a l'astuce du json.encode() pour stocker un tableau dans la VG.
Berale64 Posté(e) le 22 novembre 2015 Auteur Signaler Posté(e) le 22 novembre 2015 Voilàle résultat. La clé est donc "nom du VD" signe "_" ID du bouton. Le tout est enregistré dans une variable globale VDButtons que vous devez créer. --[[ %% properties %% globals --]] local keyButtons = "{"; local devicesJSon = api.get("/devices"); for k, v in pairs(devicesJSon) do if (v.type == "virtual_device") then Rows = v.properties.rows; fibaro:debug("----"..v.name.." "..#Rows); for k2, v2 in pairs(Rows) do if (v2.type == "button") then n = #v2.elements; for i = 1,n do fibaro:debug(v2.elements[i].name.." "..v2.elements[i].id); local str = v.name.."_"..v2.elements[i].name; str = str:gsub("[éêèë]", "E"):gsub("EE", "E"):gsub("[ûüù]", "U"):gsub("UU", "U"):gsub("[àâä]", "A"):gsub("AA", "A"):gsub("[öô]", "O"):gsub("OO", "O"):gsub("[îï]", "I"):gsub("II", "I"):gsub("%W", "_"); fibaro:debug(str); keyButtons = keyButtons..'"'..str..'":'..v2.elements[i].id..','; end end end end end keyButtons = keyButtons.."}"; print(keyButtons); fibaro:setGlobal("VDButtons", keyButtons);
jojo Posté(e) le 24 novembre 2015 Signaler Posté(e) le 24 novembre 2015 voilàBerale24, Comme je trouve que ce n'est pas ànous àdévelopper des usines àgaz pour faire cela, j'ai posté ta suggestion sur le forum officiel http://forum.fibaro.com/index.php?/topic/20075-call-virtual-devices-button-by-his-id/
Berale64 Posté(e) le 24 novembre 2015 Auteur Signaler Posté(e) le 24 novembre 2015 Merci mister Jojo.
Messages recommandés