GPIO Input zählen und nach einer Stunde in eine DB einpflegen und resetten

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Guten Tag,

    ich weiß leider nicht wie ich hier weiter an die Sache rangehen soll...

    Beschreibung:

    Ich bearbeite derzeit ein Projekt, was einen Input zählt (Wippschallter).

    Es handelt sich dabei um einen Niederschlagssensor, den ich so konzipiert habe, dass das Wasser in einer Wippschale aufgefangen wird und sobald die eine Wippe voll ist die andere Seite rüberwippt und weiter befüllt wird.

    Dabei wippt die Wippe an einem Reed Kontakt vorbei und wird dadurch geschlossen und der PI bekommt ein Signal.

    Jetzt zu meinem großen Problem

    Ich möchte, dass das Script die Daten über eine Stunde in Form einer Variable sammelt. Wenn dann eine Stunde erreicht ist, soll das Script den var Wert in eine DB eintragen und dann wieder auf 0 resetten.

    Mein Script:

    Ich hoffe ich kann mein Problem mit euch beseitigen :D

  • GPIO Input zählen und nach einer Stunde in eine DB einpflegen und resetten? Schau mal ob du hier fündig wirst!

  • Hallo,

    du musst dein Programm halt erweitern, dass du zusätzlich die Zeit abfragst und wenn die aktuelle Zeit >= 1 h nach letzter Speicherung den Wert schreibst.

    Statt den GPIO permanent abzufragen solltest du ein Event an den Pin binden und dann darauf reagieren. Statt der ältern RPi.GPIO Bibliothek möchtest du dir vielleicht mal die neuere gpiozero Bibliothek anschauen, die eine schönere API hat.

    Noch eine Frage zum Design: aktuell ist es ja so, dass wenn dein Programm crasht (und ggf. via systemd automatisch neu gestartet wird) die Werte für die laufende Stunden weg sind - ist das egal? Wenn nein solltest du jeden Impuls schreiben. Dafür würde sich dann eine Datenbank in Form eine Key-Value Stores anbieten.

    Gruß, noisefloor

    • Offizieller Beitrag

    Hab nur kurz überflogen...

    Mein Script:

    Python
    # Input Check 
            while True:
                input_state = GPIO.input(23)
                if input_state == False:
                    print('Wippen Signal')
                    w = w + 1
                    time.sleep(0.2)

    Sollte da nicht nach True abgefragt werden? :conf: Das time.sleep(0.2) wäre eine Ebene höher besser geeignet, also vier Leerzeichen nach links.

    BTW: Stimme ich noisefloor absolut zu. ;)

  • Ich würde auch jeden Impuls wegschreiben, entweder den Impuls direkt mit Timestamp oder aus dem Delta den Niederschlag pro Zeiteinheit ausrechen oder...

    Kommt auch drauf an, wie die Auswertung erfolgen soll, ob Du da erst rechnest.

    Ich persönlich würde "einfach" die Timestamps jedes Impulses speichern und später ausrechnen was ich wissen will.

    Empfehle auch Eventbehandlung mit gpiozero ...

    Knut

  • Vielen Dank für die Hilfe schonmal <3


    Statt den GPIO permanent abzufragen solltest du ein Event an den Pin binden und dann darauf reagieren. Statt der ältern RPi.GPIO Bibliothek möchtest du dir vielleicht mal die neuere gpiozero Bibliothek anschauen, die eine schönere API hat.

    Ok, ich werd mir mal die Doku dazu anschauen

    Kommt auch drauf an, wie die Auswertung erfolgen soll, ob Du da erst rechnest.


    Ich persönlich würde "einfach" die Timestamps jedes Impulses speichern und später ausrechnen was ich wissen will.

    Es soll nur der Wert pro/h in eine Datenbank eingefügt werden ein PHP Script rechnet später die werte zu einer sinnvollen Statistik zusammen.


    Ich werde das Script mal überarbeiten, da ich ein Anfänger bin wird es etwas Dauern ?(

    Wenn ich es fertig habe, werde ich es nochmal zur Kontrolle posten.

    Fabian

  • Hallo,

    Zitat


    Es soll nur der Wert pro/h in eine Datenbank eingefügt werden

    Soll, weil das eine Vorgabe an dich ist oder soll, weil du das für dich für ausreichend hältst?

    Ich halte es nichts desto trotz für suboptimal, weil du Rohdaten weg wirfst und schon 1x vor der eigentlichen Auswerten Daten aggregierst. Wesentlich flexibler bis du - wie KKoPi schon sagt - wenn du alle Daten hast.
    Speicherplatz ist heutzutage auch kein Problem, zumal die Datenmenge pro Datensatz ja klein ist. Ist nur ein Zeitstempel, den du speicherst.

    Gruß, noisefloor

  • Servus,

    ... an einem Reed Kontakt vorbei und wird dadurch geschlossen und der PI bekommt ein Signal. ...

    da würde ich jetzt schlicht eine sequentielle Datei nehmen und nur den UNIX-Zeitstempel für jeden Impuls reinschreiben.

    Das sind auf dem Raspi afaik 4 Byte pro Wert.

    Wozu eine DB?

    cu,

    -ds-

  • Hi,

    Der Pi ist der Kern einer selbst gebauten Wetterstation. Der Niederschlagssenor hab ich 3D Gedruckt und so konstuiert, das die Wippe an einem Reed Kontakt vorbei zieht, damit ich ein Signal habe.

    Jetzt zum warum eine DB?

    Der Pi + WStation steht oben bei mir auf dem Dach und soll die Daten (Wippwert + DHT22 Wert) in eine Datenbank eintragen. Weil ich in Python nicht viel kompetenz besitze wollte ich es so einfach wie möglich halten, um die Werte später mit einem PHP/Java Script auf eine Website zu bringen bzw. auf der Website auch erst zusammen zu rechnen.

    ---

    Das PHP Script wählt nicht den Timestamp aus, sondern arbeitet mit der ID. Da wenn da z.B. 15:00:10 steht oder 15:01:00 steht, dann hat das Script keinen Wert und bekommt dann einen Anfall ^^


    Ich hätte eher mein Problem genauer Schildern müssen, sorry für die Aufregung...

    -Fabian

  • Das PHP Script wählt nicht den Timestamp aus, sondern arbeitet mit der ID. Da wenn da z.B. 15:00:10 steht oder 15:01:00 steht, dann hat das Script keinen Wert und bekommt dann einen Anfall ^^

    Du weisst, was ein Unix-Timestamp ist und wie der aussieht?

    PHP kann übrigens auch mit UNIX Timestamps arbeiten ...

    cu,

    -ds-

  • Hallo,

    Zitat


    Weil ich in Python nicht viel kompetenz besitze wollte ich es so einfach wie möglich halten,

    Ein Grund mehr, jeden Wert direkt in die DB zu schreiben. Dann wird dein Python-Programm einfacher und kürzer.

    Zitat


    Das PHP Script wählt nicht den Timestamp aus, sondern arbeitet mit der ID.

    Der Ansatz ist zu simpel / falsch. Warum mit einer ID? Die hat in dem Fall doch keine tieferen Sinn, außer dass die Datensätze damit durchnummeriert sind. Alle RDBMS bieten Funktionen, um über Zeitwerte zu selektieren. Die Treffer deiner Selektion zählst du dann mittels count in der DB - fertig.

    Das ist viiiiiel einfach und flexibler als den count-Teil in das Python-Skript zu verlagern.

    Gruß, noisefloor

  • Vielen dank für die Anregungen!

    Der Ansatz ist zu simpel / falsch. Warum mit einer ID? Die hat in dem Fall doch keine tieferen Sinn, außer dass die Datensätze damit durchnummeriert sind. Alle RDBMS bieten Funktionen, um über Zeitwerte zu selektieren. Die Treffer deiner Selektion zählst du dann mittels count in der DB - fertig.

    Das ist viiiiiel einfach und flexibler als den count-Teil in das Python-Skript zu verlagern.

    Jaa guuut, da hätte ich auch schon früher drauf kommen können...

    SQL
    Select count(Ndsl) From Wetter Where uhrzeit > '".$Von."' And uhrzeit < '".$Bis."'

    Oder halt per intervall

  • Da brauchst du aber für jede Stunde eine extra Abfrage, die dir immer ein Tabellenobjekt mit eine Zeile und einer Spalte zurückliefert. Das ist ziemlich unpraktisch. Du könntest das Datum und die Stunde nehmen (oder gleich einen Ausdruck YYYYMMTTHH) und einen Count über Gruppierungen dieser Felder/Feldkombination machen. Das kannst du dann auch beliebig eingrenzen. Auch für gröbere (oder feinere) Aggregate (Tage, halbe/viertel Tage, halbe Stunden, ...) lässt sich das anpassen.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Als Anregung ...

    Und noch das Ergebnis:

    Code
    date        hour  impulse  rain_mm
    2018-06-26  4     4        0.4
    2018-06-26  5     5        0.5
    2018-06-26  6     2        0.2

    Einmal editiert, zuletzt von KKoPi (26. Juni 2018 um 12:26) aus folgendem Grund: Ergebnis vergessen

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!