Zum Inhalt springen
Gassensor Gaszähler Hassio Home Assistant Arduino Esphome NodeMCU Einrichtung

Gaszähler auslesen mit ESP Home und Hassio (Home Assistant)

In diesem Tutorial zeige ich dir, wie ich unseren Gaszähler per Home Assistant auslese. Ich hatte – unvorhergesehener Weise – Glück, dass der Gaszähler bereits für das digitale Auslesen vorbereitet war. Wenn auf deinem Gaszähler irgendwo sowas wie 1imp = 0,01m3 steht, würde das dort auch klappen.

Gassensor Gaszähler Hassio Home Assistant Arduino Esphome NodeMCU

Sensor: Metrix Impulsnehmer NI-3 für Metrix & Apator-Gaszähler

Viele Gaszähler haben in einem der Drehrädchen einen Magneten integriert, der sich beim Gasverbrauch mitdreht. Ich habe ein paar Versuche mit einem normalen Magnetkontakt unternommen, mich am Ende aber für einen passenden Sensor entschieden.

Gassensor Gaszähler Hassio Home Assistant Arduino Esphome NodeMCU Sensor Gassensor
Magnetsensor zum Auslesen der Impulse des Gaszählers

Beim Sensor handelt es sich um den Metrix Impulsnehmer NI-3 für Metrix & Apator-Gaszähler und er hat ca. 35 Euro gekostet. Um ihn am Gaszähler anzubringen wird es aber spannend. Hierzu muss aus dem aktuellen Gaszähler eine Abdeckkappe mit einer Zange rausgebrochen werden. Wie man das genau macht, ist im Datenblatt des Sensors gezeigt. Danach lässt sich der Sensor wie erwartet einfach in den Gaszähler einklicken und sieht aus, wie dafür gemacht.


Sieh dir jetzt meinen neuen Arduino-Videokurs an: Jetzt ansehen!


Hier hab ich das gute Stück gekauft: mySmartShop.de

Der Sensor verfügt über vier Anschlusskabel: Zwei für einen öffnenden Kontakt, zwei für einen schließenden. Die beiden schließenden hab ich zum Auslesen verwendet.

Elektronik

Gassensor Gaszähler Hassio Home Assistant Arduino Esphome NodeMCU Schaltplan

Die Schaltung ist relativ übersichtlich. An ein D1 Mini ESP-Board wird der Magnetsensor mit dem GND und dem D3 (GPIO0) verbunden. Ich habe ihn über Schraubklemmen angeschlossen. Es bietet sich an, gleich noch einen Temperatursensor in dem Raum zu haben, der ist allerdings optional. Ich habe mich für einen DS18B20 entschieden und ihn mit 5V, GND und dem Pin D2 (GPIO4) verbunden. Zusätzlich werde ich die LED vom D1 Mini (eigentlich vom ESP8266-Modul) verwenden. Sie ist intern am Pin D4 (GPIO2) angeschlossen und wird bei jedem Magnetimpuls aufleuchten.

Bauteile

Code und Installation

Um das Programm auf das D1 zu übertragen, kann man es im einfachsten Fall per USB-Kabel an das Raspberry Pi anschließen. Gehe nun in Home Assistant auf ESP Home und klicke auf + New Device.

Vergib hier einen Namen, z.B. Gaszaehler und wähle unter Pick Specific Board das Wemos D1 and Wemos D1 Mini aus.

Gassensor Gaszähler Hassio Home Assistant Arduino Esphome NodeMCU Setup

Klicke auf Install und wähle hier Plug into the computer running ESPhome Dashboard.

Nun wird das Programm compiliert und auf das D1 übertragen. Dabei wird auch ein OTA-Key generiert. OTA steht für Over-The-Air und ermöglicht es nach der ersten Konfiguration, neue Änderungen per Wifi zu übertragen.

Am Ende der Übertragung wird ein Status generiert. Hier kannst du Signalstärken und Hardware prüfen. Das automatisch erzeugte Programm sieht jetzt ungefähr so aus:

esphome:
  name: gaszaehler

esp8266:
  board: d1_mini

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:
  password: "#################################"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Gaszaehler Fallback Hotspot"
    password: "#################"

captive_portal:

Jetzt kannst du das D1 an seine finale Position bringen und den Magnetsensor vom Gaszähler anschließen. Ich habe meines per USB-Netzteil versorgt.

Danach füge den folgenden Code unter captive_portal: ein.

globals:
  - id: total_pulses
    type: int
    restore_value: false
    initial_value: '0'  # hier kann der Gaszählerstand initialisiert werden

