Skip to content

Instantly share code, notes, and snippets.

@djmaze
Created November 28, 2022 22:47
Show Gist options
  • Save djmaze/852c27c37f4f223f346782635b93b1ae to your computer and use it in GitHub Desktop.
Save djmaze/852c27c37f4f223f346782635b93b1ae to your computer and use it in GitHub Desktop.
ESPHome-Config, um einen Gaszähler per Reed-Kontakt auszulesen
globals:
- id: total_pulses
type: int
restore_value: true
initial_value: '0' # startet mit 0
- id: imp_ratio
type: float
restore_value: false
initial_value: '0.01' # vom Gaszaehler
- id: Zustandszahl
type: float
restore_value: false
initial_value: '0.9643' # aus der Gasrechnung
- id: Brennwert
type: float
restore_value: false
initial_value: '10.276' # aus der Gasrechnung
- id: initial_consumption
type: float
restore_value: false
initial_value: '19967086' # hier kann der Gaszählerstand initialisiert werden (Faktor 1000 um einen genaueren Wert zu erzeugen)
- id: initial_energy_consumption
type: float
restore_value: false
initial_value: id(initial_consumption) * id(Brennwert) * id(Zustandszahl) / 1000.0
binary_sensor:
- platform: gpio
id: internal_pulse_counter
pin:
number: GPIO5 # Pin, an dem der Reed-Kontakt hängt
mode: INPUT_PULLUP
name: "Live-Impuls"
filters:
- delayed_on: 100ms
on_press:
then:
- lambda: id(total_pulses) += 1;
#- light.turn_on:
# id: led # optional: für eine LED, die den Gaszählerpuls visualisiert
#on_release:
# then:
# - light.turn_off: status # optional: für eine LED, die den Gaszählerpuls visualisiert
## Optional: Diese LED soll blinken, sobald ein Signal vom Gaszähler erkannt wird
#output:
#- platform: gpio
#pin: GPIO0
#id: 'led'
sensor:
- platform: template
name: "Gasverbrauch"
device_class: gas
update_interval : 10s
unit_of_measurement: "m³"
state_class: total_increasing
icon: "mdi:fire"
accuracy_decimals: 2
lambda: return (id(initial_consumption)/1000.0) + (id(total_pulses) * id(imp_ratio));
- platform: template
name: 'Gasverbrauch Energy'
device_class: energy
state_class: total_increasing
update_interval : 10s
icon: 'mdi:fire'
accuracy_decimals: 1
unit_of_measurement: "kWh"
lambda: return id(initial_energy_consumption) + (id(total_pulses) * id(imp_ratio) * id(Brennwert) * id(Zustandszahl));
- platform: template
name: 'Pulse Counter total'
update_interval : 10s
icon: "mdi:counter"
accuracy_decimals: 0
unit_of_measurement: "pulses"
lambda: return id(total_pulses);
@djmaze
Copy link
Author

djmaze commented Nov 28, 2022

Das ist nur der spezifische Ausschnitt für die Gastherme. Zusätzlich braucht es natürlich noch mindestens die Sektionen esphome, wifi und mqtt (oder api).

@Bazooka2304
Copy link

Hallo, vielen Dank für den Code. Ich habe manchmal negative Werte, hast du eine Idee woran das liegen kann? Viele Grüße
Screenshot 2023-01-02 121337

@djmaze
Copy link
Author

djmaze commented Jan 2, 2023

@Bazooka2304

Hallo, vielen Dank für den Code. Ich habe manchmal negative Werte, hast du eine Idee woran das liegen kann? Viele Grüße

Nein, das Problem hatte ich noch nie.

Wie in den Kommentaren im Blogpost diskutiert gibt es bei dir evtl. eine Nachtabschaltung des WLANs?

Alternativ: kann es sein, dass dein ESP (aus welchem Grund auch immer) regelmäßig crasht und dabei der letzte Stand nicht sauber gespeichert wird? So oder so wäre es wohl sinnvoll, wenn du auf einer Maschine mal die Logs des ESPs verfolgst / wegspeicherst, bis das Problem wieder auftritt.

@CoolyMcCool
Copy link

Hi,

Kannst du mit dem Code (den ich übrigens auch nutze) den Flash resetten?

ich pack es nicht. Entweder ich deaktiviere den Flash und habe den aktuellen Wert oder er nutzt immer den letzten WErt. ich würde gerne erstmal den richtigen WErt haben :-)
DAnke

