FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: themaddin am 27 September 2013, 12:59:24

Titel: Gasverbrauch loggen
Beitrag von: themaddin am 27 September 2013, 12:59:24
Hallo,

ich möchte meinen Gasverbrauch erfassen. Ursprünglich wollte ich das mit dem Projekt Volkszaehler.org realisieren. Würde das ganze jetzt gerne direkt mit FHEM machen. Am Gaszähler wird ein Reedkontakt angeschlossen. Dieser wird über ein AVR NET-IO von Pollin ausgewertet, welches wiederrum für jeden Impuls einen HTTP-Request erzeugt. Ein Impuls entspricht 0,01m³. Gibt es in FHEM die Möglichkeit, die HTTP-Requests zu zählen und diesen Wert in m³ umzurechnen?

Gruß Martin
Titel: Aw: Gasverbrauch loggen
Beitrag von: fiedel am 27 September 2013, 13:44:51
Hi Martin,

ich weiß nicht wie die Requests in fhem auflaufen, aber theoretisch kannst du es so machen: Einen Dummy definieren in dessen Wert du die Impulse aufaddierst. Dann mit einem "userreadings" alle 5 Min. den Wert des Dummy auslesen und dabei in kwh oder m³ umrechnen. Suche mal im Forum nach OWDevice und OW_Counter. Da findest du Beispiele zu den "userreadings". Die Abfrage kannst du per "at" lösen, welches alle 5 Min. den Wert des Dummy ausliest oder in einen zweiten Dummy kopiert.

Gruß

Frank
Titel: Aw: Gasverbrauch loggen
Beitrag von: themaddin am 27 September 2013, 21:19:51
Hallo Frank,

gibt es denn bei einem Dummy die Möglichkeit Aktionen auszuführen über den Aufruf einer URL ?

Gruß Martin
Titel: Aw: Gasverbrauch loggen
Beitrag von: themaddin am 28 September 2013, 01:02:01
Ich kann schonmal zählen :-)
Ich habe einen Dummy MyCnt angelegt, beim Triggern wird dieser um eins erhöht.


define MyCnt dummy
set MyCnt 0
define MyCntEvent notify MyCnt {my $cnt = Value("MyCnt") + 1;;\fhem("set MyCnt $cnt");;}


Jeder Aufruf von
http://<FHEM_SERVER_IP>:8083/fhem?cmd=trigger+MyCnt
erhöht MyCnt um eins.

Gruß Martin
Titel: Aw: Gasverbrauch loggen
Beitrag von: fiedel am 28 September 2013, 09:52:14
Sehr schön!

Habe mal etwas weiter gebastelt, Erklärungen und Fortsetzung aus Zeitgründen später... ;o)



# Energieberechnung mit hochzählendem Dummy:

# Dummy für Tagesdifferenz
define Dum_DifGas_D dummy

# Dummy für Tageswert
define Dum_DayGas_D dummy

# Zählerdummy
define MyCnt dummy
set MyCnt 0

# Berechnungsdummy (sollte so funktionieren wie OW_Counter)
# "display" in "attr global userattr..." eintragen!

define MyCnt_a dummy
attr MyCnt_a offset 10.123
attr MyCnt_a stateFormat { sprintf("%.3f m³", ReadingsVal("MyCnt_a","display","m³"));; }
attr MyCnt_a userReadings display {Value("MyCnt_a")/100.0+AttrVal("MyCnt_a","offset",0);;}, consumption_gas differential {Value("MyCnt_a")*3600*0.01;;}, daily_gas {ReadingsVal("MyCnt_a","display",0)-Value("Dum_DifGas_D");;}

# Zälerdummy wird bei Event um 1 erhöht
define MyCntEvent notify MyCnt {my $cnt = Value("MyCnt") + 1;;\fhem("set MyCnt $cnt");;}

# Berechnungsdummy wird alle 5 min auf Wert des Zälerdummy aktualisiert (zum Test hier alle 30 Sek.)
define MyCntCalc at +*00:00:30 {my $calc = Value("MyCnt");;fhem("set MyCnt_a $calc");;}

