Raspberry, grapher sa consommation électrique (partie 2)

On continue dans notre périple du graphage de notre consommation électrique comme vu en première partie. Nous allons cette fois-ci nous intéresser à la partie serveur.

Installation & configuration d’InfluxDb

Sur le serveur à destination les données provenant du raspberry, récupérez la dernière version d’InfluxDb sur http://influxdb.com/download/
wget http://s3.amazonaws.com/influxdb/influxdb_latest_amd64.deb
dpkg -i influxdb_latest_amd64.deb

On édite la configuration d’InfluxDb (/opt/influxdb/shared/config.toml) pour activer le support du protocole collectd, voir l’article que j’ai déjà écrit à ce sujet. On redémarre pour prendre en compte le changement.
Vérifions que le port 25826/udp est bien ouvert.

sudo ss -lupn # liste des port udp en écoute avec le processus
State      Recv-Q Send-Q    Local Address:Port  Peer Address:Port 
...
UNCONN     0      0         :::25826 :::*      users:(("influxdb",pid=7405,fd=22))

Maintenant nous allons créer les utilisateurs et les bases nécessaires pour stocker les données. Connectez-vous avec un navigateur web sur l’interface web d’administration InfluxDb http://monserveur:8083 (root/root pour l’utilisateur et le mot de passe par défaut)

InfluxDb administration

Interface d’administration InfluxDb

Créez tout d’abord une base nommée collectd et un utilisateur homonyme pour cette base; celle-ci stockera les métriques collectés.
Créons ensuite une base grafana et un autre utilisateur, cette base stockera les données grafana, comme les tableaux de bord et les graphes.

Tout est terminé pour ce qui est de la configuration d’InfluxDb.

Démarrage de collectd

Sur le raspberry il est temps de démarrer collectd
/etc/init.d/collectd start
Pour vérifier que tout fonctionne bien, faîtes ps -edf |grep collectd vous devriez voir quelque chose comme cela

root 7129 7127 0 Jan12 ? 00:21:58 collectd -C /etc/collectd/collectd.conf -f
pi 7141 7129 0 Jan12 ? 00:09:19 python -u /home/pi/collectd_teleinfo.py

On voit bien que notre script python tourne.

Maintenant vérifions qu’InfluxDb récupère bien les métriques, pour cela rendez-vous sur l’interface web d’administration dans la base collectd.

select * from /.*/ limit 1

Installation & Configuration de grafana

Je pars du principe que l’on créé un vhost dédié pour l’hébergement de grafana.
Pour le vhost rien de compliqué, il suffit de déclarer un Document Root qui pointe sur un répertoire /srv/www/grafana (un exemple pour nginx est disponible). Pensez-bien à activer le vhost.

On se rend dans le répertoire /srv/www et on place la dernière version de grafana disponible au format tar.gz sur la page http://grafana.org/download/.
On extrait l’archive ce qui va vous donner un répertoire grafana-1.x.x.
Créez un lien symbolique nommé grafana

/srv/www$ ln -s grafana-1.x.x grafana

Cela rendra plus simple les futures mises à jour de versions.
Testez que votre site grafana répond bien, vous devriez avoir une interface noire, c’est bon signe :).

On passe maintenant à la configuration de grafana pour interroger les données dans InfluxDb.
Dans le répertoire du vhost, copiez le fichier config.sample.js en config.js, et éditons ce dernier pour déclarer nos deux sources de données crées précédemment, de sorte que vous ayez quelque chose comme cela:

...
datasources: {
  influxdb: {
    type: 'influxdb',
      url: "http://votre_serveur_influxdb:8086/db/collectd",
      username: 'collectd_user',
      password: 'collectd_pass',
  },
  grafana: {
    type: 'influxdb',
      url: "http://votre_serveur_influxdb:8086/db/grafana",
      username: 'grafana_user',
      password: 'grafana_pass',
      grafanaDB: true
  },
},
...

On déclare les deux datasources créé précédemment, les url doivent être accessible  par le navigateur web que vous utiliserez, un nom public est plus simple de ce point de vue. Notez que le second datasource a un attribut grafanaDB: true pour définir qu’il va stocker vos préférences Grafana.

