[TUTO] Liaison avec une station météo personnelle (PWS)

Tags: #<Tag:0x00007f28380adc48>

Bonjour à tous,

Voici un tutoriel pour récupérer les informations d’une station météo personnelle (PWS) fonctionnant avec un firmware « EasyWeather » (<!>impératif<!>) et en version au minimum de 1.3.6.

Nota : dans ce tuto, j’ai mis entre crochets [ ] les quelques commandes à taper telles quelles en SSH.

1) Récupération de la clé API de Jeedom

  • Dans Jeedom, cliquer sur l’icône avec les engrenages, en haut à droite près de l’heure, puis sur le menu « Configuration »,
  • aller dans l’onglet « API »,
  • noter la valeur de la « Clé API » (sous-entendue ‹ globale ›) de Jeedom.

2) Création d’un virtuel dans Jeedom

  • Menu « Plugins/Programmation/Virtuel » (s’il est absent, l’ajouter via le Market, il est gratuit),
  • ajouter un virtuel,
  • dans l’onglet « Commandes », cliquer sur le bouton « Ajouter une info virtuelle » autant de fois qu’on veut afficher d’informations,
  • nommer correctement chaque ligne et lui renseigner éventuellement des bornes et une unité,
  • noter l’ID correspondant à chaque ligne (par exemple la ligne « UV » a l’ID 174).
    Jeedom - Virtuel

3) Création du fichier index.php

  • Se connecter en SSH sur une machine avec un serveur web fonctionnel (Jeedom par exemple),
  • aller dans le dossier html [cd /var/www/html],
  • créer un dossier ‹ pws › [mkdir pws],
  • aller dans ce dossier [cd pws],
  • créer un fichier ‹ index.php › [nano index.php],
  • coller dedans le contenu du script (voir fichier en PJ),
    <!> ATTENTION <!> à ne pas transformer les guillemets et apostrophes lors du copier-coller (il est préférable de faire un transfert avec un logiciel du type de FileZilla, en vérifiant bien que le format UTF-8 ait été conservé)
  • renseigner dans ce script les infos suivantes :
    • adresse IP et port de la machine Jeedom,
    • clé API de Jeedom,
    • les ID de chacune des infos qu’on veut envoyer dans Jeedom,
    • éventuellement pour débogage, activer temporairement la ou les sorties texte voulues,
  • quitter [CTRL+X] en validant l’enregistrement [O],
  • de retour en ligne de commande, rendre le fichier exécutable [chmod +x index.php],
  • remonter d’un niveau de dossier [cd …],
  • modifier les droits sur le dossier ‹ pws › [chown -R www-data:www-data pws].
    Nota : en principe pas besoin de rebooter, mais dans le doute … faites-le !

