Steven Posté(e) le 1 juillet 2016 Signaler Posté(e) le 1 juillet 2016 Fréquemment j'ai besoin taper une simple URL pour mettre à jour une VG, mettre à jour un label, recevoir l'état de mon IPX, tout en déclenchant un scénario ... mais mettre un place un script qui fait un POST sur une Variable Globale est un vrai calvaire car il faut passer par un système tiers (PHP, Java, ...). Et pourtant, Fibaro nous a donner un des outils les plus simples et surtout les plus utile ... les Virtual Devices. Et oui, cela peu surprendre mais saviez-vous que chaque label, slider d'un VD se comportent exactement comme une variable globale. C'est à dire : les données sont persistante (vous pouvez rebooter votre box, la donnée sera toujours là ) les données sont modifiables (via un scène ou un appel http .. nous y reviendrons) le changement de valeur active un trigger Allez passons au chose sérieuse. Donc si je résume cela veux dire que si je fait un appel HTTP GET pour changer un label et que le changement de ce dernier active un trigger, je peux donc ... heuuuu ... dire zut au variable globale. En effet, voici un exemple concret et simple : Créons un Virtuel Device avec un simple label que nous allons appeler ainsi : Label : V.Globales ID : VG Notons en passant l'ID de ce nouveau VD. Maintenant si depuis un navigateur, je tape cette URL, je vais changer la valeur de mon label : http://<user>:<password>@<IP_DE_MA_HC2>/api/callAction?deviceID=<ID_VD>&name=setProperty&arg1=ui.VG.value&arg2=<MaNouvelleValeur> Ok mais quel intérêt ? L'intérêt vient en ajoutant une scénario derrière tout cela : --[[ %% properties 484 ui.VG.value --]] actions = { ["ui.VG.value"] = function(values) for k,v in pairs(json.decode(values)) do if (fibaro:getGlobalValue(k) ~= v) then fibaro:setGlobal(k, v) end end end, } -- =============================== -- Démarrage du script -- =============================== local trigger = fibaro:getSourceTrigger() if (trigger.type == "property") then property = trigger.propertyName device = trigger.deviceID value = fibaro:getValue(device, property) actions[property](value) end Que va donc faire ce script et ben il va écouter si la valeur ui.VG.value de mon VG (484 chez moi) change et si elle change et bien il va lire la valeur et mettre à jour mes variables globales. En reprenant l'URL ci-dessus, en remplacant <MaNouvelleValeur> par un json au format simple {NomVariable:valeur, NomVariable2:valeur, ...} Exemples: {'Pushbullet':'Message'} {'Pushbullet':'Message', 'Chauffage':'Vacances} http://<user>:<password>@<IP_DE_MA_HC2>/api/callAction?deviceID=<ID_VD>&name=setProperty&arg1=ui.VG.value&arg2={'Pushbullet':'Message'} Et voilà , il ne reste plus qu'à "caché" le VD et la scène et vous avez un moyen simple de mettre à jour vos VG avec un simple GET HTTP. Pour allez plus loin, voici ma scène pour vous donner des idées --[[ %% properties 484 ui.Portail.value 484 ui.ConsoGlobal.value 484 ui.VG.value 484 ui.IPX.value 484 ui.Properties.value --]] actions = { ["ui.Portail.value"] = function(value) fibaro:call(466, "setProperty", "ui.Label1.value", value) end, ["ui.ConsoGlobal.value"] = function(value) fibaro:call(283, "setProperty", "ui.Label1.value", "Global " .. value) end, ["ui.VG.value"] = function(values) setVG(values) end, ["ui.IPX.value"] = function(values) setIPX(values) end, ["ui.Properties.value"] = function(values) setProperties(values) end, } -- ----------------------------------------------------- -- set les Variables Globales reçues -- Ex : {'Pushbullet'='Coucou', 'Chauffage'='Vacances'} -- ----------------------------------------------------- function setVG(values) for k,v in pairs(json.decode(values)) do if (fibaro:getGlobalValue(k) ~= v) then fibaro:setGlobal(k, v) end end end -- ----------------------------------------------------- -- Traite les inputs / outputs de l'ipx -- M2M -> Push -- Ex : {'in'='$I', 'out'='$O'} -- ----------------------------------------------------- function setIPX(values) for k,v in pairs(json.decode(values)) do val = string.sub(v, 1, 8) val = string.gsub(val, "1", " ¦ " ) val = string.gsub(val, "0", " ? ") fibaro:debug(k .. " = " .. val) if (k == 'in') then fibaro:call(80, "setProperty", "ui.lblIn.value", val) else fibaro:call(80, "setProperty", "ui.lblOut.value", val) end end end -- ----------------------------------------------------- -- set les propriétés ou valeurs d'un module -- Ex : [{'id'=123, 'property'='setValue', 'value'=100}, {'id'=234, 'property'='ui.Label1.value', 'value'='Message'}] -- ----------------------------------------------------- function setProperties(values) fibaro:debug(values) local tablejson = json.decode(values) if (#tablejson > 0) then for k,v in pairs(tablejson) do setProperty(v) end else setProperty(tablejson) end end -- ----------------------------------------------------- -- set une propriété ou valeur d'un module -- Ex : {'id'=123, 'property'='setValue', 'value'=100} -- ----------------------------------------------------- function setProperty(v) fibaro:debug(json.encode(v)) if (v.property == "setValue") then --fibaro:call(v.id, "setValue", v.value) fibaro:debug("Value " .. v.id .. " = " .. v.value) else -- fibaro:call(v.id, "setProperty", v.property, v.value) fibaro:debug("Property " .. v.id .. " " .. v.property .. " = " .. v.value) end end -- =============================== -- Démarrage du script -- =============================== local trigger = fibaro:getSourceTrigger() if (trigger.type == "property") then property = trigger.propertyName device = trigger.deviceID value = fibaro:getValue(device, property) actions[property](value) end Amusez-vous bien 5
Nico Posté(e) le 1 juillet 2016 Signaler Posté(e) le 1 juillet 2016 En fait c'est un peu ce que je faisais avant depuis ma Zibase pour piloter mes VDs sensors correspondant, et en plus on peut trigger le label depuis GEA. Désormais plus trop besoin, car j'utilise la technique des modules morts/inutilisées. Mais je confirme, c'est top, car cela évite de devoir gérer des tonnes de VG !!
pepite Posté(e) le 1 juillet 2016 Signaler Posté(e) le 1 juillet 2016 super merci pour l'astuce, moi je suis encore tres VG, j'avoue que je n'ai pas encore tout compris au code de the MASTER ;-) Mais j'ai bien compris qu'on recuperait la valeur des labels n les utilisant en trigger et on remettait la valeur du label dans la VG lol Question performance dans ce cas : ecrire dans un label est-il plus rapide que dans une VG ? Vous semblearit-il judicieux d'utiliser des labels en trigger que des VGs pour recup des infos par exemple depuis un autre VD ou autre scene ? j'oubliais, juste trop fort ;-)
Nico Posté(e) le 1 juillet 2016 Signaler Posté(e) le 1 juillet 2016 Pepite, tu ne te souviens plus, on en avais justement discuté dans le topic GEA de cette technique quand je cherchais un lien pour ma Zibase, c'est toi qui m'avait donné le code pour trigger dans GEA :) Niveau perf, je pense que cela ne doit pas changer grand chose, mais le gros plus, c'est que cela évite d'avoir des tonnes de VG, on peut trier, et les intégrer dans les VDs qu'il faut si nécessaire.
pepite Posté(e) le 1 juillet 2016 Signaler Posté(e) le 1 juillet 2016 sisi je m'en souviens bien Nico, ma question etait surtout en terme de perfs compare à l'ecriture sur des VGs faudrait vraiment que je me penche la-dessus pour voir, c'est vrai que mon nombre de VGs augmente, mais je trouve ca tellement pratique. je dois pouvoir réduire en utilisant les labels.. le code de maitre Steven est trop complexe pour un non dev..ca me prend du temps lol
Lazer Posté(e) le 1 juillet 2016 Signaler Posté(e) le 1 juillet 2016 Te prends pas la tête sur les perfs, une écriture ça reste lent, mais tu n'en fait pas 1000 àla seconde comme dans un benchmark. Donc que le label ou la VG soit 2 fois plus rapide/lent, ça ne changera rien. Si tu veux vraiment gagner en perfs, tu fais une lecture avant, tu compares, et tu ne modifies que si nécessaire. Làtu vas gagner.
pepite Posté(e) le 1 juillet 2016 Signaler Posté(e) le 1 juillet 2016 oui, ca c'est ce que j'ai fait des que j'ai commence àessayer de coder suite àtes recommandations..Je n'ecris que si necessaire, 'essaie d'etre le plus precis possible dans les conditions
Nico Posté(e) le 2 juillet 2016 Signaler Posté(e) le 2 juillet 2016 Enfin pareil, si c'est pour mettre àjour un variable une fois par minute, tu ne gagneras strictement rien, c'est tellement transparent pour la box...
sebcbien Posté(e) le 21 juillet 2016 Signaler Posté(e) le 21 juillet 2016 Salut @Steven, Merci infiniment pour ce script que j'utilise pour dialoguer à partir de Jeedom. Ceci dit, je penses que quelques coquilles se sont glissées. Pour que d'autres ne perdent pas le même temps que moi, voici les coquilles. exemple pour envoyer éteindre un dimmer: (properties) {"id":123,"property":"setValue","value":100} et non pas {'id'=123, 'property'='setValue', 'value'=100} et pour les VG {"House_Mode":"Manual"} au lieu de {'House_Mode':'Manual'}
Messages recommandés