Aller au contenu

Recommended Posts

pour ma part, dans le 16, j'ai bien reçu la notification MeteoAlerte16 Danger crue-Danger  ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Au temps pour moi.

 

Je pensais que le MV aller me retourner la nature de la vigilance "Orages" mais en effet, si cela n'est pas indiqué dans le XML, le MV ne va pas le deviner.

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

Pour ceux qui veulent, j'ai rajouté la récupération du commentaire de l'entete vigilance et transformé l'url en un timestamp.

Zozotte

MeteoAlerte_-_31.vfib

post-1412-0-36014700-1437737988_thumb.jpg

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Super idee zozotte, peux tu mettre une capture du VD stp ?

 

Merciiii

Partager ce message


Lien à poster
Partager sur d’autres sites

Je déterre le topic mais ça se met àjour chez vous ? Parce que moi j'ai l'impression que le main loop n'appuie pas sur le bouton :(

Partager ce message


Lien à poster
Partager sur d’autres sites

Euh ben je sais pas trop je regarde pas vraiment

Envoyé de mon SM-G900F en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

viens de l'installer ànouveau, ne fonctionne pas chez moi.

soit mauvais paramétrage, soit ne fonctionne pas,

Partager ce message


Lien à poster
Partager sur d’autres sites

Bah moi ça fonctionne si j'appuie sur le bouton rafraîchir. Sinon non, c'est mort :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Moi j'ai celui de steven il fonctionne j'ai cela dans le main loop

 

Regarde bien si tu as bien le bon numéro de bouton car en changeant de place les étiquettes ou boutons on oublie de mettre a jour le pressButton

local nbHeure = 12

local i = 0
while true do
	if (i >= (nbHeure*2) or i == 0) then
    	i = 0
		fibaro:call(fibaro:getSelfId(), "pressButton", "5")
	end
	fibaro:sleep(30*60*1000)
  	i = i + 1
end

Partager ce message


Lien à poster
Partager sur d’autres sites

Ah ouais j'ai déjàpas la même chose (je suis con moi aussi, j'avais même pas vu que ça n'appuyait pas sur le bon bouton !) !

local nbHeure = 6

local i = 0
while true do
	if (i >= nbHeure or i == 0) then
    	i = 0
		fibaro:call(fibaro:getSelfId(), "pressButton", "4")
	end
	fibaro:sleep(60*60*1000)
  	i = i + 1
end
Modifié par BenjyNet

Partager ce message


Lien à poster
Partager sur d’autres sites

Bon c'est corrigé et maintenant j'ai ça, pfff :

[DEBUG] 10:26:37: Problème d'accès au données ... tentative dans 10mn

Partager ce message


Lien à poster
Partager sur d’autres sites

MDR je me suis déjàfais avoir aussi

Envoyé de mon SM-G900F en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Mouais sauf que la page xml n'existe plus :( Il y a une autre adresse valide ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Chez moi cela fonctionne

comme je t'ai dis j'ai le code de steven

-- --------------------------------------------------------------------------------------------------------------
-- MeteoAlerte est est script qui va vérifier les alertes méteo du site vigilance.meteofrance.com
-- Le site retournant des informations XML, le script va donc les parser.
-- Author = "Steven Piccand"
-- Version = "V1.40"

