Anwendungsbeispiele#

In diesem Abschnitt sind verschiedene Anwendungsbeispiele für die Ferraris-Plattform beschrieben.

Auslesen des Stromzählers über den digitalen Ausgang des Infrarotsensors#

In dieser Variante wird der digitale Ausgang des Infrarotsensors verwendet, um Umdrehungen der Drehscheibe zu erkennen. Der analoge Ausgang wird nicht benötigt, die anderen Pins müssen mit den entsprechenden Pins des Mikrocontrollers verbunden werden. Für VCC sollte der 3,3V-Ausgang des ESPs verwendet werden und der digitale Ausgang D0 muss mit einem freien GPIO-Pin (z.B. GPIO4, entspricht dem Pin D2 auf dem D1 Mini) verbunden werden.

Der folgende Steckplatinen-Schaltplan zeigt ein Beispiel für einen Versuchsaufbau mit einem ESP8266 D1 Mini Entwicklungsboard als Mikrocontroller.

Steckplatinen-Schaltplan (digitaler Pin)

Die Kalibrierung des digitalen Ausgangssignals erfolgt mithilfe des auf der Platine des Infrarotsensors befindlichen Potentiometers, siehe Abschnitt Kalibrierung des digitalen Ausgangssignals für Details.

Hinweis

Sollte es nicht gelingen, eine passende und funktionierende Einstellung für das Potentiometer zu finden, kann alternativ der analoge Ausgang des Infrarotsensors verwendet werden, siehe nächsten Abschnitt.

Software-seitig muss für die Ferraris-Komponente in der YAML-Konfigurationsdatei der Pin konfiguriert werden, der mit dem digitalen Ausgang des TCRT5000-Moduls verbunden ist:

ferraris:
  id: ferraris_meter
  digital_input: GPIO4
  # ...

Beispiel-Konfiguration: ferraris_meter_digital.yaml

Auslesen des Stromzählers über den analogen Ausgang des Infrarotsensors#

In dieser Variante wird der analoge Ausgang des Infrarotsensors verwendet, um Umdrehungen der Drehscheibe zu erkennen. Der digitale Ausgang wird nicht benötigt, die anderen Pins müssen mit den entsprechenden Pins des Mikrocontrollers verbunden werden. Für VCC sollte der 3,3V-Ausgang des ESPs verwendet werden und der analoge Ausgang A0 muss mit einem freien ADC-Pin (z.B. GPIO17, entspricht dem Pin A0 auf dem D1 Mini) verbunden werden.

Der folgende Steckplatinen-Schaltplan zeigt ein Beispiel für einen Versuchsaufbau mit einem ESP8266 D1 Mini Entwicklungsboard als Mikrocontroller.

Steckplatinen-Schaltplan (analoger Pin)

Eine Kalibrierung mittels des Potientiometers auf dem TCRT5000-Modul entfällt. Stattdessen müssen software-seitig der Schwellwert für den analogen Eingang und optional die Versatzwerte für eine Hysterese-Kennlinie konfiguriert werden, siehe Abschnitt Kalibrierung des analogen Ausgangssignals für Details.

Software-seitig müssen nun beispielsweise folgende Konfigurations-Schritte durchgeführt werden:

In der YAML-Konfigurationsdatei wird ein ADC-Sensor konfiguriert, der den mit dem analogen Ausgang des TCRT5000-Moduls verbundenen ADC-Pin ausliest.

sensor:
  - platform: adc
    id: adc_input
    pin: GPIO17
    internal: true
    raw: true
    samples: 10
    update_interval: 50ms

Unter der Konfiguration der Ferraris-Komponente verweist der Eintrag analog_input auf den angelegten ADC-Sensor und der Eintrag analog_threshold gibt den analogen Schwellwert an (siehe Abschnitt Kalibrierung des analogen Ausgangssignals für weitere Informationen zum analogen Schwellwert). Zudem können optional die Versatzwerte off_tolerance und on_tolerance konfiguriert werden (siehe Abschnitt Hysterese-Kennlinie für weitere Details).

