Forum KNX francophone / English KNX forum
VMC double flux et Zennio Quad - Version imprimable

+- Forum KNX francophone / English KNX forum (https://www.knx-fr.com)
+-- Forum : Français (https://www.knx-fr.com/forumdisplay.php?fid=3)
+--- Forum : Divers KNX (https://www.knx-fr.com/forumdisplay.php?fid=11)
+--- Sujet : VMC double flux et Zennio Quad (/showthread.php?tid=2321)

Pages : 1 2


RE: VMC double flux et Zennio Quad - dclik - 14/02/2014

Salut Suricat,

Tu avais parler d'une page wiki pour mettre ta recette miracle de ton install, où pourrais-je la trouver pour faire du copier coller sur la mienne.

Dclik


RE: VMC double flux et Zennio Quad - Suricat - 16/02/2014

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 !


RE: VMC double flux et Zennio Quad - fma38 - 17/02/2014

C'est très bien, ton truc ! J'avais la même approche pour des graphes téléinfo (qu'il faut que je remette en place, ainsi que pour les températures).

J'avais aussi un script qui pouvait re-créer la base rrdtool depuis toutes les données MySQL ; pratique si tu changes une donnée rrd.


RE: VMC double flux et Zennio Quad - dclik - 18/02/2014

Bonjour,

Merci pour vos retous, c'est juste que je n'avais pas estimé la tâche de ma novice attitude :-)

Dclik