Pas de page wiki...
Attention : je ne pilote pas la VMC, je me suis contenté de mesurer la température dans les 4 conduits. Donc un Zennio Quad + 4 sondes.
Le quad est configuré pour envoyer la température toutes xx minutes ou à chaque changement :
Côté linknx.xml il y a plusieurs lignes intéressantes
- dans <services>
<persistence type="mysql" host="localhost" user="xxx" pass="yyy" db="linknx" table="persist" logtable="log" />
- dans <objects> mes 4 températures avec les 4 GAD utilisées par le Quad
<object type="9.xxx" id="TempVmcInsuflation" gad="3/0/6" init="request" log="true">Temperature VMC Insuflation</object>
<object type="9.xxx" id="TempVmcNeuf" gad="3/0/5" init="request" log="true">Temperature VMC Neuf</object>
<object type="9.xxx" id="TempVmcRejet" gad="3/0/8" init="request" log="true">Temperature VMC Rejet</object>
<object type="9.xxx" id="TempVmcVicie" gad="3/0/7" init="request" log="true">Temperature VMC Vicie</object>
Comme les données sont persistantes elles sont stockées dans une base mysql
La base est ultra simple :
Code :
mysql> show tables;
+------------------+
| Tables_in_linknx |
+------------------+
| log |
| persist |
+------------------+
2 rows in set (0.01 sec)
mysql> desc persist;
+--------+--------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+-------------------+-----------------------------+
| object | varchar(256) | NO | PRI | NULL | |
| value | varchar(256) | NO | | NULL | |
| ts | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+--------+--------------+------+-----+-------------------+-----------------------------+
3 rows in set (0.00 sec)
mysql> desc log;
+--------+--------------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+-------------------+-------+
| ts | timestamp | NO | | CURRENT_TIMESTAMP | |
| object | varchar(256) | NO | MUL | NULL | |
| value | varchar(256) | NO | | NULL | |
+--------+--------------+------+-----+-------------------+-------+
3 rows in set (0.01 sec)
Donc tout arrive dans log, j'ai rien dans persist :
Code :
mysql> select count(*) from log;
+----------+
| count(*) |
+----------+
| 1273127 |
+----------+
1 row in set (0.02 sec)
Par exemple les 10 dernières entrèes (c'est du temps réel :-)
Code :
mysql> select * from log where object like 'TempVmc%' order by ts desc limit 10;
+---------------------+--------------------+-------+
| ts | object | value |
+---------------------+--------------------+-------+
| 2014-02-16 23:25:18 | TempVmcInsuflation | 16.8 |
| 2014-02-16 23:25:18 | TempVmcNeuf | 10.2 |
| 2014-02-16 23:24:18 | TempVmcInsuflation | 16.7 |
| 2014-02-16 23:24:18 | TempVmcRejet | 9.2 |
| 2014-02-16 23:24:18 | TempVmcNeuf | 10.1 |
| 2014-02-16 23:23:18 | TempVmcInsuflation | 16.9 |
| 2014-02-16 23:23:18 | TempVmcNeuf | 10.2 |
| 2014-02-16 23:22:18 | TempVmcInsuflation | 17 |
| 2014-02-16 23:22:18 | TempVmcRejet | 9.3 |
| 2014-02-16 23:21:18 | TempVmcInsuflation | 16.8 |
+---------------------+--------------------+-------+
10 rows in set (39.18 sec)
ça c'est pour le stockage des données.
Pour le graphique, rrdtool (cf Google). je suis pas très doué en rrd, donc ce n'est probablement pas optimisé
Création des 4 bases rrd pour les 4 températures
Code :
rrdtool create tempvmcneuf.rrd --step=300 --start=1348915602 "DS:temp:GAUGE:600:U:U" "RRA:LAST:0.5:1:288" "RRA:LAST:0.5:1:2016" "RRA:MAX:0.5:12:168" "RRA:MAX:0.5:288:365" "RRA:AVERAGE:0.5:12:168" "RRA:AVERAGE:0.5:288:3
rrdtool create tempvmcrejet.rrd --step=300 --start=1348915602 "DS:temp:GAUGE:600:U:U" "RRA:LAST:0.5:1:288" "RRA:LAST:0.5:1:2016" "RRA:MAX:0.5:12:168" "RRA:MAX:0.5:288:365" "RRA:AVERAGE:0.5:12:168" "RRA:AVERAGE:0.5:288:
rrdtool create tempvmcinsuflation.rrd --step=300 --start=1348915602 "DS:temp:GAUGE:600:U:U" "RRA:LAST:0.5:1:288" "RRA:LAST:0.5:1:2016" "RRA:MAX:0.5:12:168" "RRA:MAX:0.5:288:365" "RRA:AVERAGE:0.5:12:168" "RRA:AVERAGE:0.
rrdtool create tempvmcvicie.rrd --step=300 --start=1348915602 "DS:temp:GAUGE:600:U:U" "RRA:LAST:0.5:1:288" "RRA:LAST:0.5:1:2016" "RRA:MAX:0.5:12:168" "RRA:MAX:0.5:288:365" "RRA:AVERAGE:0.5:12:168" "RRA:AVERAGE:0.5:288:
Ensuite, je ne savais pas trop comment faire, alors j'ai fait un script qui toutes les 5 minutes pousse les valeurs depuis la base mysql vers rrdtool.
On doit probablement pouvoir faire ça directement depuis linknx !
L'appel du script en crontab :
*/5 * * * * /home/pi/rrd/rrd-push_value.sh tempvmcneuf
Le script
Code :
#!/bin/bash
RRDPATH=/home/pi/rrd
if [ "$1" == "" ]; then
echo "Il faut donner le nom de l'objet dont il faut récupérer la valeur"
exit -1
fi
OBJET=$1
if [ "$2" != "" ]; then
RRDFILE=$2
else
RRDFILE=$RRDPATH"/"$1.rrd
fi
if [ ! -f "$RRDFILE" ]; then
echo "Il n'y a pas de fichier $RRDFILE"
echo "Vous pouvez donner le nom de fichier en second paramètre ou changer le chemin par defaut dans le script ($RRDPATH qui sera compléter par le nom de l'objet) "
exit -1
fi
data=`mysql --batch --disable-column-names -u xxxx-plinknx yyyy -e "select unix_timestamp(ts),value from log where object = '$OBJET' order by ts desc limit 1;"`
if [ "$data" == "" ]; then
echo "Erreur dans la requête SQL pour l'objet $OBJET : pas de valeur"
exit -1
fi
data_ts=`echo $data | cut -d ' ' -f1`
data_value=`echo $data| cut -d ' ' -f2`
rrdtool update $RRDFILE N:$data_value
if [ "$?" -eq "1" ]; then
echo "Erreur d'exécution de rrdtool update pour l'objet $OBJET"
exit -1
fi
exit 0
Et ensuite je génère le graphe qui prend les 4 valeurs avec de la couleur etc...
Code :
rrdtool graph /var/www/rrd/tempvmc-day.png --right-axis 1:0 --vertical-label=VMC --start now-3d --end now --width 1728 --height 300 "DEF:neuf=/home/pi/rrd/tempvmcneuf.rrd:temp:LAST" "DEF:insuflation=/home/pi/rrd/tempvmcinsuflation.rrd:temp:LAST" "DEF:vicie=/home/pi/rrd/tempvmcvicie.rrd:temp:LAST" "DEF:rejet=/home/pi/rrd/tempvmcrejet.rrd:temp:LAST" "VDEF:vneuf=neuf,LAST" "VDEF:vinsuflation=insuflation,LAST" "VDEF:vvicie=vicie,LAST" "VDEF:vrejet=rejet,LAST" "CDEF:economie=insuflation,neuf,-" "AREA:neuf#ffe7e7" "AREA:insuflation#e4ffe4" "LINE2:neuf#FF0000:Neuf\\t" "GPRINT:vneuf:%2.1lf °C\\n" "LINE1:insuflation#00c500:Insuflation\\t" "GPRINT:vinsuflation:%2.1lf °C\\n" "LINE1:vicie#0000FF:Vicie\\t" "GPRINT:vvicie:%2.1lf °C\\n" "LINE1:rejet#000000:Rejet\\t" "GPRINT:vrejet:%2.1lf °C\\n" "LINE:19#FF00FF" > /dev/null
et ça ressemble à ça
http://www.suricat.net/vmc.png
Tu n'as pas tout compris ? Normal, c'est du bricolage...
Relire, relire et relire :-)
Poses tes questions ensuite !