ferraris:
  id: ferraris_meter
  analog_input: adc_input
  analog_threshold: 45.0
  off_tolerance: 1.0
  on_tolerance: 1.0
  # ...

Beispiel-Konfiguration: ferraris_meter_analog.yaml

Auslesen mehrerer Stromzähler#

Es ist auch möglich, mehr als einen Ferraris-Stromzähler mit einem einzigen ESP-Mikrocontroller auszulesen. Dazu benötigt man weitere Infrarotsensoren / TCRT5000-Module und zusätzliche freie GPIO-Pins am Mikrocontroller. Die TCRT5000-Module werden wie schon vorher beschrieben über VCC und GND an die Spannungsquelle des ESP-Mikrocontrollers angeschlossen und die D0-Ausgänge werden jeweils mit einem freien GPIO-Pin an dem ESP-Board verbunden.

Bemerkung

Theoretisch kann auch die Variante mit dem analogen Ausgang des Infrarotsensors verwendet werden, allerdings sind die ADC-fähigen Pins auf den ESP-Mikrocontrollern stärker limitiert als die rein digitalen Pins. Insbesondere der ESP8266, der nur einen einzigen ADC hat, wäre daher ungeeignet, mehrere Infrarotsensoren über deren analoge Ausgänge zu unterstützen.

Der folgende Steckplatinen-Schaltplan zeigt ein Beispiel für einen Versuchsaufbau mit zwei TCRT5000-Modulen, die mit einem ESP8266 D1 Mini verbunden sind.

Steckplatinen-Schaltplan (2 TCRT5000-Module)

Es ist aber zu bedenken, dass jeder weitere Infrarotsensor die Last auf dem Mikrocontroller erhöht und insbesondere bei sehr hohen Geschwindigkeiten der Drehscheiben die Hardware näher an ihre Grenzen bringt.

Software-seitig müssen nun beispielsweise folgende Konfigurations-Schritte durchgeführt werden:

In der YAML-Konfigurationsdatei müssen mehrere Instanzen der Ferraris-Komponente konfiguriert werden (hier beispielhaft 2 Instanzen).

ferraris:
  - id: ferraris_meter_1
    digital_input: GPIO4
    # ...
  - id: ferraris_meter_2
    digital_input: GPIO5
    # ...

Alle von der Ferraris-Plattform bereitgestellten Sensoren und Komponenten müssen, sofern benötigt, vervielfacht und den entsprechenden Instanzen der Ferraris-Komponente über den Eintrag ferraris_id zugewiesen werden.

sensor:
  - platform: ferraris
    ferraris_id: ferraris_meter_1
    power_consumption:
      name: Power consumption 1
    energy_meter:
      name: Meter reading 1
  - platform: ferraris
    ferraris_id: ferraris_meter_2
    power_consumption:
      name: Power consumption 2
    energy_meter:
      name: Meter reading 2

binary_sensor:
  - platform: ferraris
    ferraris_id: ferraris_meter_1
    rotation_indicator:
      name: Rotation indicator 1
  - platform: ferraris
    ferraris_id: ferraris_meter_2
    rotation_indicator:
      name: Rotation indicator 2

switch:
  - platform: ferraris
    ferraris_id: ferraris_meter_1
    calibration_mode:
      name: Calibration mode 1
  - platform: ferraris
    ferraris_id: ferraris_meter_2
    calibration_mode:
      name: Calibration mode 2

Alle weiteren in der YAML-Konfigurationsdatei definierten Komponenten, die mit den Komponenten, Sensoren, Aktoren und Aktionen der Ferraris-Plattform interagieren, müssen eventuell vervielfacht und/oder angepasst werden.

Beispiel-Konfiguration: ferraris_meter_multi.yaml

Kalibrierung#

