Momentanleistung der Heizung und Gasverbrauch über den Gaszähler messen

Begonnen von g.carls, 21 März 2014, 16:09:52

Vorheriges Thema - Nächstes Thema

g.carls

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

AHA1805

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

AHA 1805 RIP 29.08.2016 --> RUHE IN FRIEDEN
In Gedanken Bei dir HANNES
Dein Bruder Gerd (Inputsammler) Vermisst dich Hannes (AHA1805)

ph1959de

Aktives Mitglied des FHEM e.V. | Moderator im Forenbereich "Wiki"

g.carls

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

GiJoe73

Hallo,

Funktioniert das ganze auch mit OWX und über OWCOUNT  oder muß man da einiges ändern um das hinzubekommen ?

FHEM 5.5 auf Cubietruck mit 60GB SSD
HMLAN - CFG - Adapter
11 x HM-LC-Bl1PBU-FM
8 x HM-CC-RT-DN
2 x 1-Wire Bus mit 8 stk. DS2406, 3 x 1-Wire Dougie Counter, 2 x DS2408, 8 x DS18B20, 1 x DS2450, 2x DS2438

g.carls

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

GiJoe73

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...
FHEM 5.5 auf Cubietruck mit 60GB SSD
HMLAN - CFG - Adapter
11 x HM-LC-Bl1PBU-FM
8 x HM-CC-RT-DN
2 x 1-Wire Bus mit 8 stk. DS2406, 3 x 1-Wire Dougie Counter, 2 x DS2408, 8 x DS18B20, 1 x DS2450, 2x DS2438

Puschel74

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
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

eldrik

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

g.carls

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

thosch

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

skyfly24

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

Kermit20

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.
RPi1: FHEM mit HMLAN und CUL Eigenbau: diverse Homematic Geräte; Technoline Temp/Feuchte 868 MHz // Schalsteckdosen 433 MHz
RPi2: FHEM mit Viessmann(optolink) mit VControl und 1W Sensoren
RPi3: Apache / Owncloud 9