Recherche la liste des paramètres d'url

Bonjour,

je dispose d’une station météo Bresser 5in1. Le fabricant a supprimé du firmware «pro weatherlink» la possibilité d’utiliser une url custom pour l’envoi des données. On est donc limité à l’envoi vers wunderground et weathercloud. La fonction ne semble pas juste masquée dans l’interface web de config, mais bien virée du firmware (il me faudrait le code source d’une page config d’une station ayant l’url custom pour chopper le nom des variables et tenter une injection de code, mais c’est un autre sujet).

J’ai donc fait un script shell (mais qui pourrait se faire aussi en php) qui permet de récupérer depuis wunderground les infos de n’importe quelle station disponible, dès lors qu’on en connait l’identifiant. J’utilise les données publiques de leur site web, ce qui évite de payer un accès API chez weathercloud. Je n’ai pas détecté de limites temporelles pour obtenir ces données, j’ai testé avec un rythme de 1 accès par 5mn (la météo chez moi ne change pas si vite, ma station envoie toutes les 10 ou 15 minutes, il me semble)
J’ai les infos en json ou en xml, au choix, unités SI ou US au choix également. La seule dépendance coté soft, c’est curl, et il faut évidement un accès internet. Le script n’est pas obligatoirement sur la machine Jeedom, il peut tourner sur n’importe quel machine linux et probablement aussi sur Mac tant qu’on a bash et curl.

Pour intégrer ces données dans Jeedom, je pourrais me créer un virtuel, ajouter une par une toutes les infos, relever leurs ID et faire en sorte que mon script remplisse ces ID. Sauf que si je veux rajouter une autre station ou l’installer sur un autre jeedom, il me faut recommencer et ce n’est pas super portable.

Du coup, je me dis que ce serais plus simple de me reposer sur un plugin existant dont je n’aurais qu’à appeler l’URL depuis mon script via un cron régulier. Mais je ne connais pas le format attendu. @lunarok, pouvez-vous me fournir la liste des paramètres attendus par votre plugin pour que je simule l’envoi ? Est-ce qu’il crée automatiquement la station selon son code ou faut-il le faire au préalable ? Gère-t-il plusieurs stations ?
Mon script pourrait rendre «compatible» avec le plugin PWS pas mal de stations météo, dès lors qu’elle sont compatibles wunderground.

Exemple de données que mon script extrait (ici en json):

{"observations":[{"stationID":"IBIHOR1","obsTimeUtc":"2021-01-12T12:56:06Z","obsTimeLocal":"2021-01-12 13:56:06","neighborhood":"Bihorel","softwareType":null,"country":"FR","solarRadiation":null,"lon":1.117325,"realtimeFrequency":null,"epoch":1610456166,"lat":49.456165,"uv":null,"winddir":null,"humidity":96.0,"qcStatus":1,"metric":{"temp":9.5,"heatIndex":9.5,"dewpt":9.0,"windChill":9.5,"windSpeed":2.7,"windGust":2.7,"pressure":1019.64,"precipRate":null,"precipTotal":null,"elev":0.0}}]}

Je peux aussi extraire toutes les données journalières (je vais pas les mettre ici, trop de données), ou des résumé de la journée:

{"summaries":[{"stationID":"IBIHOR1","tz":"Europe/Paris","obsTimeUtc":"2021-01-12T13:04:54Z","obsTimeLocal":"2021-01-12 14:04:54","epoch":1610456694,"lat":49.456165,"lon":1.117325,"solarRadiationHigh":null,"uvHigh":null,"winddirAvg":null,"humidityHigh":96.0,"humidityLow":90.0,"humidityAvg":94.6,"qcStatus":1,"metric":{"tempHigh":9.6,"tempLow":6.2,"tempAvg":7.4,"windspeedHigh":17.9,"windspeedLow":0.0,"windspeedAvg":6.0,"windgustHigh":24.8,"windgustLow":0.0,"windgustAvg":6.6,"dewptHigh":9.0,"dewptLow":4.9,"dewptAvg":6.6,"windchillHigh":9.6,"windchillLow":3.6,"windchillAvg":6.6,"heatindexHigh":9.6,"heatindexLow":6.2,"heatindexAvg":7.4,"pressureMax":1024.38,"pressureMin":1019.30,"pressureTrend":-0.36,"precipRate":null,"precipTotal":null}}]}

