# Monitorer sa consommation &eacute;lectrique ## Mat&eacute;riel Je me suis bas&eacute; sur le mat&eacute;riel que j'utilise d&eacute;j&agrave; pour mon projet de [volets](volets.html), &agrave; savoir mon boitier [RFXtrx433E](http://www.rfxcom.com/RFXtrx433E-USB-43392MHz-Transceiver/en) de chez RFXCOM associ&eacute; &agrave; ma [cubieboard2](http://cubieboard.org). Pour la mesure &eacute;lectrique, j'ai achet&eacute; un petit compteur &eacute;mettant en 433Mhz, un [OWL CM180](http://www.planete-domotique.com/compteur-de-consommation-electrique-owl-micro-cm180.html) (~45&euro;). Ce capteur est livr&eacute; avec une pince amp&egrave;rem&eacute;trique et un transmetteur 433Mhz, ainsi qu'un petit afficheur LCD qui permet de voir sa consommation en temps r&eacute;el.<br/> On peut ajouter des pinces amp&egrave;rem&eacute;trique sur le transmetteur mais ma maison &eacute;tant en monophas&eacute;, une seule pince suffit. ## R&eacute;cup&eacute;ration des donn&eacute;es sous Linux Pour r&eacute;cup&eacute;rer les donn&eacute;es du capteur OWL sous Linux, j'utilise la m&ecirc;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 "&eacute;coute", nous ne pourrons donc pas en m&ecirc;me temps g&eacute;rer les volets et grapher la consommation &eacute;lectrique de la maison. Tout d'abord, commen&ccedil;ons par configurer la librairie RFXcmd, via le fichier *config.xml*. Celui-ci est en XML.<br/> Les parties int&eacute;ressantes seront les blocs **Daemon**, **RRD** et **Protocol configuration**. ```markdown $ vim config.xml <!-- Daemon --> <daemon_active>yes</daemon_active> <daemon_pidfile>/var/run/rfxcmd.pid</daemon_pidfile> <!-- RRD --> <rrd_active>yes</rrd_active> <rrd_path>/path/to/rfxcmd/rrd/</rrd_path> <!-- Protocol configuration --> <protocol_startup>yes</protocol_startup> <protocol_file>protocol.xml</protocol_file> ``` Cela permet d'activer RFXcmd en mode "daemon", et de stocker les valeurs dans un fichier RRD, selon les protocoles autoris&eacute;s dans le fichier *protocol.xml*. Nous allons donc &eacute;diter ce dernier.<br/> Le protocole sur lequel communique le bo&icirc;tier OWL correspond &agrave; *Oregon Scientific*. On l'active simplement en changeant son &eacute;tat (0->1). ```markdown $ vim protocol.xml <protocol> <id>18</id> <name>Oregon Scientific</name> <state>1</state> </protocol> ``` En cas de besoin, on peut aussi activer les blocs **Logging** et **Log messages**, &agrave; 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 <!-- Logging --> <loglevel>debug</loglevel> <logfile>rfxcmd.log</logfile> <!-- Log messages --> <log_msg>no</log_msg> <log_msgfile>msg.log</log_msgfile> ``` Pour mon usage j'ai aussi activ&eacute; le stockage dans une base MySQL (bloc **MySQL**) mais cela ne me sert pas encore... mon syst&egrave;me n'est pas assez r&eacute;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 &agrave; l'arri&egrave;re-plan.<br/> On remarque assez rapidement qu'un dossier s'est cr&eacute;e dans le dossier */path/to/rfxcmd/rrd/* configu&eacute;, avec l'id du capteur : ```markdown $ find rrd/ -type f rrd/5A/8062.rrd ``` Cependant, avec cette technique le process ne survivra pas &agrave; un reboot de la board. Il faut un moyen de lancer ce processus au d&eacute;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&eacute;n&eacute;ration des graphs Une fois les donn&eacute;es r&eacute;cup&eacute;r&eacute;es et stock&eacute;es dans notre fichier rrd, on va pouvoir g&eacute;n&eacute;rer des graphs assez facilement &agrave; 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&eacute; nos valeurs, sous forme d'image png. Le graph reportera les watts consomm&eacute;s (W), et en-dessous les valeurs maximum, minimum et moyenne sur la dur&eacute;e. <br/> On peut dupliquer ce bloc dans un script, pour g&eacute;n&eacute;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 &ccedil;a dans un cron : ```markdown $ cat /etc/crontab ... # electricite */5 * * * * user /path/to/rfxcmd/rrd/gengraph.sh >/dev/null 2>&1 ``` Vous remarquerez &agrave; la fin du script une petite copie des fichiers g&eacute;n&eacute;r&eacute;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&eacute;n&eacute;r&eacute;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.<br/> Le rendu est ici : [power](power.html) ## Fin Il resterait une partie "co&ucirc;ts" &agrave; int&eacute;grer, pour grapher le co&ucirc;t par jour / mois / ann&eacute; de ma consommation &eacute;lectrique...