Gaszähler mit Reed-Kontakt auslesen

Zum Auslesen meines Gaszählers elster BK-G4M verwende ich einen Reedkontakt vom Elektronikladen um die Ecke (Kosten unter 1 €). Mit doppelseitigem Klebeband habe ich diesen Reed-Kontakt in die Mulde unter dem Zählwerk geklebt.

Gasuhr mit Reed-Sensor Reed-Sensor

 

Erst habe ich den Gaszähler mit einem Raspberry ausgelesen, inzwischen verwende ich aber einen ESP8266 ESP-01. Beide Projekte sind im folgenden beschrieben.

 

Option 1 - Gaszähler mit Raspberry Pi auslesen

Anfangs verwendete ich einen Raspberry Pi A+ und ein Pyton-Skript, das bei jedem Impuls den Zählerstand hochzählt (0,01 m^3 beim BK-G4M). Dazu verwende ich folgendes Python-Skript GetImpulse.py, das mit sudo ./GetImpulse.py & gestartet werden kann. Sinnvoller ist der automatische Start des Python-Scripts nach dem Booten. Auf diese Weise wird sichergestellt, dass im Falle eines Raspberry Pi-Reboots das Script auch tatsächlich läuft.

Der aktuelle Wert des Gaszählers wird bei jedem Impuls aus der Datei GasMeter.dat ausgelesen, und der neue Wert dort abgespeichert. Vor dem Start des Python-Scripts muss diese Text-Datei manuell angelegt werden, und der aktuelle Zählerstand ist dort einzutragen (mit Dezimalpunkt!). Das Script erstellt weiterhin eine XML-Datei /var/www/html/gas.xml. Diese XML-Datei beinhaltet den aktuellen Zeitstempel und den aktuellen Zählerstand. Über diese XML-Datei kann jederzeit über eine HTTP-Anfrage von einem beliebigen Computer im Netzwerk der aktuelle Zählerstand abgefragt werden.

In vielen Foren wird berichtet, dass mit dieser kostengünstien Bastelei nicht jeder Impuls zuverlässig abgefragt wird. Bei mir funktioniert die Abfrage des Zählerstands seit über einem halben Jahr fehlerfrei.

 

Option 2 - Gaszähler mit einem ESP8266 auslesen

Da ein Raspberry Pi mit dem simplen Hochzählen eines Impulses eingentlich total überfordert ist habe ich einen ESP8266 ESP-01 dafür eingesetzt. Dessen zwei GPIOs reichen dazu völlig aus. Der verwendete Code ist ESP8266_GasMeter_V0.ino:

 

Der Reedkontakt ist am GPIO2 angeschlossen und über einen Pulldown-Widerstand (10k) auf Masse gezogen. Am GPIO0 habe ich eine LED angeschlossen. Die LED blink jede Sekunde kurz auf, und zeigt damit an, dass der ESP8266 läuft. Bei einem eintreffenden Impuls des Reed-Kontakts der Gasuhr leuchtet die LED für die Dauer des Impulses.

Der Zählerstand ist nach dem Start des ESP8266 bei 0. Um dem ESP8266 den aktuellen Zählerstand mitzuteilen erfolgt einmalig folgender Aufruf:
192.168.XXX.YYY/SetValue?Value=1234.5
Nach diesem einmaligen Aufruf wird der aktuelle Zählerstand vom EDP8266 zurückgemeldet und mit jedem erfassten Impuls hochgezählt.

Nach dem Aufruf via 192.168.XXX.YYY erhält man vom ESP8266 zum Beispiel folgende Antwort:
<MyHome>
<ESP8266_GasMeter>
<data name="SSID" value="IhreID" valueunit=""/>
<data name="IP" value="192.168.XXX.YYY" valueunit="xxx.xxx.xxx.xxx"/>
<data name="help" value="use /SetValue?Value=xx to set new value" valueunit="text"/>
<data name="MAC" value="AA:20:BB:XX:XX:XX" valueunit="AA:BB:CC:DD:EE:FF"/>
<data name="GasMeter" value="1250.99" valueunit="m^3"/>
</ESP8266_GasMeter>
</MyHome>

Bei meiner Gasuhr liegt ein Impuls bei maximalem Gasverbrauch für ca. 4 Sekunden an. Mit einer "Abtastrate" von einer Sekunde wird jeder Impuls zuverlässig erfasst.

Ich habe den ESP8266 ESP-01 auf einer Platine zusammen mit einem Spannungswandler AM1117-3.3 untergebracht. Damit kann die Schaltung mit einer variablen Spannung bis 12 VDC versorgt werden. Das Ganze sieht von innen dann so aus:

Gehäuse Gaszähler innen

Die Spannungsversorgung erfolgt über eine Hohlbuchse (5,5/2,1) mit Lötanschluss mit bis zu 12 VDC. Die LED zeigt den Status an (siehe oben). Der Reed-Kontakt wird über die zweipolige Leiterplattenklemme angeschlossen. Von außen sieht das kleine Gerät dann so aus:

Gehäuse Gaszähler

Die Schaltung sieht dann so aus:

Schaltung Gaszähler

Der Schalter ist notwendig, um den GPIO0 beim Start nicht auf Masse zu ziehen. Wenn GPIO0 auf Masse liegt, startet der ESP8266 nach dem Einschalten im Flash-Modus. Um das zu verhindern, schalte ich GPIO0 und GPIO2 über den Schalter erst nach dem Start auf Masse. Durch die blinkende LED signalisiert der ESP8266 ESP-01, dass er richtig funktioniert.

 

Beispiel einer Auswertung

Der oben dargestellte XML-Code des ESP8266 wird in meinem Fall von einem Raspberry Pi in festen Zeitabständen abgefragt. Diese Abfrage erfolgt über ein Python-Script, das die relevanten Parameter aus dem XML-Code extrahiert und in eine MySQL-Tabellle einträgt.
# --- get value with ID from xmldata
def GetxmlValue(root, ID_Name, ID):
  value = '0'
  for hit in root.findall('.//*[@' + ID_Name + '="' + ID + '"]'):
    value = hit.get('value')
  return value
# --- def GetxmlValue

Mit folgendem Aufruf kann dann zum Beispiel der aktuelle Wert des Gaszählers ausgelesen werden:
GasMeter = float(GetxmlValue(xmlroot, 'name', 'GasMeter'))
In der Variable xmlroot steht in diesem Fall der Inhalt des oben dargestellten XML-Codes, der über einen URL-Request vom ESP8266 abgeholt wird.

In Kombination mit einem Außentemperaturfühler können dann Digramme erstellt werden, die den zeitlichen Verlauf von Außentemperatur und Gasverbrauch zum Beispiel wie folgt darstellen:

Gasverbrauch