Pour la configuration des tableaux de bord Grafana, ca sera dans le post suivant (à venir).

Raspberry, grapher sa consommation électrique (partie 1)

Dans cette série de publications, je vais vous détailler comment j’ai mis en place chez moi la collecte des information de télémétrie sur mon compteur électrique, afin de surveiller en temps réel la consommation (Watt + Intensité).
Mon but à long terme est de me rendre compte de manière plus détaillée des spécificités de ma consommation, de ses différences entres les saisons, et de son évolution au cours des années, en fonction des changements et des travaux effectués dans mon habitat.

Graphe de consommation électrique par heure dans grafana.

Graphe de consommation électrique par heure, dans grafana. En vert les plages heures creuses, en rouge les plages heures pleines.

Les critères que j’avais en tête.

  • Économique. Peu de matériel à acheter
  • Une installation avec pas ou peu d’électronique à réaliser. Je n’ai aucune compétence dans ce domaine, et m’investir dans électronique m’aurait coûté en temps et en argent.
  • Basé sur des outils existants. Je n’ai pas envie de créer du code spécifique pour mon propre besoin si des projets existent.
  • Une interface de visualisation puissante. Les graphes générés par rrd sont sympas mais manque de dynamisme.

La solution de collecte se basera sur la solution suivante

Matériel

  • Raspberry Pi (35 € mais je l’avais déjà en fait)
  • un module téléinfo pour Raspberry Pi. Pour ma part j’ai pris un module Yadom RPIDOM Lite (29 €)
  • 2 câbles électriques. Pour raccorder le module téléinfo au compteur.
  • un serveur de stockage pour les métriques. Ça pourrait être sur le Raspberry si on n’utilise pas le stockage sur la carte SD. Dans mon cas, j’ai déjà un serveur Dedibox SC gen2 chez online.fr, qui va me servir à cela, mais vous pouvez l’installer sur n’importe quoi.

Logiciel

  • Collectd. Un système de collecte de métriques, très léger et très performant.
  • Un script de collecte des données du module téléinfo en python.
  • Influxdb. Un serveur de stockage de métriques, j’en ai brièvement parlé auparavant.
  • Grafana. Une application Web pour afficher et exploiter les données stockées dans Infuxdb.
  • Un serveur Web pour faire tourner Grafana.

Présentation

Collectd: C’est un outil qui collecte des métriques. Il a plein d’avantages, léger en consommation ressource, une fréquence de polling élevée (jusqu’à 10 secondes), il est pourvu de plein de plugins pour la lecture de métriques. Il permet d’écrire les données reçues en rrd (le format le plus populaire) mais aussi dans d’autres stockages (NoSQL comme mongoDb ou Redis, en CSV), la liste officielle se trouve à la page https://collectd.org/wiki/index.php/Table_of_Plugins.
Il est possible d’écrire ses propres plugins en perl, python, bash, …Je l’utilise déjà pour la surveillance de mes machines.
InfluxDb: C’est un serveur qui permet le stockage de métriques mais au lieu d’utiliser des fichiers au format RRD, il s’appuie sur le concept de bases élastiques et distribuées.
Grafana: C’est une puissante application web d’affichage dynamique de données provenant d’InfluxDb ou Graphite. Jetez un coup d’œil sur la page de démo pour vous rendre compte des possibilités.
collectd_teleinfo.py: c’est le script que j’ai développé en me basant sur du code d’autres personnes pour collecter les données depuis le device /dev/ttyAMA0 et envoyer les données a destination du démon collectd de la machine. Ce script a été testé pour la tarification heures creuses / heures pleines.

Réalisation

Branchement du module téléinfo sur le compteur électrique

Module RPIDom Lite

Le module permet de transformer le signal des bornes L1/L2 du compteur électrique en signal série. Il suffit de le brancher sur le raspberry sur les broches GPIO et de raccorder deux fils aux broches du compteur électrique.

