(LUA) Extraire les valeurs d'un fichier xml

Section dédiée à la box Vera de MiCasaVerde.

(LUA) Extraire les valeurs d'un fichier xml

Messagede alcor » 21 Aoû 2012, 17:37

Bonjour

Tout nouveau possesseur d'une Vera, je debute en script Lua
Je m'adresse donc aux pros du script :

En attendant de basculer sur du RFXcom + Oregon, je souhaiterais pouvoir lire mes sondes 1-Wire sur ma Vera.
Je sais qu'il y a déjà 2 solutions : Le OW-Server (plug in existant, mais cher) ou le module universel Fibaro (problème de lecture des decimales)

J'ai cherché une autre solution et j'ai donc raccorder mon réseau 1-Wire sur mon mediacenter Windows et installer LogTemp qui génère un fichier Xml et l'enregistre sur mon serveur Web
J'accède donc à ce fichier sur mon réseau local

Code: Tout sélectionner
<DATA>
<PROGRAM NAME="LogTemp">
<VERSION>2.25.0.97</VERSION>
<TIMEZONE_BIAS_UTC>+0200</TIMEZONE_BIAS_UTC>
</PROGRAM>
<TEMPERATURES>
<SENSOR ROMID="E50000034AC80B28">
<NAME>EXTERIEUR</NAME>
<VALUE>22.63</VALUE>
<DATE>
<YEAR>2012</YEAR>
<MONTH>8</MONTH>
<DAY>21</DAY>
</DATE>
<TIME>
<HOUR>17</HOUR>
<MIN>29</MIN>
<SEC>8</SEC>
</TIME>
</SENSOR>
<SENSOR ROMID="4F0000034A874828">
<NAME>SALON</NAME>
<VALUE>24.38</VALUE>
<DATE>
<YEAR>2012</YEAR>
<MONTH>8</MONTH>
<DAY>21</DAY>
</DATE>
<TIME>
<HOUR>17</HOUR>
<MIN>29</MIN>
<SEC>7</SEC>
</TIME>
</SENSOR>
</TEMPERATURES>
</DATA>


J'ai donc tenter d'extraire les données de ce fichier
J'ai repris quelques script, en particulier le script de lecture de l'ipx800 sur ce forum et j'ai réussi à mettre à jour un module température en fonction du fichier

Mon problème apparait quand je veux lire 2 sondes car dans le fichier, toutes les valeurs de température sont encadrées de la même balise <VALUE>

et là, c'est le drame :D

Si une ame charitable pouvait m'aider ... :roll:

Merci
alcor
P'tit Guru de domotique
 
Messages: 85
Inscription: 06 Oct 2006, 20:54

Publicité

La publicité est nécessaire car elle permet de pérenniser ce site, son hébergement, ses contributions ... Vous pouvez aussi faire un don pour le soutenir (cliquez sur ce texte). Pensez aux revues que vous économisez en lisant régulièrement Touteladomotique.com ...

Publicité
 

Re: (LUA) Extraire les valeurs d'un fichier xml

Messagede jslg78 » 22 Aoû 2012, 11:22

Slt,

Tu peux donner ton script pour la lecture...
jslg78
Dieu de domotique
 
Messages: 389
Inscription: 16 Sep 2007, 09:36

Re: (LUA) Extraire les valeurs d'un fichier xml

Messagede ninux » 22 Aoû 2012, 11:56

Hello

Tu doit utilise la fonction lxp pour parser ton xml : http://matthewwild.co.uk/projects/luaexpat/lom.html
Regarde dans le source du plugin Google Calendar il y a une implémentation.
-VeraLite
-Zwave SM103 SF812 ST814 AN158-6 HRT4-ZW-SET SE812 FGR221 FGBS001 DSA22
-RFXCOM Lan
-Oregon BTHR918N, THGR810, PCR800
-IPX800v2
-Nas Ubuntu
-Cam Axis M1031-W Foscam FI8905W
ninux
Dieu de domotique
 
