Récupérer IDX en LUA

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
ColdFace
Messages : 38
Inscription : 01 févr. 2016, 10:10

Récupérer IDX en LUA

Message par ColdFace »

Bonjour,

J'ai besoin de récupérer l'IDX de plusieurs uservariables en LUA mais je n'y arrive pas.
Ou est-il possible de lancer en LUA '/json.htm?type=command&param=getuservariables' et stocker le résultat dans une variable LUA ?

Google ne m'a pas apporté de réponse que ce soir sur des sites anglais ou français...

Merci d'avance !
Dernière modification par ColdFace le 25 août 2017, 16:09, modifié 1 fois.
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: Récupérer IDX en LUA

Message par papoo »

avec un truc du genre?

Code : Tout sélectionner

    local config=assert(io.popen('/usr/bin/curl -m5 "http://127.0.0.1:8080/json.htm?type=command&param=getuservariables"'))
	local blocjson = config:read('*all')
	   config:close()
    jsonValeur = json:decode(blocjson)
for index, variable in pairs(jsonValeur.result) do   

print(variable.idx, variable.Name, variable.Value, variable.LastUpdate)
end
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
ColdFace
Messages : 38
Inscription : 01 févr. 2016, 10:10

Re: Récupérer IDX en LUA

Message par ColdFace »

J'arrive avec un peu de retard mais cela fonctionne.

Je me suis un peu cassé les dents sur une ligne manquante :

Code : Tout sélectionner

JSON = (loadfile '/home/pi/domoticz/scripts/lua/JSON.lua')()
Mais merci beaucoup !
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: Récupérer IDX en LUA

Message par papoo »

Propose nous ton script une fois fini c'est toujours sympa de voir ce que d'autres font
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
ColdFace
Messages : 38
Inscription : 01 févr. 2016, 10:10

Re: Récupérer IDX en LUA

Message par ColdFace »

C'est un peu compliqué mais je vais essayer de faire simple.

Sur domoticz, j'ai viré tous mes plannings dès que j'ai découvert le LUA. J'ai donc tout passé en LUA et vu les possibilités du langage j'ai essayé d'étoffer les scénarios.

Mes 2 gamins s'endorment avec de la musique. Ils ont chacun un poste radio CD/MP3 sur une prise 433 MHz.
Ce que je veux faire c'est couper les prises 1h après leur allumage. J'ai vu sur DzVents des switchOn.forMin // switchOff.afterMin mais cela fonctionnait à priori sur quelques minutes. J'ai testé 59, 60 et 61 min et je n'ai eu aucune réaction des prises. Le wiki DzVents ne donne aucune infos sur les bornes min/max du paramètre des fonctions for/AfterMin.

Déçu que DzVents ne fonctionne pas, je suis repassé en LUA pur mais j'avais un problème car j'utilise un script de renforcement qui me renvoie les commandes toutes les 30 mins car il n'y pas de retour d'état sur les prises 433 MHz. Je n'avais pas le courage pour modifier le script de renforcement uniquement pour ces 2 prises sachant qu'il me sert également pour d'autres appareils.

Bref, le fonctionnement de mes scripts =>

script_time => allumage à 20h10 (c'est les vacances :D) et extinction après 1h

Code : Tout sélectionner

	if (time.hour == 20 and time.min == 10 and otherdevices ['Romain_Radio'] == 'Off') then
		commandArray ['Romain_Radio'] = 'On'
		print ("Romain_Radio = On")
	end
	
	if testRadioTimer ('Romain', 3600) then
		commandArray ['Romain_Radio'] = 'Off'
	end
script_device (création d'une variable utilisateur à l'allumage de la prise avec une valeur au pif vu que je n'ai besoin que de l'idx et lastUpdate)

Code : Tout sélectionner

for deviceName, deviceValue in pairs (devicechanged) do

	if (deviceName == 'Romain_Radio' or deviceName == 'Raphael_Radio') then
		if (deviceValue == 'On') then
		
			nom_variable = string.sub (deviceName, 1, 2) .. '_RadioTimer'

			if (uservariables [nom_variable] == nil) then
			
				print ('Création variable => ' .. nom_variable)

				commandArray ['OpenURL'] = ip .. '/json.htm?type=command&param=saveuservariable&vname=' .. urlencode (nom_variable) .. '&vtype=0&vvalue=' .. urlencode ('1')
			end
		end
	end
end
Fonctions de mon modules.lua => si le délai est passé (calculé à partir du lastUpdate de la variable utilisateur), je renvoie TRUE pour la fonction appelante qui coupe la prise et je supprime ici la variable utilisateur à l'aide de l'IDX

Code : Tout sélectionner

function testRadioTimer (nom_enfant, delai)

	resultat = false

	nom_variable = string.sub (nom_enfant, 1, 2) .. '_RadioTimer'
	nom_device = nom_enfant .. '_Radio'

	if (uservariables [nom_variable] ~= nil and otherdevices [nom_device] == 'On') then
		
		idx, heure_debut = getIdxDate (nom_variable)
		
		if (timedifference (heure_debut) > delai) then
			resultat = true
			commandArray ['OpenURL'] = ip .. '/json.htm?type=command&param=deleteuservariable&idx=' .. urlencode (idx)
		end	
	end
	
	return resultat
end

function getIdxDate (var_name)

	JSON = (loadfile '/home/pi/domoticz/scripts/lua/JSON.lua')()	

	local config = assert (io.popen ('/usr/bin/curl -m5 "http://' .. ip .. '/json.htm?type=command&param=getuservariables"'))
	local blocjson = config:read ('*all')

	config:close ()

	jsonValeur = JSON:decode (blocjson)

	for index, variable in pairs (jsonValeur.result) do
		if (variable.Name == var_name) then
			return variable.idx, variable.LastUpdate
		end
	end
end
J'ai testé vite fait cela a l'air de fonctionner. Verdict ce soir !
technick
Messages : 14
Inscription : 20 juil. 2017, 01:12

Re: Récupérer IDX en LUA

Message par technick »

Bonjour, joli script mais ça ne fonctionne pas de tout simplement mettre "off delay = xxx" au niveau du switch dans l'interface ?

J'avais fait cas sur un fer à repasser qui était resté allumé toute une journée... off delay=1800
ColdFace
Messages : 38
Inscription : 01 févr. 2016, 10:10

Re: Récupérer IDX en LUA

Message par ColdFace »

Merci.

Je ne connaissais pas cela dans l'interface. Je n'y avais prêté aucune attention.
C'est con car je me suis bien faire chier alors que c'est réglé en un clin d'oeil...
technick
Messages : 14
Inscription : 20 juil. 2017, 01:12

Re: Récupérer IDX en LUA

Message par technick »

Mais non :lol: Ca t'as permis d'apprendre plein de choses en LUA :-)
Répondre