Page 4 sur 8

Re: LUA: vigilance météoFrance

Publié : 06 juin 2017, 21:35
par AWP
c'est ce que j'ai fait mais ça ne change pas !

Re: LUA: vigilance météoFrance

Publié : 06 juin 2017, 21:45
par papoo
As tu passé la variable debugging à true afin de voir son exécution dans les logs?
Le script télécharge à chaque exécution un fichier xml dans le répertoire tmp : /tmp/vigilance.xml
ouvre le ficher et vérifie l’adéquation entre les données remontées dans DZ et celle de ce fichier ainsi que la date de création du fichier
les états de vigilance sont limités dans le temps, vérifie sur le site de météofrance si tu est toujours en vigilance orange (et que les données du fichier correspondent aux données du site)

Re: LUA: vigilance météoFrance

Publié : 07 juin 2017, 08:45
par AWP
En fait, le type de risque n’apparaît pas car le XML n'affiche que les risques >=3 , c'est bien ça ?
Sinon super bien le script !

Re: LUA: vigilance météoFrance

Publié : 07 juin 2017, 13:04
par papoo
Cest bien cela
Merci

Re: LUA: vigilance météoFrance

Publié : 22 juin 2017, 16:53
par yanael
Bonjour petite question sur le script,

il fonctionne parfaitement, trop parfaitement même.
Je m'explique il se déclenche 3 fois par jour à X H et Y Mn, en cas d alerte il envoi des notifications , sauf que durant la minute de déclenchement il envoi 7-8 fois la même notification, je suppose donc que le script à le temps de s exécuter plusieurs fois.

n'étant pas du tout un pro du lua: y a t il une possibilité pour que le script n’envoie qu'une seule notification en cas d'alerte ?

Re: LUA: vigilance météoFrance

Publié : 22 juin 2017, 17:18
par vil1driver

Re: LUA: vigilance météoFrance

Publié : 22 juin 2017, 17:40
par yanael
Bah j étais pas sur le bon script lol,
Mais c est bien celui de papoo que j utilise.
Je le dis sur l autre post ;)

Je m a gourru de topic XD

Re: LUA: vigilance météoFrance

Publié : 22 juin 2017, 17:45
par vil1driver
Oui merci j'ai bien compris...

Mais peux tu essayer de tenir compte de ma réponse ?
Sinon pourquoi venir demander de l'aide ?
As tu vérifié que tu as choisi le bon type ? :twisted:
Car ton erreur est là !

Re: LUA: vigilance météoFrance

Publié : 22 juin 2017, 17:54
par yanael
Explique moi mieux alors comme dit je suis une buse en lua

Ou ce modifie le type dont tu parles

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.
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 departement = 11            -- renseigner votre numéro de département sur 2 chiffres exemples : 01 ou 07 ou 87
local dz_vigilance_alert = 560      -- renseigner l'id du device alert vigilance meteo associé (dummy - alert)
local dz_alert_crue = 561      -- renseigner l'id du device alert vigilance crue associé (dummy - alert)
local dz_conseil_meteo = 558      -- renseigner l'id du device texte Conseils Météo associé si souhaité, sinon nil
local dz_commentaire_meteo = 559   -- 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

j ai juste modifié ce qui est demandé en haut du script
mes idx :
560 virtuel 82560 1 Vigilance Alert General Alert risque non defini -
561 virtuel 82561 1 Alert Crue General Alert Pas de vigilance Crue - -

559 virtuel 00082559 1 Commentaire Meteo General Text En début d'après-midi, ligne orageuse active, avec grêle et fortes rafales de vent touchant la Lorraine et l'Alsace. Canicule toujours en cours avec un début d'atténuation sur la façade ouest.

Re: LUA: vigilance météoFrance

Publié : 22 juin 2017, 18:09
par totof60
Je suppose que tu as mis ton script dans " réglages", "plus d'options", " événements"

vil1driver te demande si tu as bien mis " time"

Image