Während der Positionierung und Ausrichtung des Infrarotsensors sowie der Einstellung des Potentiometers oder des analogen Schwellwerts ist es wenig sinnvoll, die Umdrehungen der Drehscheibe des Ferraris-Stromzählers zu messen und die Verbräuche zu berechnen, da die Zustandsänderungen des Sensors nicht der tatsächlichen Erkennung der Markierung auf der Drehscheibe entsprechen. Deshalb gibt es die Möglichkeit, die Ferraris-Komponente in den Kalibrierungsmodus zu versetzen, indem man den Schalter für den Kalibrierungsmodus (siehe Aktoren) einschaltet. Solange der Kalibrierungsmodus aktiviert ist, wird keine Berechnung der Verbrauchsdaten durchgeführt und die entsprechenden Sensoren (siehe Primäre Sensoren) werden nicht verändert. Stattdessen ist der diagnostische Sensor für die Umdrehungsindikation (siehe Diagnostische Sensoren) aktiv und kann zusätzlich verwendet werden, um bei der korrekten Ausrichtung zu unterstützen. Der Sensor befindet sich in dem Zustand on wenn die Markierung auf der Drehscheibe erkannt wurde und off wenn keine Markierung erkannt wurde.

Um den Kalibierungsmodus optimal nutzen zu können, müssen die Komponenten calibration_mode und rotation_indicator in der YAML-Datei konfiguriert sein:

binary_sensor:
  - platform: ferraris
    rotation_indicator:
      name: Rotation indicator

switch:
  - platform: ferraris
    calibration_mode:
      name: Calibration mode

Kalibrierung des digitalen Ausgangssignals#

Mithilfe eines Schraubenziehers kann über das Potientiometer das digitale Ausgangssignal des Infrarotsensors kalibriert werden. Dabei helfen die beiden grünen LEDs auf der Rückseite des Sensors. Die rechte LED leuchtet dauerhaft, wenn der Sensor mit Strom versorgt wird. Die linke LED leuchtet, solange kein „Hindernis“ erkannt wurde und erlischt, wenn die Reflektion unterbrochen wurde. Letzteres ist der Zustand, wenn die Markierung auf der Drehscheibe des Ferraris-Stromzählers vor den Sensor wandert. Das Potentiometer sollte also so eingestellt werden, dass die linke LED gerade noch leuchtet, wenn die Markierung nicht im Bereich des Infrarot Sender/Empfänger-Paares ist und erlischt, sobald sich die Markierung davor schiebt. Dies ist nur ein sehr kleiner Bereich und es kann etwas schwierig werden, diese Einstellung zu finden.

Kalibrierung des analogen Ausgangssignals#

Das analoge Ausgangssignal des Infrarotsensors wird software-seitig je nach Präferenz entweder manuell oder automatisch kalibriert. Der Schwellwert analog_threshold steuert, wann das analoge Signal als „erkannt“ (markierter Bereich der Drehscheibe) und wann als „nicht erkannt“ (nicht markierter Bereich der Drehscheibe) behandelt wird. Ist der Wert des ADC-Sensors analog_input größer als der Schwellwert, gilt die Markierung als erkannt, ist er kleiner oder gleich, gilt sie als nicht erkannt.

Analoger Schwellwert

Für die manuelle Kalibrierung muss ein passender Wert für den analogen Schwellwert ermittelt und konfiguriert werden.

Wenn der Schwellwert ermittelt wurde und nicht mehr konfiguriert/verändert werden muss, kann ein fester Zahlenwert für analog_threshold angegeben werden:

ferraris:
  # ...
  analog_threshold: 45.0
  # ...

Wenn der Schwellwert noch nicht bekannt ist oder später über das User-Interface veränderbar sein soll, kann anstelle eines festen Zahlenwerts eine Template-Zahlen-Komponente (oder alternativ eine Home Assistant Zahlen-Komponente) eingetragen werden:

ferraris:
  # ...
  analog_threshold: adc_threshold
  # ...

number:
  - platform: template
    id: adc_threshold
    name: ADC threshold
    icon: mdi:speedometer-slow
    entity_category: config
    mode: box
    optimistic: true
    initial_value: 50.0
    min_value: 0.0
    max_value: 1000.0
    step: 0.5

