[Gelöst] Heizöl-Tankstand-(oder Verbrauchs) Fernablesung mit RasPi und FHEM

Begonnen von Bracew, 02 November 2014, 12:49:34

Vorheriges Thema - Nächstes Thema

Bracew

Hallo pallago,

ich habe mittlerweile das Script auch ein wenig verbessert und mir dabei überlegt mit welchem Ansatz aus der Statistik ich "DEN" Ergebnis-Ultraschall-Messwert bestimme.
Zum Beispiel über Mittelwert, gestutzten Mittelwert, Median und auch Modalwert.

Bei vielen Test auch über Testreihen mit vielen hunderten bis tausenden Einzelmessungen ist dabei herausgekommen, was auch die theoretische Statistik sagt, zum Beispiel hier aus Excel: "Bei einer symmetrischen Verteilung einer Zahlengruppe sind diese drei Masse der zentralen Tendenz identisch. Bei einer schiefen Verteilung einer Zahlengruppe koennen die Masse abweichen."

Bei meinen Messungen haben sich Mittelwert, gestutzter Mittelwert, Median und Modalwert immer mehr angeglichen je mehr Einzelmessungen in die Statistischen Werte eingegangen sind, bis sie in den signifikanten Stellen gleich waren. Mit anderen Worten, es ist eigentlich also egal, welchen der Statistik-Werte man benutzt, solange man eine ausreichend hohe Anzahl von Messwerte ermittelt.

Bei sehr langen Testreihen ist mir aufgefallen, dass zwischen Start und Ende es eine Entnahme gegeben haben könnte und dies bereits wiederum die Messung verzerrt.

Nicht ganz sicher bin ich mir bezüglich der Wartezeit (sleep) zwischen einzelnen Ultraschall-Messungen, ob diese die Genauigkeit beeinflusst, zum Beispiel aufgrund von Echos, welche noch im Tank rumschwirren von der vorhergehenden Ultraschall-Messung. Du verwendest     
Zitat# Warte zwischen den Messungen 20ms
    time.sleep(0.02)
Ich hatte zum Schluss time.sleep(0.4) verwendet und bin allein wegen des vielen Wartens schon sehr langsam. Ich werde auch mal ein paar Tests mit 0,02 versuchen. Ob es da Erfahrungswerte gibt, wie weit der Wert nach unten gesetzt werden kann?

Ein erster Test über 600 Messungen mit time.sleep(0.02) scheint zu funktionieren. Ergebnis nach 3m32.609s:
Max: 42.911 cm  Min: 42.471 cm  Mittel: 42.633 cm Median: 42.633 cm Modal: 42.633 cm TrimMean_50: 42.633 cm

Bei time.sleep(0.4) hatte ich mit 300 Messungen ein Ergebnis erst nach ca. einer halben Stunde.

Gruß Bracew

FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

pallago

Hallo Bracew,
ehrlich gesagt habe ich mir da nicht so viele Gedanken gemacht. Ich dachte mir, dass man mit wenigen Messungen und dem Median zum richtigen Ergebnis gelangt. Für eine hinreichend große Anzahl der Wiederholungen, denke ich auch, dass alle 4 Werte zu "DEM" Ergebnis konvergieren.
Bezüglich Timing: Wahrscheinlich kommt es darauf an, welche Entfernungen man messen möchte. Überschlagsmäßig würde ich es folgendermaßen abschätzen:
t = 2* weg[m]/330 s,  (2x, weil der Schall "hin" und "zurück" muss; 330m/s = Schallgeschwinigkeit in der Luft) bsp.
wenn der Tank/Brunnen etc. 5m tief ist: 0,03s
=> Jetzt sehe ich das Problem; danke  :)

Sobald der Sensor verbaut ist, werde ich mich an dem timing spielen.

Aber dann muss der Fehler irgendwo anders liegen, wenn du das Warten verdoppelst und die Anzahl der Messungen halbierts, sollte ungefähr auch 3,5min dauern?

Bracew

Hallo pallago,

das mit dem "Warten" und dem "verdoppeln" ist nicht ganz so. Ich hatte 0,4 und Du 0,02 Sekunden genommen, also rund 20mal so lange Wartezeit. Außerdem habe ich zusätzlich eine doppelt kaskadierte Messung vorgeschaltet. Soll heißen, nur wenn 2 Messungen auf ±10% gleich sind, werden sie zur nächsten Prüfung auf 10% mit dem nächsten Messpaar weiterverwendet. Es müssen bei mir also für eine Messung, welche in die Statistik eingeht, mindesten 4 reale Messungen vorgenommen werden. Somit erhöht sich die Wartezeit auf mehr als das 4x20=80-fache.

Aber, aufgrund Deiner Angabe time.sleep(0.02), habe ich nun den Zeitaufwand reduziert. Danke dafür!

