[DzVents] Vigilance MétéoFrance V2

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
Répondre
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

[DzVents] Vigilance MétéoFrance V2

Message par papoo »

Bonjour,
afin de pallier le manque d'information en vigilance jaune du précédent script je l'ai adapté au fichier xml NXFR33_LFPW_.xml donné par jackslayter
même fonctionnement que le script précédent
affichage de l'ensemble des vigilances avec le code couleur de la plus élevée et même en vigilance jaune
passage à DZvents

Code : Tout sélectionner

--[[
vigilanceMeteoFrance.lua
author/auteur = papoo
update/mise à jour = 09/08/2020
création = 28/04/2018
Principe : Ce script a pour but de remonter les informations de vigilance de météoFrance
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 "vigilance météo".

URL forum : http://easydomoticz.com/forum/viewtopic.php?f=17&t=5492
URL blog : http://pon.fr/vigilance-meteofrance-v2/
URL github : https://github.com/papo-o/domoticz_scripts/blob/master/dzVents/scripts/vigilanceMeteoFrance.lua


--]]
--------------------------------------------
------------ Variables à éditer ------------
--------------------------------------------
local departement              = 87                   -- renseigner votre numéro de département sur 2 chiffres exemples : 01 ou 07 ou 87 
local alert_device             = 'Vigilance Météo'    -- renseigner le nom de l'éventuel device alert vigilance météo associé (dummy - alert)
local conseil_meteo            = "Conseil Météo" --'Conseil Météo'      -- renseigner le nom de l'éventuel device alert Conseils Météo associé si souhaité, sinon nil 
local commentaire_meteo        = "Commentaire Météo" --'Commentaire Météo'  -- renseigner le nom de l'éventuel device alert Commentaire Météo associé si souhaité, sinon nil
local display_conseils         = true                 -- true pour voir les conseils sans condition, false seulement en cas de vigilance dans le département sélectionné
local display_commentaire      = true                 -- true pour voir les commentaires sans condition, false seulement en cas de vigilance dans le département sélectionné
--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------
local scriptName        = 'Vigilance météo France'
local scriptVersion     = '2.06'
local response = "vigilance_meteoFrance"
return {
    active = true,
    on =        {       timer           =   { "every minute"},
                        httpResponses   =   {  response } },

    logging =   {    level    =   domoticz.LOG_DEBUG,
                   -- level    =   domoticz.LOG_INFO,             -- Seulement un niveau peut être actif; commenter les autres
                    -- level    =   domoticz.LOG_ERROR,            -- Only one level can be active; comment others
                    -- level    =   domoticz.LOG_MODULE_EXEC_INFO,
                    marker  =   scriptName..' v'..scriptVersion },

    execute = function(dz, item)

        local devAlert = dz.devices(alert_device)

        local function logWrite(str,level)
            dz.log(tostring(str),level or dz.LOG_DEBUG)
        end
        local function seuilAlerte(level)
            if level == 0 or level == nil then return dz.ALERTLEVEL_GREY end
            if level == 1 then return dz.ALERTLEVEL_GREEN end
            if level == 2 then return dz.ALERTLEVEL_YELLOW end
            if level == 3 then return dz.ALERTLEVEL_ORANGE end
            if level == 4 then return dz.ALERTLEVEL_RED end
        end
        local 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 "Vigilance Météo" end
        end
        local function EnumClear(Text)   -- replace the last character
            a=string.len(Text)
            b=string.sub(Text,a,a)
            if b=="," or b==" " then Text=string.sub(Text,1,a-1) end
            a=string.len(Text)
            b=string.sub(Text,a,a)
            if b=="," or b==" " then Text=string.sub(Text,1,a-1) end
            return Text
        end

        if (item.isHTTPResponse and item.trigger == response) then
            local abr = dz.utils.fromXML(item.data,"erreurXML") 
            local dv = abr.CV.DV
            local textAlert = ""
            local vigilanceColor = ""
            local conseil = ""
            local commentaire = ""

            for i, departements in ipairs(dv) do
                for _, result in pairs(departements) do
                            --logWrite(result.dep)
                            --logWrite(result.coul)
                    if tonumber(result.dep) == departement then 
                        logWrite("departement : "..result.dep)
                        logWrite("Couleur vigilance : "..result.coul)
                        vigilanceColor = tonumber(result.coul)
                        if dv[i].risque then 
                            risques = dv[i].risque
                            for _, risque in pairs(risques) do 
                                for _, risqueDep in pairs(risque) do
                                    if risqueDep.val and (type(risqueDep) == "table") then 
                                        logWrite(risqueDep.val)
                                        logWrite(risqueTxt(tonumber(risqueDep.val)))
                                        textAlert = textAlert .. risqueTxt(tonumber(risqueDep.val)) .. ", "
                                    else
                                        logWrite(risqueDep)
                                        textAlert = textAlert .. risqueTxt(tonumber(risqueDep)) .. ", "
                                        logWrite(textAlert)
                                    end
                                end
                            end
                        end
                    end
                end
            end

            text = EnumClear(textAlert)
            if text == '' then text = 'Aucune vigilance' end
            logWrite("------ vigilance ".. vigilanceColor .. " " .. text .. " pour le département " .. departement,dz.LOG_INFO)

            if alert_device ~= nil then
                if devAlert.color ~= vigilanceColor or devAlert.lastUpdate.minutesAgo > 1440 then
                    devAlert.updateAlertSensor(seuilAlerte(vigilanceColor), text)
                elseif devAlert.text ~= text then
                    devAlert.updateAlertSensor(seuilAlerte(vigilanceColor), text)
                end
            end

        -- ====================================================================================================================   
        -- Conseil météo (merci denis_brasseur )
        -- ====================================================================================================================         
            if conseil_meteo ~= nil then
                local vconseil = abr.CV.EV.VCONSEIL 
                if vconseil and (type(vconseil) == "table") then 
                    for i, result in pairs(vconseil) do
                        if vconseil[i].texte then
                            conseil = vconseil[i].texte
                        end
                    end
                else conseil = 'Aucun conseil disponible'
                end
                if (conseil ~= nil and vigilanceColor > 1) or (conseil ~= nil and display_conseils == true) then -- Mise à our du devise texte conseil météo si il existe
                    if dz.devices(conseil_meteo).text ~= conseil then dz.devices(conseil_meteo).updateAlertSensor(seuilAlerte(vigilanceColor), conseil) end
                elseif (conseil == nil) or (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
                    if dz.devices(conseil_meteo).text ~= 'Aucun conseil disponible' then dz.devices(conseil_meteo).updateAlertSensor(seuilAlerte(vigilanceColor), 'Aucun conseil disponible') end
                end
            end
        -- ====================================================================================================================   
        -- Commentaire météo (merci denis_brasseur )
        -- ====================================================================================================================        
            if commentaire_meteo ~= nil then
                local vcommentaire = abr.CV.EV.VCOMMENTAIRE
                if vcommentaire and (type(vcommentaire) == "table") then 
                    for i, result in pairs(vcommentaire) do
                        if vcommentaire[i].texte then
                            commentaire = vcommentaire[i].texte
                        end
                    end
                else commentaire = 'Aucun commentaire disponible'
                end
                if (commentaire ~= nil and vigilanceColor > 1) or (commentaire ~= nil and display_commentaire == true) then -- Mise à jour du devise texte commentaire météo si il existe
                    if dz.devices(commentaire_meteo).text ~= commentaire then dz.devices(commentaire_meteo).updateAlertSensor(seuilAlerte(vigilanceColor), commentaire) end
                elseif (commentaire == nil) or (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
                    if dz.devices(commentaire_meteo).text ~= 'Aucun commentaire disponible' then dz.devices(commentaire_meteo).updateAlertSensor(seuilAlerte(vigilanceColor), 'Aucun commentaire disponible') end
                end
            end
        -- ====================================================================================================================   

        -- ====================================================================================================================
        else
            local url = "http://vigilance2019.meteofrance.com/data/NXFR33_LFPW_.xml"
            dz.openURL({
                  url = url,
                        method = "GET",
                        callback = response})
        end
    end
}



Dernière modification par papoo le 09 août 2020, 14:56, modifié 11 fois.
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
jackslayter
Messages : 1040
Inscription : 30 sept. 2014, 14:40
Localisation : Isère (38)

Re: LUA: vigilance météoFrance V2

Message par jackslayter »

ça marche pour moi, plus qu'a tester avec plusieurs couleurs de vigilance

j'utilise ça

Code : Tout sélectionner

	local rid = assert(io.popen(curl.. "http://vigilance.meteofrance.com/data/NXFR33_LFPW_.xml"))
	local testXml = rid:read('*all')
	rid:close()

au lieu de

Code : Tout sélectionner

-- 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")
        os.execute("wget -q -O " .. fname .. " http://vigilance.meteofrance.com/data/NXFR33_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()
mais vu que j'ai pas les conseils ou commentaires peut être que ça ne marche pas
Raspberry Pi + RFLink + Domoticz Beta
Oregon - 3x Thgr122Nx / Chacon - micromodule 200w, télécommande 3b et 16b, 2x module 1000w, détecteur de fumée, contact de porte, 2x prise 3500w / OWL - CM180 / TRC02 v2 RGB 3M / Cheap - PIR, contact de porte
jackslayter
Messages : 1040
Inscription : 30 sept. 2014, 14:40
Localisation : Isère (38)

Re: LUA: vigilance météoFrance V2

Message par jackslayter »

effectivement marche pas avec deux couleurs

Code : Tout sélectionner

<DV dep="76" coul="3">
<risque val="1"/>
</DV>
<DV dep="76" coul="2">
<risque val="3"/>
<risque val="4"/>
<risque val="2"/>
</DV>
2.png
2.png (33.17 Kio) Consulté 17287 fois
1.png
1.png (6.75 Kio) Consulté 17287 fois
Raspberry Pi + RFLink + Domoticz Beta
Oregon - 3x Thgr122Nx / Chacon - micromodule 200w, télécommande 3b et 16b, 2x module 1000w, détecteur de fumée, contact de porte, 2x prise 3500w / OWL - CM180 / TRC02 v2 RGB 3M / Cheap - PIR, contact de porte
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: LUA: vigilance météoFrance V2

Message par papoo »

C’est quoi qui ne marche pas ?
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
jackslayter
Messages : 1040
Inscription : 30 sept. 2014, 14:40
Localisation : Isère (38)

Re: LUA: vigilance météoFrance V2

Message par jackslayter »

Si il y a 2 couleurs en même temps (jaune, orange) les risques d'une seule couleur sont pris en compte ( Dans mon exemple le jaune)
Raspberry Pi + RFLink + Domoticz Beta
Oregon - 3x Thgr122Nx / Chacon - micromodule 200w, télécommande 3b et 16b, 2x module 1000w, détecteur de fumée, contact de porte, 2x prise 3500w / OWL - CM180 / TRC02 v2 RGB 3M / Cheap - PIR, contact de porte
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: LUA: vigilance météoFrance V2

Message par papoo »

tester avec un département avec plusieurs vigilances de couleurs différentes est plus facile
j'ai mis à jour le script du premier post
2017-12-13 21_43_05-vigilance_V2.png
2017-12-13 21_43_05-vigilance_V2.png (31 Kio) Consulté 17250 fois
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
lamouette
Messages : 150
Inscription : 07 déc. 2016, 16:10

Re: LUA: vigilance météoFrance V2

Message par lamouette »

Hello

Chez moi, rien ne se met à jour et je pense que c'est a cause de ce "détail" : Ce script utilise Lua-Simple-XML-Parser https://github.com/Cluain/Lua-Simple-XML-Parser

J'ai bien le fichier xmlSimple.lua qui se trouve dans le même répertoire que mon script lua.
Je sèche ...
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: LUA: vigilance météoFrance V2

Message par papoo »

Lua-Simple-XML-Parser est integré au script lua, la mention est juste la pour le copyright pas besoin de telecharger et de stocker le script ailleurs.
ce script ne s’exécute que 3 fois par jour à 07H15 13H15 et 18H15 donc pas de résultat avant 7h15 demain matin.
si tu est vraiment pressé tu peux temporairement lancer le script toutes les minutes en commentant (ajouter -- devant) la ligne 239 et en décommettant (supprimer -- en début de ligne) la ligne 240
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
lamouette
Messages : 150
Inscription : 07 déc. 2016, 16:10

Re: LUA: vigilance météoFrance V2

Message par lamouette »

Quelle buse ... merci ... j'ai vu en cherchant la ligne 239 que le contenu du paser était dans le code ...

Merci papoo ;)
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: LUA: vigilance météoFrance V2

Message par papoo »

ça fonctionne?
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
Répondre