Christophe Nowicki

January 13, 2011

Suivi de la consommation d’eau et du bon fonctionnement la climatisation

Voici un exemple d’installation permettant de suivre sa consommation d’eau et recevoir des notifications lors d’un problème avec le circuit de climatisation.

Problématique

Lorsque le système de climatisation d’une salle serveur s’arrête alors la température monte dangereusement, et après avoir perdu quelques routeurs coûtants plusieurs milliers d’euros ;-), nous avons décidé d’agir et mettre en place un système de surveillance.

N’ayant pas trouvé de système / solution comparable dans le commerce.
Nous avons donc décidé de suivre les conseils de mon cousin Piotr Adamski. ;-)

Solution

Nous avons donc mis en place la solution suivante :

Composants

Les composants matériels suivants sont nécessaire :

L’ensemble des composants sont disponibles en France, chez Planet Domotique et sont produits par Embedded DATA Systems.

Pour la partie logiciel vous avez plusieurs choix possibles pour :

  • Faire des graphiques de la consommation d’eau à l’aide du protocole SNMP avec Munin ou Cacti ;
  • Surveiller l’écoulement de l’eau à l’aide de Nagios ou Monit ;

Budget

  • 40 euros TTC pour le compteur d’eau ;
  • 56 euros TTC pour le compteur d’impulsion ;
  • 130 euros TTC pour le serveur Ethernet / 1-wire ;
  • 100-200 euros TTC pour l’installation du compteur par un plombier ;

Total : de 326 à 426 euros TTC

Photos du montage

Voici quelques photos du montage en action :

Surveillance avec Monit

Le script de surveillance pour Monit est disponible sur github :

Simple water watchdog script for OW-SERVER / DS2423 and Monit

Il se lance via monit de la manière suivante :

check process water_watchdog with pidfile water_watchdog.pid
    	start program  = water_watchdog

check file water_watchdog.status with path water_watchdog.status
	ignore match OK
	if match ^KO then alert

Il faut ajouter le chemin absolut aux noms de fichiers.

Le script de surveillance fonctionne sur le principe suivant :

Un lanceur de deamon water_watchdog, lance le script water_watchdog.pl et le surveille en permanence.

Celui-ci interroge toutes les 60 secondes la compteur d’eau et vérifie que la quantité d’eau consommée a bien augmentée dans l’intervalle.

Écrit le résultat dans le fichier water_watchdog.status qui est surveillé par monit.

En cas de coupure d’eau, le nombre de litres d’eau consommée n’évolue pas et une alerte monit est lancée.

Le système est très fiable, mais il est nécessaire de le paramétrer en fonction du débit de votre installation.
Voici ma configuration pour 10 000 l/j :

  • FLOW_ALERT_LOWER_LIMIT = 1
  • RATE = 60

Conclusion

Le script fonctionne en production depuis plusieurs semaines. Il permet d’intervenir très rapidement en cas de coupure et donc de sauver la vie de quelques serveurs ;-)

Références

Filed under: Hardware,Home automation — Tags:, , , , — cscm @ 10:38

September 26, 2009

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 < db.config
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 < run
#!/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

monit logo 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 ;-)

Filed under: Debian,Home automation — Tags:, , , — cscm @ 11:44

Powered by WordPress