Page 1 sur 2

[Python] Version Cartes Vigilance Météo 2024

Publié : 12 mars 2024, 15:48
par jackslayter
Bonjour,
voici le tuto pour avoir les vigilances de phénomènes visible sur la carte https://vigilance.meteofrance.fr/fr dans un capteur alerte dans Domoticz
vigi0.png
vigi0.png (8.97 Kio) Consulté 2868 fois

Création de compte sur l'API météofrance
https://portail-api.meteofrance.fr/web/fr/
rechercher "DonneesPubliqueVigilance" dans la barre de recherche
puis cliquer sur "Souscrire à l'API gratuitement"
vigi1.png
vigi1.png (60.83 Kio) Consulté 2868 fois
Ensuite cliquer sur votre nom d'utilisateur et ensuite sur "MES API"
vigi2.png
vigi2.png (17.29 Kio) Consulté 2868 fois
Et cliquer sur "Générer Token"
vigi3.png
vigi3.png (41.33 Kio) Consulté 2868 fois
Vérifier que le "OAuth2" est coché et copier la clé entre "Basic" et le dernier " (guillemet) ATTENTION ne pas le copier
vigi4.png
vigi4.png (53.35 Kio) Consulté 2868 fois

Installer les librairies

Code : Tout sélectionner

pip3 install requests json pycurl


Créer un script python et coller celui-ci en remplaçant par vos variables

Code : Tout sélectionner

#----- VARIABLES A MODIFIER -----

departement = 38 # votre numero de departement
IP = "192.168.1.1:8080" # votre IP et port de Domoticz
IDX = 131 # l'IDX de votre capteur d'alerte
key = "copier le token ici" # votre token type Oauth2 meteofrance

#----- FIN DES VARIABLES A MODIFIER -----

import requests
import json
import pycurl

url = "https://portail-api.meteofrance.fr/token"
data = {"grant_type": "client_credentials"}
headers = {"Authorization": f"Basic {key}"}

get_token = requests.post(url, data=data, headers=headers)
#print(get_token.text)
token = json.loads(get_token.text)
token = token.get("access_token")

url2 = "https://public-api.meteofrance.fr/public/DPVigilance/v1/cartevigilance/encours"
headers2 = {"accept": "*/*", "Authorization": f"Bearer {token}"}

donneesfull = requests.get(url2, headers=headers2)
#print(donneesfull.text)

#donnees jour en cours
donneesj = json.loads(donneesfull.text)
for periode in donneesj["product"]["periods"]:
    if periode["echeance"] == "J1":
        donneesj["product"]["periods"].remove(periode)
donneesj = json.dumps(donneesj, indent=2)
#fin donnees jour en cours

donneesj = json.loads(donneesj)

for periode in donneesj["product"]["periods"]:
	for domaine in periode["timelaps"]["domain_ids"]:
		departement=str(departement)
		if domaine["domain_id"] == departement:
			donnees_bloc = domaine
			donnees_bloc = str(donnees_bloc)
			donnees_bloc = donnees_bloc.replace("\'","\"")
			break
#print(donnees_bloc)

donnees_bloc = json.loads(donnees_bloc)
color_max = donnees_bloc["max_color_id"]
#print(color_max)

resultats = {}
for item in donnees_bloc["phenomenon_items"]:
    phenomenon_id = item["phenomenon_id"]
    max_color_id = item["phenomenon_max_color_id"]
    resultats[phenomenon_id] = max_color_id

risquef = ""
for phenomenon_id, max_color_id in resultats.items():
	#print(f"Phenomenon ID {phenomenon_id}: Max Color ID {max_color_id}")
	phenomenon_id = int(phenomenon_id)
	max_color_id = int(max_color_id)
	#print(phenomenon_id,max_color_id)
	if max_color_id > 1 :
		if phenomenon_id == 1 :
			risque = "vent,"
		if phenomenon_id == 2 :
			risque = "pluie,"
		if phenomenon_id == 3 :
			risque = "orages,"
		if phenomenon_id == 4 :
			risque = "crues,"
		if phenomenon_id == 5 :
			risque = "neige%2Fverglas,"
		if phenomenon_id == 6 :
			risque = "canicule,"
		if phenomenon_id == 7 :
			risque = "grand%20froid,"
		if phenomenon_id == 8 :
			risque = "avalanches,"
		if phenomenon_id == 9 :
			risque = "vagues%20submersion,"
	else :
		risque = ""
	#print(risque)
	risquef = risquef + risque
	