Bonjour
Je ne vois aucune réponse à ta demande.
On vient de m’offrir une station Bresser et j’ai commencé à tester avec Ajouter une station météo Bresser sur jeedom avec Weather Underground
Je recherche une solution plus complète pour ne pas partir de zéro.
As-tu des pistes pour moi ?
Merci

Bonjour,
n’ayant pas eu de réponse, j’ai décortiqué le plugin PWS. Mon but était de passer par ce plugin et non de faire comme le tuto que vous avez indiqué. Du coup j’ai créé un script bash qui, comme dans le tuto, va chercher les infos chez WUndergroud, mais au lieu d’alimenter des widget, il met en forme les infos et les envois au plugin PWS.
Ce script se lance automatiquement toutes les 3 minutes chez moi, histoire d’avoir le vent à peu près à jour. J’ai pensé que lancer toutes les minutes serait abusif.
Contrairement au tuto, mon script n’utilise pas de clé API WUnderground, il prends les données publiques, ce qui permet d’avoir n’importe quelle station météo, pas uniquement la sienne.
Pour le mettre en place, il faut un accès ssh à Jeedom. Ensuite créer un fichier ‹ meteo.sh ›, copier/coller mon script en changeant l’ID de la station par défaut (les Id se retrouvent sur le site de WU) et la clé API de PWS, lui attribuer des droits d’exécution (chmod +x meteo.sh) et planifier l’exécution au rythme souhaité (via la commande ‹ crontab -e ›)

Mon script (il y a des options supplémentaires, car il ne me sert pas que pour Jeedom)

#!/bin/bash
## l'identifiant de station est à envoyer en ligne de commande
## sinon un identifiant par defaut est possible

## l identifiant par defaut de la station  (en cas d'absence en ligne de commande)
STATIONID=IBIHOR1

## choix des unités : e pour english, m pour metric
UNITS=e

## choix du format: json ou xml
FORMAT=json

## IP ou url de jeedom. Ne pas oublier HTTP ou HTTPS
## Possiblité de saisir un port custom
## ex:
##       JEEDOMURL=https://jeedom.chez.moi/
##       JEEDOMURL=https://jeedom.chez.moi:123/
##       JEEDOMURL=https://123.345.567.789/
JEEDOMURL=https://monjeedom.chezmoi.fr

## Clé API du plugin PWS de Jeedom si abs de ligne de cmde
JEEDOMKEY=CeCiNeStPaSmAcLeApI

###############################################################
## rien a modifier, en théorie, après cette marque
## génération des diverses URL et données

SCRIPTVERSION=1.0.10

## Chemin par défaut du plugin PWS (cf doc du plugin)
JEEDOMPATH=/plugins/pws/core/api/pws.php