Es ist auch möglich, den analogen Schwellwert automatisch von der Ferraris-Software berechnen zu lassen. Dies geschieht durch das Aufrufen der Aktion start_analog_calibration (siehe Aktionen). Dabei analysiert die Software eine konfigurierbare Anzahl analoger Samples vom Infrarotsensor und ermittelt den kleinsten und den größten analogen Wert. Anschließend wird das arithmetische Mittel aus den beiden Grenzwerten berechnet und als analoger Schwellwert verwendet.

Um den Status und das Ergebnis der automatischen analogen Kalibrierung zu überwachen, können zusätzliche diagnostische Sensoren konfiguriert werden. Diese zeigen an, ob die Kalibrierung gerade läuft, ob sie erfolgreich abgeschlossen wurde und wie hoch die ermittelte Bandbreite der analogen Werte ist.

sensor:
  - platform: ferraris
    # ...
    analog_value_spectrum:
      name: Analoge value spectrum

binary_sensor:
  - platform: ferraris
    # ...
    analog_calibration_state:
      name: Analog calibration state
    analog_calibration_result:
      name: Analog calibration result

Um die automatische Kalibrierung vom User-Interface aus starten zu können, kann ein Template-Button konfiguriert werden, der beim Drücken die Aktion aufruft:

button:
  - platform: template
    name: Start auto calibration
    icon: mdi:auto-fix
    entity_category: diagnostic
    on_press:
      - ferraris.start_analog_calibration:
          id: ferraris_meter
          num_captured_values: 6000
          min_level_distance: 6.0
          max_iterations: 3

Um die automatische Kalibrierung bei jedem Aufstarten des Mikrocontrollers zu starten, kann folgender Eintrag zur Konfiguration der Ferraris-Komponente hinzugefügt werden:

ferraris:
  # ...
  calibrate_on_boot:
    num_captured_values: 6000
    min_level_distance: 6.0
    max_iterations: 3
  # ...

Eine weitere Möglichkeit ist, die Kalibrierung über eine Automation in Home Assistant in regelmäßigen Intervallen oder unter bestimmten Bedingungen zu starten. Dafür führt man beispielsweise folgende Konfigurations-Schritte durch:

In der YAML-Konfigurationsdatei wird die Aktion für die Kalibrierung über die API für Home Assistant zugänglich gemacht.

api:
  # ...
  actions:
    - action: start_analog_calibration
      variables:
        num_captured_values: int
        min_level_distance: float
        max_iterations: int
      then:
        - ferraris.start_analog_calibration:
            id: ferraris_meter
            num_captured_values: !lambda "return num_captured_values;"
            min_level_distance: !lambda "return min_level_distance;"
            max_iterations: !lambda "return max_iterations;"

In Home Assistant wird eine Automation erstellt, die die benutzerdefinierte ESPHome-Aktion aufruft (im folgenden Beispiel wird die Kalibrierung gestartet, sobald seit mehr als einer Stunde keine Aktualisierung mehr vom Sensor übertragen wurde).

- id: '1234567890'
  alias: Re-calibrate electricity meter
  triggers:
      trigger: template
      value_template: '{{ now() - states.sensor.ferraris_meter_power_consumption.last_updated >= timedelta(hours=1) }}'
  conditions: []
  actions:
    - action: esphome.ferraris_meter_start_analog_calibration
      data:
        num_captured_values: 6000
        min_level_distance: 6.0
        max_iterations: 3
  mode: single

Alternativ kann in der Automation auch einfach ein Button-Druck des oben beschriebenen Buttons ausgelöst werden, sofern dieser konfiguriert wurde und ein Setzen der Kalibrierungsparameter von Home Assistant aus nicht nötig ist. In diesem Fall kann das Anlegen der Aktion entfallen.

Entprellung#

