Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

 

Je viens d'une VeraLite et souhaiterait traduire le code Lua que j'y utilisais vers la HC2. Je récupère plusieurs valeurs dans un fichier xml encadré par des balises.

 

 

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.1.51/weewx/RSS/weewx_rss.xml"
local status, rss = luup.inet.wget(url, 10)
if (status == 0) then
local Tin = extractElement("Tint", rss, "Error")
Tin = tonumber(string.sub(Tin, 1, 4))
luup.variable_set("urn:upnp-org:serviceId:TemperatureSensor1", "CurrentTemperature", Tin, 118)

local atm = extractElement("Barometre", rss, "Error")
atm = tonumber(string.sub(atm, 1, 4))
luup.variable_set("urn:upnp-org:serviceId:TemperatureSensor1", "CurrentTemperature", atm, 119)

local rain = extractElement("Pluie", rss, "Error")
rain = tonumber(string.sub(rain, 1, 3))
luup.variable_set("urn:upnp-org:serviceId:TemperatureSensor1", "CurrentTemperature", rain, 122)
end

 

Je suis un peu perdu sur comment programmer un module virtuel en HC2

Merci pour le coup de pouce.

Posté(e)

En effet pas très clair cela.

Néanmoins on peut toujours transformer le xml en json depuis la HC2 si tu en as vraiment besoin.

Sent from my GT-I9192 using Tapatalk

Posté(e)

C'est pas du lua il me semble sur vera mais du code luup, c'est pas tout àfait la même chose bien qu'on retrouve des éléments identiques au lua (comme par exemple string.sub, match...).

Posté(e)

Tu veux adapter quoi là  -_-'.

Dsl mais tout est à  refaire.

Ok, je peux repartir de 0.

J'ai un Raspberry connecté à  une station météo sur mon réseau qui me génère un fichier xml dont le contenu est :

 

<?xml version="1.0"?>
<rss version="2.0" 
   <channel>
         <Barometre>1003.9 mbar</Barometre> 
         <Vent>0 km/h from 90°</Vent>
         <Tint>24.2°C</Tint>
<Pluie>1.2 mm</Pluie>
   </channel>
</rss>
 
et je souhaite récupérer les valeurs entre balises pour les faire afficher dans un module virtuel de la HC2.
Posté(e)

Allez je suis généreux. Avec ça tu récupéreras ce qu'il y a dans un fichier xml assez simplement.

Je te laisse broder autour, rien de compliqué.

function XML(content, property) -- valueFromXML
  local s = string.find(content, "<" .. property .. ">");
  local e = string.find(content, "</" .. property .. ">");
  if (s and e) then
    local m = string.match(content, "<" .. property .. ">(.-)</" .. property .. ">");
    local sl = string.len("<" .. property .. ">");
    local el = string.len("</" .. property .. ">");
    local fs = string.sub(content, 0, s-1);
    local te = string.sub(content, e + el);
    return m, fs .. te;
  end
  return nil, content;
end
Posté(e) (modifié)

 

Allez je suis généreux. Avec ça tu récupéreras ce qu'il y a dans un fichier xml assez simplement.

Je te laisse broder autour, rien de compliqué.

function XML(content, property) -- valueFromXML
  local s = string.find(content, "<" .. property .. ">");
  local e = string.find(content, "</" .. property .. ">");
  if (s and e) then
    local m = string.match(content, "<" .. property .. ">(.-)</" .. property .. ">");
    local sl = string.len("<" .. property .. ">");
    local el = string.len("</" .. property .. ">");
    local fs = string.sub(content, 0, s-1);
    local te = string.sub(content, e + el);
    return m, fs .. te;
  end
  return nil, content;
end

Merci,

Je test de suite!

 

Cf : http://www.domotique-fibaro.fr/index.php/topic/700-bien-utiliser-la-fonction-citation-dans-les-r%C3%A9ponses/

Modifié par moicphil
Merci de ne pas citer le message précedent
Posté(e)

Oups, je vois que personne ne t'as répondu, alors je vais t'aiguiller un peu.

Il faut créer un module virtuel (seul les modules virtuels peuvent accéder au requête HTTP). Dans ton module virtuel, tu crées un bouton, dans ce dernier pour accéder à  ton fichier tu dois utiliser le code suivant :

 

HC2 = Net.FHttp("192.168.1.51")
response = HC2:GET("/.../weewx_rss.xml")
response contiendra donc le contenu de ton fichier XML.

Après je te laisse jouer avec le code de BenjyNet mais théoriquement, je dis bien théoriquement, un code comme celui-ce devrait faire l'affaire :

 

function XML(content, property) -- valueFromXML
  local s = string.find(content, "<" .. property .. ">");
  local e = string.find(content, "</" .. property .. ">");
  if (s and e) then
    local m = string.match(content, "<" .. property .. ">(.-)</" .. property .. ">");
    local sl = string.len("<" .. property .. ">");
    local el = string.len("</" .. property .. ">");
    local fs = string.sub(content, 0, s-1);
    local te = string.sub(content, e + el);
    return m, fs .. te;
  end
  return nil, content;
end

HC2 = Net.FHttp("192.168.1.51");
response = HC2:GET("/.../weewx_rss.xml");

local barometre = XML(response, "Barometre");
local vent = XML(response, "Vent");
local tint = XML(response, "Tint");
local pluie = XML(response, "Pluie");
-- A toi d'exploiter les variables barometre, vent, tint et pluie comme tu le souhaites
.

Ce code a été écrit sans aucun test, c'est plus un prototype qu'un code fonctionnel mais il devrait te permettre de t'en sortir avec des performance acceptables correct vu que ton fichier XML est très petit.

Cordialement

×
×
  • Créer...