Aller au contenu

Générateur D'id Pour Gea (Ou Autre Script)


Steven

Messages recommandés

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)

  • Upvote 4
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...
  • 1 mois après...

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

Lien vers le commentaire
Partager sur d’autres sites

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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 :

  1. La limitation en nombre de caractère d'une VG
  2. 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 :)

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...