Aller au contenu

Conversion Code Lua Venant De Veralite


Frédéric Dury

Messages recommandés

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.

Lien vers le commentaire
Partager sur d’autres sites

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.
Lien vers le commentaire
Partager sur d’autres sites

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
Lien vers le commentaire
Partager sur d’autres sites

 

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
Lien vers le commentaire
Partager sur d’autres sites

Bon, je suis trop novice en la matière visiblement.
Comment est-ce que je peux accéder àce fichier qui se trouve sur mon serveur Raspberry en local sur mon réseau (url: http://192.168.1.51/weewx/RSS/weewx_rss.xml)?

Merci pour votre aide.

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...