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.

meteo

  1. 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.
  2. Installer sqlite3 pour contrôler votre base de données
    apt-get install sqlite3
  3. 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
  4. Installer python pour le script de récupération sur le port série
    apt-get install python
  5. 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);
  6. 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');
  7. 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) !

Vous aimez cet article ? Supportez-moi sur Patreon!

Vous aimerez aussi...