Aller au contenu

Messages recommandés

Posté(e)

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.

  • Upvote 1
Posté(e)

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 ?

Posté(e)

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 !!! :(

Posté(e)

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

Posté(e)

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

Posté(e)

Youpi !!!!

 

Lazer, the best ... :13:

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.

Posté(e)

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)

Posté(e)

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.

Posté(e)

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.

Posté(e)

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);
×
×
  • Créer...