Page 1 sur 8

[LUA] Vigilance MétéoFrance

Publié : 19 juin 2016, 21:45
par papoo
Ce script a pour but de remonter toutes les informations de vigilance de météoFrance 3 fois par jour à 07H10 13H10 et 18H10
Les informations disponibles sont :
- couleur vigilance météo (Rouge, Orange, Jaune, Vert)
- risque associé : vent violent, pluie-inondation, orages, inondations, neige-verglas, canicule, grand-froid, avalanche, vagues-submersion
Une vigilance peut ne pas être associée à un risque. dans ce cas, affichage de la mention "risque non défini".
- Conseils météo
- commentaires météo
- couleur vigilance crue avec 4 niveaux d'alerte
Niveau 4 Rouge : Risque de crue majeure. Menace directe et généralisée de la sécurité des personnes et des biens.
Niveau 3 Orange : Risque de crue génératrice de débordements importants susceptibles d'avoir un impact significatif sur la vie collective et la sécurité des biens et des personnes.
Niveau 2 Jaune : Risque de crue génératrice de débordements et de dommages localisés ou de montée rapide et dangereuse des eaux, nécessitant une vigilance particulière notamment dans le cas d'activités exposées et/ou saisonnières.
Niveau 1 Vert : Pas de vigilance particulière requise.

Ce script utilise Lua-Simple-XML-Parser https://github.com/Cluain/Lua-Simple-XML-Parser

Code : Tout sélectionner

--[[
name : script_time_vigilance_meteofrance.lua
auteur : papoo
date de création : 11/08/2016
Date de mise à jour : 12/11/2017
Principe : Ce script a pour but de remonter les informations de vigilance de météoFrance 3 fois par jour à 07H10 13H10 et 18H10 
Les informations disponibles sont :
- couleur vigilance météo (Rouge, Orange, Jaune, Vert)
- risque associé : vent violent, pluie-inondation, orages, inondations, neige-verglas, canicule, grand-froid, avalanche, vagues-submersion
Une vigilance peut ne pas être associée à un risque. dans ce cas, affichage de la mention "risque non défini".
- Conseils météo 
- commentaires météo
- couleur vigilance crue avec 4 niveaux d'alerte
Niveau 4 Rouge : Risque de crue majeure. Menace directe et généralisée de la sécurité des personnes et des biens.
Niveau 3 Orange : Risque de crue génératrice de débordements importants susceptibles d'avoir un impact significatif sur la vie collective et la sécurité des biens et des personnes.
Niveau 2 Jaune : Risque de crue génératrice de débordements et de dommages localisés ou de montée rapide et dangereuse des eaux, nécessitant une vigilance particulière notamment dans le cas d'activités exposées et/ou saisonnières.
Niveau 1 Vert : Pas de vigilance particulière requise.
URL post : http://easydomoticz.com/forum/viewtopic.php?f=17&t=2160
Ce script utilise Lua-Simple-XML-Parser https://github.com/Cluain/Lua-Simple-XML-Parser
]]--
--------------------------------------------
------------ Variables à éditer ------------
-------------------------------------------- 

local debugging = false  			-- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local nom_script = "vigilance meteofrance"
local version = "1.32"
local departement = 87				-- renseigner votre numéro de département sur 2 chiffres exemples : 01 ou 07 ou 87 
local dz_vigilance_alert = 392		-- renseigner l'idx du device alert vigilance meteo associé (dummy - alert)
local dz_alert_crue = 708			-- renseigner l'idx du device alert vigilance crue associé (dummy - alert)
local dz_conseil_meteo = nil -- 706		-- renseigner l'idx du device texte Conseils Météo associé si souhaité, sinon nil 
local dz_commentaire_meteo = nil --707	-- renseigner l'idx du device texte Commentaire Météo associé si souhaité, sinon nil
local send_notification = 3 		-- 0: aucune notification, 1: toutes (meme verte), 2: vigilances jaune, orange et rouge, 3: vigilances orange et rouge 4: seulement vigilance rouge
local send_notification_crue = 3 	-- 0: aucune notification, 1: toutes (meme verte), 2: vigilances jaune, orange et rouge, 3: vigilances orange et rouge 4: seulement vigilance rouge
local display_conseils = false  	-- true pour voir les conseils sans condition, false seulement en cas de vigilance dans le département sélectionné
local display_commentaire = false 	-- true pour voir les commentaires sans condition, false seulement en cas de vigilance dans le département sélectionné

--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------

	
--------------------------------------------
---------------- Fonctions -----------------
-------------------------------------------- 
function voir_les_logs (s, debugging)
    if (debugging) then 
		if s ~= nil then
        print ("<font color='#f3031d'>".. s .."</font>")
		else
		print ("<font color='#f3031d'>aucune valeur affichable</font>")
		end
    end
end	