# Berechnung Energieverbrauch Tag gesamt
define Func_Daily_Energy_A at *23:50:00 {prg_Daily_Stat()}

# Logfile:

define Log_Gas_M FileLog /media/sd/fhem/log/MyCnt_a-%Y-%m.log MyCnt_a:display.*|MyCnt_a:consumption_gas.*|MyCnt_a:daily_gas.*
attr Log_Gas_M logtype gasverbrauch:Plot, text



In die 99_myUtils.pm stecken:


#### Energie Tagesverbräuche berechnen
sub
prg_Daily_Stat()
 {
 #
 # Zunächst Tagesverbrauch (aktueller Wert - Wert von gestern) berechnen
   $data{DGval} = ReadingsVal("MyCnt_a","display",0) - Value("Dum_DifGas_D");
 # Tagesverbrauch in DailyGas speichern
   fhem ("set Dum_DayGas_D $data{DGval}");
 # Aktuellen Wert in Daily_Power_Diff speichern (entspricht Zählerstand am Tagesende)
   $data{DGval} = ReadingsVal("MyCnt_a","display",0);
   fhem ("set Dum_DifGas_D $data{DGval}");
   fhem("save");
}
#




Plot:



# Created by FHEMWEB, 2013-05-16 21:45:00
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 'Gasverbrauch Tag'
set ytics
set y2tics
set grid ytics
set ylabel "Momentan m³"
set y2label "Summiert m³"

#FileLog 4:MyCnt_a.consumption_gas\x3a::
#FileLog 4:MyCnt_a.daily_gas\x3a::


plot "<IN>" using 1:2 axes x1y1 title 'Momentan m³' ls l2fill lw 0.5 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Summiert m³' ls l1 lw 1 with lines,\



Alle Angaben ohne Gewehr! ;o)
Titel: Aw: Gasverbrauch loggen
Beitrag von: themaddin am 09 Oktober 2013, 19:14:46
Hallo Frank,

danke für deine Antwort. :)
Ich bin jetzt soweit, das mir der aktuelle Gaszählerstand in FHEM angezeigt wird und er zählt munter hoch. Der Tagesverbrauch wäre nun interessant.
Ich bin gerade dabei deine Lösung zu übernehmen. Ich scheitere am Attribut offset für den dummy. FHEM sagt, er kennt das nicht. Muss man das Attribut irgendwo vorher definieren?


define MyCnt_a dummy
attr MyCnt_a offset 10.123


Gruß Martin
Titel: Aw: Gasverbrauch loggen
Beitrag von: themaddin am 09 Oktober 2013, 20:17:06
Habs! :)
offset muss auch bei "attr global userattr..." eingetragen werden...
Gruß Martin
Titel: Aw: Gasverbrauch loggen
Beitrag von: fiedel am 10 Oktober 2013, 07:35:41
Perfekt... ;o)


attr MyCnt_a userReadings display {Value("MyCnt_a")/100.0+AttrVal("MyCnt_a","offset",0);;}, consumption_gas differential {Value("MyCnt_a")*3600*0.01;;}, daily_gas {ReadingsVal("MyCnt_a","display",0)-Value("Dum_DifGas_D");;}

Normalerweise müsstest du die roten Faktoren an deinen Zähler anpassen (Impulse pro m³), aber da dein Zähler den gleichen Wert hat wie meiner, kannst du schon alles so lassen.

Den Offsetwert berechnest du, indem du den Displaywert vom realen Zählerstand abziehst. Da ich aber sehr rechenfaul bin und der Displaywert ja FHEM bereits bekannt ist, habe ich noch was gebastelt:
Man gibt per "set Dummy <Wert Zählerstand>" den Zählerstand ein und der Offsetwert wird automatisch richtig gesetzt.



#############################################################################
## Autom. Berechnung des Offset- Wertes für den realen Zählerst. "display" ##
#############################################################################

# Ein Dummy dient zur Eingabe des aktuell abgelesenen Zählerstandes
# Benutzung: set Dum_Input_D <Wert Zählerstand>
# Achtung: Anstelle des Kommas muss ein Punkt verwendet werden!

