Le WIS2 Downloader est une application Python basée sur Flask qui vous permet de vous connecter à un courtier mondial WIS2, de gérer les abonnements aux hiérarchies de sujets et de configurer leurs répertoires de téléchargement associés.
/metrics
, idéal pour la visualisation Grafana.python -m pip install wis2downloader
Créez un fichier config.json
dans votre répertoire local conforme au schéma suivant :
schema :
type : object
properties :
base_url :
type : string
description :
Base URL for the wis2downloader service.
example : http://localhost:5050
broker_hostname :
type : string
description : The hostname of the global broker to subscribe to.
example : globalbroker.meteo.fr
broker_password :
type : string
description : The password to use when connecting to the specified global broker.
example : everyone
broker_port :
type : number
description : The port the global broker is using for the specified protocol.
example : 443
broker_protocol :
type : string
description : The protocol (websockets or tcp) to use when connecting to the global broker.
example : websockets
broker_username :
type : string
description : The username to use when connecting to the global broker.
example : everyone
download_workers :
type : number
description : The number of download worker threads to spawn.
example : 1
download_dir :
type : string
description : The path to download data to on the server/computer running the wis2downloader.
example : ./downloads
flask_host :
type : string
description : Network interface on which flask should listen when run in dev mode.
example : 0.0.0.0
flask_port :
type : number
description : The port on which flask should listen when run in dev mode.
example : 5050
log_level :
type : string
description : Log level to use
example : DEBUG
log_path :
type : string
description : Path to write log files to.
example : ./logs
min_free_space :
type : number
description :
Minimum free space (GB) to leave on download volume / disk after download.
Files exceeding limit will not be saved.
example : 10
save_logs :
type : boolean
description : Write log files to disk (true) or stdout (false)
example : false
mqtt_session_info :
type : string
description :
File to save session information (active subscriptions and MQTT client id) to.
Used to persist subscriptions on restart.
example : mqtt_session.json
validate_topics :
type : boolean
description : Whether to validate the specified topic against the published WIS2 topic hierarchy.
example : true
Un exemple est donné ci-dessous :
{
"base_url" : " http://localhost:5050 " ,
"broker_hostname" : " globalbroker.meteo.fr " ,
"broker_password" : " everyone " ,
"broker_port" : 443 ,
"broker_protocol" : " websockets " ,
"broker_username" : " everyone " ,
"download_workers" : 1 ,
"download_dir" : " downloads " ,
"flask_host" : " 0.0.0.0 " ,
"flask_port" : 5050 ,
"log_level" : " DEBUG " ,
"log_path" : " logs " ,
"min_free_space" : 10 ,
"mqtt_session_info" : " mqtt_session.json " ,
"save_logs" : false ,
"validate_topics" : true
}
Linux (bash)
export WIS2DOWNLOADER_CONFIG= < path_to_your_config_file >
Windows (invite de commande)
set WIS2DOWNLOADER_CONFIG= < path_to_your_config_file >
Windows (PowerShell)
$env :WIS2DOWNLOADER_CONFIG = < path_to_your_config_file >
Mode développement (Windows et Linux)
wis2downloader
Utiliser Gunicorn (Linux uniquement)
gunicorn --bind 0.0.0.0:5050 -w 1 wis2downloader.app:app
Remarque : Un seul travailleur est pris en charge en raison du téléchargement de threads supplémentaires et de la persistance des connexions MQTT.
L'application Flask devrait maintenant être en cours d'exécution. Si vous devez arrêter l'application, vous pouvez le faire dans le terminal avec Ctrl+C
.
La définition de l'API du téléchargeur peut être trouvée au point de terminaison /swagger
, lorsqu'il est exécuté localement, voir [http://localhost:5050/swagger]. cela inclut la possibilité d'essayer les différents points de terminaison.
Les abonnements peuvent être ajoutés via une requête POST au point de terminaison /subscriptions
. Le corps de la requête doit être codé en JSON et respecter le schéma suivant :
schema :
type : object
properties :
topic :
type : string
description : The WIS2 topic to subscribe to
example : cache/a/wis2/+/data/core/weather/surface-based-observations/#
target :
type : string
description : Sub directory to save data to
example : surface-obs
required :
- topic
Dans cet exemple, toutes les notifications publiées sur le sujet surface-based-observations
à partir de n'importe quel centre WIS2 seront abonnées, les données téléchargées étant écrites dans le sous-répertoire surface-obs
du download_dir
.
Remarques :
target
n'est pas spécifiée, le sujet sur lequel les données sont publiées sera par défaut.+
est utilisé pour spécifier n'importe quelle correspondance à un seul niveau, correspondant au centre WIS2 dans l'exemple ci-dessus.#
correspond à n’importe quel sujet au niveau ou en dessous du niveau auquel il se produit. Dans l'exemple ci-dessus, tout sujet publié sous cache/a/wis2/+/data/core/weather/surface-based-observations sera mis en correspondance. curl -X ' POST '
' http://127.0.0.1:5050/subscriptions '
-H ' accept: application/json '
-H ' Content-Type: application/json '
-d ' {
"topic": "cache/a/wis2/+/data/core/weather/surface-based-observations/#",
"target": "surface-obs"
} '
Les abonnements sont supprimés via une requête DELETE au point de terminaison /subscriptions/{topic}
où {topic}
est le sujet dont vous souhaitez vous désabonner.
curl -X DELETE http://localhost:5050/subscriptions/cache/a/wis2/%2B/data/core/weather/%23
Cela annule l'abonnement cache/a/wis2/+/data/core/weather/#
. Notez la nécessité d'encoder l'URL des symboles +
( %2B
) et #
( %23
).
Les abonnements actuels peuvent être répertoriés via une requête GET au point de terminaison /subscriptions
.
curl http://localhost:5050/subscriptions
La liste des abonnements actifs doit être renvoyée sous forme d'objet JSON.
Les métriques Prometheus pour le téléchargeur sont trouvées via une requête GET adressée au point de terminaison /metrics
.
curl http://localhost:5050/metrics
Tous les bugs, améliorations et problèmes sont gérés sur GitHub.