-- V1.10 - Isolation des éventuelles erreurs
-- V1.20 - Envoi possible sur plusieurs smartphones
-- V1.30 - Correction problème Main Loop
-- V1.40 - Correction status plus ajout personnalisation icone
-- V2.00 - Ajout du risque (nouveauté de Météofrance
-- --------------------------------------------------------------------------------------------------------------

if (not MeteoAlerte) then

	MeteoAlerte = {}

	-- !!! VOS PARAMETRES !!!
	MeteoAlerte.dep = "54"			-- votre département
    local IdTel = fibaro:getGlobal("TelPascal")
    fibaro:debug("ID du tel : "..IdTel)
	MeteoAlerte.smartphone = {IdTel}	-- {70,71} vos portables ou envoyé la notification push en cas d'alerte
	MeteoAlerte.niveauAlerte = 3	-- le niveau minimum d'alerte pour être notifié
	
	MeteoAlerte.globalvariable = ""	-- Nom de la variable globale a renseigné
	
	-- --------------------------------------------------------------------------------------------------------------
	-- Obtient le XML et le retourne sous forme de table LUA
	-- --------------------------------------------------------------------------------------------------------------
	MeteoAlerte.getXml = function() 
		local MeteoAlerteURL = Net.FHttp("vigilance.meteofrance.com");
		response, status, errorCode = MeteoAlerteURL:GET("/data/NXFR34_LFPW_.xml");
        fibaro:debug("Status : "..status.." - ErrorCode : "..errorCode)
        return MeteoAlerte.iif(response ~= nil, MeteoAlerte.newParser().ParseXmlText(response), "")
	end

	-- --------------------------------------------------------------------------------------------------------------
	-- Va chercher les valeurs du départements
	-- Modifie les valeurs des labels
	-- Envoi un push si nécessaire
	-- Met a jour une variable globale
	-- --------------------------------------------------------------------------------------------------------------
	MeteoAlerte.getData = function()
		local messages = {"<inconnu>", "Aucune", "Attention", "Danger", "!! EXCEPTIONNEL !!"}
    	local risques = {"Pas de vigilance particulière", "Vent violent", "Pluie-innondation", "Orages", "Innondation", "Neige-Verglas", "Canicule", "Grand-froid", "Avalanche", "Vagues-submersion"}
		local icones = {-1, -1, -1, -1, -1}
		local result = 0
		local risque = 0
      	local crue = 0
		local xmlTable = MeteoAlerte.getXml()
		if (xmlTable) then 
			local evs = xmlTable.cartevigilance
			for i in pairs(evs:children()) do
				if (evs:children()[i]:name() == "datavigilance") then
					if (evs:children()[i]["@dep"] == MeteoAlerte.dep) then
						result = tonumber(evs:children()[i]["@couleur"])
						fibaro:debug("Vigilance trouvée : " .. result)
						if (#evs:children()[i]:children() > 0) then
                			for j = 1, #evs:children()[i]:children() do
                  				if (evs:children()[i]:children()[j]:name() == "crue") then
									crue = tonumber(evs:children()[i]:children()[j]["@valeur"])
									fibaro:debug("Crue trouvée : ".. crue)
                    			elseif (evs:children()[i]:children()[j]:name() == "risque") then
									risque = tonumber(evs:children()[i]:children()[j]["@valeur"])
									fibaro:debug("Risque trouvée : ".. risque)
                   				end
                  			end
                        end
					end
				end
			end
		end
		
		fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblVigilance.value", messages[result+1])
		fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblCrue.value", messages[crue+1])
      	fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblRisque.value", risques[risque+1])
		fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblUrl.value", "http://vigilance.meteofrance.com/")
		
		local icone_id = icones[math.max(result+1, crue+1)]
		if (icone_id > -1) then
			fibaro:debug("Icone " .. icone_id)
			fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", icone_id);
		end
		
		fibaro:log("Dernière mise àjour : " .. os.date("%c"))
    
    	fibaro:debug("Vérification envoi par push")
		if (result >= MeteoAlerte.niveauAlerte or crue >= MeteoAlerte.niveauAlerte) then
			fibaro:debug("Envoi nécessaire")
      		if (type(MeteoAlerte.smartphone) == "table") then
              for i = 1, #MeteoAlerte.smartphone do
                    fibaro:call(MeteoAlerte.smartphone[i], "sendPush", "MeteoAlerte [".. MeteoAlerte.dep .." = " .. messages[result+1] .. "] | [crue = " .. messages[crue+1] .. "] | [risque = " .. risques[risque+1].."]")
              end     
          end
		end
		
		if (result and MeteoAlerte.globalvariable and MeteoAlerte.globalvariable ~= "") then
			fibaro:setGlobal(MeteoAlerte.globalvariable, tostring(result))
		end
		
		return true
	end
	
	-- -------------------------------------------------------------------------------------------------------------
	-- Teste la condition  et retourne la valeur true ou false
	-- -------------------------------------------------------------------------------------------------------------
	MeteoAlerte.iif = function(condition, iftrue, iffalse)
		if (condition) then
			return iftrue
		end
		return iffalse
	end


	-- -------------------------------------------------------------------------------------------------------------
	-- Ceci est une version modifiée de Corona-XML-Module par Jonathan Beebe qui a son tour 
	-- est basée sur Alexander Makeev's Lua-only XML parser .
	-- see https://github.com/Cluain/Lua-Simple-XML-Parser
	-- -------------------------------------------------------------------------------------------------------------
	MeteoAlerte.newParser = function()

		parseXml = {}

		parseXml.FromXmlString = function(value)
			value = string.gsub(value, "([%x]+)%;",
			    function(h)
				return string.char(tonumber(h, 16))
			    end);
			value = string.gsub(value, "([0-9]+)%;",
			    function(h)
				return string.char(tonumber(h, 10))
			    end);
			value = string.gsub(value, "'", "'");
			value = string.gsub(value, ">", ">");
			value = string.gsub(value, "<", "<");
			value = string.gsub(value, "&", "&");
			return value;
		end

		parseXml.ParseArgs = function(node, s)
			string.gsub(s, "(%w+)=([\"'])(.-)%2", function(w, _, a)
			    node:addProperty(w,  parseXml.FromXmlString(a))
			end)
		end

		parseXml.ParseXmlText = function(xmlText)
			local stack = {}
			local top = parseXml.newNode()
			table.insert(stack, top)
			local ni, c, label, xarg, empty
			local i, j = 1, 1
			while true do
			    ni, j, c, label, xarg, empty = string.find(xmlText, "<(%/?)([%w_:]+)(.-)(%/?)>", i)
			    if not ni then break end
			    local text = string.sub(xmlText, i, ni - 1);
			    if not string.find(text, "^%s*$") then
				local lVal = (top:value() or "") .. parseXml.FromXmlString(text)
				stack[#stack]:setValue(lVal)
			    end
			    if empty == "/" then -- empty element tag
				local lNode = parseXml.newNode(label)
				parseXml.ParseArgs(lNode, xarg)
				top:addChild(lNode)
			    elseif c == "" then -- start tag
				local lNode = parseXml.newNode(label)
				parseXml.ParseArgs(lNode, xarg)
				table.insert(stack, lNode)
				top = lNode
			    else -- end tag
				local toclose = table.remove(stack) -- remove top

				top = stack[#stack]
				if #stack < 1 then
				    error("XmlParser: nothing to close with " .. label)
				end
				if toclose:name() ~= label then
				    error("XmlParser: trying to close " .. toclose.name .. " with " .. label)
				end
				top:addChild(toclose)
			    end
			    i = j + 1
			end
			local text = string.sub(xmlText, i);
			if #stack > 1 then
			    error("XmlParser: unclosed " .. stack[#stack]:name())
			end
			return top
		end

		parseXml.newNode = function(name)
		    local node = {}
		    node.___value = nil
		    node.___name = name
		    node.___children = {}
		    node.___props = {}
		    function node:value() return self.___value end
		    function node:setValue(val) self.___value = val end
		    function node:name() return self.___name end
		    function node:setName(name) self.___name = name end
		    function node:children() return self.___children end
		    function node:numChildren() return #self.___children end
		    function node:addChild(child)
			if self[child:name()] ~= nil then
			    if type(self[child:name()].name) == "function" then
				local tempTable = {}
				table.insert(tempTable, self[child:name()])
				self[child:name()] = tempTable
			    end
			    table.insert(self[child:name()], child)
			else
			    self[child:name()] = child
			end
			table.insert(self.___children, child)
		    end
		    function node:properties() return self.___props end
		    function node:numProperties() return #self.___props end
		    function node:addProperty(name, value)
			local lName = "@" .. name
			if self[lName] ~= nil then
			    if type(self[lName]) == "string" then
				local tempTable = {}
				table.insert(tempTable, self[lName])
				self[lName] = tempTable
			    end
			    table.insert(self[lName], value)
			else
			    self[lName] = value
			end
			table.insert(self.___props, { name = name, value = self[name] })
		    end
		    return node
		end

		return parseXml;
	end


end

-- -------------------------------------------------------------------------------------------------------------
-- Démarrage du script
-- -------------------------------------------------------------------------------------------------------------
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblVigilance.value", "...")
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblCrue.value", "...")
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblRisque.value", "...")
    
if (not pcall(function() MeteoAlerte.getData() end)) then
  local max_retry = 5
  local i = 0
  while (not stop) do
      fibaro:debug("Problème d'accès au donn��es ... tentative dans 10mn")
      fibaro:sleep(10*60*1000)
      if (not pcall(function() MeteoAlerte.getData() end)) then
          i = i + 1
	      if (i >= max_retry) then stop = true end
      else 
          stop = true
      end
  end
end    
  
    

Partager ce message


Lien à poster
Partager sur d’autres sites

Ouais, le truc de zozotte ne fonctionne pas puisqu'il n'y a pas de vigilance et donc pas de commentaire. Faut rajouter un test :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Désolée, j'étais en vacances et effectivement, quand il n'y a pas le commentaire, ca bug...

J'attends qu'il y ait a nouveau un commentaire pour comparer les xml et modifier.

Partager ce message


Lien à poster
Partager sur d’autres sites

Zozotte tu peux poster juste les lignes que t'as changé ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Bouton vérifier:

 

-- --------------------------------------------------------------------------------------------------------------
-- MeteoAlerte est est script qui va vérifier les alertes méteo du site vigilance.meteofrance.com
-- Le site retournant des informations XML, le script va donc les parser.
-- Author = "Steven Piccand"
-- Version = "V1.40"


-- V1.10 - Isolation des éventuelles erreurs
-- V1.20 - Envoi possible sur plusieurs smartphones
-- V1.30 - Correction problème Main Loop
-- V1.40 - Correction status plus ajout personnalisation icone
-- V2.00 - Ajout du risque (nouveauté de Météofrance
-- --------------------------------------------------------------------------------------------------------------
if (not MeteoAlerte) then


MeteoAlerte = {}


-- !!! VOS PARAMETRES !!!
MeteoAlerte.dep = "31" -- votre département
MeteoAlerte.smartphone = {43} -- {70,71} vos portables ou envoyé la notification push en cas d'alerte
MeteoAlerte.niveauAlerte = 3 -- le niveau minimum d'alerte pour être notifié


MeteoAlerte.globalvariable = "" -- Nom de la variable globale a renseigné
MeteoAlerte.commentaire = false


-- --------------------------------------------------------------------------------------------------------------
-- Obtient le XML et le retourne sous forme de table LUA
-- --------------------------------------------------------------------------------------------------------------
MeteoAlerte.getXml = function() 
local MeteoAlerteURL = Net.FHttp("vigilance.meteofrance.com");
response, status, errorCode = MeteoAlerteURL:GET("/data/NXFR34_LFPW_.xml");
return MeteoAlerte.iif(response ~= nil, MeteoAlerte.newParser().ParseXmlText(response), "")
end


-- --------------------------------------------------------------------------------------------------------------
-- Va chercher les valeurs du départements
-- Modifie les valeurs des labels
-- Envoi un push si nécessaire
-- Met a jour une variable globale
-- --------------------------------------------------------------------------------------------------------------
MeteoAlerte.getData = function()
local messages = {"<inconnu>", "Aucune", "Attention", "Danger", "!! EXCEPTIONNEL !!"}
     local risques = {"<aucun>", "Vent violent", "Pluie-innondation", "Orages", "Innondation", "Neige-Verglas", "Canicule", "Grand-froid", "Avalanche", "Vagues-submersion"}
local icones = {-1, -1, -1, -1, -1}
local result = 0
local risque = 0
       local crue = 0
local commentaire = ""
local xmlTable = MeteoAlerte.getXml()
if (xmlTable) then 
local evs = xmlTable.cartevigilance
for i in pairs(evs:children()) do
if (evs:children()[i]:name() == "datavigilance") then
if (evs:children()[i]["@dep"] == MeteoAlerte.dep) then
result = tonumber(evs:children()[i]["@couleur"])
fibaro:debug("Vigilance trouvée : " .. result)
if (#evs:children()[i]:children() > 0) then
                 for j = 1, #evs:children()[i]:children() do
                   if (evs:children()[i]:children()[j]:name() == "crue") then
crue = tonumber(evs:children()[i]:children()[j]["@valeur"])
fibaro:debug("Crue trouvée : ".. crue)
                     elseif (evs:children()[i]:children()[j]:name() == "risque") then
risque = tonumber(evs:children()[i]:children()[j]["@valeur"])
fibaro:debug("Risque trouvée : ".. risque)
                    end
                   end
end
end
elseif (evs:children()[i]:name() == "entetevigilance") then
for j in pairs(evs:children()[i]:children()) do
if (evs:children()[i]:children()[j]:name() == "vigilancecommentaire") then
commentaire = evs:children()[i]:children()[j]["@texte"]
MeteoAlerte.commentaire = true
else 
end
end
end
end
end


fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblVigilance.value", messages[result+1])
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblCrue.value", messages[crue+1])
       fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblRisque.value", risques[risque+1])
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblCommentaire.value", commentaire)
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblRefresh.value", os.date("%d/%m %H:%M"))


local icone_id = icones[math.max(result+1, crue+1)]
if (icone_id > -1) then
fibaro:debug("Icone " .. icone_id)
fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", icone_id);
end


fibaro:log("Dernière mise à  jour : " .. os.date("%c"))
    
     fibaro:debug("Vérification envoi par push")
if (result >= MeteoAlerte.niveauAlerte or crue >= MeteoAlerte.niveauAlerte) then
fibaro:debug("Envoi nécessaire")
       if (type(MeteoAlerte.smartphone) == "table") then
              for i = 1, #MeteoAlerte.smartphone do
                    fibaro:call(MeteoAlerte.smartphone[i], "sendPush", "MeteoAlerte [".. MeteoAlerte.dep .." = " .. messages[result+1] .. "] | [crue = " .. messages[crue+1] .. "] | [risque = " .. risques[risque+1].."]")
              end     
          end
end


if (result and MeteoAlerte.globalvariable and MeteoAlerte.globalvariable ~= "") then
fibaro:setGlobal(MeteoAlerte.globalvariable, tostring(result))
end


return true
end


-- -------------------------------------------------------------------------------------------------------------
-- Teste la condition  et retourne la valeur true ou false
-- -------------------------------------------------------------------------------------------------------------
MeteoAlerte.iif = function(condition, iftrue, iffalse)
if (condition) then
return iftrue
end
return iffalse
end




-- -------------------------------------------------------------------------------------------------------------
-- Ceci est une version modifiée de Corona-XML-Module par Jonathan Beebe qui a son tour 
-- est basée sur Alexander Makeev's Lua-only XML parser .
-- see https://github.com/Cluain/Lua-Simple-XML-Parser
-- -------------------------------------------------------------------------------------------------------------
MeteoAlerte.newParser = function()


parseXml = {}


parseXml.FromXmlString = function(value)
value = string.gsub(value, "([%x]+)%;",
   function(h)
return string.char(tonumber(h, 16))
   end);
value = string.gsub(value, "([0-9]+)%;",
   function(h)
return string.char(tonumber(h, 10))
   end);
value = string.gsub(value, "'", "'");
value = string.gsub(value, ">", ">");
value = string.gsub(value, "<", "<");
value = string.gsub(value, "&", "&");
return value;
end


parseXml.ParseArgs = function(node, s)
string.gsub(s, "(%w+)=([\"'])(.-)%2", function(w, _, a)
   node:addProperty(w,  parseXml.FromXmlString(a))
end)
end


parseXml.ParseXmlText = function(xmlText)
local stack = {}
local top = parseXml.newNode()
table.insert(stack, top)
local ni, c, label, xarg, empty
local i, j = 1, 1
while true do
   ni, j, c, label, xarg, empty = string.find(xmlText, "<(%/?)([%w_:]+)(.-)(%/?)>", i)
   if not ni then break end
   local text = string.sub(xmlText, i, ni - 1);
   if not string.find(text, "^%s*$") then
local lVal = (top:value() or "") .. parseXml.FromXmlString(text)
stack[#stack]:setValue(lVal)
   end
   if empty == "/" then -- empty element tag
local lNode = parseXml.newNode(label)
parseXml.ParseArgs(lNode, xarg)
top:addChild(lNode)
   elseif c == "" then -- start tag
local lNode = parseXml.newNode(label)
parseXml.ParseArgs(lNode, xarg)
table.insert(stack, lNode)
top = lNode
   else -- end tag
local toclose = table.remove(stack) -- remove top


top = stack[#stack]
if #stack < 1 then
   error("XmlParser: nothing to close with " .. label)
end
if toclose:name() ~= label then
   error("XmlParser: trying to close " .. toclose.name .. " with " .. label)
end
top:addChild(toclose)
   end
   i = j + 1
end
local text = string.sub(xmlText, i);
if #stack > 1 then
   error("XmlParser: unclosed " .. stack[#stack]:name())
end
return top
end


parseXml.newNode = function(name)
   local node = {}
   node.___value = nil
   node.___name = name
   node.___children = {}
   node.___props = {}
   function node:value() return self.___value end
   function node:setValue(val) self.___value = val end
   function node:name() return self.___name end
   function node:setName(name) self.___name = name end
   function node:children() return self.___children end
   function node:numChildren() return #self.___children end
   function node:addChild(child)
if self[child:name()] ~= nil then
   if type(self[child:name()].name) == "function" then
local tempTable = {}
table.insert(tempTable, self[child:name()])
self[child:name()] = tempTable
   end
   table.insert(self[child:name()], child)
else
   self[child:name()] = child
end
table.insert(self.___children, child)
   end
   function node:properties() return self.___props end
   function node:numProperties() return #self.___props end
   function node:addProperty(name, value)
local lName = "@" .. name
if self[lName] ~= nil then
   if type(self[lName]) == "string" then
local tempTable = {}
table.insert(tempTable, self[lName])
self[lName] = tempTable
   end
   table.insert(self[lName], value)
else
   self[lName] = value
end
table.insert(self.___props, { name = name, value = self[name] })
   end
   return node
end


return parseXml;
end




end


-- -------------------------------------------------------------------------------------------------------------
-- Démarrage du script
-- -------------------------------------------------------------------------------------------------------------
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblVigilance.value", "...")
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblCrue.value", "...")
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblRisque.value", "...")
    
if (not pcall(function() MeteoAlerte.getData() end)) then
  local max_retry = 5
  local i = 0
  while (not stop) do
      fibaro:debug("Problème d'accès au données ... tentative dans 10mn")
      fibaro:sleep(10*60*1000)
      if (not pcall(function() MeteoAlerte.getData() end)) then
          i = i + 1
     if (i >= max_retry) then stop = true end
      else 
          stop = true
      end
  end
end

Partager ce message


Lien à poster
Partager sur d’autres sites

salut à  tous petite question bête comment vous faites pour trouver id du téléphone 

Partager ce message


Lien à poster
Partager sur d’autres sites

×