Jeedom – Récupérer les informations de WeeWX

Certains modules Jeedom proposent d’ajouter les données météorologiques de Météo France, ou de Yahoo. Mais, comme j’avais pu le constater (billet-du-jour-tondeuse-electrique), cela ne reste que de la prévision. Je souhaitai disposer de mes propres données météorologiques, réellement constatées, provenant de la station météo (une Oregon Scientific WRM88) présente dans mon jardin.

Oregon Scientific WRM88

Oregon Scientific WRM88

La station Oregon Scientific WRM88 inclue une station, un anémomètre, une girouette, un thermomètre et un pluviomètre. Toutes les informations recueillies sont affichées sur la station, et peuvent également être transmises par un câble USB à un ordinateur, évidemment un Raspberry Pi chez moi. Pour traiter les informations et les présenter sous forme de graphes, j’utilise WeeWX.

Pour ceux qui ne connaissent pas WeeWX, il s’agit d’une solution open-source et libre qui récupère les informations depuis une station météo, permettant la transmission des informations par port USB. Pour mon installation, j’ai couplé WeeWX (j’ai la version 3.1.0-1, qui n’est peut être pas à jour) avec une base de données MySQL présente également sur le Raspberry Pi. Cela me permet de « requêter » directement la base pour utiliser les données dans des applications tierces dont Jeedom.

Pour cela, j’utilise le plugin « script » de Jeedom. Ce plugin permet, en autres, de récupérer les données présentes sur une page Web ou un fichier XML, en faisant du parsing sur les balises qui nous intéressent. Je vais donc réaliser un script Python qui va générer un fichier XML contenant les dernières informations remontées par ma station météo, via WeeWX, et les afficher comme suit :

Aperçu du panneau WeeWX sur Jeedom

Aperçu du panneau WeeWX sur Jeedom

Avant de passer à la réalisation, il y a deux points à prendre en compte, sinon les valeurs ne sont pas correctes : les températures sont enregistrées en degrés Fahrenheit, et les mesures (pour la pluviométrie) sont en pouces par heure.

Requête SQL

Toutes les données se trouvent dans la table « archive« . Toutes les 5 minutes (ce paramètre peut être modifié) , la station météo transmet les dernières informations à WeeWX. Chaque entrée génère un INSERT dans la table archive avec toutes les données connues de la station : température et hygrométrie de la station, les valeurs de chaque sonde (température, hygrométrie, indice d’UltraViolet, sens et vitesse du vent, pluviométrie, niveau de batterie, …). Je n’ai pas besoin de récupérer toutes les champs, je n’en récupère que quelques uns, mais en regardant dans la base vous n’aurez aucun mal à trouver les autres données.

Voici, ci-dessous, la requête utilisée et le résultat retourné par PHPMyAdmin.


SELECT CAST((inTemp-32)*5/9 as DECIMAL( 4, 1)) as tempSalon, -- x°C=y°F-32*5/9
       CAST(inHumidity as DECIMAL( 4, 1 )) as humidSalon, 
       CAST((extraTemp1-32)*5/9 as DECIMAL( 4, 1 )) as tempExt, -- x°C=y°F-32*5/9
       CAST(extraHumid1 as DECIMAL( 4, 1 )) as humidExt, 
       CAST(windSpeed as DECIMAL( 4, 1 )) as vitesseVent, 
       CAST(windDir as DECIMAL( 4, 1 )) as orientVent, 
       CAST(rainRate/0.0393701 as DECIMAL( 4, 1 )) as Pluvio -- Xcm=Yinch/0,0393701
FROM archive 
ORDER BY dateTime DESC LIMIT 0, 1;

Aperçu de la requête dans PHPMyAdmin

Aperçu de la requête dans PHPMyAdmin

Script Python

Nous avons donc maintenant notre requête, il reste à générer un fichier XML contenant toutes ces informations. Ci-dessous, le script Python réalisé :


#!/usr/bin/python
# -*- coding: utf-8 -*-
import datetime
import MySQLdb
def None2zero(data):    #Cette fonction remplace par '0' les valeurs nulles
   if data=='None':
      data=0
   return data

