Connaître la météo en Powershell (part 1)

C’est probablement le sujet de conversation universel par excellence, de par son importance sociale et économique : la météo. De nos jours, il n’est plus nécessaire de mettre le nez dehors pour savoir le temps qu’il fait ou qu’il fera : il suffit d’une connexion à Internet, car toutes les données sont disponibles en ligne ! Et plutôt que d’aller sur un site web, pourquoi ne pas écrire nous-même une petite application en Powershell pour ça ?

Dans cette série d’articles, nous allons progressivement construire une petite application sympa pour afficher le temps observé par une station météo donnée : inutile d’en acheter une, il y en a plein dans le monde et celles-ci diffusent librement leurs informations. Pour récupérer ces données, en plus d’une connexion internet et de Powershell, il va falloir deux éléments :

  • Un lieu (le plus proche possible de la station météo) : cela peut être votre ville, une autre ville, une localisation (latitude et longitude), etc. Personnellement, j’ai choisi ma bonne ville de Cergy, mais évidemment vous pouvez choisir ce que vous voulez
  • Une clé d’API pour pouvoir accéder aux données fournies par weather.com (enfin, wunderground.com mais c’est pareil)

S’inscrire sur wunderground.com

Cette opération est nécessaire pour obtenir la clé d’API, qui est unique, personnelle et soumise à conditions. Nous allons nous contenter d’une clé gratuite, qui nous donnera suffisamment d’informations intéressantes, mais wunderground.com (le site qui fournit l’API) propose des plans payants avec des données plus spécifiques. Pour vous inscrire, cliquez sur le lien suivant : https://www.wunderground.com/signup?mode=api_signup

Indiquez une adresse email valide, un mot de passe, cochez les deux cases et cliquez sur le bouton « Sign up for free« . Vous allez recevoir un mail contenant un lien d’activation de votre compte. Une fois votre compte validé,  allez sur https://www.wunderground.com/weather/api. Vous devrez remplir un formulaire avec votre nom, email, le nom de votre projet (votre application) et une raison pour laquelle vous voulez une clé développeur. Assurez-vous que cela vous coûtera bien 0$ et cliquez sur « Purchase key« . Une fois celle-ci générée, elle apparaîtra sur le site (elle fait 16 caractères hexadécimaux).

Parmi les conditions d’utilisation, votre application devra afficher le logo de Weather Underground. Nous verrons cela dans une prochaine partie de cette série d’articles. De même, votre application ne doit pas faire plus de 10 requêtes par minute (soit minimum 6 secondes entre deux requêtes), et se limiter à 500 requêtes par jour (pour un plan Stratus et une clé Developper à 0$). Si vous avez besoin de plus, vous devrez acheter une clé d’API payante.

Principe de fonctionnement

C’est assez simple : pour obtenir les données, il suffit d’appeler une URL bien formée, contenant la clé d’API et les éléments de la requête (j’y reviendrai) ainsi que le lieu qui vous intéresse. En retour, vous récupérez un fichier XML qu’il suffira de parser avec Powershell, et d’en extraire les informations qui vous intéressent. Et comme vous le savez probablement, parser du XML avec Powershell est extrêmement simple.

Dans une premier temps, nous allons nous contenter des conditions météo observées par la station. Pour les prévisions, nous verrons cela un peu plus tard. De même, pour faire simple, notre première version de l’application sera en mode console. Pour la suite, nous ferons un joli formulaire Windows, notamment parce qu’il sera nécessaire d’afficher des images…

L’URL est de la forme suivante :

http://api.wunderground.com/api/APIKEY/FEATURES/q/QUERY.xml où APIKEY est votre clé d’API, FEATURES la liste des fonctionnalités que vous voulez, et enfin QUERY le lieu désiré. J’ai choisi de récupérer un fichier XML, mais vous pouvez sinon obtenir un fichier au format JSON, il suffit de changer l’extension dans l’URL (en mettant .json au lieu de .xml).

Comme je l’ai dit plus haut, nous allons d’abord nous contenter des observations actuelles : pour cela, la fonctionnalité qui nous intéresse est « conditions ». Nous remplacerons donc « FEATURES » par « conditions » dans l’URL ! Ensuite, je veux les données pour ma bonne ville de Cergy, qui se trouve en France. Il suffit donc de mettre « France/Cergy » à la place de « QUERY ». Enfin, évidemment, il faut remplacer « APIKEY » par votre propre clé d’API. Ce qui nous donne au final l’URL suivante :