function risqueTxt(nombre)
      if nombre == 1 then return "vent violent" 
      elseif nombre == 2 then return "pluie-inondation" 
      elseif nombre == 3 then return "orages" 
      elseif nombre == 4 then return "inondations" 
      elseif nombre == 5 then return "neige-verglas" 
      elseif nombre == 6 then return "canicule" 
      elseif nombre == 7 then return "grand-froid" 
      elseif nombre == 8 then return "avalanche"
      elseif nombre == 9 then return "vagues-submersion"	  
	 -- else return "risque non defini" end
	else return "Vigilance Meteo" end
end

---------------------------------------------------------------------------------
-- Lua-Simple-XML-Parser
---------------------------------------------------------------------------------
    XmlParser = {};
	self = {};

    function XmlParser:ToXmlString(value)
        value = string.gsub(value, "&", "&"); -- '&' -> "&"
        value = string.gsub(value, "<", "<"); -- '<' -> "<"
        value = string.gsub(value, ">", ">"); -- '>' -> ">"
        value = string.gsub(value, "\"", """); -- '"' -> """
        value = string.gsub(value, "([^%w%&%;%p%\t% ])",
            function(c)
                return string.format("&#x%X;", string.byte(c))
            end);
        return value;
    end

    function XmlParser:FromXmlString(value)
        value = string.gsub(value, "&#x([%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, "&apos;", "'");
        value = string.gsub(value, ">", ">");
        value = string.gsub(value, "<", "<");
        value = string.gsub(value, "&", "&");
        return value;
    end

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

    function XmlParser:ParseXmlText(xmlText)
        local stack = {}
        local top = 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 "") .. self:FromXmlString(text)
                stack[#stack]:setValue(lVal)
            end
            if empty == "/" then -- empty element tag
                local lNode = newNode(label)
                self:ParseArgs(lNode, xarg)
                top:addChild(lNode)
            elseif c == "" then -- start tag
                local lNode = newNode(label)
                self: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

    function XmlParser:loadFile(xmlFilename, base)
        if not base then
            base = system.ResourceDirectory
        end

        local path = system.pathForFile(xmlFilename, base)
        local hFile, err = io.open(path, "r");

        if hFile and not err then
            local xmlText = hFile:read("*a"); -- read file content
            io.close(hFile);
            return self:ParseXmlText(xmlText), nil;
        else
            print(err)
            return nil
        end
    end

function newNode(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
--------------------------------------------
function TronquerTexte(texte, nb)  --texte à tronquer, nb limite de caractère à afficher
local sep ="[!?.]"
local DernierIndex = nil
texte = string.sub(texte, 1, nb)
local p = string.find(texte, sep, 1)
DernierIndex = p
while p do
    p = string.find(texte, sep, p + 1)
    if p then
        DernierIndex = p
    end
end
return(string.sub(texte, 1, DernierIndex))
end
--------------------------------------------
-------------- Fin Fonctions ---------------
--------------------------------------------
commandArray = {}
time=os.date("*t")
if (time.min == 10 and ((time.hour == 7) or (time.hour == 13) or (time.hour == 18))) then -- 3 éxecutions du script par jour à 7H10, 13h10 et 18H10
--if time.min % 56 == 0 then -- éxécution du script toutes les X minutes
voir_les_logs("=========== ".. nom_script .." (v".. version ..") ===========",debugging)

-- deux methodes pour récupérer les informations xml,  WGET ou CURL si vous décommentez la methode curl pensez à commenter la methode wget
		-- début methode wget
		local fname ="vigilance.xml"
		os.execute("wget -q -O " .. fname .. " http://vigilance.meteofrance.com/data/NXFR34_LFPW_.xml") 
		-- fin methode wget
		
		-- début methode curl
		 --local fname ="/tmp/vigilance.xml"
		 --os.execute("curl http://vigilance.meteofrance.com/data/NXFR34_LFPW_.xml > ".. fname .." && chmod 777 " .. fname)
		-- fin methode curl
		
		
		 voir_les_logs("Fichier local : " ..fname,debugging)
		local f = io.open(fname, "r")

			 if f == nil then
			 print("Error opening file '" .. fname .. "'.")
			 os.exit(1)
			 end
 
		local testXml = f:read("*all")
					f:close()

local parsedXml = XmlParser:ParseXmlText(testXml)
	if (parsedXml) then local abr = parsedXml.cartevigilance 	

		for i in pairs(abr:children()) do 
			if (abr:children()[i]:name() == "datavigilance") then 


				if (tonumber(abr:children()[i]["@dep"]) == departement) then 
				CouleurVigilance = tonumber(abr:children()[i]["@couleur"])
				voir_les_logs("--- --- --- Couleur Vigilance : ".. CouleurVigilance .. " pour le departement : ".. departement,debugging) 
					 if (#abr:children()[i]:children() > 0) then 
						 for j = 1, #abr:children()[i]:children() do 
							 if (abr:children()[i]:children()[j]:name() == "crue") then 
							 crue = tonumber(abr:children()[i]:children()[j]["@valeur"]) 
								 if crue ~= nil then
								 voir_les_logs("--- --- --- Crue trouv&eacute;e : ".. crue,debugging) 
								 else
								 voir_les_logs("--- --- --- pas d'information Crue trouv&eacute;e",debugging)
								 end
							 elseif (abr:children()[i]:children()[j]:name() == "risque") then 
							 risque = tonumber(abr:children()[i]:children()[j]["@valeur"]) 
							 voir_les_logs("--- --- --- Risque trouv&eacute;e : ".. risque,debugging) 
							 end 
						 end 
					 end
				end
			 elseif (abr:children()[i]:name() == "entetevigilance") then 
					 for j in pairs(abr:children()[i]:children()) do 
						 if (abr:children()[i]:children()[j]:name() == "vigilancecommentaire") then 
						 commentaire = abr:children()[i]:children()[j]["@texte"] 
							if commentaire ~= nil then
						voir_les_logs("--- --- --- Commentaire : " ..commentaire,debugging)
							else
						voir_les_logs("--- --- --- pas de Commentaire",debugging)	
							end
						 end
						 if (abr:children()[i]:children()[j]:name() == "vigilanceconseil") then 
						 conseil = abr:children()[i]:children()[j]["@texte"] 
							if conseil ~= nil then
						voir_les_logs("--- --- --- Conseils : ".. conseil,debugging)
							end
						 end 
					 end 
			end
		end	
	else
	print("erreur parsedXml")
	end	

risque = risqueTxt(risque)
	 
	if CouleurVigilance == nil and dz_vigilance_alert ~= nil then
			 commandArray[#commandArray+1] = {['UpdateDevice'] = dz_vigilance_alert ..'|0|'.. risque}
			voir_les_logs("--- --- --- Aucune donn&eacute;e disponible pour la departement : ".. departement,debugging) 
			 
	end	


	if CouleurVigilance	~= nil then	
		voir_les_logs("--- --- --- CouleurVigilance : ".. CouleurVigilance,debugging)
		if tonumber(CouleurVigilance) == 1   then -- niveau 1
			if dz_vigilance_alert ~= nil then
				 commandArray[#commandArray+1] = {['UpdateDevice'] = dz_vigilance_alert..'|1|'.. risque}
				 
			end
			if send_notification > 0 and send_notification < 2 then
				 commandArray[#commandArray+1] = {['SendNotification'] = 'Alerte vigilance meteo#'.. risque}
				 
			end
			  voir_les_logs("--- --- --- Pas de vigilance --- --- ---",debugging)
		elseif tonumber(CouleurVigilance) == 2   then -- niveau 2
			if dz_vigilance_alert ~= nil then
				 commandArray[#commandArray+1] = {['UpdateDevice'] = dz_vigilance_alert..'|2|'.. risque}
				 
			end
			if send_notification > 0 and send_notification < 3 then
				 commandArray[#commandArray+1] = {['SendNotification'] = 'Alerte vigilance meteo#'.. risque}
				 
			end
			  voir_les_logs("--- --- --- vigilance faible ".. risque.. " --- --- ---",debugging)   
		elseif tonumber(CouleurVigilance) == 3   then -- niveau 3
			if dz_vigilance_alert ~= nil then
				 commandArray[#commandArray+1] = {['UpdateDevice'] = dz_vigilance_alert..'|3|'.. risque}
				 
			end
			if send_notification > 0 and send_notification < 4 then
				 commandArray[#commandArray+1] = {['SendNotification'] = 'Alerte vigilance meteo#'.. risque}
				 
			end
			  voir_les_logs("--- --- --- vigilance Forte ".. risque.. " --- --- ---",debugging)      
		elseif tonumber(CouleurVigilance) > 3  then -- niveau 4
			if dz_vigilance_alert ~= nil then
				 commandArray[#commandArray+1] = {['UpdateDevice'] = dz_vigilance_alert..'|4|'.. risque}
				 
			end
			if send_notification > 0 and send_notification < 5 then
				 commandArray[#commandArray+1] = {['SendNotification'] = 'Alerte vigilance meteo#'.. risque}
				 
			end
			  voir_les_logs("--- --- --- vigilance très forte ".. risque.. " --- --- ---",debugging)
		else
		  print("niveau non defini")
		end
	end
	   
-- ====================================================================================================================	
-- Conseil météo	  
-- ====================================================================================================================			
			if ( dz_conseil_meteo ~= nil and conseil ~= nil and CouleurVigilance > 1 ) or ( dz_conseil_meteo ~= nil and conseil ~= nil and display_conseils == true ) then -- Mise à jour du devise texte conseil météo si il existe
			 commandArray[#commandArray+1] = {['UpdateDevice'] = dz_conseil_meteo..'|0|'.. TronquerTexte(conseil,240)}
			 
			elseif (dz_conseil_meteo ~= nil and conseil == nil) or ( dz_conseil_meteo ~= nil and conseil ~= nil and display_conseils == false ) then -- Mise à jour du devise texte conseil météo si il existe même s'il n'y a pas de conseil disponible
			 commandArray[#commandArray+1] = {['UpdateDevice'] = dz_conseil_meteo..'|0|Aucun conseil disponible'}
			 	  
			end
-- ====================================================================================================================	
-- Commentaire météo	  
-- ====================================================================================================================		  
	  
			if ( dz_commentaire_meteo ~= nil and commentaire ~= nil and CouleurVigilance > 1 ) or ( dz_commentaire_meteo ~= nil and commentaire ~= nil and display_commentaire == true ) then -- Mise à jour du devise texte commentaire météo si il existe
			 commandArray[#commandArray+1] = {['UpdateDevice'] = dz_commentaire_meteo..'|0|'.. commentaire}
			 
			 
			elseif (dz_commentaire_meteo ~= nil and commentaire == nil ) or ( dz_commentaire_meteo ~= nil and commentaire ~= nil and display_commentaire == false ) then -- Mise à jour du devise texte commentaire météo si il existe même s'il n'y a pas de commentaire disponible
			 commandArray[#commandArray+1] = {['UpdateDevice'] = dz_commentaire_meteo..'|0|Aucun commentaire disponible'}
			 
			end
 
-- ====================================================================================================================	
-- vigilance crue	  
-- ====================================================================================================================
	if dz_alert_crue ~= nil and crue ~= nil then	
		voir_les_logs("--- --- --- Vigilance Crue : ".. crue,debugging)


		if tonumber(crue) == 1   then -- niveau 1
			  if dz_alert_crue ~= nil then
				 commandArray[#commandArray+1] = {['UpdateDevice'] = dz_alert_crue..'|1|Pas de vigilance Crue'}
				 
			  end
			  if send_notification_crue > 0 and send_notification_crue < 2 then
				 commandArray[#commandArray+1] = {['SendNotification'] = 'Alerte vigilance crue#Pas de vigilance Crue'}
				 
			  end
			  voir_les_logs("--- --- --- Pas de vigilance crue --- --- ---",debugging)
		elseif tonumber(crue) == 2   then -- niveau 2
			  if dz_alert_crue ~= nil then
				 commandArray[#commandArray+1] = {['UpdateDevice'] = dz_alert_crue..'|2|Risque de crue g&eacute;n&eacute;ratrice de d&eacute;bordements localis&eacute;s'}
				 
			  end
			  if send_notification_crue > 0 and send_notification_crue < 3 then
				 commandArray[#commandArray+1] = {['SendNotification'] = 'Alerte vigilance crue#Risque de crue génératrice de débordements localisés'}
				 
			  end
			  voir_les_logs("--- --- --- vigilance faible Crue --- --- ---",debugging)   
		elseif tonumber(crue) == 3   then -- niveau 3
			  if dz_alert_crue ~= nil then
				 commandArray[#commandArray+1] = {['UpdateDevice'] = dz_alert_crue..'|3|Risque de crue g&eacute;n&eacute;ratrice de d&eacute;bordements importants'}
				 
			  end
			  if send_notification_crue > 0 and send_notification_crue < 4 then
				 commandArray[#commandArray+1] = {['SendNotification'] = 'Alerte vigilance crue#Risque de crue génératrice de débordements importants'}
				 
			  end
			  voir_les_logs("--- --- --- vigilance Forte Crue --- --- ---",debugging)      
		elseif tonumber(crue) > 3  then -- niveau 4
			  if dz_alert_crue ~= nil then
				 commandArray[#commandArray+1] = {['UpdateDevice'] = dz_alert_crue..'|4|Risque de Crue majeure'}
				 
			  end
			  if send_notification_crue > 0 and send_notification_crue < 5 then
				 commandArray[#commandArray+1] = {['SendNotification'] = 'Alerte vigilance crue#Risque de crue majeure'}
				 
			  end
			  voir_les_logs("--- --- --- vigilance très forte Crue --- --- ---",debugging)
		else
		  print("niveau non defini")
		end		  
		if dz_alert_crue ~= nil and crue == nil then
		commandArray[#commandArray+1] = {['UpdateDevice'] = dz_alert_crue..'|0|Pas d\'information vigilance Crue'}
		
		end
 	end			
-- ====================================================================================================================	
-- fin vigilance crue	  
-- ====================================================================================================================	
voir_les_logs("========= Fin ".. nom_script .." (v".. version ..") =========",debugging)
end -- if time
return commandArray

Re: LUA: vigilance météoFrance

Publié : 20 juin 2016, 13:01
par Chris54220
Merci beaucoup pour ce script assez complet je trouve

Re: LUA: vigilance météoFrance

Publié : 22 juin 2016, 13:15
par deennoo
Merci Papoo !

il met des pavé en commentaire et recommandation 8-)
Capture.PNG
Capture.PNG (340.29 Kio) Consulté 15860 fois

Re: LUA: vigilance météoFrance

Publié : 22 juin 2016, 14:15
par papoo
Effectivement :)

Re: LUA: vigilance météoFrance

Publié : 22 juin 2016, 18:24
par Chris54220
Papoo

et t'il possible que les conseil et commentaire sois mise a jour que si la vigilance de notre département sois pas en vert

Re: LUA: vigilance météoFrance

Publié : 22 juin 2016, 18:27
par papoo
Chris54220 a écrit :Papoo

et t'il possible que les conseil et commentaire sois mise a jour que si la vigilance de notre département sois pas en vert
Les conseils et commentaires sont communs à l'ensemble des département mais il doit être possible d'ajouter une condition
Je regarde ce week-end

Re: LUA: vigilance météoFrance

Publié : 22 juin 2016, 18:30
par Chris54220
oki merci d'avance

Re: LUA: vigilance météoFrance

Publié : 24 juin 2016, 18:15
par papoo
La version modifiée pour n'afficher les conseils et/ou commentaires que lorsque la vigilance du département sélectionné est supérieure à 1
options d'affichage des conseils et commentaires lignes 32 et 33

Code : Tout sélectionner

--[[
name : script_time_vigilance_meteofrance.lua
auteur : papoo
version : 1.30
date de création : 11/06/2016
Date de mise à jour : 25/06/16
Principe : Ce script a pour but de remonter les informations de vigilance de météoFrance 3 fois par jour à 07H10 13H10 et 18H10 
Les informations disponibles sont :
- couleur vigilance météo (Rouge, Orange, Jaune, Vert)
- risque associé : vent violent, pluie-inondation, orages, inondations, neige-verglas, canicule, grand-froid, avalanche, vagues-submersion
Une vigilance peut ne pas être associée à un risque. dans ce cas, affichage de la mention "risque non défini".
- Conseils météo 
- commentaires météo
- couleur vigilance crue avec 4 niveaux d'alerte
Niveau 4 Rouge : Risque de crue majeure. Menace directe et généralisée de la sécurité des personnes et des biens.
Niveau 3 Orange : Risque de crue génératrice de débordements importants susceptibles d'avoir un impact significatif sur la vie collective et la sécurité des biens et des personnes.
Niveau 2 Jaune : Risque de crue génératrice de débordements et de dommages localisés ou de montée rapide et dangereuse des eaux, nécessitant une vigilance particulière notamment dans le cas d'activités exposées et/ou saisonnières.
Niveau 1 Vert : Pas de vigilance particulière requise.

Ce script utilise Lua-Simple-XML-Parser https://github.com/Cluain/Lua-Simple-XML-Parser
]]--
-- ========================================================================
-- Variables à éditer
-- ========================================================================
local departement = 87				-- renseigner votre numéro de département sur 2 chiffres exemples : 01 ou 07 ou 87 
local dz_vigilance_alert = 392		-- renseigner l'id du device alert vigilance meteo associé (dummy - alert)
local dz_alert_crue = 708			-- renseigner l'id du device alert vigilance crue associé (dummy - alert)
local dz_conseil_meteo = 706		-- renseigner l'id du device texte Conseils Météo associé si souhaité, sinon nil 
local dz_commentaire_meteo = 707	-- renseigner l'id du device texte Commentaire Météo associé si souhaité, sinon nil
local send_notification = 3 		-- 0: aucune notification, 1: toutes (meme verte), 2: vigilances jaune, orange et rouge, 3: vigilances orange et rouge 4: seulement vigilance rouge
local send_notification_crue = 3 	-- 0: aucune notification, 1: toutes (meme verte), 2: vigilances jaune, orange et rouge, 3: vigilances orange et rouge 4: seulement vigilance rouge
local debugging = false  			-- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local display_conseils = false  	-- true pour voir les conseils sans condition, false seulement en cas de vigilance dans le département sélectionné
local display_commentaire = false 	-- true pour voir les commentaires sans condition, false seulement en cas de vigilance dans le département sélectionné

-- ========================================================================
-- Fin Variables à éditer
-- ========================================================================

local indexArray=0	
--------------------------------------------------------------------------- 
--Fonctions
---------------------------------------------------------------------------
function voir_les_logs (s)
    if (debugging) then 
        print ("<font color='#f3031d'>".. s .."</font>");
    end
end	

function risqueTxt(nombre)
      if nombre == 1 then return "vent violent" 
      elseif nombre == 2 then return "pluie-inondation" 
      elseif nombre == 3 then return "orages" 
      elseif nombre == 4 then return "inondations" 
      elseif nombre == 5 then return "neige-verglas" 
      elseif nombre == 6 then return "canicule" 
      elseif nombre == 7 then return "grand-froid" 
      elseif nombre == 8 then return "avalanche"
      elseif nombre == 9 then return "vagues-submersion"	  
	  else return "risque non defini" end

end

---------------------------------------------------------------------------------
-- Lua-Simple-XML-Parser
---------------------------------------------------------------------------------
    XmlParser = {};
	self = {};

    function XmlParser:ToXmlString(value)
        value = string.gsub(value, "&", "&"); -- '&' -> "&"
        value = string.gsub(value, "<", "<"); -- '<' -> "<"
        value = string.gsub(value, ">", ">"); -- '>' -> ">"
        value = string.gsub(value, "\"", """); -- '"' -> """
        value = string.gsub(value, "([^%w%&%;%p%\t% ])",
            function(c)
                return string.format("&#x%X;", string.byte(c))
            end);
        return value;
    end

    function XmlParser:FromXmlString(value)
        value = string.gsub(value, "&#x([%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, "&apos;", "'");
        value = string.gsub(value, ">", ">");
        value = string.gsub(value, "<", "<");
        value = string.gsub(value, "&", "&");
        return value;
    end

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

    function XmlParser:ParseXmlText(xmlText)
        local stack = {}
        local top = 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 "") .. self:FromXmlString(text)
                stack[#stack]:setValue(lVal)
            end
            if empty == "/" then -- empty element tag
                local lNode = newNode(label)
                self:ParseArgs(lNode, xarg)
                top:addChild(lNode)
            elseif c == "" then -- start tag
                local lNode = newNode(label)
                self: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

    function XmlParser:loadFile(xmlFilename, base)
        if not base then
            base = system.ResourceDirectory
        end

        local path = system.pathForFile(xmlFilename, base)
        local hFile, err = io.open(path, "r");

        if hFile and not err then
            local xmlText = hFile:read("*a"); -- read file content
            io.close(hFile);
            return self:ParseXmlText(xmlText), nil;
        else
            print(err)
            return nil
        end
    end

function newNode(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

--------------------------------------------------------------------------- 
-- Fin Fonctions
---------------------------------------------------------------------------
commandArray = {}
now=os.date("*t")
if (now.min == 10 and ((now.hour == 7) or (now.hour == 13) or (now.hour == 18))) then -- 3 éxecutions du script par jour à 7H10, 13h10 et 18H10
--if now.min % 56 == 0 then -- éxécution du script toutes les X minutes
print("script_time_vigilance_meteofrance.lua")

-- deux methodes pour récupérer les informations xml,  WGET ou CURL si vous décommentez la methode curl pensez à commenter la methode wget
		-- début methode wget
		local fname ="vigilance.xml"
		os.execute("wget -q -O " .. fname .. " http://vigilance.meteofrance.com/data/NXFR34_LFPW_.xml") 
		-- fin methode wget
		
		-- début methode curl
		 --local fname ="/tmp/vigilance.xml"
		 --os.execute("curl http://vigilance.meteofrance.com/data/NXFR34_LFPW_.xml > ".. fname .." && chmod 777 " .. fname)
		-- fin methode curl
		
		
		 voir_les_logs("Fichier local : " ..fname,debugging)
		local f = io.open(fname, "r")

			 if f == nil then
			 print("Error opening file '" .. fname .. "'.")
			 os.exit(1)
			 end
 
		local testXml = f:read("*all")
					f:close()

local parsedXml = XmlParser:ParseXmlText(testXml)
	if (parsedXml) then local abr = parsedXml.cartevigilance 	

		for i in pairs(abr:children()) do 
			if (abr:children()[i]:name() == "datavigilance") then 


				if (tonumber(abr:children()[i]["@dep"]) == departement) then 
				CouleurVigilance = tonumber(abr:children()[i]["@couleur"])
				voir_les_logs("--- --- --- Couleur Vigilance : ".. CouleurVigilance .. " pour le departement : ".. departement,debugging) 
					 if (#abr:children()[i]:children() > 0) then 
						 for j = 1, #abr:children()[i]:children() do 
							 if (abr:children()[i]:children()[j]:name() == "crue") then 
							 crue = tonumber(abr:children()[i]:children()[j]["@valeur"]) 
								 if crue ~= nil then
								 voir_les_logs("--- --- --- Crue trouv&eacute;e : ".. crue,debugging) 
								 else
								 voir_les_logs("--- --- --- pas d'information Crue trouv&eacute;e",debugging)
								 end
							 elseif (abr:children()[i]:children()[j]:name() == "risque") then 
							 risque = tonumber(abr:children()[i]:children()[j]["@valeur"]) 
							 voir_les_logs("--- --- --- Risque trouv&eacute;e : ".. risque,debugging) 
							 end 
						 end 
					 end
				end
			 elseif (abr:children()[i]:name() == "entetevigilance") then 
					 for j in pairs(abr:children()[i]:children()) do 
						 if (abr:children()[i]:children()[j]:name() == "vigilancecommentaire") then 
						 commentaire = abr:children()[i]:children()[j]["@texte"] 
							if commentaire ~= nil then
						voir_les_logs("--- --- --- Commentaire : " ..commentaire,debugging)
							else
						voir_les_logs("--- --- --- pas de Commentaire",debugging)	
							end
						 end
						 if (abr:children()[i]:children()[j]:name() == "vigilanceconseil") then 
						 conseil = abr:children()[i]:children()[j]["@texte"] 
							if conseil ~= nil then
						voir_les_logs("--- --- --- Conseils : ".. conseil,debugging)
							end
						 end 
					 end 
			end
		end	
	else
	print("erreur parsedXml")
	end	

risque = risqueTxt(risque)
	 
	if CouleurVigilance == nil and dz_vigilance_alert ~= nil then
			 commandArray[indexArray] = {['UpdateDevice'] = dz_vigilance_alert ..'|0|'.. risque}
			voir_les_logs("--- --- --- Aucune donn&eacute;e disponible pour la departement : ".. departement,debugging) 
			 indexArray=indexArray+1
	end	


	if CouleurVigilance	~= nil then	
		voir_les_logs("--- --- --- CouleurVigilance : ".. CouleurVigilance,debugging)
		if tonumber(CouleurVigilance) == 1   then -- niveau 1
			if dz_vigilance_alert ~= nil then
				 commandArray[indexArray] = {['UpdateDevice'] = dz_vigilance_alert..'|1|'.. risque}
				 indexArray=indexArray+1
			end
			if send_notification > 0 and send_notification < 2 then
				 commandArray[indexArray] = {['SendNotification'] = 'Alerte vigilance meteo#'.. risque}
				 indexArray=indexArray+1
			end
			  voir_les_logs("--- --- --- Pas de vigilance --- --- ---",debugging)
		elseif tonumber(CouleurVigilance) == 2   then -- niveau 2
			if dz_vigilance_alert ~= nil then
				 commandArray[indexArray] = {['UpdateDevice'] = dz_vigilance_alert..'|2|'.. risque}
				 indexArray=indexArray+1
			end
			if send_notification > 0 and send_notification < 3 then
				 commandArray[indexArray] = {['SendNotification'] = 'Alerte vigilance meteo#'.. risque}
				 indexArray=indexArray+1
			end
			  voir_les_logs("--- --- --- vigilance faible ".. risque.. " --- --- ---",debugging)   
		elseif tonumber(CouleurVigilance) == 3   then -- niveau 3
			if dz_vigilance_alert ~= nil then
				 commandArray[indexArray] = {['UpdateDevice'] = dz_vigilance_alert..'|3|'.. risque}
				 indexArray=indexArray+1
			end
			if send_notification > 0 and send_notification < 4 then
				 commandArray[indexArray] = {['SendNotification'] = 'Alerte vigilance meteo#'.. risque}
				 indexArray=indexArray+1
			end
			  voir_les_logs("--- --- --- vigilance Forte ".. risque.. " --- --- ---",debugging)      
		elseif tonumber(CouleurVigilance) > 3  then -- niveau 4
			if dz_vigilance_alert ~= nil then
				 commandArray[indexArray] = {['UpdateDevice'] = dz_vigilance_alert..'|4|'.. risque}
				 indexArray=indexArray+1
			end
			if send_notification > 0 and send_notification < 5 then
				 commandArray[indexArray] = {['SendNotification'] = 'Alerte vigilance meteo#'.. risque}
				 indexArray=indexArray+1
			end
			  voir_les_logs("--- --- --- vigilance très forte ".. risque.. " --- --- ---",debugging)
		else
		  print("niveau non defini")
		end
	end
	   
-- ====================================================================================================================	
-- Conseil météo	  
-- ====================================================================================================================			
			if ( dz_conseil_meteo ~= nil and conseil ~= nil and CouleurVigilance > 1 ) or ( dz_conseil_meteo ~= nil and conseil ~= nil and display_conseils == true ) then -- Mise à jour du devise texte conseil météo si il existe
			 commandArray[indexArray] = {['UpdateDevice'] = dz_conseil_meteo..'|0|'.. conseil}
			 indexArray=indexArray+1
			elseif (dz_conseil_meteo ~= nil and conseil == nil) or ( dz_conseil_meteo ~= nil and conseil ~= nil and display_conseils == false ) then -- Mise à jour du devise texte conseil météo si il existe même s'il n'y a pas de conseil disponible
			 commandArray[indexArray] = {['UpdateDevice'] = dz_conseil_meteo..'|0|Aucun conseil disponible'}
			 indexArray=indexArray+1		  
			end
-- ====================================================================================================================	
-- Commentaire météo	  
-- ====================================================================================================================		  
	  
			if ( dz_commentaire_meteo ~= nil and commentaire ~= nil and CouleurVigilance > 1 ) or ( dz_commentaire_meteo ~= nil and commentaire ~= nil and display_commentaire == true ) then -- Mise à jour du devise texte commentaire météo si il existe
			 commandArray[indexArray] = {['UpdateDevice'] = dz_commentaire_meteo..'|0|'.. commentaire}
			 indexArray=indexArray+1
			 
			elseif (dz_commentaire_meteo ~= nil and commentaire == nil ) or ( dz_commentaire_meteo ~= nil and commentaire ~= nil and display_commentaire == false ) then -- Mise à jour du devise texte commentaire météo si il existe même s'il n'y a pas de commentaire disponible
			 commandArray[indexArray] = {['UpdateDevice'] = dz_commentaire_meteo..'|0|Aucun commentaire disponible'}
			 indexArray=indexArray+1
			end
 
-- ====================================================================================================================	
-- vigilance crue	  
-- ====================================================================================================================
	if dz_alert_crue ~= nil and crue ~= nil then	
		voir_les_logs("--- --- --- Vigilance Crue : ".. crue,debugging)


		if tonumber(crue) == 1   then -- niveau 1
			  if dz_alert_crue ~= nil then
				 commandArray[indexArray] = {['UpdateDevice'] = dz_alert_crue..'|1|Pas de vigilance Crue'}
				 indexArray=indexArray+1
			  end
			  if send_notification_crue > 0 and send_notification_crue < 2 then
				 commandArray[indexArray] = {['SendNotification'] = 'Alerte vigilance crue#Pas de vigilance Crue'}
				 indexArray=indexArray+1
			  end
			  voir_les_logs("--- --- --- Pas de vigilance crue --- --- ---",debugging)
		elseif tonumber(crue) == 2   then -- niveau 2
			  if dz_alert_crue ~= nil then
				 commandArray[indexArray] = {['UpdateDevice'] = dz_alert_crue..'|2|Risque de crue g&eacute;n&eacute;ratrice de d&eacute;bordements localis&eacute;s'}
				 indexArray=indexArray+1
			  end
			  if send_notification_crue > 0 and send_notification_crue < 3 then
				 commandArray[indexArray] = {['SendNotification'] = 'Alerte vigilance crue#Risque de crue génératrice de débordements localisés'}
				 indexArray=indexArray+1
			  end
			  voir_les_logs("--- --- --- vigilance faible Crue --- --- ---",debugging)   
		elseif tonumber(crue) == 3   then -- niveau 3
			  if dz_alert_crue ~= nil then
				 commandArray[indexArray] = {['UpdateDevice'] = dz_alert_crue..'|3|Risque de crue g&eacute;n&eacute;ratrice de d&eacute;bordements importants'}
				 indexArray=indexArray+1
			  end
			  if send_notification_crue > 0 and send_notification_crue < 4 then
				 commandArray[indexArray] = {['SendNotification'] = 'Alerte vigilance crue#Risque de crue génératrice de débordements importants'}
				 indexArray=indexArray+1
			  end
			  voir_les_logs("--- --- --- vigilance Forte Crue --- --- ---",debugging)      
		elseif tonumber(crue) > 3  then -- niveau 4
			  if dz_alert_crue ~= nil then
				 commandArray[indexArray] = {['UpdateDevice'] = dz_alert_crue..'|4|Risque de Crue majeure'}
				 indexArray=indexArray+1
			  end
			  if send_notification_crue > 0 and send_notification_crue < 5 then
				 commandArray[indexArray] = {['SendNotification'] = 'Alerte vigilance crue#Risque de crue majeure'}
				 indexArray=indexArray+1
			  end
			  voir_les_logs("--- --- --- vigilance très forte Crue --- --- ---",debugging)
		else
		  print("niveau non defini")
		end		  
		if dz_alert_crue ~= nil and crue == nil then
		commandArray[indexArray] = {['UpdateDevice'] = dz_alert_crue..'|0|Pas d\'information vigilance Crue'}
		indexArray=indexArray+1
		end
 	end			
-- ====================================================================================================================	
-- fin vigilance crue	  
-- ====================================================================================================================	
end -- if now
return commandArray

Re: LUA: vigilance météoFrance

Publié : 11 juil. 2016, 10:15
par jackslayter
salut, comment tu récupères le risque ? je vois bien le nombre pour la couleur dans le xml mais pas le risque.
merci

Re: LUA: vigilance météoFrance

Publié : 11 juil. 2016, 13:26
par papoo
Dans le fichier météofrance il n'y a un risque que lorsqu'il y a un état de vigilance associé. (jaune, orange ou rouge)

Code : Tout sélectionner

							 elseif (abr:children()[i]:children()[j]:name() == "risque") then 
							 risque = tonumber(abr:children()[i]:children()[j]["@valeur"]) 
							 voir_les_logs("--- --- --- Risque trouv&eacute;e : ".. risque,debugging) 
							 end