Suivi de consommation électrique (2/2) : les logiciels

FlyportWiFiUne fois le matériel en place, il faut maintenant se pencher sur la partie logicielle. Mon objectif est surtout d’obtenir un résultat qui me permette de valider le concept. En effet, l’intégration de la consommation se fera dans un système plus global de domotique et de pilotage des appareils électriques. Pour l’instant donc, un simple historique graphique suffira.

Au niveau organisation, j’essaie de soulager au maximum le Flyport, pour ne lui faire décoder que les trames provenant du compteur électrique et l’envoi vers un serveur. Ce serveur, basé sur un Linux Ubuntu, fera le traitement de l’information et la création des graphiques. Le Flyport se programme dans un langage C allégé auquel il manque quelques fonctions.

La première étape est donc le décodage des trames. Là survient le premier obstacle : le compteur envoie les données suivant un format bien précis : 1200 baud, 7 bits, 1 bit de parité paire, 1 bit de stop. Or, le Flyport ne gère que les liaisons série en 8 ou 9 bits ! Il faut donc tromper l’UART du Flyport en lui disant que la liaison est en 8 bits mais sans la parité, et de masquer le résultat octet par octet pour effacer le dernier bit :

for (i=0; i<msglen; i++) { // convert from 8-bit to 7-bit
    rcv_uart[i] &= 0x7F;
}

Le décodage des trames est plus compliqué qu’il n’y paraît au premier abord. En effet, je dois d’abord arriver à me synchroniser sur le flux série, puis chercher le début d’une trame (0x02). Ensuite, je stocke les octets dans un buffer, que je parcours pour extraire les informations importantes et affecter mes variables.

L’étape suivante est l’envoi des données par le Wi-Fi. Là survient le deuxième obstacle : la connexion Wi-Fi est capricieuse. Impossible de me connecter directement à ma Freebox pour cause de protocole d’authentification incompatible, je suis obligé de passer par un routeur Linksys WRT54GL tournant sous dd-wrt. A noter qu’il vaut mieux générer la clef brute 256-bit pour la connexion plutôt que de laisser le module la calculer lui-même à partir de votre mot de passe et du SSID, sa puissance de calcul étant limitée. J’utilise pour cela le site de Wireshark. L’envoi des données se fait par le protocole HTTP GET sur une page web en PhP :

// Connect to web site, encode URL params, and send them
socket = create_http_socket("192.168.1.13");
param[1] = ADCO;
sprintf(buffer, "%ld", timest);
param[3] = buffer;
param[5] = HCHP;
param[7] = HCHC;
param[9] = PTEC;
param[11] = IINST;
param[13] = PAPP;
char *request = get_http_request(&pp);
char *response = do_http_request_and_get_response(socket, request);
free(request);
free(response);
close_socket(socket);

La page web qui reçoit la requête :

$adco = $_GET['adco'];
$time = $_GET['time'] - 7200;      // correction GMT
$hp = intval($_GET['hp']);
$hc = intval($_GET['hc']);
$ptec = substr($_GET['ptec'], 0, 2);
$iinst = intval($_GET['iinst']);
$papp = intval($_GET['papp']);
if ($ptec == "HC")
    $ptec = 1;
else
    $ptec = 0;
$opt = $time.":".$hc.":".$hp.":".$papp.":".$iinst;
error_log("$opt\n", 3, "/var/tmp/rrd_update.log");
if (!rrd_update("data/compteur.rrd", $opt)) {
    $err = rrd_error();
    error_log("ERROR occurred : $err\n", 3, "/var/tmp/rrd_update.log");
} else {
    echo("OK");
}

A noter que j’utilise une synchronisation SNTP (Simple Network Time Protocol) une fois la connexion Wi-Fi établie pour avoir une base de temps fiable.

Coté serveur, je stocke mes données dans des fichiers RRD, une habitude héritée des outils d’administrations réseaux. Il ne me reste plus alors qu’à générer mes image via une tâche cron et à créer une page de présentation.

Historique de la consommation

Historique de la consommation

Ce contenu a été publié dans Réalisations personnelles, avec comme mot(s)-clé(s) , , , , , . Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *