mardi 18 octobre 2011

Domotique - Température: Le traitement des trames côté PC

Le traitement des trames côté PC est effectué à l'aide d'un script écrit en Python.
Le script lit les trames sur le port série et les enregistre toutes les 5mn dans un fichier (ce qui donne une précision correcte). Toutes les 10mn, le script envoie le contenu du fichier au serveur web.


Lors de la lecture d'une trame sur le port série, le script Python ajoute une info de datage car l'Arduino ne le permet pas (à moins de l'équiper d'un DTC1307).


Accessoirement, le script fait, toutes les 24 heures, le ménage dans le fichier émis pour ne pas que celui-ci grossisse de trop.
Les données supprimées du fichier sont sauvegardées dans un fichier d'historique, avec une précision de 2 heures.
Ce fichier est lui aussi envoyé vers le serveur pour un affichage ultérieur.

Explications du script, dans les grandes lignes:

Déclaration du port série et lecture du port:
Nota: La lecture du port série nécessite d'installer la librairie pyserial.
import serial
ser = serial.Serial('COM4',9600) # Le num de port est à récupérer sous Windows. La vitesse doit être cohérente de celle configurée sur l'Arduino
line = ser.readline() # Lecture d'une trame sur le port série

Connexion à un serveur ftp et envoi de fichier:
connect = ftp.FTP(host,user,password) # on se connecte au serveur ftp

                                                            # host: adresse du serveur FTP
                                                            # user: votre identifiant
                                                            # password: votre mot de passe

a = open('TempsData.txt', 'rb') # On ouvre le fichier à envoyer en binaire
connect.storbinary('STOR TempsData.txt',a) # On envoie le fichier de données
a.close()


Le script Python est téléchargeable ici.

A bientôt pour la partie PHP (mais ça ne va pas être pour tout de suite, il faut que je fasse un peu de ménage dans le script)

samedi 15 octobre 2011

Domotique - Température: Le résultat en courbes

Avant de mettre le sketch et les scripts Python et PHP en ligne, je vous invite à visualiser les courbes de températures comme si vous y étiez !
Ce sont les vraies, issues des capteurs !

Pour info, j'habite Vauréal. Vous pourrez donc à partir d'aujourd'hui connaitre la température extérieure ;)

Le tout est visible ici

Il reste quelques affinages à faire sur le dessin des courbes, notamment l'historique complet, et l'échelle verticale lorsque la sonde extérieure n'est pas sélectionnée.

jeudi 13 octobre 2011

Domotique - Température: Trame Arduino et sketch

Désirant pouvoir mettre en oeuvre un système permettant de rajouter / d'enlever des capteurs de température en ayant un minimum de mises à jours à effectuer, il était nécessaire de définir une trame d'envoi de données permettant de contrôler certains paramètres, tels que la présence d'une sonde par exemple.

La trame émise par l'Arduino a donc la forme suivante:
nb_capteurs;ref_capt1;Temp_capt1;ref_capt2;Temp_capt2;ref_capt3;Temp_capt3.....
En cas de retrait du capteur 2 par exemple, on se retrouve avec une trame du genre:
nb_capteurs;ref_capt1;Temp_capt1;ref_capt3;Temp_capt3.....

Les modules placés en aval seront donc aptes à connaître le nombre de capteurs branchés, et surtout d'associer les données de température aux bons capteurs.

Il est donc nécessaire de connaître le nombre de capteurs branchés à l'Arduino avant même d'envoyer des données sur le port série. En One-wire il n'y a pas, à ma connaissance, de moyen d'interroger la ligne afin d'avoir un retour du nombre de modules qui y seraient branchés.
Dans la pratique, le sketch Arduino effectue un reset de la ligne One-wire, puis interroge séquentiellement tous les capteurs de la ligne.
Lorsqu'aucun capteur ne répond plus, toute la chaîne a été parcourue, il faut refaire un reset pour réinitialiser la séquence de récupération de données. C'est donc lorsque toute la chaîne est parcourue que l'on connait le nombre de capteurs.

Il faut donc, à l'issue de la récupération de toutes les valeurs, envoyer le tout sur le port série.
Pour faciliter le stockage, j'ai choisi de travailler avec des chaines au format String, largement plus pratique que les tableaux de chaînes. Les classes String, non documentées dans le référentiel Arduino français le sont par contre dans la version anglaise de l'aide officielle

Génération de la trame:
Séquentiellement, les données vont être récupérées comme suit:

La trame finale:

3;4e87;19.9;c172;20.0;4574;18.5;
3;4e87;19.9;c172;20.1;4574;18.3;
3;4e87;19.9;c172;20.0;4574;18.1;