## traitement des paramètres de ligne de commande
INCONNUS=()
while [[ $# -gt 0 ]]
do
        key="$1"
        case $key in
                "--key"|"-k" )
                   JEEDOMKEY=$2
                   shift # passer l'argument
                   shift # passer valeur
                ;;
                "--station"|"-s" )
                   STATIONID=$2
                   shift # passer l'argument
                   shift # passer la valeur
                ;;
                "--unit"|"-u" )
                   UNITS=$2
                   shift # passer l'argument
                   shift # passer la valeur
                ;;
                "--format"|"-f" )
                   FORMAT=$2
                   shift # passer l'argument
                   shift # passer la valeur
                ;;
                "--nosend"|"-m" )
                   NOSEND=1
                   shift # passer l'argument
                ;;
                "--debug"|"-d" )
                   DEBUG=1
                   shift # passer l'argument
                ;;
                "--verbose"|"-v" )
                   VERBOSE=1
                   shift # passer l'argument
                ;;
                "-vv" )
                   DEBUG=1
                   VERBOSE=1
                   shift # passer l'argument
                ;;
                "--help"|"-h" )
                   echo "$0 [param] [station]"
                   echo "Paramètres:"
                   echo "--key KEY | -k KEY             : clé API PWS (cf doc plugin PWS)"
                   echo "--station ID_STA | -s ID_STA   : Identifiant de station météo (cf doc de WUnderground)"
                   echo "--unit X | -u X                : type d'unité (e pour impérial, m pour metric). Le plugin utilise le mode impérial"
                   echo "--format format | -f format    : réccupère les sdonnées au format json ou xml. Pour un usage avec PWS, choisir json ou laisser par défaut"
                   echo "--nosend | -m                  : mode manuel. n'envoi pas les données à Jeedom mais affiche l'URL"
                   echo "--debug | -d                   : affiche des informations de debug"
                   echo "--verbose | -v                 : Affiche de retour de Jeedom. Combinable avec l'option de debug"
                   echo ""
                   exit 0
                   shift # passer l'argument
                ;;
                *)    # option inconnue
                   INCONNUS+=("$1") # on la mémorise // todo: a traiter
                   STATIONID="$1"  ## on suppose que c'est une station
                   shift # passer l'argument
                ;;
           esac
done

## un peu de debug
if [ ! -z "$DEBUG" ]; then
        echo "Clé API Jeedom: ${JEEDOMKEY}"
        echo "Station demandée: ${STATIONID}"
fi

## le site web de wunderground
BASEURL=https://www.wunderground.com/dashboard/pws/${STATIONID}

## extraction de la clé API du site
## elle n'a jamais changé lors des tests, mais on ne sait jamais
APIKEY=`curl -s ${BASEURL} | sed -En 's/.*apiKey=(.+)&a;sta.*/\1/p' `

## test si API reçue
if [ -z "${APIKEY}" ]; then
        echo "APIKey non determinée"
        echo ${APIKEY}
        exit 1