risquef = risquef.rstrip(",")
#print(f"Le risque est :{risquef}")

jsnS = requests.get('http://'+IP+'/json.htm?type=command&param=getdevices&rid='+str(IDX))
dataS = jsnS.json()
risquefold = str(dataS['result'][0]['Data'])
#print(risquefold)
#print(risquefold,risquef)

if risquefold != risquef :
	c = pycurl.Curl()
	c.setopt(c.URL, 'http://'+IP+'/json.htm?type=command&param=udevice&idx='+str(IDX)+'&nvalue='+str(color_max)+'&svalue='+ str(risquef))
	c.perform()


lancer le une fois, si tous est ok vous devriez avoir ceci :

Code : Tout sélectionner


{
        "status" : "OK",
        "title" : "Update Device"
}

ensuite ajouter à cron le lancement du script :

Code : Tout sélectionner

crontab -e

Code : Tout sélectionner

0 7-23 * * * /usr/bin/python3.9 /home/pi/vigilance.py >/dev/null 2>&1
le "7-23" exécutera le script toute les heures de 7h à 23h

Re: [Python] Version Cartes Vigilance Météo 2024

Publié : 12 mars 2024, 23:39
par Keros
Merci pour ce partage.

J'ai eu des problèmes pour importer la librairie json sur mon Pi sous Bullseye.
J'ai remplacé la librairie json par simplejson et ça fonctionne.

Re: [Python] Version Cartes Vigilance Météo 2024

Publié : 13 mars 2024, 10:01
par jackslayter
j'ai modifié le script car j'ai remarqué qu'il renvoyait la vigilance J+1.
donc cela veux dire que je peux éventuellement récupérer les vigilances J et J+1

[Python] Problème script Cartes Vigilance Météo 2024

Publié : 17 oct. 2024, 11:40
par JulienS28
Bonjour à tous,

Tout d'abord merci pour le partage présent ici : viewtopic.php?p=120423#p120423.

Mais après avoir adapté le script python présent dans le tuto, j'obtiens une erreur lors de la 1ere exécution du script :

Code : Tout sélectionner

sudo python3 ./vigilance.py
Traceback (most recent call last):
  File "/home/user/domoticz/scripts/python/./vigilance.py", line 31, in <module>
    for periode in donneesj["product"]["periods"]:
KeyError: 'product'
J'ai installé le paquet simplejson car domoticz tourne sur une VM en debian11 et le paquet json n'existait visiblement pas et j'ai également déposé le script dans le répertoire "/home/user/domoticz/scripts/python" qui me semblait opportun (mais peut-être pas ?)

Pour info :

Version Python : 3.9.2
Version domoticz : 2024.7

Mon code :

Code : Tout sélectionner

#----- VARIABLES A MODIFIER -----

departement = 28 # votre numero de departement
IP = "127.0.0.1:8083" # votre IP et port de Domoticz
IDX = 5153 # l'IDX de votre capteur d'alerte
key = "XXXXXXXXXXX" # votre token type Oauth2 meteofrance

#----- FIN DES VARIABLES A MODIFIER -----

import requests
import simplejson as json
import pycurl

url = "https://portail-api.meteofrance.fr/token"
data = {"grant_type": "client_credentials"}
headers = {"Authorization": f"Basic {key}"}

get_token = requests.post(url, data=data, headers=headers)
#print(get_token.text)
token = json.loads(get_token.text)
token = token.get("access_token")

url2 = "https://public-api.meteofrance.fr/public/DPVigilance/v1/cartevigilance/encours"
headers2 = {"accept": "*/*", "Authorization": f"Bearer {token}"}

donneesfull = requests.get(url2, headers=headers2)
#print(donneesfull.text)

#donnees jour en cours
donneesj = json.loads(donneesfull.text)
for periode in donneesj["product"]["periods"]:
    if periode["echeance"] == "J1":
        donneesj["product"]["periods"].remove(periode)
donneesj = json.dumps(donneesj, indent=2)
#fin donnees jour en cours

donneesj = json.loads(donneesj)

