Page 1 sur 9

DZVents : mise en cache des données de l’API prevision_meteo.ch

Posté : 28 août 2019, 17:24
par papoo
Bonjour,
Le site https://prevision-meteo.ch subit de nombreux ralentissements, rendant aléatoire l’affichage des prévisions météo sur monitor. Actuellement il faut une vingtaine de secondes entre la demande de mise à jour et la réception des données.
je vous avais proposé une page météo dédiée utilisant cette API pour affichage dans la custom page monitor https://pon.fr/prevision-meteo-a-3-jours/
son fonctionnement est devenu très aléatoire, au gré des surcharges du site fournissant cette API.
Je vous propose donc ce script qui permet la récupération des données via l’API, la modification du chemin d’accès aux icones afin de les stocker en local.
Si les données sont inaccessibles lors de l’appel de l’API, les données précédentes ne sont pas écrasées, permettant le fonctionnement continue de la page météo.
J’espère que cela permettra de diminuer les requêtes à l’API et contribuera modestement à la baisse de charge.

après la première exécution de ce script (son exécution est paramétré toutes les heures) modifiez ses droits d’accès et éventuellement l’utilisateur. (commandes chmod et chown)
Éditez la page /home/pi/domoticz/www/monitor/pages/meteo.html
commentez la ligne (en ajoutant // devant)

Code : Tout sélectionner

var JsonAddress = "http://www.prevision-meteo.ch/services/json/"+city;
et ajoutez la ligne suivante en dessous, en personnalisant l’adresse de monitor

Code : Tout sélectionner

var JsonAddress = "http://192.168.10.204:8080/monitor/prevision-meteo.json";
Téléchargez les 36 icones météo dans le dossier dédié de monitor /home/pi/domoticz/www/monitor/icons/prevision-meteo/
https://www.prevision-meteo.ch/style/im ... leille.png
https://www.prevision-meteo.ch/style/im ... claire.png
https://www.prevision-meteo.ch/style/im ... -voile.png
https://www.prevision-meteo.ch/style/im ... voilee.png
https://www.prevision-meteo.ch/style/im ... uageux.png
https://www.prevision-meteo.ch/style/im ... egagee.png
https://www.prevision-meteo.ch/style/im ... illard.png
https://www.prevision-meteo.ch/style/im ... tratus.png
https://www.prevision-meteo.ch/style/im ... sipant.png
https://www.prevision-meteo.ch/style/im ... tratus.png
https://www.prevision-meteo.ch/style/im ... ircies.png
https://www.prevision-meteo.ch/style/im ... ageuse.png
https://www.prevision-meteo.ch/style/im ... uageux.png
https://www.prevision-meteo.ch/style/im ... uageux.png
https://www.prevision-meteo.ch/style/im ... faible.png
https://www.prevision-meteo.ch/style/im ... verses.png
https://www.prevision-meteo.ch/style/im ... oderee.png
https://www.prevision-meteo.ch/style/im ... -forte.png
https://www.prevision-meteo.ch/style/im ... verses.png
https://www.prevision-meteo.ch/style/im ... faible.png
https://www.prevision-meteo.ch/style/im ... -forte.png
https://www.prevision-meteo.ch/style/im ... oderee.png
https://www.prevision-meteo.ch/style/im ... uageux.png
https://www.prevision-meteo.ch/style/im ... uageux.png
https://www.prevision-meteo.ch/style/im ... rageux.png
https://www.prevision-meteo.ch/style/im ... ageuse.png
https://www.prevision-meteo.ch/style/im ... modere.png
https://www.prevision-meteo.ch/style/im ... rageux.png
https://www.prevision-meteo.ch/style/im ... faible.png
https://www.prevision-meteo.ch/style/im ... faible.png
https://www.prevision-meteo.ch/style/im ... faible.png
https://www.prevision-meteo.ch/style/im ... oderee.png
https://www.prevision-meteo.ch/style/im ... -forte.png
https://www.prevision-meteo.ch/style/im ... faible.png
https://www.prevision-meteo.ch/style/im ... oderee.png
https://www.prevision-meteo.ch/style/im ... -forte.png

votre page météo fonctionne de nouveau correctement.

Le script complet

Code : Tout sélectionner

--[[
previsionMeteo.lua
author/auteur = papoo
update/mise à jour = 18/08/2019
création = 18/08/2019
https://pon.fr/dzvents-mise-en-cache-des-donnees-de-lapi-prevision_meteo-ch
https://github.com/papo-o/domoticz_scripts/blob/master/domoticzVents/scripts/previsionMeteo.lua
https://easydomoticz.com/forum/viewtopic.php?f=17&t=8865

Principe : Le site prevision-meteo.ch subit de nombreux ralentissements, rendant aléatoire l'affichage des prévisions météo sur monitor
https://pon.fr/prevision-meteo-a-3-jours/
Ce script permet la récupération des données via l'API, la modification du chemin d'accès aux icones afin de les stocker en local.
Si les données sont inaccessibles lors de l'appel de l'API, les données précédentes ne sont pas écrasées, permettant le fonctionnement continue de la page météo
Téléchargez les 36 icones météo dans le dossier dédié de monitor /home/pi/domoticz/www/monitor/icons/prevision-meteo/
https://www.prevision-meteo.ch/style/images/icon/ensoleille.png
https://www.prevision-meteo.ch/style/images/icon/nuit-claire.png
https://www.prevision-meteo.ch/style/images/icon/ciel-voile.png
https://www.prevision-meteo.ch/style/images/icon/nuit-legerement-voilee.png
https://www.prevision-meteo.ch/style/images/icon/faibles-passages-nuageux.png
https://www.prevision-meteo.ch/style/images/icon/nuit-bien-degagee.png
https://www.prevision-meteo.ch/style/images/icon/brouillard.png
https://www.prevision-meteo.ch/style/images/icon/stratus.png
https://www.prevision-meteo.ch/style/images/icon/stratus-se-dissipant.png
https://www.prevision-meteo.ch/style/images/icon/nuit-claire-et-stratus.png
https://www.prevision-meteo.ch/style/images/icon/eclaircies.png
https://www.prevision-meteo.ch/style/images/icon/nuit-nuageuse.png
https://www.prevision-meteo.ch/style/images/icon/faiblement-nuageux.png
https://www.prevision-meteo.ch/style/images/icon/fortement-nuageux.png
https://www.prevision-meteo.ch/style/images/icon/averses-de-pluie-faible.png
https://www.prevision-meteo.ch/style/images/icon/nuit-avec-averses.png
https://www.prevision-meteo.ch/style/images/icon/averses-de-pluie-moderee.png
https://www.prevision-meteo.ch/style/images/icon/averses-de-pluie-forte.png
https://www.prevision-meteo.ch/style/images/icon/couvert-avec-averses.png
https://www.prevision-meteo.ch/style/images/icon/pluie-faible.png
https://www.prevision-meteo.ch/style/images/icon/pluie-forte.png
https://www.prevision-meteo.ch/style/images/icon/pluie-moderee.png
https://www.prevision-meteo.ch/style/images/icon/developpement-nuageux.png
https://www.prevision-meteo.ch/style/images/icon/nuit-avec-developpement-nuageux.png
https://www.prevision-meteo.ch/style/images/icon/faiblement-orageux.png
https://www.prevision-meteo.ch/style/images/icon/nuit-faiblement-orageuse.png
https://www.prevision-meteo.ch/style/images/icon/orage-modere.png
https://www.prevision-meteo.ch/style/images/icon/fortement-orageux.png
https://www.prevision-meteo.ch/style/images/icon/averses-de-neige-faible.png
https://www.prevision-meteo.ch/style/images/icon/nuit-avec-averses-de-neige-faible.png
https://www.prevision-meteo.ch/style/images/icon/neige-faible.png
https://www.prevision-meteo.ch/style/images/icon/neige-moderee.png
https://www.prevision-meteo.ch/style/images/icon/neige-forte.png
https://www.prevision-meteo.ch/style/images/icon/pluie-et-neige-melee-faible.png
https://www.prevision-meteo.ch/style/images/icon/pluie-et-neige-melee-moderee.png
https://www.prevision-meteo.ch/style/images/icon/pluie-et-neige-melee-forte.png
--]]
--------------------------------------------
------------ Variables à éditer ------------
--------------------------------------------

local jsonFile      = '/home/pi/domoticz/www/monitor/prevision-meteo.json' -- nom du fichier (et son chemin complet) contenant les données de l'API
local iconsPath     = 'http://192.168.10.204:8080/monitor/icons/prevision-meteo/' -- adresse local où sont stockés les icones

--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------
local scriptName        = 'Extraction prévisions météo'
local scriptVersion     = '1.0'
local response = "prevision-meteo_response"
return {
    active = true,
    on =        {       timer           =   { "every 10 minutes" },
                        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(domoticz, item)

        local function logWrite ( str, level)  -- afficher le contenu d'un tableau
            local logTableWrite_cache = {}
            local function sub_logTableWrite(str, indent)
                if (logTableWrite_cache[tostring(str)]) then
                    domoticz.log(indent.."*"..tostring(str), level or domoticz.LOG_DEBUG)
                else
                    logTableWrite_cache[tostring(str)]=true
                    if (type(str)=="table") then
                        for pos,val in pairs(str) do
                            if (type(val)=="table") then
                                --domoticz.log(indent.."["..tostring(pos).."] - ["..tostring(str).."] => {", level or domoticz.LOG_DEBUG)
                                domoticz.log(indent.."["..tostring(pos).."] => {", level or domoticz.LOG_DEBUG)
                                sub_logTableWrite(val,indent..string.rep(" ",string.len(pos)+8))
                                domoticz.log(indent..string.rep(" ",string.len(pos)+6).."}", level or domoticz.LOG_DEBUG)
                            elseif (type(val)=="string") then
                                domoticz.log(indent.." "..pos..' = "'..val..'"', level or domoticz.LOG_DEBUG)
                                --domoticz.log(indent..pos..' => "'..val..'"', level or domoticz.LOG_DEBUG)
                            else
                                domoticz.log(indent.." "..pos.." = "..tostring(val), level or domoticz.LOG_DEBUG)
                                --domoticz.log(indent..pos.." = "..tostring(val), level or domoticz.LOG_DEBUG)
                            end
                        end
                    else
                        domoticz.log(indent..tostring(str), level or domoticz.LOG_DEBUG)
                    end
                end
            end
            if (type(str)=="table") then
                domoticz.log("["..tostring(str).."] => {", level or domoticz.LOG_DEBUG)
                sub_logTableWrite(str,"  ")
                domoticz.log("}", level or domoticz.LOG_DEBUG)
            else
                sub_logTableWrite(str,"  ")
            end
            print()
        end

        if (item.isHTTPResponse and item.trigger == response) then
            if (not item.isJSON) then
                logWrite('Last http response was not what expected. Trigger: '..item.trigger,domoticz.LOG_ERROR)
            else
                local contents = domoticz.utils.toJSON(item.json)
                contents = contents:gsub('https://www(.?)prevision(.?)meteo(.?)ch/style/images/icon/', iconsPath) 
                logWrite(contents)
                if contents then
                    file = io.open(jsonFile, "w+")
                    file:write( contents )
                    --io.close( file )
                    file:close()
                    logWrite('ecriture des données dans le fichier '..jsonFile)
                end
            end

        else
            local latitude  = domoticz.settings.location.latitude
                -- local latitude  = '46.85160'
                logWrite('latitude : '..latitude)
                local longitude = domoticz.settings.location.longitude
                -- local longitude = '1.35690'
                logWrite('longitude : '..longitude)
            local url = "http://www.prevision-meteo.ch/services/json/lat="..latitude.."lng="..longitude

            domoticz.openURL({
                  url = url,
                        method = "GET",
                        callback = response})
        end
    end
}

Re: DZVents : mise en cache des données de l’API prevision_meteo.ch

Posté : 03 oct. 2019, 21:36
par raphy383
Bonsoir papoo.

Merci pour tout ce que tu fais.

J'ai essayé d'installer ce script suite à des soucis d'affichage de ma page météo sur monitor.

Mais je bloque, je n'arrive pas à le faire fonctionner...
J'ai un doute :
le script semble s'appeler prevision-meteo.json (puisque qu'on l'appelle via la page meteo) mais a dans le corps du script il s'appelle (à la deuxieme ligne) previsionMeteo.lua

peux tu m'aider STP ?

Merci d'avance,
bonne soirée.

Re: DZVents : mise en cache des données de l’API prevision_meteo.ch

Posté : 03 oct. 2019, 21:50
par papoo
Ce script en dzvents s’appelle previsionMeteo.lua
Il doit être enregistré avec cette extension
Il génère automatiquement un fichier json utilisé par la page meteo

Re: DZVents : mise en cache des données de l’API prevision_meteo.ch

Posté : 04 oct. 2019, 11:04
par raphy383
Bonjour Papoo,

merci de ce retour...
J'avais mal compris en effet.

Dans le coup, le script s’exécute bien...!
Mais il se met en erreur car il n'arrive pas à joindre l'adresse http.

Code : Tout sélectionner

 local url = "http://www.prevision-meteo.ch/services/json/lat="..latitude.."lng="..longitude
j'ai donc modifié le script en rajoutant "https" et là, il récupère bien les info (visible via le log) et crée le fichier prevision-meteo.json

Par contre, cela ne s'affiche pas dans monitor.

Après recherche, je me rends compte que le fichier généré est un fichier "root" (et pas "pi") et qu'il n'y a pas les droits pour être lu. Je pense que c'est pour ça que ça ne marche pas.

Faut-il modifier le script pour qu'il crée un fichier lisible ?

[edit] : je n'avais pas vu que tu disais de modifier "après la première utilisation"
je vais essayer...

Re: DZVents : mise en cache des données de l’API prevision_meteo.ch

Posté : 04 oct. 2019, 14:29
par papoo
Non juste changer les droits du fichier

Re: DZVents : mise en cache des données de l’API prevision_meteo.ch

Posté : 07 oct. 2019, 17:03
par raphy383
Merci :!:

tout fonctionne.

Re: DZVents : mise en cache des données de l’API prevision_meteo.ch

Posté : 07 oct. 2019, 18:44
par papoo
Cool

Re: DZVents : mise en cache des données de l’API prevision_meteo.ch

Posté : 08 nov. 2019, 16:37
par Doudy
Hello,

Je viens de tester ce script
Mais j'ai le message suivant :

Code : Tout sélectionner

2019-11-08 16:29:02.496 Status: dzVents: Info: Handling httpResponse-events for: "prevision-meteo_response
2019-11-08 16:29:02.496 Status: dzVents: Info: Extraction prévisions météo v1.0: ------ Start external script: previsionMeteo.lua: HTTPResponse: "prevision-meteo_response"
2019-11-08 16:29:02.496 Status: dzVents: Error (2.4.19): Extraction prévisions météo v1.0: Last http response was not what expected. Trigger: prevision-meteo_response
2019-11-08 16:29:02.496 Status: dzVents: Info: Extraction prévisions météo v1.0: ------ Finished previsionMeteo.lua
Lorsque je teste le lien :

Code : Tout sélectionner

https://www.prevision-meteo.ch/services/json/lat=xx.xxxlng=x.xxx
j'obtiens bien les infos :

Code : Tout sélectionner

{"city_info":{"name":"NA","country":"--","latitude":"xx.xxx","longitude":"x.xxx","elevation":"NA","sunrise":"07:28","sunset":"17:17"},"forecast_info":{"latitude":"xx.xxx","longitude":"x.xxx","elevation":"221.0"},"current_condition":{"date":"08.11.2019","hour":"16:00","tmp":9,"wnd_spd":3,"wnd_gust":10,"wnd_dir":"O","pressure":999.8,"humidity":60,"condition":"Eclaircies","condition_key":"eclaircies","icon":"https:\/\/www.prevision-meteo.ch\/style\/images\/icon\/eclaircies.png","icon_big":"https:\/\/www.prevision-meteo.ch\/style\/images\/icon\/eclaircies-big.png"},"fcst_day_0":{"date":"08.11.2019","day_short":"Ven.","day_long":"Vendredi","tmin":1,"tmax":11,"condition":"Eclaircies","condition_key":"eclaircies","icon":"https:\/\/www.prevision-meteo.ch\/style\/images\/icon\/eclaircies.png","icon_big":"https:\/\/www.prevision-meteo.ch\/style\/images\/icon\/eclaircies-big.png","hourly_data":{"0H00":{"ICON":"https:\/\/www.prevision-meteo.ch\/style\/images\/icon\/nuit-avec-averses.png","CONDITION":"Nuit avec averses","CONDITION_KEY":"nuit-avec-averses","TMP2m":6.7,"DPT2m":6.1,"WNDCHILL2m":4.7,"HUMIDEX":null,"RH2m":96,"PRMSL":1001.8,"APCPsfc":0.1,"WNDSPD10m":10,"WNDGUST10m":16,"WNDDIR10m":151,"WNDDIRCARD10":"SE","ISSNOW":0,"HCDC":"100.00","MCDC":"86.40","LCDC":"11.10","HGT0C":1200,"KINDEX":37,"CAPE180_0":"56.000","CIN180_0":-4},"1H00":{"ICON":"https:\/\/www.prevision-meteo.ch\/style\/images\/icon\/pluie-faible.png","CONDITION":"Pluie faible","CONDITION_KEY":"pluie-faible","TMP2m":6.2,"DPT2m":5.6,"WNDCHILL2m":4.8,"HUMIDEX":null,"RH2m":97,"PRMSL":1001.2,"APCPsfc":0.1,"WNDSPD10m":7,"WNDGUST10m":15,"WNDDIR10m":145,"WNDDIRCARD10":"SE","ISSNOW":0,"HCDC":"100.00","MCDC":"99.60","LCDC":"55.60","HGT0C":1200,"KINDEX":39,"CAPE180_0":"33.000","CIN180_0":-1},"2H00":{"ICON":"https:\/\/www.prevision-meteo.ch\/style\/images\/icon\/faiblement-nuageux.png","CONDITION":"Faiblement nuageux","CONDITION_KEY":"faiblement-nuageux","TMP2m":2.6,"DPT2m":1.8,"WNDCHILL2m":1,"HUMIDEX":null,"RH2m":95,"PRMSL":1002.2,"APCPsfc":0,"WNDSPD10m":6,"WNDGUST10m":11,"WNDDIR10m":173,"WNDDIRCARD10":"S","ISSNOW":0,"HCDC":"0.00","MCDC":"100.00","LCDC":"100.00","HGT0C":1300,"KINDEX":39,"CAPE180_0":"0.000","CIN180_0":-5},"3H00":{"ICON":"https:\/\/www.prevision-meteo.ch\/style\/images\/icon\/nuit-nuageuse.png","CONDITION":"Nuit nuageuse","CONDITION_KEY":"nuit-nuageuse","TMP2m":5.1,"DPT2m":4.6,"WNDCHILL2m":3.5,"HUMIDEX":null,"RH2m":97,"PRMSL":1001.4,"APCPsfc":0,"WNDSPD10m":7,"WNDGUST10m":11,"WNDDIR10m":189,"WNDDIRCARD10":"S","ISSNOW":0,"HCDC":"0.00","MCDC":"0.00","LCDC":"100.00","HGT0C":1300,"KINDEX":41,"CAPE180_0":"0.000","CIN180_0":-4},"4H00":{"ICON":"https:\/\/www.prevision-meteo.ch\/style\/images\/icon\/faiblement-nuageux.png","CONDITION":"Faiblement nuageux","CONDITION_KEY":"faiblement- etc .....
Une idée ?
;)

Re: DZVents : mise en cache des données de l’API prevision_meteo.ch

Posté : 10 nov. 2019, 11:20
par papoo
le délai de réponse de cette API est très aléatoire.
ton navigateur est surement plus patient que DZvents.
ce script prend en compte cette erreur aléatoire en mettant en cache les données de l'API. il n'y à donc plus aucune incidence d'affichage sur le résultat final dans monitor.
les logs continueront à afficher cette erreur de temps à autre.
télécharge la v1.01 avec l'url en https par contre
https://github.com/papo-o/domoticz_scri ... nMeteo.lua

Re: DZVents : mise en cache des données de l’API prevision_meteo.ch

Posté : 11 nov. 2019, 08:37
par Doudy
papoo a écrit :
10 nov. 2019, 11:20
télécharge la v1.01 avec l'url en https par contre
https://github.com/papo-o/domoticz_scri ... nMeteo.lua
Merci
je teste de suite
;)