Comment bien paramétrer et utiliser l’extension « Interceptor » avec Weewx

janvier 8, 2021

Les temps derniers je m’étais intéressé a la récupération des données de ma station météo Froggit WH-6000 par les ondes radio.

Après quelques essais, le captage des données se faisait sur les capteurs (donc à l’extérieur) de la station. Ces réceptions par onde radio (868Mhz environ) fonctionnent aléatoirement. En effet divers facteurs rentrent en ligne de compte  :

  • Utilisation d’une clef TNT USB avec un chipset spécial
  • Eloignement de la station
  • Antenne spéciale de 868Mhz 
  • Perturbation radio /épaisseur des murs etc …

De plus la captation est aléatoire et il manque des mesures comme par exemple la pression atmosphérique (cette valeur venant de la base et non de la station).

il faut donc trouver une solution…

Actuellement la base est connectée en Wifi sur mon réseau local et upload les data directement sur Weather Underground via un paramétrage de compte : ca, ça fonctionne !

D’ailleurs c’est  comme ca qu’à l’inverse je récupère les datas uploadées sur le site de WU pour les récupérer a travers un utilitaire de Weewx , l’utilitaire wee_import. Et ça aussi ça fonctionne mais avec des limitations.

Actuellement je l’exécute toutes  les  24 heures via un cron : 

je récupère la date du jour  (-1 journée pour avoir la veille) et je lance une importation depuis Weather Undeground, ensuite je génère les rapports de template que j’uploade en rsync sur ce site.

Ma station fonctionne de cette façon actuellement mais avec 1 jour de décallage (et sans weewx)

Mais  je cherche une solution autonome, je ne veux pas être dépendant de Weather Undeground.

 

l’extension Interceptor : je l’ai testé !

Premier pré-requis  :

  • posséder un raspberry Pi avec du réseau LAN et WIFI 
  • Installer un Weewx 

Tout est expliqué ici (en anglais) : https://github.com/matthewwall/weewx-interceptor

Un second pré-requis IMPORTANT : le sniffer de réseau. 

Afin de sniffer le réseau il va falloir installer un utilitaire 

sudo pip install pypcap

ou 

sudo apt-get install libcap-dev

ou 

sudo apt-get install python-libpcap

 

Installation de l’extension après avoir installé libpcap

Télécharger la dernière version de l’extension

wget -O weewx-interceptor.zip https://github.com/matthewwall/weewx-interceptor/archive/master.zip

Installer l’extension

sudo wee_extension --install weewx-interceptor.zip

Configurer le driver 

wee_config --reconfigure --driver=user.interceptor --no-prompt

Paramétrage de Interceptor dans Weewx : extrait du fichier weewx.conf 

[Interceptor]
# This section is for the network traffic interceptor driver.

# The driver to use:
driver = user.interceptor

# wu-client - any hardware that uses the weather underground protocol
device_type = wu-client
port = 80
address = 192.168.0.32
mode = sniff
iface = wlan0

Extrait de la doc (en  ligne) :

===============================================================================
Example: sniff mode for any WU client

   This example assumes two network interfaces on the computer running weewx.

1) Plug the computer into the local network using the first interface (eth0).
   Plug the device into the second interface (eth1).
   Bridge the two network interfaces.
   If you run any web services on the computer, configure them to listen on
   interface eth0, not eth1.

2) Set parameters in the weewx configuration file.  The device has IP address
   of X.X.X.X

[Interceptor]
    driver = user.interceptor
    device_type = wu-client
    mode = sniff
    iface = eth1
    pcap_filter = src X.X.X.X and dst port 80


===============================================================================

 

l’adresse 192.168.0.32 est l’adresse de ma carte réseau WIFI sur mon Raspberry.

 

Paramétrage de la base de la station

une fois que le sniffer est en  place que vous avez installé l’extension, vous allez devoir reprogrammer la base de la station de façon complète.

1- Appuyer 10 secondes sur le bouton Wifi de la base ( la led clignote en vert) 

La station va passer en mode AP

A l’aide d’un smartphone, il faut scanner le réseau WIFI et se connecter au réseau WIFI ouvert : PWSXXXX

Saisir dans un navigateur sur votre smartphone l’adresse suivante  : http://192.168.1.1  (adresse ip de la base provisoire) 

Saisir le réseau wifi local de votre box :

Saisir le serveur  : mettre l’adresse ip de votre carte réseau WLAN à la place de rtupdate.wunderground.com

(mettre des valeurs dans l’ID de la station et dans le mot de passe , mais ca ne servira pas)

Renseigner le serveur de temps  :

Renseigner votre locator (coordonnées lat /long) 

Et sauvegarder …

Si tout se passe bien , la petite led clignote bleue quelques instants sur la base puis reste fixe bleue , les paramètres ont bien été enregistrés.

Désormais vous pouvez utilisez la solution weewx avec l’extention.

Les tests effectués

Pour le test dans le fichier weewx.conf passer la valeur de debug à  1

Démarrer le service weewx :

#service weewx start

En une ligne de commande, vous pouvez tester si l’interception fonctionne

(Attention  j’ai quelque peu  modifié la ligne de commande   python => python2 et le chemin de l’extension, vous noterez que nous allons surveiller l’adresse  ip  192.168.0.36 sur le  port 80 ( adresse de la base de la station) 

 

PYTHONPATH=/usr/share/weewx python2 /usr/share/weewx/user/interceptor.py --device=observer --mode=sniff --iface=wlan0 --filter="src 192.168.0.36 and dst port 80"

 

Et voici les logs ( /var/log/syslog)  :

Jan 7 13:42:00 Rpi2 weewx[28578] DEBUG user.interceptor: ignored parameter rtfreq=5
Jan 7 13:42:00 Rpi2 weewx[28578] DEBUG user.interceptor: ignored parameter action=updateraww
Jan 7 13:42:00 Rpi2 weewx[28578] DEBUG user.interceptor: ignored parameter PASSWORD=XXXXXXXX
Jan 7 13:42:00 Rpi2 weewx[28578] DEBUG user.interceptor: ignored parameter ID=XXXXX
Jan 7 13:42:00 Rpi2 weewx[28578] DEBUG user.interceptor: raw packet: {'wind_speed': 0.0, 'humidity_in': 49.0, 'temperature_in': 66.3, 'barometer': 30.68, 'wind_gust': 0.0, 'dewpoint': 35.2, 'humidity_out': 85.0, 'uv': 1.3, 'rain': 0.0, 'dateTime': 1610023320, 'temperature_out': 39.3, 'wind_dir': 135.0, 'rain_total': 0.0, 'usUnits': 1}
Jan 7 13:42:00 Rpi2 weewx[28578] DEBUG user.interceptor: mapped packet: {'barometer': 30.68, 'dewpoint': 35.2, 'outHumidity': 85.0, 'UV': 1.3, 'rain': 0.0, 'dateTime': 1610023320, 'windDir': 135.0, 'outTemp': 39.3, 'windSpeed': 0.0, 'inHumidity': 49.0, 'inTemp': 66.3, 'windGust': 0.0, 'usUnits': 1}
Jan 7 13:42:10 Rpi2 weewx[28578] DEBUG user.interceptor: empty queue
Jan 7 13:42:12 Rpi2 weewx[28578] DEBUG user.interceptor: GET: ID=XXXXX&PASSWORD=XXXX&action=updateraww&realtime=1&rtfreq=5&dateutc=now&baromin=30.68&tempf=39.3&humidity=85&windspeedmph=0&windgustmph=0&winddir=135&dewptf=35.2&rainin=0&dailyrainin=0&UV=1.3&indoortempf=66.3&indoorhumidity=49
Jan 7 13:42:12 Rpi2 weewx[28578] DEBUG user.interceptor: raw data: ID=XXXXX&PASSWORD=YYYYY&action=updateraww&realtime=1&rtfreq=5&dateutc=now&baromin=30.68&tempf=39.3&humidity=85&windspeedmph=0&windgustmph=0&winddir=135&dewptf=35.2&rainin=0&dailyrainin=0&UV=1.3&indoortempf=66.3&indoorhumidity=49
Jan 7 13:42:12 Rpi2 weewx[28578] DEBUG user.interceptor: using rain_total 0.0 from dailyrainin
Jan 7 13:42:12 Rpi2 weewx[28578] DEBUG user.interceptor: ignored parameter realtime=1
Jan 7 13:42:12 Rpi2 weewx[28578] INFO user.interceptor: unrecognized parameter rainin=0
Jan 7 13:42:12 Rpi2 weewx[28578] DEBUG user.interceptor: ignored parameter rtfreq=5
Jan 7 13:42:12 Rpi2 weewx[28578] DEBUG user.interceptor: ignored parameter action=updateraww
Jan 7 13:42:12 Rpi2 weewx[28578] DEBUG user.interceptor: ignored parameter PASSWORD=XXXXXXXX
Jan 7 13:42:12 Rpi2 weewx[28578] DEBUG user.interceptor: ignored parameter ID=XXXXX
Jan 7 13:42:12 Rpi2 weewx[28578] DEBUG user.interceptor: raw packet: {'wind_speed': 0.0, 'humidity_in': 49.0, 'temperature_in': 66.3, 'barometer': 30.68, 'wind_gust': 0.0, 'dewpoint': 35.2, 'humidity_out': 85.0, 'uv': 1.3, 'rain': 0.0, 'dateTime': 1610023333, 'temperature_out': 39.3, 'wind_dir': 135.0, 'rain_total': 0.0, 'usUnits': 1}
Jan 7 13:42:12 Rpi2 weewx[28578] DEBUG user.interceptor: mapped packet: {'barometer': 30.68, 'dewpoint': 35.2, 'outHumidity': 85.0, 'UV': 1.3, 'rain': 0.0, 'dateTime': 1610023333, 'windDir': 135.0, 'outTemp': 39.3, 'windSpeed': 0.0, 'inHumidity': 49.0, 'inTemp': 66.3, 'windGust': 0.0, 'usUnits': 1}
Jan 7 13:42:22 Rpi2 weewx[28578] DEBUG user.interceptor: empty queue
Jan 7 13:42:25 Rpi2 weewx[28578] DEBUG user.interceptor: GET: ID=XXXXX&PASSWORD=XXXX&action=updateraww&realtime=1&rtfreq=5&dateutc=now&baromin=30.68&tempf=39.3&humidity=85&windspeedmph=0.2&windgustmph=0.2&winddir=135&dewptf=35.2&rainin=0&dailyrainin=0&UV=1.3&indoortempf=66.3&indoorhumidity=49
Jan 7 13:42:25 Rpi2 weewx[28578] DEBUG user.interceptor: raw data: ID=XXXXX&PASSWORD=YYYYY&action=updateraww&realtime=1&rtfreq=5&dateutc=now&baromin=30.68&tempf=39.3&humidity=85&windspeedmph=0.2&windgustmph=0.2&winddir=135&dewptf=35.2&rainin=0&dailyrainin=0&UV=1.3&indoortempf=66.3&indoorhumidity=49
Jan 7 13:42:25 Rpi2 weewx[28578] DEBUG user.interceptor: using rain_total 0.0 from dailyrainin
Jan 7 13:42:25 Rpi2 weewx[28578] DEBUG user.interceptor: ignored parameter realtime=1
Jan 7 13:42:25 Rpi2 weewx[28578] INFO user.interceptor: unrecognized parameter rainin=0
Jan 7 13:42:25 Rpi2 weewx[28578] DEBUG user.interceptor: ignored parameter rtfreq=5
Jan 7 13:42:25 Rpi2 weewx[28578] DEBUG user.interceptor: ignored parameter action=updateraww
Jan 7 13:42:25 Rpi2 weewx[28578] DEBUG user.interceptor: ignored parameter PASSWORD=XXXXXXXX
Jan 7 13:42:25 Rpi2 weewx[28578] DEBUG user.interceptor: ignored parameter ID=XXXXX
Jan 7 13:42:25 Rpi2 weewx[28578] DEBUG user.interceptor: raw packet: {'wind_speed': 0.2, 'humidity_in': 49.0, 'temperature_in': 66.3, 'barometer': 30.68, 'wind_gust': 0.2, 'dewpoint': 35.2, 'humidity_out': 85.0, 'uv': 1.3, 'rain': 0.0, 'dateTime': 1610023345, 'temperature_out': 39.3, 'wind_dir': 135.0, 'rain_total': 0.0, 'usUnits': 1}
Jan 7 13:42:25 Rpi2 weewx[28578] DEBUG user.interceptor: mapped packet: {'barometer': 30.68, 'dewpoint': 35.2, 'outHumidity': 85.0, 'UV': 1.3, 'rain': 0.0, 'dateTime': 1610023345, 'windDir': 135.0, 'outTemp': 39.3, 'windSpeed': 0.2, 'inHumidity': 49.0, 'inTemp': 66.3, 'windGust': 0.2, 'usUnits': 1}
Jan 7 13:42:35 Rpi2 weewx[28578] DEBUG user.interceptor: empty queue
Jan 7 13:42:37 Rpi2 weewx[28578] DEBUG user.interceptor: GET: ID=XXXXX&PASSWORD=XXXX&action=updateraww&realtime=1&rtfreq=5&dateutc=now&baromin=30.68&tempf=39.3&humidity=85&windspeedmph=0&windgustmph=0&winddir=135&dewptf=35.2&rainin=0&dailyrainin=0&UV=1.3&indoortempf=66.3&indoorhumidity=49
Jan 7 13:42:37 Rpi2 weewx[28578] DEBUG user.interceptor: raw data: ID=XXXXX&PASSWORD=YYYYY&action=updateraww&realtime=1&rtfreq=5&dateutc=now&baromin=30.68&tempf=39.3&humidity=85&windspeedmph=0&windgustmph=0&winddir=135&dewptf=35.2&rainin=0&dailyrainin=0&UV=1.3&indoortempf=66.3&indoorhumidity=49
Jan 7 13:42:37 Rpi2 weewx[28578] DEBUG user.interceptor: using rain_total 0.0 from dailyrainin
Jan 7 13:42:37 Rpi2 weewx[28578] DEBUG user.interceptor: ignored parameter realtime=1
Jan 7 13:42:37 Rpi2 weewx[28578] INFO user.interceptor: unrecognized parameter rainin=0
Jan 7 13:42:37 Rpi2 weewx[28578] DEBUG user.interceptor: ignored parameter rtfreq=5
Jan 7 13:42:37 Rpi2 weewx[28578] DEBUG user.interceptor: ignored parameter action=updateraww
Jan 7 13:42:37 Rpi2 weewx[28578] DEBUG user.interceptor: ignored parameter PASSWORD=XXXXXXXX
Jan 7 13:42:37 Rpi2 weewx[28578] DEBUG user.interceptor: ignored parameter ID=XXXXX
Jan 7 13:42:37 Rpi2 weewx[28578] DEBUG user.interceptor: raw packet: {'wind_speed': 0.0, 'humidity_in': 49.0, 'temperature_in': 66.3, 'barometer': 30.68, 'wind_gust': 0.0, 'dewpoint': 35.2, 'humidity_out': 85.0, 'uv': 1.3, 'rain': 0.0, 'dateTime': 1610023358, 'temperature_out': 39.3, 'wind_dir': 135.0, 'rain_total': 0.0, 'usUnits': 1}
Jan 7 13:42:37 Rpi2 weewx[28578] DEBUG user.interceptor: mapped packet: {'barometer': 30.68, 'dewpoint': 35.2, 'outHumidity': 85.0, 'UV': 1.3, 'rain': 0.0, 'dateTime': 1610023358, 'windDir': 135.0, 'outTemp': 39.3, 'windSpeed': 0.0, 'inHumidity': 49.0, 'inTemp': 66.3, 'windGust': 0.0, 'usUnits': 1}
Jan 7 13:42:47 Rpi2 weewx[28578] DEBUG user.interceptor: empty queue

ca fonctionne  ! et on récupère même la pression atmosphérique.

 

Conclusion 

je pense mettre cette méthode en production en lieu et en place de la solution de wee_import

mais mon rpi de « production » est déjà bien chargé et j’appréhende l’installation des pré-requis.

A suivre donc  … dans un prochain article.