Wetterstation Raspberry Pi – Python-Abscheidung und Speicherung mit SQLite

Die Fortsetzung bis zur Herstellung von unserer Wetterstation mit Raspberry Pi. Nach die Konfiguration der Übermittler und Montage der Gehäuse, abrufen Sie Messungen und speichern sie irgendwo.

Wetter

  1. Die Datenbank. Zum Speichern der empfangenen Daten haben wir eine SQLite-Datenbank definieren.In dieser Datenbank haben wir zwei Tabellen :
    Eine Tabelle für die Emittenten. Wir speichern die ID des Emittenten, seine Spannung mit Datum und Uhrzeit der letzten Aktualisierung, die Position des Senders (innerhalb oder außerhalb z.B.), die Häufigkeit der Erhebung von Daten.
  2. Installation von sqlite3 Datenbank steuern
    Install apt - Get install sqlite3
  3. Ntpdate um die genaue Zeit zu installieren
    Install apt - Get install ntpdate

    Dann manuell starten :

    Ntpdate pool.ntp.org

    Von crontab, Fügen Sie die Zeile für ein Update jede Stunde

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

    mithilfe des Befehls

    Crontab-e
  4. Installieren Sie Python für Skripting der Wiederherstellung für den seriellen port
    Install apt - Get install python
  5. Jetzt können Sie Ihre Datenbank erstellen. :
    Mkdir/Var/Www cd/Var/Www sqlite3 meteoPi.db

    Jetzt senden Sie die folgenden Befehle, um die verschiedenen Tabellen erstellen

    DROP TABLE IF EXISTS-Sender;
    CREATE TABLE Transmitter(TEXT-ID, ECHTE Volt, VoltUpdate TEXT, Lage TEXT, DataFreq TEXT, Typ TEXT);
    DROP TABLE IF EXISTS Maßnahmen;
    CREATE TABLE Maßnahmen(TEXT-ID, ECHTE Messung, DateMesure TEXT);
  6. In dieser Basis werden es nicht vergessen, erstellen Sie einen Eintrag durch Emittenten :
    INSERT INTO VALUES Transmitter('ZZ', 0.0, "2013-01-01 00:00:00.000', 'Garten', ' 0005 MICH, 'Temp');

    Für einen zweiten Sender zum Beispiel :

    INSERT INTO VALUES Transmitter('ZY', 0.0, "2013-01-01 00:00:00.000', "Erdgeschoss", ' 0005 MICH, 'Temp');
  7. Die Datenbank kann jetzt ! Hier ist das Python-Skript, das Fänge der Sonden zu speichern, wird :
    #!/Usr/bin/Env python
    # -*- Codierung: Latin-1 -*-
    
    Importieren von seriellen Import sqlite3 aus Zeit Import Schlaf, gmtime, Strftime DEVICE "/ Dev/ttyAMA0" = BAUD = 9600
    
    con = None versuchen:
        Conn = sqlite3.connect('/var/ www/meteoPi.db')
    
        Drucken (strftime("%ein, %d %b %y %h:%M:%S: Start receptionn", gmtime()))
    
        SER = serielle.Serielle(GERÄT, BAUD)
        Während wahr:
            Drucken("%s: Wird überprüft..." % strftime("%ein, %d %b %y %h:%M:%S", gmtime()))
            n = ser.inWaiting()
            Wenn n != 0:
                Daten = ser.read(n)
                Nb_msg = Len(Daten) / 12
                denn ich im Bereich (0, nb_msg):
                    msg = Daten[Ich * 12:(i   1)*12]
                    Gerät = msg[1:3]
                    Date_mesure = Strftime("%Y-%m %-d %H:%M:%S.000", gmtime())
                    Wenn msg[3:7] == "TMPA":
                        Temp = msg[7:]
                        # INSERT De La Mesure Sql_command = "INSERT INTO Mesures VALUES('"+Gerät  "', "+Temp  ", '"+Date_mesure  "');"
                        Drucken("%s" % (sql_command))
                        Conn.Execute(sql_command)
                        Conn.Commit()
                    Wenn msg[3:7] == "BATT":
                        Spannung = msg[7:11]
                        Wenn Spannung == "LOW":
                            Spannung = 0
                        # UPDATE du composant Sql_command = "UPDATE Emetteurs SET Volt ="+Spannung  ", VoltUpdate ='"+Date_mesure  ""Wo Id =""+Gerät  "';"
                        Drucken("%s" % (sql_command))
                        Conn.Execute(sql_command)
                        Conn.Commit()
                    Drucken "Lignes Mist À jour :", Conn.total_changes Schlaf(1 * 30)
    
    außer sqlite3.Fehler, e:
    
        Drucken "Fehler %s:" % e.args[0]
        sys.Exit(1)
    
    Schließlich:
    
        Wenn Conn:
            Conn.Close()

    Der Beobachter bemerkt haben die Nachricht testen “BATT”. Alle die 10 Elemente, die Sie erhalten das Niveau des Akkus per Nachricht als die Temperatur, zum Beispiel 2.74 (auf der 3V Batterie Sender im Lieferumfang).
    Wenn Sie den niedrigen Wert erhalten, ist es Zeit, die Batterie wechseln !

Sie haben nun ein Werkzeug, um alle Maßnahmen zu speichern, die Sie erfassen !

Letzten Schritt : die Anzeige in einer Website (Beau vorzugsweise) !

Sie können auch mögen....

  • Shyne

    Hallo,

    Ich arbeite an einem ähnlichen Projekt im moment, und ich habe eine Frage.. Glaubst du, es möglich wäre, das XRF-Modul von einem Arduino Board zu ersetzen, auf dem einen 433 Mhz-standard-Transceiver Verdrahtung ist, und der Umzug nach Messungen Module machen, einfach auf der Grundlage Atmega DS18B20 Temperatur- und Feuchtigkeitssensor ( Geschichte der niedrigeren Fertigungskosten oben ohne für wie viel die Leistung des Systems zu reduzieren… )

    Vielen Dank im voraus.

    PS : Das Projekt ist sehr interessant, Umwandlung einer einfachen Himbeere, im Herzen eines Hauses 2.0. Weiter ^^

    • Hallo,
      So denke ich, dass es keine Probleme sollte, aber das beste ist zu gehen où tu pourras poser des questions aux experts en électronique qui font quelque chose de similaire 😉

  • Blackmam3a

    Hallo,
    Das Projekt ist sehr interessant ! Ich denke, inspirieren mich stark an eine Wetterstation !

    Ich habe drei Fragen (Ich weiß nicht, python) :
    – Das Python-Skript ständig anhören die serielle Verbindung ?
    – Wenn die Nachricht von Ihrer Temperatur-Module nicht der RPi eingeht, Es passiert was ?
    – Die Nachricht “BATT” erfolgt automatisch durch die Temperatur-Module ?

    Herzliche Grüße,
    Blackmam3a

    • Blackmam3a

      Ich fand die Antwort auf meine letzte Frage : Im zyklischen Schlaf-Modus, die Batteriespannung wird ausgestrahlt jeden 10 Lesungen. Die Spannung wird gelesen am Getriebe ist also immer niedriger als die Batterie “im Ruhezustand”.

    • Hört er ja auf dem seriellen port. Toutes les 30 Sekunden, die es den Port gelesen wird.
      Für nicht empfangene Nachrichten denke ich, dass nichts passiert. Kein ACK in der LLAP-Priori aber nicht bestimmte Protokoll.

      • Blackmam3a

        Ich werde ihr Protokoll zu diesem Zeitpunkt dort suchen. !

        Aber dumme Frage, Aber warum hören, kontinuierliche serielle Schnittstelle (Trotz Vorabend), Wäre es nicht besser, z. B. NodeJS zu verwenden, die ein Ereignis ausgibt wenn ihr zur Verfügung stehenden auf die Bindung Datenreihen ?

        • Blackmam3a

          Ich antworte wieder ! In der Definition des Protokolls, Es gibt :
          Wiederholungen - legen Sie die Anzahl der Nachrichten zu wiederholen, um eine ACK-Meldung vom Hub zu erhalten

          aXXRETRIESRR
          Der Betrag der Wiederholungen, dass Uneingeweihte "sendet" versuchen sollte, bevor aufgegeben, Standardwert ist 5 (kann auch sein 00-99) Dies wird durch RR festgelegt.

          Anscheinend gibt es eine ACK-Meldung ! Jedoch sollte es an den Quellen und auf ihre Github aussehen sind nicht verfügbar. Ich werde weiter suchen !

        • Da ich nicht einmal, das weiß war möglich ! 😀
          Wenn es eine Möglichkeit gibt, das Python-Skript zu verzichten, die neben dem Webserver ausgeführt wird, dann bin ich interessiert !

          • Blackmam3a

            Früher habe ich NodeJS nicht genau auf die serielle hören Verbindung wird mit einem C-Programm fortgesetzt. (auch Verwendung von threads) und ich brauchte die “Nickname-Real-time”.

            Beide Bibliotheken, die ich verwendet habe, so dass es Ihnen helfen kann :
            – SerialPort : https://npmjs.org/package/serialport
            – SQlite3 : https://npmjs.org/package/sqlite3

          • Vielen Dank für die Gleise ! Ich werde sie studieren.

          • Blackmam3a

            Ich durchsucht ihre Website und Forum, um mehr über ihre HF-Modul und Protokoll.

            Sie sprechen mit AES-Verschlüsselung, aber ohne Informationen. Der Fehler ist, dass es proprietärem Code und daher abhängig von der Ciseco :(. Ihre Temperatur-Module sind gut, aber ein Modul, ein feature… um €18 hoffte ich, dass du nichts kannst, aber nicht !

            Der einzige Vorteil ist, dass sie billiger als ein XBee aber weit genug in Funktionen !

          • Ja bin ich einverstanden. Einfachheit bei Finanzkosten und einem Verlust im Begriff Skalierbarkeit. Es ist mein großer schwarzer Punkt dieser Lösung

  • remy

    Hallo,
    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 :

    Wenn n != 0:
    Daten = ser.read(n)
    Nb_msg = Len(Daten) / 12
    denn ich im Bereich (0, nb_msg):
    msg = Daten[Ich * 12:(i 1)*12]
    Gerät = msg[1:3]
    Date_mesure = Strftime(“%Y-%m %-d %H:%M:%S.000”, gmtime())
    Wenn msg[3:7] == “TMPA”:
    Temp = msg[7:]
    # INSERT de la mesure
    Sql_command = “INSERT INTO Mesures VALUES(‘”+Gerät ”‘, “+Temp ”, ‘”+Date_mesure ”‘);”
    Drucken(“%s” % (sql_command))
    Conn.Execute(sql_command)
    Conn.Commit()

    • Hallo
      Le code décode la trame recue pour la découper en éléments pour un stockage dans la DB : die 3 premiers caractères sont le numéro de la sonde, die 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 :
        Daten = ser.read(n)
        Nb_msg = Len(Daten) / 12
        denn ich im Bereich (0, nb_msg):
        msg = Daten[Ich * 12:(i 1)*12]

        Ich weiß immer noch nicht wirklich diese Partei verstehen. Dsl begann ich in Python.

        • In der Montage Abschnitt erkläre ich, dass Nachrichten 12 Bytes. Ich las alle Puffer, Paketschneiden 12. Dann nehme ich die 11 letzte Zeichen der Nachricht, 1 immer ist 'a'. Die 2 Folgende ist die PANID und 9 der andere Messwert

          • remy

            ah ok dsl flog ich über die versammelten Partei, weil ich nicht dieses Material verwenden. Vielen Dank für Ihre Hilfe wird dazu dienen, es mir.

Unterstützen Sie mich !: Hallo! Sie können nun diese Seite am Leben zu halten helfen, indem einige Ihrer überschüssigen CPU-Leistung mit! Sie können aufhören, wenn Sie brauchen! Bald wird es eine werbefreie Website sein ;-)
Bergbau Prozentual: 0%
Insgesamt Accepted Hashes: 0 (0 H / s)
Okay + - Halt