[DzVents] Version Texte Vigilance Météo 2024 (version avec données Météo France).

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.
Alain78
Messages : 75
Inscription : 05 févr. 2022, 09:18

[DzVents] Version Texte Vigilance Météo 2024 (version avec données Météo France).

Message par Alain78 »

Bonjour et bonne année 2024 à tous les passionnés de domoticz!!
,
Suite à la modification de l'url pour la vigilance Météo, je me suis penché sur le sujet et je vous propose une nouvelle version à adapter en fonction des informations souhaitées.

Aller sur le site de météo France https://portail-api.meteofrance.fr/devportal/apis et créer un compte.
une fois fait dans la barre de recherche des API taper: vigilance et la vue de l'API pour la vigilance météo apparait.
Sélectionnez là et sélectionner "subscription" sur la gauche et donner un nom d'application pour votre projet.
Une fois fait vous pouvez configurer votre API.
Voir ci dessous:
config_API-1.png
config_API-1.png (71.69 Kio) Consulté 1549 fois
ensuite réaliser l'opération suivante:
config_API-2.png
config_API-2.png (142.95 Kio) Consulté 1549 fois
Dans un éditeur de texte faire un coller de la copie d’un des 2 choix possibles et récupérer le code après « Authorization :Basic », ne pas prendre les ‘’
le code obenu sera à mettre dans "local cleAPI" au début du script.
Ci dessous le code du script en dzvents

Code : Tout sélectionner

-- Récuperation informations Vigilance météo sur Météo France.
-- Site pour documentation: https://portail-api.meteofrance.fr/web/fr/api/DonneesPubliquesVigilance
-- Script: script_time_Vigilance_meteo
-- Version 2023-12-30

local scriptName        = 'script_time_Vigilance_meteo'
local scriptVersion     = '1.0'
local cleAPI            = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -- à générer sur le site https://portail-api.meteofrance.fr/devportal/apis
local urlVigilanceMeteo = 'https://public-api.meteofrance.fr/public/DPVigilance/v1/textesvigilance/encours' --- fichier JSON bulletin de Vigilance, de niveau national, zonal et départemental
local alert_device      = 'Vigilance Météo 78' -- nom du device Alerte à créer avant l'exécution du script.
local Risk_code         = 1 -- Valeur par défaut (vert - pas de vigilance)
local Hazard_name       = "Pas de vigilance" -- valeur par défaut
local Dept              = "78"  -- Département pour l'affichage de la vigilance ou les diférentes zones, récuperer la documentation (pdf) sur la page de l'API ou lire le fichier récupéré (sur linux sous \domoticz\scripts\dzvents\data) pour comprende les données.

local DomaineID         = ""
local Domaine_local     = ""
local BlocID            = nil
local message           = {}
message[1]              = "msg1"
message[2]              = "msg2"
message[3]              = "msg3"
message[4]              = "msg4"
message[5]              = "msg5"
message[6]              = "msg6"
message[7]              = "msg7"
local Message           = {}
Message[1]              = "Msg1"
Message[2]              = "Msg2"
Message[3]              = "Msg3"
Message[4]              = "Msg4"
Message[5]              = "Msg5"
Message[6]              = "Msg6"
Message[7]              = "Msg7"
local msg               = ""
local Msg               = ""

