Aller au contenu
Steven

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

Recommended Posts

dites, ch'tite question:

 

Si j'utilise le scripts 3.6, quand je passerai en V4, le script 4 va générer les mêmes id's ?

Sur-sur certain-certain ? ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

heuuu je dirais pas sur sur ;-)..etant donne qu'en changeant de firmware, on court le risque de changer d'IDs, d'ou l'interet d'utiliser le generateur après mise àjour ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

oui sorry, je voulais dire les noms des id's :-/

comme je vois que la génération parfois ne colle pas trop au nom d'origine de l'id

Partager ce message


Lien à poster
Partager sur d’autres sites

depuis ma migration en V4, j'ai voulu relancer le script pour vérifier, et il ne me retourne rien  :(

du coup j'ai mis des debug un peu partout pour voir jusqu'où il allait, et en fait, il va jusqu'au bout, sauf qu'il ne veut pas afficher le résultat :

fibaro:debug(result)

la variable result a chez moi une longueur de 4017 caractères. Aurait-on atteint la limite des possibilités du fibaro:debug ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Possible. A la ligne 77 supprime les espaces avant et après le = pour gagner quelques caractères.

Partager ce message


Lien à poster
Partager sur d’autres sites

@Steven,

Je viens de faire une analyse un peu plus approfondie, en remplaçant reseult  = par fibaro:debug(

Donc j'affiche mes lignes de débug au fur et à  mesure, mais c'est inutilisable, car il y a l'heure, ...

Mais cela m'a permis de voir qu'il listait également tous les devices qui étaient cochés comme invisibles (dont tous les main zwave controler).

Donc dans la fonction d'exclusion, il faudrait également supprimer les devices pour lesquels visible = false, et le tour est joué.

Partager ce message


Lien à poster
Partager sur d’autres sites

A la ligne 77 supprime les espaces avant et après le = pour gagner quelques caractères.

Sorry, je ne comprends pas. Comment vais-je réduire la taille de la variable result si je modifie ça

result = result .. "<BR>--"..rooms[v.roomID].."<BR>"

en ça ?

result=result .. "<BR>--"..rooms[v.roomID].."<BR>"

Partager ce message


Lien à poster
Partager sur d’autres sites

comme je suis impatient, j'ai fait le test en supprimant les devices invisibles

for k, v in pairs(devicesJSon) do
	local doit = (dead or not v.dead)
    -- exclure les device invisibles
    if v.visible == false then doit = false end
    if (doit) then

et j'ai réduit result à2897 caractères, mais c'est encore de trop.

Je continuerai àchercher demain

Partager ce message


Lien à poster
Partager sur d’autres sites

comme on était déjà  demain ;) , j'ai regardé,

et il ne m'affiche plus rien de trop. :(

Je pense donc qu'en plus, on devra faire un test sur la longueur de la variable result, et dès qu'elle atteint 2000 car, l'imprimer et recommencer.

Mais maintenant je dois aller dormir

Partager ce message


Lien à poster
Partager sur d’autres sites

@jojo voila comment je fais (merci steven) c'est moi complet que le script de steven mais c'est plus léger