Der Übergang von nicht markiertem zu markiertem Bereich und umgekehrt auf der Drehscheibe kann zu einem schnellen Hin-und Herspringen („Prellen“) des Erkennungszustands des Sensors führen, das vor allem bei langsamen Drehgeschwindigkeiten auftritt und nicht vollständig durch die Kalibrierung unterdrückt werden kann. Dieses Prellen führt zu verfälschten Messwerten und um diese zu vermeiden, gibt es folgende Einstellungensmöglichkeiten.

Entprellungsschwellwert#

Der Entprellungsschwellwert debounce_threshold spezifiziert die minimale Zeit in Millisekunden zwischen fallender und darauffolgender steigender Flanke. Nur wenn die gemessene Zeit zwischen den zwei Flanken über dem konfigurierten Wert liegt, wird die Sensorauslösung berücksichtigt. Diese Art der Entprellung funktioniert bei der Verwendung sowohl des digitalen als auch des analogen Eingangssignals des Infrarotsensors.

Entprellungsschwellwert

Um eine Entprellung über den Schwellwert zu aktivieren, muss der entsprechende Wert in der Konfiguration der Ferraris-Komponente gesetzt werden:

ferraris:
  # ...
  debounce_threshold: 400
  # ...

Wenn der Wert dynamisch über das User-Interface einstellbar sein soll, kann anstelle eines festen Zahlenwerts eine Template-Zahlen-Komponente (oder alternativ eine Home Assistant Zahlen-Komponente) eingetragen werden:

ferraris:
  # ...
  debounce_threshold: debounce_threshold
  # ...

number:
  - platform: template
    id: debounce_threshold
    name: Debounce threshold
    icon: mdi:speedometer-slow
    entity_category: config
    mode: box
    optimistic: true
    initial_value: 400
    min_value: 0
    max_value: 2000
    step: 1

Hysterese-Kennlinie#

Die beiden Versatzwerte off_tolerance (Ausschalttoleranz) und on_tolerance (Einschalttoleranz) können konfiguriert werden, um eine Hysterese-Kennlinie für die Erkennung des markiertes Bereichs auf der Drehscheibe über das analoge Signal zu verwenden. Dadurch wird ein „Zittern“ des analogen Signals kompensiert und damit ein mögliches Prellen des Erkennungszustands für den markierten Bereich auf der Drehscheibe minimiert. Diese Art der Entprellung funktioniert nur bei der Verwendung des analogen Eingangssignals des Infrarotsensors.

Hysterese-Kennlinie

Um eine Entprellung über die Hysterese-Kennlinie zu aktivieren, müssen die entsprechenden Werte in der Konfiguration der Ferraris-Komponente gesetzt werden:

ferraris:
  # ...
  off_tolerance: 1.0
  on_tolerance: 1.0
  # ...

Wenn die Werte dynamisch über das User-Interface einstellbar sein sollen, können anstelle der festen Zahlenwerte Template-Zahlen-Komponenten (oder alternativ Home Assistant Zahlen-Komponenten) eingetragen werden:

ferraris:
  # ...
  off_tolerance: off_tolerance
  on_tolerance: on_tolerance
  # ...

number:
  - platform: template
    id: off_tolerance
    name: Hysteresis switch-off tolerance
    icon: mdi:speedometer-slow
    entity_category: config
    mode: slider
    optimistic: true
    initial_value: 1.0
    min_value: 0.0
    max_value: 5.0
    step: 0.5
  - platform: template
    id: on_tolerance
    name: Hysteresis switch-on tolerance
    icon: mdi:speedometer-slow
    entity_category: config
    mode: slider
    optimistic: true
    initial_value: 1.0
    min_value: 0.0
    max_value: 5.0
    step: 0.5

Glättung des analogen Signals#

Durch eine geschickte Konfiguration des Aktualisierungsintervalls update_interval und der Anzahl Abtastungen pro Aktualisierung (samples) für den analogen Sensor analog_input kann die Kurve des analogen Signals so weit geglättet werden, dass kurzfristige Schwankungen eliminiert werden. Es ist aber zu bedenken, dass zu große Aktualisierungsintervalle dazu führen können, dass einzelne Umdrehungen bei sehr hohen Drehgeschwindigkeiten nicht mehr erkannt werden, da dann die Zeit zwischen steigender und darauffolgender fallender Flanke kleiner als das eingestellte Aktualisierungsintervall ist. Auch diese Art der Entprellung funktioniert nur bei der Verwendung des analogen Eingangssignals des Infrarotsensors.

