Archivage des messages xPL dans une base de données
Voici la procédure pour archiver les messages de votre réseau xPL dans une base de données MySQL.
L’objectif
Beanz, l’auteur du projet xpl-perl a supprimé la fonctionnalité du projet dans la version 0.08.
Cette fonctionnalité répond à un besoin très spécifique.
Archiver TOUS les messages dans une base de données MySQL demande beaucoup de ressources.
Sur mon petit réseau domotique, j’ai déjà plus de 25 messages par minute.
Ce qui produit une base de données importante avec 100 000 entrées par semaine, soit 500 000 par mois, 6 000 000 par an.
Et la taille de la base de données fait dans les 50 Mo par semaine, soit 250Mo par mois, 3Go par an.
Donc pour stocker ces données vous devez en avoir vraiment besoin. C’est mon cas, car :
- Je veux conserver la consommation électrique exact de chaque appareil ;
- Utiliser des optimisations à l’aide d’un réseau de neurones.
Installation
Vous devez disposer d’un réseau xPL fonctionnel et d’une installation de xpl-perl.
Programme
Nous allons récupèrer le code des modules directement dans le svn.
# cd /usr/share/perl5/xPL
# wget http://www.xpl-perl.org.uk/export/892/xpl-perl/branches/r0.08/lib/xPL/SQL.pm
# sed -i -e 's#/etc/xpl-perl/db.config#/etc/xplperl/db.config#' SQL.pm
# cd /usr/bin
# wget http://www.xpl-perl.org.uk/export/892/xpl-perl/branches/r0.08/bin/xpl-sql-logger
# chmod +x xpl-sql-logger
# apt-get install libclass-dbi-loader-perl libdatetime-perl
# cd /etc/xplperl
# cat <
dsn=dbi:mysql:xpl:localhost
user=xpl
password=secret
EOF
#
Base de données
Une fois que vous avez installé le programme, il est nécessaire de configurer la base de données.
Pour cela vous devez créer un utilisateur xpl et une base de données xpl sur votre serveur MySQL.
Ensuite vous créer les tables de la base de données à l’aide des requêtes SQL suivantes :
CREATE TABLE body (
id int NOT NULL auto_increment,
body varchar(1500) default NULL,
PRIMARY KEY (id),
KEY body_idx (body(1000))
);
CREATE TABLE elt (
id int NOT NULL auto_increment,
name varchar(16) default NULL,
value varchar(128) default NULL,
PRIMARY KEY (id),
KEY name_idx (name)
);
CREATE TABLE msg (
id int NOT NULL auto_increment,
time int default NULL,
usec int default NULL,
type char(8) default NULL,
source varchar(34) default NULL,
target varchar(34) default NULL,
class varchar(15) default NULL,
incomplete int default NULL,
body int default NULL,
PRIMARY KEY (id),
KEY class_idx (class),
KEY time_idx (time,usec),
KEY type_idx (type),
KEY body_idx (body)
);
CREATE TABLE msgelt (
id int NOT NULL auto_increment,
msg int NOT NULL,
elt int NOT NULL,
PRIMARY KEY (id),
KEY msg_idx (msg),
KEY elt_idx (elt)
);
Lancement et recette
Vous pouvez ensuite lancer le programme en ligne de commande :
$ xpl-sql-logger
Vous pouvez ensuite vérifier que cela fonctionne dans la base de données :
mysql> SELECT * FROM `msg` ORDER BY id DESC LIMIT 3;
+---------+------------+--------+----------+----------------+--------+--------------+------------+
| id | time | usec | type | source | target | class | incomplete |
+---------+------------+--------+----------+----------------+--------+--------------+------------+
| 7711941 | 1253948224 | 252455 | xpl-trig | bnz-ccost.milk | * | sensor.basic | 0 |
| 7711931 | 1253948224 | 211170 | xpl-trig | bnz-ccost.milk | * | sensor.basic | 0 |
| 7711921 | 1253948224 | 130241 | xpl-trig | bnz-ccost.milk | * | sensor.basic | 0 |
+---------+------------+--------+----------+----------------+--------+--------------+------------+
3 rows in set (0.00 sec)
Lancement automatique
Vous pouvez lancer automatiquement le programme à l’aide de daemontools en plaçant le programme dans le répertoire /etc/services de la manière suivante :
# cd /etc/xplperl/service
# cp -r xpl-hub xpl-sql-logger
# cd xpl-sql-logger
# cat <
#!/bin/sh
exec 2>&1
exec setuidgid xplperl envdir ./env softlimit -d300000 /usr/bin/xpl-sql-logger
EOF
# cd /etc/service
# ln -s /etc/xplperl/service/xpl-sql-logger/
# ps auxww | grep xpl-sql-logger
root 3306 0.0 0.0 1620 332 ? S Sep22 0:00 supervise xpl-sql-logger
xplperl 23943 1.3 0.6 16944 12952 ? S 08:20 0:37 /usr/bin/perl -w /usr/bin/xpl-sql-logger
Surveillance de l’archivage
![]() |
Le système fonctionne très bien. Par contre, j’ai rencontré quelques problèmes au bout d’une ou deux semaines le programme arrête d’archiver les données dans la base, il faut donc le relancer. La solution la plus simple et de relancer le script à l’aide d’un cron et monit |
.
Voici mon crontab :
*/1 * * * * echo "SELECT NOW() - FROM_UNIXTIME(time) FROM msg ORDER BY id DESC LIMIT 1;" | mysql -hlocalhost -uxpl -psecret -s xpl > /tmp/xpl-sql-logger
Voici ma configuration pour monit dans le fichier /etc/monit.d/xpl-sql-logger :
check file xpl-sql-logger with path /tmp/xpl-sql-logger
if match "^[0-9]{1,2}" then stop
stop program = "/usr/bin/killall -r xpl-sql-logger"
Exploitation des données
Pour exploiter les données, je suis en train d’écrire des gadgets pour Portaneo (P.O.S.H) à afin de pouvoir afficher les données sous forme de graphiques ;-)
J’attends avec un impatience votre script pour faire les graphes :)