return {
    on = {  timer = { 'at 06:00-19:30 at *:13' },
        	httpResponses = { scriptName..'01', scriptName..'02' } -- must match with the callback passed to the openURL command
         },
            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 },
                        
	        data = {  access_token = { history = true, maxItems = 1, maxMinutes = 60 },
		              JsonFile = {initial = {} }
	},		

	execute = function(domoticz, item)

		if item.isTimer then
			if domoticz.data.access_token.size == 0 or domoticz.data.access_token.get(1).time.minutesAgo > 50 then 
				url = "https://portail-api.meteofrance.fr/token"
				domoticz.log('Requesting data from meteofrance', domoticz.LOG_DEBUG)
				domoticz.openURL({
					url = url,
					method = 'POST',
					headers =  { ['Content-Type'] = 'application/x-www-form-urlencoded',
							     ['Authorization'] = 'Basic '..cleAPI},
					callback = scriptName..'01',
				    })
			else
				domoticz.log('access_token age: '..domoticz.data.access_token.get(1).time.secondsAgo, domoticz.LOG_DEBUG)
				domoticz.log('access_token : '..domoticz.data.access_token.get(1).data, domoticz.LOG_DEBUG)
				url = urlVigilanceMeteo
				domoticz.log('Requesting data from meteofrance', domoticz.LOG_DEBUG)
				domoticz.openURL({
					url = url,
					method = 'GET',
					headers =  { ['Content-Type'] = 'application/json;charset=utf-8',
					             ['Accept'] = 'application/json',
								 ['Authorization'] = 'Bearer '..domoticz.data.access_token.get(1).data},
					callback = scriptName..'02',
			    	})
			end
        elseif (item.isHTTPResponse and item.ok) then  
    	    if item.trigger == scriptName..'01' then
		        contents = domoticz.utils.fromJSON(item.data)
		        domoticz.data.access_token.add(contents.access_token)
		        domoticz.log('access_token : '..domoticz.data.access_token.getLatest().data, domoticz.LOG_DEBUG)
		        domoticz.log('access_token age: '..domoticz.data.access_token.get(1).time.secondsAgo, domoticz.LOG_DEBUG)
				url = urlVigilanceMeteo
				domoticz.log('Requesting data from meteofrance', domoticz.LOG_DEBUG)
				domoticz.openURL({
					url = url,
					method = 'GET',
					headers =  { ['Content-Type'] = 'application/json;charset=utf-8',
					             ['Accept'] = 'application/json',
								 ['Authorization'] = 'Bearer '..domoticz.data.access_token.get(1).data},
					callback = scriptName..'02',
			    	})
	        elseif item.trigger == scriptName..'02' then
	            devAlert = domoticz.devices(alert_device)
			    contents = domoticz.utils.fromJSON(item.data)
                if #item.data > 0 then
                    domoticz.data.JsonFile = domoticz.utils.fromJSON(item.data)
                    rt = domoticz.utils.fromJSON(item.data)
                else    
                    domoticz.log("Problem with response from Meteo France (no data) using data from earlier run",domoticz.LOG_ERROR)
                    rt = domoticz.data.JsonFile         -- json empty. Get last valid from domoticz.data
                    if #rt < 1 then                     -- No valid data in domoticz.data either
                        domoticz.log("No previous data. are Meteo France OK?",domoticz.LOG_ERROR)
                    end
                end
			    Warning_type = contents.product.warning_type
                Update_time = contents.product.update_time
                local h = 1 
                while contents.product.text_bloc_items[h] do  -- Boucle pour lecture de tous les blocs avec récupération du bloc ID du Département choisi.
                    DomaineID = contents.product.text_bloc_items[h].domain_id
                    if DomaineID == Dept then
                        BlocID = h
                        print("BlocID: "..BlocID.."<br>".."Domaine Name: "..contents.product.text_bloc_items[BlocID].domain_name)
                        break
                    end
                    h = h + 1
                end
                Domaine_local = contents.product.text_bloc_items[BlocID]
                local i = 1 -- Boucle pour lecture en cas de plusieurs items.
                while Domaine_local.bloc_items[i] do
                    Type_group = Domaine_local.bloc_items[i].type_group
                    Type_name = Domaine_local.bloc_items[i].type_name
                    Hazard_name = Domaine_local.bloc_items[i].text_items[1].hazard_name
                    Domain_name = Domaine_local.domain_name
                    if Domaine_local.bloc_items[i].text_items[1].term_items[1] then
                        Detail_Vigi = Domaine_local.bloc_items[i].text_items[1].term_items[1]
                        Term_names = Detail_Vigi.term_names
                        Start_time = Detail_Vigi.start_time
                        End_time = Detail_Vigi.end_time
                        Risk_name = Detail_Vigi.risk_name
                        Risk_code = tonumber(Detail_Vigi.risk_code)
                        Vigi_Text = ""
                        if Detail_Vigi.subdivision_text[1] then
                            local j = 1
                            while Detail_Vigi.subdivision_text[1].text[j] do
                                if string.len(Detail_Vigi.subdivision_text[1].text[j]) > 0 then
                                    Vigi_Text = Vigi_Text..Detail_Vigi.subdivision_text[1].text[j].."<br>"
                                end
                                j = j + 1
                            end
                        end
                        if i == 1 then
                            msg = "Date publication: "..Update_time.."<br>".."Département: "..Domain_name.."<br>".."<br>".."===========================================================================".."<br>"
                        end
                        message[i] = "Type d'alerte: "..Type_name.."<br>".."Début phénomène: "..Start_time.."<br>".."Fin phénomène: "..End_time.."<br>".."Risque: "..Risk_name.."<br>".."<br>".."Message: "..Vigi_Text.."<br>".."===========================================================================".."<br>"
                        Message[i] = Type_name..":"..Hazard_name.."<br>"
                        msg = msg..message[i]
                        Msg = Msg..Message[i]
                    else
                        -- Pas de Vigilance
                        Msg = "Pas de Vigilance"
                        msg = "Pas de Vigilance"
                    end
                    i = i + 1
                end
                --Mise à jour du niveau d'alerte
                if alert_device ~= nil then
                    if Risk_code == 0 or Risk_code == nil then
                        Alerte = domoticz.ALERTLEVEL_GREY
                    elseif Risk_code == 1 then 
                        Alerte = domoticz.ALERTLEVEL_GREEN -- Pas de Vigilance
                        Msg = "Pas de Vigilance"
                        msg = "Pas de Vigilance"
                    elseif Risk_code == 2 then
                        Alerte = domoticz.ALERTLEVEL_YELLOW
                    elseif Risk_code == 3 then
                        Alerte = domoticz.ALERTLEVEL_ORANGE
                    elseif Risk_code == 4 then
                        Alerte = domoticz.ALERTLEVEL_RED
                    end
                    if devAlert.color ~= Risk_code or devAlert.text ~= Msg then
                        devAlert.updateAlertSensor(Alerte, Msg)
                        if Risk_code >= 1 then
                            domoticz.notify("Vigilance Météo 78 : ", msg, domoticz.PRIORITY_EMERGENCY)
                        end
                    elseif devAlert.lastUpdate.minutesAgo > 60 then
                        devAlert.updateAlertSensor(Alerte, Msg)
                    end
                end
            end
	    else
		    domoticz.log('Last http response was not what expected. Trigger: '..item.trigger, domoticz.LOG_ERROR)
		    domoticz.log(item.data, domoticz.LOG_ERROR)
	    end
    end
}
Ne pas oublier de lire les commentaires, la seule chose à renseigner est :le departement ou la zone (voir documentation ou fichier)
local Dept = "xx"
Et bien sure créer un widget Alerte.

