Aller au contenu

Messages recommandés

Posté(e)

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'))

  • Upvote 7
Posté(e)

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 !

  • Upvote 1
Posté(e)

super ! et tu confirmes qu'il n'y a pas de limitation en V4 àla longueur des variables. C'était ma crainte

  • Upvote 1
Posté(e)

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 !

  • Upvote 2
  • 1 mois après...
  • 3 semaines après...
Posté(e)

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.

×
×
  • Créer...