Frosterkennung

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo Zusammen,

    da ihr durch eure Beiträge mir schon viel geholfen habt. Erstmal ein Danke an alle!

    Ich habe nun ein kleines Problemchen. Ich hab nun alles programmiert, dass meine Elektrostandheizung immer in der früh zwischen 5.50 und 6.20 angeht. Vorraussetzung es ist unter 3 Grad kalt. Da ich aber Energie sparen möchte und die Heizung nur bei Zugefrorenen Scheiben benutzten möchte. Hier mein Problem.

    Wie kann der Raspberry Frost ermitteln? Gibt es evtl irgendwelche Platinen die man draußen montieren kann? Ich hab bereits viele Temperaturfühler und eine Webcam installiert auch Feuchtigkeit wird gemessen.

    Wäre über alle Ideen dankbar!

    Viele Grüße
    Nico

  • Hallo Nico,

    ich würde da ganz anders herangehen.

    Eine Vereisung der Scheibe ist nur eine Folge physikalischer Abläufe:
    Eine Mindestluftfeuchtigkeit muss überschritten sein, eine Mindesttemperatur muss überschritten werden, damit Wasserdampf entstehen kann.
    Dann muss es sich wieder abkühlen, also eine Temperatur unterschritten werden, damit die Luftfeuchtigkeit kondensieren und gefrieren kann.
    - Ist es ZU KALT, gibt es keine Luftfeuchtigkeit (außen) - also auch ZU TROCKEN- die an der Scheibe kondensieren und gefrieren kann
    - Ist es ZU WARM, mag sich zwar Luftfeuchtigkeit kondensieren aber nicht gefrieren - den Rest erledigt der Scheibenwischer
    - Die maximal mögliche Luftfeuchtigkeit ist mit der Temperatur korreliert
    - Irgendwo zwischen ZU KALT und ZU WARM wird es interessant, weil es nur dann auch FEUCHT GENUG ist bzw. sein kann.

    Ich würde - in Ermangelung genauerer Daten - an Deiner Stelle eine zeitlang Messreihen aufnehmen (Temperatur und Luftfeuchtigkeit erfassen - innen und außen - und mit dem Ausmaß der Vereisung innen und außen korrelieren. Irgendwann kennst Du dann die genauen Grenzwerte und kannst Wahrscheinlichkeiten angeben, ob die Scheiben innen / außen beidseitig vereist sein kann.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (12. Oktober 2015 um 16:30)

  • Okay, das ist kein schlechter Ansatz da hast du recht. Derzeit lese ich meine Daten alle wie folgt:

    tempweek.png

    Wie kann man dann jeden Tag am besten in der früh die Abfrage starten, ob diese Werte erfüllt sind und dann eine Schaltung der Heizung betätigen?

  • Ich denke mal, ohne jetzt die Wiki gelesen zuhaben, dass der Frost abhängig von der relativen Luftfeuchte ist. (DHT22) Also wäre zu prüfen welche Luftfeuchte herrschen muss, so dass Frost entsteht. Dies müßte 100% sein. (allgemein als Taupunkt bezeichnet). Jetzt müßte man experimentieren. Wenn Luftfeuchte > 95% und Temperatur < 3 C Celcius ist mit Frost zu rechnen. Nur mal so als Beispiel.

  • Mit einer kleinen Gabellichtschranke, welche man periodisch abfragt, sollte sich so etwas auch auswerten lassen und wenn man noch die Temp. mit in die Auswertung einbezieht, sollten sich auch Fehlalarme z.B. bei Nebel, verhindern lassen. Man muß halt nur eine gute Position außen am KFZ dafür finden.

  • Desweiteren hab ich eine Frage. Wie frage ich am besten die Datenbank ab um zu ermitteln ob in dieser Nacht die Temp unter 3 Grad war. Da ich derzeit leider nur aktuelle (um 5.50 wenn die Heizung angehen soll) Temp abrufe, welche schon wieder höher sein kann als in der Nacht.

    Daten werden derzeit in eine Round-Robin-Database eingespielt!

    Hab mal ne Auswertung darstellen lassen.

    tempday1.png

    Das sollte genau den Zeitraum in der früh wiederspiegeln der wichtig war. Die letzten 4 Stunden... Wie bringe ich dazu, dass der Script dies ließt und dann aggiert?

    Einmal editiert, zuletzt von accloginsell (12. Oktober 2015 um 17:22)

  • Verstehe ich das richtig, dass du sowieso 24/7 alle Temperaturen erfasst und in die Datenbank schreibst?
    Dann baust du dir ein neues Script, welches weitere Aufgaben übernimmt. Dieses startest du per Cronjob um 5:25 und lässt alle Werte der Nacht auslesen und prüfst diese gegen einen Schwellwert ab. Du musst dir natürlich überlegen wo dein Schwellwert liegt und ob der eine Zeit gehalten werden muss oder ob eine einmalige Temperatur ausreicht.
    Wenn man jetzt davon ausgehen würde, dass dein Schwellwert bei 3°C liegt, kannst du entweder prüfen ob diese Temperatur 1x unterschritten wurde, oder ob es z.B. eine Stunde lang unter der Temperatur sein muss damit du von Frost ausgehst. Es könnte ja vorkommen, dass es in der Nacht einmal ganz kurz unter 3°C fällt, und den Rest der Nacht z.B. 4°C ist. Wie du es im Endeffekt haben willst, musst du dir natürlich selber überlegen. Ich würde eine Bereichsüberwachung machen, also wenn der Schwellwert mindestens eine Stunde unterschritten wird, soll die Heizung anspringen.

    Ich gehe davon aus, dass du periodische Werte hast und genau weißt, wieviele Werte in einer Stunde erfasst werden. Um Messabweichungen (richtige Ausreißer) auszuschließen, würde ich eine gewisse Toleranz einbauen. Das heißt du lädst dir alle Werte der Nacht von z.B. 24:00 bis 5:25 in ein Array und lässt dieses in einer Schleife auswerten. Wenn ein Wert im Array kleiner als dein Schwellwert ist, resettest du eine Variable und zählst diese mit jedem Wert der unter dem Schwellwert ist aufwärts. Ein zweiter Zähler zählt die Anzahl der geprüften Werte, solange bis eine Stunde voll ist. (Zum Beispiel 600 Werte, wenn du alle 10 Sekunden abfragst)
    Danach prüfst du dann ob z.B. 570 Werte von 600 unter dem Schwellwert sind, dann löst du deine Heizung aus. (Wäre dann eine 5% Toleranz)
    Wenn das nicht der Fall ist, bleibt die Heizung aus. Das kann in der Übergangszeit allerdings relativ hohe Berechnungen geben, da gibt es noch andere Ansätze das schöner zu machen, aber so funktionierts aufjedenfall ;)

    Musst dich mal damit auseinander setzen wie du z.B. von 24:00 - 05:25 alle Werte in ein Array schreibst aus deiner Datenbank. Bei MySQL könnte ich dir das zeigen, wird bei deiner Datenbankart aber sicherlich auch funktionieren.

    PS: Wenn du natürlich keine Bereichsauswertung haben willst, ist die Sache noch deutlich einfacher. Dazu schreibst du ebenfalls alle Werte des Zeitraums in ein Array, lässt eine Schleife über das Array laufen die den Wert an allen Stellen ausließt. Wenn da dann 1 Wert (oder von mir aus "nur" 3 in Folge) unter deinem Schwellwert sind, aktivierst du die Heizung. Das einzige was du also brauchst ist der entsprechende Auslesebefehl der Datenbank der mit einer Schleife dein Array füllt und eine Schleife die das Array wieder ausließt. Sind wirklich ganz wenige Zeilen Code :)

  • Danke für die sehr ausführliche und Hilfreiche Antwort.

    Genau diesen Ansatz habe ich mir überlegt. Lass es eine halbe Stunde sein zwischen 0.00 und 5.55 in der die Temp unter 3 Grad geht. Verfeinern könnte man das noch mit der Luftfeuchtigkeit, aber das ist kein Problem wenn mal der Grundsatz stimmt..

    ja ich lese sowieso die Daten aus. alle 15 Sekunden ein Datensatz.

    Nun noch die Frage aller fragen. Wie bringe ich aus der Round-Robin-Database diese Werte schön in einen Array.

    Außerdem wie soll ich den Array dann auf den ausführenden Script auswerten? Wie sieht solch ein Script aus. Der erst Arrays aus Datenbanken ließt und dann Gpio einschaltet oder nicht?

    Einmal editiert, zuletzt von accloginsell (12. Oktober 2015 um 18:04)

  • .. Da mein Text irgendwie unwiderruflich verschwunden ist (Windoof Bluescreen sei Dank....) erstmal noch ein paar Sachen klären bevor ich hier in die falsche Richtung laufe. Kannst du deine Scripte hier einmal reinschreiben, womit du die Datenbank mit Werten fütterst? Also das Script welches Dauerhaft läuft und Daten in die Datenbank schreibt. Bitte einmal hier anhängen oder in CODE-Tags posten.
    Danach schaue ich mal wie sich das am besten umsetzen lässt, kenne wie gesagt den Datenbanktyp nicht und müsste mal kurz nachlesen ;)

    EDIT: Ich habe jetzt daran mal gearbeitet und mir das System angesehen. Du müsstest ja eine .rrd Datenbank haben, die du immer fleißig mit Werten füllst. Diese muss natürlich eine längere Haltbarkeit als 6 Stunden haben, damit die alten Daten auch noch da drin sind. Wenn ich das aber richtig sehe ist das der Fall.
    Dann navigierst du an deinem Pi mal in den Ordner in dem die Datenbank liegt und führst folgenden Befehl aus:

    Code
    rrdtool fetch DATEINAME.rrd AVERAGE --start -6hours >test.txt

    Dieser Befehl wertet alle Daten in der Datenbank aus. "DATEINAME.rrd" musst du natürlich durch den Namen deiner Datenbank ersetzen. In dem Befehl ist jetzt kein Auflösung angegeben, da ich deine Tabelle nicht kenne, der sucht sich dann selber eine passende wenn ich das richtig verstanden habe. Dann sucht er sich ALLE Werte, die vom Startzeitpunkt des Ausführens (also wenn du den Befehl reingibst) 6 Stunden zurückliegen. Das Skript beschränkt sich allerdings auf die Durchschnittswerte, da meine Tabelle so angelegt war. (Wie du deine aufzeichnest weiß ich ja nocht nicht, am besten packst du alle Dateien die dazu gehören, also die die dein Cronjob immer ausführt, die Befehle womit du die Tabelle erstellt hast und die .rrd mal in eine ZIP-Datei und hängst die hier an)
    Alle Werte werden jetzt in eine test.txt Datei im gleichen Ordner angelegt. Diese kannst du dir danach mal mit Notepad++ oder einem Editor deiner Wahl ansehen und schauen ob das funktioniert hat. Die Ausgabe müsste dann UHRZEIT : WERT sein, wobei die UHRZEIT im Unixtimestamp angegeben ist. Den kannst du hier umrechnen in eine reelle Uhrzeit: http://www.unixtime.de/

    Wenn du das hast, melde dich bitte mal mit deinen Dateien und Codes, damit ich da weiter nachschauen kann. Die Datei würde ich mir dann jeden morgen automatisch erstellen lassen. Damit würde ich über ein weiteres Script die Datei einlesen und auswerten und bei einer Temperatur über einen gewissen Zeitraum unter Schwellwert eine Aktion ausführen. (Heizung an!)

    Ich denke wenn du dir die Ausgabe mal angesehen hast wird dir das ganze klarer, vielleicht möchtest du das ja dann sogar selber machen, ansonsten werde ich mir das genauer ansehen. (Weiß allerdings nicht 100%ig wie und wann ich das fertig umsetzen kann)

    Gruß

  • Guten Morgen,

    boah das ist ausführlich!! Danke schonmal!! :)

    Hab das ganze mal Ausgeführt.

    Erstmal zu meinen "lesescripten"

    Habe deinen rrdtool fetch mit Durchschnitten aus 15 Minuten gefüttert.

    rrdtool fetch temperature2.rrd AVERAGE -r 15m --start -6hours >/var/www/test.txt

    Und rausgekommen ist das:


    Die Außentemp sollte temp8 sein. Diese muss man noch rausfiltern.

    Was mir noch aufgefallen ist, dass sobald es zweistellig ist ein +01 hinter wandert aber vorne mit einer Stelle bleibt und sobald im Minusbereich es zweistellig wird -01 und vorne nur einstellig vor dem Komma.

    Temp 6 ist mein Gefrierschrank (schwank zwischen +0 und -22 Grad ca) Temp 7 meine Raumtemp (gleichbleibend bei ca 17-19 Grad).


    Nun habe ich leider keinen Ansatz dies in einen Script zu bringen, welcher meinen GPIO steuert oder auch nicht... Aber so schaut es sehr sehr gut aus... Heute Nacht, wäre die Heizung nicht angegangen!

    Einmal editiert, zuletzt von accloginsell (13. Oktober 2015 um 07:33)

  • Sehr gut, das sieht doch fein aus. Mit den Werten kann ich natürlich weiterarbeiten!
    Ich werde das später versuchen ein bisschen umzusetzen, werden wir schon hinbekommen.

    Kurze Erklärung zu der Zahlendarstellung: Das ist eine Exponentialdarstellung, damit arbeitet das Script. Der Wert ist immer eine Fließkommazahl mit einer ganzen Vorkommastelle. Das e+00 besagt, dass die Zahl tatsächlich so ist, e+01 ist das gleiche wie "x*10^1" und -01 "x*10^-1" , also "Zahl mal 10 hoch eins", das verschiebt also nur das Komma nach rechts oder links. Positiv in Richtung rechts, Negativ in Richtung Links. So ergibt z.B. 5,1234e+01 = 51,234°C ; 5,1234e-01 = 0,51234°C ; 5,1234e-02 = 0,051234°C.
    Das ist eine gängige Praxis in der Mathematik und vorallem in der Programmiertechnik/Computertechnik Zahlen in der Form darzustellen.

    Weiteres editiere ich nachher hier rein, wenn ich etwas gemacht habe. Falls du es vorher ließt, wäre es sehr gut wenn du mir deine .rrd-Datei vom Pi noch als Anhang hier hochladen könntest, dann hätte ich noch deutlich mehr Werte für eine Auswertung.

  • Soo, damit habe ich nun weiter gearbeitet. Man muss dazu sagen, dass das mein 1. Programm in Python ist und manche Funktionen evtl. einfacher umzusetzen sind. Das kann man aber erstmal als Basis nehmen.
    Ich habe alles mit Kommentaren versehen, denke du wirst das verstehen, ich möchte hier nur nochmal kurz meinen Grundgedanken erklären und sagen was gemacht ist und was nicht:

    Man muss davon ausgehen, dass der Fetch-Befehl vorher ausgeführt wurde. Den kann man sicherlich auch aus dem Programm starten, zusammenbauen kann man das aber immernoch in anderer Form. Danach wird dann mit der test.txt weiter gearbeitet, dabei ist es natürlich wichtig, dass das neue Skript im gleichen Ordner liegt wie die Test.txt (Bei mir einfach im gleichen Ordner wie die .rrd-Database, nicht in var/www/ aber da kann man sich drüber streiten. In einer Endform würde ich die Textdatei wohl nach /tmp/ auslagern und dahin verweisen und die Datei anschließend immer löschen.
    Danach werden dann aktuell NUR die Temperaturen8 eingelesen, die Kopfzeilen entfernt, damit wirklich nur Werte in dem Programm bearbeitet werden. Im folgenden ist dann einfach simples hin und her prüfen, natürlich kann man das ganze deutlich abkürzen, dass sofort wenn der Schwellwert 1x 30 Minuten lang unterschritten wird die Heizung an geht, da braucht das Programm natürlich nicht weiter suchen. (Ist hier aber noch der Fall, der macht eine komplett Auswertung!!)
    Den Schwellwert kannst du oben mal anpassen und dann ein paar mal laufen lassen. Dann siehst du, dass er bei Schwellwert 5 z.B. nichts findet, weil die Temperatur nie so klein war, bei 15 aber quasi alle findet und dir das auch in die Konsole schreibt. Natürlich musst du den .rrd-Fetch Befehl zur passenden Zeit ausführen bzw. anpassen. (Also eine Endzeit angeben mit Unixtimestamp und dann start -6hours, sonst hast du ja zum jetzigen Zeitpunkt ab JETZT -6 Stunden, also keine Nachtwerte). Das erledigt sich aber später, wenn das Script per Crontab eh morgens ausgeführt wird.

    Aktuell ist das nur eine Auswertung ohne Schaltung der Heizung! Dazu wollte ich noch wissen, ob du die Heizung aktuell schon per Pi schaltest oder nicht und wenn ja hätte ich den Codeteil gerne gesehen, dann kann ich den gleichermaßen einbauen. (Oder eben du an der entsprechenden Stelle)

    Schaus dir mal an ob du das soweit verstehst und ob das bei dir funktioniert. Habe da jetzt keine enorme Prüfung mehr unternommen, glaube aber dass das so richtig ist. (Mein Kopf sagt ja :bravo2: )

  • Servus,

    danke für diesen Ausführlichen Script.. Echt der Hammer.. nun habe ich das in eine .py datei getan und Rechte gegeben.

    leider kommt folgendes beim ausführen

    Code
    ./testheizung.py
    ./testheizung.py: Zeile 2: dateiname: Kommando nicht gefunden.
    ./testheizung.py: Zeile 3: schwellwert: Kommando nicht gefunden.
    ./testheizung.py: Zeile 4: list: Kommando nicht gefunden.
    ./testheizung.py: Zeile 7: Syntaxfehler beim unerwarteten Wort `('
    ./testheizung.py: Zeile 7: `fobj = open(dateiname)'
    root@raspberrypi:~#

    Habe es probiert etwas zuändern aber leider ohne erfolg.

    Der aktuelle Cronjob für das starten in der früh ist wie folgt:

    Code
    sleep 2
    sudo gpio write 6 0
    sleep 2
    python ./mail.py ist an

    kommt eine kurze Bestätigung per Pushnachricht auf mein Handy..
    Aus:

    Code
    sleep 2
    sudo gpio write 6 1
    sleep 2
    python ./mail.py ist aus

    Grüße und vielen dank schonmal!

    Einmal editiert, zuletzt von accloginsell (13. Oktober 2015 um 17:32)

Jetzt mitmachen!

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