else
        [ ! -z "$DEBUG" ] && echo "Clé API Wunderground: ${APIKEY}"

        ## génération des URL
        URL_CURRENT="https://api.weather.com/v2/pws/observations/current?apiKey=${APIKEY}&stationId=${STATIONID}&numericPrecision=decimal&format=${FORMAT}&units=${UNITS}"
        [ ! -z "$DEBUG" ] && echo "Requète Wundergroud: ${URL_CURRENT}"

        FICHIERJSON=${STATIONID}.${FORMAT}
        curl -s -o ${FICHIERJSON} "${URL_CURRENT}"

        ## ici on génère l'URL Jeedom
        JEEDOMFULL=${JEEDOMURL}${JEEDOMPATH}?PASSWORD=${JEEDOMKEY}

        ## on génère l'url des dats. Solution moche, mais fonctionnelle sans programmes externes
        ## un parser json aurait fait peut-être mieux, au prix d'une dépendance. Ici, je ne fais que nettoyer les virgules et autre éléments inutiles
        POSTDATA=`cat ${FICHIERJSON} | sed 's/,"/\&/g' | sed 's/{"observations":\[{"//g' | sed 's/metric":{"//g' | sed 's/imperial":{"//g' | sed 's/}}\]}//g' | sed 's/":/=/g'`

        ## ajustement du nom des variable selon type imperial ou metrique
        if [ ${UNITS} = "m" ]; then
                POSTDATA=`echo ${POSTDATA} | sed 's/dewpt/dewptc/g'`
                POSTDATA=`echo ${POSTDATA} | sed 's/temp/tempc/g'`
                POSTDATA=`echo ${POSTDATA} | sed 's/windchill/windchillc/g'`
                POSTDATA=`echo ${POSTDATA} | sed 's/windSpeed/windSpeedkmh/g'`
                POSTDATA=`echo ${POSTDATA} | sed 's/windGust/windGustkmh/g'`
        else
                POSTDATA=`echo ${POSTDATA} | sed 's/dewpt/dewptf/g'`
                POSTDATA=`echo ${POSTDATA} | sed 's/temp/tempf/g'`
                POSTDATA=`echo ${POSTDATA} | sed 's/windchill/windchillf/g'`
                POSTDATA=`echo ${POSTDATA} | sed 's/windSpeed/windspeedmph/g'`
                POSTDATA=`echo ${POSTDATA} | sed 's/windGust/windGustmph/g'`
        fi

        POSTDATA=`echo ${POSTDATA} | sed 's/stationID/ID/g'`
        POSTDATA=`echo ${POSTDATA} | sed 's/&softwareType=null//g'`
        POSTDATA+="&softwareType=scriptWU%20V${SCRIPTVERSION}"
        POSTDATA=`echo ${POSTDATA} | sed 's/precipRate/rainin/g'`
        POSTDATA=`echo ${POSTDATA} | sed 's/precipTotal/dailyrainin/g'`
        POSTDATA=`echo ${POSTDATA} | sed 's/pressure/absbaromin/g'`


        POSTDATA=`echo ${POSTDATA} | sed 's/\"//g' | sed 's/ /%20/g'`


        FINALURL="${JEEDOMFULL}&${POSTDATA}"

        if [ ! -z "$DEBUG" ]; then
                echo "URL Jeedom: ${FINALURL}"
        fi

        ## si pas de blocage, on envoi à jeedom
        if [ ! -z "$NOSEND" ]; then
                ## sinon on sort l'url sur la sortie standard
                echo "${FINALURL}"
        else
                RET=`curl --head -s "${FINALURL}"`
                if [ ! -z "${VERBOSE}" ]; then
                        echo "${RET}"
                fi
        fi
fi

exit 0
1 « J'aime »

Bonjour,

Merci pour ce script qui m’a fait gagner du temps :). J’ai corrigé quelques données (upper/lower case) par rapport à ce qu’attend le plugin PWS.
Voici ce code :

#!/bin/bash -x
## Le -x permet d'avoir des logs, mais peut être enlevé en prod.
## l'identifiant de station est à envoyer en ligne de commande
## sinon un identifiant par defaut est possible

## l identifiant par defaut de la station  (en cas d'absence en ligne de commande)
STATIONID=IPLOUD17

## choix des unités : e pour english, m pour metric
UNITS=e

## choix du format: json ou xml
FORMAT=json

## IP ou url de jeedom. Ne pas oublier HTTP ou HTTPS
## Possiblité de saisir un port custom
## ex:
##       JEEDOMURL=https://jeedom.chez.moi/
##       JEEDOMURL=https://jeedom.chez.moi:123/
##       JEEDOMURL=https://123.345.567.789/
JEEDOMURL=https://192.168.1.173

## Clé API du plugin PWS de Jeedom si abs de ligne de cmde
JEEDOMKEY=XXXX

###############################################################
## rien a modifier, en théorie, après cette marque
## génération des diverses URL et données

SCRIPTVERSION=1.0.10

## Chemin par défaut du plugin PWS (cf doc du plugin)
JEEDOMPATH=/plugins/pws/core/api/pws.php