define Dum_Input_D dummy
attr Dum_Input_D group Berechnungen
attr Dum_Input_D room 1_Energie


# Funktion zum Berechnen und Setzen des Offset- Wertes:
define Func_SetOffset_N notify Dum_Input_D  { \
\
  my $aufrufer_SetOffset = "@" ;;\
  my $value = (Value("MyCnt_a")/100.0);;\
  my $setoffset = (Value("Dum_Input_D") - $value);;\
\
 if ($aufrufer_SetOffset eq "Dum_Input_D") { \
     Log 1, "Setze MyCnt_a.offset auf: $setoffset";; \
     fhem("attr MyCnt_a offset $setoffset");;\
 } \
                                             { \
     fhem("save");;\
 }\
}
attr Func_SetOffset_N group Berechnungen
attr Func_SetOffset_N room 1_Energie


Gruß

Frank

Edit:

Es ist vielleicht etwas verwirrend, warum in dem Notify noch eine if- Abfrage drin ist, obwohl der "Aufrufer" ja nur dieser eine Dummy sein kann: Ich hab das mal so dringelassen - bei mir kann man dort mehrere Dummies für mehrere Offsets eingeben, die dann unterschiedlich abgearbeitet werden. Sieht bei mir so aus:


#############################################################################
# Autom. Berechnung der Offset- Werte für die realen Zählerst. "DisplayA/B" #
#############################################################################

# Zwei Dummys dienen zur Eingabe des aktuell abgelesenen Zählerstandes
# Benutzung: set Dum_Input_A_D <Wert>
# Benutzung: set Dum_Input_B_D <Wert>

define Dum_Input_A_D dummy
attr Dum_Input_A_D group Berechnungen
attr Dum_Input_A_D room 1_Energie

define Dum_Input_B_D dummy
attr Dum_Input_B_D group Berechnungen
attr Dum_Input_B_D room 1_Energie

# Funktion zum Berechnen und Setzen der Offset- Werte:
define Func_SetOffset_N notify Dum_Input_A_D|Dum_Input_B_D  { \
\
  my $aufrufer_SetOffset = "@" ;;\
  my $valueA = (ReadingsVal("OW_Counter","counters.A",0)/75.0);;\
  my $valueB = (ReadingsVal("OW_Counter","counters.B",0)/100.0);;\
  my $setoffsetA = (Value("Dum_Input_A_D") - $valueA);;\
  my $setoffsetB = (Value("Dum_Input_B_D") - $valueB);;\
\
 if ($aufrufer_SetOffset eq "Dum_Input_A_D") { \
     Log 1, "Setze OW_Counter.offsetA auf: $setoffsetA";; \
     fhem("attr OW_Counter offsetA $setoffsetA");;\
 } \
 if ($aufrufer_SetOffset eq "Dum_Input_B_D") { \
     Log 1, "Setze OW_Counter.offsetB auf: $setoffsetB";; \
     fhem("attr OW_Counter offsetB $setoffsetB");;\
 }\
                                             { \
     fhem("save");;\
 }\
}
attr Func_SetOffset_N group Berechnungen
attr Func_SetOffset_N room 1_Energie

Titel: Aw: Gasverbrauch loggen
Beitrag von: themaddin am 11 Oktober 2013, 08:05:57
Hallo Frank,

das ist ja genial, das muss ich am Wochenende auch noch einbauen. :)

Gruß Martin
Titel: Aw: Gasverbrauch loggen
Beitrag von: fiedel am 11 Oktober 2013, 10:56:52
Na dann viel Spaß dabei!

Hier hab ich mich übrigens beim Erklären vertan:

Den Offsetwert berechnest du, indem du den Displaywert vom realen Zählerstand abziehst...

Es wird der Zählerwert (umgerechnet in die passende Einheit) vom Zählerstand abgezogen um mit dem so errechneten Offset den Displaywert (realer Zählerstand zur Anzeige in FHEM) zu bilden. Rechnen ist in Wirklichkeit gar nicht meine Stärke... ;o)