Messages: 216
Inscription: 16 Juil 2010, 09:42

Re: (LUA) Extraire les valeurs d'un fichier xml

Messagede alcor » 22 Aoû 2012, 16:07

Hello

Merci pour ton retour
J'ai parcouru tes sources mais n'étant pas du tout programmeur, je n'y ai pas compris grand chose

Autant, je m'en sortais pas trop mal en vb sous homeseer, autant en LUA, j'ai l'impression que cela va être plus compliqué :(

J'ai aussi essayé de reprendre le script "la zibase en complement de la vera" mais la structure du fichier xml n'étant pas les mêmes, je n'y arrive pas
alcor
P'tit Guru de domotique
 
Messages: 85
Inscription: 06 Oct 2006, 20:54

Re: (LUA) Extraire les valeurs d'un fichier xml

Messagede alcor » 23 Aoû 2012, 14:15

Bonjour

Pour le script utilisé, j'étais parti sur le script récupération des entrées IPX800 que j'ai adapté pour récupérer la valeur entre les balises <VALUE>

Code: Tout sélectionner
local function extractElement(tag, xml, default)

local pattern = "<"..tag..">(.*)</"..tag..">"

local result = (xml:match(pattern) or default)

return result

end

local url = "http://192.168.0.24/last.xml"

local status, rss = luup.inet.wget(url, 10)

if (status == 0) then

local TempSalon = extractElement("VALUE", rss, "N/A")

luup.variable_set("urn:upnp-org:serviceId:TemperatureSensor1", "CurrentTemperature", TempSalon, 19)
end


Cela fonctionne lorsque je paramêtre Logtemp avec une seule sonde de température, mais des que j'en mets une deuxième, cela ne fonctionne plus

Je n'arrive pas à introduire dans le code une deuxième variable qui serait soit l'ID soit le nom de la sonde et aussi une notion de ligne car le xml affiche tout a la suite

Si quelqu'un a déjà parser un fichier XML de ce type ou aurait la gentillesse de me donner juste un exemple, ce serait vraiment cool !!

Merci
alcor
P'tit Guru de domotique
 
Messages: 85
Inscription: 06 Oct 2006, 20:54

Re: (LUA) Extraire les valeurs d'un fichier xml

Messagede ninux » 23 Aoû 2012, 14:59

As tu essayé avec owfs et owhttp qui te fourni une page web pour chaque module 1-wire ?
-VeraLite
-Zwave SM103 SF812 ST814 AN158-6 HRT4-ZW-SET SE812 FGR221 FGBS001 DSA22
-RFXCOM Lan
-Oregon BTHR918N, THGR810, PCR800
-IPX800v2
-Nas Ubuntu
-Cam Axis M1031-W Foscam FI8905W
ninux
Dieu de domotique
 
Messages: 216
Inscription: 16 Juil 2010, 09:42

Re: (LUA) Extraire les valeurs d'un fichier xml

Messagede alcor » 23 Aoû 2012, 16:26

Je viens de regarder et cela s'installe sur du linux et je suis sur windows 7
Apparemment il y aurait une solution pour l'installer sur Windows mais c'est encore super complexe sans garantie que cela resolve mon problème de script Lua

C est vraiment dommage qu'aucun plugin 1wire ne soit sortit sur la Vera pour fonctionner sur USB. ce serait une solution simple et économique
La, je crois que je vais devoir passer sur du RFXcom USB + sonde Orégon, si je veux gérer mon chauffage cet hiver
alcor
P'tit Guru de domotique
 
Messages: 85
Inscription: 06 Oct 2006, 20:54

Re: (LUA) Extraire les valeurs d'un fichier xml

Messagede milillicuti » 23 Aoû 2012, 19:41

alcor a écrit:C est vraiment dommage qu'aucun plugin 1wire ne soit sortit sur la Vera pour fonctionner sur USB. ce serait une solution simple et économique