Je n'ai pas utilisé tous les champs possibles founis pas Météo france, je pense avoir pris les plus importants. Libre à vous de choisir d'autre champs.
en cas d'alerte un mail est envoyé si une adresse est configurée dans domoticz, les informations ne sont pas toujours précises dans la partie texte mise dans l'alerte.
Pour tester il suffit de lancer une fois le script et lire le fichier dans \domoticz\scripts\dzvents\data\xxx.lua et selectionner un département ou une zone ayant une alerte météo.
Je n'ai fait que la partie alerte en texte, c'est est aussi possible en mode carte mais plutot utilisable dans monitor.

Exemple de mail envoyé;
Date publication: 2024-01-16T07:12:43Z
Département: Yvelines

===========================================================================
Type d'alerte: Situation Actuelle
Début phénomène: 2024-01-16T07:00:00Z
Fin phénomène: 2024-01-18T23:00:00Z
Risque: Orange

Message: Faits nouveaux : passage en vigilance orange neige-verglas à partir de la fin de soirée.
Situation générale : Dans des températures froides, arrivée en fin de soirée par le sud d'une perturbation active avec pluies verglaçantes en seconde partie nuit prochaine, parfois précédés de quelques flocons.
Observations notables : ras pour l'instant.

===========================================================================
Type d'alerte: Prévisibilité et incertitudes
Début phénomène: 2024-01-16T07:00:00Z
Fin phénomène: 2024-01-18T23:00:00Z
Risque: Orange

Message: - chronologie pouvant varier d'une heure.
- neige faible possible en milieu de nuit, précédant l'arrivée des pluies en surfusion sur sols froids.

===========================================================================
Type d'alerte: Qualification
Début phénomène: 2024-01-16T07:00:00Z
Fin phénomène: 2024-01-18T23:00:00Z
Risque: Orange

Message: Episode notable de pluies verglaçantes pouvant rendre les conditions de circulation difficiles, suivi d'un épisode neigeux.

===========================================================================
Type d'alerte: Évolution prévue
Début phénomène: 2024-01-16T07:00:00Z
Fin phénomène: 2024-01-18T23:00:00Z
Risque: Orange

Message: Début des flocons puis pluies verglaçantes vers 22 h ce soir mardi, qui gagnent l'ensemble de l'Ile-de-France du sud vers le nord.
Fin de pluies verglaçantes mercredi à l'aube, suivie de pluies en journée, cumuls notables.
A partir de la soirée mercredi, du nord vers le sud, chutes de neige qui gagnent l'ensemble de l'Ile-de-France et durent jusqu'à jeudi en matinée.
Fin prévue de l'épisode : matinée de jeudi.

