# Monitorer sa consommation électrique
## Matériel
Je me suis basé sur le matériel que j'utilise déjà pour mon projet de [volets](volets.html), à savoir mon boitier [RFXtrx433E](http://www.rfxcom.com/RFXtrx433E-USB-43392MHz-Transceiver/en) de chez RFXCOM associé à ma [cubieboard2](http://cubieboard.org).
Pour la mesure électrique, j'ai acheté un petit compteur émettant en 433Mhz, un [OWL CM180](http://www.planete-domotique.com/compteur-de-consommation-electrique-owl-micro-cm180.html) (~45€). Ce capteur est livré avec une pince ampèremétrique et un transmetteur 433Mhz, ainsi qu'un petit afficheur LCD qui permet de voir sa consommation en temps réel.
On peut ajouter des pinces ampèremétrique sur le transmetteur mais ma maison étant en monophasé, une seule pince suffit.
## Récupération des données sous Linux
Pour récupérer les données du capteur OWL sous Linux, j'utilise la même librairie python que pour mes volets, [RFXcmd](https://github.com/ssjoholm/rfxcmd_gc).
A noter que nous allons cette fois nous mettre en mode "écoute", nous ne pourrons donc pas en même temps gérer les volets et grapher la consommation électrique de la maison.
Tout d'abord, commençons par configurer la librairie RFXcmd, via le fichier *config.xml*. Celui-ci est en XML.
Les parties intéressantes seront les blocs **Daemon**, **RRD** et **Protocol configuration**.
```markdown
$ vim config.xml
yes
/var/run/rfxcmd.pid
yes
/path/to/rfxcmd/rrd/
yes
protocol.xml
```
Cela permet d'activer RFXcmd en mode "daemon", et de stocker les valeurs dans un fichier RRD, selon les protocoles autorisés dans le fichier *protocol.xml*. Nous allons donc éditer ce dernier.
Le protocole sur lequel communique le boîtier OWL correspond à *Oregon Scientific*. On l'active simplement en changeant son état (0->1).
```markdown
$ vim protocol.xml
18
Oregon Scientific
1
```
En cas de besoin, on peut aussi activer les blocs **Logging** et **Log messages**, à des fins de debug. **Log messages** permet de sauvegarder les messages bruts dans un fichier *msg.log*, et **Logging** permet d'activer du debug (*rfxcmd.log*).
```markdown
$ vim config.xml
debug
rfxcmd.log
no
msg.log
```
Pour mon usage j'ai aussi activé le stockage dans une base MySQL (bloc **MySQL**) mais cela ne me sert pas encore... mon système n'est pas assez récent pour supporter un docker / grafana / etc...
On lance ensuite le daemon RFXcmd via la commande suivante :
```markdown
$ sudo ./rfxcmd.py -d /dev/ttyUSB0 -l
```
Au bout de quelques secondes le processus passe à l'arrière-plan.
On remarque assez rapidement qu'un dossier s'est crée dans le dossier */path/to/rfxcmd/rrd/* configué, avec l'id du capteur :
```markdown
$ find rrd/ -type f
rrd/5A/8062.rrd
```
Cependant, avec cette technique le process ne survivra pas à un reboot de la board. Il faut un moyen de lancer ce processus au démarrage ... J'ai choisi un bon vieux *rc.local* pour cela (ma board ne tourne pas encore avec systemd).
```markdown
$ sudo vim /etc/rc.local
# Electricite
pushd /home/cubie/rfxcmd/ >/dev/null 2>&1
./rfxcmd.py -d /dev/ttyUSB0 -l
popd >/dev/null 2>&1
```
## Génération des graphs
Une fois les données récupérées et stockées dans notre fichier rrd, on va pouvoir générer des graphs assez facilement à partir de celles-ci. Pour ce faire, on utilise l'outil **rrdtool**.
```markdown
$ cd /path/to/rfxcmd/rrd/
/usr/bin/rrdtool graph 1d.png -w 994 -h 346 -a PNG \
--title "Instant Power 1 day" \
--slope-mode \
--start -86400 --end now \
--vertical-label "W" \
--lower-limit 0 \
'DEF:probe1=5A/8062.rrd:Watt:AVERAGE' \
'LINE1:probe1#ff0000:Power (W)' \
'GPRINT:probe1:LAST:Last Power value\: %2.0lf W' \
'GPRINT:probe1:AVERAGE:Average\: %2.0lf W' \
'GPRINT:probe1:MIN:Minimum\: %2.0lf W' \
'GPRINT:probe1:MAX:Maximum\: %3.0lf W'
```
On graph ici sur une journé nos valeurs, sous forme d'image png. Le graph reportera les watts consommés (W), et en-dessous les valeurs maximum, minimum et moyenne sur la durée.
On peut dupliquer ce bloc dans un script, pour générer les graphs sur une heure, une semaine, un mois, ...
```markdown
$ cat rrd/gengraph.sh
#!/bin/bash
#
pushd /path/to/rfxcmd/rrd/
/usr/bin/rrdtool graph 1h.png -w 994 -h 346 -a PNG \
--title "Instant Power 1 hour" \
--slope-mode \
--start -3600 --end now \
--vertical-label "W" \
--lower-limit 0 \
'DEF:probe1=5A/8062.rrd:Watt:AVERAGE' \
'LINE1:probe1#ff0000:Power (W)' \
'GPRINT:probe1:LAST:Last Power value\: %2.0lf W' \
'GPRINT:probe1:AVERAGE:Average\: %2.0lf W' \
'GPRINT:probe1:MIN:Minimum\: %2.0lf W' \
'GPRINT:probe1:MAX:Maximum\: %3.0lf W'
/usr/bin/rrdtool graph 1d.png -w 994 -h 346 -a PNG \
--title "Instant Power 1 day" \
--slope-mode \
--start -86400 --end now \
--vertical-label "W" \
--lower-limit 0 \
'DEF:probe1=5A/8062.rrd:Watt:AVERAGE' \
'LINE1:probe1#ff0000:Power (W)' \
'GPRINT:probe1:LAST:Last Power value\: %2.0lf W' \
'GPRINT:probe1:AVERAGE:Average\: %2.0lf W' \
'GPRINT:probe1:MIN:Minimum\: %2.0lf W' \
'GPRINT:probe1:MAX:Maximum\: %3.0lf W'
/usr/bin/rrdtool graph 1w.png -w 994 -h 346 -a PNG \
--title "Instant Power 1 week" \
--slope-mode \
--start -604800 --end now \
--vertical-label "W" \
--lower-limit 0 \
'DEF:probe1=5A/8062.rrd:Watt:AVERAGE' \
'LINE1:probe1#ff0000:Power (W)' \
'GPRINT:probe1:LAST:Last Power value\: %2.0lf W' \
'GPRINT:probe1:AVERAGE:Average\: %2.0lf W' \
'GPRINT:probe1:MIN:Minimum\: %2.0lf W' \
'GPRINT:probe1:MAX:Maximum\: %3.0lf W'
...
[ -d /usr/share/nginx/www/rrd/ ] && rsync -a 1*.png /usr/share/nginx/www/rrd/
popd
```
Et on place ça dans un cron :
```markdown
$ cat /etc/crontab
...
# electricite
*/5 * * * * user /path/to/rfxcmd/rrd/gengraph.sh >/dev/null 2>&1
```
Vous remarquerez à la fin du script une petite copie des fichiers générés vers un dossier **nginx**. Cela va nous permettre d'afficher ces graphs rrd dans une page web basique, consultable plus facilement que les images png générées... Pour cela, on installe donc simplement en local *nginx*, et on configure une simple page web. J'utilise pour ma part [Strapdown.js](http://strapdownjs.com), comme template markdown.
Le rendu est ici : [power](power.html)
## Fin
Il resterait une partie "coûts" à intégrer, pour grapher le coût par jour / mois / anné de ma consommation électrique...