DMK2424 Posté(e) le 31 janvier 2015 Signaler Posté(e) le 31 janvier 2015 Voici l'adaptation pour ceux qui comme moi sont restés en 3.600. A placer dans un bouton d'un Virtual Device. Récupération du résultat dans la fenêtre Debug du bouton. local dead = true -- true pour exporter les devices morts local excludeType = {"weather", "HC_user", "iOS_device"} local excludeID = {} -- Initiate connection with HC2 HC2 = Net.FHttp("127.0.0.1", 11111) response ,status, errorCode = HC2:GET("/api/devices") devicesJSon = json.decode(response) 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() response ,status, errorCode = HC2:GET("/api/rooms") roomsJSon = json.decode(response) 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 = (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 = {" 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 .. ", " 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, \"\")" -- print(result) fibaro:debug(result) 4
pinou Posté(e) le 31 janvier 2015 Signaler Posté(e) le 31 janvier 2015 Merci c'est nickel, ca marche au poil !
Sakkhho Posté(e) le 2 février 2015 Signaler Posté(e) le 2 février 2015 Ca marche très bien en 3.600 merci une question, j'ai ca [DEBUG] 21:12:50: -- IDs générés le : 02/02/15 à 21:12:50 local id = { --inconnu ZWAVE = 1, 50_1 = 51, 1 c'est la box je suppose et le 50_1=51 ? c'est le seul sous ce format.
jojo Posté(e) le 2 février 2015 Signaler Posté(e) le 2 février 2015 le nom qu'il met par défaut, pour tout nouveau device est l'ID, pour le master. Puyr les sous-devices IDmaster_1 (ID = ID master + 1), .... Regarde le device ID 50 et tu verras que le 51 a un nom 50_1
pepite Posté(e) le 10 février 2015 Signaler Posté(e) le 10 février 2015 Salut Steven, J'ai un petit bug qui doit venir de ma facon de nommer mes ID de Virtual DEVICE Voila mon GEA en prod : local id = { WP_HALOGENE = 14, VD_SMSFREE = 16, VD_JOUR_CHOME = 21, VD_MODE_MAISON = 24 } Voila ce que me donne les generateur, : - il supprime mes "VD" qui sont avant le nom - me rajoute un E devant "JOUR_CHOME", ca sent l'encodage - manque un E à SMS_FREE local id = { --Salle à Manger WP_HALOGENE = 14, --Systeme-VD VACANCES_SCOLAIRES = 20, CLOCK_SYNC = 12, JOUR_CHEOME = 21, METEOALERTE = 18, SMS_FRE = 16, MODE_MAISON = 24, } Merci merci ;-)
Bugsissimo Posté(e) le 11 février 2015 Signaler Posté(e) le 11 février 2015 Oui on en a tous. Par exemple Freebox est frebox pour beaucoup.
Steven Posté(e) le 11 février 2015 Auteur Signaler Posté(e) le 11 février 2015 Aucune importance, l'important n'est pas le nom mais le fait que le nom soit toujours le même. Envoyé de mon portable grâce àmes petits doigts.
pepite Posté(e) le 12 février 2015 Signaler Posté(e) le 12 février 2015 oui c'est vrai, merci messieurs ;-)
Sakkhho Posté(e) le 22 février 2015 Signaler Posté(e) le 22 février 2015 je viens de passer en 4.033 et j'ai aussi cette erreur [ERROR] 09:38:27: line 12: attempt to index global 'api' (a nil value) alors que le script pour la 3.60 fonctionnait bien
razowski Posté(e) le 22 février 2015 Signaler Posté(e) le 22 février 2015 Ça doit être juste un message, derrière la lecture est bien réalisée. A vérifier mais chez moi j'ai ce message sur plusieurs scènes mais les valeurs sont bien lues et insérées dans mes variables globales. A vérifier chez toi
Gwendal Posté(e) le 23 février 2015 Signaler Posté(e) le 23 février 2015 Fonctionne super bien chez moi sous V4.033, Merci Steven
Sakkhho Posté(e) le 23 février 2015 Signaler Posté(e) le 23 février 2015 C'est bon pour moi aussi - j'avais loupé une syntaxe.
tcheri Posté(e) le 31 mars 2015 Signaler Posté(e) le 31 mars 2015 Sur base du script de Steven, j'ai adapté pour pouvoir stocker dans une variable globale et pouvoir utiliser un JSON.DECODE au lieu de faire un copier/coller des valeurs dans chaque script ou VD. Donc, voici le script modifié à mettre dans une scène pour mettre la variable globale idTable avec tous les ID et NOMS de device (testé en 4.040) : --[[ %% 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) Ensuite, il suffit de faire appel à la variable globale et faire un décode : local id=json.decode((fibaro:getGlobal('idTable'))); et faire appel à son device par : fibaro:getValue(id["NOM_DE_MON_DEVICE"], "value"))
jojo Posté(e) le 31 mars 2015 Signaler Posté(e) le 31 mars 2015 @tcheri, Bonne idée, mais ! qu'il existe une limite sur la longueur des variables globales, alors, si tu as beaucoup de devices, ton résultat risque d'être tronqué
pepite Posté(e) le 31 mars 2015 Signaler Posté(e) le 31 mars 2015 Sympa ;-) super idee mais demande @steven tout de même.. Pas de variable à créer dans le panneau ? Sinon peut-on toujours appelé ses devices en id["device"] ? Et que se passe-t-il sur la limitation de la longueur des VG ? ca passe tout de même ?
Steven Posté(e) le 31 mars 2015 Auteur Signaler Posté(e) le 31 mars 2015 C'est un sujet qui a déjà été discuter mainte fois sur ce forum, il n'y a pas de solution miracle pour stocker les ID de nos devices. En effet, dans une VG, c'est une idée mais il y a 2 problèmes à cela, et qui pour moi sont rédhibitoire : La limitation en nombre de caractère d'une VG Comment connaitre le nom id["NOM_DE_MON_DEVICE"] En effet, dès que les id sont mis au format json dans une VG, il n'est plus possible de "voir" leur nom (limitation du panneau des variables) ou alors on doit créer un scène qui nous les affiche mais dans ce cas, cela perd un peu de son utilité. Maintenant, a vous de voir selon vos habitudes, désires, ... perso, j'ai que 2 scénarios qui utilisent plus d'un ID donc j'ai pas vraiment d'expérience sur le sujet
tcheri Posté(e) le 31 mars 2015 Signaler Posté(e) le 31 mars 2015 Pour ma part, j'ai 3290 caractères et ça passe (nouveau en V4 ?). Pour le nom de device, j'utilise ton output comme pense bête, comme ça je retouve facilement mes noms de device @pepite : oui, il faut créer une variable globale dans le panneau
Steven Posté(e) le 31 mars 2015 Auteur Signaler Posté(e) le 31 mars 2015 J'ai stoppé mon test à 40'280 caractères --- je pense qu'il y a effectivement de la marge
pepite Posté(e) le 31 mars 2015 Signaler Posté(e) le 31 mars 2015 ca se tente alors, mais ce qui me bloque un peu c'est de ne pas connaitre le nom de l'ID ...ce qui oblige a repasser par le generateur d'IDs original
jojo Posté(e) le 31 mars 2015 Signaler Posté(e) le 31 mars 2015 vous alllez finir par me donner envie d'appuyer sur le bouton mise àjour ...
mprinfo Posté(e) le 31 mars 2015 Signaler Posté(e) le 31 mars 2015 Allez JOJO vient nous rejoindre en V4 ça fera un de plus qui râle contre fibaro @steven c'est toujours aussi lent le test d'écriture dans des variables global ou il y a un mieux après quelques jours ?
Steven Posté(e) le 31 mars 2015 Auteur Signaler Posté(e) le 31 mars 2015 Non, toujours aussi lent ... plus de 2.5 heures pour écrire 40'280 caractère 1 par 1 dans la VG 1
jojo Posté(e) le 31 mars 2015 Signaler Posté(e) le 31 mars 2015 est-ce qu'un admin peut supprimer mon post précédent où je disais que je voulais appuyer sur le bouton ? Merci
Messages recommandés