Interpolation bei fallenden Stromverbräuchen#

Niedrige Stromverbräuche äußern sich in einer langsamen Geschwindigkeit der Drehscheibe. Dies führt dazu, dass die Markierung auf der Drehscheibe nur selten am Sensor vorbei fährt und dadurch aktualisiert sich der Stromverbrauch ebensfalls nur in großen Zeitabständen. Besonders störend ist dies, wenn ein hoher Stromverbrauch vorliegt und dieser sich dann rasch absenkt. In diesem Fall dauert es sehr lang, bis der neue niedrige Stromverbrauch gemeldet wird, da es lange dauert, bis die Markierung wieder den Sensor passiert. In dieser Zeit wird dann weiterhin ein hoher Stromverbrauch angezeigt, obwohl der tatsächliche Stromverbrauch viel niedriger ist.

Um diesem Effekt entgegenzuwirken, kann die Ferraris-Komponente bei Übergängen von hohen zu niedrigen Stromverbräuchen den tatsächlichen Verbrauchsverlauf interpolieren und sich somit dem tatsächlichen Stromverbrauch immer weiter annähern, bis der tatsächliche Stromverbrauch nach Detektierung der Markierung berechnet und gemeldet wird.

Die Interpolation kann über das Interpolationsintervall interpolation_interval gesteuert werden. Ein Wert von 0 deaktiviert die Interpolation, ansonsten gibt der Wert die Dauer der Intervalle in Sekunden an, zu denen ein interpolierter Stromverbrauch berechnet wird.

Manuelles Überschreiben des Zählerstands#

Um den Zählerstand in der Ferraris-Komponente mit dem tatsächlichen Zählerstand des Ferraris-Stromzählers abzugleichen, kann der Wert des Verbrauchszähler-Sensors explizit überschrieben werden. Dazu werden die zwei Aktionen ferraris.set_energy_meter und ferraris.set_rotation_counter (siehe Aktionen) zur Verfügung gestellt.

Hinweis

Normalerweise ist nur eine der beiden Aktionen nötig, je nachdem, ob man den Zählerstand in Kilowattstunden oder lieber in Anzahl Umdrehungen setzen möchte.

Abhängig davon, ob das Setzen des Zählerstands händisch über das User-Interface oder automatisiert über Automationen und Skripte erfolgen soll, können die Aktionen auf unterschiedliche Weise verwendet werden. Nachfolgend sind zwei mögliche Anwendungsbeispiele beschrieben, es gibt aber noch weitere, hier nicht beschriebene Möglichkeiten.

Händisches Setzen des Zählerstands über das User-Interface#

Dafür führt man beispielsweise folgende Konfigurations-Schritte durch (in diesem Beispiel zum Setzen des Zählerstands als Kilowattstunden-Wert):

In der YAML-Konfigurationsdatei wird eine Template-Zahlen-Komponente angelegt und für einen Zählerstand in der Einheit Kilowattstunden konfiguriert.

number:
  - platform: template
    id: target_energy_value
    name: Manual meter reading
    icon: mdi:counter
    unit_of_measurement: kWh
    device_class: energy
    entity_category: config
    mode: box
    optimistic: true
    min_value: 0
    max_value: 1000000
    step: 0.01

In der YAML-Konfigurationsdatei wird ein Template-Button angelegt und so konfiguriert, dass beim Drücken die Aktion zum Setzen des Zählerstands ausgeführt wird. Der zu übergebende Zielwert wird dabei aus der angelegten Zahlen-Komponente gelesen.

button:
  - platform: template
    name: Overwrite meter reading
    icon: mdi:download
    entity_category: config
    on_press:
      - ferraris.set_energy_meter:
          id: ferraris_meter
          value: !lambda |-
            float val = id(target_energy_value).state;
            return (val >= 0) ? val : 0;

