Aller au contenu
jjacques68

Connaitre le nombre de device selon leur type

Recommended Posts

Bonsoir à tous,

 

Voici un rapide bout de code tout simple mais toujours utile, qui permet de connaitre le nombre de device que l'on a sur notre HC2.

 

Version 1 : CountDeviceV1.lua

 

Le critère de sélection est simplement la propriété "visible" du device qui doit être à "true".

 

Il sont classés selon leurs types, sans tenir compte de leurs "parentId".

C'est à dire par exemple pour 1 FGMS, il va compter donc 1 détecteur de mouvement, 1 détecteur du luminosité et 1 détecteur de température.

Il ne fait pas la différence entre les version 1 et n des device.

 

Version 2 : CountDeviceV2.lua

 

Dans cette version il est possible de connaitre le nombre réel de device.

 

--[[
Version 2

Scène qui compte les device.
Permet de savoir combien on en a.
C'est tout.
--]]

print("Les device listés en VERT correspondent aux device réels ou  physiquement présent.\n")

local Detail = true --mettre false pour ne pas avoir le détail

if Detail == true then
	print("Les device listés en ORANGE correspondent au nombre de device du même type.")
	print("Il peut y avoir un décallage entre le nombre de device réels ")
  	print("et le nombre de device du même type,")
	print("car un device réel peut en contenir plusieurs (exemple pour les FGMS, FGS, ...)\n")	
end

print("Analyse en cours...\n")

local Device = api.get("/devices")
local DeviceFind = false
local AllDevice = {}  --{parentId = x, id = y}
local RealDevice = {} --{TypeDevice = "", Number = x}
local NbRealDevice = 0
local NbDevice = 0

--[[----------------------------------------------------------------------------
--------------------------------------------------------------------------------
ajoute le couple parentId - Id dans la table AllDevice.
Si pas de parentId (cas des VD) alors on force le parentId à 0.

PID |  ID
---------
 0  |  2
 1  | 434
434 | 439
434 | 440
434 | 441	

--]]