===========================================================================
Et le résultat sur le Widget Vigilance Météo
Widget_Vigilance-Météo.jpg
Widget_Vigilance-Météo.jpg (22.64 Kio) Consulté 1530 fois
Cordialement

Alain
Dernière modification par Alain78 le 16 janv. 2024, 08:56, modifié 2 fois.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: [DzVents] Version Vigilance Météo 2024 (version avec données Météo France).

Message par Keros »

Merci beaucoup Alain78 pour ce tuto.

Je vais certainement y regarder prochainement ;)
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Ced31
Messages : 4
Inscription : 15 févr. 2024, 13:33

Re: [DzVents] Version Vigilance Météo 2024 (version avec données Météo France).

Message par Ced31 »

Bonjour,
Apparemment le site a changé :(
Alain78
Messages : 75
Inscription : 05 févr. 2022, 09:18

Re: [DzVents] Version Vigilance Météo 2024 (version avec données Météo France).

Message par Alain78 »

Bonjour,
Pour moi cela fonctionne toujours.
Vérifier le fichier correspondant dans le dossier:
/Domoticz/scripts/dzvents/data pour voir si il est bien mis a jours et si les données sont cohérentes.
Bonne journée.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: [DzVents] Version Vigilance Météo 2024 (version avec données Météo France).

Message par Keros »

Ce serait le lien https://portail-api.meteofrance.fr/devportal/apis pour générer le token qui ne fonctionne plus.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Alain78
Messages : 75
Inscription : 05 févr. 2022, 09:18

Re: [DzVents] Version Vigilance Météo 2024 (version avec données Météo France).

Message par Alain78 »

Bonjour,

L'incident semble clos, j'arrive bien a m'authentifier sur le portail et a accéder mes API et la génération de token fonctionne bien.

Bonne soirée.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: [DzVents] Version Vigilance Météo 2024 (version avec données Météo France).

Message par Keros »

J'ai le souci avec Firefox : une page blanche sans rien dedans.
Avec Brave, la page s'est chargé sur une nouvelle adresse : https://portail-api.meteofrance.fr/web/fr
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
jackslayter
Messages : 1040
Inscription : 30 sept. 2014, 14:40
Localisation : Isère (38)

Re: [DzVents] Version Vigilance Météo 2024 (version avec données Météo France).

Message par jackslayter »

c'est moi ou l'interface du site à beaucoup changée par rapport au tuto ?
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
Euton
Messages : 137
Inscription : 18 sept. 2019, 09:33

Re: [DzVents] Version Vigilance Météo 2024 (version avec données Météo France).

Message par Euton »

Bonsoir, la page WEB de l'API à changer par rapport au TUTO,

par contre je suis un peu perdu du coup, dan configurer l'API : j'ai OAuth2 ou API KEY
et en essais de l'API j'ai :
curl -X 'GET' \
'https://public-api.meteofrance.fr/publi ... ce/encours' \
-H 'accept: */*'

@Alain78 : Pourrais tu mettre à jour les infos avec ton script ?

Merci d'avance
Domoticz version : 2024.7 (build 16178)
dzVents Version: 3.1.8
Python version : 3.11.2

Raspberry Pi OS : v12 (Bookworm)

Avec Domoticz depuis 28/11/2015
Alain78
Messages : 75
Inscription : 05 févr. 2022, 09:18

Re: [DzVents] Version Vigilance Météo 2024 (version avec données Météo France).

Message par Alain78 »

Bonjour,

Oui l'interface semble avoir été modifiée et simplifiée, les informations sont dans la FAQ: https://portail-api.meteofrance.fr/web/fr/faq
Lire toute la FAQ
Le script utilise la génération de Token OAuth2, Il faut donc utiliser l'authentification OAuth2 et récupérer les informations comme indiqué (extrait de la FAQ):
Récupération de commande de régénération de token de type oauth2

Pour le token de type Oauth2, vous pouvez récupérer la commande cURL pour régénérer automatiquement le token. Cette commande se retrouve en cliquant sur l'icône user (en haut à droite) -> Mes API -> choisir une api -> "Générer Token" (la commande est en bas de la page).


Récupérer le Token et le mettre dans la ligne : "local cleAPI =" au début du script.

Le reste ne change pas.

Bonne journée.

Alain
Répondre