Heizleistung und Gasverbrauch

Aus FHEMWiki
Version vom 16. Juni 2017, 17:15 Uhr von Loefflerp (Diskussion | Beiträge) (Hinweis auf fehlende Math::Round als mögliche Ursache)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Grafische Auswertung (Plot)

Momentane Heizleistung und Gasverbrauch können mit der im Folgenden beschriebenen Lösung in FHEM ermittelt, protokolliert und grafisch dargestellt werden.

Technische Voraussetzungen

Info green.pngBitte beachten, dass in der beschriebenen Implementierung nicht FileLog sondern DbLog verwendet wird.
  1. Impulsnehmer: Bei den sehr verbreiteten Elster/Kromschröder Zählern: Elster / KromImpulsnehmer IN-Z65 für Elster Zähler, erhältlich bei co.met GmbH Saarbrücken für rund 18,00 Euro (eBay-shop)
  2. 1-Wire S0-Zählermodul, z.B. von www.eservice-online.de

Konzept

Berechnung von Energie, Momentanleistung der Heizung und Gaszählerstand: über den S0-Zähler wird die verbrauchte Gasmenge bzw. über die Zeit der Gasvolumenstrom gemessen. Der Energiegehalt der verbrauchten Gasmenge lässt sich aus den folgenden Parametern der Gasrechnung des Energieversorgers ableiten:

  • Zustandswert (z-Wert) (ein Wert in der Größenordnung 10 bis 11)
  • Brennwert (ein Wert in der Größenordnung 0,95)

Die Energie in kJ oder kWs berechnet sich damit aus dem Gasvolumen wie folgt:

energy = Volumen * gaszwert * gasbrennwert kWh/m3 * 3600s/h

Das Gasvolumen lässt sich dabei wiederum aus den Zählerstandsdifferenzen über den SO-Zähler ermitteln.

Volumen = cts * 1/gasctsperm3

Die Momentanleistung lässt sich anschliessend aus dem Differential der Energie ableiten. In FHEM kann dafür die Differentialfunktion verwendet werden.

Definitionen in FHEM

Mit den nachfolgend beschriebenen Definitionen und Hilfsfunktionen werden diese Berechnungen von FHEM durchgeführt.


Bei Fehlern im Log beim Aufruf der Subroutinen könnte das Perlmodul Math::Round fehlen.

Konfiguration

Erforderliche Einträge in der Konfiguration:

# Das VORHANDENE attr global userattr um die nachfolgenden Werte ERWEITERN. 
# Bitte keine neue attr global userattr Zeile anlegen!!!
attr global userattr gasbrennwert gasctsperm3 gasoffset gaszwert

#
#  Gaszaehler
#

# gasoffset   : Offset Zählerstand
# gasctsperm3 : Zählimpulse pro m3
# gaszwert    : Z-Wert gem Gasrechnung
# gasbrennwert: Brennwert gem Gasrechnung

define C_GASZAEHLER OWDevice 1D.C5F60D000000 120
attr C_GASZAEHLER IODev myLocalOWServer
attr C_GASZAEHLER alias Gaszä;hler
attr C_GASZAEHLER event-min-interval counters.A:120,gas.*:120
attr C_GASZAEHLER event-on-change-reading counters.A,gasabsolut,gasleistung,gastagesverbrauch,gasmonatsverbrauch,gasjahresverbrauch
attr C_GASZAEHLER event-on-update-reading counters.A,gasabsolut,gasleistung,gastagesverbrauch,gasmonatsverbrauch,gasjahresverbrauch
attr C_GASZAEHLER gasbrennwert 11.270
attr C_GASZAEHLER gasctsperm3 100
attr C_GASZAEHLER gasoffset 9236.65
attr C_GASZAEHLER gaszwert 0.9543
attr C_GASZAEHLER group Heizungswerte
attr C_GASZAEHLER icon sani_boiler_temp
attr C_GASZAEHLER model DS2423
attr C_GASZAEHLER room 3.01 Heizung
attr C_GASZAEHLER stateFormat {sprintf("V: %.2fm3",ReadingsVal("C_GASZAEHLER","gasabsolut",0)).sprintf(" E: %.2fkWh",ReadingsVal("C_GASZAEHLER","gastagesverbrauch",0)).sprintf(" P: %.2f kW",ReadingsVal("C_GASZAEHLER","gasleistung",0));;}
attr C_GASZAEHLER userReadings gasabsolut { gaszaehlerstand("C_GASZAEHLER","counters.A");;}, gasleistung differential { gasenergie('C_GASZAEHLER',ReadingsVal("C_GASZAEHLER","counters.A",0));;}, gastagesverbrauch { gasverbrauch('C_GASZAEHLER','counters.A', 'D_GASCNTATMIDNIGHT');;}, gasmonatsverbrauch { gasverbrauch('C_GASZAEHLER','counters.A', 'D_GASCNTAT1STDAYOFMONTH');;}, gasjahresverbrauch { gasverbrauch('C_GASZAEHLER','counters.A', 'D_GASCNTAT1STDAYOFYEAR');;},

# Gaszaehlerstand in m3
# Leistung = differential(counters.A * 1/gasctsperm3  * gaszwert * gasbrennwert kWh/m3 * 3600s/h *1000W/kW)