for i = 1, #Device do
	if Device[i].parentId then
		table.insert(AllDevice,{parentId = Device[i].parentId, id = Device[i].id})
      	
	else
		--sinon ajoute  le device avec comme parentId forcé à 0 (c'est en faite les VD)
		table.insert(AllDevice,{parentId = 0, id = Device[i].id})
		--print(Device[i].id.." "..Device[i].type)
	end
end

--[[----------------------------------------------------------------------------
--------------------------------------------------------------------------------
2 étapes pour l'ajout dans la table RealDevice :

1ère étape : ajoute/compte les device de AllDevice dont le parentId = 0 (user, mobile, VD, ...).
2ème étape : sélectionne dans AllDevice, que le premier device des chlidId pour ajouter/compter :

PID |  ID
---------
 1  | 434
434 | 439 <---- c'est celui là qui nous intéresse
434 | 440
434 | 441	

--]]

for i,v in ipairs(AllDevice) do --pour tous les devices de AllDevice

--ETAPE 1 : --ajoute les type de device dont le parentId = 0 (user, mobile, ...)
	
	if AllDevice[i].parentId == 0 then
	
		--on récupère les info du device
		Device = api.get("/devices/"..AllDevice[i].id)
		
		--pour tous les Device déjà enregistrés
		for j,v in ipairs(RealDevice) do 
			--si y a déjà un type device identique dans la liste -> on incrémente juste le nombre
			if RealDevice[j].TypeDevice == Device.type then
				RealDevice[j].Number = RealDevice[j].Number + 1
				DeviceFind = true
				break
			else
				DeviceFind = false	
			end
		end
		
		--ajoute si pas present dans le tableau
		if DeviceFind == false then		
			table.insert(RealDevice, {TypeDevice = Device.type, Number = 1})
		end
	end
	
	
	--arrête si arrivé au dernier (sinon bug à cause du i+1)
  	if i == #AllDevice then break end 
	
--ETAPE 2 : ajoute des autres devices

	--si id en cours = parentId  du suivant c'est que 
	--l'id du suivant est le premier device enfant que l'on doit garder
 
	if AllDevice[i].id == AllDevice[i+1].parentId then
		
		--on récupère les infos du premier device enfant
		Device = api.get("/devices/"..AllDevice[i+1].id)
		
		--si le device enfant n'est pas directement le suivant, 
		--on prends encore le suivant, et encore et encore jusqu'à trouver le bon.
		k=1
		while Device.visible == false do
			k=k+1
			Device = api.get("/devices/"..AllDevice[i+k].id)
		end
		
		--pour tous les Device déjà enregistrés
		for j,v in ipairs(RealDevice) do 
			--si y a déjà un type device identique dans la liste -> on incrémente juste le nombre
			if RealDevice[j].TypeDevice == Device.type then
				RealDevice[j].Number = RealDevice[j].Number + 1
				DeviceFind = true
				break
			else
				DeviceFind = false	
			end
		end
		
		--ajoute si pas present dans le tableau
		if DeviceFind == false then		
			table.insert(RealDevice, {TypeDevice = Device.type, Number = 1})
		end
    end
end


--on affiche le résultat------------------------------------------------------------
Device = api.get("/devices")
for i = 1, #RealDevice do
	print ("<font color = 'green'>"..RealDevice[i].Number.." x "..RealDevice[i].TypeDevice.."</font>")
	NbRealDevice = NbRealDevice + tonumber(RealDevice[i].Number)
	
	if Detail == true then
		k=1
		for j = 1, #Device do
			if Device[j].type == RealDevice[i].TypeDevice and Device[j].visible == true and Device[j].enabled == true then
				print("<font color = 'orange'>______ "..k.." ---> "..Device[j].name.." - "..Device[j].id.."</font>")
				NbDevice = NbDevice+1
				k=k+1
			end
		end	
	end
end

--et les toto----------------------------------------------------------------------
print()
print("<font color = magenta>Nombre Réel de device : "..NbRealDevice.."</font>")
if Detail == true then
	print("<font color = magenta>Nombre de device : "..NbDevice.."</font>")
end

 

voilà le debug :

 

img.png.07bd96fd46f72c47d39fbfe3fd0d9398.png

 

Si vous avez des propositions d'améliorations... n'hésitez pas... ;)

 

Modifié par jjacques68
Version 2
  • Thanks 1
  • Upvote 4

Partager ce message


Lien à poster
Partager sur d’autres sites

Sujet intéressant, il me liste :

43 x com.fibaro.binarySwitch

Un de mes fgs est boiteux ?

Aucun dans les modules cachés ou désactivés, hors le 3éme pour chaque fgs non utilisé.

Partager ce message


Lien à poster
Partager sur d’autres sites

21 installés si pas d'erreur, donc 42. Il faut que je liste le nom de chaque binaryswitch pour comprendre d'où vient l'intrus.

La box m'étonnes toujours autant. :)

Partager ce message


Lien à poster
Partager sur d’autres sites

intéressant en effet...

En tout cas chez moi ça colle, et je viens de rajouter un FGS, et il me la bien compter (en double biensûr à cause des 2 relais)

 

Si j'ai le temps ce weekend, j'essaye de faire un script qui permette de lister les device physique réel...

Il faut pour ça que je joue avec les parentId, et je sens que je vais y passer du temps... :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Ok, j'ai compris en filtrant avec les noms.

Ma sirène Everspring SE812 est listée comme com.fibaro.binarySwitch .

:P

Partager ce message


Lien à poster
Partager sur d’autres sites

et voilà, la version 2 est faite avec le nombre réel de device présent.

Chez moi ça colle pil poil :) 

  • Like 2

Partager ce message


Lien à poster
Partager sur d’autres sites

×