Prévisions
de pluie


à 1 heure

 

 

Météo France propose :

la prédiction (à 1 heure) de pluie pour grand nombre de communes, il est alors facile d’ajouter une icône sur la page d’accueil qui apparait si la pluie est annoncée.
- en utilisant l'API de Météo France ou les prévisions de météo France affichées sur différents sites

mf46

 

Pas besoin de passer par domoticz si l’on utilise une custom page

 

1ère Solution (sans API):

Jusqu'en Aout 2020 L'API était gratuite :
http://www.meteofrance.com/mf3-rpc-portlet/rest/pluie/XXXXXX
en rouge le N° Insee de la commune +0

j'ai donc , en attendant une nouvelle API, crée un script PHP pour récupérer les prévisions de pluie à partir du site de meteo.orange ; ce script renvoie à ma page perso un fichier json pour l'affichage de la prévision.
La page html reçu de météo France avec ce lien : https://meteo.orange.fr/meteo/fragments/rain/city/24454

février 2022 :Orange utilise l'API de météo sur son site et la page https://meteo.orange.fr/meteo/fragments/rain/city/ n'est plus accessible
j'ai donc sur le même principe utilisé les prévisions de puie du site lameteoagricole.net

ma1

Je n'ai récupérer que les informations principales pour l'heure à venir mais il est possible de récupérer d'autres prévisions.

 

la fonction PHP qui récupère les prévisions:

 

//METEO FRANCE PLUIE prévisions 1 heure
function app_met($choix){
// ne fonctionne plus---------------------------------------------------------------------------	
https://meteo.orange.fr/meteo/fragments/rain/city/xxxxxx";
//--------------------------------------------------------------------
$img_icones = VARDOMOTICZ_IMG;$test ="pas de pluie"; $info=array();	
switch ($choix) {
case "1"://----ce n' est plus du Json mais du HTML-----------------------------------------------------
$url="https://www.lameteoagricole.net/meteo-heure-par-heure/Saint-Martin-de-Gurson-24610.html";
$strResult = implode("",file($url));
$maj = explode('<div class="fond2"',$strResult);$t=$maj[1];$maj = explode('Dernière',$t);$t=$maj[1];$maj = explode('</i>',$t);
$tab = explode('width="63">',$strResult);
$t=$tab[193];$ta= explode('<span style="color:#000000">',$t);$t=$ta[1];$ta= explode('</span>',$t);$pluiemm=$ta[0];
$t=$tab[73];$ta = explode('</td>',$t);$date=$ta[0];
$t=$tab[1];$ta = explode('</td>',$t);$jour=$ta[0];
$t=$tab[241];$ta = explode('</td>',$t);$pourcent=$ta[0];// test_pluie
$t=$tab[145];$ta = explode('<br /><i>',$t);$temp=$ta[0];
if ($pourcent=="0%"){$info['test_pluie']=$test;$im="pas_pluie";}
else {$im="pluie";}
$info['titre']=$maj[0]; $txtimg = sql_variable(1,$im);$info['img_pluie']=$txtimg['image'];
$info['maj']=$date;$info['jour']=$jour;$info['pourcent']=$pourcent;$info['temp']=$temp;$info['mm']=$pluiemm;
break; default: $info['test_pluie']="pas d'infos"; } return $info; } //-----------------------------------

ma2

ma3

ma4

Une commande switch est utilisée alors qu'il n'y a qu'une option mais ainsi il sera possible d'y ajouter facilement une autre solution (voir plus loin).
Pour le choix de l'image (pluie ou pas de pluie) on utilise une base de données qui est déjà utilisée pour les poubelles, la fosses septique,...

Le fichier json envoyé en retour

mf1

Comme en ce mois d’aout , il fait beau ,difficile de tester le programme pour afficher la pluie aussi j’ai ajouter une icône ombrelle pour les tests;
elle peut rester définitivement lorsqu’il n'y a pas de pluie.mf

 

 

le fichier ajax.php ,