Comme je n’aime pas la redite, je vous envoie vers la documentation du module RPIDOM sur le site de Yadom pour la configuration du shield sur le raspberry.

teleinfo-I1I2

Mise en place du script de collecte téléinfo

Le script, lancé par collectd, a pour rôle d’aller lire les données du port série (périphérique /dev/ttyAMAO) en boucle et écrire en sortie standard les valeurs récupérées. Ces valeurs sont lues par collectd et envoyées aux différents destinations en écriture.

Vous pouvez récupérer le script dans mon dépôt GitHub. Placez-le où bon vous semble. Vous aurez besoin du paquet python-serial. Pour tester son bon fonctionnement, lancez le script en utilisateur pi avec la commande python -u collect_teleinfo.py, vous devriez voir après quelques instants des lignes similaires.

PUTVAL framboise/teleinfo-intensite/power-imax interval=30 N:49
PUTVAL framboise/teleinfo-intensite/power-iinst interval=30 N:32
PUTVAL ...

Cela veux dire que les données sont bien récupérées. En cas de problème le script devrait vous afficher une erreur compréhensible vous permettant de corriger.

Installation & configuration de collectd

Sur le serveur raspberry, on installe collectd via la commande apt-get install collectd-core.
On créé ensuite la configuration (/etc/collectd/collectd.conf) avec ce contenu.

LoadPlugin exec
LoadPlugin network

<Plugin Exec>
  Exec "pi" "python" "-u" "/path/collectd_teleinfo.py"
</Plugin>

<Plugin Network>
  Server "monserveur.fr" "25826"
</Plugin>

Donc qu’avons-nous fait ?
Nous avons déclaré que nous utilisions le plugin exec pour exécuter une commande python -u /path/collectd_teleinfo.py en tant qu’utilisateur pi. le -u dans la commande est nécessaire pour éviter la mise en cache vers la sortie standard.
Ensuite nous activons le plugin Network et déclarons un serveur collectd qui a le nom monserveur.fr sur le port 25826 qui recevra les métriques lues par ce démon.

Nous pourrions lancer le démon dès maintenant mais le serveur distant n’est pas encore prêt.

Pour la suite passons à l’article suivant.

Remplacer Collectd par InfluxDb pour le stockage des métriques

Je travaille actuellement sur un petit projet personnel qui consiste à enregistrer ma consommation électrique avec un petit appareil (je détaillerais cela dans une note ultérieure) et envoyer les données vers un serveur collectd distant.

Mais, pour faire l’histoire courte, je voulais utiliser influxdb au lieu du système de stockage RRD de collectd mais sans requérir un proxy entre les deux applications pour les faire communiquer ensemble. En lisant les commits influxdb je me suis aperçu qu’il avait le support du protocole natif de collectd depuis la version 0.8.4. Donc il est possible de remplacer la partie serveur de collectd par un serveur influxdb sans problème.

Comme cela m’a semblait peu connu et pas documenté sur le site d’influxdb j’ai pensé que cela serait intéressant de fournir la configuration à effectuer. C’est très simple, il suffit d’ajouter cette section à votre fichier de configuration influxdb sous la section [input_plugins].

[input_plugins.collectd]
enabled = true
port = 25826
database = "collectd"
typesdb = "/usr/share/collectd/types.db"

Je pense que l’exemple parle de lui-même, le port 25826 est le port serveur par défaut de collectd, et typesdb est le fichier collectd de correspondance des types de données. Pour avoir ce fichier, deux solutions possibles, installer collectd sur la machine ou récupérer un fichier sur le dépôt GitHub de collectd.

Maintenant redémarrer votre serveur influxdb et ca devrait être bon. Pour vérifier la bonne collecte, la requête SELECT * from /.*/ dans la database collectd doit vous retourner des valeurs.

J’ai décidé de garder collectd à côté d’influxdb et de configurer mes clients collectd pour envoyer leurs données vers les deux serveurs. Mais l’apport de grafana avec influxdb en fait un couple redoutable. je pense que je ne garderai pas collectd longtemps pour stocker les données en RRD.