Page 1 sur 1

Récupérer l'état d'une scène ou d'un groupe

Publié : 11 janv. 2017, 19:37
par Chrominator
Petit problème pour moi.

J'aimerais connaitre l'état d'un groupe dans un script LUA, pour ne pas ordonner un OFF quand le groupe est déjà OFF.

J'ai testé otherdevices[], qui ne me renvoie rien (par expérience).

Code : Tout sélectionner

print (otherdevices['Group:Volets Matin'])

Code : Tout sélectionner

print (otherdevices['Scene:Volets Matin'])
produit la même chose, rien :shock:
Connaissez-vous un moyen de récupérer l'état du groupe dans un script LUA ?
Capture.PNG
Capture.PNG (16.95 Kio) Consulté 10079 fois

Re: Récupérer l'état d'une scène ou d'un groupe

Publié : 12 janv. 2017, 17:12
par deennoo
j'ai la meme problematique.

L'api ne prevoit pas de pouvoir retrouver l'etat d'un groupe pour le moment :
https://www.domoticz.com/wiki/Domoticz_ ... .26_groups

Patrice nous a fait un article sur Json et LUA, c'est l'occasion de le mettre en pratique !
https://easydomoticz.com/lua-et-json/

La demarche va etre :
retrouver l'etat du groupe (ON ou OFF ou Mixte) via son idx en parsant le retour de la commande : http://ip:port//json.htm?type=scenes
la stocker dans une variable de script et s'en reservir.

Je test demain ou cette nuit

Re: Récupérer l'état d'une scène ou d'un groupe

Publié : 14 janv. 2017, 10:31
par Chrominator
ah merci.

J'essaierais dès qu'Enedis m'aura remis le courant... :(
D'ici là tu as le temps de fiabiliser tout ça ! :D

Re: Récupérer l'état d'une scène ou d'un groupe

Publié : 15 janv. 2017, 09:46
par Chrominator
Ça y est, j'ai de nouveau l'électricité :)

Bon j'ai suivi ton idée, voilà ce que ça donne :

J'ai créé une fonction à charger dans les scripts pour lesquels on veut connaître l'état d'un groupe ou d'une scene.
Mon script s'appelle comme la fonction, et doit être enregistré dans /home/pi/domoticz/scripts/lua.
Attention, la fonction utilise le décodeur json de Jeffrey Friedl disponible sur http://regex.info/blog/lua/json.
Ce script JSON.lua doit lui aussi être enregistré dans /home/pi/domoticz/scripts/lua.

Code : Tout sélectionner

--[[      	Script décrivant la fonction permettant 
			de connaitre l'état d'un groupe ou d'une scene.
	
	~/domoticz/scripts/lua/getscenestatus.lua
	
	-- Autors  ----------------------------------------------------------------
	V1.0 - Chrominator 
	-- Require  --------------------------------------------------------------
	
	input : index de la scene ou du groupe
	output : etat de la scene, nom de la scene
		
	-- Versions -------------------------------------------------------------
	2017-01-15 : Initial version
	
]]--
-- chargement de l'encodeur/décodeur json
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()

-- Remplacer ip_port_domoticz par l'ip et le port de votre Domoticz sous la forme 127.0.0.1:8080 par exemple
local ipportdomoticz = 'ip_port_domoticz'

function getscenestatus(Scene_idx)

	local Events = assert(io.popen('curl "http://'..ipportdomoticz..'/json.htm?type=scenes"'))
	local Scene = Events:read('*all')
	Events:close()

	local jsonScene = json:decode(Scene)
	if jsonScene == nil then 	
		print("Erreur dans l'url json") 
	end  

	Groups = jsonScene['result']

	for response,results in pairs(Groups) do
		if results['idx'] == Scene_idx then 
			status = results['Status']
			name = results['Name']
			end
	end
	return status, name
end
Ensuite pour utiliser la fonction dans les scripts, c'est assez simple.
On l'appelle avec l'index de la scene ou du groupe, et elle revoie l'état et le nom de la scene/du groupe.

Exemple :

Code : Tout sélectionner

-- chargement des modules
package.path = package.path..";/home/pi/domoticz/scripts/lua/?.lua"
require "getscenestatus"

commandArray = {}

local idx = '1'

local status, scene = getscenestatus(idx)

if status == 'Off' then
    print ( 'le groupe ou scene '..scene..' est Off')
else
    print ( 'le groupe ou scene '..scene..' est On')
end

return commandArray
Si on se moque de savoir comment s'appelle la scene qui a l'index n°idx, on peut simplement utiliser la fonction comme ça :

Code : Tout sélectionner

if getscenestatus(idx) == 'Off' then
    print ( 'le groupe ou scene est Off')
else
    print ( 'le groupe ou scene est On')
end
Dans une version ultérieure, une amélioration pourrait être de passer le nom de la scene ou du groupe comme paramètre d'entrée.
Pas trop dur à faire je pense.

Re: Récupérer l'état d'une scène ou d'un groupe

Publié : 15 janv. 2017, 15:34
par deennoo
Nickel !

Re: Récupérer l'état d'une scène ou d'un groupe

Publié : 15 janv. 2017, 20:00
par vil1driver
Salut,

tout ton code peut être remplacé par :

Code : Tout sélectionner

otherdevices_scenesgroups['mon groupe']
désolé :mrgreen:



sinon au lieu de jouer avec les idx utilise le nom, c'est plus sympa ;)

Code : Tout sélectionner

otherdevices_scenesgroups_idx['mon groupe']

Re: RE: Re: Récupérer l'état d'une scène ou d'un groupe

Publié : 15 janv. 2017, 20:13
par deennoo
vil1driver a écrit :Salut,

tout ton code peut être remplacé par :

Code : Tout sélectionner

otherdevices_scenesgroups['mon groupe']
désolé :mrgreen:



sinon au lieu de jouer avec les idx utilise le nom, c'est plus sympa ;)

Code : Tout sélectionner

otherdevices_scenesgroups_idx['mon groupe']
Oui c'est vrai mais avec les idx :
- pas de fautes de frappe
- pas de soucis de maj min accents

Re: Récupérer l'état d'une scène ou d'un groupe

Publié : 15 janv. 2017, 20:17
par vil1driver
pas faux :mrgreen:

Re: Récupérer l'état d'une scène ou d'un groupe

Publié : 15 janv. 2017, 20:23
par Chrominator
vil1driver a écrit :Salut,

tout ton code peut être remplacé par :

Code : Tout sélectionner

otherdevices_scenesgroups['mon groupe']
Bah c'était la question en effet, et je n'ai pas trouvé de réponse dans les WIKI ou ici.

Pô grave, ça m'a bougé les neurones. :P

Re: Récupérer l'état d'une scène ou d'un groupe

Publié : 27 sept. 2017, 22:03
par Jeff
J'ai bien galéré pour trouver ce post et la solution.
J'ai cherché sur le wiki, sur le forum, pas trouvé et puis j'ai cherché sur le net pour retomber ici :?
J'étais pas loin et là cool : merci Vil1driver ;)

Jolie fonction Chrominator au passage !