## traitement des paramètres de ligne de commande
INCONNUS=()
while [[ $# -gt 0 ]]
do
        key="$1"
        case $key in
                "--key"|"-k" )
                   JEEDOMKEY=$2
                   shift # passer l'argument
                   shift # passer valeur
                ;;
                "--station"|"-s" )
                   STATIONID=$2
                   shift # passer l'argument
                   shift # passer la valeur
                ;;
                "--unit"|"-u" )
                   UNITS=$2
                   shift # passer l'argument
                   shift # passer la valeur
                ;;
                "--format"|"-f" )
                   FORMAT=$2
                   shift # passer l'argument
                   shift # passer la valeur
                ;;
                "--nosend"|"-m" )
                   NOSEND=1
                   shift # passer l'argument
                ;;
                "--debug"|"-d" )
                   DEBUG=1
                   shift # passer l'argument
                ;;
                "--verbose"|"-v" )
                   VERBOSE=1
                   shift # passer l'argument
                ;;
                "-vv" )
                   DEBUG=1
                   VERBOSE=1
                   shift # passer l'argument
                ;;
                "--help"|"-h" )
                   echo "$0 [param] [station]"
                   echo "Paramètres:"
                   echo "--key KEY | -k KEY             : clé API PWS (cf doc plugin PWS)"
                   echo "--station ID_STA | -s ID_STA   : Identifiant de station météo (cf doc de WUnderground)"
                   echo "--unit X | -u X                : type d'unité (e pour impérial, m pour metric). Le plugin utilise le mode impérial"
                   echo "--format format | -f format    : réccupère les sdonnées au format json ou xml. Pour un usage avec PWS, choisir json ou laisser par défaut"
                   echo "--nosend | -m                  : mode manuel. n'envoi pas les données à Jeedom mais affiche l'URL"
                   echo "--debug | -d                   : affiche des informations de debug"
                   echo "--verbose | -v                 : Affiche de retour de Jeedom. Combinable avec l'option de debug"
                   echo ""
                   exit 0
                   shift # passer l'argument
                ;;
                *)    # option inconnue
                   INCONNUS+=("$1") # on la mémorise // todo: a traiter
                   STATIONID="$1"  ## on suppose que c'est une station
                   shift # passer l'argument
                ;;
           esac
done

## un peu de debug
if [ ! -z "$DEBUG" ]; then
        echo "Clé API Jeedom: ${JEEDOMKEY}"
        echo "Station demandée: ${STATIONID}"
fi

## le site web de wunderground
BASEURL=https://www.wunderground.com/dashboard/pws/${STATIONID}

## extraction de la clé API du site
## elle n'a jamais changé lors des tests, mais on ne sait jamais
## APIKEY=`curl -s ${BASEURL} | sed -En 's/.*apiKey=(.+)&a;sta.*/\1/p' `
## Moi j'ai mi ma clef Wunderground, mais le code au dessus est toujours utilisable.
APIKEY=XXX

## test si API reçue
if [ -z "${APIKEY}" ]; then
        echo "APIKey non determinée"
        echo ${APIKEY}
        exit 1
else
        [ ! -z "$DEBUG" ] && echo "Clé API Wunderground: ${APIKEY}"

        ## génération des URL
        URL_CURRENT="https://api.weather.com/v2/pws/observations/current?apiKey=${APIKEY}&stationId=${STATIONID}&numericPrecision=decimal&format=${FORMAT}&units=${UNITS}"
        [ ! -z "$DEBUG" ] && echo "Requète Wundergroud: ${URL_CURRENT}"

        FICHIERJSON=${STATIONID}.${FORMAT}
        curl -s -o ${FICHIERJSON} "${URL_CURRENT}"

        ## ici on génère l'URL Jeedom
        JEEDOMFULL=${JEEDOMURL}${JEEDOMPATH}?PASSWORD=${JEEDOMKEY}

        ## on génère l'url des dats. Solution moche, mais fonctionnelle sans programmes externes
        ## un parser json aurait fait peut-être mieux, au prix d'une dépendance. Ici, je ne fais que nettoyer les virgules et autre éléments inutiles
        POSTDATA=`cat ${FICHIERJSON} | sed 's/,"/\&/g' | sed 's/{"observations":\[{"//g' | sed 's/metric":{"//g' | sed 's/imperial":{"//g' | sed 's/}}\]}//g' | sed 's/":/=/g'`

        ## ajustement du nom des variable selon type imperial ou metrique
        if [ ${UNITS} = "m" ]; then
                POSTDATA=`echo ${POSTDATA} | sed 's/dewpt/dewptc/g'`
                POSTDATA=`echo ${POSTDATA} | sed 's/temp/tempc/g'`
                POSTDATA=`echo ${POSTDATA} | sed 's/windchill/windchillc/g'`
                POSTDATA=`echo ${POSTDATA} | sed 's/windChill/windchillc/g'`
                POSTDATA=`echo ${POSTDATA} | sed 's/windSpeed/windSpeedkmh/g'`
                POSTDATA=`echo ${POSTDATA} | sed 's/windGust/windGustkmh/g'`
        else
                POSTDATA=`echo ${POSTDATA} | sed 's/dewpt/dewptf/g'`
                POSTDATA=`echo ${POSTDATA} | sed 's/temp/tempf/g'`
                POSTDATA=`echo ${POSTDATA} | sed 's/windchill/windchillf/g'`
                POSTDATA=`echo ${POSTDATA} | sed 's/windChill/windchillf/g'`
                POSTDATA=`echo ${POSTDATA} | sed 's/windSpeed/windspeedmph/g'`
                POSTDATA=`echo ${POSTDATA} | sed 's/windGust/windgustmph/g'`
        fi