dallas:
  - pin: GPIO4
    
binary_sensor:
  - platform: gpio
    id: internal_pulse_counter
    pin:
      number: GPIO0
      mode: INPUT_PULLUP
    name: "Live-Impuls"
    filters:
      - delayed_on: 10ms
    on_press:
      then:
        - lambda: id(total_pulses) += 1;
        - output.turn_off: led  # optional: für eine LED, die den Gaszählerpuls visualisiert
    on_release:
      then:
        - output.turn_on: led  # optional: für eine LED, die den Gaszählerpuls visualisiert
        
sensor:
  - platform: dallas
    address: 0xd23c01d607bc1228
    name: "Temperatur_Teekueche" 
  - platform: template
    name: "Gasverbrauch"
    device_class: gas
    unit_of_measurement: "m³"
    state_class: "total_increasing"
    icon: "mdi:fire"
    accuracy_decimals: 2
    lambda: |-
      return id(total_pulses) * 0.01;

# Optional: Diese LED soll blinken, sobald ein Signal vom Gaszähler erkannt wird
output:
  - platform: gpio
    pin: GPIO2
    id: 'led'
    inverted: true

Klicke nun unten rechts auf Install und wähle Wirelessly. Der Code wird erneut compiliert und dann per Wifi (OTA) auf das Board übertragen. Es startet automatisch neu und zeigt nach kurzer Zeit den Status an.

Einrichtung in Home Assistant

Jetzt wollen die Daten erstmal im Home Assistant Dashboard anzeigen lassen. Klicke dazu in der Home Assistant Sidebar auf Einstellungen und wähle Geräte und Dienste. Suche nach der Gaszähler-Karte und klicke auf Konfigurieren. Nun taucht ein Gaszähler-Eintrag auf der Karte ESPHome auf.

Gassensor Gaszähler Hassio Home Assistant Arduino Esphome NodeMCU Karte erstellen

Klicke nun auf den Link 1 Gerät. Auf der Unterseite findest du eine Dashboard-Karte mit drei Einträgen. Klicke auf Zum Dashboard Hinzufügen. Nun sollte die Gaszähler-Karte im Dashboard auftauchen.

Gassensor Gaszähler Hassio Home Assistant Arduino Esphome NodeMCU Karte

Ab jetzt sollten auch die erfassten Daten in der InfluxDB für das Grafana-Dashboard gespeichert werden. Hier sieht mal also erst was, wenn auch ein paar Daten angekommen sind. Konfigurieren wir mal ein Dashboard in Grafana.

Gassensor Gaszähler Hassio Home Assistant Arduino Esphome NodeMCU Dashboard

Klicke auf Grafana in der Seitenleiste von Home Assistant (Hassio, dann im Grafana-Menü auf das Plus-Zeichen und dann auf Create. Klicke auf Add a new Panel.

Der obere Teil ist noch leer, denn wir müssen hier eine Datenquelle aus der InfluxDB zuweisen. Klicke also in der unteren Hälfte in der ersten Zeile auf das + hinter dem WHERE-Selektor und wähle entity_id. Es öffnet sich die select tag value Auswahl. Hier musst du den Namen des Sensors des Gaszähler-ESPs eingeben. In unserem Fall also gasverbrauch. Die Autovervollständigung sollte den Namen auch vorschlagen.

Nun wähle weiter vorn bei select measurement Qubikmeter aus. Jetzt solltest du schon die ersten Einträge im Grafen oben sehen (das setzt voraus, dass schon Daten aus dem Gaszähler abzulesen waren – kann also sein, dass man hier erst ein paar Stunden abwarten muss).

Die Gaszählermessung ist inkrementell. Das heißt, der Wert erhöht sich, je mehr Gas man verbraucht. Um den Verbrauch pro Stunde (oder auch pro Tag) anzuzeigen, musst du in der Zeile SELECT auf das Plus klicken und difference hinzufügen. Jetzt sieht man im Grafen eine zeitliche Abfolge.

Nun kannst du unter ALIAS in der untersten Zeile noch einen Namen für deinen Grafen vergeben. Er wird in der Legende eingeblendet.

Jetzt kannst du die Anzeige noch im rechten Seitenmenü nach deinen Wünschen stylen. Ich schlage vor, eine Fill opacity hinzuzufügen. Dadurch wird der Bereich unter dem Grafen gefüllt. Unter Line Interpolation habe ich Step after (das letzte Icon) ausgewählt. Es verbindet die Punkte nachziehend.

Jetzt kannst du mit Save speichern und dann auf Apply drücken (beides oben rechts). Nun wird dir der Graf im Dashboard als Panel angezeigt. Du kannst das Panel an der unteren rechten Ecke mit der Maus anfassen und über die Breite ziehen. Drücke dann aber wieder oben auf Speichern (Diskettensymbol). Den angezeigten Zeitbereich kannst du übrigens auch oben rechts einstellen.

So, das waren viele Einstellungen. Ich habe sie mal hier als animiertes Gif zusammengefasst.

Gassensor Gaszähler Hassio Home Assistant Arduino Esphome NodeMCU Einrichtung

Ich hoffe, das hat dir geholfen. Ich habe noch ein weiteres Panel mit dem Verbrauch pro Tag oben drüber erstellt. So lässt sich ein leichterer Überblick erschaffen.

Ich habe die Daten mit meinem echten Zählerstand abgeglichen und habe eine Abweichung von ca. 8%. Das ist für mich genau genug. Wenn du mehr willst, müsstest du die Formel im ESPHome etwas anpassen.

Und jetzt viel Spaß beim Nachbauen und Energiesparen :-)