Les valeurs des 3 capteurs, référencés 4e87, C172, 4574 sont récupérées et envoyées sur la trame.
Ces références sont directement issues des ref 64 bits des composants.


Le sketch
Comme je l'ai déjà indiqué, ce sketch est tiré directement de l'excellent exemple de mise en oeuvre du DS18B20 sur le site mon-club-elec.fr, ici-même.
Les principales modifications concernent:
- la possibilité de mettre en oeuvre plusieurs capteurs
- la génération de la trame à l'issue de la lecture de tous les capteurs

Le sketch est disponible ici

mercredi 12 octobre 2011

Domotique - Température: Les modules de traitement

N'ayant pas de shield éthernet sous la main, j'ai attaqué ce projet en traitant les données par l'intermédiaire d'un PC.

Dans la pratique, la platine Arduino récupère les infos des capteurs de température, génère une trame avec toutes les données, et diffuse cette trame sur la liaison série.
Le PC récupère cette trame, et l'enregistre périodiquement dans un fichier de log.
Cycliquement, le fichier de log est envoyé sur le serveur Web.

La page web est générée sur le serveur web, au moyen d'un script PHP.


Côté PC, le traitement est effectué en Python.

Alternatives possibles:
La première d'entre elle est bien sûr de mettre en place un shield éthernet pour pouvoir se passer d'un PC.

Une autre alternative possible (si on reste dans le cas de l'utilisation d'un PC) est de se passer d'un serveur web. Il suffit de sauvegarder les données sur un service éthernet permettant de partager des fichiers, tel que Dropbox.com. Le service Dropbox s'utilise comme un répertoire local. Il suffit d'y sauvegarder un fichier pour le retrouver quelques secondes plus tard (pour des tailles de fichier raisonnables) sur tous les autres PC connectés au même compte Dropbox.

Domotique - Température: cahier des charges

Voici, dans les grandes lignes, ce à quoi doit répondre mon installation ... A noter que cette liste peut évoluer à tout instant en fonction des mes envies !

- Contrôler la température dans plusieurs pièces de la maison et en extérieur.
- Etre en mesure de pouvoir rajouter/retirer des capteurs sans à avoir à tout reprendre au niveau de la programmation, ni sans avoir à tout redémarrer
- Pouvoir visualiser la température à l'instant courant, mais aussi les variations sur les x dernières heures, x pouvant être modifié
- Pouvoir effectuer cette visualisation depuis n'importe quel ordinateur connecté à internet


Je pense pouvoir dire que ces critères sont remplis, même s'il reste des choses à faire au niveau de la gestion de l'affichage.

Avant d'aborder les aspects logiciels et matériels, voici un petit aperçu de relevés sur 3 capteurs ...

mardi 11 octobre 2011

Domotique - Température: le DS18B20

Dans le cadre d'un de mes projets, je recherchais un moyen de mesurer une température, sans avoir à me prendre la tête à faire des montages complexes pour étalonner le capteur, convertir les mesures en numérique et j'en passe.

Je suis rapidement tombé sur un capteur répondant à mes critères: le DS1820.
Ce capteur a même 2 autres atouts, qui m'ont amené à initier mon projet de domotique:
- sa techno one-wire, qui, comme son nom ne l'indique pas, permet de mettre en oeuvre ce composant avec 2 fils seulement, et surtout permet d'utiliser plusieurs capteurs sur ces 2 mêmes fils !
- sa résolution. J'ai jeté mon dévolu sur le DS18B20 qui a une résolution de 0.0625°. Je me dis qu'avec une telle précision, il doit être fiable ;) A noter qu'il existe le DS18S20, qui a une résolution plus faible

Autre atout, et de taille: le web regorge d'exemples de mise en oeuvre avec l'Arduino. Je n'ai donc pas réinventé la poudre et je me suis largement inspiré de ce qui est très bien présenté sur le site mon-club-elec

J'ai cependant retouché le sketch car il ne répondait pas vraiment à mon cahier des charges, à savoir:
- permettre de relier plusieurs capteurs de température: dans sa version d'origine, et malgré ce que j'ai cru comprendre dans les explications, le sketch ne permet d'interroger qu'un seul capteur
- ne pas limiter l'installation domotique à un nombre de capteurs fixe, ce qui nécessiterait des retouches trop complexes en cas de modifications (ajout/retrait) de capteurs. Le sketch modifié envoie, en plus des valeurs mesurées, les ref des capteurs ainsi que le nombre de capteurs détectés