2021-11-19
md
Données de marée au Canada avec Python - nouvelle interface REST (mai 2021)
<-Données de marée au Canada avec Python

Dans un billet vieux de deux ans intitulé Données de marée au Canada avec Python, je déplorais la façon de fournir les données par le Web du Service hydrographique du Canada (SHC) à Pêches et Océans comme étant complexe et désuète. Jusqu'à tout récemment, ce billet n'avait suscité qu'un seul courriel d'un professeur d'informatique de l'University of New Brunswick à deux heures de route d'ici. Très gentiment, il me remerciait d'avoir présenté un exemple d'un service Web local basé sur XML/SOAP qu'il décrit comme une « technologie peu utilisée et en déclin ». Donc, nous étions au moins deux à penser que SHC pouvait faire mieux. Il semble que le poids de notre jugement s'est fait sentir jusqu'aux plus hautes sphères administratives puisque SHC a abandonné cette vieille façon de faire et offre maintenant l'accès aux données par le truchement d'une interface de programmation REST. Voici l'annonce du SHC à ce sujet dans Avis et messages importants.

2021/05/04 - Services Web et Rest-API
Nous procédons à la désactivation des services WDS (observations et prédictions) du Service hydrographique du Canada le lundi 3 mai à 12h00 HAE. Veuillez-vous référer à la page des services Web pour plus d'informations sur l'utilisation du nouveau REST-API pour un accès direct aux données officielles sur les niveaux d'eau et autres services disponibles.
consulté le 2021-10-19
Le 15 juin, lorsque ce billet était publié, le passage vers le nouveau système de publication des données n'étaient pas complétée. En outre l'avis cité ci-dessus était différent et de nombreuses stations dont la baie de Shediac (id: 5cebf1e33d0f4a073c4bc23e) qui est la plus proche n'étaient pas encore dans le nouveau système. Il semble que la transition soit complétée. Puisque cela ne change rien à l'exposition ici, le billet et les scripts python n'ont pas été modifiés.
2021-10-19

Évidemment le script Python qui obtenait l'horaire et les hauteurs des pleine et basses mers dans la Baie de Shediac puis qui les affichaient dans un dispositif virtuel de Domoticz ne fonctionne plus depuis le 3 mai.

Capture d'écran 2021-06-12

Curieux, j'ai envoyé une requête HTTP à l'adresse https://ws-shc.qc.dfo-mpo.gc.ca/predictions?wsdl comme le faisait le script avec un navigateur. La réponse est un message d'erreur HTTP 410 accompagné d'une explication assez complète sur ce qu'il faut faire pour utiliser la nouvelle interface de programmation.

En suivant les instructions, j'ai formulé une requête pour obtenir des données à partir de la nouvelle interface REST.

https://api-iwls.dfo-mpo.gc.ca/api/v1/stations/5cebf1e33d0f4a073c4bc23e/data?time-series-code=wlp-hilo&from=2021-07-01T00%3A00%3A00Z&to=2021-07-02T00%3A00%3A00Z

Il y a trois modifications par rapport à l'exemple donné.

La réponse suivante a été obtenue.

[ {"eventDate":"2021-07-01T00:28:00Z", "qcFlagCode":"2", "value":0.3, "timeSeriesId":"5d9dd7db33a9f593161c4168" }, {"eventDate":"2021-07-01T08:52:00Z", "qcFlagCode":"2", "value":1.0, "timeSeriesId":"5d9dd7db33a9f593161c4168" }, {"eventDate":"2021-07-01T16:07:00Z", "qcFlagCode":"2", "value":0.8, "timeSeriesId":"5d9dd7db33a9f593161c4168" }, {"eventDate":"2021-07-01T19:47:00Z", "qcFlagCode":"2", "value":0.9, "timeSeriesId":"5d9dd7db33a9f593161c4168" } ]

Voilà ce que je souhaitais il y a deux ans, obtenir les données au format JSON depuis une simple requête HTTP. À noter que cette dernière a été faite à l'aide du navigateur Firefox ce qui prouve qu'il n'est pas du tout nécessaire d'utiliser Microsoft Edge or Google Chrome. Pour ce qui est de l'interprétation de la valeur de clé qcFlagCode on peut consulter la page Services Web et Rest-API. On y trouve que 2 est « [u]tilisé pour les données dont les tests de contrôle de qualité n’ont pas été effectués ou l’information sur la qualité n’est pas disponible ».

Voici le script Python 3 qui obtient les temps et hauteurs des mers basses et hautes pendant une journée. Par défaut l'endroit est Cocage (N.-B.) et la période est la journée courante, mais on peut modifier ces choses avec des paramètres sur la ligne de commande.

