Station météo Raspberry Pi - La capture en Python et le stockage avec SQLite
La suite de la fabrication de notre station météo avec le Raspberry Pi. Après la configuration des émetteurs et l’assemblage des boitiers, il faut récupérer les mesures et les stocker quelque part.
- La base de données. Pour mémoriser les données reçues il va nous falloir définir une base SQLite.Dans cette base il nous faut deux tables :
Une table pour l’ensemble des émetteurs. Nous allons y stocker l’identifiant de l’émetteur, son voltage avec la date et heure de dernière mise à jour, la position de l’émetteur (intérieur ou extérieur par exemple), la fréquence de collecte des données.
- Installer sqlite3 pour contrôler votre base de données
apt-get install sqlite3
- Installer ntpdate pour avoir l’heure exacte
apt-get install ntpdate
Puis lancer manuellement :
ntpdate pool.ntp.org
Par crontab, ajouter la ligne pour une mise à jour toutes les heures
0 */1 * * * ntpdate pool.ntp.org
en utilisant la commande
crontab -e
- Installer python pour le script de récupération sur le port série
apt-get install python
- Vous pouvez maintenant créer votre base de données :
mkdir /var/www cd /var/www sqlite3 meteoPi.db
Vous envoyez maintenant les commandes suivantes pour créer les différentes tables
DROP TABLE IF EXISTS Emetteurs; CREATE TABLE Emetteurs(Id TEXT, Volt REAL, VoltUpdate TEXT, Localisation TEXT, DataFreq TEXT, Type TEXT); DROP TABLE IF EXISTS Mesures; CREATE TABLE Mesures(Id TEXT, Mesure REAL, DateMesure TEXT);
- Dans cette base il ne faudra pas oublier de créer un record par émetteur :
INSERT INTO Emetteurs VALUES('ZZ', 0.0, '2013-01-01 00:00:00.000', 'Jardin', '0005M', 'Temp');
Pour un deuxième émetteur par exemple :
INSERT INTO Emetteurs VALUES('ZY', 0.0, '2013-01-01 00:00:00.000', 'Rez de chaussée', '0005M', 'Temp');
- Votre base de données est maintenant prête ! Voici le script en Python qui va stocker les captures des sondes :
#!/usr/bin/env python # -*- coding: latin-1 -*- import serial import sqlite3 from time import sleep, gmtime, strftime DEVICE = '/dev/ttyAMA0' BAUD = 9600 con = None try: conn = sqlite3.connect('/var/www/meteoPi.db') print (strftime("%a, %d %b %Y %H:%M:%S: Début réception\n", gmtime())) ser = serial.Serial(DEVICE, BAUD) while True: print("%s: Checking..." % strftime("%a, %d %b %Y %H:%M:%S", gmtime())) n = ser.inWaiting() if n != 0: data = ser.read(n) nb_msg = len(data) / 12 for i in range (0, nb_msg): msg = data[i*12:(i+1)*12] device = msg[1:3] date_mesure = strftime("%Y-%m-%d %H:%M:%S.000", gmtime()) if msg[3:7] == "TMPA": temp = msg[7:] # INSERT de la mesure sql_command = "INSERT INTO Mesures VALUES('"+device+"', "+temp+", '"+date_mesure+"');" print("%s" % (sql_command)) conn.execute(sql_command) conn.commit() if msg[3:7] == "BATT": voltage = msg[7:11] if voltage == "LOW": voltage = 0 # UPDATE du composant sql_command = "UPDATE Emetteurs SET Volt="+voltage+", VoltUpdate='"+date_mesure+"' WHERE Id='"+device+"';" print("%s" % (sql_command)) conn.execute(sql_command) conn.commit() print "Lignes misent à jour :", conn.total_changes sleep(1 * 30) except sqlite3.Error, e: print "Error %s:" % e.args[0] sys.exit(1) finally: if conn: conn.close()
Les plus observateurs auront remarqué le test sur le message « BATT ». Tous les 10 envois vous allez recevoir le niveau de la batterie par message comme la température, par exemple 2.74 (sur les 3V de la batterie fournie avec l’émetteur).
Si vous recevez la valeur LOW c’est qu’il est temps de changer la pile !
Vous avez maintenant un outil pour stocker toutes les mesures que vous allez capter !
Dernière étape : l’affichage dans un site web (beau de préférence) !