Wenn dir das Projekt gefallen hat und du von weiteren interessanten Projekten inspiriert werden willst, sieh dir doch mal mein neues E-Book »Arduino Projekte Volume 1« an!

  • Die beliebtesten Arduino-Projekte von StartHardware
  • Inklusive Schaltplan, Beschreibung und Code
  • Arduino-Schnellstart-Kapitel
  • Kompakter Programmierkurs


0 0 votes
Article Rating
Abonnieren
Benachrichtige mich bei

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden.

21 Comments
Newest
Oldest Most Voted
Inline Feedbacks
Alle Kommentare anzeigen
dakobert
10 Monate zuvor

Hey, bei mir funktioniert es nicht mehr so, wie es einmal war. Ich weiß auch nicht so recht woran es liegt. Der Gassensor ist immer nur für kurze Zeiträume online, meist wird er als offline angezeigt. Es werden auch nicht wirklich Daten erfassen, immer nur minimal, dann wieder offline.
Zur Historie: Bei uns wurde der Router ausgetauscht, ich musste mich dann um diverse Baustellen kümmern. Habe es irgendwann auch beim ESP hinbekommen und in der secret.yaml die korrekten Daten hinterlegt.
Woran könnte es liegen, dass der Sensor immer nur kurzzeitig online ist? WLAN und Stromversorgung sind ok.

dakobert
Antworte an  Stefan Hermann
9 Monate zuvor

Yes, das hat geklappt. Also wirklich nochmal alles von vorne.. Wo genau der Fehler lag, keine Ahnung. Der ESP ist wieder online. Allerdings sendet der ESP keine Daten mehr so wie früher. Alles steht seit Tagen auf Null. Letzt Aktualisierung der Entität lässt sich nur mit einem Update des ESP auf den neusten Stand bringen. Daten werden dadurch nicht erfasst.
Hab ich einen Fehler in meiner Konfig? Ich stelle dieser hier einmal ein, vielleicht habe ich ja etwas falsch gemacht!?

esphome:
name: gas
friendly_name: gas

esp8266:
board: esp01_1m

# Enable logging
logger:

# Enable Home Assistant API
api:
encryption:
key: „nV66I+flZQpslCMb55MFkh3/7An9xJGIIm7fAr3WnAM=“

ota:
– platform: esphome
password: „cdf3c3cbecbe78954d71fff1ac4860fd“

wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password

# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: „Jugendheim Gastzugang“
password: „Hollenstede“

captive_portal:

globals:
– id: total_pulses
type: int
restore_value: false
initial_value: ‚0‘ # hier kann der Gaszählerstand initialisiert werden

one_wire:
– platform: gpio
pin: GPIO4

binary_sensor:
– platform: gpio
id: internal_pulse_counter
pin:
number: GPIO0
mode: INPUT_PULLUP
name: „Live-Impuls“
filters:
– delayed_on: 10ms
on_press:
then:
– lambda: id(total_pulses) += 1;
– output.turn_off: led # optional: für eine LED, die den Gaszählerpuls visualisiert
on_release:
then:
– output.turn_on: led # optional: für eine LED, die den Gaszählerpuls visualisiert

sensor:
– platform: template
name: „Gasverbrauch“
device_class: gas
unit_of_measurement: „m³“
state_class: „total_increasing“
icon: „mdi:fire“
accuracy_decimals: 2
lambda: |-
return id(total_pulses) * 0.01;

