Aller au contenu
Steven

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

Recommended Posts

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
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 ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

Ç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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

@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é

Partager ce message


Lien à poster
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 ?

Partager ce message


Lien à poster
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 :)

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai stoppé mon test à  40'280 caractères --- je pense qu'il y a effectivement de la marge  ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

vous alllez finir par me donner envie d'appuyer sur le bouton mise àjour ...

Partager ce message


Lien à poster
Partager sur d’autres sites

Allez JOJO vient nous rejoindre en V4 ça fera un de plus qui râle contre fibaro :D

@steven c'est toujours aussi lent le test d'écriture dans des variables global ou il y a un mieux après quelques jours ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Non, toujours aussi lent ... plus de 2.5 heures pour écrire 40'280 caractère 1 par 1 dans la VG :(

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

est-ce qu'un admin peut supprimer mon post précédent où je disais que je voulais appuyer sur le bouton ?

Merci

Partager ce message


Lien à poster
Partager sur d’autres sites

×