Page 1 sur 2

recupération de variables dans LUA

Publié : 08 janv. 2015, 08:22
par romy
Bonjour à tous,
Je récupère les infos de ma carte IPX800 à l'aide de la fonction PUSH sur chaque E/S (on/off) de cette dernière et contenant une commande JSON envoyée sur un virtual_texte de domoticz. Dans mon script LUA je n'ai plus qu'à tester le contenu (par ex : I3 pour l'entrée No3) et ca roule...

Mais si j'envoie depuis lua une commande JSON qui retourne dans mon navigateur la totalité des etats de l'IPX, comment la récupérer dans mon script ?

Est-il aussi possible de récupérer un XML obtenue par une requete http et contenant en plus les entrées analogiques de l'IPX ?

Merci d'avance ;)

Re: recupération de variables dans LUA

Publié : 06 déc. 2019, 00:39
par freerider90
bonjour,

je déterre ce post, car je ne trouve aucune solution par moi meme...

avez vous eu plus d'info sur la facon de récupèrer les données du fichier XML de l'ipx pour interagir avec un interrupteur.

mon objectif étant le retour d'état de mes entrées pour les lumières brancher sur la V3.

je nis connais rien en LUA je m'y intéresse depuis peux donc si vous aviez un petit bout de code commenté pour que je comprenne et puisse démarrer car la suis dépassé.

j'aimerai aussi que l'on m'explique assez succinctement comment tout cela s'articule.
j'ai cu comprendre qu'il fallait aller dans evenement/ cree un script LUA a base de temps ( pour qu'il s'execute toutes les minutes)

interroger le fichier XML
si la valeur de l'entrée X est + a 1
mets IDX XX a ON

si le valeur de l'entree X est egal a 0
mets l'IDX XX a OFF

je vous remercies par avance pour votre aide, j'ai pris le temps de chercher mais tout ce que je trouve est sois pour des remontés de temperature soit des usines à gaz qui sont incomprehensible pour moi a mon niveau....

merci merci

Free

Re: recupération de variables dans LUA

Publié : 06 déc. 2019, 15:41
par lmet
Salut,
Depuis la version 3.05.38 du firmware de l'IPX800 v3, il est possible de récupérer des données au format Json

Tu peux tester en tapant dans un navigateur :

Code : Tout sélectionner

http://<IP_IPX>/api/xdevices.json?cmd=20
En remplaçant <IP_IPX> par l'IP de ton IPX800
Voici un bout de code lua pour récupérer l'état d'une sortie de l'IPX800 (Trigger de type Time)

Code : Tout sélectionner

-- Récupération de l'état de la sortie 3 de l'IPX800
local IP_IPX = "192.168.0.3"

function jsoncapture()
    local json       = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()
    local cmd        = 'curl -s ' .. '"' .. "http://" .. IP_IPX  .. "/api/xdevices.json?cmd=20" .. '"'
    local url        = assert(io.popen(cmd))
    local blocjson   = url:read('*all')
    url:close()
    local jsonValeur = json:decode(blocjson)
    val = tostring(jsonValeur.OUT3) -- Ici on récupère le statut de la sortie 3
    return val
end

commandArray = {}

    val = tostring(jsoncapture())
    if val == "1" then
        print ("Valeur de la sortie 3 : allumée")
    elseif val == "0" then
        print ("Valeur de la sortie 3 : éteinte")
    end

return commandArray

Re: recupération de variables dans LUA

Publié : 06 déc. 2019, 16:36
par freerider90
Bonjour Imet,

et merci!!!!

dans mon cas je souhaite récupérer l'etat d'une entrée. donc je vais bidouiller ton bout de code ca donne ca:
test Json input

Code : Tout sélectionner

http://**.***.**.***:*****/api/xdevices.json?cmd=10
ce qui me donne ca:
"product":"IPX800_V3","IN1":0,"IN2":0,"IN3":0,"IN4":0,"IN5":0,"IN6":0,"IN7":0,"IN8":0,"IN9":0,"IN10":0,"IN11":0,"IN12":0,"IN13":0,"IN14":0,"IN15":0,"IN16":0,"IN17":0,"IN18":0,"IN19":0,"IN20":0,"IN21":0,"IN22":0,"IN23":0,"IN24":0,"IN25":0,"IN26":0,"IN27":0,"IN28":0,"IN29":0,"IN30":0,"IN31":0,"IN32":0
donc pour la suite on va dire que mon IP est juste, et ma commande aussi
je fais un evenement type LAU a base de temps (je pense que c'est ce dont j'ai besoin?)

