Ich domotisiere meinen Wasserverbrauch

Dieser Artikel knüpft an den vorhergehenden Artikel an:

Ich wollte einen D1 Mini durch einen D1 Mini ersetzen. D1 Mini V4 Neue Version.

D1 Mini V4

Das vorherige war mit Esp Easy geflasht, das neue habe ich mit ESP Home geflasht.

Hier die beiden Tutorials:

Sobald der D1 Mini V4 Wenn ich mit Esp Home blitze, fahre ich mit dem Setup fort.

Ich nutze die Änderung von D1Mini, um den Widerstand der Teilerbrücke zwischen A0 und GND zu ersetzen, ich setze eine 51K. Der Wert dieses Widerstands richtet sich nach dem Wert des Widerstands bei 25 °C (manuell vor der Installation zu messen).

Zur Erinnerung, hier ist das Verdrahtungsschema

Die Verkabelung des D1 Mini ist unverändert, daher reproduziere ich das Schema mit dem D1 Mini V4.

Weitere Erläuterungen finden Sie auf dieser Seite:

Ich führe die Konfiguration der Yaml-Datei des ESP Home-Geräts durch

Sobald der D1 Mini-V4-Blitz, gehe ich zu ESPHome Builder und finde meine Ausrüstung:

ESPHome Builder

Ich klicke auf EDIT und bearbeite die yaml-Datei, hier ist die Konfiguration:

Substitutionen: name: esphome-web-e586c5 friendly_name: ESPHome Heißes Wasser esphome: name: ${name} friendly_name: ${friendly_name} min_version: 2024.6.0 name_add_mac_suffix: false project: name: esphome.web version: dev esp8266: Board: esp01_1m # Logger-Protokollierung aktivieren: # Aktivieren Sie die API Home Assistant api: # Over-The-Air-Ota-Updates zulassen: - platform: Esphome # Wi-Fi-Konfiguration über den seriellen Port improv_serial zulassen: WiFi: # Einrichten eines Wi-Fi-AP-Hotspots: {} # In Kombination mit der Option ¿ap¿ ermöglicht dies dem Benutzer # Wi-Fi-Anmeldeinformationen über die Wi-Fi-AP konfigurieren. captive_portal: dashboard_import: _import_url-Paket: github://esphome/example-configs/esphome-web/esp8266.yaml@main import_full_config: true # Um eine "nächste URL" für improv_serial web_server zu erhalten: sensor: - platform: ntc sensor: temp_resistance name: "Temperatur" unit_of_measurement: "°C" accuracy_decimals: 2 Kalibrierung: b_constant: 3950 reference_temperature: 25°C reference_resistance: 50kOhm - platform: resistance id: temp_resistance sensor: temp_voltage Konfiguration: DOWNSTREAM resistor: 50kOhm reference_voltage: 3.3V - Plattform: adc pin: A0 id: temp_voltage # Turbinensensor für kaltes Wasser - platform: pulse_meter pin: Nummer: GPIO13 Modus: Input: True Pullup: true name: 'Trinkwasserdurchsatz' unit_of_measurement: 'L/min' accuracy_decimals: 0 internal_filter: 100ms timeout: 5s filters: - multiply: 0.013 insgesamt: name: 'Total Trinkwasser' unit_of_measurement: 'Die ID: total_eau_potable accuracy_decimals: 2 filters: - multiply: 0.013 # Turbinensensor für Warmwasser - platform: pulse_meter pin: Nummer: GPIO14 Modus: Input: True Pullup: true name: 'Warmwasserdurchfluss' unit_of_measurement: 'L/min' accuracy_decimals: 0 internal_filter: 100ms timeout: 5s filters: - multiply: 0.013 # 1/77 insgesamt: name: 'Total Conso Warmwasser' unit_of_measurement: 'Die ID: total_eau_chaude accuracy_decimals: 2 filters: - multiply: 0.013 # 1/77 # Calculated sensor for net cold water consumption - Plattform: template name: "Total Conso Kaltwasser" unit_of_measurement: "L" accuracy_decimals: 2 Lambda: |- return id(total_eau_potable).state - id(total_eau_chaude).state;

 

In wenigen Zeilen wird dies erläutert:

Temperatursensor (NTC):

  • Verwendet einen NTC-Thermistor
  • Messung in °C mit 2 Dezimalstellen
  • Kaskadenkonfiguration: ADC (A0) → Widerstand → ntc
  • Kalibriert mit einer B-Konstante von 3950 und einem Bezug auf 25°C/50kΩ