dakobert
Antworte an  Stefan Hermann
9 Monate zuvor

Hi, ich habe den Gaszähler wieder online. Einfach nochmal alles von vorne, dann funktionierte es. Aber: Der binary_sensor.gas_live_impuls reagiert zwar, der sensor.gas_gasverbrauch schreibt aber keine Werte, hier steht immer nur „0“. Habt ihr noch eine Idee?

Martin G
1 Jahr zuvor

Nach der Änderung auf ESPHome 6.2 sind folgende Zeilen zu ändern:
1. Um die Over the air update Funktion weiterhin zu nutzen:
# Alt
ota:
password: „xxxx“
# Neu
ota:
platform: esphome
password: „xxxx“
2. Um den Dallas Sensor weiterhin zu nutzen:
# Alt
dallas:
– pin: GPIOXX
sensor:
– platform: dallas
address: 0x1234567890abcdef
name: „MeinSensorname“
# Neu
one_wire:
– platform: gpio
pin: GPIOXX
sensor:
– platform: dallas_temp
address: 0x1234567890abcdef
name: „MeinSensorname“

Dann klappt der hier vorgestellte Gassensor weiterhin und läßt sich updaten.

Martin G
Antworte an  Martin G
1 Jahr zuvor

Meine Änderungen beziehen sich nur auf die ESPHome-Version ab: 2024.6.1 bzw 2024.6.0 (Juni 2024, Rev. 0 und 1). Der Sensor wird auch ohne Änderung weiterhin funktionieren kann dann jedoch nicht mehr neu kompiliert und OTA per Wlan übertragen werden (durch die zusätzliche OTA-Platform wird nun genau die Platform bezeichnet die die OTA-Update dann auch „ausschließlich“ durchführen darf) .
Die „One-Wire“ Sensoren werden zukünftig nicht nur auf Temperatursensoren beschränkt bleiben deswegen gibt es eine neue Obergruppe „one-wire“ wobei unser Temperatursensor jetzt die platform bezeichnung dallas_temp erhalten hat. Nur als Erklärung.

Christopher
1 Jahr zuvor

Wer hat nicht auch das Ziel, in seiner SmartHome-Umgebung seinen Energieverbrauch aufzuzeichnen. Bei vielen Tüftlern ist das bereits selbstverständlich. Neben dem aktuellen Stromverbrauch ist es auch möglich, den Gasverbrauch mit einem ESP8266 auszulesen. Gerade jetzt ist es umso wichtiger, seinen tatsächlichen Verbrauch von Erdgas im Auge zu behalten und mögliche Optimierungen festzustellen.
https://raphalang.de/blog/technik/esphome-gaszaehler/

Martin G
2 Jahre zuvor