local TousLesModules = api.get("/devices?") -- Création de la table qui va permettre de retrouver l'id
fibaro:debug("Nombres de modules : " ..#TousLesModules)
----------------------------------------------------------------------------------------------
-- Fonction qui permet de récuperer l'id par le nom du module
----------------------------------------------------------------------------------------------
function ID(NomModule)    
    for i,v in ipairs(TousLesModules) do
       if TousLesModules[i].visible == true then 
          if NomModule == TousLesModules[i].name then
             return (tonumber(TousLesModules[i].id))
          end
       end
    end
end
--------------------------------------------------------------------------------------------
-- Debut du programme
--------------------------------------------------------------------------------------------
local id = ID("Volet Bureau")
fibaro:debug("l'id est "..id)

@Steven peux tu m'aider car cela ne fonctionne pas avec tout les parametres

-- cela fonctionne
local TousLesModules = api.get("/devices?")
--ou
local TousLesModules = api.get("/devices?type=com.fibaro.FGRM222")
--ou
local TousLesModules = api.get("/devices?roomID=8")



-- cela ne fonctionne pas
local TousLesModules = api.get("/devices?visible=true")

Partager ce message


Lien à poster
Partager sur d’autres sites

je viens de voir pourquoi j'avais le problème.

Dans le VD, la longueur de la variable qui est affichée en DEBUG est limitée.

Dans une scène il n'y a pas de limite.

Et Steven a proposé une scène.

Mais moi j'avais pris la version pour 3.6 (j'étais en 3.6 àl'époque) qui est une version VD.

Et donc en v4.x, comme il y a beaucoup plus d'id, cela explosait.

Partager ce message


Lien à poster
Partager sur d’autres sites

Steven,

J'abuse de ton script. 

Mais j'ai beaucoup de devices et pièces.

Ta scène trie les pièce par ID.

J'ai essayé de la modifier pour rajouter la notion de section, pour trier donc par section, puis pièce, puis devices (de préférence sur le nom et pas sur l'id).

 

Mais j'y arrive pas, je n'arrive pas à  faire du rétro-engineering de ton code.

Si tu passes par là , je suis sà»r que tu peux proposer cela en 30 min.

Merci d'avance

Partager ce message


Lien à poster
Partager sur d’autres sites

Rhooooo c abuser Jojo ;-)

Sent from my SM-N910F using Tapatalk

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Voilà .

 