http://api.wunderground.com/api/1234567890123456/conditions/France/Cergy.xml

En Powershell, j’ai choisi de construire l’URL à l’aide de variables, que j’initialise comme ceci :

$APIkey="1234567890123456"
$query="France/Cergy"
$features="conditions"
$url="http://api.wunderground.com/api/$APIkey/$features/q/$query.xml"
$url

Pour voir à quoi ressemble le fichier XML, il suffit de copier l’URL ainsi générée et de l’ouvrir dans votre navigateur préféré, ce qui vous donnera quelque chose du genre :

Le contenu du fichier XML (sous Edge…)

Un petit rappel : un fichier XML est une arborescence : chaque noeud possède des noeud enfants, qui peuvent eux-mêmes avoir des noeuds enfants, ce qui vous nous permettre de parcourir cette arborescence pour trouver l’attribut (la valeur) qui nous intéresse. En Powershell, c’est un peu comme les propriétés d’un objet (d’ailleurs, le fichier XML sera chargé dans un objet !), et pour accéder à une valeur particulière, il faut indiquer chaque noeud dans le bon ordre :

$objet.noeud1.noeud2.noeud3.valeur

Par exemple, si je veux connaître la latitude de ma ville, je dois parcourir l’arborescence comme ceci : response, current_observation, display_location et enfin latitude. En Powershell, mon fichier XML est stocké dans l’objet $result, et donc ma latitude sera ceci :

$latitude=$result.response.current_observation.display_location.latitude

Et si j’affiche ma variable $latitude, j’ai bien :

49.041431

Donc avant d’afficher quoique ce soit, pensez à consulter l’arborescence du fichier XML, ce sera très utile. A noter que les valeurs sont parfois disponibles dans des unités différentes, par exemple les degrés Celsius (°C) ou Fahrenheit (°F), les millimètres (mm) ou les pouces (in), les miles par heure (mph) ou les kilomètres par heure (km/h)… et oui, vous pourrez choisir d’afficher des valeurs selon le système métrique (utilisé en France) ou le système impérial (utilisé aux Etats-Unis notamment), sans avoir à faire de conversion. Pratique !

Premiers résultats

Pour voir ces données, il faut d’abord créer l’objet XML, et le remplir avec le fichier XML généré par wunderground.com à l’URL que nous avons créé :

$result = New-Object System.Xml.XmlDocument
$result.Load("$url")

Comme je vous l’ai dit plus tôt, $result contient tout le fichier XML. Pour afficher les résultats, il suffit de faire une série de Write-Host (ce qui permet d’écrire une chaîne dans la console) et d’y mettre les valeurs que nous voulons. Un petit rappel en passant : quand on veut écrire la valeur d’une propriété d’un objet, il faut entourer tout ça par $() afin que ce soit correctement affiché. Voici donc le script complet (pensez à modifier la variable $APIkey) :

$APIkey="1234567890123456"
$query="France/Cergy"
$features="conditions"
$url="http://api.wunderground.com/api/$APIkey/$features/q/$query.xml"
$result = New-Object System.Xml.XmlDocument
$result.Load("$url")
Write-Host "Température actuelle : $($result.response.current_observation.temp_c)°C (ressentie : $($result.response.current_observation.feelslike_c)°C)"
Write-Host "Humidité relative : $($result.response.current_observation.relative_humidity)"
Write-Host "Direction du vent : $($result.response.current_observation.wind_dir) ($($result.response.current_observation.wind_degrees)°)"
Write-Host "Vitesse du vent : $($result.response.current_observation.wind_kph) km/h (rafales à $($result.response.current_observation.wind_gust_kph) km/h)"
Write-host "Pression : $($result.response.current_observation.pressure_mb) mb"
Write-Host "Point de rosée : $($result.response.current_observation.dewpoint_c)°C"
Write-Host "Précipitations : Aujourd'hui $($result.response.current_observation.precip_today_metric)mm, dans l'heure $($result.response.current_observation.precip_1hr_metric)mm"

Vous voyez, rien de bien compliqué, je me contente d’afficher des valeurs que j’ai été voir dans le fichier XML (par exemple, $result.response.current_observation.temp_c pour avoir la température actuelle en degrés Celsius). A vous de farfouiller le fichier XML et de choisir d’autres valeurs qui vous intéressent plus particulièrement.

En attendant d’avoir une application un peu plus évoluée, portez-vous bien et tchüss !

 

 

Montre ton amour pour Dédé en partageant cet article !

Laisser un commentaire