Bien d'accord ... Mais apparemment c'est assez compliqué. Mais vraiment dommage ...
Tout nouveau, tout beau ! Avec quelques articles sur la domotique !
Communication & publicité - Domotique : http://www.milillicuti.com
Avatar de l’utilisateur
milillicuti
Dieu de domotique
 
Messages: 1237
Inscription: 16 Déc 2008, 14:40

Re: (LUA) Extraire les valeurs d'un fichier xml

Messagede alcor » 26 Aoû 2012, 22:45

Bonsoir

Après 2 jours de recherches intensives, je n'ai pas beaucoup avancé

Avec le code ci dessous :

Code: Tout sélectionner
local function extractElement1(tag, xml, default)
local pattern = "<"..tag..">(.-)</"..tag..">"
local result = (xml:match(pattern) or default)
return result
end

local function extractElement2(tag, xml, default)
local pattern = "<"..tag..">(.-)</"..tag..">"
local result = (xml:match(pattern) or default)
return result
end

--Connexion au Fichier xml
local url = "http://192.168.0.24/last.xml"
--Lecture URL
local status, rss = luup.inet.wget(url, 10)
luup.log("statut est: " .. status)

if (status == 0) then

local TempSalon = extractElement1("VALUE", rss, "N/A")
luup.log("TempSalon est: " .. TempSalon)
local nameTempSalon = extractElement2("NAME", rss, "N/A")
luup.log("name est: " .. nameTempSalon)
luup.variable_set("urn:upnp-org:serviceId:TemperatureSensor1", "CurrentTemperature", TempSalon, 21)
luup.variable_set("urn:upnp-org:serviceId:TemperatureSensor1", "name", nameTempSalon, 21)
end


J'arrive à récupérer le nom et la valeur de la première sonde de mon fichier xml ci dessous

Code: Tout sélectionner
<DATA>
<PROGRAM NAME="LogTemp">
<VERSION>2.25.0.97</VERSION>
<TIMEZONE_BIAS_UTC>+0200</TIMEZONE_BIAS_UTC>
</PROGRAM>
<TEMPERATURES>
<SENSOR ROMID="4F0000034A874828">
<NAME>SALON</NAME>
<VALUE>23.88</VALUE>
</SENSOR>
<SENSOR ROMID="E50000034AC80B28">
<NAME>EXTERIEUR</NAME>
<VALUE>17.56</VALUE>
</SENSOR>
</TEMPERATURES>
</DATA>


Mon device 21 est bien mis à jour

Par contre je n'arrive toujours pas à faire la même chose pour ma deuxième sonde

J'imagine qu'il faut faire une boucle mais je ne sais pas comment m'y prendre

Merci pour votre aide
alcor
P'tit Guru de domotique
 
Messages: 85
Inscription: 06 Oct 2006, 20:54

Re: (LUA) Extraire les valeurs d'un fichier xml

Messagede Antor » 26 Aoû 2012, 23:40

milillicuti a écrit:
alcor a écrit:C est vraiment dommage qu'aucun plugin 1wire ne soit sortit sur la Vera pour fonctionner sur USB. ce serait une solution simple et économique


Bien d'accord ... Mais apparemment c'est assez compliqué. Mais vraiment dommage ...


J'ai tenté d'utilisé sur mon installation 1-Wire le Fibaro Universal Sensor (FGBS321) mais sans grand succès. mes 4 sondes sont bien détectée mais la température remonte aléatoirement. Prochaine étape via un Arduino... avec j'espère plus de succès.
Mon blog atour de la domotique : http://www.antor.fr
Avatar de l’utilisateur
Antor
Dieu de domotique
 
Messages: 217
Inscription: 24 Juil 2011, 18:29

Re: (LUA) Extraire les valeurs d'un fichier xml

Messagede zzdomi » 27 Aoû 2012, 09:14

