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

Vous avez crée 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.
Soyez précis quant aux prérequis, les manips à faire pour que votre bijou fonctionne (des chmod ?, un apt-get à faire ...)
Décrivez précisément son fonctionnement
Placez votre code entre [Quote] et {/Quote]
papoo
Messages : 1905
Enregistré le : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

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

Message par papoo » 28 août 2019, 17:24

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
}
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


raphy383
Messages : 10
Enregistré le : 03 oct. 2019, 21:31

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

Message par raphy383 » 03 oct. 2019, 21:36

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.

papoo
Messages : 1905
Enregistré le : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

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

Message par papoo » 03 oct. 2019, 21:50

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
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github

raphy383
Messages : 10
Enregistré le : 03 oct. 2019, 21:31

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

Message par raphy383 » 04 oct. 2019, 11:04

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...

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


papoo
Messages : 1905
Enregistré le : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

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

Message par papoo » 04 oct. 2019, 14:29

Non juste changer les droits du fichier
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github

raphy383
Messages : 10
Enregistré le : 03 oct. 2019, 21:31

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

Message par raphy383 » 07 oct. 2019, 17:03

Merci :!:

tout fonctionne.

papoo
Messages : 1905
Enregistré le : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

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

Message par papoo » 07 oct. 2019, 18:44

Cool
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github

Doudy
Messages : 213
Enregistré le : 07 mai 2016, 17:23

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

Message par Doudy » 08 nov. 2019, 16:37

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 ?
;)
PI 3 = RFXCOM
PI 3 + Touchscreen 7" affichage Domoticz
RFXCOM 433
Domoticz Version: 4.10717 - Python Version: 3.5.3

papoo
Messages : 1905
Enregistré le : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

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

Message par papoo » 10 nov. 2019, 11:20

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
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github

Doudy
Messages : 213
Enregistré le : 07 mai 2016, 17:23

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

Message par Doudy » 11 nov. 2019, 08:37

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
;)
PI 3 = RFXCOM
PI 3 + Touchscreen 7" affichage Domoticz
RFXCOM 433
Domoticz Version: 4.10717 - Python Version: 3.5.3

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Répondre