#  Connexion à la base de données avec les identifiants
conn = MySQLdb.connect(host="localhost",user="weewx",passwd="weewx", db="whew")    
cursor = conn.cursor()
reqSQL = '''SELECT CAST((inTemp-32)*5/9 as DECIMAL( 4, 1 )) as tempSalon, 
                   CAST(inHumidity as DECIMAL( 4, 1 )) as humidSalon, 
                   CAST((extraTemp1-32)*5/9 as DECIMAL( 4, 1 )) as tempExt, 
                   CAST(extraHumid1 as DECIMAL( 4, 1 )) as humidExt, 
                   CAST(windSpeed as DECIMAL( 4, 1 )) as vitesseVent, 
                   CAST(windDir as DECIMAL( 4, 1 )) as orientVent, 
                   CAST(rainRate/0.0393701 as DECIMAL( 4, 1 )) as Pluvio 
            FROM archive 
            ORDER BY dateTime DESC LIMIT 0, 1'''
cursor.execute(reqSQL)
data = cursor.fetchone()            # la variable data contient toutes les données retourées
tempSalon=None2zero(str(data[0]))
humidSalon=None2zero(str(data[1]))
tempExt=None2zero(str(data[2]))
humidExt=None2zero(str(data[3]))
vitesseVent=None2zero(str(data[4]))
orientVent=None2zero(str(data[5]))
Pluvio=None2zero(str(data[6]))
xml=open('/var/www/weewx2xml.xml','w')      # avec 'w', le fichier sera écrasé avec les nouvelles valeurs
xml.write('''<root>                # enregistrement des résultats dans le fichier XML
   <time>%s</time>
   <tempSalon>%s</tempSalon>
   <humidSalon>%s</humidSalon>
   <tempExt>%s</tempExt>
   <humidExt>%s</humidExt>
   <vitesseVent>%s</vitesseVent>
   <orientVent>%s</orientVent>
   <Pluviometrie>%s</Pluviometrie>
</root>''' % (datetime.datetime.today().strftime('%Y%m%d%H%M%S'), tempSalon, humidSalon, tempExt, humidExt, vitesseVent, orientVent, Pluvio))
xml.close()
conn.close()

Le champ ‘time’ n’est pas une information donnée par la station météo et il ne sera pas remonté à Jeedom. Il indique l’horodatage du fichier généré. Cela permet de savoir de quand date le fichier (utile en cas de debug du script ou de la crontab).

Dans mon cas, je génère le fichier dans le fichier ‘/var/www/weewx2xml.xml’. Il se trouvera donc dans le répertoire d’Apache. Le fichier sera donc consultable comme une page Web classique à l’adresse http://IP_DU_RPI/weew2xml.xml.

 

Voici le fichier généré :

<root>
   <time>20160110182701</time>
   <tempSalon>20.0</tempSalon>
   <humidSalon>53.0</humidSalon>
   <tempExt>5.1</tempExt>
   <humidExt>88.0</humidExt>
   <vitesseVent>2.5</vitesseVent>
   <orientVent>240.7</orientVent>
   <Pluviometrie>0.0</Pluviometrie>
</root>

 

Il reste maintenant à faire en sorte que le fichier soit actualisé régulièrement. Pour cela, on va utiliser le service Cron, sous Raspbian, qui permet d’exécuter régulièrement un script.

Pour le configurer, on utilise la commande « crontab -e » (le ‘-e’ est pour éditer, le ‘-l’ permet de l’afficher sur la console. Attention, le ‘-r’ vide sa configuration). Ensuite, on ajoute la ligne suivante (à modifier suivant l’emplacement du script Python).


* * * * * /usr/bin/python /data/weewx2xml.py

Cela permet de faire en sorte que le fichier soit actualisé toutes les minutes.

Une fois que Cron est configuré, il faut relancer le service pour que la configuration soit appliquée.

service cron restart

Remontée dans Jeedom