interface entre le script jquery et la fonction PHP;
Ce fichier n'est pas indispensable si le script jquery envoie directement la requête à la fonction PHP; dans ce cas il faut ajouter à cette fonction ,un "echo" de l'encodage json(ce que fait ajax.php au lieu d'un "return").

mf3

 

 

Dans la page d' accueil

on ajoute des <id ,pour afficher l'image et un texte :

mf7

Sans oublier d'ajouter le style css:

mf8

télécharger télécharger les images .svg  pluie pas de pluie pas de pluie

 

 

le fichier footer.php ,l'appel en ajax

 

pluie('1');var texte_pluie;
function pluie(idx){
  $.ajax({
    type: "GET",
    dataType: "json",
    url: "ajax.php",
    data: "app=infos_met&variable="+idx,
    success: function(html){
		var maj = html.maj;
		var titre = html.titre; 
		var test_pluie = html.test_pluie;
		var img_pluie = html.img_pluie
		if(test_pluie=="pas de pluie"){texte_pluie=titre; 
									   document.getElementById("pluie").style.display = "block";document.getElementById('pluie').innerHTML ='<img src="'+img_pluie+'" alt="pluie">';
									   document.getElementById("txt_pluie").style.display = "none";}
		else {document.getElementById("pluie").style.display = "block";
			  document.getElementById('pluie').innerHTML ='<img src="'+img_pluie+'" alt="pluie">';
			texte_pluie=titre; 
			document.getElementById('txt_pluie').innerHTML ='<a href="#accueil">'+maj+'<</a>';
			document.getElementById("txt_pluie").style.display = "block";}
	       } });
	 setTimeout(pluie, 3600000, '1');   
		};
		$("#txt_pluie").click( function() { alert(texte_pluie); });

en rouge ,l'utilisation de la réponse, le contenu du json.
en bleu : un clic sur le texte ouvre une fenêtre pour plus d'infos

mf4

 

 

 

2eme Solution (avec la nouvelle API):

Avec cette API ,il faut ajouter comme données la Lat et la Long ; le token est toujours le même (combien de temps !!!!!)
Pour en savoir plus sur l'accès aux données de Météo France : https://donneespubliques.meteofrance.fr/client/gfx/utilisateur/File/documentation-webservices-inspire.pdf

Météo France : "Une clé a une durée de validité illimitée, jusqu’à la révocation des droits d’accès à la ressource"

https://rpcache-aa.meteofrance.com/internet2018client/2.0/nowcast/rain?lat=44.952602&lon=-0.107691&token=__Wj7dVSTjV9YGu1guveLyDq0g7S7TfTjaHBTPTpO0kj8__

Aperçu du fichier json reçu:

mf6

 

La fonction PHP de la première solution complétée:

Comme la durée de cette API est incertaine ,il est bon de pouvoir utiliser les 2 solutions; la 3eme solution , une API écrite en python, utilise le même token

 

//METEO FRANCE PLUIE prévisions 1 heure
function app_met($choix){//return $resultat="pas d'infos";
$img_icones = VARDOMOTICZ_IMG;$test ="pas de pluie"; $info=array();	
switch ($choix) {
    case "1"://----ce n' est plus du Json mais du HTML-----------------------------------------------------
		$url="https://meteo.orange.fr/meteo/fragments/rain/city/24454";
		$strResult = implode("",file($url));
		$tab = explode('<span class="text-raining-umbrella">',$strResult);
		$t=$tab[1];$tab = explode('</span>',$t);$t1=$tab[0];// test_pluie
		$tab = explode('<div class="city-cell very-big">',$t);
		$t=$tab[1];$tab = explode('</div>',$t);$t2=$tab[0];//date actualisation
		$t4=stristr($t1, 'p');$t3 = str_split($t4, 3);
		 if ($t3[0]=="pas"){$info['test_pluie']=$test;$info['img_pluie']=$img_icones["pas_pluie"];}
		 else $info['img_pluie']=$img_icones["pluie"];
		$info['titre']=$t1;
		$info['maj']=$t2;
	break;
    case "2":		
		$url="https://rpcache-aa.meteofrance.com/internet2018client/2.0/nowcast/rain?lat=44.952602&lon=-0.107691&token=__Wj7dVSTjV9YGu1guveLyDq0g7S7TfTjaHBTPTpO0kj8__";
		$json_string = file_get_curl($url);$result = json_decode($json_string,true);
		$info['maj']=$result['update_time'];
		$json=$result['properties']['forecast'];
		$n=0;	
		while (isset($json[$n]['time']))
		{$info[$n]['rain_intensity']=$json[$n]['rain_intensity'];
		if ($json[$n]['rain_intensity'] >1) {$test="pluie";}
		 $info[$n]['time']=$json[$n]['time'];
		 $info[$n]['rain_intensity_description']=$json[$n]['rain_intensity_description'];
		$n++;
		}
		if ($test=="pas de pluie") {$info['test_pluie']=$test;$info['img_pluie']=$img_icones["pas_pluie"];$info['titre']="";}
		else {$info['test_pluie']=$test;$info['img_pluie']=$img_icones["pluie"];$info['titre']="Prévision de pluie";}
		break;
	default:
		$info['test_pluie']="pas d'infos";
}
return $info;
}
//-----------------------------------

mf10

la valeur "titre" du fichier json n'a pas d'importance, car avec cette version une analyse générale de la prochaine heure n'existe pas;
la description existe pour chaque 5 minutes puis chaque 10 minutes;
je n'ai pas récupéré ces infos mais elles figurent dans la réponse de la requête ajax et sont donc facilement exploitables.

 

 

Le script ajax (appel ajax et traitement de la réponse) n'est pas modifié mais l'appel à cette fonction est :

pluie("2")     //au lieu de pluie("1")

Le fichier json reçu par la fonction infos_met() :

mf9

 

 

Une autre solution : le package meteofrance-api

écrit en python il permet de gérer la communication avec l'API non publique de Météo-France
https://pypi.org/project/meteofrance-api/
...c'est ici que l'on trouve la clé(token) de la 2eme solution.

mf11

mf31

mf34

L'nstallation du client permet :

- Rechercher des lieux de prévisions.
- Accéder aux prévisions météorologiques horraires ou quotidiennes.
- Accéder aux prévisions de pluie dans l'heure quand disponibles.
- Accéder aux alertes météo pour chaque département français

 

si pip ou pip3 n'est pas installé , l'installer:

 

sudo apt install python3-pip

mf12

on vérifie l’ installation :

pip3 --version

mf13

Installation du package meteofrance-api :

sudo pip3 install meteofrance-api

mf14

mf15

Emplacement du package :

mf16

 

Installer : mf16 https://pypi.org/project/requests-mock/

sudo pip3 install request-mok 1.8.0

mf32

 

 

Installer pytest

c'est un framework qui permet de faire des tests , de vérifier par exemple si des conditions sont vraies ou fausses dans une fonction ,etc....
Pytest va permettre de vérifier l'intégration de meteofrance-api avec le script "test_integations.py".

 

>

pytestinstallation

 

sudo pip3 install -U pytest

mf17

mf18

 

 

Sur github : télécharger le dossier https://github.com/hacf-fr/meteofrance-api

mf19

Vérification de l'intégration :

 

avec test_integration.py

Avec Nano , ouvrir le fichier avec notepad++ , et copier son contenu :

mf20

sudo nano test_integrations.py

mf22

CTRL O, ENTER, CTRL X

ou avec Filezilla

mf23

modifier les autorisations :

sudo chmod	755 test_integrations.py

mf24

Le 10/10/2020 Sur Github il est indiqué une modification récente du fichier '__init__.py' ; après vérification , il s'avère que cette modification n'a pas encore été réalisée dans le package téléchargé , il faut donc modifier ce fichier.

par contre ,les fichiers du dossier "src" du dossier "meteofrance-api-master" sont à jour .

mf26

mf25

TEST :

pytest

mf27

 

 

Vérification des autres tests:

 

avec test_place.py , test_rain.py,.....et les autres

Comme pour test_integrations.py ,avec FileZilla copier dans votre répertoire (home/user) tous les autres fichiers contenus dans le répertoire "meteofrance/test".

mf35

Modifier les autorisations, c'est possible avec FileZilla , sinon avec chmod avec la console.

mf29

TESTS:

pytest

mf30

En utilisant cette API :
exemple de script en bash pour les prévisions météo et de pluie: met.py

# coding: utf-8
"""Tests Météo-France module."""
import time
from const import BERGERAC
from meteofrance import MeteoFranceClient
from meteofrance.helpers import readeable_phenomenoms_dict


#Test classical workflow usage with the Python library.
    # Init client
client = MeteoFranceClient()

    # Search a location from name.
list_places = client.search_places("Bergerac")
my_place = list_places[0]
print (my_place)
    # Fetch weather forecast for the location
my_place_weather_forecast = client.get_forecast_for_place(my_place)
now_ts = int(time.time())

    # Get the daily forecast
my_place_daily_forecast = my_place_weather_forecast.daily_forecast
for i in range(15):  # pour i allant de 0 à 15
    print (my_place_daily_forecast[i])

    # If rain in the hour forecast is available, get it.
if my_place_weather_forecast.position["rain_product_available"] == 1:
        my_place_rain_forecast = client.get_rain(my_place.latitude, my_place.longitude)
        next_rain_dt = my_place_rain_forecast.next_rain_date_locale()
        if not next_rain_dt:
            rain_status = "No rain expected in the following hour."
        else:
            rain_status = next_rain_dt.strftime("%H:%M")
else:
    rain_status = "No rain forecast availble."
    
    # Fetch weather alerts.
if my_place.admin2:
        my_place_weather_alerts = client.get_warning_current_phenomenoms(
            my_place.admin2
        )
        readable_warnings = readeable_phenomenoms_dict(
            my_place_weather_alerts.phenomenons_max_colors
        )

        print (rain_status)

mf36

Le fichier de configuration concernant le lieu: const.py ,

la ville de Bergerac est ajoutée:

 

"""Météo-France API test constants."""
from meteofrance.model.place import PlaceData

BERGERAC: PlaceData = {
    "insee": "24037",
    "name": "Bergerac",
    "lat": 44.85,
    "lon": 0.4833,
    "country": "FR",
    "admin": "Aquitaine",
    "admin2": "33",
    "postCode": "24100",
}

mf38

Exécution du script:

python3.7 met.py

mf37

On peut récupérer seulement les infos que l'on souhaite, ici la date:

for i in range(15):  # pour i allant de 0 à 15
    print (my_place_daily_forecast[i]['dt'])

mf42

 

On récupère un dictionnaire python......il faut maintenant:
- soit créer un capteur virtuel dans Domoticz pour afficher les données
-soit les récupérer dans une page perso

La prévision de pluie n'est qu'une simple information , pour avoir une prévision de pluie plus précise comme les scripts précédents , il est possible de récupérer un fichier json ...voir ci-dessous.

 

 

3eme solution pour une prévision de pluie

De la même façon que pour la prévision météo pour une ville décrite ci-dessus, voici la prévision de pluie pour lieu (lat , lon)

le script python pluie.py qui affiche du json

#!/usr/bin/env python3.7
# coding: utf-8
"""Tests Météo-France module. Forecast class."""
import json

from meteofrance import MeteoFranceClient
from meteofrance.const import METEOFRANCE_API_URL

"""rain forecast on a covered zone."""
client = MeteoFranceClient()
rain = client.get_rain(latitude=48, longitude=-0.5)
 
print (json.dumps(rain.forecast))

mf39

Pour enregistrer le dictionnaire dans un fichier json:

#!/usr/bin/env python3.7
# coding: utf-8
"""Tests Météo-France module. Forecast class."""
import json

from meteofrance import MeteoFranceClient
from meteofrance.const import METEOFRANCE_API_URL

"""rain forecast on a covered zone."""
client = MeteoFranceClient()
rain = client.get_rain(latitude=48, longitude=-0.5)

with open('data.json', 'w') as fp:
    json.dump(rain.forecast, fp)

mf41

Il nous reste à écrire 2 autres solutions à partir du fichier "data.json":
- soit une solution qui peut être mise en œuvre sans Domoticz ; une page perso gère tout le processus et une tache Cron exécute le fichier python (résultat de l'API) pour l' envoi du fichier json.
l'API meteofrance-api sera installée sur le serveur de la page perso ou est installé aussi PHP.

- soit à partir de Domoticz et lua; lua va demander l’exécution du fichier python et en retour enregistrer les valeurs dans domoticz....qui peuvent éventuellement être récupérées dans une page perso.
l'API meteofrance-api sera installée sur le serveur de Domoticz.
cette solution évite la programmation d'une tache CRON.

- une solution intermédiaire , pour afficher la prévision sur une page perso sans effectuer une tache Cron c'est passer par Domoticz pour lancer le sript python qui récupère le fichier json; voir en fin d'article comment opérer.
l'API meteofrance-api sera dans ce cas installée sur le serveur de Domoticz

 

Solution autonome"

:on ajoute case 3: à la fonction app_met($choix)


case "3":
$json_string = file_get_contents("data.json");
$result = json_decode($json_string,true);
$n=0;
while (isset($result[$n]['dt'])){
$result[$n]['dt']=gmdate("d-m-Y/H:i", $result[$n]['dt']);
$n++;
}
$info=$result;	
	break;

mf43

le retour de l'appel ajax dans ma page perso pour cette solution:

mf44

Il ne reste plus qu'à afficher clairement le résultat ;
pour effectuer une tache CRON , voir ce lien.

 

 

A partir de lua de Domoticz :

on récupère le fichier json avec un script python identique à la version précédente en modifiant le nom des répertoires.

with open('/home/USER/data.json', 'w') as fp:
    json.dump(rain.forecast, fp)

 

Programme Lua:

pour utiliser la date , voir ces différentes pages concernant les poubelles , la fosses septique ,la mise à jour de la date,....

lexique Météo France pour la valeur "rain": indice des pluies

1 , pas de précipitations
2 , Faibles	
3 , Modérées
4 , Fortes 
5 , Indisponibles

 

Le script pour afficher dans le log les valeurs :

il s'insère dans script qui gère déjà la date et d'autres utilisations ....

télécharger .....mon script complet à télécharger

la partie du script concernée ici:

.
ind_pluie={"Pas de précipitation", "Faibles","Modérées","Fortes","Indisponible"}
local minutes = os.date("%M") --m%M Minute (00..59)
  if (minutes == "12") then 
       os.execute("python3.7 /home/michel/domoticz/scripts/pluie.py  >> /home/michel/pluie.log 2>&1");
        print(time.."..  pluie .. ");  
        json = (loadfile "/home/michel/domoticz/scripts/lua/JSON_2014.lua")()  
        local j_json='/home/michel/data.json'

    local file = assert(io.open(j_json, "r"))
    local json_text = file:read("*all")
    file:close()
    local Dat = json:decode(json_text)
    
    for k,v in pairs(Dat) do
       local date=(os.date('%Y-%m-%d %H:%M:%S', v.dt))
        for index, value in ipairs(ind_pluie) do
            if (index == v.rain)  then pluie=value
            end
        description=v.desc
        print("date:"..time.."pluie:"..pluie..","..description);
        end
    end
  end 

mf47

Le fichier log :

mf48

Au lieu de faire un print des données , il est facile à présent de commander ou d'afficher ces valeurs.

 

 

Page perso: Lua remplace Cron

dans ce cas le fichier "data.json" doit être chargé dans le répertoire "/home/USER/domoticz/www"
modification du script "python.py":

with open('/home/USER/domoticz/www/data.json', 'w') as fp:
    json.dump(rain.forecast, fp)

 

Le fichier PHP :

case "4":// même solution que case 3 mais data.json se trouve dans Domoticz
	 $url="http://192.168.1.75:8082/data.json";
	 $json_string = file_get_curl($url);
	//$json_string = file_get_contents($url);
	$result = json_decode($json_string,true);
	$n=0;
	while (isset($result[$n]['dt'])){
	$result[$n]['dt']=gmdate("d-m-Y/H:i", $result[$n]['dt']);
	$n++;
	}
	$info=$result;	
	break;

mf49

file_get_contents() fonctionne bien sur un même serveur mais sur des serveurs différents : utiliser CURL

la fonction file_get_curl:

function file_get_curl($L){	
$curl = curl_init($L);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
return curl_exec($curl);	
}

 

 

 

4eme solution pour une prévision de pluie simple

inspiré de la 3eme solution et donc de meteofrance-api;
on récupère uniquement l'info de pluie : l'heure de la pluie prochaine ou "pas de pluie"
seul le script python est différent
le script 'pluie-simple.py':

#!/sur/bin/en python3.7
# coing: utf-8
"""Tests Météo-France module. Forestière clac."""
import json
import item
froc cons import BERGERAC
from meteofrance import MeteoFranceClient

from meteofrance import MeteoFranceClient
from meteofrance.const import METEOFRANCE_API_URL

"""rain forecast on a covered zone."""
client = MeteoFranceClient()
    # Search a location from name.
list_places = client.search_places("Bergerac")
my_place = list_places[0]
print (my_place)
    # Fetch weather forecast for the location
my_place_weather_forecast = client.get_forecast_for_place(my_place)
now_ts = int(time.time())
 # If rain in the hour forecast is available, get it.
if my_place_weather_forecast.position["rain_product_available"] == 1:
     my_place_rain_forecast = client.get_rain(my_place.latitude, my_place.longitude)
     next_rain_dt = my_place_rain_forecast.next_rain_date_locale()
     if not next_rain_dt:
            rain_status = "No rain expected in the following hour."
     else:
            rain_status = next_rain_dt.strftime("%H:%M")
else:
        rain_status = "No rain forecast availble."
 
print (json.dumps(rain_status))

mf50

Pour l'envoyer à Domoticz ......with open('/home/................);

pour le reste, s'inspirer de la 3eme solution.

 

 

 

Personnellement , j'utilise la 1ere solution (tant que Météo France ne modifiera pas le contenu de sa page météo) car je n'utilise pas la prévision pour gérer des appareils mais simplement comme une information.
Merci au développeur de meteofrance-api pour son travail réalisé pour Home Assistant et utilisable aussi dans Domoticz ou dans une page perso.
J'utilise l'API de Météo Concept pour les prévisions météo mais si cette API devenait payante j'utiliserai cette API que je connais un peu désormais .

 

 

crée le 11/10/2020
maj 25/10/2020 les données de meteofrance-api exploitées dans Domoticz ou une page perso
maj 31/10/2020 ajout image pas_pluie1.svg
maj 12/02/2022 modification du script avec les infos html

page:29