Je te joint le fichier mais voici un aperçu du résultat (c'est donc trié par nom de section puis par nom de pièce) :

 

Je te laisse modifier le script à  ton aise. Je l'ai volontairement fait de manière tordu mais cela est uniquement à  des fins pédagogiques. (un objet "generateur" qui contient des propriétés et des fonctions qui s'appellent l'une l'autre, qui pour finir va remplir un tableau de "devices" qui contient toutes les propriétés d'un device + la nom de la pièce "roomname" et de la section "sectionname"). Que du bonheur à  lire (je plaisante).

 

J'ai laissé la possibilité de ne pas utiliser les sections "useSections = false" au cas ou cela ne fonctionnerait pas bien.

 

Amicalement


-- IDs générés le : 24/09/15 à  17:57:43

local id = {

-- SECTION : Autre
-- ROOM : Divers
AGENDA = 178, JOURS_CHEOME = 110, CLOCK_SYNC = 252, PING = 397, MY_BATTERIES = 130, VARIABLES_GLOBALES = 288, GEA_ALARM = 279, X400CT_____AN6 = 284, X400CT_____AN5 = 283, NOTIFICATION_CENTER = 290, EVENEMENTS = 173, UPDATE_NOTIFIER_1_0_6 = 206, IMPERIHOME = 208, X400CT_____AN7 = 285, ANDROID_FILES = 162, VACANCES_SCOLAIRES = 151, 

-- SECTION : Etage
-- ROOM : Chambres
FENETRE_NOLAN = 149, FENETRE_NORA = 143, TEMPERATURE = 147, PLAFONNIER_NOLAN = 21, PLAFONNIER_KENDRA = 23, PLAFONNIER_NORA = 18, FENETRE_KENDRA = 145, 
-- ROOM : Couloir
SPOTS = 230, PORTE_TERRASSE = 153, DETECTEUR_DEFECT = 5, HUMIDITE = 365, TEMPERATURE_COULOIR = 364, LEDS_ESCALIER = 27, APLIQUE_ESCALIER = 25, LUMINOSITE_DEFECT = 7, TEMPERATURE_DEFECT = 6, 

-- SECTION : Extérieur
-- ROOM : Garage
SURPRESSEUR = 118, PORTE_GARAGE = 64, CAMERA = 403, HUMIDITE_GARAGE = 400, PORTE_GARAGE_GARAGE = 238, TEMPERATURE_GARAGE = 399, 
-- ROOM : Jardin
TEMPERATURE_JARDIN = 69, METEOALERTE___74 = 406, COIN_REPAS = 14, LUMINOSITE = 70, ARROSAGE = 158, DETECTEUR = 68, TERRASSE = 160, PLUIE = 139, SEISMOMETRE = 71, LAMPE_OUEST = 234, 

-- SECTION : Rez-de-chaussé
-- ROOM : Chambre parentale
SECHE_SERVIETTE = 60, 
-- ROOM : Cuisine
CAPTEUR_FUMEE = 46, TEMPERATURE_CUISINE = 47, SIRENE = 200, FRIGO = 52, BRITA__FILTRE_ = 131, ALARME_FUMEE = 48, LAVE_VAISSELLE = 50, CUISINE = 237, 
-- ROOM : Entrée
DETECTEUR_ENTREE = 414, LUMINOSITE_ENTREE = 416, PLAFONNIER = 10, CAMERA_ENTREE = 129, PORTE_ENTREE = 58, TEMPERATURE_ENTREE = 415, 
-- ROOM : Local Technique
IPX800_RELAIS = 106, WAKE_SYNO = 404, PLAFONNIER_LOCAL_TECHNIQUE = 54, PORTE_LOCAL = 56, PASSERELLE_ZIBASE = 126, LAVE_LINGE = 120, VMC_DOUBLE_FLUX = 114, 
-- ROOM : Salon
WI = 40, PRISE_LIBRE = 41, KAROTZ = 134, HIFI = 42, TV = 39, OCTAN = 412, ROMBA = 43, FREBOX_TV = 307, HUMIDITE_SALON = 360, PLAFONNIER_SALON = 282, LUMIERE_SALON = 107, FRE_PLAYER = 44, BRISE_SOLEIL = 105, OPENKAROTZ = 133, TEMPERATURE_SALON = 359, CHAUFFAGE = 104, 

-- SECTION : inconnu
-- ROOM : inconnu
SEISMOMETRE_DEFECT = 8, LUA_SNIPPETS = 141, 
}

-- usage :
-- fibaro:getValue(id["LUA_SNIPPETS"], "value")
-- GEA.add(id["LUA_SNIPPETS"], 30, "")

GEA_ID.lua

  • Upvote 3

Partager ce message


Lien à poster
Partager sur d’autres sites

MERCI, c'est exactement ce que je voulais avoir  :13:

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

@Steven,

Voici ce que j'ai dans mon debug du GEA lorsque j'utilise la v2 du générateur d'id. Avec la G1 (donc les même modules,) mon GEA fonctionne parfaitement.

[DEBUG] 19:52:27: [ 158 | Alarme_Activee ] Add Autostart : ajout de la tache pour 1 secondes (ID:86) [Inverse] [StopTask,66]
[DEBUG] 19:52:27: [ 158 | Alarme_Activee ] Add Autostart : ajout de la tache pour 1 secondes (ID:87) [Inverse] [StopTask,69]
[DEBUG] 19:52:28: [ 158 | Alarme_Activee ] Add Autostart : ajout de la tache pour 1 secondes (ID:88) [SetDisarmed,643]
[DEBUG] 19:52:28: [1;31m2015-09-27 19:52:28.020126 [ fatal] Runtime error: /opt/fibaro/scenes/615.lua:815: bad argument #1 to 'lower' (string expected, got nil)[0m

@Sakkhho,

L'as-tu déjàintégré dans GEA ? Sans erreur àla fin du débug ?

Partager ce message


Lien à poster
Partager sur d’autres sites

"zut" alors, ,je ne comprends vraiment pas, car j'ai régénéré les ID (donc exactement les mêmes) avec l'anciene version du générateur, et ça fonctionne.

Ca va être dur à  trouver  :angry:

Partager ce message


Lien à poster
Partager sur d’autres sites

Arrives-tu me transmettre le résultat du générateur v2 stp ... par pm si possible.

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

 

J'ai juste un petit problème, je n'arrive pas à  faire un "copier" dans la fenêtre debug pour "coller" le résultat dans le GEA.

 

Des conseils ??

Partager ce message


Lien à poster
Partager sur d’autres sites

j'ai également des difficultés. La sélection n'est pas top.

Il faut aller vite, dès que tu crois que c'est bon, ctrl+C.

Ensuite ctrl+V dans notepad pour vérifier

Partager ce message


Lien à poster
Partager sur d’autres sites

Steven,

Puis-je encore abuser ...

Dans la dernière version de ton script, tu as fait un tri par section, puis par pièce.

Serait-il possible de rajouter, pour chaque pièce, un tri sur le nom du device ?

Cela me serait vraiment très utile, car mon GEA devient tellement gros...

Merci

 

P.S. n'oublie pas qu'il ne faut rien changer d'autre, car nous avions eu des problème avec notre GEA.

Partager ce message


Lien à poster
Partager sur d’autres sites

Oups, non pas vu, désolé. Peux tu m'envoyer ton scripts car j'ai peur que le mien ne soit plus àjour (backup, restore, backup, restore, ...).

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci Steven.

Voici ton code :


local hidden = false --- true pour exporter les devices cachés
local dead = false -- true pour exporter les devices morts
local useSections = true

local excludeType = {"com.fibaro.zwaveDevice", "weather", "HC_user", "iOS_device", "com.fibaro.voipUser"}
local excludeID = {}


local generateur = {

	devices = {},
	names = {},
	rooms = {},
	sections = {},

	devicesJSon = api.get("/devices"),
	roomsJSon = api.get("/rooms"),
	sectionsJSon = api.get("/sections"),

	-- Retourne la section souhaitée
	getSection = function(self, id)
		if (not useSections) then
			return ""
		end
		if (#self.sections == 0) then
			for k, v in ipairs(self.sectionsJSon) do
				self.sections[v.id] = v.name
			end
		end
		id = tonumber(id)
		if (type(self.sections[id]) == "nil") then
			return "inconnu"
		else
			return self.sections[id]
		end
	end,
	
	-- Retourne la pièce souhaitée
	getRoom = function(self, id) 
		if (#self.rooms == 0) then
			for k, v in ipairs(self.roomsJSon) do  
				self.rooms[v.id] = {}
				self.rooms[v.id].name = v.name
				self.rooms[v.id].sectionId = v.sectionID
				self.rooms[v.id].sectionName = self:getSection(v.sectionID)
			end 
		end
		id = tonumber(id)
		if (type(self.rooms[id]) == "nil") then
			return "inconnu", "inconnu", 0
		else
			return self.rooms[id].name, self.rooms[id].sectionName, self.rooms[id].sectionId
		end
	end,

	-- Retourne un nom unique
	addName = function(self, name, roomname)
		if (type(self.names[name]) == "nil") then
			self.names[name] = true
			return name
		else 
			return self:addName(name.."_"..roomname, roomname)
		end
	end,
	
	-- Supprime les caractères indésirables et rend le nom unique
	rename = function(self, 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 self:addName(name, roomname)
	end,
	
	proceed = function(self)
		for k, v in pairs(self.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
				v.roomname, v.sectionname, v.sectionID = self:getRoom(v.roomID)
				table.insert(self.devices, v)
			end
		end	
		table.sort(self.devices, function(a, 
			if (not useSections) then 			
				return a.roomID < b.roomID 
			else
				return a.sectionname..a.roomname < b.sectionname..b.roomname
			end
		end)
		return self.devices;
	end

}

local result = "<BR><BR>-- IDs générés le : " .. os.date("%d/%m/%y à%X")
local room = ""
local section = ""
local lastinfo = ""


result = result .. "<BR><BR>local id = {"

local devices = generateur:proceed()

for k, v in ipairs(devices) do
  	if (section ~= v.sectionname and useSections) then
    	section = v.sectionname
    	result = result .. "<BR><BR>-- SECTION :  "..v.sectionname	
	end
  	if (room ~= v.roomname) then
    	room = v.roomname
		if (not useSections) then
			result = result .. "<BR>"
		end
    	result = result .. "<BR>-- ROOM : "..v.roomname.."<BR>"
    end
  	lastinfo = generateur:rename(v.name, v.roomname)
	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)

Partager ce message


Lien à poster
Partager sur d’autres sites

×