Code : Tout sélectionner

-- Récupération de l'état de l'entrée 29 de l'IPX800 v3
local IP_IPX = "**.***.**.***:*****"

function jsoncapture()
    local json       = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()
    local cmd        = 'curl -s ' .. '"' .. "http://" .. IP_IPX  .. "/api/xdevices.json?cmd=10" .. '"'
    local url        = assert(io.popen(cmd))
    local blocjson   = url:read('*all')
    url:close()
    local jsonValeur = json:decode(blocjson)
    val = tostring(jsonValeur.IN29) -- Ici on récupère le statut de l'entrée 29
    return val
end

commandArray = {}

    val = tostring(jsoncapture())
    if val == "1" then
        print ("lumiere escalier : allumée")
    elseif val == "0" then
        print ("lumiere escalier : éteinte")
    end

return commandArray
le log me dit:
2019-12-06 17:34:00.659 Status: LUA: lumiere escalier : éteinte
donc on est pas mal deja.
Mais on est bien d'accord que je ne suis à ce stade pas en mesure d'avoir une interraction avec un interrupteur? je suis juste censé avoir un message dans le log?

j'imagine qu'il faut continuer à écrire le code LUA pour qu'il agisse sur un dispositif?
mais je me suis posé une question cependant,
la lecture du LUA va t'elle uniquement changer " l'image " de la lampe sur domoticz ou est ce que cela va engendrer un envoi CMD ON CMD OFF a chaque mise a jour?

dans ce cas je vais avoir un problème car j'utilise un periph' virtuel (appelé IPX V3) et des interrupteur ON/OFF avec
CMD On: http://192.168.1.3:8383/leds.cgi?led=29
CMD OFF: http://192.168.1.3:8383/leds.cgi?led=29

donc ca risque de me crée une sorte de boucle sans fin cette histoire non?

ou peut être je n'ait pas créé le bon type de materiel ou interrupteur?

en tout cas merci beaucoup tu temps que tu m'a accordé en répondant, ca fait plusieurs nuits que je cherche et essaie des truc mais a chaque fois je fait petit pas par petit pas, là par contre avec le coup du Json pfff mes cernes vont commencer à disparaitre!!!

merci

FREE.

Re: recupération de variables dans LUA

Publié : 06 déc. 2019, 19:02
par lmet
freerider90 a écrit : 06 déc. 2019, 16:36 Mais on est bien d'accord que je ne suis à ce stade pas en mesure d'avoir une interraction avec un interrupteur? je suis juste censé avoir un message dans le log?
Bah oui sinon cela serait trop facile ;)
Je ne suis pas sûr d'avoir bien compris ton souci. Si tu veux interagir avec un module tu peux placer une commande comme celle-ci (à la place du print) :

Code : Tout sélectionner

