Moin!
Irgendwie stehe ich auf dem Schlauch... Ich habe einen Zwischenzähler, der alle x Sekunden (x kann auch kleiner als 1 s sein) einen Impuls ausgibt. Die Impulse entsprechen dem Verbrauch von einem Watt (1000Impluse pro kW). Ich würde gern den Verbrauch in Watt auf der y-Achse angezeigt bekommen. Ich benutze u.a. den Hourcounter, der viele Werte ausgibt. Wer kann mir einen Tip geben, wie ich eine nette Verlaufskurve hinbekomme?
Thomas
Hallo Thomas,
Zähler zählen aber typischerweise kWh, bist Du sicher mit 1000Impluse pro kW sind es nicht 1000Impluse pro kWh?
Dann entspricht 1 Impuls 1 Wh.
In dem Fall müsstest du die Zeit zwischen zwei Impulsen messen um die Momentanleistung zu berechnen.
Ich mache das mit Arducounter.
Gruß Otto
Moin,
Ich mach das mit einem at und einem dummy der die Verbrauchswerte als reading hat:
Der Zähler ist über das OBIS Modul angebunden und liefert schon Wh.
Kannst du also einfach auf deinen Zähler anpassen.
defmod Verbrauch_Tag at *00:00:01 {\
\
# TAGESVERBRAUCH PELLETS\
my $wert1=ReadingsVal("ETA_Vorrat_1_Silo","Silo_Vorrat","--");; # einlesen Silo-Vorrat\
my $wert2=ReadingsVal("ETA_Vorrat_2_Kessel","Vorrat_2_Kessel","--");; # einlesen Kessel-Vorrat\
my $wert3=ReadingsVal("Verbrauch","Pelletslager","--");; # einlesen Bestand Vortag\
my $wert4=ReadingsVal("Energiekosten","Pelletspreis","--");; # einlesen Pelletpreis\
my $wert5=$wert1+$wert2;; # berechnen Gesamt-Vorrat \
my $wert6=$wert3-$wert5;; # berechnen Tagesverbrauch (Bestand Vortag minus Gesamt-Vorrat)\
my $wert7=($wert4/1000)*$wert6;; # berechnen Tageskosten (Verbrauch mal Kilo-Preis)\
my $wert8=round($wert7,2);; # runden der Tagskosten auf cent\
fhem("setreading Verbrauch Pelletslager $wert5");; # setzen neuer Bestand\
fhem("setreading Verbrauch Pelletsverbrauch $wert6");; # setzen Tagesverbrauch\
fhem("setreading Energiekosten PelletsKostenTag $wert8");; # setzen Tageskosten\
\
# TAGESVERBRAUCH STROM GESAMT\
my $wert9=ReadingsVal("Stromzaehler","total_consumption","--");; # einlesen Zählerstand\
my $wert10=$wert9/1000;; # umrechnen Zählerstand Wh zu KWh\
my $wert11=ReadingsVal("Verbrauch","Stromzaehler","--");; # einlesen Zählerstand Vortag\
my $wert12=ReadingsVal("Energiekosten","Strompreis","--");; # einlesen Strompreis\
my $wert13=$wert10-$wert11;; # berechnen Tagesverbrauch\
my $wert14=round($wert13,1);; # runden Tagesverbrauch auf eine Stelle nach Komma\
my $wert15=$wert13*$wert12;; # berechnen Tageskosten\
my $wert16=round($wert15,2);; # runden Tageskosten auf cent\
fhem("setreading Verbrauch Stromzaehler $wert10");; # setzen KWh Zählerstand\
fhem("setreading Verbrauch Stromverbrauch $wert14");; # setzen Tagesverbrauch gerundet\
fhem("setreading Energiekosten StromKostenTag $wert16");; # setzen Tageskosten gerundet\
WriteStatefile()\
}
Der dummy:
defmod Verbrauch dummy
defmod Verbrauch dummy
attr Verbrauch DbLogExclude state
attr Verbrauch group Energie
attr Verbrauch readingList Aussentemp_avg_day Pelletslager Pelletslager1ter PelletslagerMo Pelletslager Pelletsverbrauch PelletsverbrauchMonat PelletsverbrauchWoche Stromverbrauch StromverbrauchMonat StromverbrauchWoche Stromzaehler Stromzaehler1ter StromzaehlerMo
Hab das gleiche noch für Woche und Monat laufen.
Funktioniert seit Ewigkeit tadellos.
Will es nur mal noch in die myUtils_99.pm auslagern zur Übersichtlichkeit.
Das at rechnet auch gleich noch die Kosten aus und schreibt es in einen anderen dummy.
Grüße
Frank
@ Otto: Danke, das "h" fehlte mir - irgendwie werde ich alt...
Arducounter.
Kenne ich noch nicht. Modul in FHEM? Dann finde ich es.
@ Frank: schaue ich mir nachher genauer an.
Thomas
So, ich habe jetzt ein wenig gesucht. Also, ein arducounter ist offensichtlich eine Hardware. Weitere Hardware möchte ich nicht, mein Pi3 bekommt den Impuls bereits rein.
In dem Fall müsstest du die Zeit zwischen zwei Impulsen messen um die Momentanleistung zu berechnen.
Ja, aber wie umrechnen? Ich habe folgendes zur Verfügung:
Reading Beschreibung
clearDate Datum, zu dem alle kumulativen Readings über set .. clear gelöscht wurden
countsOverall Absolutzähler für das Auftreten des ON-Ereignisses
countsPerDay Tageszähler für das Auftreten des ON-Ereignisses
pauseTimeIncrement Zeitdauer der Pausen-Phase in Sekunden ; wird zyklisch aktualisiert
pauseTimeEdge Zeitdauer der letzten komplettierten Pausen-Phase
pauseTimeOverall Zeitdauer in Sekunden über alle aufgetretenen Pause-Phasen
pauseTimePerDay Zeitdauer in Sekunden über alle aufgetretenen Pause-Phasen des akt. Tages
pulseTimeIncrement Zeitdauer der Puls-Phase in Sekunden ; wird zyklisch aktualisiert
pulseTimeEdge Zeitdauer der letzten komplettierten Pulse-Phase
pulseTimeOverall Zeitdauer in Sekunden über alle aufgetretenen Puls-Phasen
pulseTimePerDay Zeitdauer in Sekunden über alle aufgetretenen Puls-Phasen des akt. Tages
value Aktueller Schaltzustand gemäss ON/OFF Ereignis,
mit 1=letztes Ereignis war ON-Ereignis
und 0=letztes Ereignis war OFF-Ereignis
tickUpdated Event wird gefeuert, wenn die operativen Readings beschrieben worden sind (nicht unbedingt gändert)
tickChanged Event wird nach Änderung von value gefeuert
tickDay Event wird nach Tageswechsel gefeuert bevor die Tageszähler resettiert werden
tickHour Event wird nach Stundenwechsel gefeuert
tickWeek Event wird nach Wochenwechsel gefeuert
tickMonth Event wird nach Monatswechsel gefeuert
tickYear Event wird nach Jahreswechsel gefeuert
forceHourChange simuliert einen Stundenwechsel
forceDayChange simuliert einen Tageswechsel
forceWeekChange simuliert einen Wochenwechsel
forceMonthChange simuliert einen Monatswechsel
forceYearChange simuliert einen Jahreswechsel
Mit "pauseTimeIncrement" habe ich also eine Zeit zwischen zwei Impulsen, die 1 Watt repräsentiert. Nur wie bekomme ich die jetzt im SVG angezeigt? So als SVG-Kurve "Watt pro Minute"?
@Frank: Das mit dem OBIS ist mir genausofremd, da mein Zähler keinen Text, sondern Impulse rausgibt. Ich habe mir deinen "Tagesverbrauch Strom" angesehen, und ich verstehe zwar die grundsätzliche Syntax, weiss aber nicht womit ich da was anfangen kann. Weil mir folgendes noch nicht bekannt ist: Die Nutzung von "my", warum du den Rückstrich am Zeilenende hast, obwohl die Zeile offensichtlich ein Kommentar ist, warum du in dem Textblock soviel rumrechnest (bzw. was mir das helfen könnte) und wie du dann das Rechenergebnis in ein SVG bekommst.
Thomas
Arducounter ist ein Modul und ein Arduino nano der autark (unabhängig von FHEM und dem Pi) Impulse zählt. Dein Pi wird immer mal was vergessen ...
Aber egal.
Ich denke Du liegst falsch, die Zeit zwischen zwei Impulsen entspricht der Arbeit von 1 Wh und nicht der Leistung von 1 W.
Als Überlegungsansatz:
Wenn Du momentan 1 kW angeschlossen hast und das für eine Stunde, dann hast Du 1 kWh verbraucht und 1000 Impulse erzeugt.
Also 1000 Impulse in 3600 sec - die Zeit von 3,6 sec entspricht also 1000 Watt momentaner Leistung.
7,2 s entsprechen 500 Watt usw.
1,8 s entsprechen 2000 Watt.
Gruß Otto
Kurz vor Tatort-Schauen: 1000 Impulse pro kWh, nicht 10.000...
Thomas
ok habs korrigiert - ich hatte ein 0 zuviel auf dem Auge ;D
Oder ich wollte sehen ob Du bei mir bleibst - in Gedanken ;D
Zitat von: Thomas24568 am 02 April 2018, 19:15:30
@Frank: Das mit dem OBIS ist mir genausofremd, da mein Zähler keinen Text, sondern Impulse rausgibt. Ich habe mir deinen "Tagesverbrauch Strom" angesehen, und ich verstehe zwar die grundsätzliche Syntax, weiss aber nicht womit ich da was anfangen kann. Weil mir folgendes noch nicht bekannt ist: Die Nutzung von "my", warum du den Rückstrich am Zeilenende hast, obwohl die Zeile offensichtlich ein Kommentar ist, warum du in dem Textblock soviel rumrechnest (bzw. was mir das helfen könnte) und wie du dann das Rechenergebnis in ein SVG bekommst.
Nabend,
OBIS ist ein Modulk das digitale Zähler ausliest. Na dein Zähler gibt einen Impuls pro Wh.
Du musst also nur mitzählen.
Beispiel:
Stand 01.04.2018 00:00:01 --> 10000 Wh
Stand 02.04.2018 00:00:01 --> 20000 Wh
Macht einen Verbrauch von 10000 Wh --> 10KWh am 01.04.2018.
Da der Zähler ja nur den Momentanstand hat musst den Zwischenstand Mitternacht (oder Wochen/Monatsanfang) zwischenspeichern.
Genau das macht der Code.
ist ja auch pro Zeile ein Kommentar drin. sollte selbsterklärend sein.
das my "..." sind Variablen die eingelesen und genutzt werden. Hab ich mir auch nur vor langem kopiert und ausgebaut.
Der "\" am Zeilenende ist der Zeilenumbruch. sonst müsste ja alles in einer Zeile stehen.
Kommentar ist immer nur alles hinter der Raute (auf Neudeutsch Hashtag)
Wenn die Tagesverbräuche mal geloggt sind ist das SVG ein Kinderspiel, aber erstmal musst ja den Tagesverbrauch ermitteln.
SVG Device:
defmod Plot_Verbrauch_Monat_Strom_gesamt SVG logdb:A_Plot_Verbrauch_Monat_Strom-gesamt:HISTORY
attr Plot_Verbrauch_Monat_Strom_gesamt captionPos left
attr Plot_Verbrauch_Monat_Strom_gesamt endPlotNow 1
attr Plot_Verbrauch_Monat_Strom_gesamt endPlotToday 1
attr Plot_Verbrauch_Monat_Strom_gesamt fixedrange month
attr Plot_Verbrauch_Monat_Strom_gesamt label "Tagesverbrauch Strom gestern: $data{currval1} KWh, Durchschnitt: $data{avg1} KWh"
attr Plot_Verbrauch_Monat_Strom_gesamt plotsize 900,150
gplot Datei:
# Created by FHEM/98_SVG.pm, 2017-09-14 13:33:24
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<L1>'
set ytics
set y2tics
set grid y2tics
set ylabel "KWh"
set y2label "KWh"
set yrange [0:]
set y2range [0:]
#logdb Verbrauch:Stromverbrauch::
plot "<IN>" using 1:2 axes x1y2 title 'Stromverbrauch' ls l0fill_stripe lw 2 with ibars
sieht dann so aus wie im Anhang.
Grüße
Frank
btw: Ich würde Otto zustimmen und das eigentliche zählen extern machen.
Sonst hast Du aussetzer bei jedem FHEM Neustart, Raspberry reboot oder falls alleine ein FHEM Prozess blocking läuft.
so nen kleiner Arduino am USB schadet da nicht. kost auch fast nix. reicht ja auch nen Nano z.B.
Danke für die Antworten, ich bin morgen wieder an der Sache dran.
Thomas