Christophe Nowicki

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

September 12, 2009

La dette technique

Je viens de finir une analyse de code pour un client. J’aime beaucoup ce type de missions, car elles permettent de remettre en perspective mon travail et de mieux analyser les différentes implications de l’organisation sur le développement.

J’essaye dans ce type de mission d’identifier quels sont les points d’organisation qui transparaissent dans l’analyse de code.

Dans plusieurs cas, j’ai pu retrouver des similitudes. Ces similitudes peuvent être regroupées sous le terme de “dette technique”.

Dans cette article, je vais essayer de définir le concept, vous présenter les symptômes, les origines, les conséquences et les solutions envisageables.

Définition de la dette technique

Lorsque vous ajoutez une fonctionnalité à un logiciel, vous avez deux
possiblités :

  • Faire le plus rapide possible, c’est à dire en utilisant la
    technique la plus facile, la plus rapide et négliger la conception
  • Prendre le temps de réaliser proprement la fonctionnalité, créer une architecture, spécifier les besoin fonctionnels, techniques, faire des tests, etc.

On peut établir une métaphore financière avec la mise en place d’une solution à court terme telle qu’évoquée dans le premier cas de figure en parlant de dette technique.

Vous empruntez du temps sur l’avenir. Comme dans le cas d’un crédit. Mais le coût de cet emprunt n’est pas nul.
Plus vous développez rapidement et mal et plus la dette grandit, les intérêts se cumulent.
Et le projet peut faire faillite sous le coût de la dette.

Symptômes

Voici des exemples de situations réellement vécues au sein d’entreprises :

  • Absence de documentation sur la structure du projet : où se trouve le code source? dans quel répertoire se trouve la documentation du projet, où sont les fichiers CSS, etc.
  • Aucun test unitaire ou fonctionnel ;
  • “Lorsque je change une ligne dans le module A, cela casse le fonctionnement du module B”
  • “Ne touche pas à cette partie du code, nous ne savons pas ce qu’elle fait exactement, mais dieu merci cela fonctionne encore” ;
  • Nous venons de perdre un disque dur sur le serveur de production, où sont les sauvegardes?
  • J’ai l’impression d’avoir déjà corrigé ce bug plusieurs fois, étrange….
  • Code sans aucun commentaire ou avec des commentaire trop anciens ;
  • La connaissance du projet dépend d’une seule personne ;
  • Je vais mettre un commentaire TODO ou FIXME et je corrigerai le problème plus tard ;
  • Nous ne pouvons pas mettre à jour les composants du serveur, cela va casser le code ;
  • Nous n’avons pas le temps de faire cela, ce n’est pas une urgence vitale ;
  • Nous ne pouvons pas mettre à jour le code, personne ne comprend cette partie du code …
  • La personne responsable du module est partie en vacances …

Vous avez aussi entendu ou vécu ce genre de situation ?
Alors appelez le 81212 et dites ‘Thermomètre’ ;-)

Les origines

Qui est responsable de ces problèmes. La réponse est assez simple, car chaque intervenant du projet est responsable :

  • le chef de projet qui néglige la conception, planifie mal
    l’exécution des tâches ou ne transmet par correctement les demandes des clients ;
  • le client qui s’introduit dans la conception technique du
    logiciel et qui impose brutalement son point de vue ;
  • le développeur qui ne sait pas dire “non”, qui surestime ses
    capacité ou bien qui ne joue pas collectivement dans une équipe ;
  • les utilisateurs avides de fonctionnalités et volatiles dans leur
    demandes ;

Les conséquences

Les conséquences de la dette technique sont les suivantes :

  • Augmentation du temps de développement ;
  • Impossibilité de prévoir et d’anticiper les coûts d’entretien ;
  • Difficulté pour faire rentrer un nouveau développeur dans l’équipe ;
  • Faillite

Solutions

Technique

La solution technique miracle permettant de vous sortir du bourbier n’existe pas.

Ceux qui vous disent qu’il suffit de refaire le logiciel avec une autre
technologie / technique ont sûrement quelque chose à vous vendre ;-)

Infrastructure

Il faut absolument mettre en place une infrastructure pour chaque
développement quelle que soit la taille du projet.

  • Un logiciel de suivi de bugs : comme Request Tracker, Trac, Mantis, etc…
  • Un système de suivi de version tel que Subversion, Git ou Mercurial ;
  • Un système de sauvegarde ;
  • L’automatisation des tâches à l’aide d’un système de compilation automatique ;
  • Des tests unitaires et fonctionnels automatisés ;

Refactorisation

La refactorisation est une forme de paiement des intérêts de la dette.
En effet, elle permet de faire une pause dans le développement et de “nettoyer” le code.

Méthodes de développements

Je ne vais pas lancer une querelle de clocher, je ne vais pas non plus vous dire que telle ou telle méthode de développement est la meilleure.

Il existe un bon nombre de méthodes de développement.

Chaque méthode présente ses avantages et ses inconvénients.

Par contre, une chose est sûre, les équipes de développement qui appliquent une méthode de développement rencontrent moins souvent ce type de problème.

Un peu de provocation

Je ne résiste pas ;-)
Est-ce que la dette technique est mauvaise dans tous les cas ?
Comme dans le cas d’une patate chaude cela dépend de qui paiera les intérêts.
Il est possible de faire un prêt ninja avec les intérêts de la dette.

Cela fonctionne dans le cas d’un marché ou “the-winner-takes-all”.
Par exemple, dans le cas d’une start-up innovante dont le seul but est de revendre le logiciel.

La dette technique permet de partir plus vite au soleil ;-)

Références

Filed under: Programming,Work — Tags:, — cscm @ 09:24

September 6, 2009

