Heizöl-Tankstand-(oder Verbrauchs) Fernablesung mit RasPi [gelöst -> Beitrag #21]

  • Hallo an alle Interessierte,


    ich habe "Meine Lösung" gefunden, gebaut und sie funktioniert.


    Zuerst habe ich mir einen neuen RasPi B+ mit Zubehör (SD-Karte, Netzteil, etc.) gekauft. Einen WLAN Stick von Hama hatte ich noch Zuhause rumliegen. Über Amazon habe ich mir dieses DYP-ME007Y (Affiliate-Link) Ultraschall Sensormodul gekauft.


    Nach dieser Anleitung: http://www.gtkdb.de/index_36_2272.html habe ich den Ultraschallsensor an den RasPi angeschlossen. In der Anleitung wird ein anderer Ultraschallsensor (HC-SR04 Ultraschallmodul) verwendet, der DYP-ME007Y ist jedoch Anschlussgleich, hat aber einige Vorteile, z.B. Waterproof Design.


    Den Ultraschallsensor habe ich in einen Deckel des Tanks eingebaut. Das lange Anschlusskabel reicht durch die Wand bis in den Nachbarkeller wo an einer Stromsteckdose der Raspberry Pi (Name: HeizPi) mit dem WLAN-Stick angeschlossen ist.
    Bei Verbindungsunterbrüchen im WLAN verbindet der Stick mit diesem Skript als Cronjob immer wieder neu. Somit kann der HeizPi nicht ins Nirwana abgleiten.


    Das Python-Skript (ultrasonic.py) zum messen des Abstandes vom Deckel bis auf die Öloberfläche habe ich mit geringen Änderungen (Mittelwert aus 20 Messungen, keine Endlos Schleife) übernommen.


    Ein Cronjob führt das Skript täglich viermal durch und hängt die Messung sowie den daraus errechneten Literwert an eine bestehende Logdatei an.


    Beispiel Logdatei: Heizoel.log

    Code
    2014-11-01_18:10:06 Entfernung: 68.6 cm  Fuelhoehe: 85.4 cm  Liter: 2562 l
    2014-11-02_00:10:05 Entfernung: 68.8 cm  Fuelhoehe: 85.2 cm  Liter: 2556 l
    2014-11-02_06:10:06 Entfernung: 68.8 cm  Fuelhoehe: 85.2 cm  Liter: 2556 l


    Beispiel Cronjob: (mit: sudo crontab -e)

    Code
    10 0,6,12,18 * * * /home/HeizPi/ultrasonic.py >> /home/HeizPi/Heizoel.log


    Die Logdatei wird von einem anderen Cronjob mit SFTP kurz nach der Messung von dem RasPi im Keller über WLAN an meinen zweiten RasPi im Büro gesandt und dort gespeichert.


    Beispiel der /home/HeizPi/LogAnPiSenden.tcl:


    Beispiel des Cronjob:

    Code
    15 6,12,18 * * * /home/HeizPi/LogAnPiSenden.tcl


    Die so auf meinen Büro-RasPi angekommene Log-Datei wird von FHEM ausgewertet.
    Ausschnitt aus der fhem.cfg:


    Beispiel der /opt/fhem/www/gplot/heizoel.gplot Datei:


    und vom Web-Frontend des FHEM-Servers auf jedem Browser als Plot (Beispiel im Attachment als jpg-Datei) grafisch dargestellt.


    Anregungen und Verbesserungen nehme ich gerne entgegen. :danke_ATDE:


    Ich danke allen, die hier in diesem und im FHEM-Forum mir weitergeholfen und mich mit Ideen unterstützt haben.


    Gutes Gelingen wünscht
    Bracew


    P.S.(Nachtrag vom 07.11.2014): Mit einem verbessertem Python-Skript (ultrasonic.py) zum messen des Abstandes habe ich nun eine Genauigkeit erreicht, welche den Messwert nur noch um 0,3 mm streuen lässt, sodass der HeizPi bei meinen 4.500 Liter Tank auf ± einen Liter genau messen kann. Die Genauigkeit ließe sich sogar noch steigern, ist für meine Zwecke nun aber ausreichend genau.


    P.S.(Nachtrag vom 05.04.2015): Den Plot haben wir im FHEM-Forum nochmals verbessert, siehe: [url=http://forum.fhem.de/index.php/topic,28891.msg228208.html#msg228208]http://forum.fhem.de/index.php….msg228208.html#msg228208[/url]
    Für den Sensor habe ich ein Loch in die Abluftleitung gebohrt und den Sensor mit Kabelverschraubungen im Rohr befestigt. Dies hat den Vorteil, dass der Mindest-Abstand zur Öloberfläche bei vollem Tank ungefähr passt.

  • Hallo an alle Interessierte,


    im Parallelbeitrag im FHEM Forum haben wir den Plot ein wenig weiterentwickelt.
    http://forum.fhem.de/index.php….msg228208.html#msg228208
    Es wird nun auch der tägliche Verbrauch als Säulengrafik im FHEM-Diagramm angezeigt.


    Gruß Bracew

  • Hallo Zusammen,


    ich habe ebenfalls den Sensor "DYP-ME007Y" bestellt mit Spannungsteiler angeschlossen und das angepasste Pythonscript von Bracew verwendet, die GPIO's angepasst, jedoch erhalte ich folgende Meldung:
    [/php]

    Code
    Traceback (most recent call last):
      File "./ultrasonic.py", line 94, in <module>
        main()
      File "./ultrasonic.py", line 45, in main
        Distance0 = MeasureDistance()
      File "./ultrasonic.py", line 36, in MeasureDistance
        TimeElapsed = StopTime - StartTime
    UnboundLocalError: local variable 'StopTime' referenced before assignment


    Verblüffend ist nur, dass wenn ich den einfachen "HC-SR04" anschließe dann funktioniert es.
    Ein Python-Profi wird sicher sagen, da steht doch alles, aber was kann da jetzt falsch sein, wenn der Anschluß (5V; TRIGGER; ECHO; GRD) identisch ist?
    Nachdem ich nun schon tagelang erfolglos in den Foren suche, wäre ich für jeden Hinweis dankbar.


    Gruß s3402adsc

  • Halo.
    Das Prob sagt er dir doch hier:


    Code
    File "./ultrasonic.py", line 94, in <module>
        main()
      File "./ultrasonic.py", line 45, in main
        Distance0 = MeasureDistance()
    UnboundLocalError: local variable 'StopTime' referenced before assignment


    Mit der main() passt was nicht
    Distance0 = MeasureDistance auch.
    StopTime nicht vordefiniert, oder nur als lokale ?
    ganzen code bitte zeigen.


    gruß root

    Edited once, last by root ().

  • Hallo root,


    erst einmal vielen Dank für Deine Antwort.


    Hier der Code - ultrasonic.py:


    Was ich aber nicht verstehe, wieso die Messung funktioniert wenn ich den "HC-SR04" anschließe, jedoch beim "DYP-ME007Y" der bereits gepostete Fehler ausgegeben wird?


    folgend zweimal ultrasonic.py ausgeführt 1. Ausführung mit "HC-SR04" un 2. Ausführung mit "DYP-ME007Y":


    Gruß s3402adsc

  • Hallo.
    Ok, bin nicht der Python Experte, aber Line 97 ??? gibt's doch gar net.


    Aber vlt. ein Tipp.
    Betreibst den DYP-ME007Y mit 3,3 V?
    Das gibt's anscheinend Probleme.


    Lies mal das.
    Wenn ja, versorge ihn mit 5V und hänge nen Levelshifter in die Datenleitung.
    Auserdem:

    Quote

    Also the pin-out of the ME007Y is different to the SR04.


    in #31


    gruß root

    Edited once, last by root ().

  • Hallo root,


    wenn ich mich nicht verzählt habe, ist die Zeile 97: main()


    Ich betreibe das wie von Bracew am 01.11.2014 21:37 beschrieben mit 5V und einem Spannungsteiler gegen Erde. Da schien ja bei Bracew so mit dem DYP-ME007Y zu funktionieren? Aber Du hast recht, denn in dem von Dir geposten Link zum Arduino-Forum, scheint es da ja ähnliche Probleme zu geben. Ich habe mir jetzt mal den Levelshifter bestellt und hänge den dann mal dran.


    Mit 3,3V ohne Spannungsteiler habe ich es testweise auch mal probiert, da lauft das Script, jedoch nur mit einer max. Messdistanz von 29 cm, aber das lässt auch auf eine Problemlösung in dieser Richtung hoffen.


    Danke erst mal...
    Gruß s3402adsc

  • Hi Zusammen,


    hier nun endlich mal mein erstes Post, wobei ich eigentlich ne ganze Weile mitlese... Habe bei meinem Öltank auch einen Ultraschall Sensor eingebaut und habe diese Diskussion genutzt meine Scripts zu erstellen. Hier nun mein Fazits:


    Selbst habe ich den sehr günstigen DYP-ME007, wo Sender und Empfänger ein Sensor ist, praktisch für die Installation hierbei, dass die Elektronik getrennt vom Sensor ist.
    Die Sensor Elektronik ist dann über etwa 10m Kabel und einem V-Teiler auf 3.3V mit dem Raspi verbunden.
    Hatte erst den Öl-Stand mit Einzel und Durschnittswerten aus einer Messreihe ermittelt (wie auch hier vorgestellt ist) war aber mit den unterschiedlichen Werten sehr unzufrieden, da einzelne fehlerhafte Werte die Durchschnittswerte immer verändert haben.


    Seitdem ich aber über Modulo, in meinem Script:
    self.distance_mode = self.mode(self.Distance)
    distance_final = self.distance_mode[0][0]
    den häufigst vorkommenden Wert aus einer 100er Messreihe herausfilter, ist der ermittelte Wert super stabil.



    Hier mein Script, welches ich als Klasse aufrufe:




    Gruß Thorsten

  • Hallo Koschi,


    ich hatte mir mittlerweile auch eine Verbesserung des Scipts über eine mehrfach kaskadierte Mittelwertbildung ausgedacht. Dies bringt eine bessere Entfernungsgenauigkeit. An Anfang hatte ich ca. ± 0,3 mm bei Messungen unmittelbar hintereinander. In der Praxis, über Tage verteilt, liegt die Genauigkeit aber bei ca. ± 3 mm.
    Außerdem habe ich noch eine Warnung per E-Mail bei unterschreiten eines Mindestwertes integriert.


    Leider bin ich nur Phyton-Anfänger und kann Dein Script für einen Vergleich leider nicht starten, da ich nicht weiß, wie ich es aus der Bash heraus starten müsste (wie geht "...als Klasse aufrufen..."?)


    Oder, anderer Ansatz, wie könnte ich Dein "Modulo" in mein Script einfach integrieren?


    Gruß Bracew

  • [leicht OT]:


    Hallo!


    Mich würde mal interessieren, in wie weit das HC-Modul in dem Heizöltank so durch die Dämpfe angegriffen wird, da ich dieses Modul ebenfalls einsetzen will (per Magnetbefestigung im Mannloch).
    Den Sender/Empfänger kann man ja nicht per Folie usw. schützen, wie sind also eure "Langzeiterfahrungen" ?


    Mfg, das Zen

  • Hallo Zentris,


    ich verwende seit Ende Oktober 2014 dieses DYP-ME007Y (Affiliate-Link)Ultraschall Sensormodul (Bild siehe Anlage).


    Das Modul hängt im Öltank an der Zuleitung festgehalten durch eine Kabelverschraubung (Bild davon in diesem Beitrag)


    Rein äußerlich kann ich bisher daran keine Veränderung feststellen. Die Messungen sind bisher Ok.


    Da ich nicht gesehen habe wohin das Modul misst bzw. von welchen Hindernissen im Tank (Versteifungen) die Messungen beeinflusst werden, musste ich bis zum Ende der ersten Tankfüllung des öfteren das Modul mechanisch nachjustieren (in eine andere Richtung drehen). Aufgrund des halbtransparenten Tanks war dies jedoch gut mit dem Laptop neben dem Öltank stehend und einer temporären Endlos-Meßschleife möglich. Die Messfehler gegen die Hindernisse hatte ich in FHEM bemerkt, da dann jedesmal die Messungen fast konstant blieben und trotz des Winters kein Öl-Verbrauch angezeigt wurde. Ich bin dann mit dem Laptop in den Keller und habe das Modul ein wenig mit der Kabelverschraubung gedreht, solange bis die auf dem Laptop angezeigten Ist-Messwerte sich mit meiner Messung per Zollstock (Soll-Messwert) deckten.


    Gruß Bracew


  • Hallo Bracew,


    ich habe mir dein Projekt auch mal angesehen. Nun habe ich aber ein paar Fragen zu deinem Plot. Du speicherst deine ganzen Daten in einer Log Datei? Diese ist denke ich nur eine simple Textdatei, oder?
    Wenn ich das richtig sehe, verwendest du Gnuplot?
    Hier sehe ich leider nicht wie viel Tage du anzeigen lässt. Könntest du vielleicht kurz erklären welcher Zeitraum bei dem Plot angezeigt wird (eine Woche, ein Monat)?


    Da ich so ein ähnliches Projekt vor habe, würde ich mich sehr freuen wenn du mir deinen Plot erklärst. Ich habe mir schon RRDTool angesehen, aber da ist die Syntax ziemlich schwer. Daher würde ich gerne bei Gnuplot bleiben.


    Danke :)

  • Hallo wusa,


    ja, die Log Datei ist eine simple Textdatei.
    Sie sieht zum Beispiel gerade so aus (Ausschnitt von gestern und heute):

    Code
    2015-04-11_00:10:48 Entfernung: 38.3 cm  Fuelhoehe: 123.5 cm  Liter: 3706 l  Liter-Neg.: -3706 l
    2015-04-11_06:10:47 Entfernung: 38.4 cm  Fuelhoehe: 123.4 cm  Liter: 3703 l  Liter-Neg.: -3703 l
    2015-04-11_12:10:47 Entfernung: 38.4 cm  Fuelhoehe: 123.4 cm  Liter: 3701 l  Liter-Neg.: -3701 l
    2015-04-11_18:10:45 Entfernung: 38.5 cm  Fuelhoehe: 123.3 cm  Liter: 3699 l  Liter-Neg.: -3699 l
    2015-04-12_00:15:28 Entfernung: 38.6 cm  Fuelhoehe: 123.2 cm  Liter: 3697 l  Liter-Neg.: -3697 l
    2015-04-12_06:16:32 Entfernung: 38.7 cm  Fuelhoehe: 123.1 cm  Liter: 3694 l  Liter-Neg.: -3694 l


    Direkt verwende ich kein Gnuplot, sondern nur indirekt. Die Daten aus der Datei werden von FHEM ausgelesen und in FHEM aufbereitet und dargestellt. Du hast trotzdem recht, den intern verwendet FHEM wiederum Gnuplot: http://www.fhemwiki.de/wiki/Plots_erzeugen


    In FHEM kann man für den Plot einen festen Zeitraum zur Darstellung einstellen oder dies offen lassen, dann wird zunächst nur der heutige Tag dargestellt. Mit dem "zoom out"-Knopf (Lupensymbol mit minus-Zeichen oben Links) kann man dann auf die Wochenansicht, dann auf die Monatsansicht und zum Schluß auf die Jahresansicht wechseln und natürlich wiederum mit "zoom in"-Knopf (Lupensymbol mit plus-Zeichen oben Links) zurück. Jede einzelne der Ansichten (Tages-, Wochen-, Monats- oder Jahresansicht) kann man zu dem Abschnitt davor umschalten, z.B. also von der heutigen Wochenansicht auf die Woche davor, auf die Woche davor, auf die Woche davor, etc. und natürlich auch wieder zurück (Grüne Pfeile Links und Rechts oben).


    Ich verwende keine feste Einstellung. Der angezeigte Plot startet dann immer mit der Tagesansicht. Danach kann ich zwischen den Ansichten zum Beispiel wie folgt wechseln.


    Beispiel Tagesansicht von jetzt:


    Beispiel Wochenansicht diese Woche:


    Beispiel Monatsansicht April:


    Beispiel Monatsansicht vorhergehender Monat März mit Tanken (Füllen der Öltanks):


    Ansonsten ist der einbinden des Plots in dem [url=http://forum.fhem.de/index.php/topic,28891.msg228208.html#msg228208]FHEM Beitrag [/url]bereits erklärt. Falls Du noch fragen hast, scheu Dich nicht wieder nachzufragen.


    Gruß Bracew

  • Vielen lieben Dank für deine ausführliche Beschreibung. Ich denke, das ich mir FEHM dann mal genauer ansehen muss. Ich habe mit Gnuplot begonnen. Dann habe ich das mit der Tages oder Wochenanzeige nicht geschafft. Dann wollte ich auf RRDTool wechseln, aber hier ist die Syntax zu schwierig.
    Das bei dir gefällt mir sehr gut. Daher werde ich mir das mal genauer ansehen. Gibt es dabei irgendetwas zu beachten? Ich lese meine Sensoren bereits mit Python aus.
    Nochmals vielen Dank!

  • Hallo wusa,


    ja, zu Beachten gibt es, dass:

    • ich das Diagramm über den Verbrauch (grüne Säulen in der Grafik) nur mit negativem Tankfüllstand in der Textdatei hinbekomme, deshalb steht dort z.B. "Liter-Neg.: -3694 l" drin
    • ich das Jahresdiagramm mit Säulengrafik (bei mir der Verbrauch) nicht hinbekomme. Sieht so gräßlich aus:


    Gruß Bracew