tcheri Posté(e) le 27 août 2015 Signaler Posté(e) le 27 août 2015 Bonjour, Je reviens sur un tuto proposé par Steven sur la génération d'ID pour le GEA. http://www.domotique-fibaro.fr/index.php/topic/3477-g%C3%A9n%C3%A9rateur-did-pour-gea-ou-autre-script/?hl=%20local%20%20doit Mon problème est que depuis la V4 et le manque de template (j'ai beaucoup de devices Aeons Labs), je suis amené à faire des reconfigure (le soft reconfigure ne marchant pas toujours) faisant que mes devices changent d'ID. Ayant aussi une slave HC2, le lien s'étant perdu aussi quelques fois, l'ensembles des ID était changé une fois la slave reconnectée. Cela devenait un vrai casse tête pour modifier l'ensemble des VD et scenes. Ce que est constant chez moi, ce sont les noms ! Donc l'idée est de pouvoir appeler les devices par leur nom, pas par leur ID. Je suis donc reparti du script de Steven pour stoker dans une variable globale tous les ID et les noms, permettant ensuite dans le code de faire appel au device par son nom. La solution se compose donc : - d'une variable globale idTable à créer - un script de génération de cette variable (voir plus bas) - d'une fonction de decode de la variable globale en entête de vos scripts/VD : idALL=json.decode(fibaro:getGlobal('idTable')) - et finalement de l'appel à l'ID de module idALL["NOM_DU_MODULE"] dans chaque call : exemple : fibaro:call(tonumber(idALL["NOM_DU_MODULE"]), "turnOff") Même si le problème est déplacé vers le fait qu'il faut retenir les noms (j'utilise le script original de Steven pour en avoir la liste une fois pour toute gardé dans un fichier word), je peux dire qu'au bout de 3 mois, cela a changé ma vie. Ce n'est bien sà»r utile que si vous faites évoluer votre installation, ou avez des besoins de reconfigurer ou de tester la V4... Ce n'est donc sans doute pas adapté à tout le monde. Limitations : - Le seul endroit où les id sont encore nécessaires, c'est en entête de scenes pour les déclencheurs - cela ne marche qu'en V4, car les V3 ne permet pas d'avoir des variables avec une longue string (je sais pas la limite). En v4, j'en ai pas vu le bout :-) Voici le script. Encore merci à Steven --[[ %% properties %% globals --]] local hidden = false --- true pour exporter les devices cachés local dead = false -- true pour exporter les devices morts local excludeType = {"com.fibaro.zwaveDevice", "weather", "HC_user", "iOS_device", "com.fibaro.voipUser"} local excludeID = {} local devicesJSon = api.get("/devices") local devices = {} local names = {} local rooms = {} function addName(name, roomname) if (type(names[name]) == "nil") then names[name] = true return name else return addName(name.."_"..roomname, roomname) end end function getRooms() local roomsJSon = api.get("/rooms") rooms[0] = "inconnu" for k, v in ipairs(roomsJSon) do rooms[v.id] = v.name end end function rename(name, roomname) local name = name:upper():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", "_") local roomname = roomname:upper():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", "_") return addName(name, roomname) end getRooms() for k, v in pairs(devicesJSon) do local doit = (hidden or v.visible) and (dead or not v.dead) if (doit) then for h, w in pairs(excludeType) do if (v.type == w) then doit = false end end if (doit) then for h, w in pairs(excludeID) do if (v.id == w) then doit = false end end end end if (doit) then table.insert(devices, v) end end table.sort(devices, function(a, return a.roomID<b.roomID end) local result = "<BR><BR>-- IDs générés le : " .. os.date("%d/%m/%y à %X") local room = -1 local lastinfo = ""; result = result .. "<BR><BR>local id = {" resultVar = "{" for k, v in ipairs(devices) do if (room ~= v.roomID) then room = v.roomID result = result .. "<BR>--"..rooms[v.roomID].."<BR>" end lastinfo = rename(v.name, rooms[v.roomID]) result = result .. lastinfo .. " = " .. v.id .. ", " resultVar = resultVar .. '"'..lastinfo .. '":' .. v.id .. "," end result = result .. "<BR>}" result = result .. "<BR>" result = result .. "<BR>-- usage :" result = result .. "<BR>-- fibaro:getValue(id[\""..lastinfo .."\"], \"value\")" result = result .. "<BR>-- GEA.add(id[\""..lastinfo .."\"], 30, \"\")" resultVar = resultVar .. '"FIN":999}' --print(result) fibaro:setGlobal("idTable", resultVar) -- TEST local id=json.decode((fibaro:getGlobal('idTable'))); print(fibaro:getGlobal('idTable')) 7
Berale64 Posté(e) le 27 août 2015 Signaler Posté(e) le 27 août 2015 Merci tcheri. Je réfléchissais à quelque chose comme ça, mais j'utilise beaucoup les triggers et je n'ai toujours pas trouvé d'idée pour cela. Quoi qu'il en soit, je crois que je vais l'adopter ! 1
Nico Posté(e) le 27 août 2015 Signaler Posté(e) le 27 août 2015 Pareil, cela me plait bien du coup, car pareil je respecte toujours les noms. 1
jojo Posté(e) le 27 août 2015 Signaler Posté(e) le 27 août 2015 super ! et tu confirmes qu'il n'y a pas de limitation en V4 àla longueur des variables. C'était ma crainte 1
tcheri Posté(e) le 27 août 2015 Auteur Signaler Posté(e) le 27 août 2015 Dans mon cas, j'ai un peu moins de 4.000 caractères et ça passe. Steven est monté à40.000 caractères en test sans soucis. Donc y'a de la marge ! 2
mprinfo Posté(e) le 27 août 2015 Signaler Posté(e) le 27 août 2015 Ah Steven il pousse tout àl extrême lol je vais tester cela Envoyé de mon SM-G900F en utilisant Tapatalk
pepite Posté(e) le 2 septembre 2015 Signaler Posté(e) le 2 septembre 2015 bijour, un peu en retard le gars que je suis ;-) Ca me plait bien ca ;-) vais tester des que possible ;-)
sebcbien Posté(e) le 2 octobre 2015 Signaler Posté(e) le 2 octobre 2015 Alors, ça continue àbien fonctionner ? Pas de bugs au démarrage/reboot par exemple ?
ASTECH44 Posté(e) le 23 octobre 2015 Signaler Posté(e) le 23 octobre 2015 Merci tchery pour le partage de ce script. J'ai notamment des sondes Home Energy Meter DSB09104-ZWEU d'AEON LABS que j'ai dû reconfigurer plusieurs fois avec bien sûr changement d'ID, d'où l'intérêt de créer cette scène permettant de remplir cette variable idTable avec les noms et ID des modules et scènes.. Il faut cependant bien respecter le nombre des parenthèses lors de l'ajout de local idALL=json.decode((fibaro:getGlobal('idTable'))); notamment dans une scène.
Messages recommandés