Danke für die leicht nachzubauende Anleitung. Hat augenblicklich funktioniert.
Anmerkung: Mein verbauter Dallas Temperatursensor hatte eine individuelle Seriennummer, d.h. in dem Programm muss unter dem Sensor (Dallas) diese Seriennummer eingetragen werden (kann in Home-Assistant in Log-File von ESP-Home (Gaszähler) eingesehen werden. Außerdem habe ich die 3.3V-Versorgungsspannung anstatt den 5V-Pin für den Temperatursensor und das Gas-Signal genommen, funktioniert auch sehr gut.
Problematisch erachte ich das dauernde Schreiben in den Flash. Laut Spezifikation kann man 100000x in den Speicher Flaschen, Bei 0.01m^3 pro Inpuls wäre es möglich dass der Flasch nach 1000m^3 nicht mehr beschreibbar ist. Wie könnte ich das Programm umschreiben, dass das immer nur alle 100 Impulse (bei mir also 1m^3) in den Flash geschrieben wird?

Martin G
Antworte an  Martin G
1 Jahr zuvor

nochmals Dank für deine Anleitung:
ich habe im api:-Bereich noch die Zeile
api:

reboot_timeout: 0 # 0=nicht automatisch booten alternativ z.B. 24h
….
eingefügt. Somit überlebt das Modul eine etwas längers Funkstille meiner Home-Assistant-Instanz bzw. ein kurzzeitiger Ausfall des Wlan z.B. beim Flashen meiner Fritzbox ohne neu Standardmäßig nach 15 Minunten zu booten.Habe nämlich bemerkt dass bei Ausfall des Wlan (kommt bei mir gelegentlich vor) immer wieder von 0 gezählt wurde, weil irgendwann das esp32 neu gebootet hat.
Außerdem experimentiere ich mit dem ersetzen des „sensors:“ mit der „numbers:“-Komponenten welches ein Übertagen von Werten von HomeAssistant an das Modul ermöglicht. Klappt irgenwie noch nicht ganz obwohl ich schon Teilerfolge habe (vielleicht hat jemand eine Idee numers: sinnvoll einzusetzen)

Andreas
Antworte an  Martin G
1 Jahr zuvor

Hallo,

konntest du hier schon was erreichen bzgl. numbers?

Martin G
Antworte an  Andreas
1 Jahr zuvor

Bei mir läuft folgendes:
1. erstelle in HomeAssist einen Helfer (number) unter „Einstellungen“->“Geräte und Dieste“-> „Helfer“ -> „+Helfer Erstellen“ einen Helfer in dem später der zu setzende Zählerstand eingegeben werden kann
2. in esphome definiere einen sensor:homeassistant
sensor:
– platform: homeassistant
name: „Gaszählerstand“
id: Zaehlerstand # id zur interne verwendung
accuracy_decimals: 2
device_class: gas
unit_of_measurement: „m³“
state_class: „total“
icon: „mdi:fire“
entity_id: input_number.gaszahler_stand # das ist entity_id des helfers
internal: false # Rückgabe an Homeassist erlaubt

3. Verwenden der Daten
lambda: |-
id(Zaehlerstand).state += 0.01; # Beispiel wie man den Zählerstand ändert
id(Zaehlerstand).publish_state(id(Zaehlerstand).state); #Hier wird der Zähler zurück an Homeassist gegeben
5. Im Dashboard muss nun noch der Helfer (von Homeassist zum Setzen) und parrallel (lesend vom esp) angelegt werden.

Die total_pulses würde ich auf jeden Fall für das Energie-Dashboard nutzen (das funktioniert sehr gut) den Zählerstand parrallel auch übermittelt als (2. Sensorwert)

Simon Z
Antworte an  Martin G
1 Jahr zuvor

Hallo Martin.
Kannst du deine Settings auch für Anfänger (yaml Beispiel) etwas genauer erklären?
Irgendwie bekomme ich das so nicht hin.

Simon
Antworte an  Martin G
1 Jahr zuvor

Hallo Martin.
Kannst du für Anfänger deine Konfiguration mal posten?
Gruß
Simon

Edi
Antworte an  Martin G
1 Jahr zuvor

Hey Martin G,

das kannst Du ganz einfach mittels eines Dienstes machen:

api:
services:
– service: set_total_pulses
variables:
my_total_pulses: int
then:
– globals.set:
id: total_pulses
value: !lambda ‚return my_total_pulses;‘

Dann kannst du in HA unter Entwicklerwerkzeuge -> Dienste -> esphome***** die total_pulses setzen.

Gruss, Edi

Grisu
2 Jahre zuvor

Danke für die Anleitung.
Funktioniert einwandfrei und dank Olli bleibt der letzte Wert nach einem Neustart auch erhalten.

LG

Marco
2 Jahre zuvor

Moin
Super Anleitung!
Komischerweise bekomme ich seid dem letzten Esphome Update keine Werte mehr!
Hat noch jemand die Probleme?

Patrick
2 Jahre zuvor

Tolle Anleitung, habs testweise mal auf meine Hardware gespielt und funktionierte auf Anhieb. Was ich aber nicht ganz verstehe: Der Zähler beginnt bei jedem Einschalten des ESP wieder bei Null (Initialwert) – klar das gibt ja der Code vor. Aber ist das nicht unpraktisch? Sollte der ESP doch mal vom Strom getrennt werden, zählt er ja wieder von vorne los – kann Home Assistant damit umgehen oder was passiert in diesem Moment?
Wäre es nicht möglich (und besser) den Zählerstand remanent zu sichern?

Matthias J.
Antworte an  Stefan Hermann
2 Jahre zuvor

Hi, tolle Anleitung. Danke dir. Bzgl. der Thematik des Zählerstandes nach Stromausfall etc. – hast du dir da bereits Gedanken zu gemacht oder hast eine Lösung parat?

Antworte an  Stefan Hermann
2 Jahre zuvor

Hi Stefan,

habe heute dieses Projekt nachgebaut, echt tolle Anleitung.
Zu dem speichern bin ich wo anders drauf gestoßen.

esp8266:

restore_from_flash: true

und

globals:

restore_value: True

Ich hoffe das hilft weiter.
Gruß Olli

21
0
Ich würde mich über deine Meinung freuen.x