commandArray[#commandArray + 1] = {['Nom_du_Module']='Off'}
Par contre la commande sera envoyée toutes les minutes. Tu peux ne l'envoyer qu'une fois en mettant une condition :

Code : Tout sélectionner

if (otherdevices['Nom_du_Module'] == "On") then 
	commandArray[#commandArray + 1] = {['Nom_du_Module']='Off'}
end
A moins que tu souhaites interagir sur une sortie de l'IPX ?
Edit : code modifié position de la parenthèse )

Re: recupération de variables dans LUA

Publié : 08 déc. 2019, 17:20
par freerider90
bonjour Imet. dsl pour le temps de réponse mais week-end telethon....


alors je vais essayer d'être plus claire pour t'expliquer ma problématique.

-j'utilise des télérupteurs bipolaires pour mes lumières.
-quand la lumiére est allumée, cela active des relais d'isolation en 230v donc et cela ferme le contact des l'IPX V3 donc je
récupère sur la v3 l'état lumiere
-mon interface Domoticz fonctionne avec homebridge.

j'aimerai que domoticz sache quand jai appuyé sur le Bouton poussoir mécanique pour allumé la lumiere car pour le moment et ce garce a ton aide l'état de l'entree de la V3 n'apparait que dans le log ce qui est deja une grande avancé pour moi.

le problème c'est bien-sur que lorsque je demande a siri d'allume la lumiere il ce contente d'inverser l'état de mon dispositif et donc si la lumiere est deja allumer il l'éteint car il ne sais pas que j'ai changer l'état via le bouton poussoir mécanique.

mais comme mon dispositif envoie une CMD ON et une CMD OFF a chaque fois qu'il change d'état je voudrai savoir comment je dois faire pour changer uniquement l'état de l'icone sans qu'il envoie les commande lorsque j'appuis sur le bouton poussoir mural.

merci à toi.

Free.

Re: recupération de variables dans LUA

Publié : 08 déc. 2019, 19:07
par lmet
freerider90 a écrit : 08 déc. 2019, 17:20 bonjour Imet. dsl pour le temps de réponse mais week-end telethon....
Salut, c'est tout à ton honneur :)
Ok pour ton script si tu ajoutes un "dummy" de type interrupteur qu'on va appeler 'interrupteur' cela donnerai :

Code : Tout sélectionner

commandArray = {}

    val = tostring(jsoncapture())
    if val == "1" then
        print ("lumiere escalier : allumée")
	if (otherdevices['interrupteur'] == "Off") then 
		commandArray[#commandArray + 1] = {['interrupteur']='On'}
	end
    elseif val == "0" then
        print ("lumiere escalier : éteinte")
	if (otherdevices['Nom_du_Module'] == "On") then 
		commandArray[#commandArray + 1] = {['interrupteur']='Off'}
	end
    end

return commandArray
A partir de là tu disposes d'un "dummy" qui indique le statut de la lumière effectuée manuellement (Avec une latence d'une minute). Notes que lorsqu'un script fonctionne il est bien de supprimer les "print".

Il se trouve que j'utilise aussi homebridge et j'ai un peu galéré pour commander mes volets à la fois à la voix via le HomePod tout en ayant un retour d'état du statut dans Domoticz. Le script n'est pas optimisé (tellement content que cela fonctionne).

Code : Tout sélectionner

commandArray = {}
	
	-- Si la demande d'ouverture est faite via UI ou ImperiHome
	if (devicechanged['Volets_RDC']) == 'On' and otherdevices['Les volets'] == 'Off' then
		move_volets ('On') 
		commandArray[#commandArray + 1] = {['Les volets'] = 'On'}
	elseif (devicechanged['Volets_RDC'])== 'Off' and otherdevices['Les volets'] == 'On' then
		move_volets ('Off')
		commandArray[#commandArray + 1] = {['Les volets'] = 'Off'}
	end
	-- Si la commande provient d'une commande Siri
	if (devicechanged['Les volets']) == 'On' and otherdevices['Volets_RDC'] == 'Off' then
		move_volets ('On')
		commandArray[#commandArray + 1] = {['Volets_RDC'] = 'On'}
	elseif (devicechanged['Les volets']) == 'Off' and otherdevices['Volets_RDC'] == 'On' then
		move_volets ('Off')
		commandArray[#commandArray + 1] = {['Volets_RDC'] = 'Off'}
    	end

return commandArray
Je pense que tu pourrais adapter ce script à ton besoin.
En gros j'ai deux "dummy" l'un sur l'UI (Volets_RDC) l'autre dans homebridge (Les volets). Le script est de type device. Le fonctionnement est le suivant :
Si une demande d'ouverture physique (allumage pour toi) et que selon Siri les volets sont fermés (éteint pour toi) alors on ouvre les volets et on renseigne le dummy homebridge . La condition otherdevices empêche le système de boucler.

Dans ton cas il te faudrait laisser le script time qui te permet de récupérer le statut (Allumage manuel) et rajouter ce script en modifiant 'Les volets' par 'le_nom_du_dummy_homebridge'.

N'hésites pas à proposer du code, c'est le meilleur moyen pour progresser !

Re: recupération de variables dans LUA

Publié : 08 déc. 2019, 20:11
par freerider90
Par UI tu entends User Interface je presume?
je comprend ton mode de fonctionnement, meme si j'ai encore besoin de digerer les info.

avant que tu me réponde j'ai commencé a explorer une autre façon de faire

en LUA DEVICE

si 'appuis sur le device lumiere escalier pour passer de OFF à ON
et si la valeur en écoute de l'entre 29 de l'IPX V3 == Off
envoie la commande http vers ipx relai 29 ON (en mode impultionnel avec TB 01)
sinon si (la meme chose pour passer de on a off)

ca donne ca du coup dans ma logique plus de script a base de temps mais une interrogation lors de l'envoie de la commande qui vas induire une latence de traitement par rapport a ta façon de faire je pense, mais peut être acceptable pour moi et au pire ca m'aidera a comprendre pour faire mieux après

mais je dois avoir fait pas mal d'erreur dans ma syntaxe car ca marche pas

Code : Tout sélectionner


-- Récupération de l'état de l'entrée 29 de l'IPX800 v3 By IMET
local IP_IPX = "192.168.1.3:8383"

function jsoncapture()
    local json       = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()
    local cmd        = 'curl -s ' .. '"' .. "http://" .. IP_IPX  .. "/api/xdevices.json?cmd=10" .. '"'
    local url        = assert(io.popen(cmd))
    local blocjson   = url:read('*all')
    url:close()
    local jsonValeur = json:decode(blocjson)
    val = tostring(jsonValeur.IN29) -- Ici on récupère le statut de l'entrée 29
    return val
end

commandArray = {}

     val = tostring(jsoncapture())
     if (devicechanged['lumiere escalier'] == 'On' and val == "0" then 
         print ("lumiere escalier : cmd ON send")
         commandArray['OpenURL']='http://192.168.1.3:8383/leds.cgi?led=28'
    elseif (devicechanged['lumiere escalier'] == 'Off' and val == "1" then
         print ("ecoute lumiere escalier : éteinte")
         commandArray['OpenURL']='http://192.168.1.3:8383/leds.cgi?led=28'
         print ("lumiere escalier : cmd OFF send")
    
        
    end    

return commandArray

Re: recupération de variables dans LUA

Publié : 08 déc. 2019, 20:42
par freerider90
bah en fait je suis allé trop vite
oublie de parenthese avant then

Code : Tout sélectionner

-- Récupération de l'état de l'entrée 29 de l'IPX800 v3
local IP_IPX = "192.168.1.3:8383"

function jsoncapture()
    local json       = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()
    local cmd        = 'curl -s ' .. '"' .. "http://" .. IP_IPX  .. "/api/xdevices.json?cmd=10" .. '"'
    local url        = assert(io.popen(cmd))
    local blocjson   = url:read('*all')
    url:close()
    local jsonValeur = json:decode(blocjson)
    val = tostring(jsonValeur.IN29) -- Ici on récupère le statut de l'entrée 29
    return val
end

commandArray = {}


--for deviceName in pairs(devicechanged) do
  --  print ("Device based event fired on '"..deviceName.."', value '"..tostring(deviceValue).."'");
    
     val29 = tostring(jsoncapture())
     if (devicechanged['lumiere escalier'] == 'On' and val == "0") then -- si je passe a ON et que l'etat et éteint
         print ("lumiere escalier : cmd ON send")
         commandArray['OpenURL']='http://192.168.1.3:8383/leds.cgi?led=28' -- envoie la commande http pour activer le relai 29
    elseif (devicechanged['lumiere escalier'] == 'Off' and val == "1") then -- si je passe a OFF et que l'etat et allumé
         print ("ecoute lumiere escalier : éteinte")
         commandArray['OpenURL']='http://192.168.1.3:8383/leds.cgi?led=28'   -- envoie la commande http pour activer le relai 29
         print ("lumiere escalier : cmd OFF send")
    
        
    end    

return commandArray
et il faut bien laisser l'interrogation de status à base de temps

Code : Tout sélectionner

-- Récupération de l'état de l'entrée 29 de l'IPX800 v3
local IP_IPX = "192.168.1.3:8383"

function jsoncapture()
    local json       = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()
    local cmd        = 'curl -s ' .. '"' .. "http://" .. IP_IPX  .. "/api/xdevices.json?cmd=10" .. '"'
    local url        = assert(io.popen(cmd))
    local blocjson   = url:read('*all')
    url:close()
    local jsonValeur = json:decode(blocjson)
    val = tostring(jsonValeur.IN29) -- Ici on récupère le statut de l'entrée 29
    return val
end

commandArray = {}

    val = tostring(jsoncapture())
    if val == "1" then
        print ("lumiere escalier : allumée")
        commandArray['lumiere escalier'] = 'On'
    elseif val == "0" then
        print ("lumiere escalier : éteinte")
        commandArray['lumiere escalier'] = 'Off'
    end

return commandArray
en tout cas là pour un seul dispositif je suis arriver à mon objectif grace à ton aide
merci encore

pour la suite j'essaye de faire un retour d'état pour plusieurs entrées mais je suis en connection disctant car je ne dort pas encore sur le chantier, donc ca fonctionne mais j'ai une belle latence, demain je verrai si cela est dut a la conexion distante ou a mon code qui je pence a beaucoup trop de "IF" si c'est comme en C pour le peux que j'en sait c'est pas la bonne façon de faire, quand pense tu?

Code : Tout sélectionner

local IP_IPX = "192.168.1.3:8383"

function jsoncapture()
    local json       = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()
    local cmd        = 'curl -s ' .. '"' .. "http://" .. IP_IPX  .. "/api/xdevices.json?cmd=10" .. '"'
    local url        = assert(io.popen(cmd))
    local blocjson   = url:read('*all')
    url:close()
    local jsonValeur = json:decode(blocjson)
  --  val1 = tostring(jsonValeur.IN1)
  --  val2 = tostring(jsonValeur.IN2)
  --  val3 = tostring(jsonValeur.IN3)
  --  val4 = tostring(jsonValeur.IN4)
  --  val5 = tostring(jsonValeur.IN5)
  --  val6 = tostring(jsonValeur.IN6)
 --   val7 = tostring(jsonValeur.IN7)
  --  val8 = tostring(jsonValeur.IN8)
    val25 = tostring(jsonValeur.IN25)
    val26 = tostring(jsonValeur.IN26)
    val27 = tostring(jsonValeur.IN27)
    val28 = tostring(jsonValeur.IN28)
    val29 = tostring(jsonValeur.IN29) -- Ici on récupère le statut de l'entrée 29
    val30 = tostring(jsonValeur.IN30)
    val31 = tostring(jsonValeur.IN31)
    val32 = tostring(jsonValeur.IN32)
    return val
end

commandArray = {}

    val = tostring(jsoncapture())
    if val29 == "1" then
        commandArray['lumiere escalier'] = 'On'
    elseif val29 == "0" then
        commandArray['lumiere escalier'] = 'Off'
    end
    
    if val30 == "1" then
        commandArray['lumiere mezzanine'] = 'On'
    elseif val30 == "0" then
        commandArray['lumiere mezzanine'] = 'Off'
    end
    
    if val31 == "1" then
        commandArray['lumiere couloir'] = 'On'
    elseif val31 == "0" then
        commandArray['lumiere couloir'] = 'Off'
    end
    
    if val32 == "1" then
        commandArray['lumiere secret room'] = 'On'
    elseif val32 == "0" then
        commandArray['lumiere secret room'] = 'Off'
    end
    
    if val25 == "1" then
        commandArray['lumiere salle de bain'] = 'On'
    elseif val25 == "0" then
        commandArray['lumiere salle de bain'] = 'Off'
    end
    
    if val26 == "1" then
        commandArray['lumiere chambre'] = 'On'
    elseif val26 == "0" then
        commandArray['lumiere chambre'] = 'Off'
    end
    
    if val27 == "1" then
        commandArray['plafond sejour'] = 'On'
    elseif val27 == "0" then
        commandArray['plafond sejour'] = 'Off'
    end
    
    if val28 == "1" then
        commandArray['par sejour'] = 'On'
    elseif val28 == "0" then
        commandArray['par sejour'] = 'Off'
    end

return commandArray

Re: recupération de variables dans LUA

Publié : 09 déc. 2019, 00:25
par lmet
Désolé cela ne fonctionne pas comme cela essayons d'avancer par rapport à ta demande initiale.