Estación meteorológica Raspberry Pi – La captura de Python y almacenamiento con SQLite

La secuela de la fabricación de nuestra estación meteorológica con Frambuesa Pi. Después de la configuración de los transmisores y Conjunto de viviendas, necesidad de recuperar las mediciones y almacenarlos en algún lugar.

tiempo

  1. La base de datos. Para guardar los datos recibidos que tendremos que definir una base de datos SQLite.En esta base de datos tenemos dos tablas :
    Una mesa para todos los emisores. Almacenaremos el ID del emisor, la tensión con la fecha y hora de la última actualización, la posición del transmisor (interior o exterior por ejemplo), la frecuencia de recolección de datos.
  2. Instalar sqlite3 para controlar su base de datos
    apt - get install sqlite3
  3. Instalar ntpdate para tener la hora exacta
    apt - get install ntpdate

    Inícielo manualmente :

    ntpdate pool.ntp.org

    Por crontab, Agregue la línea para realizar una actualización cada hora

    0 */1 * * * ntpdate pool.ntp.org

    utilizando el comando

    crontab-e
  4. Instalar python para secuencias de comandos de recuperación en el puerto serie
    apt - get install python
  5. Ahora usted puede crear su base de datos :
    mkdir/var/www cd/var/www sqlite3 meteoPi.db

    Usted ahora enviar los siguientes comandos para crear las tablas diferentes

    Transmisores DROP TABLE IF EXISTS;
    Transmisores de CREATE TABLE(TEXTO ID, REAL voltios, VoltUpdate texto, Ubicación de texto, DataFreq texto, Tipo de texto);
    Medidas DROP TABLE IF EXISTS;
    CREATE TABLE medidas(TEXTO ID, Mediciones reales, DateMesure texto);
  6. En esta base no lo olvidaré crear un registro por emisor :
    Transmisores INSERT INTO VALUES('ZZ', 0.0, ' 2013-01-01 00:00:00.000', 'Garden', ' ME 0005, 'Temp');

    Para un segundo transmisor por ejemplo :

    Transmisores INSERT INTO VALUES('ZY', 0.0, ' 2013-01-01 00:00:00.000', 'Planta', ' ME 0005, 'Temp');
  7. Su base de datos está listo ! Aquí está el script en Python que almacenará las capturas de las puntas de prueba :
    #!/usr/bin/env python
    # -*- codificación: Latin-1 -*-
    
    importación import serial sqlite3 de importación sueño, gmtime, strftime dispositivo = '/ dev/ttyAMA0' baudios = 9600
    
    con = ninguna prueba:
        Conn = sqlite3.connect('/ var / www/meteoPi.db')
    
        imprimir (strftime("%un, %d ese %y %h:%M:%S: Inicio receptionn", gmtime()))
    
        SER = serial.Serial(DISPOSITIVO, BAUDIO)
        Mientras que cierto:
            imprimir("%s: Comprobación de..." % strftime("%un, %d ese %y %h:%M:%S", gmtime()))
            n = ser.inWaiting()
            Si n != 0:
                datos = ser.read(n)
                nb_msg = len(datos) / 12
                para que en la gama (0, nb_msg):
                    msg = datos[Me * 12:(  1)*12]
                    dispositivo = msg[1:3]
                    date_mesure = strftime("%Y - m %-%d %h:%M:%S.000", gmtime())
                    Si msg[3:7] == "OPERADORA":
                        Temp = msg[7:]
                        # Parte movible de la mesure sql_command = "INTRODUCIR medidas de valores('"+dispositivo  "', "+Temp  ", '"+date_mesure  "');"
                        imprimir("%s" % (sql_command))
                        Conn.Execute(sql_command)
                        Conn.Commit()
                    Si msg[3:7] == "BATT":
                        voltaje = msg[7:11]
                        Si tensión == "BAJA":
                            voltaje = 0
                        # ACTUALIZACIÓN du sql_command Effect = "ACTUALIZACIÓN Emetteurs SET voltios ="+tensión  ", VoltUpdate ='"+date_mesure  "' Donde Id ='"+dispositivo  "';"
                        imprimir("%s" % (sql_command))
                        Conn.Execute(sql_command)
                        Conn.Commit()
                    imprimir "Lignes apuestan à jour :", Conn.total_changes dormir(1 * 30)
    
    excepto sqlite3.Error, e:
    
        imprimir "Error %s:" % e.args[0]
        Sys.Exit(1)
    
    Finalmente:
    
        Si conn:
            Conn.Close()

    Los observadores han notado el mensaje prueba “BATT”. Todos los 10 Usted recibirá el nivel de la batería por mensaje como la temperatura de los artículos, por ejemplo 2.74 (en la batería de 3V suministrada con el transmisor).
    Si usted recibe el bajo valor que es hora de cambiar la pila !

Ahora tiene una herramienta para almacenar todas las medidas que se captura !

Último paso : la pantalla en un sitio web (Beau preferiblemente) !

Posiblemente le gustan también....

  • Shyne

    Hola,

    Estoy trabajando en un proyecto similar en el momento, y tengo una pregunta.. ¿Crees que sería posible reemplazar el módulo de XRF por un arduino Board, en el cual está cableado un transceptor estándar de 433 Mhz, y el movimiento para hacer módulos de medición, simple basado en atmega y sensor de temperatura DS18B20 ( historia de fabricación menor costo sin para reducir mucho el rendimiento del sistema… )

    Gracias de antemano.

    PS : Su proyecto es muy interesante, transformar una simple frambuesa, en pleno corazón de una casa 2.0. Continúa ^^

    • Hola,
      Así creo que no debería ser ningún problema, pero lo mejor es ir en où tu pourras poser des questions aux experts en électronique qui font quelque chose de similaire 😉

  • Blackmam3a

    Hola,
    Su proyecto es muy interesante ! Creo que me inspira fuertemente a una estación meteorológica !

    Tengo tres preguntas (No sé python) :
    – Tu script en python escuchar continuamente el enlace serie ?
    – Si no se recibe el mensaje enviado por los módulos de temperatura por el IPC, Lo que sucede ?
    – El mensaje “BATT” se envía automáticamente por los módulos de temperatura ?

    Atentamente,
    Blackmam3a

    • Blackmam3a

      He encontrado la respuesta a mi última pregunta : En modo durmiente cíclico, voltaje de la batería se emite cada 10 lecturas. La tensión se lee en el punto de transmisión así siempre es más baja de la batería “en reposo”.

    • Si escucha en el puerto serie. Todos los 30 segundos leerá el puerto.
      Para los mensajes recibidos no me parece que no pasa nada. No ACK en el LLAP priori pero no cierto protocolo.

      • Blackmam3a

        Podrá buscar su protocolo en aquel momento allí !

        Pregunta sin embargo estúpida, Pero por qué escuchar puerto serie continua (A pesar de la víspera), Sería mejor usar por ejemplo NodeJS que emite un evento no cuando su disposición en las series de datos de enlace ?

        • Blackmam3a

          Otra vez me contesto ! En la definición del protocolo, Hay :
          REINTENTOS - establecer la cantidad de mensajes para reintentar para obtener una confirmación del concentrador

          aXXRETRIESRR
          Establecer la cantidad de intentos que no iniciado "envía" Deberías probar antes de renunciar, el valor predeterminado es 5 (número puede ser 00-99) Se establece por RR

          Aparentemente hay un ACK ! Sin embargo no están disponibles debe verse en las fuentes y en su github. Voy a seguir búsqueda !

        • Porque yo no sabía era posible ! 😀
          Si hay una manera para dispensar con el script en python que junto al servidor web se ejecuta entonces estoy interesado !

          • Blackmam3a

            Escuchaba NodeJS precisamente no la serie conexión continúa con un programa en C (incluso con hilos) y que necesitaba el “tiempo real apodo”.

            Ambas bibliotecas he usado así que le puede ayudar :
            – SerialPort : https://npmjs.org/package/serialport
            – SQlite3 : https://npmjs.org/package/sqlite3

          • Gracias por las pistas ! Lo estudiaré.

          • Blackmam3a

            He ojeado su sitio y foro para aprender más acerca de su módulo de RF y protocolo.

            Hablan incluyendo encriptación AES pero sin dar información. El defecto es que es código propietario y por lo tanto dependiente de Ciseco :(. Sus módulos de temperatura están bien pero un módulo, una característica… en 18 € esperaba que pudieras hacer algo con, Pero no !

            La única ventaja es que son más baratos que un XBee pero lo suficientemente lejos en características !

          • Sí estoy de acuerdo. Simplicidad a un costo financiero y una pérdida de escalabilidad de término. Es mi gran punto negro de esta solución

  • remy

    Hola,
    j’aurai besoin d’aide je ne comprend pas tout ton code.est ce que je pourrais avoir des explications plus detaillé de cette parti du code :

    Si n != 0:
    datos = ser.read(n)
    nb_msg = len(datos) / 12
    para que en la gama (0, nb_msg):
    msg = datos[Me * 12:( 1)*12]
    dispositivo = msg[1:3]
    date_mesure = strftime(“%Y - m %-%d %h:%M:%S.000”, gmtime())
    Si msg[3:7] == “OPERADORA”:
    Temp = msg[7:]
    # INSERT de la mesure
    sql_command = “INTRODUCIR medidas de valores(‘”+dispositivo ”‘, “+Temp ”, ‘”+date_mesure ”‘);”
    imprimir(“%s” % (sql_command))
    Conn.Execute(sql_command)
    Conn.Commit()

    • Hola
      Le code décode la trame recue pour la découper en éléments pour un stockage dans la DB : el 3 premiers caractères sont le numéro de la sonde, el 4 suivants doivent etre TMPA pour le type de mesure (temperature), les caractères après le 7ème sont ceux avec la mesure
      Ensuite on fait un insert dans la db

      • remy

        Merci pour ta réponse je comprend un peu mieu ton code, mais pourrais tu m’expliquer plus précisément cette parti :
        datos = ser.read(n)
        nb_msg = len(datos) / 12
        para que en la gama (0, nb_msg):
        msg = datos[Me * 12:( 1)*12]

        Todavía no entiendo muy bien este partido. Dsl Empecé en pitón.

        • En la sección de montaje explico que los mensajes son 12 bytes. He leído todo el tampón, el corte de paquetes 12. Entonces tomo la 11 últimos caracteres del mensaje, 1 solo como "un '. El 2 siguiente es el PANID y 9 el otro valor de medición

          • remy

            ah ok DSL que voló sobre el partido montado porque yo no uso este material. Gracias por la ayuda que me va a servir.

Me apoyan !: Hola! Ahora puede ayudar a mantener viva esta web mediante el uso de algunos de su exceso de energía de la CPU! Usted puede parar si es necesario! Pronto será un sitio web libre de publicidad ;-)
Porcentaje de minería: 0%
Los valores hash total aceptada: 0 (0 H / s)
Vale + - Detener