Trotz aller Statistik und Messkaskaden schwanken die Messung für den Füllstand im Öltank bei vier Läufen in 24 Stunden, bei mir immer noch um ca. ±2mm. Bei dem Inhalt meines Öltanks habe ich also eine Ungenauigkeit von ca. 10-15 Litern, welche ich wahrscheinlich nicht eliminiert bekomme.

In der jetzigen Übergangszeit verbrauchen wir ca. zwischen 5 und 20 Litern Heizöl pro Tag (Wetterabhängig aufgrund Außentemperatur Tag bzw. Nacht, Nutzerabhängig aufgrund Warmwasserverbrauch). Ein absoluter Tagesverbrauch lässt sich also nicht genau ermitteln, aber eine Tendenz erkennen.

In meinem Skript habe ich noch eine Benachrichtigung per E-Mail eingebaut falls das Warnlevel unterschritten wird. Dann bleibt mir immer noch genug Zeit zum Nachbestellen von Heizöl bzw. noch ca. ein Monat um den Ölpreis zu beobachten und einen guten Bestellzeitpunkt mir auszusuchen.

Gruß Bracew
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

Bracew

Hallo,

ich habe nochmals ein wenig mit time.sleep(x.y) experementiert. Hintergrund ist, dass ich mit 0.02 unregelmäßige Aussetzer im Skript beobachtet habe.
Je näher ich an 0.00 komme und auch mit 0.00, desto öfter bleibt das Skript mittendrin stehen und bleibt hängen.

Im Moment habe ich die Einstellung auf 0.05 angehoben. Mal sehen, ob das so ohne Hänger weiterhin läuft.

Gruß Bracew
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

Bracew

FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

u.becker

Moin,
selbst wenn dieser Thread etwas älter ist, inhaltlich ist das ganze noch interessant, ich bin auch jetzt erst darauf gestoßen.
Nach Installation des Scriptes V1.4 von hier https://forum-raspberrypi.de/forum/thread/7428-heizoel-tankstand-oder-verbrauchs-fernablesung-mit-raspi-geloest-beitrag-21/?postID=301057#post301057 hatte ich mich gewundert, warum beim Aufruf nur der Zeitstempel angezeigt wurde. Die auskommentierten Debug print Befehle zeigten ebenfalls nur jeweils den 1. Wert.
Abhilfe war, in der print Funktion alles in eine große Klammer zu setzen, dann funktioniert die Ausgabe. Hat wohl damit zu tun, das das Originalscript noch für Python 2.x geschrieben war.
Hier ist ein aktuelles RaspianOs mit Python 3.9.2 installiert.

Dies als Hinweis für Menschen, die sich jetzt erst mit dem Thema beschäftigen und sich evtl. über eine fehlende Ausgabe wundern...
Die fragliche Zeile läuft so unter Python 3.?
Zeile 214

  print (ZeitStempel,"Entfernung: %.1f cm" % Abstand," Fuelhoehe: %.1f cm" % Fuelstand," Liter: %.0f l" % Liter, " Liter-Neg.: -%.0f l" % Liter)


Gruß
Außerdem muß noch in Zeile 153 xrange mit range ausgetauscht werden, damit es unter Python 3 läuft

Bracew

Hallo,

der thread ist schon relativ alt und die Welt hat sich unterdessen weiter gedreht. Das Script habe ich unter der damals aktuellen Python Version, ich glaube Python 2.7.3, geschrieben.

Ich hatte mich später auch mal an einer Version unter Python 3.x versucht oder auch mal an einer Version unter Verwendung der gpiozero-Bibliothek.

Die Python 2 zu 3 Differenzen sind zum Beispiel in: https://lerneprogrammieren.de/python-2-vs-3/ unter: "5. Python 2 und Python 3 haben eine unterschiedliche Syntax für die print" zu sehen.

Letztendlich bin ich jedoch im 2.7er Zweig geblieben, da die Zuverlässigkeit gelitten hat und ich nicht für jedes Update irgendeines Programms des RasPi wieder neue Anpassungen und Bastelei machen wollte, frei nach dem Slogan "Never change a runnig system".

Der RasPi und das Skript messen bei mir noch heute. Da das die Hauptaufgabe ist, bekommt er auch keine Updates mehr.

Für die Umstellung des Skripts auf Python 3.x hatte ich damals noch zusätzlich zu den von u.becker bereits dankenswerter Weise genannten Änderungen festgestellt, dass verschiedene Werte dediziert auf FLOAT umgestellt werden müssen, zum Beispiel MaxTankLiter, MinTankLiter und MaxFuellHoehe in dem ein ".0" an den ganzahligen Wert gehängt wird.

MaxTankLiter  = 4500.0    # Gesamtfuellmenge des Oeltanks
MinTankLiter  = 1200.0    # Untere Fuellmengengrenze fuer Warnung per E-Mail
MaxFuellHoehe = 150.0     # Tankhoehe in cm von LEER bis VOLL


FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe