Hallo zusammen!
Ich möchte gerne eine einfache Lösung vorstellen, mit der die Momentanleistung der Zentralheizung in kW sowie der Gasenergieverbrauch in kWh und der Gaszählerstand
nur über einen einzigen 1-wire Counter mit FHEM erfasst werden kann. Zur Veranschulichung des Ergebnisses habe ich eine Grafik beigefügt.
Technische Voraussetzungen:
1.) 1 x 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 x 1-wire S0-Zählermodul, z.B. von www.eservice-online.de
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 Energieinhalt 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 dabei wiederum aus dem Zählerstanddifferenzen ü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 man dafür die differential Funktion verwenden.
Mit den nachfolgenden Defines und Hilfsfunktionen lassen sich in FHEM die entsprechenden Werte automatisch erfassen und zus.
auch noch aggregierte Werte für den Tages, Monats oder Jahresverbrauch ableiten:
In fhem.cfg sind folgende Einträge vorzunehmen:
fhem.cfg
# 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"[/tt]
gplot Datei: myDbGaszaehler.gplot
# 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
Die nachfolgenden Perl-Hilfsfunktionen sollten dann in einem eigenen Utils.pm Modul im FHEM Verzeichnis abgelegt werden.
Diese Funktionen verwenden das Perlmodul DateTime. Um dieses Modul zu nutzen, muss man die entsprechende use Anweisung am Beginn des myUtils.pm Moduls aufnehmen:
package main;
use strict;
use warnings;
use POSIX;
use DateTime;
Auf Debian und Ubuntu Systemen lässt sich dieses Paket auf einfache Weise wie folgt installieren:
apt-get update
apt-get install libdatetime-perl
Sollte kein vorkonfektioniertes Installationspaket verfügbar sein, dann kann man sich das Paket auch bei www.cpan.org herunterladen.
Einige der Funktionen werten die Umgebungsvariable $TZ aus, um die Zeitzone zu ermitteln.
Wenn diese Variable nicht oder falsch in der Startumgebung von FHEM gesetzt ist, kann dies zu Problemen führen.
Man kann dann auch einfach
$ENV{TZ}
durch
'Europe/Berlin'
im nachfolgenden Code ersetzen.
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);
}
}
Viele Grüße,
Guido
Hallo Guido
schön, was hast Du für eine Auflösung der Volumen Erfassung?
Kannst du mal ein Foto von der Anbringung deines Impulsgeber posten.
Bei meinem Kromschröder steht nämlich was von einer Auflösung 0.1 m3/imp, deshalb habe ich es mit einer Foto Diode am Zähler gemacht und den Spiegel auf der 0.006 Stelle verwendet und somit eine Auflösung von 0.001 m3/imp
Berechnung und Auswertung mache ich komplett mit.
http://www.fhemwiki.de/wiki/OWCOUNT
Meine Verbrauchs Anzeige sieht aber nicht so schön aus.
Gruß Hannes
Gesendet von Unterwegs mit Tapatalk 4
Hallo Guido,
ich hab's wieder nach dem gleichen Schema ins Wiki "gegossen": http://www.fhemwiki.de/wiki/Heizleistung_und_Gasverbrauch
Gruß, Peter
Hallo Hannes,
Mein Elster/Kromschröder Zähler liefert mir am Impulsnehmer 100 Impulse pro m3, also alle 10l.
Das entspricht grob überschlagen 0,1kWh pro Impuls. für Gas ist das meiner Meinung nach ausreichend.
Auf den ersten Blick finde ich OWCOUNT sehr praktisch. Bei mir hat dieses Modul dann jedoch eine Reihe Fragen aufgeworfen:
Funktioniert OWCOUNT auch mit owserver?
In der OWCOUNT Doku verstehe ich nicht was mit der Anmerkung "prerequisite: Add this module's name to the list of clients in OWServer" gemeint ist.
In der owserver Doku findet man keinen Hinweis auf die Definition von Clients.
Ist damit vielleicht das Attribut IoDev gemeint? Dies müsste dann jedoch in OWCOUNT gesetzt werden und nicht in owserver?
Können die Monatswerte und Jahreswerte von OWCOUNT auch in ein DbLog geschrieben werden?
VG,
Guido
Hallo,
Funktioniert das ganze auch mit OWX und über OWCOUNT oder muß man da einiges ändern um das hinzubekommen ?
Hallo,
ja, das Ganze funktioniert auch mit OWCOUNT und OWX.
OWCOUNT hat sogar schon viele der benötigten Funktionen eingebaut:
Ich verwende zwar kein OWCOUNT, die Migration sollte jedoch wie folgt funktionieren:
gasoffset bei OWCOUNT mit folgendem Attribut setzen:
attr OWC BOffset <float>
= offset added to the reading in this channel
gasctsperm3=100
muss migriert werden zu
attr OWC BFactor 0.01
attr OWC BName Gas-Energy|energy
attr OWC BRate Gas-Power|power
OWCOUNT verfügt jedoch nicht über eine Berechnung der Energieinhaltes von Gas.
So existiert kein äquivalent zu den Parametern:
gasbrennwert 11.270
und
gaszwert 0.9543
Deren Werte aus der Gasrechnung entnommen werden muss.
Das müsste man jedoch umgehen können, in dem man den BFactor wie folgt berechnet:
BFactor=Impulsrate*gasbrennwert*gaszwert
z.B.
attr OWC BFactor 0.01 * 11.270 * 0.9543
wobei man im obigen Beispiel nur das Ergebnis der Rechnung konfigurieren sollte.
VG, Guido
Hallo g.carls
Du nutzt in deinem Code das Perl Modul DateTime, leider bekomme ich immer Fehlermeldungen ala
Can't locate object method "today" via package "DateTime" (perhaps you forgot to load "DateTime"?) at ./FHEM/99_MyHeizungUtils.pm line 73
Ich habe DateTime nachinstalliert, aber today scheint er immer noch nicht kennen zu wollen. Muss das Perl Modul noch geladen werden und wenn ja wie ?
Bedankt
Jörg
UPDATE
Ich habe das Problem umschifft. Ob das so die feine englische Art ist, weiß ich nicht - zumindest meckert FHEM nicht mehr.
Ich habe in meine 99_MyHeizungUtils.pm diese beiden Zeilen eingefügt:
use DateTime;
$ENV{TZ} = 'Europe/Berlin';
Ich frage mich ob diese beiden Zeilen nicht auch ganz oben unter use POSIX;
stehen können...
Hallo,
@Guido
Darf ich dich bitten die Codes in Code-Tags zu setzen.
Der Text wird dann einfach leserlicher und leichter "überschaubar".
Danke.
Grüße
Hey,
was muss man denn machen, um dass ganze mit FileLog nutzen zu können?
Edit: false alarm, eine Definition war scheinbar unvollständig...
Greetz
Eldrik
Hallo GiJoe73,
bzgl Nutzung von DateTime:
In der Datei:
/FHEM/99_MyHeizungUtils.pm
sollte die use Anweisung ganz am Anfang stehen:
package main;
use strict;
use warnings;
use POSIX;
use DateTime;
Auf debian und ubuntu Systemen kann man das DateTime Paket sehr einfach wie folgt installieren:
apt-get update
apt-get install libdatetime-perl
Sollte für ein System diesen vorkonfektionierte Modul nicht verfügbar sein, kann man es sich bei www.cpan.org herunterladen.
Weiterhin kann die Verwendung von $ENV{TZ} Probleme verursachen, wenn die TZ Umgebungsvariable in der Startumgebung von FHEM nicht gesetzt ist. In diesem Fall kann man die Zeitzone auch direkt im Perlmodul angeben:
$ENV{TZ}
ersetzen durch ''Europe/Berlin''
.
Viele Grüße,
Guido
Apropos.
Danke für deine fantastische Anleitung. Alleine wäre ich so schnell nicht an eine
vernünftige Aufbereitung meiner Daten gekommen (die Daten erfasse ich seit geraumer
Zeit mit dougies Counter und dem Reed-Kontakt).
Gruß Thorsten
Hallo an alle und sorry, dass ich dieses Theme noch einmal aufrolle.
Ich bin sehr neu hier und arbeite mich gerade in die Thematik ein. Ich würde nun gerne mit meinem CUL und dem EM1000-GZ Gaszaehler-Sensor das gleiche realisieren. Geht das überhaupt mit dieser Anleitung und oder, was muss ich machen, damit das mit dem EM1000-GZ funktioniert?
Vielen Dank und Gruß
Gösta
Hi,
ich versuche deinen Vorschlag / Lösung nachzubauen. Da ich aber mit einem HourCounter arbeite und einem ReedKontakt also on off zustände Zähle, muss ich das Ganze etwas anpassen.
Ich würde gerne wissen, welche Variablen von deinem Zähler geliefert werden und welche Werte diese haben... damit ich das auf mein Konstrukt anpassen kann.
Danke und Gruß
Hoffe erzörne keine Admins wegen Off-Topic.