Gruß

Frank
Titel: Antw:Gasverbrauch loggen
Beitrag von: themaddin am 14 Oktober 2013, 20:23:52
Hallo Frank, leider funktioniert es noch nicht so reibungsfrei...

Mit dieser Zeile:
define MyCntCalc at +*00:00:30 {my $calc = Value("MyCnt");;fhem("set MyCnt_a $calc");;}
wird in dem Dummy MyCnt_a unter state bei Readings der Counter-Stand eingetragen

Bei dieser Zeile:
attr MyCnt_a userReadings display {Value("MyCnt_a")/100.0+AttrVal("MyCnt_a","offset",0);;} ....
scheint nur der Offset berücksichtigt werden, weil nur dieser steht in unter Readings bei display

Es sieht so aus als ob Value("MyCnt_a")/100.0 immer null als Ergebnis liefert.

Hast Du eine Idee warum mit Value("MyCnt_a")/100.0 der Counter-Stand nicht übernommen wird?

Gruß
Martin
Titel: Antw:Gasverbrauch loggen
Beitrag von: fiedel am 15 Oktober 2013, 09:07:58
Hi Martin,

hab den Fehler gefunden:

Ersetze mal "Value("MyCnt_a")"  durch "ReadingsVal("MyCnt_a","state",0)"!


attr MyCnt_a userReadings display {ReadingsVal("MyCnt_a","state",0)/100.0+AttrVal("MyCnt_a","offset",0);;}, consumption_gas differential {ReadingsVal("MyCnt_a","state",0)*3600*0.01;;}, daily_gas {ReadingsVal("MyCnt_a","display",0)-Value("Dum_DifGas_D");;}


Du hast es eigentlich schon fast selbst gefunden. Durch das "stateFormat" haben "STATE" und "state" unterschiedliche Werte.
Ich hab die Zählerroutine zur Fehlersuche jetzt mal bei mir nachgebaut. Wenn du noch mehr Fragen hast, kann ich es gleich live testen. Ist ja doch alles etwas komplexer, sodass noch mehr Fehler drin sein könnten. Aber ich schreibe ja hier im Forum u.a. auch, um selbst was zu lernen... ;o)

Übrigens, in der Offset- Berechnungsroutine müsstest du es auch so ändern. Da ist ja auch der "Value("MyCnt_a")" drin.

Gruß

Frank
Titel: Antw:Gasverbrauch loggen
Beitrag von: themaddin am 16 Oktober 2013, 20:55:34
Hallo Frank, danke für deine Hilfe.   :)

Zwischenzeitlich habe ich die Zeile mal so umgeändert:
attr MyCnt_a userReadings display {Value("MyCnt")/100.0+AttrVal("MyCnt_a","offset",0);;}, consumption_gas differential {Value("MyCnt_a")*3600*0.01;;}, daily_gas {ReadingsVal("MyCnt_a","display",0)-Value("Dum_DifGas_D");;}
Habe also direkt Value("MyCnt") genommen und nicht MyCnt_a. Das scheint auch zu funktionieren.
Habs jetzt auf ReadingsVal("MyCnt_a","state",0), ich denke das ist sauberer. :)

Folgende Zeile verstehe ich noch nicht so ganz:
consumption_gas differential {ReadingsVal("MyCnt_a","state",0)*3600*0.01;;
Wird hier der Gasverbrauch pro Stunde ermittelt?

Das mit dem Offset habe ich jetzt auch eingebaut und scheint zu funktionieren.  :)

Im Anhang mal ein Scrennshot von meinem ersten Plot :-)
Der consumption_gas dürfte noch nicht stimmen, da ich den noch nicht umgestellt hatte. (erst eben gerade)

Gruß Martin

Titel: Antw:Gasverbrauch loggen
Beitrag von: fiedel am 17 Oktober 2013, 08:12:23
Moin Martin ;o)

na sieht doch supi aus! Das mit dieser "differential"- Zeile ist so: "differential" ist ein Parameter von "userReadings", der dir die Wertedifferenz seit der letzten Werteübermittlung / Messung in "Wert pro Sekunde" ausgibt. Da wir ja den Wert pro Stunde brauchen, rechnet man "mal 3600 (Sek.)" und dann noch "mal dem Faktor des Gaszählers" um auf m³/h zu kommen. Heraus kommt der Momentanverbrauch. Wenn sich seit der letzten Werteübermittlung / Messung der Wert nicht geändert hat, ist das Ergebnis Null.
Du hast es also genau richtig erkannt! ;o)

Vermutlich könnte man die ganze Berechnung auch mit dem "MyCnt"- Dummy direkt machen. Dann würde aber die Berechnung der userReadings jedes Mal erfolgen, wenn ein Zählimpuls reinkommt. Das erzeugt auf jeden Fall höhere Systemauslastung. Ob die nun nennenswert ist, weiß ich nicht. Bei einer Fritzbox merkt man es wahrscheinlich eher als auf einem Linux- PC. ;o)
Und du müsstest etwas dagegen unternehmen, dass das Log mit Werten überschwemmt wird. Apropos:

Wenn es dann vernünftig läuft, kannst du den Berechnungstimer auf z.B. 5 Min. umstellen:


# Berechnungsdummy wird alle 5 min auf Wert des Zälerdummy aktualisiert
define MyCntCalc at +*00:05:00 {my $calc = Value("MyCnt");;fhem("set MyCnt_a $calc");;}


Gruß

Frank
Titel: Antw:Gasverbrauch loggen
Beitrag von: Franz Tenbrock am 31 Oktober 2013, 21:27:57
Hallo, super interessant, obwohl ich es rauf und runter gelesen habe und einiges hin und herkopiert habe komme ich trotzdem nicht weiter.
Die Hardeware ist scheinbar richtig montiert, wurde von FHEM erkannt und ohne das ich großartig was definiert hab bekomme ich einen Plot der mir anzeigt wann Gas verbraucht wird.
Pro Impuls  0,01 m3

Habe als ich das Ganze montiert habe den Gasverbrauch an der Uhr aufgeschrieben = 10105,789  m3
FHEM hat folgende Zeile geschrieben:
2013-05-20_17:27:51 CUL_EM_10 CNT: 0 CUM: 0.000  5MIN: 0.000  TOP: 0.000

Heute hab ich auf dem Gaszähler:  10223,3 m3
Die zeile im Log:
2013-10-31_12:33:21 CUL_EM_10 CNT: 155 CUM: 193.920  5MIN: 0.000  TOP: 0.000

FileLog
FileLog_CUL_EM_10 CUL_EM_10-2013.log Power text

(//)

Was schöm und sicher auch für viele andere sehr gut wäre wenn man das Ganze nun zusammenfassen könnte. so dass auch nicht Programmierer das hinbekommen.
Könnte man nicht den gesamten Bereich aus der fhem.cfg hier veröffentlichen, ev mit #Erklärungen ..

Dazu dann die Abschnitte aus der 99-myutils.pm
und dann wird wohl ja auch noch eine gplot datei benötigt.

Ich habe mich letztmalig vor 3 Monaten damit beschäftigt und will nun weitermachen. Die Syntax und Schreibweise dann richtig zu machen wenn man nicht täglich programmiert ist sehr schwer.
Würde mich sehr freuen  wenn man mir weiterhelfen könnte.
Titel: Antw:Gasverbrauch loggen
Beitrag von: fiedel am 01 November 2013, 07:27:18
Hi Franz,

bei dir liegt der Fall etwas anders, du hast einen cul_em im Einsatz. Der wird wieder anders konfiguriert, als das Konstrukt aus diesem Thread.
Der EM1000 macht die hier o.g. Berechnungen größtenteils schon intern und sendet dir einen fertigen kWh- Wert, den du per Eingabe deines persönlichen Offsets in den realen Zählerstand umrubeln kannst.
Am Besten, du suchst hier im Forum nach "cul_em" oder "EM1000", da findest du auch viele Beispiele mit kompletter Konfiguration.

Gruß

Frank