Automatisiertes Setzen des Zählerstands#

Dafür führt man beispielsweise folgende Konfigurations-Schritte durch:

In der YAML-Konfigurationsdatei wird eine benutzerdefinierte Aktion angelegt, die eine der Ferraris-Aktionen (im folgenden Beispiel die Aktion ferraris.set_energy_meter) aufruft.

api:
  # ...
  actions:
    - action: set_energy_meter
      variables:
        target_value: float
      then:
        - ferraris.set_energy_meter:
            id: ferraris_meter
            value: !lambda |-
              return (target_value >= 0)
                        ? target_value
                        : 0;

In Home Assistant wird eine Automation erstellt, die die benutzerdefinierte ESPHome-Aktion aufruft (im folgenden Beispiel wird der Zählerstand am Anfang eines jeden Monats zurückgesetzt).

- id: '1234567890'
  alias: Reset energy meter reading
  trigger:
    - platform: time
      at: 00:00:00
  condition:
    - condition: template
      value_template: '{{ now().day == 1 }}'
  action:
    - action: esphome.ferraris_meter_set_energy_meter
      data:
        target_value: 0
  mode: single

Wiederherstellung des Zählerstands nach einem Neustart#

Um die Lebensdauer des Flash-Speichers auf dem ESP-Mikrocontroller nicht zu verringern, speichert die Ferraris-Komponente keine Daten persistent im Flash. Dadurch kann sie sich zunächst einmal den Zählerstand über einen Neustart des Mikrocontrollers hinweg nicht merken und der Zähler beginnt bei jedem Boot-Vorgang bei 0 kWh zu zählen. Somit müsste man nach jedem Neustart den Zählerstand manuell durch einen am Ferraris-Stromzähler abgelesenen Wert überschreiben. Da dies nicht sehr benutzerfreundlich ist, gibt es die Möglichkeit, den letzten Zählerstand in Home Assistant zu persistieren und beim Booten des Mikrocontrollers an diesen zu übertragen.

Damit dies funktioniert, müssen beispielsweise folgende Konfigurations-Schritte durchgeführt werden:

In Home Assistant wird ein Zahlenwert-Eingabehelfer angelegt (in diesem Beispiel mit der Entitäts-ID input_number.electricity_meter_last_value). Anschließend wird in der YAML-Konfigurationsdatei eine Home Assistant Zahlen-Komponente angelegt, die den angelegten Zahlenwert-Eingabehelfer importiert.

number:
  - platform: homeassistant
    id: last_energy_value
    entity_id: input_number.electricity_meter_last_value

Unter der Konfiguration der Ferraris-Komponente verweist der Eintrag energy_start_value auf die angelegte Zahlen-Komponente.

ferraris:
  # ...
  energy_start_value: last_energy_value

In Home Assistant wird eine Automation erstellt, die bei Änderung des Verbrauchszähler-Sensors den aktuellen Sensorwert in den angelegten Zahlenwert-Eingabehelfer kopiert.

- id: '1234567890'
  alias: Update meter reading cache
  trigger:
  - platform: state
    entity_id:
      - sensor.ferraris_meter_energy
  condition: []
  action:
  - action: input_number.set_value
    target:
      entity_id: input_number.electricity_meter_last_value
    data:
      value: '{{ states(trigger.entity_id) }}'
  mode: single

Alternativ kann auch eine Sensor-Automation für den Sensor energy_meter in der YAML-Konfigurationsdatei angelegt werden, die die angelegte Zahlen-Komponente direkt von ESPHome aus aktualisiert. Allerdings verlängert dies die Verarbeitungszeit pro Umdrehung im Mikrocontroller und kann u.U. dazu führen, dass bei sehr hohen Stromverbräuchen (und damit sehr hohen Drehgeschwindigkeiten) einzelne Umläufe der Drehscheibe nicht erfasst werden. Daher empfehle ich die Variante mit der Automation in Home Assistant.