Zwei Wasserdurchflusssensoren (pulse_meter):

  • Trinkwasser auf GPIO13, Warmwasser auf GPIO14
  • Konfiguration im Input-Modus mit aktiviertem Pullup
  • Umrechnung: multipliziert mit 0,013 (kalibriert auf 77 Impulse/L)
  • 5s-Timeout (Rückgang auf 0, wenn keine Impulse vorhanden sind)
  • 100ms interner Filter zur Stabilisierung der Wiedergabe
  • Jeder hat einen Gesamtzähler in Litern
  • Präzisierung: 0 Dezimalstellen für den Durchsatz, 2 Dezimalstellen für den Gesamtdurchsatz

Ein berechneter Sensor:

  • Berechnet den Kaltwasserverbrauch
  • Formel: Trinkwasser insgesamt – Warmwasser insgesamt
  • Präzisierung: 2 Dezimalstellen

Ich wähle die Sensoren aus, die ich behalte

Auswahl der Sensoren

Ich behalte die letzten 4 Sensoren, schalte die anderen aus und benenne sie um in:

  • sensor.temperature_eau_chaude
  • sensor.esphome_total_Wasser_potable
  • sensor.esphome_total_eau_chaude
  • sensor.esphome_total_Wasser_kalt

Umbenennen von Sensoren

Umbenennen von Sensoren

Ich füge 3 Offsetsensoren hinzu

Wenn der D1 Mini V4 neu gestartet wird (z.B. Saftausschnitt), beginnt die Zählung wieder bei Null.

Daher habe ich die Berechnung der Gesamtzählung über einen Sensor organisiert, der mir die Summe aus einem Offset und dem Wert der laufenden Zählung gibt.

Daher habe ich drei Offset-Einheiten hinzugefügt. Für Puristen sind nur zwei obligatorisch, der 3. kann berechnet werden.

Also habe ich unter Einstellungen/Geräte und Dienste/Einträge einen Eintrag hinzugefügt.

Hinzufügen eines Eintrags

Und dann die Zahl

Hinzufügen einer Zahl

Konfigurieren der Anzahl

Dadurch erschaffe ich input_number.eau_froide_offset.

Ich mache das für die beiden anderen Offset

Konfigurieren von Offsets

Ich habe mich dafür entschieden, „Trinkwasser“ für alles zu verwenden, was in den Trinkwasserzähler gelangt, also den Gesamtverbrauch: kaltes Wasser + heißes Wasser.

Ich füge 3 Automatisierungen hinzu, um den Zähler-Reset des D1 Mini zu verwalten

Der D1 Mini hat einen Fehler in der Größe, er verliert den Wert seiner Zähler im Falle eines Reset, so dass alles bei Null beginnt, also passt es mir nicht.

Mir ist aufgefallen, dass die Sensoren zum Zeitpunkt des Reset in den Zustand „unavailable“ wechseln, bevor sie auf Null zurückgesetzt werden.

Ich werde daher den vorherigen Zustand unavailable einem Input_number zuordnen, der mir als Offset, d. h. als Korrekturwert für die Gesamtzählung, dienen wird.

Um es einfacher zu machen, mache ich 3 Automatisierungen, die dies realisieren:

alias: Offset Heißwasser auf Unavailable triggers: - entity_id: sensor.esphome_total_eau_chaude to: unavailable trigger: state actions: - target: entity_id: input_number.eau_chaude_offset data: value: >- {{ states('input_number.eau_chaude_offset') | float + trigger.from_state.state | float }} Aktion: input_number.set_value mode: Single alias: Offset Kaltes Wasser auf Unavailable triggers: - entity_id: sensor.esphome_total_eau_froide to: unavailable trigger: state actions: - target: entity_id: input_number.eau_froide_offset data: value: >- {{ states('input_number.eau_froide_offset') | float + trigger.from_state.state | float }} Aktion: input_number.set_value mode: Single alias: Offset Wasser Trinkbar auf Unavailable triggers: - entity_id: sensor.esphome_total_eau_potable to: unavailable trigger: state actions: - target: entity_id: input_number.eau_potable_offset data: value: >- {{ states('input_number.eau_potable_offset') | float + trigger.from_state.state | float }} Aktion: input_number.set_value mode: Single

Für jede Art von Wasser (warm, kalt, trinkbar), wenn der Sensor nicht mehr verfügbar ist (‚unavailable‘):

  • Automatisierung erfasst den letzten bekannten Wert vor der Trennung
  • Dieser Wert wird einem Offsetzähler hinzugefügt, der in einem _number-Input gespeichert ist.
  • Dadurch bleibt die Gesamtkumulierung auch nach einem Neustart des Sensors erhalten

Automatisierung

Ich deklariere die Endverbrauchssensoren

In meiner Datei templates.yaml füge ich diese drei Sensoren hinzu:

Endsensoren
- sensor: - name: "Verbrauch Trinkwasser" einzigartig_id: sensor.consumation_eau_potable unit_of_measurement: "L" device_class: water state_class: total_increasing state: > {% set measure_aktuell = states('sensor.esphome_total_eau_potable') | float %} {% set total_offset = states('input_number.eau_potable_offset') | float %} {{ total_offset + Maß_aktuell if states('sensor.esphome_total_eau_potable') != 'unavailable' else total_offset }} - name: "Verbrauch Kaltes Wasser" einzigartig_id: sensor.consumation_eau_froide unit_of_measurement: "L" device_class: water state_class: total_increasing state: > {% set measure_aktuell = states('sensor.esphome_total_eau_froide') | float %} {% set total_offset = states('input_number.eau_froide_offset') | float %} {{ total_offset + Maß_aktuell if states('sensor.esphome_total_eau_froide') != 'unavailable' else total_offset }} - name: "Warmwasserverbrauch" einzigartig_id: sensor.consumation_eau_chaude unit_of_measurement: "L" device_class: water state_class: total_increasing state: > {% set measure_aktuell = states('sensor.esphome_total_eau_chaude') | float %} {% set total_offset = states('input_number.eau_chaude_offset') | float %} {{ total_offset + Maß_aktuell if states('sensor.esphome_total_eau_chaude') != 'unavailable' else total_offset }}      

Bei diesen Sensoren handelt es sich um virtuelle Sensoren (Templates), mit denen der Wasserverbrauch dauerhaft überwacht werden kann. Analysieren wir, wie sie funktionieren:

Datenquellen:

  • Physikalische Sensoren ESP Home (sensor.esphome_total_eau_*)
  • Offsetzähler (input_number.eau_*_offset)

Arten von Maßnahmen:

  • Trinkwasser: Zulaufwasser insgesamt
  • Warmwasser: Warmwasserverbrauch
  • Kaltwasser: Kaltwasserverbrauch

Gemeinsame Merkmale:

  • state_class: total_increasing: Zeigt einen Zähler an, der kontinuierlich ansteigt
  • unit_of_measurement: „L“: Messung in Litern

Funktionslogik:

{% set measurement_aktuell = states(‚sensor.esphome_total_eau_*‘) | float %}
{% set total_offset = states(‚input_number.eau_*_offset‘) | float %}
{{ total_offset + Maß_aktuell if states(…) != ‘unavailable’ else total_offset }}

  • Wenn der ESP-Sensor verfügbar ist: Insgesamt = Offset + aktuelle Maßnahme
  • Wenn der ESP-Sensor nicht verfügbar ist: Total = nur Offset

Ich konfiguriere Recorder

Man muss daran denken, das zu behalten, was man braucht, aber auch daran, nicht aufzuzeichnen, was nicht nützlich ist.

So setze ich in der Recorder-Konfiguration Folgendes ein:

  include: entity_globs: [...] - input_number.eau_* - sensor.consumation_eau_* ausgeschlossen: entity_globs: [...] - sensor.esphome*    

Ich teste das Reset des D1 Mini V4

Am Ende habe ich also

  • 3 input_number, die als Offset dienen,
  • 3 Sensoren, die mir den Wert der aktuellen Zähler des D1 Mini geben
  • 3 berechnete Sensoren, die mir den Wert der permanenten Zähler geben

Reset-Test

Zu diesem Zeitpunkt hat sich der D1 nie wieder erholt, so dass die Zähler des D1 und die Dauerzähler identisch sind.

Ich stecke den D1 mini ab und wieder ein, die Sensoren werden für die Zeit des Reset nicht mehr verfügbar sein und dann auf 0 zurückgehen.

Zurücksetzen des D1 Mini

Zu diesem Zeitpunkt nehmen die Offsets die letzten Werte der Zähler. Dann verbindet sich der D1 mini wieder mit dem Home Assistant:

Verbindung zum D1 Mini

Die Dauerzähler nehmen den Offsetwert + den Zählerwert des D1 (0) auf.

Ich gieße ein wenig heißes und ein wenig kaltes Wasser, die Offsetdrucke bewegen sich nicht, aber die Zähler zeigen die richtigen Werte an:

Verbrauchstest

Ich behalte also nur die letzten 3 Zähler für mein Dashboard und für die conso-Statistiken.

Ergebnis

Endergebnis

Endergebnis

Endergebnis

Sollte dies noch einmal geschehen (Ideen oder Rückmeldungen)

  • Ich würde eine Turbine mit Temperatursensor auch für kaltes Wasser verwenden, ich bin neugierig, die Temperatur vor allem im Winter wissen zu wollen.