#!/usr/bin/env python3 # coding: utf8 import argparse import time import json from datetime import datetime, timedelta from urllib.request import urlopen from urllib.parse import urlencode # Default arguments for date and timezone offset and station when = time.localtime() TZ = when.tm_gmtoff date = time.strftime("%Y-%m-%d", when) stationID = '5cebf1e33d0f4a073c4bc242' stationName = 'Cocagne' # Allow for command line options to override date, timezone, station id and station name parser = argparse.ArgumentParser(description='Obtenir les marées du Service hydrographique du Canada.') parser.add_argument('-d', '--date', help='format: YYYY-MM-DD - défaut : date courante') parser.add_argument('-z', '--timezone', type=float, help='différence avec UTC (heures, fractions permises) - défaut : '+str(TZ/(60*60))) parser.add_argument('-i', '--id', help='identité de la station (liste à https://api-iwls.dfo-mpo.gc.ca/api/v1/stations) - défaut : '+stationID) parser.add_argument('-n', '--name', help='nom géographique - défaut : '+stationName) args = parser.parse_args() if args.date: date = args.date if args.timezone: TZ = args.timezone*60*60 if args.id: stationID = args.id if args.name: stationName = args.name if (not stationID): print("La station n'est pas identifée") exit(1) # Need UTC time for start and end of the date start_dt = datetime.strptime(date + " 00:00:00", "%Y-%m-%d %H:%M:%S") - timedelta(seconds=TZ) end_dt = datetime.strptime(date + " 23:59:59", "%Y-%m-%d %H:%M:%S") - timedelta(seconds=TZ) # Convert the times to ISO 8601 strings as needed for the HTTP request sdt = start_dt.strftime("%Y-%m-%dT%H:%M:00Z") edt = end_dt.strftime("%Y-%m-%dT%H:%M:00Z") resturl = 'https://api-iwls.dfo-mpo.gc.ca/api/v1/stations/{}/data?time-series-code=wlp-hilo&{}&{}'.format( stationID, urlencode({'from':sdt}), urlencode({'to':edt})) # Obtain JSON data from CHS data = {} with urlopen(resturl) as hf: data = json.loads(hf.read().decode('utf-8')) if not data: print('Données non disponibles') exit(2) # print title if stationName: s = 'Marée, {}, {}'.format(stationName, date) else: s = 'Marée {}'.format(date) print(s) for x in data: dt = datetime.strptime(x['eventDate'], "%Y-%m-%dT%H:%M:00Z") + timedelta(seconds=TZ) print(dt, ' ', str(x['value']), 'm')

Deux exemples.

michel@hp:~$ python3 tide4_fr.py -d 2021-07-01 Marée, Cocagne, 2021-07-01 2021-07-01 05:52:00 1.0 m 2021-07-01 13:07:00 0.8 m 2021-07-01 16:47:00 0.9 m 2021-07-01 21:57:00 0.5 m michel@hp:~/$ python tide4_fr.py -i 5cebf1de3d0f4a073c4bb979 -n Comox -z -7 Marée, Comox, 2021-06-15 2021-06-15 04:30:00 3.537 m 2021-06-15 08:11:00 3.878 m 2021-06-15 15:41:00 1.102 m 2021-06-15 23:20:00 4.819 m

python est un lien symbolique vers python3 sur mon système (voir Péripéties avec python-is-python). Le numéro d'identité de la station à Comox en Colombie-Britannique a été obtenu en faisant une recherche dans la liste disponible ici: https://api-iwls.dfo-mpo.gc.ca/api/v1/stations. La carte Stations peut aider, mais elle n'affiche pas l'identité des stations, seulement leur nom et code. Il a été possible de vérifier ces résultats à partir de tableaux disponibles ailleurs sur le site de Pêches et Océans Canada.

Cocagne, 2021-07-01
HeureHauteur
HAA(m)(pi)
05:521.03.3
13:070.82.6
16:470.93.0
21:570.51.6
Comox, 2021-06-15
HeureHauteur
HAP(m)(pi)
04:303.511.5
08:113.912.8
15:411.13.6
23:204.815.7

On peut télécharger le script Python: tide4_fr.py.

On peut aussi télécharger un script Python semblable, tide5.py, qui transmet les données à un serveur Domoticz pour affichage dans un dispositif texte. Le script original exécuté sur le coup de minuit, mettait à jour les données pour la journée complète comme on peut voir dans la capture d'écran au début du billet. Le nouveau script est exécuté quatre fois par jour et affiche les mers pleines et basses sur une période de 24 heures commençant 8 heures avant le moment de l'exécution.

<-Données de marée au Canada avec Python