## la ligne suivante me permet de retirer l'accent du non de ma ville, car ce n'est pas supporté par PWS. Donc a enlever pour les communes sans accent, et pour les autre à modifier.
        POSTDATA=`echo ${POSTDATA} | sed 's/Ploudalmézeau/Ploudalmezeau/g'`
        POSTDATA=`echo ${POSTDATA} | sed 's/uv/UV/g'`
        POSTDATA=`echo ${POSTDATA} | sed 's/solarRadiation/solarradiation/g'`
        POSTDATA=`echo ${POSTDATA} | sed 's/obsTimeUtc/obsTimeUtcf/g'`
        POSTDATA=`echo ${POSTDATA} | sed 's/obsTimeLocal/obsTimeLocalf/g'`
        POSTDATA=`echo ${POSTDATA} | sed 's/stationID/ID/g'`
        POSTDATA=`echo ${POSTDATA} | sed 's/&softwareType=null//g'`
        POSTDATA+="&softwareType=scriptWU%20V${SCRIPTVERSION}"
        POSTDATA=`echo ${POSTDATA} | sed 's/precipRate/rainin/g'`
        POSTDATA=`echo ${POSTDATA} | sed 's/precipTotal/dailyrainin/g'`
        POSTDATA=`echo ${POSTDATA} | sed 's/pressure/absbaromin/g'`


        POSTDATA=`echo ${POSTDATA} | sed 's/\"//g' | sed 's/ /%20/g'`


        FINALURL="${JEEDOMFULL}&${POSTDATA}"

        if [ ! -z "$DEBUG" ]; then
                echo "URL Jeedom: ${FINALURL}"
        fi

        ## si pas de blocage, on envoi à jeedom
        if [ ! -z "$NOSEND" ]; then
		echo "sortie car rien a envoyer a jeedom."
                ## sinon on sort l'url sur la sortie standard
                echo "${FINALURL}"
        else
		echo "envoi a jeedom : ${FINALURL}"
## J'ai ajouté le --insecure car le certificat est généré par la box et ne passe pas curl par defaut.
                RET=`curl -X POST --insecure --verbose -s "${FINALURL}"`
                if [ ! -z "${VERBOSE}" ]; then
                        echo "${RET}"
                fi
        fi
fi

exit 0

Perso je l utilise dans un scénario pour le lancer de maniere régulière.

J’ai également modifié le plugin PWS pour prendre en compte plus de données que ce qu’il fait par défaut. Par exemple la date d’injection des données par la station dans wunderground. si ça intéresse qq un…

Bonjour,
Je me permets d’écrire pour vous partager mon travail :slight_smile:

Pour simplifier l’intégration des retours de l’API et la rendre plus évolutive/perenne, j’ai créé un script python qui récupère les valeurs de retour de l’API Wunderground (données que vous avez indiquées) et qui les injectent dans un broker MQTT :