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

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.
jackslayter
Messages : 1040
Inscription : 30 sept. 2014, 14:40
Localisation : Isère (38)

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

Message 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é 2885 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é 2885 fois
Ensuite cliquer sur votre nom d'utilisateur et ensuite sur "MES API"
vigi2.png
vigi2.png (17.29 Kio) Consulté 2885 fois
Et cliquer sur "Générer Token"
vigi3.png
vigi3.png (41.33 Kio) Consulté 2885 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é 2885 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
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
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

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

Message 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.
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: [Python] Version Cartes Vigilance Météo 2024

Message 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
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
JulienS28
Messages : 2
Inscription : 17 oct. 2024, 09:29

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

Message 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,
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Modération

Message 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.
JulienS28
Messages : 2
Inscription : 17 oct. 2024, 09:29

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

Message 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 !
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

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

Message par Keros »

Merci à toi d'être revenu nous dire comment tu as solutionné ton problème.

Bonne continuation
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: [Python] Version Cartes Vigilance Météo 2024

Message par jackslayter »

merci pour ton retour
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
val
Messages : 27
Inscription : 29 déc. 2021, 02:49

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

Message 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
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

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

Message par Keros »

Tu as bien renseigné ta clé dans Key ?

Tu peux nous préciser ton système et la version de python ?
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
Répondre