define D_GASCNTATMIDNIGHT dummy
attr D_GASCNTATMIDNIGHT event-on-change-reading state,gasdaycnt
attr D_GASCNTATMIDNIGHT room 9.02_Steuerung
attr D_GASCNTATMIDNIGHT userReadings gasdaycnt:state difference { ReadingsVal("D_GASCNTATMIDNIGHT","state",0);;}

define D_GASCNTAT1STDAYOFMONTH dummy
attr D_GASCNTAT1STDAYOFMONTH event-on-change-reading state
attr D_GASCNTAT1STDAYOFMONTH room 9.02_Steuerung

define D_GASCNTAT1STDAYOFYEAR dummy
attr D_GASCNTAT1STDAYOFYEAR event-on-change-reading state
attr D_GASCNTAT1STDAYOFYEAR room 9.02_Steuerung


define S_GASCNTSCHEDULER at *00:00:00 { setgascounters(ReadingsVal("C_GASZAEHLER","counters.A",0));;}
attr S_GASCNTSCHEDULER room 9.02_Steuerung

#
# Gaszaehler Plot
#
define PL_GASZAEHLER SVG myDbLog:myDbGaszaehler:HISTORY
attr PL_GASZAEHLER group Heizungsverlauf
attr PL_GASZAEHLER label "E min: $data{min1}, max: $data{max1}, last: $data{currval1}"::"P min: $data{min2}, max: $data{max2}, last: $data{currval2}"
attr PL_GASZAEHLER plotfunction C_GASZAEHLER
attr PL_GASZAEHLER room 3.01 Heizung
attr PL_GASZAEHLER title "Gaszaehler"

Hilfsfunktionen

Definitionen in der 99_my??Utils.pm:

sub gasenergie
{
  my($device,$cts) = @_;
 
  # Berechnung des Energieinhaltes von Gas in kWs
  # energy= cts * 1/gasctsperm3  * gaszwert * gasbrennwert kWh/m3 * 3600s/h)
  my($gasenergy)= $cts
                  * 1/AttrVal($device,"gasctsperm3",100)
                  * AttrVal($device,"gaszwert",0.9543)
                  * AttrVal($device,"gasbrennwert",11.27)
                  * 3600;

  return($gasenergy);
}


sub gastagesverbrauch
{
  my($device,$cts) = @_;
  my($midnight)=Value('D_GASCNTATMIDNIGHT');
  my($daycts)=$cts-$midnight;
  # Berechnung des Energieinhaltes von Gas in kWh fuer den Tagesverbrauch
  # energy= cts * 1/gasctsperm3  * gaszwert * gasbrennwert kWh/m3
  my($gasenergy)=$daycts
        * 1/AttrVal($device,"gasctsperm3",100)
        * AttrVal($device,"gaszwert",0.9543)
        * AttrVal($device,"gasbrennwert",11.27);        
 
  return($gasenergy);
}


sub gasverbrauch
{
  my($device,$counter,$startvar) = @_;
  my($deltacts)=ReadingsVal($device,$counter,0)-Value($startvar);
 
  # Berechnung des Energieinhaltes von Gas in kWh für den Tagesverbrauch
  # energy= cts * 1/gasctsperm3  * gaszwert * gasbrennwert kWh/m3
  my($gasenergy)=$deltacts
        * 1/AttrVal($device,"gasctsperm3",100)
        * AttrVal($device,"gaszwert",0.9543)
        * AttrVal($device,"gasbrennwert",11.27);        
 
  return($gasenergy);
}

sub gaszaehlerstand
{
  my($device, $counter)=@_;
  # Berechnung des Gaszaehlerstandes in m3
  # V=gasoffset+counts/countsperm3
  my($zaehlerstand)=
     AttrVal($device,"gasoffset",0)+ReadingsVal($device,$counter,0)/AttrVal($device,"gasctsperm3",100);
  return($zaehlerstand);
}

sub setgascounters
{
  my($cts) = @_;
  fhem("set D_GASCNTATMIDNIGHT ".$cts);
  if (DateTime->today(time_zone => $ENV{TZ})->day()==1)
  {
    fhem("set D_GASCNTAT1STDAYOFMONTH ".$cts);
    fhem("set D_GASCNTAT1STDAYOFYEAR ".$cts) if (DateTime->today(time_zone => $ENV{TZ})->month()==1);
  }
}

.gplot Definitionen

Um die gezeigten Auswertungen zu erhalten, müssen die folgenden Plot-Definitionen angelegt werden:

# Created by FHEM/98_SVG.pm, 2014-01-20 14:45:44
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 '<TL>'
set ytics
set y2tics
set grid xtics y2tics
set ylabel "Momentanleistung [kW]"
set y2label "Tagesverbrauch [kWh]"
set yrange [0:20]
#set y2range [10:35]

#DbLog <SPEC1>:gasleistung:0:
#DbLog <SPEC1>:gastagesverbrauch:0:

plot \
  ls l0 axes x1y1 title 'Momentanleistung [kW]' with lines lw 2, \
  ls l2fill axes x1y2 title 'Tagesverbrauch [kWh]' with lines

Links

  • Thread im Forum, in dem die Lösung vorgestellt wurde; Diskussionen / Kommentare bitte dort