alcor a écrit:Bonsoir

Après 2 jours de recherches intensives, je n'ai pas beaucoup avancé

Avec le code ci dessous :

Code: Tout sélectionner
local function extractElement1(tag, xml, default)
local pattern = "<"..tag..">(.-)</"..tag..">"
local result = (xml:match(pattern) or default)
return result
end

local function extractElement2(tag, xml, default)
local pattern = "<"..tag..">(.-)</"..tag..">"
local result = (xml:match(pattern) or default)
return result
end

--Connexion au Fichier xml
local url = "http://192.168.0.24/last.xml"
--Lecture URL
local status, rss = luup.inet.wget(url, 10)
luup.log("statut est: " .. status)

if (status == 0) then

local TempSalon = extractElement1("VALUE", rss, "N/A")
luup.log("TempSalon est: " .. TempSalon)
local nameTempSalon = extractElement2("NAME", rss, "N/A")
luup.log("name est: " .. nameTempSalon)
luup.variable_set("urn:upnp-org:serviceId:TemperatureSensor1", "CurrentTemperature", TempSalon, 21)
luup.variable_set("urn:upnp-org:serviceId:TemperatureSensor1", "name", nameTempSalon, 21)
end


J'arrive à récupérer le nom et la valeur de la première sonde de mon fichier xml ci dessous

Code: Tout sélectionner
<DATA>
<PROGRAM NAME="LogTemp">
<VERSION>2.25.0.97</VERSION>
<TIMEZONE_BIAS_UTC>+0200</TIMEZONE_BIAS_UTC>
</PROGRAM>
<TEMPERATURES>
<SENSOR ROMID="4F0000034A874828">
<NAME>SALON</NAME>
<VALUE>23.88</VALUE>
</SENSOR>
<SENSOR ROMID="E50000034AC80B28">
<NAME>EXTERIEUR</NAME>
<VALUE>17.56</VALUE>
</SENSOR>
</TEMPERATURES>
</DATA>


Mon device 21 est bien mis à jour

Par contre je n'arrive toujours pas à faire la même chose pour ma deuxième sonde

J'imagine qu'il faut faire une boucle mais je ne sais pas comment m'y prendre

Merci pour votre aide


il faut faire une boucle avec l'iterateur renvoyé par gmatch

Code: Tout sélectionner
local function extractElement1(tag, xml, default)
    local pattern = "<"..tag..">(.-)</"..tag..">"
   result = {}
    for var in xml:gmatch(pattern) do
      table.insert(result, var)
   end
    return result[1] or default
end

local function extractElement2(tag, xml, default)
    local pattern = "<"..tag..">(.-)</"..tag..">"
   result = {}
    for var in xml:gmatch(pattern) do
      table.insert(result, var)
   end
    return result[2] or default
end


Ensuite tu pourrais passer en argument l'index à lire au lieu de faire une fonction pour chaque valeur.
zzdomi
P'tit Dieu de domotique
 
Messages: 190
Inscription: 04 Aoû 2009, 14:38
Localisation: Jouy Le Moutier - 95

Re: (LUA) Extraire les valeurs d'un fichier xml

Messagede dreamer54 » 27 Aoû 2012, 12:13

Pour extraire, la temperature du fichier xml généré par logtemp, j'utilise les fonctions xpath (que j'utilise dans la fonction Parse String de Thingspeak) et il faut mettre simplement : TEMPERATURES/SENSOR[2].VALUE . Ca marche parfaitement pour moi..
dreamer54
Membre Actif
 
Messages: 30
Inscription: 18 Sep 2009, 14:01
Localisation: NANCY

Suivante

Retourner vers Box - Vera/VeraLite de Micasaverde

Qui est en ligne

Utilisateurs parcourant ce forum: LG76, lolodomo et 8 invités

Copyright © 2011 - Touteladomotique.com - Tous droits réservés.