@djmaze
Copy link
Author

djmaze commented Nov 26, 2023

Hi @CoolyMcCool ,

das habe ich tatsächlich noch nie probiert. (Bei mir lief das Ganze von Beginn an problemlos und mit 100% Uptime, so dass ich es nie wieder anfassen musste.)

Meinst du tatsächlich einen kompletten Flash-Reset oder nur das Ändern der initial_consumption?

@CoolyMcCool
Copy link

Hi
Sorry hatte keine Benachrichtigung bekommen dass du mir geantwortet hattest...
Ich zumindest der Verbrauch der auf der Anzeige steht wäre nett wenn ich ihn zurücksetzen könnte.
Hab bspw. Letztens einen neuen Zähler eingebaut bekommen...

@djmaze
Copy link
Author

djmaze commented Mar 19, 2024

Eventuell reicht es, wenn du einmal die Firmware neu deployst mit restore_value: false bei total_pulses. (Also Zeile 4 im obigen Code.) Und direkt danach wieder mit restore_value: true. Habe das aber noch nicht ausprobiert.

@CoolyMcCool
Copy link

Hi,
Danke. Da es derzeit aber läuft fass ich es grade nicht an. Beim letzten mal hab ich ne ganze weile per Magneten Pulse hinzuaddiert :-D bzw. des ganze eine bestimmte Weile abgesteckt gelassen. Aber vielleicht brauche ich es nochmal dann versuche ich es bestimmt. ich hatte schon mit den Werten rumgespielt, aber nichts sinnvolles erreicht.
Danke auf jeden Fall.

@Uhwah
Copy link

Uhwah commented Aug 6, 2024

Hallo,
ich habe mir den Gaszähler nachgebaut. Funktioniert soweit einwandfrei. Vielen Dank für den Code!
Einen Schönheitsfehler habe ich jedoch entdeckt. Beim übertragen zu HomeAssistant werden immer 5 Nachkommastellen im Log angezeigt, jedoch nicht wie erwartet 15494,86000 m3 sondern 15494,86035m3. Ich kann mir nicht erklären wie das zu Stande kommt.
Wenn ich die Formel im Code mit dem Taschenrechner nachrechne komme ich auf die richtigen werte.
Hast du eine Idee was das Problem sein könnte?

Ohne Titel 3
Globals

@djmaze
Copy link
Author

djmaze commented Aug 9, 2024

Mhh, kann ich mir so direkt nicht erklären.

@Nappyy
Copy link

Nappyy commented Sep 29, 2024

Danke für den Code, funktioniert bei mir nun seit einiger Zeit sauber.
Allerdings hab ich irgendwie 2 Impulse zu viel gezählt.. vielleicht stand mal der Magnet ungünstig als ich durchgestartet hatte… oder wie auch immer..

jedenfalls frage ich mich nun wie ich den Counter am elegantesten korrigieren kann.
klar könnte ich den Reed mal für zwei Impulse abklemmen.. aber vielleicht hast du oder wer anders eine schönere Idee :)

Danke!

@Nappyy
Copy link

Nappyy commented Oct 1, 2024

Ich habe mir nun noch zwei Buttons hinzugefügt um eventuell fehlerhafte Zählungen zu korrigieren:

button:

  • platform: template
    name: "Gas Zählerstand erhöhen"
    id: internal_pulse_increment
    on_press:
    then:
    - lambda: id(total_pulses) += 1;
  • platform: template
    name: "Gas Zählerstand reduzieren"
    id: internal_pulse_decrement
    on_press:
    then:
    - lambda: id(total_pulses) -= 1;

@djmaze
Copy link
Author

djmaze commented Oct 3, 2024

jedenfalls frage ich mich nun wie ich den Counter am elegantesten korrigieren kann.

Tatsächlich hatte ich das noch nicht gemacht. (Es war mir auch relativ egal, eine 99,999%ige Zählung reicht mir vollkommen.)

Wenn man es auf einen bestimmten Wert setzen will, könnte man halt einen Code einfügen, der z.b. total_pulses auf einen festen Wert setzt. Das Ganze dann einmalig flashen und damit booten, und dann diesen Code wieder rausnehmen und neu flashen. Ich weiß, sehr hässlich. (Oder irgendwie einen service einbauen, mit dem man den Wert setzen kann?)

Deine Methode ist aber vermutlich deutlich hilfreicher, wenn es nur um kleine Korrekturen geht.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment