Guten Abend
Ich baue mir mit einem Raspberry eine Wetterstation. Ich möchte nun den
min/max Wert einer bestimmten Zeitspanne bestimmen (Tag, Woche, Monat,
Jahr).
Den Temperaturwert wird mittels RS232 aus Raspberry übertagen.
Wie kann ich in der Empfangsroutine einen Code schreiben, ohne dass ich
mich durch die Logdaten des letzten Jahres wühlen muss?
Gibt es da einen effizienteren Ansatz?
Vielen Dank
Wie liegen die Werte vor - mit Zeitstempel?
Wohin werden sie mit RS232 übertragen, zum PC zur Auswertung?
Kann das nicht im RasPi selbst gemacht werden?
Du könntest ja in ein eigenes File die Max-Werte von jedem Tag inkl.
Zeitstempel speichern.
Dann beschränkt sich deine Suche auf 7 Tage für die Woche, 28-31 für den
Monat und 365/366 fürs Jahr.
Ich empfange den Temperaturwert über RS232 vom Funkempfäger. Im
Empfängerskript, welches auf dem Raspberry läuft, merke ich mir die
Uhrzeit und schreibe es danach in eine Logdatei. Zusätlich läuft auf dem
Pi ein Webserver, welcher die Daten für eine Website aufbereitet.
Da ich ca. alle 2min einen neuen Temperaturwert empfange, müsste ich um
den Jahresmaximalwert zu bestimmen 250'000 Zeilen durchsuchen. Alle
Timestamps umwandeln und Temperaturwerte vergleichen dauert so eine
Weile.
alles klar?
Harry L. schrieb:> MRTT nutzen.....
Noch nie gehört. Was ist das? Google findet mangels Suchgeschick auch
nichts :P
>Du könntest ja in ein eigenes File die Max-Werte von jedem Tag inkl.>Zeitstempel speichern.>Dann beschränkt sich deine Suche auf 7 Tage für die Woche, 28-31 für den>Monat und 365/366 fürs Jahr.
Hmmm.. ja das tönt doch sinnvoll!
Auf jeden Fall ist es deutlich effizienter und schneller...
Leg die Daten doch in einer Datenbank deiner Wahl ab (sqlite / MySQL).
Auf dem Raspi gibts da doch 1000 Möglichkeiten. Da ist das Abfragen
beliebiger Werte dann gar kein Problem mehr.
Gibt es auch schon fertig mit Virtualisierung: "Volkszähler".
Ansonsten: Welche Programmiersprache hast du dir denn ausgesucht? ;)
schon was von datenbank gehört?
pi mit z.b. mysql o.ä..
python skript zum auslesen der rs232.
eintagen der werte in die db mit zeitstempel/ort.
min/max wert über zeitstempel fenster (unix zeitformat erleichtert das
rechnen).
lässt sich auch mit php machen. oder so.
cu
S R schrieb:> Leg die Daten doch in einer Datenbank deiner Wahl ab (sqlite / MySQL).> Auf dem Raspi gibts da doch 1000 Möglichkeiten. Da ist das Abfragen> beliebiger Werte dann gar kein Problem mehr.>> Gibt es auch schon fertig mit Virtualisierung: "Volkszähler".>> Ansonsten: Welche Programmiersprache hast du dir denn ausgesucht? ;)
Python brauche ich. Bin nicht Fan davon aber das ist ein anders Thema.
Datenbanken finde ich unsympatisch, da mir nicht klar ist was im
Hintergrund passiert. Zudem habe ich noch nie damit gearbeitet.
Die Werte speichere ich als .csv Datei und so kann man ohne
Datenbankverwaltung darauf zugreifen (Excel, Notepad..)
chrisHome schrieb:> Python brauche ich. Bin nicht Fan davon aber das ist ein anders Thema.
Ich bin Fan von Python. ;)
> Datenbanken finde ich unsympatisch, da mir nicht klar ist was im> Hintergrund passiert. Zudem habe ich noch nie damit gearbeitet.> Die Werte speichere ich als .csv Datei und so kann man ohne> Datenbankverwaltung darauf zugreifen (Excel, Notepad..)
Oh, aber das ist doch ein Paradebeispiel für eine Datenbank! Die
Datenbank kannst du dir (also jede Tabelle) auch als csv exportieren.
Dafür gibt es die Standardsoftware "phpmyadmin".
Ändert aber nix daran, dass es genau für deine Anwendung schon den
"Volkszähler" gibt. Gibt es als Raspi-Image, einfach aufspielen und fast
fertig.
Die Daten übergibst du (z.Bsp.) an eine PHP-Schnittstelle mit der python
urllib, und dann hast du eine prima Visualisierung mit allen Diagrammen
und was auch immer schon fertig... Aber natürlich läuft da eine
Datenbank ;)
chrisHome schrieb:> Datenbanken finde ich unsympatisch, da mir nicht klar ist was im> Hintergrund passiert
Der Vorteil einer Datenbank ist das du Minma und Maxima sehr leicht
abfragen kannst. Einfach ein SQL Statement und z.B. über PHPMYSQLAdmin
kannst du direkt auf der DB in einem GUI arbeiten.
Bsp. für Maximum im Jahr 2015. In der Datumsspalte liegt das Datum als
hh:mm:ss dd:MM:YYYY vor und zwar seit 2014 - 2016
1
SELECT max(Temperatur) From Wetterdaten WHERE YEAR(Datum)= 2015
Und schon hast du den Maxwert aus dem Jahr 2015. Du musst das Ergebnis
dann nur in PHP,Phython o.ä. verarbeiten. Ist einfacher und schneller
als tausende Zeilen zu vergleichen.
Gruß JackFrost
chrisHome schrieb:> Harry L. schrieb:>> MRTT nutzen.....>> Noch nie gehört. Was ist das? Google findet mangels Suchgeschick auch> nichts :P
Sorry, vertippt; meinte natürlich MRTG.
Das Ding dabei ist: Das nutzt eine RRDB. (Round Robbin DataBase)
Das hat den Vorteil, daß die Datenmenge nicht ins unendliche wachsen
kann, und ältere Wert nur "unschärfer" werden, aber die relevanten Peaks
(Min/Max) erhalten bleiben.
Klassisches Beispiel für sowas:
http://oss.oetiker.ch/mrtg/
Harry
ohne daß ich mir hier nun alles durchgelesen habe, denke ich, es ist
nicht so sehr aufwendig. Du nimmst einige Speicherzellen und legst dort
je nach Zeitzuordnung den jeweils ersten Wert ab. Anschließend
vergleichst du den nächsten kommenden Wert ob er größer oder kleiner
ist. Wenn Er kleiner ist als der erste Wert, dann wird dieser als
tiefster Werd in den Speicherplatz abgelegt. Ist er es nicht, dann mach
damit etwas anderes?, nämlich den Vergleich auf bin ich größer als der
Wert im Max-Speicher, wenn ja, dann ab damit in dem Max-Speicher. Dann
kommt auch schon der nächste Wert. Letztlich brauchst du (365+52+12)*2
Speicherzellen pro Jahr, die auf diese Art befüllt werden.
> mrtg
Besser die Low-Level-Komponenten http://oss.oetiker.ch/rrdtool/
Geniales Teil für eine Wetterstation!
Man darf nur nicht sekündliche Werte loggen - nach einem Jahr ist bein
Raspi die SD-Karte hinüber.
Bastian W. schrieb:> Bsp. für Maximum im Jahr 2015. In der Datumsspalte liegt das Datum als> hh:mm:ss dd:MM:YYYY vor und zwar seit 2014 - 2016
Ein - entschuldige - bescheuerteres Datum/Zeitformat gibt es ja wohl
nicht. Wahrscheinlich gibt es auch noch einmal im Jahr eine Lücke von
einer Stunde und ungefähr ein halbes Jahr später dafür eine Stunde
doppelt :-(
Bei Zahlen schreibst du doch auch nicht die Einer vor die Tausender
und verwendest dann noch für Dezimaltrennzeichen und
Tausendertrennzeichen das selbe Symbol.
Hallo
meine Lösung wäre:
- Min/Max für jeden Zeitraum speichern (inkl. Zeitstempel)
- nach jeder Messung Messwert mit Min/Max vergleichen, falls aktueller
Messwert zu Min/Max wird nachfolgenden Schritt überspringen
- nach jeder Messung prüfen ob gespeicherter Min/Max noch nicht zu alt
ist, falls doch neuen Min/Max im Zeitraum suchen
Damit musst du zwar bei jeder Messung prüfen ob die Min/Max-Werte noch
im Zeitraum liegen, aber nur bei Bedarf die kompletten Log-Daten
durchsuchen. Falls der aktuelle Messwert Min oder Max ist kannst du
sogar die Altersprüfung überspringen.
Silvio
Eine eigene Frage?
Dieser Thread ist über 10 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.