Hallo,
wie bekomme ich zusätzlich die Delta Werte des täglichen Verbrauchs (Liter pro Tag) in einen Plot eingezeichnet?
Ich bekomme einen wunderbaren Plot des Füllstandes gezeichnet. (Siehe Dateianlage, leider bekomme ich das Bild hier nicht zwischen die Textzeilen eingefügt):
Beispiel-Zeilen aus der Log Datei: Heizoel.log
2014-11-07_12:10:12 Entfernung: 79.4 cm Fuelhoehe: 82.4 cm Liter: 2472 l
2014-11-07_18:10:12 Entfernung: 79.5 cm Fuelhoehe: 82.3 cm Liter: 2469 l
2014-11-08_00:10:24 Entfernung: 80.1 cm Fuelhoehe: 81.7 cm Liter: 2450 l
2014-11-08_06:10:23 Entfernung: 79.9 cm Fuelhoehe: 81.9 cm Liter: 2457 l
2014-11-08_12:10:24 Entfernung: 80.4 cm Fuelhoehe: 81.4 cm Liter: 2441 l
2014-11-08_18:10:25 Entfernung: 80.2 cm Fuelhoehe: 81.6 cm Liter: 2447 l
2014-11-09_00:10:23 Entfernung: 80.3 cm Fuelhoehe: 81.5 cm Liter: 2444 l
2014-11-09_06:10:32 Entfernung: 80.9 cm Fuelhoehe: 80.9 cm Liter: 2426 l
2014-11-09_12:10:24 Entfernung: 80.8 cm Fuelhoehe: 81.0 cm Liter: 2429 l
mit folgendem Code aus der fhem.cfg:
define HeizoelFileLog FileLog ./log/Heizoel.log fakelog
attr HeizoelFileLog room Heizung
attr HeizoelFileLog group Heizoelstand
attr HeizoelFileLog logtype heizoel:Window,text
define PlotHeizoel SVG HeizoelFileLog:heizoel:CURRENT
attr PlotHeizoel label "Liter (l)"::"Liter (l)"::"Heizoel: Max=$data{max1} Liter, Letzter=$data{currval1} Liter"
attr PlotHeizoel group Heizoelstand
attr PlotHeizoel room Heizung
und folgendem .gplot-File
############################
# Display the tank level.
#
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel "Heizoel"
set ytics
set y2tics
set title <L3>
set grid xtics y2tics
set ylabel <L1>
set y2label <L2>
set yrange [0:4500]
set y2range [0:4500]
#FileLog 9::0:
plot "<IN>" using 1:2 title 'Tankfuellung' with lines
Nun würde ich gerne auch den täglichen Verbrauch in Litern im möglichst gleichen Plot als Säulen dargestellt bekommen.
Ich habe dazu "delta-d" versucht.
Doch trotz allen googeln, ausprobieren vieler Beispiele hier aus dem Forum, dem Wiki und den Beispiel .gplot-Dateien bekomme ich es nicht hin!!!
Kann mir bitte jemand auf die Sprünge helfen, Tipps geben oder sagen was ich falsch mache?
Danke Bracew
Hallo FHEM-Freunde,
niemand eine Idee, Tipp oder Hilfe, wie ich die Differenzwerte zweier Tage, den Verbrauch also, in den Plot integrieren kann?
Gruß Bracew
Das versuche ich auch gerade .... habe aber noch nichts zustande gebracht.
Daher auch von meiner Seite:
Any help highly appreciated ....
Hallo,
leider komme ich von allein nicht weiter. Gibt es niemanden, der helfen kann?
Ich würde gerne den täglichen Öl-Verbrauch in Litern als Säulen dargestellt bekommen.
Ob in einen extra Plot oder im gleichen wie der Füllstand wäre mir zunächst egal.
Schönen 1. Advent wünscht Bracew
Servus Bracew,
ich habe das Problem (zumindest für mich) mittlerweile gelöst.
Hier
http://forum.fhem.de/index.php/topic,29366.msg223454.html#msg223454 (http://forum.fhem.de/index.php/topic,29366.msg223454.html#msg223454)
steht wie.
Liebe Güße
Oli
Hallo ojb,
schön, dass es für Dich OK ist und danke für Deinen Tip.
Ich haben Deinen Tip und alles mögliche andere ausprobiert. Doch leider bekomme ich jede Menge Varianten von Unsinnigkeiten im Plot gezeichnet. Die Doku zu .gplot ist sehr schlecht. Die Beispiele die ich finde gehen von anderen Bedingungen aus, vor allem nicht von einem "fakelog".
Es kann auch sein, dass ich zu blöd bin.
Ich versuche mich nun schon seit Wochen daran und komme zu keinem brauchbarem Ergebnis. Bald bin ich es Leid und gebe auf. Meine Frustschwelle ist bald erreicht.
Gruß Bracew
Hallo Bracew,
nicht aufgeben, das kann doch nicht so schwierig sein.
Zeig doch nochmal die .gplot mit dem "normalen" Verlauf ...
Liebe Grüße
Oli
Hallo,
mal ein anderer Ansatz. Du errechnest doch die "Restmenge". Dann könntest Du doch auch die "verbrauchte Menge" errechnen. Wenn das nicht direkt geht, schau Dir mal difference in der commandref an. Auf diesen Wert läßt Du ein average laufen. Dann bekommst Du Werte aufsummiert pro Tag und Monat. Diesen kann man kurz vor Mitternacht mit einem Script auslesen und in die Log-Datei schreiben. Die Daten kann man dann in der Grafik anzeigen lassen. Ich mache das mit meinen Tagesverbräuchen zumindest so.
Das Script kann ich die senden, wenn Du Interesse hast.
Gruß Christoph
Hallo ojb, hallo Bennemannc,
danke für Eure Hilfe. Ich bin sehr froh, dass ich Hilfe zu diesem Thema erhalte und sich jemand meiner Probleme versucht anzunehmen.
@ojb:
Die ".gplot mit dem "normalen" Verlauf " habe ich im ersten Beitrag ganz oben bereits beigefügt. Es ist eine Datei "Plot.jpg" angehängt, welche den "normalen" Verlauf darstellt (leider habe ich die Grafik nicht zwischen die Textzeilen bekommen). Wenn Du auf "plot.jpg" klickst siehst Du die Grafik größer.
Auch der .gplot-File ist im ersten Beitrag beigefügt ("Display the tank level.").
@Bennemannc
Zunächst einmal würde ich mir gerne Dein Script ansehen.
Bedenken habe ich jedoch ob es bei mir sinngemäß funktionieren würde, da bei mir die Log-Datei alle sechs Stunden durch einen zweiten RasPi geschrieben und überschrieben wird (ich nenne diesen "HeizPi", da dieser in der Heizung die Werte messen und in eine Log-Datei schreibt). Meine Log-Datei wird also nicht vom RasPi geschrieben auf welchem FHEM läuft. Für den Pi auf welchem FHEM läuft wird die Log-Datei sozusagen extern erstellt, er soll nur die Auswertung übernehmen.
Die Original Messwerte-Datei (Log-Datei) wird also alle 6 Stunden von einem RasPi (Name="HeizPi") auf den anderen RasPi (Name="Pi") kopiert. Dabei würde natürlich auch jede Änderung an der Log-Datei durch FHEM auf dem "Pi" spätestens nach 6 Stunden durch die Datei von "HeizPi" wieder überschrieben, also auch die mit difference bzw. average neu berechneten Werte.
Ich hoffe ich habe mich verständlich ausgedrückt. Ich habe den Werdegang übrigens einmal hier: http://www.forum-raspberrypi.de/Thread-haussteuerung-heizoel-tankstand-oder-verbrauchs-fernablesung-mit-raspi?pid=115200#pid115200 als HowTo beschrieben.
Gruß Bracew
Hallo,
soweit ich weiß, gehen die Module difference und average nur auf readings (oder userreading) die auch in fhem vorliegen. Wenn ich Deine konstellation richtig verstanden habe, schreibt ein RPI die Datei und der fhem-RPI zeigt nur die Daten aus der Datei an.
Dann würde das nur mit rechen in Perl und REGEXP gehen. REGEXp sucht nur die Datenätze mit 00:00 und zieht diese voneinander ab. So etwas habe ich noch nicht gemacht, aber vielleicht findet sich ja ein Perl/REGEXp Freak, der so etwas schreiben kann.
Gruß Christoph
Hallo Bracew,
mach jetzt mal bitte folgendes:
Nimm die ursprüngliche .gplot und ändere
#FileLog 9::0:
in
#FileLog 9::0:delta-d
Und dann attributiere das SVG mit
fixedrange 30days
Und zeig mal her was rauskommt.
Liebe Grüße
Oli
Hallo ojb,
ich habe die Änderungen eingearbeitet.
Die fhem.cfg sieht nun so aus:
define HeizoelFileLog FileLog ./log/Heizoel.log fakelog
attr HeizoelFileLog group Heizoelstand
attr HeizoelFileLog logtype heizoel:Window,text
attr HeizoelFileLog room Heizung
define PlotHeizoel SVG HeizoelFileLog:heizoel:CURRENT
attr PlotHeizoel group Heizoelstand
attr PlotHeizoel label "Liter (l)"::"Liter (l)"::"Heizoel: Max=$data{max1} Liter, Letzter=$data{currval1} Liter"
attr PlotHeizoel room Heizung
attr PlotHeizoel fixedrange 30days
und der .gplot-File so:
############################
# Display the tank level.
#
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel "Heizoel"
set ytics
set y2tics
set title <L3>
set grid xtics y2tics
set ylabel <L1>
set y2label <L2>
set yrange [0:4500]
set y2range [0:4500]
#FileLog 9::0:delta-d
plot "<IN>" using 1:2 title 'Tankfuellung' with lines
Als Ergebnis bekomme ich den in der jpg-Anlage beigefügten Plot gezeichnet (Ich habe immer noch nicht rausgefunden, wie ich diesen hier zwischen die Textzeilen einfügen kann)
Gruß Bracew
Ich glaube das funktioniert, nur Du hast einen Ausreisser im Log.
Änder doch mal die yrange von [0:4500] auf z.B. [:100] und das "with lines" in "with bars" ...
Hallo ojb,
danke für Deine Hilfsversuche. In der Anlage wiederum das Ergebnis-Plot, welches auch abgesehen vom Ausreisser nicht OK ist.
Zur Erklärung noch für den Ausreisser. Am 19.11.2014 habe ich Heizöl nachgetankt, bis der Tank randvoll war. Für die Tage danach ist der Tankstand nicht gesunken, also nichts verbraucht worden, da der Füllstand zu nah am Sensor ist (Messwertfehler des Sensors, da Abstand zur Oberfläche zu gering).
Vor dem 19.11. ist der Füllstand jedoch täglich gesunken, also etwas verbraucht worden.
Der Logfile sieht so aus:
2014-11-08_00:10:24 Entfernung: 80.1 cm Fuelhoehe: 81.7 cm Liter: 2450 l
2014-11-08_06:10:23 Entfernung: 79.9 cm Fuelhoehe: 81.9 cm Liter: 2457 l
2014-11-08_12:10:24 Entfernung: 80.4 cm Fuelhoehe: 81.4 cm Liter: 2441 l
2014-11-08_18:10:25 Entfernung: 80.2 cm Fuelhoehe: 81.6 cm Liter: 2447 l
2014-11-09_00:10:23 Entfernung: 80.3 cm Fuelhoehe: 81.5 cm Liter: 2444 l
2014-11-09_06:10:32 Entfernung: 80.9 cm Fuelhoehe: 80.9 cm Liter: 2426 l
2014-11-09_12:10:24 Entfernung: 80.8 cm Fuelhoehe: 81.0 cm Liter: 2429 l
2014-11-09_18:10:24 Entfernung: 81.3 cm Fuelhoehe: 80.5 cm Liter: 2414 l
2014-11-10_00:10:35 Entfernung: 81.2 cm Fuelhoehe: 80.6 cm Liter: 2419 l
2014-11-10_06:10:23 Entfernung: 81.2 cm Fuelhoehe: 80.6 cm Liter: 2417 l
2014-11-10_12:10:23 Entfernung: 81.9 cm Fuelhoehe: 79.9 cm Liter: 2397 l
2014-11-10_18:10:27 Entfernung: 81.6 cm Fuelhoehe: 80.2 cm Liter: 2407 l
2014-11-11_00:10:25 Entfernung: 82.3 cm Fuelhoehe: 79.5 cm Liter: 2386 l
2014-11-11_06:10:36 Entfernung: 82.0 cm Fuelhoehe: 79.9 cm Liter: 2396 l
2014-11-11_12:10:25 Entfernung: 82.2 cm Fuelhoehe: 79.6 cm Liter: 2388 l
2014-11-11_18:10:24 Entfernung: 82.7 cm Fuelhoehe: 79.1 cm Liter: 2374 l
2014-11-12_00:10:56 Entfernung: 82.5 cm Fuelhoehe: 79.4 cm Liter: 2381 l
2014-11-12_06:11:00 Entfernung: 82.5 cm Fuelhoehe: 79.3 cm Liter: 2378 l
2014-11-12_12:10:55 Entfernung: 83.1 cm Fuelhoehe: 78.7 cm Liter: 2361 l
2014-11-12_18:10:48 Entfernung: 82.8 cm Fuelhoehe: 79.0 cm Liter: 2369 l
2014-11-13_00:11:00 Entfernung: 83.0 cm Fuelhoehe: 78.8 cm Liter: 2364 l
2014-11-13_06:10:53 Entfernung: 83.2 cm Fuelhoehe: 78.6 cm Liter: 2357 l
2014-11-13_12:10:47 Entfernung: 83.3 cm Fuelhoehe: 78.5 cm Liter: 2354 l
2014-11-13_18:11:27 Entfernung: 83.8 cm Fuelhoehe: 78.0 cm Liter: 2340 l
2014-11-14_00:11:02 Entfernung: 83.6 cm Fuelhoehe: 78.2 cm Liter: 2347 l
2014-11-14_06:10:53 Entfernung: 83.8 cm Fuelhoehe: 78.1 cm Liter: 2342 l
2014-11-14_12:11:43 Entfernung: 84.2 cm Fuelhoehe: 77.6 cm Liter: 2327 l
2014-11-14_18:10:50 Entfernung: 84.1 cm Fuelhoehe: 77.7 cm Liter: 2332 l
2014-11-15_00:11:20 Entfernung: 84.5 cm Fuelhoehe: 77.3 cm Liter: 2320 l
2014-11-15_06:11:40 Entfernung: 84.7 cm Fuelhoehe: 77.2 cm Liter: 2314 l
2014-11-15_12:10:50 Entfernung: 84.5 cm Fuelhoehe: 77.3 cm Liter: 2318 l
2014-11-15_18:10:49 Entfernung: 85.2 cm Fuelhoehe: 76.6 cm Liter: 2299 l
2014-11-16_00:10:46 Entfernung: 84.9 cm Fuelhoehe: 76.9 cm Liter: 2308 l
2014-11-16_06:10:49 Entfernung: 84.9 cm Fuelhoehe: 76.9 cm Liter: 2307 l
2014-11-16_12:10:47 Entfernung: 85.6 cm Fuelhoehe: 76.2 cm Liter: 2286 l
2014-11-16_18:11:47 Entfernung: 85.2 cm Fuelhoehe: 76.6 cm Liter: 2298 l
2014-11-17_00:11:17 Entfernung: 85.4 cm Fuelhoehe: 76.4 cm Liter: 2291 l
2014-11-17_06:11:25 Entfernung: 85.8 cm Fuelhoehe: 76.0 cm Liter: 2281 l
2014-11-17_12:10:49 Entfernung: 85.8 cm Fuelhoehe: 76.0 cm Liter: 2280 l
2014-11-17_18:11:01 Entfernung: 86.4 cm Fuelhoehe: 75.4 cm Liter: 2261 l
2014-11-18_00:11:11 Entfernung: 86.2 cm Fuelhoehe: 75.7 cm Liter: 2270 l
2014-11-18_06:10:47 Entfernung: 86.8 cm Fuelhoehe: 75.0 cm Liter: 2250 l
2014-11-18_12:11:09 Entfernung: 86.6 cm Fuelhoehe: 75.2 cm Liter: 2256 l
2014-11-18_18:11:13 Entfernung: 87.0 cm Fuelhoehe: 74.8 cm Liter: 2243 l
2014-11-19_00:10:50 Entfernung: 87.0 cm Fuelhoehe: 74.8 cm Liter: 2245 l
2014-11-19_06:10:59 Entfernung: 87.1 cm Fuelhoehe: 74.7 cm Liter: 2241 l
2014-11-19_12:10:54 Entfernung: 87.5 cm Fuelhoehe: 74.4 cm Liter: 2231 l
2014-11-19_18:10:46 Entfernung: 27.9 cm Fuelhoehe: 133.9 cm Liter: 4018 l
2014-11-20_00:10:50 Entfernung: 27.6 cm Fuelhoehe: 134.2 cm Liter: 4025 l
2014-11-20_06:12:02 Entfernung: 30.0 cm Fuelhoehe: 131.8 cm Liter: 3954 l
2014-11-20_12:10:49 Entfernung: 28.0 cm Fuelhoehe: 133.8 cm Liter: 4014 l
2014-11-20_18:10:48 Entfernung: 27.4 cm Fuelhoehe: 134.4 cm Liter: 4031 l
2014-11-21_00:10:46 Entfernung: 29.3 cm Fuelhoehe: 132.5 cm Liter: 3976 l
2014-11-21_06:10:49 Entfernung: 27.7 cm Fuelhoehe: 134.1 cm Liter: 4022 l
2014-11-21_12:10:55 Entfernung: 31.5 cm Fuelhoehe: 130.3 cm Liter: 3910 l
2014-11-21_18:10:58 Entfernung: 27.8 cm Fuelhoehe: 134.0 cm Liter: 4019 l
2014-11-22_00:10:50 Entfernung: 27.7 cm Fuelhoehe: 134.1 cm Liter: 4024 l
2014-11-22_06:10:59 Entfernung: 28.3 cm Fuelhoehe: 133.5 cm Liter: 4006 l
2014-11-22_12:12:01 Entfernung: 27.4 cm Fuelhoehe: 134.4 cm Liter: 4031 l
2014-11-22_18:11:23 Entfernung: 27.5 cm Fuelhoehe: 134.3 cm Liter: 4028 l
2014-11-23_00:10:46 Entfernung: 27.7 cm Fuelhoehe: 134.1 cm Liter: 4022 l
2014-11-23_06:10:54 Entfernung: 27.4 cm Fuelhoehe: 134.4 cm Liter: 4032 l
2014-11-23_12:10:47 Entfernung: 27.2 cm Fuelhoehe: 134.6 cm Liter: 4037 l
2014-11-23_18:10:53 Entfernung: 27.4 cm Fuelhoehe: 134.4 cm Liter: 4031 l
Mit lieben Grüßen Bracew
Hallo,
ich habe mir einen Teilbereich der Daten mal in Excel eingelesen und daraus einen Plot erstellt, wie ich mir den FHEM-Plot im Idealfall vorstellen würde, als Muster. Zu mindestens so ähnlich. Ich füge diesen mal in der Anlage bei.
Gruß Bracew
Hi Bracew,
das mit dem Deltawert find ich auch recht interessant! , habe auch (noch) keine Lösung.
Wäre ja auch für Gas- , Stromverbrauch ganz gut einsetzbar !?
Wenn ich das richtig sehe, liest Du alle 6 Stunden Entfernung/Höhe/Liter ?
Könnte man hier nicht einen Dummy definieren, der immer dem letzten Wert enthält. Von diesen zeihst Du den neu gelesenen Wert ab (Differenz)
und schreibst diese mit in das Logfile !? Ob und wie das funktioniert ?? Keine Ahnung ! Sorry .
klaus
Hi Bracew,
vielleicht ist das ein Ansatz ?
Zitathttp://fhem.de/commandref.html#average
Zitathttp://forum.fhem.de/index.php/topic,29080.msg218818.html#msg218818
klaus
Hallo kvo1,
danke für den Tipp. Ich habe mir darauf hin "average" in der commandref angeschaut.
So wie ich es verstehe, kann ich damit einen Durchschnittswert über alle Tage berechnen lassen. Also, zum Beispiel, wenn der Füllstand am 1. Messwert 3000 Liter wäre und am letzten Messwert=10. Messwert=2500 Liter betragen würde, berechnet das Modul einen durchschnittlichen Tagesverbrauch von (3000-2500)/10=50 Liter.
Dies berechnet mir aber nicht den tatsächlichen Verbrauch pro Tag sondern nur über alle Tage.
Ich denke schon, dass "delta-d" der richtige Ansatz wäre, doch kriege ich keine vernünftige Ausgabe damit hin. Bezogen auf meinen zuvor bereits eingestellten Logfile müsste z.B. der delta-d Wert zum 10.11.2014 sein: 2444-2419=25 Liter. In meiner Excel-Simulation werden diese 25 Liter am 10.11. auch dargestellt.
Von FHEM bzw. .gplot werden diese 25 Liter jedoch nicht geplottet, sondern gar nichts!!!
Und wie ich es auch drehe und wende und probiere bekomme ich den delta-d-Plot nicht hin. HimmelHergottSakramentNochmal, es ist zum aus der Haut fahren.
Gruß Bracew
Hallo,
das mit average ist so nicht richtig. Es berechnet auch den Tagesverbrauch sowie einen Monatsverbrauch.
int_bez 102 2014-12-07 19:02:52
int_bez_avg_day 50.0 2014-12-07 19:02:52
int_bez_avg_month 52.7 2014-12-07 19:02:52
int_bez_cnt_day 73 2014-12-07 19:02:52
int_bez_cnt_month 633 2014-12-07 19:02:52
int_bez_cum_day 3650 2014-12-07 19:02:52
int_bez_cum_month 33340 2014-12-07 19:02:52
Das sind die Werte, die ich bei average bekomme avg ist der Durchschnitt, cnt sind die Anzahl der Werte, cum ist die Summe der Werte. Mit einem at um kurz vor Mitternacht
Zitat*23:59:40 {
my ($val,$t1,$t2);
$val = (fhem "list SWAP_F1 int_bez_cum_day");
$val =~ s/\n$//g;
$t1 = "Bezug";
$t2 = substr ($val, index($val,":")+6,10);
fhem "trigger Energy_Day $t1 $t2";}
schreibe ich die Daten in ein eigenes Log - in Deinem Fall müssten die im gleichen Log wie die anderen Daten stehen.
Gruß Christoph
Hallo Bennemannc,
aber ist "avg_day" nicht der Durchschnitts-Tages-Wert deiner letzten Messungen? Ich möchte ja nicht den Durchschnitts-Tages-Wert, sondern den Tages-Wert als Differenz zur jeweils letzten Messung. Also eigentlich auch nicht nur einen Tages-Wert sondern für genaus so viele Werte wie Tage im Log.
Leider habe ich auch nicht verstanden, wie ich average so richtig in die fhem.cfg bekomme.
Ich habe eben mal "define TestAVG average HeizoelHerthFileLog" reingesetzt.
Wie kann ich nun den avg_day ansehen bzw. plotten?
Hallo,
average benötigt ein Reading - auch wenn es nur ein Dummy ist - auf der fhem Seite. Dann erstellt man den average auf diese Reading und erhält im Device die erweiterten Readings - cum cnt avg.
Gruß Christoph
Hallo Bennemannc,
Entschuldigung, aber ich verstehe nur Bahnhof. Ich bin leider kein "Hero Member" sondern nur "Newbie" in FHEM.
Wenn ich Dich richtig verstehe kann FHEM über das average Modul den Tagesverbrauch ermitteln und nicht nur den Mittelwert aller Eintragungen in der Log-Datei bezogen auf eine Zeit-Einheit. Kannst Du mir das konkreter Beschreiben, was ich tun muss um dahin zu kommen?
Mit lieben Grüßen zum 2. Advent
Bracew
Hallo,
einfach eine Reading mit average definieren:
define Summe_Bezug average SWAP_F1:int_bez.*
attr Summe_Bezug computeMethod counter
attr Summe_Bezug nominmax 1
attr Summe_Bezug room Unsorted
Damit werden zu einem vorhanden Reading (in meinem Fall Device SWAP_F1, reading int_bez.*) weitere Readings erzeugt -cum, cnt, avg - ind bei dem Device angezeigt. Das cum_day speichere ich kurz vor Mitternacht in eine Log-Datei, da diese ja um 24:00 zurück gesetzt wird.
Gruß Christoph
Hallo,
ich habe:
define TestAVG average HeizoelFileLog:Liter.*
attr TestAVG computeMethod counter
attr TestAVG nominmax 1
attr TestAVG room Unsorted
in fhem.cfg eingefügt.
kann ich so auf das fakelog der Log-Datei mit dem Liter Wert zugreifen?
und nun?
Tut mir leid, wenn ich Dich unterfordere.
Ich habe mir nochmals die commandref durchgelesen:
Compute additional average, minimum and maximum values for current day and month.
Demnach bekomme ich doch nur den Mittelwert (average) für den heutigen Tag.
Ich verstehe immer noch nicht wie mir das weiterhelfen kann. Ich brauch doch den Verbrauch für viele rückliegende Tage und der jeweilige Tagesverbrauch ist doch nicht der Mittelwert, sonder der Füllstand in Liter von gestern minus den Füllstand in Litern von heute.
Ich bin immer noch nicht davon überzeugt, dass dieses Modul der richtige Weg ist - sondern bin eher der Meinung, dass dies der Holzweg ist.
Hallo,
wie ich schon geschrieben habe, benötigst Du ein aktives Reading. Mit nominmax 1 werden keine Minnimal und Maximal Werte ermittelt. Wenn sich das (aktive) Reading ändert, werden direkt der aktuelle Mittelwert (für Dich nicht interessant) ermittelt, der Counter hochgesetzt (+1) und eine Summe auf das Reading gebildet. Das jeweils für den aktuellen Tag und Monat.
Diese Werte sind erst einmal nur als (Zusätliche) Readings vorhanden. Um den Tageswert in die Logdatei zu bekommen, nutze ich at und das Perlscript kurz vor Mitternacht.
Du kannst das Ganze ja einfach mal mit Temperatur ausprobieren (hier machen dann Summe und Anzahl keinen Sinn).
Gruß Christoph
Hallo Bennemannc,
danke für Deine Geduld mit mir.
Zunächst mal zu den Basics. Wie bekomme ich ein aktives Reading. Ich lese die Messwerte ja nur aus einer fremden Datei ein. Die Werte sind nicht mit FHEM gemessen und geschrieben worden. Das Logfile wurde extern erstellt.
Du schreibst: "...Wenn sich das (aktive) Reading ändert...". Dies ändert sich bei mir, wenn eine neue Zeile vom Fremdprogramm in das Log geschrieben wird, also zur Zeit alle 6 Stunden (jeweils ca. 10 Minuten nach 0:00 Uhr, nach 06:00, nach 12:00 Uhr und nach 18:00 Uhr).
Ich denke Du willst darauf hinaus, dass "...eine Summe..." von Minutenverbräuchen aufaddiert wird (Summenbildung) und die Summe vor Mitternacht in eine andere Logdatei geschrieben werden sollte, welche den Tagesverbrauch darstellen würde und die ich dann wiederum graphisch auswerten könnte. Ich benötige jedoch keine Summe, sondern den Tagesendwert des Vortages abzüglich den Tagesendwert des laufenden Tages, also den Wert des Füllstandes in Litern von ca. 0:10 Uhr des Vortages abzüglich den Wert des Füllstandes in Litern von ca. 0:10 Uhr des laufenden Tages. Beide jeweiligen Werte voneinander subtrahiert ergeben den jeweiligen Verbrauch des Tages für den ersten Tag. Diese Prozedur müsste dann für alle Tage im Log durchgeführt werden, oder zumindestend für den letzten Tag um den Tagesverbrauchswert der 2. Logdatei hinzu zufügen.
Bei Temperaturen kann ich mir das Vorstellen. Die minimale Temperatur, die maximale Temperatur eines Tages und auch die Durschnittstemperatur eines Tages zu wissen macht gewiss Sinn und kann man in eine Logdatei schreiben so sie denn unter des Tages von FHEM gemessen wurden. Aber in meine Fall sehe ich nicht, wie ich auf den Tagesendwert des Vortages und den Tagesendwert des laufenden Tages zugreifen und damit pro Tag den Verbrauch ermitteln kann. Zumal ich diese Berechnung dann für viele Tage (Anzahl der Tage im Log) durchführen müsste.
Vielleicht sehe ich aber auch den Wald vor lauter Bäumen nicht.
Gruß Bracew
Hallo,
Die Summe der Einzelverbräuche über den Tag ist doch genau so groß, wie die Differenz zwischen Anfangs- und Endwert.
Beispiel:
Anfang 10, alle 4 Stunden ein Reading - 3,6,7,2 - Endstand 28 => 28 - 10 = 18 (das möchtest Du rechnen) aber 3+6+7+2 = 18 (das macht average) - unterm Strich kommt das Gleiche raus.
Average addiert die kommenden Reading (Summe der Tagesverbrauchs) das ist doch einfacher als irgendwo zu suchen "wo ist mein Anfangsstand und wo mein Endstand"
Gruß Christoph
Hallo Bracew,
ich hänge zur Zeit mit einem gebrochenen Zeh zu Hause rum und Dein Problem hat mich jetzt nicht losgelassen, so dass ich jetzt ca. ne Stunde investiert hab.
Ich denke ich hab Dein Problem gelöst (siehe Screenshot), auch wenn das ganze echt fies war.
Wie gesagt, bei mir funktioniert das mit dem delta-d einwandfrei. Ich habe jetzt mit Deinem Logfile und .gplot rumgespielt und bin fast wahnsinnig geworden weil es einfach nicht klappen wollte.
Ich bin dann hergegangen und habe ganz einfache Logs selber gemacht und experimentiert und kam auf ein ganz fieses Problem, man könnte es sogar Bug nennen.
To make a long story short:
delta-d akzeptiert nur positive Deltas, sobald man negative Delta's hat wird 0 ausgegeben. Das erklärt auch Deinen Verlauf.
Allerdings wird ein negatives Delta ja positiv, wenn die Werte alle negiert werden.
Ich habe also in Deinem Logfile vor jedem Literwert ein Minus geschrieben:
2014-11-11_18:10:24 Entfernung: 82.7 cm Fuelhoehe: 79.1 cm Liter: -2374 l
2014-11-12_00:10:56 Entfernung: 82.5 cm Fuelhoehe: 79.4 cm Liter: -2381 l
2014-11-12_06:11:00 Entfernung: 82.5 cm Fuelhoehe: 79.3 cm Liter: -2378 l
Und schon funktioniert das ganze.
Was mir noch aufgefallen ist, dass in Deinem Log trotz Verbrauch die Werte manchmal zunehmen, dürfte wahrscheinlich auf das Messverfahren zurückzuführen sein.
Beispielsweise hier am 23.11.2014:
2014-11-23_00:10:46 Entfernung: 27.7 cm Fuelhoehe: 134.1 cm Liter: 4022 l
2014-11-23_06:10:54 Entfernung: 27.4 cm Fuelhoehe: 134.4 cm Liter: 4032 l
2014-11-23_12:10:47 Entfernung: 27.2 cm Fuelhoehe: 134.6 cm Liter: 4037 l
2014-11-23_18:10:53 Entfernung: 27.4 cm Fuelhoehe: 134.4 cm Liter: 4031 l
Du startest mit 4022 und endest mit 4031 Litern also 9 Liter mehr.
Ich würde nun an Deiner Stelle folgendermaßen vorgehen:
Generiere ein zweites Logfile mit einem Wert pro Tag und schreibe vor den Liter-Werten jeweils ein Minus.
Kann man ganz einfach mit einem Shell-Befehl machen:
tac Heizoel.log | uniq -w 10 | tac | sed s/"Liter: "/"Liter: -"/g > Heizoel-Delta.log
Dann bekommst Du so was
2014-11-12_18:10:48 Entfernung: 82.8 cm Fuelhoehe: 79.0 cm Liter: -2369 l
2014-11-13_18:11:27 Entfernung: 83.8 cm Fuelhoehe: 78.0 cm Liter: -2340 l
2014-11-14_18:10:50 Entfernung: 84.1 cm Fuelhoehe: 77.7 cm Liter: -2332 l
Dieses Script kann man zweitgesteuert von FHEM zu sinnvollen Zeiten ausführen lassen.
Und dann mit delta-d ein Plot auf Heizoel-Delta.log und fertig ist das Kunststück.
Liebe Grüße
Oli
Hallo,
@Bennemannc:
Du hast recht, aber ich auch, denn ich habe keine Einzelverbräuche. Ich habe nur den Füllstand in Litern.
Hier nochmal einen Auzug aus dem Log:
2014-11-08_12:10:24 Entfernung: 80.4 cm Fuelhoehe: 81.4 cm Liter: 2441 l
2014-11-08_18:10:25 Entfernung: 80.2 cm Fuelhoehe: 81.6 cm Liter: 2447 l
2014-11-09_00:10:23 Entfernung: 80.3 cm Fuelhoehe: 81.5 cm Liter: 2444 l
2014-11-09_06:10:32 Entfernung: 80.9 cm Fuelhoehe: 80.9 cm Liter: 2426 l
2014-11-09_12:10:24 Entfernung: 80.8 cm Fuelhoehe: 81.0 cm Liter: 2429 l
2014-11-09_18:10:24 Entfernung: 81.3 cm Fuelhoehe: 80.5 cm Liter: 2414 l
2014-11-10_00:10:35 Entfernung: 81.2 cm Fuelhoehe: 80.6 cm Liter: 2419 l
2014-11-10_06:10:23 Entfernung: 81.2 cm Fuelhoehe: 80.6 cm Liter: 2417 l
Ich greife mal den 09.11. oben aus dem Log raus.
Am Anfang des Tages, also am 09.11.2014 um kurz nach Mitternacht (00:10:23 Uhr) ist der Füllstand 2444 Liter.
Am Ende des Tages, also am 10.11.2014 um kurz nach Mitternacht (00:10:35) ist der Füllstand 2419 Liter.
Der Verbrauch berechnet sich also zu 2444-2419=25 Liter am Tag für den 09.11.2014.
Es gibt kein Reading mit dem Verbrauch alle 6 Stunden, sondern nur eine Inhaltsangabe der Restmenge. Das "3+6+7+2" gibt es so nicht! Und leider habe ich auch noch keinen Weg gefunden, den Logfile in der Art zu ändern, dass ich damit das average-Modul füttern könnte.
@ojb:
Oooooh jeeeee, das tur mir leid mit Deinem Zeh!!! ;)
Ich wünsche Dir gute Besserung und baldige Genesung.
Es hat allerdings auch etwas für sich, das mit Deinem gebrochenen Zeh. Denn so hattest Du Zeit.
Das mit dem Wahnsinnig geht mir auch so. Ich freue mich jedoch, dass es bei Dir funktioniert hat. Das gibt mir Mut!
Ich bin den Tag über an der Arbeit. Sobald als möglich versuche ich Deine Lösung. Auf den ersten Blick sieht das sehr, sehr gut aus.
Die Logwerte schwanken ein wenig aufgrund der Messtoleranzen und natürlich, weil ich zwischendurch einmal den Tank gefüllt habe. Wenn der Tank voll ist, ist der Mindestabstand des Messfühlers zur Öloberfläche unterschritten. Aufgrund der Ultraschall-Messung läuft der Impuls so kurz, dass nicht mehr genau genug gemessen wird.
Ich gebe Rückmeldung, wenn ich Deinen Ansatz ausprobiert habe und bis dahin wünsche ich wenig Langeweile.
Gruß Bracew
Hallo,
nur mal so gefragt, warum misst Du alle 6 Stunden und nicht nur einmal am Tag ? Bei den 6 Stunden fließ anscheinend manchmal Heizöl zurück in den Tank - ich gehe mal von Messungenauigkeiten aus.
Mit welchem Gerät bzw. Messsonden mißt Du. Die Daten kommen ja auf einen Raspi - kann man die Messsonde an fhem anbinden und die Werte per FHEM2FHEM übertragen ?
Gruß Christoph
Hallo Bennemannc,
wie und mit was ich messe, habe ich mal in einem meiner ersten Beiträge an Dich geschrieben (04 Dezember 2014, 19:43:58):
ZitatIch habe den Werdegang übrigens einmal hier: http://www.forum-raspberrypi.de/Thread-haussteuerung-heizoel-tankstand-oder-verbrauchs-fernablesung-mit-raspi?pid=115200#pid115200 als HowTo beschrieben.
Ob, und wie man die Messsonde an FHEM anschließen kann, habe ich mich bisher nicht mit beschäftigt bzw. keine Vorlage gefunden. Auch mit FHEM2FHEM kenne ich mich nicht aus.
Die Logdatei wird durch einen RasPi ("HeizPi") im Heizungskeller erstellt und als Datei lokal gespeichert. Circa 5 Minuten nach der letzten Messung wird die Logdatei an meinen RasPi in der Wohnung ("Pi") per SFTP übertragen (kopiert).
Da ich den HeizPi im Heizungskeller mit WLAN an mein Hausnetz angeschlossen habe und der Weg dahin quer durch Betondecken und Mauerwände geht, ist der Empfang des öfteren gestört. Das WLAN ist bis in den Heizungskeller sehr instabil. Hängt offenbar auch mit Störungen durch Mobilfunker oder andere WLAN Netze zusammen, da abend häufiger als sonst gestört. Bei dem Ausfall einer Dateiübertragung der Lodatei aufgrund gestörtem WLAN wird dieser Ausfall bei einer der nächsten Übertragungen wieder wett gemacht, da immer die ganze Logdatei übertragen wird und so ausgefallene Messungen wieder kompensiert werden.
Mindestens einmal am Tag funktioniert jedoch die Übertragung bei einem 6 stündigem Abstand.
Gruß Bracew
Hallo ojb,
Volltreffer !!! Dein gebrochener Zeh ist Goldes Wert.
Ich habe zunächst das Python-Skript (ultrasonic.py) angepasst, das ab heute zusätzlich zum positiven Füllstand auch noch der negative Füllstand in die Logzeile dahinter gehängt wird, sowie die Bestandswerte per Hand angepasst:
2014-12-07_00:10:48 Entfernung: 33.6 cm Fuelhoehe: 128.2 cm Liter: 3846 l Liter-Neg.: -3846 l
2014-12-07_06:10:53 Entfernung: 33.4 cm Fuelhoehe: 128.4 cm Liter: 3852 l Liter-Neg.: -3852 l
2014-12-07_12:12:00 Entfernung: 33.9 cm Fuelhoehe: 127.9 cm Liter: 3837 l Liter-Neg.: -3837 l
2014-12-07_18:10:48 Entfernung: 33.9 cm Fuelhoehe: 127.9 cm Liter: 3836 l Liter-Neg.: -3836 l
2014-12-08_00:10:52 Entfernung: 33.8 cm Fuelhoehe: 128.0 cm Liter: 3840 l Liter-Neg.: -3840 l
2014-12-08_06:10:51 Entfernung: 34.3 cm Fuelhoehe: 127.5 cm Liter: 3824 l Liter-Neg.: -3824 l
2014-12-08_12:10:48 Entfernung: 34.2 cm Fuelhoehe: 127.6 cm Liter: 3829 l Liter-Neg.: -3829 l
2014-12-08_18:10:48 Entfernung: 35.2 cm Fuelhoehe: 126.6 cm Liter: 3798 l Liter-Neg.: -3798 l
Leider bin ich nicht so ein Zauberer in Shell-Programmierung wie Du (Wow! zu tac, uniq und sed. Und dann auch noch mit Parametern und verknüpft. Nochmal Wow!), deswegen ein wenig Handarbeit.
Den Heizoel.gplot File habe ich wie folgt angepasst (MIT delta-d):
############################
# Display the tank level.
# Bracew 2014-12-08 Heizoel.gplot
# <L1> .. <L3> Uebergabewerte aus fhem.cfg
#
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel "Heizoel"
set ytics
set y2tics
set title <L3>
set grid xtics y2tics
set ylabel <L1>
set y2label <L2>
set yrange [0:4500]
set y2range [0:75]
#FileLog 9::0:
#FileLog 12::0:delta-d
plot "<IN>" axes x1y1 title 'Tankfuellung' lw 1.5 ls l0 with lines,\
"<IN>" axes x1y2 title 'Verbrauch' lw 1.5 ls l1fill with bars
Im Heizoel.gplot File wird der Tages-Verbrauch über delta-d aus den nun zusätzlich vorhandenen negativen Füllständen gewonnen (Spalte 12)
Nun kommt ungefähr das raus, wie ich es mir vorgestellt habe (Siehe Plot File im Anhang).
Es scheint auch meiner Meinung nach ein Bug zu sein. Ich hatte zwischendurch auch einmal negative "set yrange [-200:200]" gesetzt, wobei jedoch auch nur Murks herrauskam
Nochmals vielen Dank Master ojb für den Tipp und Deine Hilfe
Gute Besserung und mit lieben Grüßen aus Nordhessen
Bracew
P.S.: Auch vielen Dank an Bennemannc :) , trotzdem sich Dein Weg als Holzweg herrausgestellt hat. Auch Du hast Dir viel Zeit für mich genommen.
Sorry ich hab nicht alles gelesen. Ich benutze den hourcounter um das bei meinem Gaszähler zu machen. Einfach im max Bereich schauen ist von John
Gesendet von meinem Smartphone
Hallo Bracew
Das ist ja der Hammer
Wärst du so lieb und die angepassten Scripts nochmals anzuhängen?
Vielen Dank
Gruss Grisu
Hallo Grisu,
Du hast Post (PM)
Hallo Bracew,
Wie liest du die Datei in FHEM ein?
Könnest du das noch Posten.
Danke
Kvo1
Hallo kvo1,
# #################################################################
# Definition für Heizöl Externe-Datei einzulesen
# Fake FileLog entry, to access the Heizoel.log from FHEMWEB
# #################################################################
#
define HeizoelFileLog FileLog ./log/Heizoel.log fakelog
attr HeizoelFileLog group Heizoelstand
attr HeizoelFileLog logtype heizoel:Window,text
attr HeizoelFileLog room Heizung
define PlotHeizoel SVG HeizoelFileLog:heizoel:CURRENT
attr PlotHeizoel group Heizoelstand
attr PlotHeizoel label " Füllstand Liter (l)"::"Verbrauch Liter (l)"::"Heizoel: Max=$data{max1} Liter, Letzter=$data{currval1} Liter"
attr PlotHeizoel room Heizung
Hallo,
ich bin gerade über etwas gestolpert - Berechnung der Regenmenge (für 24 h) aus einem Log. Schau mal, ob Du hier etwas verwenden kannst "http://forum.fhem.de/index.php/topic,13626.msg94761.html#msg94761"
Gruß Christoph
Hallo Leute,
erst mal @Bracew:
Danke , danke das freut mich natürlich. 'Master ojb' tut natürlich schon gut :) Da geht der Gockel-Kamm hoch :)
Aber so der Shell-Guru bin auch nicht, da gibt es ganz andere ...
@Bennemannc:
Danke für den Link. Ich denke tatsächlich, dass der beste Weg für solche Custom-Berechnungen über ein paar Routinen in der 99_myUtils geht. Was mir immer gefehlt hat war die Möglichkeit verschiedene Zeilen in den Logfiles miteinander zu verknüpfen.
Aber in dem Beispiel scheint das ja schön dargestellt zu sein. Ich werde mir das mal anschauen ...
Und Schritt für Schritt kommen wir weiter :)
Liebe Grüße
Oli
Hallo,
ich habe mir den nun ja ganz passabeln Plot für das ganze Jahr von FHEM erstellen lassen (Siehe Anlage Plot-5.jpg)
In dieser Darstellung erscheint er mir eher wie ein Häuflein Elend, so am Rande zusammengeballt.
Kennt jemand eine Möglichkeit, die Säulen mit dynamischer Breite erstellen zu lassen, so dass diese in der Breite entsprechend den Bedürfnissen in der Darstellung angepasst werden?
Gruß Bracew
Hi Bracew,
attr PlotHeizoel fixedrange xxxxx
xxxx steht für
day
week
month
year
gruss klaus
Oder z.B. "fixedrange 30days", dann werden die letzten 30 Tage dargestellt ...
Hallo,
nein, Ihr habt mich falsch verstanden. Schaut Euch bitte die Datei Plot-5.jpg an. Es hat nichts mit "fixedrange" zu tun.
Die grünen Säulen sind alle zu breit eingezeichnet. Eine Säule ist fast so breit wie ein Monat. In der Monats-, Wochen- oder Tagesansicht sind die Säulen immer gleich breit wie in der Jahresansicht. Die Säulen müssten in der Tagesansicht aber sehr breit sein, in der Wochenansicht schmaler, in der Monatsansicht noch schmaler und in der Jahresansicht sehr schmal, da die Säulen ja jedesmal einen Tag repräsentieren.
Ich meine, die Breite der Säulen müsste immer so breit sein wie ein Tag in der Ansicht breit ist, also dynamisch. Im Moment werden die Säulen aber immer gleich Breit vom Plot gezeichnet, also statisch, egal welche Ansicht gerade genutzt wird.
Gruß Bracew
Hallo Bracew,
Du hast Recht, habe das eben mal probiert. Sieht bei mir genauso aus.
Auch aufgefallen ist mir, dass die älteste Säule ganz links in die Achse gezeichnet wird.
Bug? Kann man da was im Plotfile optimieren?
Liebe Grüße
Oli
Hallo Bracew,
ich habe mir den Ultraschallsensor zugelegt und wie von Dir beschrieben an die GPIO-Ports des PPi gehängt. Nur leider bekomme ich immer nur einen Abstand von 0,2 cm. Hast Du soetwas schon mal beobachten können? Kann das ein Hardwaredefekt sein.
Danke und Gruß
Christoph
Hallo CQuadrat,
den Fall mit 0,2 cm hatte ich bisher nicht. Der Sensor misst zudem normalerweise erst ab ca. >30 cm genau.
Eine Ferndiagnose ohne weitere Info ist naturgemäß schwierig, zudem hier zum falschen Thema.
Schau eimal hier: http://forum.fhem.de/index.php/topic,28569.msg227057.html#msg227057. Dort hatten wir bereits einmal das Problem mit falschen Ohm Widerständen.
Ich würde Dir zunächst empfehlen nochmals pennibel genau alles, zunächst Hardware mit Anschlüssen und später Software, zu prüfen.
Gruß Bracew
Hallo an alle Plot-Spezialisten,
ich möchte hier nochmal die Frage aufwerfen:
Gibt es eine Möglichkeit die Breite der Säulen in Plots "with bars" mit dynamischer Breite erstellen zu lassen, so dass diese in der Breite entsprechend den Bedürfnissen in der Darstellung, also der dargestellten Tagesbreite, angepasst werden und nicht in allen (Tages-, Wochen-, Monats- und Jahres-) Darstellungen gleich breit gezeichnet werden ??
Gruß Bracew
Hallo Bracew
hast du das angepassten Scripts mit den Delta Werten irgendwo angehängt ?
Gruß
Henrik
Hallo Henne16,
schaust Du bei Beitrag Nr. 32 http://forum.fhem.de/index.php/topic,28891.msg228208.html#msg228208 (http://forum.fhem.de/index.php/topic,28891.msg228208.html#msg228208)
Dort findest Du das .gplot script.
ZitatDen Heizoel.gplot File habe ich wie folgt angepasst (MIT delta-d):
Gruß Bracew
Hallo Bracew,
ich meinte das Python-Skript (ultrasonic.py).
Gruss Henne16
Hallo Bracew,
ich hatte meine Daten für die Mail angepasst.
Wenn ich es mit Mail verwenden möchte, läuft das Skript nicht.
Damit muss ich mich nochmal auseinandersetzen.
(http://heizoelplot.png)
(http://heizoel.png)
Vielen Dank nochmals.
Grüße Henne16
Zitat von: Bracew am 08 Dezember 2014, 20:34:51
Hallo ojb,
Volltreffer !!! Dein gebrochener Zeh ist Goldes Wert.
Ich habe zunächst das Python-Skript (ultrasonic.py) angepasst, das ab heute zusätzlich zum positiven Füllstand auch noch der negative Füllstand in die Logzeile dahinter gehängt wird, sowie die Bestandswerte per Hand angepasst:
Ich muss das leider wieder raus holen. Nachdem ich da lange hingebastelt habe und versucht habe zu verstehen wie das mit den cronjobs geht läuft es nun.
Aber nun zur Frage. Kannst du uns den auch deine aktuelle ultrasonic.py zur Verfügung stellen?!
Hallo Tim,
mein aktuelles ultrasonic.py (Verbesserungen sind willkommen und nehme ich gerne auf!)
(etwas verspätet aufgrund Ferien):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#*****************************************************************************
#* Titel : ultrasonic.py V1.0 vom 28.10.2014 *
#* V1.1 vom 06.11.2014 *
#* V1.2 vom 29.05.2015 *
#* Zweck : Fuelstand in Heizoeltanks per Ultraschall messen und ausgeben *
#* System : Python 2.7.3 *
#* Raspbian 7.8 (Linux Debian 7.8) *
#* Raspberry Pi Modell B+ (512 MByte Hauptspeicher) *
#* Grundlage: http://www.gtkdb.de/index_36_2272.html *
#*****************************************************************************
#*****************************************************************************
#* import-Bereich *
#*****************************************************************************
# import required modules (aus Standardbibliotheken)
import time
import datetime
import RPi.GPIO as GPIO # Fuer Zugriff auf die GPIO (General Purpose Input Output Schnittstelle)
from math import fabs # Fuer Berechnung absoluter Zahlen (Nur Positive, keine Negativen Zahlen)
import smtplib # Fuer E-Mail bei Unterschreitung mindest Tank-Inhalt
from scipy import stats # Fuer Berechnung GestutztesMittel (stats.trim_mean)
import statistics # Fuer Berechnung Median-Wert (statistics.median)
import numpy # Fuer Berechnung gerundete Array-Werte (numpy.around)
#*****************************************************************************
#* Definitions-Bereich von Konstanten, Variablen, Datentypen *
#*****************************************************************************
# define GPIO pins
GPIOTrigger = 18
GPIOEcho = 17
# define globale KONSTANTEN
MESSGRENZE = 0.2 # 20% -> Zulaessige Abweichung zweier Messungen
WARTEZEIT = 0.075 # Wartezeit vor einer Messung
AnzMessungen = 400 # Anzahl der Einzelmessungen zur Mittelwertbildung
MaxTankLiter = 4500 # Gesamtfuellmenge des Oeltanks
MinTankLiter = 1200 # Untere Fuellmengengrenze fuer Warnung per E-Mail
SensorOffset = 11.8 # Abstand vom Sensor zur maximalen Fuelmenge in cm
MaxFuellHoehe = 150 # Tankhoehe in cm von LEER bis VOLL
TM_Grenzwert = 0.30 # Trim x% at both ends
# Mittelwerte der Datengruppe ohne x% Randwerte
# entspricht der Excel Funktion GestutztMittel
# define global variable
ZaehlerAnzMess = 0 # Debug-Variable zaehlen Anzahl reale Messungen
#*****************************************************************************
#* Unterprogramme *
#*****************************************************************************
# ###################################################################
# Start - function to measure the distance
# ###################################################################
def MeasureDistance():
global ZaehlerAnzMess
# set trigger to high
time.sleep(WARTEZEIT)
GPIO.output(GPIOTrigger, True)
# set trigger after 10µs = 0.01ms to low
time.sleep(10/(1000*1000))
GPIO.output(GPIOTrigger, False)
# store initial start time
StartTime = time.time()
# store start time
while GPIO.input(GPIOEcho) == 0:
StartTime = time.time()
# store stop time
while GPIO.input(GPIOEcho) == 1:
StopTime = time.time()
# calculate distance
TimeElapsed = StopTime - StartTime
Distance = (TimeElapsed * 34000) / 2
ZaehlerAnzMess = ZaehlerAnzMess + 1 # Debug-Variable
# print (ZaehlerAnzMess, StartTime, StopTime, TimeElapsed, Distance) # Debug-Print
return Distance
# End - function to measure the distance
# ###################################################################
# Start - Funktion um unzulässige Messwerte auszusortieren (1. Stufe)
# ###################################################################
def MesswertMeta():
MessDifferenz = 1
while MessDifferenz > MESSGRENZE:
Messwert1 = MeasureDistance()
Messwert2 = MeasureDistance()
MessDifferenz = fabs(Messwert1 - Messwert2)
Mittelwert = (Messwert1 + Messwert2) / 2
return Mittelwert
# End - Funktion um unzulässige Messwerte auszusortieren
# ###################################################################
# Start - Funktion um unzulässige Messwerte auszusortieren (2. Stufe)
# ###################################################################
def Messwert():
MessDifferenz = 1
while MessDifferenz > MESSGRENZE:
Messwert1 = MesswertMeta()
Messwert2 = MesswertMeta()
MessDifferenz = fabs(Messwert1 - Messwert2)
Mittelwert = (Messwert1 + Messwert2) / 2
return Mittelwert
# End - Funktion um unzulässige Messwerte auszusortieren
# ###################################################################
# Start - main function
# ###################################################################
def main():
# Lokale Definition Variablen und Vorbelegung mit Anfangswerten
i = 1 # Zaehler fuer Schleife
Distance_sum = 0 # Summierter Wert der gueltigen Messungen
Messung = [ 0 for x in xrange(AnzMessungen+1) ] # Array der gueltigen Einzelmessungen
# Erste Messungen fuer den Muelleimer
Messung[0] = Messwert()
# AnzMessungen messen und aufaddieren
for i in range(1,AnzMessungen+1):
Messung[i] = Messwert()
Distance_sum = Distance_sum + Messung[i]
# print ("Messung[%.0f" %i),("]: %.3f cm" % Messung[i]) # Debug-Print
i = i + 1
# Statistische Berechnungen:
# Die folgenden drei Masse der zentralen Tendenz sind am gebraeuchlichsten:
#
# Mittelwert:
# ist das arithmetische Mittel der Verteilung. Es wird berechnet, indem eine Gruppe von Zahlen addiert
# und anschliessend durch deren Anzahl dividiert wird.
# Beispielsweise ist der Mittelwert von 2, 3, 3, 5, 7 und 10 der Wert 30 dividiert durch 6, mit dem Ergebnis 5.
#
# Median:
# ist der Wert in der Mitte einer Zahlengruppe. Das heisst, dass die Werte einer Haelfte der Zahlen groesser
# als der Median und die Werte einer Haelfte der Zahlen niedriger als der Median sind.
# Der Median von 2, 3, 3, 5, 7 und 10 z. B. lautet 4.
#
# Modalwert:
# ist die am haeufigsten vorkommende Zahl in einer Zahlengruppe.
# Der Modalwert von 2, 3, 3, 5, 7 und 10 z. B. lautet 3.
#
# Bei einer symmetrischen Verteilung einer Zahlengruppe sind diese drei Masse der zentralen Tendenz identisch.
# Bei einer schiefen Verteilung einer Zahlengruppe koennen die Masse abweichen.
#
# Mittelwert bilden und auf zwei Nachkommastellen runden
MaxWert = max(Messung) # Groester Wert der gueltigen Messungen
MinWert = min(Messung) # Kleinster Wert der gueltigen Messungen
MittelWert = (Distance_sum / AnzMessungen) # Eigene Berechnung normaler Mittelwert
MedianWert = statistics.median(Messung) # Median-Wert aus Statistik-Paket
ModalWert = 0 #statistics.mode(numpy.around(Messung, 3)) # Modal-Wert aus Statistik-Paket (Funktioniert nicht immer!!!)
TrimMeanWert = stats.trim_mean(Messung, TM_Grenzwert) # Trim x% at both ends
# Gewollten Wert aussuchen und auf zwei Nachkommastellen runden
Abstand = round(TrimMeanWert, 2)
# Fuellstand und Inhalt berechnen
Fuelstand = (MaxFuellHoehe + SensorOffset) - Abstand
Liter = MaxTankLiter / MaxFuellHoehe * Fuelstand
# Zeitstempel, Entfernung, Fuellhoehe und Inhalt in Litern ausgeben
Zeit = time.time()
ZeitStempel = datetime.datetime.fromtimestamp(Zeit).strftime('%Y-%m-%d_%H:%M:%S')
print (ZeitStempel),("Entfernung: %.1f cm" % Abstand),(" Fuelhoehe: %.1f cm" % Fuelstand),(" Liter: %.0f l" % Liter), (" Liter-Neg.: -%.0f l" % Liter)
# print ("Max: %.3f cm" % MaxWert), (" Min: %.3f cm" % MinWert), (" Mittel: %.3f cm" % MittelWert), ("Median: %.3f cm" % MedianWert), ("Modal: %.3f cm" % ModalWert), ("TM_50: %.3f cm" % TrimMeanWert) # Debug-Print
# E-Mail versenden, wenn Mindest-Tankinhalt (MinTankLiter) unterschritten
if Liter < MinTankLiter:
gmail_Text = " Entfernung: %.1f cm" % Abstand + " Fuelhoehe: %.1f cm" % Fuelstand + " Liter: %.0f l" % Liter
to = 'EmpfaengerDerMail@EmailAdresse.de'
gmail_user = 'MeinKontoBei@MeinemEmailProvider.de'
gmail_pwd = 'MeinGeheimesPasswort'
smtpserver = smtplib.SMTP("smtp.MeinemEMailProvider.de",587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo() # extra characters to permit edit
smtpserver.login(gmail_user, gmail_pwd)
header = 'To:' + to + '\n' + 'From: ' + gmail_user + '\n' + 'Subject: HeizPi Alarm, Mindesttankinhalt unterschritten \n'
msg = header + '\n ' + ZeitStempel + gmail_Text + ' \n\n'
smtpserver.sendmail(gmail_user, to, msg)
smtpserver.close()
time.sleep(0.1)
GPIO.cleanup()
# End main function
# ###################################################################
#*****************************************************************************
#* Hauptprogramm *
#*****************************************************************************
if __name__ == '__main__':
# set GPIO disable warnings
GPIO.setwarnings(False)
# use GPIO pin numbering convention
GPIO.setmode(GPIO.BCM)
# set up GPIO pins
GPIO.setup(GPIOTrigger, GPIO.OUT)
GPIO.setup(GPIOEcho, GPIO.IN)
# set trigger to false
GPIO.output(GPIOTrigger, False)
# call main function
main()
#*****************************************************************************
#* E N D E u l t r a s o n i c . p y *
#*****************************************************************************
P.S., unter:
http://www.forum-raspberrypi.de/Thread-haussteuerung-heizoel-tankstand-oder-verbrauchs-fernablesung-mit-raspi-geloest-beitrag-21?pid=147070#pid147070 (http://www.forum-raspberrypi.de/Thread-haussteuerung-heizoel-tankstand-oder-verbrauchs-fernablesung-mit-raspi-geloest-beitrag-21?pid=147070#pid147070)
hat es auch noch ein Script von jemand anderem.
Mit lieben Grüßen
Bracew
Hallo Bracew,
ich habe mit Deinem Script eine Fehlermeldung.
pi@HeizPi ~ $ sudo ./ultrasonic.py
Traceback (most recent call last):
File "./ultrasonic.py", line 25, in <module>
from scipy import stats # Fuer Berechnung GestutztesMittel (stats.trim_mean)
ImportError: No module named scipy
Es findet das Module scipy nicht.
Weisst Du, was das bedeutet.
ZEN
Hallo ZEN,
versuchs nochmal nach "sudo apt-get install python-scipy".
Gruß Bracew
Hi Bracew,
danke für die prompte Hilfe, scripy habe ich installiert.
Jetzt kommt:
pi@HeizPi ~ $ sudo ./ultrasonic.py
Traceback (most recent call last):
File "./ultrasonic.py", line 26, in <module>
import statistics # Fuer Berechnung Median-Wert (statistics.median)
ImportError: No module named statistics
Er findet das Modul nicht.
Kann Du helfen?
Gruß
ZEN
Hi ZEN,
Tante Google führt zum Beispiel zu:
http://stackoverflow.com/questions/27582551/python-importerror-no-module-named-statistics-after-downloading
oder:
https://www.raspberrypi.org/forums/viewtopic.php?f=32&t=94333
Zitatsudo apt-get update
sudo apt-get install python-pip
sudo pip install statistics
Gruß Bracew
P.S. Auch Du kannst Tante Google befragen, glaub mir!
Erstmal vielen Dank für deine PY!!
Kannst du mir ein Tipp geben warum ich in einer Endlosschleife lande? Die ich nur mit strg +c beenden kann? (Onkel Google konnte mir nicht weiter fehlen ;-) )
Hallo Tim,
sollte keine "Endlosschleife" sein, sondern nur 400 Durchgänge ("AnzMessungen = 400 # Anzahl der Einzelmessungen zur Mittelwertbildung") mit je ca. 5-8 Messungen. Nach einigen Minuten ist fertig.
Du kannst die "Debug-Print"-Gartenzäune (#) entfernen um den Fortgang am Monitor zu beobachten.
Gruß Bracew
Hi Bracew,
ich wollte Dir, auch wenn verspätet erst mal für Deine Bemühungen danken.
Es ist für einen Newbie schwierig die Zusammenhänge zu verstehen und die Fehlermeldungen zu deuten. Auch wenn das große "Orakel" Google vieles weiss, ist es nicht einfach den richtigen Kontext daraus zu ziehen.
Mit meinem Hardwareaufbau bin ich schon sehr weit, leider fehlt im Moment die Zeit, den Sensor zu befestigen bzw Strom zu legen.
Was auf jeden Fall klappt, ist Dein Script für Fhem inkl der Gplot.
Mein Bitte, könntest Du mir Deine Heizoel.log zur Verfügung stellen, so kann ich Online auf das FHEM zugreifen und weitere Funktionalitäten prüfen, ob wirklich alles so geht wie es sein sollte.
Gruß
ZEN
Hallo ZEN,
Du hast PN-Post!
Gruß Bracew
Hallo,
vor einiger Zeit bin ich auf diesen Artikel gestoßen und habe ihn mit viel Interesse verfolgt. Vielen Dank für die viele Arbeit die hier drin steckt.
Nun habe ich mir alle Teile Bestellt und bis auf den Sensor ist auch alles angekommen.
Also versuche ich mal alles vorzubereiten damit es sofort los gehen kann wenn der Sensor dann endlich ankommt. Schon mal da 9 Tage nach der angekündigten Lieferung des Ultraschallsensors das neue Heizöl kommt.
Ich eine tolle Möglichkeit zu sehen ob das ganze Gebilde nicht nur funktioniert sondern auch richtig misst.
Ich habe aktuell zwei Probleme bei denen ich mir nicht wirklich sicher bin ob das wirklich Fehler sind oder ob das ganze daran liegt das der Aufbau noch nicht komplett ist.
Da ist zum einen das Script "ultrasonic.py" (letzte Version) Das Script macht gar nichts bis der Abbruch durch User kommt. Ich nehme mal dánn das das auch richtig ist da ja auch ohne Sensor keine Werte vorhanden sein können.
Das zweite Problem ist das Script LogAnPiSenden.tcl. Dieses Script kann ich nicht an der Konsole aufrufen. Ist das wirklich richtig? mit sudo LogAnPiSenden.tcl müsste man dieses Script doch eigentlich testen können. Oder?
Hat jemand einen Tip?
Hallo bobby1000,
Du bist hier eigentlich nur in einem "Nebenschauplatz" zur Plotdarstellung gelandet. Das Hauptthema "Heizöl-Tankstand-(oder Verbrauchs) Fernablesung mit RasPi" kannst Du unter:
http://www.forum-raspberrypi.de/Thread-haussteuerung-heizoel-tankstand-oder-verbrauchs-fernablesung-mit-raspi-geloest-beitrag-21
nachlesen.
Dort wird Dir auch erklärt, dass LogAnPiSenden.tcl eigentlich nur eine beliebige Datei (hier jedoch die, welche die Messwerte beinhaltet) von einem RasPi im hausinternen Netz zu einem anderen RasPi sendet. Falls es keine entsprechende Datei gibt meldet sich das Script dazu.
Ich habe Dir das hier einmal nachgestellt und meine Logdatei testweise gelöscht.
root@HeizPi:/home/HeizPi# ./LogAnPiSenden.tcl
spawn sftp -oPort=22 bracew@192.168.0.20
bravew@192.168.0.20's password:
Connected to 192.168.0.20.
sftp> cd /opt/fhem/log/
cd /opt/fhem/log/
sftp> lcd /home/HeizPi/
lcd /home/HeizPi/
sftp> put Heizoel-Herth.log Heizoel-Herth.log
stat Heizoel-Herth.log: No such file or directory
***Error transfering file(Heizoel-Herth.log) to: 192.168.0.20).
Du siehst die Fehlermeldung: "***Error transfe..."
Gruß Bracew
P.S.: Nicht jeder benötigt zwei RasPi. Dies ist nicht zwingend nötig. Man kann auch Messung und Auswertung auf ein- und denselben RasPi machen, wenn man möchte. Ich habe die Funktionen für mich so getrennt, weil ich es so wollte (Messung im Keller durch HeizPi und Auswertung auf FHEM-RasPi im Büro)
Hallo Bracew,
Sorry, das ich hier im Nebentread gelandet bin. Habe ich mich verirrt.
Bei mir ist die selbe Kobstellation wie bei dir. FHEM auf der ersten Etage und den Tank im Keller. deshalb habe ich mich auch an dein Beispiel gehalten.
Meinen Fehler habe ich auch erkannt.
pi@HeizungsPi /home/HeizPi $ sudo ./LogAnPiSenden.tcl
funktioniert.
pi@HeizungsPi /home/HeizPi $ sudo LogAnPiSenden.tcl
sudo: LogAnPiSenden.tcl: command not found
war mein Aufruf und da bekam ich nur einen Fehler.
Vielen Dank für die schnelle Hilfe.
Hallo Bracew,
eine Frage zu Deinen beiden Scripten aus dem fhem.cfg und der heizoel.gplot.
Er zeigt mir Wunderbar die Statistiken vom Verbrauch und die Restmenge an, aber wenn ich im Plot vom Heizölstand auf Window klicke erhalte ich diese Fehlermeldung:
XML-Verarbeitungsfehler: Nicht übereinstimmendes Tag. Erwartet: </L1>.
Adresse: http://x.x.x.x:8083/fhem/SVG_showLog&dev=HeizoelFileLog&logdev=HeizoelFileLog&gplotfile=heizoel&logfile=Heizoel.log&pos=
Zeile Nr. 113, Spalte 93:<text x="12" y="80" text-anchor="middle" class="ylabel" transform="rotate(270,12,80)"><L1></text>
Ist der Fehler bei mir oder hast Du den auch?
Ach ja, danke für Deine Heizölmessstände.
Gruß
ZEN
Hallo Bracew,
ich habe dir mal in dem anderen Forum geschrieben, da es hier nicht hinpasst.
Wenn du mal Zeit hast, wäre ich dir um eine Antwort dankbar.