Pour remonter les informations dans Jeedom, on va utiliser le plugin « script ».

L’aide sur la configuration du script est disponible sur cette page : https://www.jeedom.com/doc/documentation/plugins/script/fr_FR/script.

Pour chaque information, on remplit les champs comme suit :

  • Nom : Nom de la variable enregistrée dans Jeedom
  • Type Script : XML
  • Type : Info / Numérique
  • Requête : nom de la balise présente dans le fichier XML
  • Options :
    • URL du fichier XML : http://IP_du_RPI/weewx2xml.xml (chez moi le serveur s’appelle PiRouette)
    • les autres options ne sont pas utilisées ici
  • Divers : Unité / valeur minimum / valeur maximum
  • Paramètres :
    • Historiser : si on souhaite avoir un graphique présentant l’évolution des valeurs dans le temps
    • Afficher : afficher la valeur sur l’interface Jeedom
    • Évènement et Cache : je ne connais pas encore leur fonction…
  • Le bouton permet de tester que vos paramètres sont corrects. Penser à enregistrer les modifications avant de les tester.

Au final, j’en arrive à cette configuration :

Configuration du plugin Script dans Jeedom

Configuration du plugin Script dans Jeedom

Maintenant que tout est configuré et que les données sont régulièrement remontées à Jeedom, j’obtiens ce panneau et je peux ainsi penser à de nouveaux scenarii en fonction des conditions extérieures (fermer les volets, en mon absence, s’il fait trop chaud dehors – pour maintenir la température fraiche l’été ; m’envoyer un SMS si Jeedom détecte que des fenêtres sont ouvertes et qu »il se met à pleuvoir ; réguler le thermostat en fonction de la température extérieure ; … ).

Aperçu du panneau WeeWX sur Jeedom

Aperçu du panneau WeeWX sur Jeedom

NB : les 3 dernières icônes sont récupérables gratuitement sur le Market des Widgets.

7 Commentaires

  1. 1
    • 2

      Bonjour,
      Dans mon cas, Jeedom et WeeWX ne sont pas sur le même Raspberry Pi. Mais je ne vois pas ce qui empêcherait de le faire. Par contre, il faut soit utiliser Apache pour WeeWX et NGinx pour Jeedom, mais avec un risque de perte de performance, soit utiliser NGinx pour les deux, mais dans ce cas-là, il faut bien dissocier les deux sites pour ne pas mélanger les fichiers.

  2. 3
    • 4

      C’est cela mais pas directement, puisqu’il n’existe pas de module Jeedom qui permettent d’interroger directement une base de données.
      En fait, j’ai un premier Raspberry Pi, sur lequel est installé WeeWX. J’y ai également déposer un script qui interroge régulièrement la base de données de WeeWX, puis qui va générer un fichier XML, disponible sur le serveur Web Apache.
      Ensuite, le deuxième Raspberry Pi, sur lequel est installé Jeedom, va, grâce au module SCRIPT, récupérer le fichier XML, analyser les valeurs, et les enregistrer dans Jeedom, afin qu’elles soient disponibles dans l’interface (ou pour des actions programmées selon les relevés).

  3. 5
  4. 6
  5. 7

    Bonjour
    Je viens de découvrir ton post.
    Il s’avère que je possède une station Vantage Pro2 que je viens de remettre en service aujourd’hui avec le logcile WEEWX et je j’utilise aussi Jeedom.
    Tout cela tourne sur un NUC (i7 16GO) sous 2 Machines virtuelles différentes.
    Je suis très intéressé par les imports des infos de ma station sous Jeedom.
    Je viens donc d’installer WEEWX en suivant la procédure décrite sur le site du développeur.
    Ca fonctionne, je génère bien une page Internet avec différents graphiques.
    Par contre, je ne trouve pas la base de données dans mon système Débian.
    Merci de ton aide.
    Stéphane

Laisser un commentaire

Votre adresse mail ne sera pas publiée. Champs requis *

Vous pouvez utiliser ces balises HTML et attributs: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

Vous pourriez être intéressé par