for periode in donneesj["product"]["periods"]:
	for domaine in periode["timelaps"]["domain_ids"]:
		departement=str(departement)
		if domaine["domain_id"] == departement:
			donnees_bloc = domaine
			donnees_bloc = str(donnees_bloc)
			donnees_bloc = donnees_bloc.replace("\'","\"")
			break
#print(donnees_bloc)

donnees_bloc = json.loads(donnees_bloc)
color_max = donnees_bloc["max_color_id"]
#print(color_max)

resultats = {}
for item in donnees_bloc["phenomenon_items"]:
    phenomenon_id = item["phenomenon_id"]
    max_color_id = item["phenomenon_max_color_id"]
    resultats[phenomenon_id] = max_color_id

risquef = ""
for phenomenon_id, max_color_id in resultats.items():
	#print(f"Phenomenon ID {phenomenon_id}: Max Color ID {max_color_id}")
	phenomenon_id = int(phenomenon_id)
	max_color_id = int(max_color_id)
	#print(phenomenon_id,max_color_id)
	if max_color_id > 1 :
		if phenomenon_id == 1 :
			risque = "vent,"
		if phenomenon_id == 2 :
			risque = "pluie,"
		if phenomenon_id == 3 :
			risque = "orages,"
		if phenomenon_id == 4 :
			risque = "crues,"
		if phenomenon_id == 5 :
			risque = "neige%2Fverglas,"
		if phenomenon_id == 6 :
			risque = "canicule,"
		if phenomenon_id == 7 :
			risque = "grand%20froid,"
		if phenomenon_id == 8 :
			risque = "avalanches,"
		if phenomenon_id == 9 :
			risque = "vagues%20submersion,"
	else :
		risque = ""
	#print(risque)
	risquef = risquef + risque
	
risquef = risquef.rstrip(",")
#print(f"Le risque est :{risquef}")

jsnS = requests.get('http://'+IP+'/json.htm?type=command&param=getdevices&rid='+str(IDX))
dataS = jsnS.json()
risquefold = str(dataS['result'][0]['Data'])
#print(risquefold)
#print(risquefold,risquef)

if risquefold != risquef :
	c = pycurl.Curl()
	c.setopt(c.URL, 'http://'+IP+'/json.htm?type=command&param=udevice&idx='+str(IDX)+'&nvalue='+str(color_max)+'&svalue='+ str(risquef))
	c.perform()

Je ne comprend pas cette erreur, savez vous ce que j'aurais pu louper dans mon cas s'il vous plait ?

Merci d'avance,

Modération

Publié : 17 oct. 2024, 12:21
par Keros
Bonjour JulienS28 et bienvenu sur le forum :)

Je viens de déplacer ton message dans le sujet que tu mentionnes. Cela permet de regrouper les discussions au même endroits.
De plus, les membres ayant déjà participer au sujet on certainement une notification qui leur indiquera qu'il y a un message sur le forum concernant ce thème.

Re: [Python] Version Cartes Vigilance Météo 2024

Publié : 17 oct. 2024, 12:50
par JulienS28
Bonjour Keros et merci !

Bon j'ai finalement trouvé l'origine de mon soucis. Il s’avère que pour la clé de l'API je ne prenais pas la bonne valeur. :roll:
J’ajoutais de mon coté le token fournis par l'API...

Merci cela fonctionne correctement de mon côté maintenant !

Re: [Python] Version Cartes Vigilance Météo 2024

Publié : 17 oct. 2024, 18:06
par Keros
Merci à toi d'être revenu nous dire comment tu as solutionné ton problème.

Bonne continuation

Re: [Python] Version Cartes Vigilance Météo 2024

Publié : 18 oct. 2024, 08:07
par jackslayter
merci pour ton retour

Re: [Python] Version Cartes Vigilance Météo 2024

Publié : 13 mars 2025, 19:53
par val
Bonjour, j'essaie de mettre ce script en place en complément de l'autre mais j'ai une erreur à l’exécution.
File "vigilance.py", line 16
headers = {"Authorization": f"Basic {key}"}
SyntaxError: invalid syntax
Je vois que personne n'a eu ce problème, auriez vous une idée ?

Merci

Re: [Python] Version Cartes Vigilance Météo 2024

Publié : 13 mars 2025, 21:33
par Keros
Tu as bien renseigné ta clé dans Key ?

Tu peux nous préciser ton système et la version de python ?