Communication à l’aide du protocole ZigBee entre un PC et une carte Arduino

L’objectif de ce montage est de faire communiquer un PC avec une carte Arduino à l’aide du protocole ZigBee
Voici l’architecture de montage :

Cette article décrit la mise en place d’une topologie réseau simple, permettant de communiquer entre un PC et une carte Arduino à l’aide de modules XBee série 1 de chez Digi.

Les composants

Le montage nécessite les composants suivants :

  • un PC, fonctionnant sous Debian GNU/Linux pour ma part ;
  • une carte Arduino ou bien un adaptateur USB relié au PC ;
  • deux modules de communication XBee ;
  • une carte Arduino avec un adaptateur XBee.

A propos du protocole ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios, à consommation réduite, basée sur la norme IEEE 802.15.4 pour les réseaux à dimension personnelle (WPANs).

C’est vraiment un très bon protocole, qui est bien plus simple à mettre en œuvre que le protocole Bluetooth. Je ne sais pas si vous avez déjà vu la stack du protocole. Il y a de quoi avoir peur ;-)

xBee, ZigBee et beeee?

Si vous êtes perdus avec tous ces sigles, c’est normal. Moi aussi ;-) Voici ce que j’ai compris :

  • ZigBee : est le nom du protocole ;
  • XBee : est le nom du produit chez le constructeur Digi ;
  • IEEE 802.15.4 : c’est le nom du standard qui définit le communication dans un WPAN ;

Ok, c’est vraiment pas plus claire ;-) Mais c’est dit.

Liste des composants

Vous avez besoin des composants suivants :

Nom du composant Archeter chez Quantité Prix
Platine d’interface USB pour modules “XBEE” Lextronic 1 (optionnel) 23€ TTC
Module xBee Matlog 1 (optionnel) 20€ TTC
Arduino Duemilanove Libelium 2 24€ TTC
Arduino Xbee ZB 2mW + UFL Antenna Libelium 2 50€ TTC

Partie PC

La connexion entre le module Xbee et un PC peut se faire de deux manières :

  • à l’aide d’un adaptateur USB ;
  • à l’aide d’une carte Arduino et d’un Shield XBee ;

L’objectif pour la partie PC du montage est de communiquer avec le module XBee, à fin de lui envoyer des commandes.
Cette communication se fait à l’aide d un convertisseur USB-Serial, ce rôle est joué par l’adaptateur USB ou bien par la carte Arduino + Shield.

Connexion à l’aide de l’adaptateur USB

L’adaptateur XBee se connect directement sur le port USB du PC :

Un fois branché, le module est visible à l’aide de la commande lsusb :

Bus 002 Device 013: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC

Communication à l’aide d’une carte Arduino + XBee Shield

L’adaptateur XBee se connecte directement sur la carte Arduino :

Il est nécessaire de modifier la configuration par du shield pour mettre la carte en mode USB-Serial.
Pour cela, il faut mettre les deux jumper à droite (éloigner du port USB), comme sur cette photo : Configuration mode USB-serial
Vous pouvez ensuite brancher la carte Arduino et voir le module XBee à l’aide de la commande lsusb :

Bus 002 Device 013: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC

Connexion à l’aide d’un gestionnaire de terminal

Une fois que le module XBee est connecté au PC, il doit être disponible sur /dev/ttyUSB0 :

[31016.280327] ftdi_sio 2-8.3:1.0: FTDI USB Serial Device converter detected
[31016.280354] /build/buildd/linux-2.6.24/drivers/usb/serial/ftdi_sio.c: Detected FT232RL
[31016.280449] usb 2-8.3: FTDI USB Serial Device converter now attached to ttyUSB0

Pour communiquer avec le module, il faut utiliser un programme de gestion de terminal ( gtkterm, minicom ou bien l’IDE de la carte Arduino).
Voici la configuration pour gtkterm :

Configuration du module XBee

Une fois que vous etes connecté au module XBee, vous pouvez lui envoyer des commandes à l’aide du gestionnaire de terminal.
Le module dispose de deux mode de fonctionnement : normal et configuration.
Pour passer en mode configuration, il faut saisir +++ (sans CR, retour à la ligne).
Si le module a compris la commande, alors il retourne OK.
Voici un exemple de session :
.

Configuration d’un réseau bidirectionnelle simple

Voici les différentes instructions pour configurer un réseau simple, c’est à dire une communication bidirectionnelle entre deux cartes Arduino ou bien entre un PC et une carte Arduino

Configuration sur la carte reliée au PC


+++OK
ATMY1234
OK
ATDL5678
OK
ATDH0
OK
ATID1111
OK

Configuration du module Arduino


+++OK
ATMY5678
OK
ATDL1234
OK
ATDH0
OK
ATID1111
OK

Les commandes importantes sont :

  • ATMY : adresse source ;
  • ATDL : adresse de destination (bite de poids faible) ;
  • ATDH : adresse de destination (bite de poids fort) ;
  • ATID : identifiant du réseau ;

Utilisation au niveau de la carte Arduino

Il faut inscrire le programme suivant dans la mémoire de la carte :

void setup() {
Serial.begin(9600);
Serial.print("+++");
Serial.print("ATDH0\r");
Serial.print("ATDL1234\r");
Serial.print("ATMY5678\r");
Serial.print("ATID1111\r");
Serial.print("ATCN\r");
}
void loop() {
delay(1000);
Serial.print("42\n");
}

La programmer et changer le sens des deux “jumper” pour faire communiquer le module avec la carte.

Référence

Si vous voulez vous simplifier la vie, il existe une bibliothèque pour la programmation des modules xbee : xbee-arduino.

Filed under: Do it yourself,Home automation,Robotics — Tags:, , — cscm @ 19:43

Powered by WordPress