4) Configuration de la station météo

  • installer sur Android l’appli « WS View » (https://play.google.com/store/apps/details?id=com.ost.wsview),
    (il y a probablement un pendant fonctionnel sur iOS, à vous de chercher si besoin)
  • suivez les instructions de votre constructeur pour l’installation et la configuration,
  • vérifiez bien qu’elle répond au ping dans votre réseau local,
  • dans les réglages permettant l’export sur des sites web (Ecowitt, WunderGround, etc.) configurer le serveur personnel comme suit :
    • Customized = Enable
    • Protocol = Ecowitt
    • Server/IP = l’@ IP de votre Jeedom
    • Path = /pws/
    • port = même consigne
    • Upload interval = 60 (secondes) (ou mettez 300 pour 5 minutes par exemple).
      Station météo - Configuration export
  • Validez et vérifiez que les informations arrivent bien dans votre virtuel Jeedom.

Nota : vous pouvez très bien faire l’installation des scripts sur une machine n’ayant aucun rapport avec Jeedom, mais il vous faudra alors installer manuellement un serveur web dessus si elle n’en dispose pas déjà et peut-être choisir la clé « API Virtuel » de Jeedom au lieu de celle « globale ».


  • DEBOGAGE

En cas de problème insoluble, commencer par tester la bonne réception des données par le serveur web.
Pour cela, remplacer le contenu du fichier /pws/index.php par ce script ‹ index (raw output file).php › :

	<?php
		/*
		***************************
		/var/www/html/pws/index.php
		***************************
		Script PHP pour juste écrire dans un fichier local les données reçues
		*/
		$str = print_r($_POST, TRUE);
		$fh = fopen('test_reception.txt', 'w');
		fwrite($fh, $str);
		fclose($fh);
		print("OK\n");
	?>

Si le fichier de sortie « test_reception.txt » contient bien les données de la station météo, toute la partie configuration de la station et du serveur web est OK.
Le problème provient donc plutôt du virtuel Jeedom, ou de la communication entre le serveur web et Jeedom.



Vous trouverez en PJ les deux scripts PHP. Pour pouvoir les utiliser, supprimez « .txt » à la fin, de manière à ce qu’ils retrouvent une extension en « .php ».
Je suis parti d’un script existant pour envoi des données dans le logiciel WeeX et je l’ai assez lourdement modifié, mais j’ai perdu le nom des auteurs au passage … Si je les retrouve, je les ajouterai.


EDIT au 27/03/2020 :
Passage en version 1.1 du fichier « index.php ». Essentiellement pour ajouter le calcul du point de givre et échapper les erreurs sur les variables de niveau de batteries inexistantes dans certaines PWS.

Procédure de mise à jour :

  • téléchargez le fichier index_v1.1(Jeedom).php.txt
  • renommez-le en « index.php »
  • renseignez dedans vos paramètres personnels (IP et API de Jeedom, ainsi que les ID de votre ou vos virtuels nottamment)
  • copiez-le dans votre dossier web dédié (par exemple /var/www/html/pws) en écrasant le précédent
  • puis attendez la prochaine communication provenant de votre station

EDIT au 06/04/2020 :
Passage en version 1.2 du fichier « index.php » : modification du contournement d’absence éventuelle des variables de batterie.


index (raw output file).php.txt (293 Octets)
index_v1.0(Jeedom).php.txt (15,4 Ko)
index_v1.1(Jeedom).php.txt (18,1 Ko)
index_v1.2(Jeedom).php.txt (18,4 Ko)

3 J'aimes

Merci du tuto, juste une question, tu n’a pas mis de prérequis de version de jeedom…
Cela veut’il dire que ca fonctionne en version 3 comme en version 4 ?

Oui, normalement c’est quasiment indépendant de Jeedom, donc ça devrait fonctionner virtuellement en n’importe quelle version.

Il n’y a aucune maintenance à faire non plus :slight_smile:

Il suffit que Jeedom dispose du plugin « virtuel » pour afficher les valeurs de la station météo et des clés API pour envoyer les valeurs depuis l’extérieur de Jeedom (là, ça remonte a loin aussi, donc pas de problèmes).

1 J'aime

merci de ta réponse

Merci beaucoup, cela fonctionne parfaitement. Le protocole ecowitt est précisément ce que je cherchais, il semble qu’il soit nécessaire de pouvoir envoyer les données des stations qui admettent des capteurs supplémentaires d’humidité du sol et de la qualité de l’air. J’espère en recevoir prochainement, je verrai si je peux les intégrer.

Avec plaisir si ça peut vous aider :slight_smile:

Oui j’ai pris le protocole Ecowitt parce qu’avec celui de WunderGround il y a quelques informations qui ne sont pas envoyées par la station (je ne sais plus lesquelles, ça date un peu mes recherches lol).

PS : en plus de la température ressentie, j’ai ajouté dans mon script un calcul de l’indice de chaleur (version USA, pas Canada) avec la double méthode de Steadman et Rothfusz.
Il est bien sûr inutile de l’afficher en plein hiver :wink:
Normalement il est efficient dès que les températures extérieures atteignent les 25°C environ.

Si j’ai le temps, j’ajouterai le calcul du point de givre et du point de rosée, ce n’est pas compliqué.

Bonjour,

Tu utilise quel modèle de station météo?

Bonjour,
Une Sainlogic WS3500, celle qui se retrouve sous plusieurs marques noms et références :wink:

J’utilise un misol hp2550, essentiellement le même que le ecowitt hp2551.

Tu as une console différente du coup. Mais les capteurs sont les mêmes en principe.
Le logiciel de gestion aussi est le même, donc ça doit fonctionner pour la récupération des infos via mon script :wink:

Pour les stations semblables à la mienne, voici la liste que j’avais faite :

  • Sainlogic WS3500
  • Froggit WH3000
  • Ambient Weather WS-2902A (parfois capteurs différents ?)
  • Fine Offset WH2900

Autres PWS avec capteurs différents, mais compatibles au niveau du logiciel de transfert « EasyWeather v1.3.6 + » :

  • Fine Offset WH2950

Merci :+1:

J’aime :+1:

Merci pour ton script !

Installation sans problème, merci

Tu crois qu’il serait possible d’avoir le choix de la radiation solaire en lux et pas en w/m2 ?
C’est quoi la commande eventrain ?
On peut faire un rafraîchissement toutes les 16 secondes dans la config WS View?

Super, cette station prend tout son sens avec ton script, manque plus que point de givre :yum:

En revanche j’ai ca dans http.error :tired_face: :thinking:

[Fri Mar 06 17:56:55.377920 2020] [:error] [pid 3689] [client 192.168.254.22:8483] PHP Notice:  Undefined index: wh80batt in /var/www/html/pws/index.php on line 144
[Fri Mar 06 17:56:55.377992 2020] [:error] [pid 3689] [client 192.168.254.22:8483] PHP Notice:  Undefined index: wh80batt in /var/www/html/pws/index.php on line 148
[Fri Mar 06 17:56:55.378017 2020] [:error] [pid 3689] [client 192.168.254.22:8483] PHP Notice:  Undefined index: wh40batt in /var/www/html/pws/index.php on line 154
[Fri Mar 06 17:56:55.378039 2020] [:error] [pid 3689] [client 192.168.254.22:8483] PHP Notice:  Undefined index: wh40batt in /var/www/html/pws/index.php on line 158
[Fri Mar 06 17:56:55.378063 2020] [:error] [pid 3689] [client 192.168.254.22:8483] PHP Notice:  Undefined index: soilbatt1 in /var/www/html/pws/index.php on line 164
[Fri Mar 06 17:56:55.378085 2020] [:error] [pid 3689] [client 192.168.254.22:8483] PHP Notice:  Undefined index: soilbatt1 in /var/www/html/pws/index.php on line 168

C’est dû à

# Batteries
    if ( $weather_data['wh80batt'] < 2.5 )
    {
	@$weather_data['windBatteryStatus'] = 1.0 ;
    }
    if ( $weather_data['wh80batt'] > 2.5 )
    {
	@$weather_data['windBatteryStatus'] = 0.0 ;
    }
    @$weather_data['consBatteryVoltage'] = $weather_data['wh80batt'] ;

    if ( $weather_data['wh40batt'] < 1.0 )
    {
        @$weather_data['rainBatteryStatus'] = 1.0 ;
    }
    if ( $weather_data['wh40batt'] > 1.0 )
    {
        @$weather_data['rainBatteryStatus'] = 0.0 ;
    }
    @$weather_data['supplyVoltage'] = $weather_data['wh40batt'] ;

    if ( $weather_data['soilbatt1'] < 1.0 )
    {
        @$weather_data['txBatteryStatus'] = 1.0 ;
    }
    if ( $weather_data['soilbatt1'] > 1.0 )
    {
        @$weather_data['txBatteryStatus'] = 0.0 ;
    }
    @$weather_data['heatingVoltage'] = $weather_data['soilbatt1'] ;
    @$weather_data['outTempBatteryStatus'] = $weather_data['batt1'] ;

Peut être non compatible avec ma version Waldbeck Halley Station météo Multifonction Firmware WH2650A_V1.5.2

Je l’ai commenté le temps de !

Le problème des lumens, c’est que ce n’est pas une véritable unité de mesure, c’est une estimation de puissance en fonction de ce que capte l’oeil humain (et en plus il me semble que c’est propre à une longueur d’onde précise, mais je peux me tromper).
C’est pour ça que la station renvoie la mesure normal de puissance lumineuse :wink:
Il n’y a pas de facteur de conversion possible entre les deux à ma connaissance.

La variable « eventrain » est propre à chaque station, elle ne renvoie pas la même chose suivant la marque et la version de firmware. Il faut consulter sa notice, mais ce n’est pas tout le temps défini. Ce que j’ai mis en commentaire vaut uniquement pour la mienne et celles possédant exactement le même firmware. Désolé :frowning:

Pour le rafraîchissement, tu peux peut-être moduler oui, ça dépend de ta configuration disponible dans l’appli WS VIEW. Cependant les capteurs ne communiquent leurs valeurs que toutes les 16 secondes précisément à la petite console d’affichage (ou de transmission), donc ça risque de faire un poil short.
Mais essaie si ton appli le permet, rien ne t’en empêche.
Nota : j’espère que tu es sur un disque USB et pas une carte SD, parce que ça va faire un sacré paquet de données au bout de quelques jours :wink:

Pour l’erreur http, moi aussi je l’ai, mais ça n’empêche pas le fonctionnement, donc je ne m’en occupe pas :slight_smile:
C’est du au fait que toutes les stations ne renvoient pas les mêmes infos d’état des piles suivant les capteurs qu’elles ont. J’ai préféré laisser le tout dans le script, comme ça ça devrait pouvoir fonctionner pour tout le monde.
Je ne sais pas faire d’interception d’erreur en PHP, d’ailleurs je ne sais même pas si ça existe lol
Mais si quelqu’un sait et a le temps de s’y pencher, ce sera avec plaisir :slight_smile:

Voilà, je vous ai posté la version 1.1 du script avec les modifs demandées :slight_smile:


Passage en version 1.1 du fichier « index.php ». Essentiellement pour ajouter le calcul du point de givre et échapper les erreurs sur les variables de niveau de batteries inexistantes dans certaines PWS.

Procédure de mise à jour :

  • téléchargez le fichier index_v1.1(Jeedom).php.txt
  • renommez-le en « index.php »
  • renseignez dedans vos paramètres personnels (IP et API de Jeedom, ainsi que les ID de votre ou vos virtuels nottamment)
  • copiez-le dans votre dossier web dédié (par exemple /var/www/html/pws) en écrasant le précédent
  • puis attendez la prochaine communication provenant de votre station :yum:

index_v1.1(Jeedom).php.txt (18,1 Ko)

2 J'aimes

Cool :wink:

Merci

Merci beaucoup :+1:

Salut,
Après un certain temps, le virtuel a cessé de mettre à jour les informations de la station météo. Dans le registre, je continue de recevoir l’erreur http de la batterie, donc je comprends que les informations sont reçues. des idées où chercher?

Salut,
Je mets des questions à numéro, ce sera plus facile pour répondre :grin:

  1. Une erreur dans l’URL ? Dans la clé API ? Dans les ID du virtuel ?
    Enfin je ne pense pas que ce soit ça si tu dis que ça fonctionne pendant un moment, mais bon…

  2. Est-ce que tu as des messages dans le Centre de Message de Jeedom ?

  3. Si tu redémarre Jeedom, est-ce que ça refonctionne ?

Sinon, bascule quelques minutes sur le fichier PHP qui sert juste à sortir ce qu’envoie la station météo (voir mon tout premier post sur ce même topic) et mets ici le fichier de sortie « test_reception.txt » qu’il a généré STP. Je verrai exactement ce que balance ta station par rapport à une plus générique comme la mienne.
Dès que tu vois apparaître le fichier txt, tu peux remettre le fichier index.php ‹ normal › pour recevoir à nouveau tes données dans Jeedom.