Read DaheimLaden Wallbox via Modbus-(proxy) and EVCC

I made an integration of the DaheimLaden Wallbox for myself using the HA Modbus integration. I control the wallbox via EVCC from a different IP address, (it could be done by HA or by EVCC, but I don’t need to control it via HA).

Note: The modbus server just allows one connection, because of this I installed the HACS modbusproxy add-on to query the values from the Modbus). If you don’t need that, you don’t need the modbus proxy.

It is still working but I cannot say for sure until now if it’s working wihtout any issues. It needs some more testing:

Added this to the configuration.yaml:

# Modbus TCP
modbus:
  - name: "DaheimLader"
    type: tcp
    host: 10.10.20.16
    port: 502
    timeout: 60
    sensors:
      - name: "DaheimLader Status"
        address: 0000
        scan_interval: 30
        data_type: uint16
        unique_id: daheimLader_charging_station_state
      - name: "DaheimLader Status Ladekabel"
        address: 0002
        scan_interval: 30
        data_type: uint16
        unique_id: daheimLader_cable_state
      - name: "DaheimLader Fehlercode"
        address: 0004
        scan_interval: 30
        data_type: uint16
        unique_id: daheimlader_fault_code
      - name: "DaheimLader Ladeleistung"
        unit_of_measurement: W
        address: 0012
        scan_interval: 30
        data_type: uint32
        unique_id: daheimlader_active_power
        device_class: energy
        state_class: measurement
      - name: "DaheimLader Zählerstand"
        address: 0028
        scan_interval: 30
        data_type: uint32
        unique_id: daheimLader_energy_meter
        device_class: energy
        state_class: total_increasing
        unit_of_measurement: kWh
      - name: "DaheimLader geladene Energie"
        unit_of_measurement: kWh
        address: 0072
        scan_interval: 30
        data_type: uint16
        unique_id: daheimLader_charged_energy
        device_class: energy
        state_class: total
      - name: "DaheimLader Ladedauer"
        unit_of_measurement: s
        address: 0078
        scan_interval: 30
        data_type: uint32
        unique_id: daheimlader_charging_time
        device_class: duration
        state_class: measurement
      - name: "DaheimLader Modus"
        address: 0093
        scan_interval: 30
        data_type: uint16
        unique_id: daheimlader_charge_control
      - name: "DaheimLader Ladeleistung L1"
        unit_of_measurement: W
        address: 0016
        scan_interval: 30
        data_type: uint32
        unique_id: daheimLader_l1_charging_power
        device_class: power
        state_class: measurement
      - name: "DaheimLader Ladeleistung L2"
        unit_of_measurement: W
        address: 0020
        scan_interval: 30
        data_type: uint32
        unique_id: daheimLader_l2_active_power
        device_class: power
        state_class: measurement
      - name: "DaheimLader Ladeleistung L3"
        unit_of_measurement: W
        address: 0024
        scan_interval: 30
        data_type: uint32
        unique_id: daheimlader_l3_active_power
        device_class: power

sensor: !include daheimlader.yaml

I created a daheimladen.yaml to make the results more readable and to scale the values:

  - platform: template
    sensors:
      daheimlader_charging_station_state:
        friendly_name: "DaheimLader Status"
        unique_id: daheimlader_charging_station_state_text
        value_template: >-
          {% if states('sensor.daheimlader_charging_station_state') == '1' %}
            Bereit
          {% elif states('sensor.daheimlader_charging_station_state') == '2' %}
            Verbunden
          {% elif states('sensor.daheimlader_charging_station_state') == '3' %}
            Laden startet
          {% elif states('sensor.daheimlader_charging_station_state') == '4' %}
            Lädt
          {% elif states('sensor.daheimlader_charging_station_state') == '5' %}
            Start fehlgeschlagen
          {% elif states('sensor.daheimlader_charging_station_state') == '6' %}
            Laden beendet
          {% elif states('sensor.daheimlader_charging_station_state') == '7' %}
            Systemfehler
          {% elif states('sensor.daheimlader_charging_station_state') == '8' %}
            Ladetimer
          {% elif states('sensor.daheimlader_charging_station_state') == '9' %}
            Firmware Upgrade
          {% elif states('sensor.daheimlader_charging_station_state') == '10' %}
            Eingeschaltet
          {% elif states('sensor.daheimlader_charging_station_state') == '31' %}
            Blockiert
          {% else %}
            Unbekannt
          {% endif %}
          
      daheimlader_cable_state:
        friendly_name: "DaheimLader Status Ladekabel"
        unique_id: daheimlader_cable_state_text
        value_template: >-
          {% if states('sensor.daheimlader_cable_state') == '0' %}
            Nicht verbunden
          {% elif states('sensor.daheimlader_cable_state') == '1' %}
            Verbunden
          {% else %}
            Unbekannt
          {% endif %}

      daheimlader_fault_code:
        friendly_name: "DaheimLader Fehlercode"
        unique_id: daheimlader_fault_code_text
        value_template: >-
          {% if states('sensor.daheimlader_fault_code') == '0' %}
            kein Fehler
          {% elif states('sensor.daheimlader_fault_code') == '11' %}
            CP-Kontroll Wert
          {% elif states('sensor.daheimlader_fault_code') == '13' %}
            Unterspannung
          {% elif states('sensor.daheimlader_fault_code') == '14' %}
            Überspannung
          {% elif states('sensor.daheimlader_fault_code') == '15' %}
            Temperatur zu hoch
          {% elif states('sensor.daheimlader_fault_code') == '16' %}
            Zählerwert
          {% elif states('sensor.daheimlader_fault_code') == '17' %}
            Leckage
          {% elif states('sensor.daheimlader_fault_code') == '18' %}
            Output Short
          {% elif states('sensor.daheimlader_fault_code') == '19' %}
            Überstrom
          {% elif states('sensor.daheimlader_fault_code') == '21' %}
            Fahrzeug
          {% elif states('sensor.daheimlader_fault_code') == '22' %}
            Fahrzeug nicht erkannt
          {% elif states('sensor.daheimlader_fault_code') == '23' %}
            Relais
          {% elif states('sensor.daheimlader_fault_code') == '24' %}
            Leckage, Gerät prüfen
          {% elif states('sensor.daheimlader_fault_code') == '25' %}
            PE-Fehler
          {% elif states('sensor.daheimlader_fault_code') == '26' %}
            Start / Stopp Ladefehler
          {% else %}
            Unbekannt
          {% endif %}

      daheimlader_charge_control:
        friendly_name: "DaheimLader Modus"
        unique_id: daheimlader_charge_control_text
        value_template: >-
          {% if states('sensor.daheimlader_modus') == '0' %}
            Plug % Charge
          {% elif states('sensor.daheimlader_modus') == '1' %}
            RFID / OCPP Start+Stopp
          {% elif states('sensor.daheimlader_modus') == '2' %}
            Ladestation gesperrt
          {% else %}
            Unbekannt
          {% endif %}
          
      daheimlader_energy_meter_scaled:
        friendly_name: "DaheimLader Zählerstand"
        value_template: "{{ states('sensor.daheimLader_energy_meter') | float / 10 }}"
        unit_of_measurement: kWh
        device_class: energy
        unique_id: daheimlader_energy_meter_scaled
        
      daheimlader_charged_energy_scaled:
        friendly_name: "DaheimLader geladen Energie"
        value_template: "{{ states('sensor.daheimLader_charged_energy') | float / 10 }}"
        unit_of_measurement: kWh
        device_class: energy
        unique_id: daheimlader_charged_energy_scaled

It looks like this now:

and my power flow card, using powerflow card plus looks like this:
image

If you have any questions, don’t hestiate to contact me.

Hallo,
mein Englisch ist nicht so gut weshalb ich auch in Deutsch schreibe.

Ich möchte mich für deine Arbeit bedanken.
Auf der Suche für die Einbindung unserer DaheimLaden Wallbox in HA, bin ich auf deinen Beitrag gestoßen. Die andere Lösung mit Note-RED die hier im Forum zu finden ist, war eine Nummer zu groß für mich.
Deine Lösung ist genau das was ich gesucht habe um einige Werte z.B. in Power Flow Card Plus anzuzeigen.
Mit EVCC hab ich mich noch nicht befasst. Würde aber auch Sinn machen, weil wir auch eine PV Anlage haben.

Nochmal ein herzliches Dankeschön aus der Eifel.

Gern geschehen. Mir sind noch ein paar kleinere Fehler / Unstimmigkeiten aufgefallen, wo ich noch nicht verstehe weshalb es dort zu Fehlern kommt. Auch leidet aktuell die Übersichtlichkeit der configuration.yaml etwas wenn alles dort hinein geschrieben wird.
Probleme habe ich etwa die aufsummierte Leistung oder die Stromstärke an einer Phasae (3. Phase) auszulesen. Sie ist immer “unbekannt” (was aber keinen Sinn ergibt, da eine Spannung angezeigt wird) sowie einige andere Werte, die ich daher einstweilen aus der Konfiguration oben entfernt und gar nicht aufgelistet habe. Bei der Abfrage manch anderer Werte erscheinen Werte die keinen Sinn ergeben. Die einzige Erklärung die ich hier momentan habe ist, dass die Dokumentation hier nicht ganz passt was die Modbusadressen angeht.

Interessant wäre daher aber, ob du etwa an Phase 3 auch immer “unbekannt” als Ergebnis hast da ich aktuell nicht ausschließen kann, dass das Problem an der Wallbox und / oder der Verkabelung liegt. In EVCC wird jedoch alles korrekt dargestellt.
Testen ist für mich letztlich aber nicht möglich, da ich nur einen 1-Phasen Lader im Auto habe.

Ein anderer - Schönheitsfehler - ist, dass die Leistung in der Flowcard soweit ich mich erinnere immer 0 W zeigt. Da muss ich noch mal ran wenn ich etwas Luft und Lust habe.

Die Konfiguration von EVCC würde ich an deiner Stelle vornehmen - auch ohne PV sofern etwa Tibber als Stromanbieter zum Einsatz kommt (wie bei mir). Grundsätzlich sollte zwar auch ein Nachbau der Funktionen direkt in HA ohne EVCC möglich sein, aber da fehlt es mir aktuell einfach an Zeit und Lust, das alles über HA zu regeln.

hallo,
ich weiß jetzt gar nicht so richtig was du meinst.
Kopiert habe ich ja alles was du oben reingestellt hast, und genau das was du angezeigt bekommst, bekomme ich auch angezeigt.
Bei mir läuft beim laden alles über L3.
Oder meinst du wenn L1+L2+L3 addiert werden, dass dann bei dir unbekannt kommt?
Ich versuche mich diese Woche mal an EVCC mit meinem GoodWe Wechselrichter und Speicher.

Hallo,
ich glaube, ich bin zu doof für diese Welt, bzw. um yaml Dateien zu erzeugen.
Ich habe Deinen Text in meine yaml übernommen, bekomme aber immer Fehler wenn ich versuche die Konfiguaration zu starten.
Irgendwas scheint mit dem Einrücken nicht zu passen. Kannst Du vielleicht mal Deine gesamte Datei posten.
Danke und viele Grüße
Ralf

Falls du die configuration.yaml Datei meinst, nein, da ich auch Dinge drin stehen habe die nicht für die Öffentlichkeit bestimmt sind. Die Absätze sind aber vollständig. Der Beginn “modbus:” ist nicht eingerückt.

Die daheimladen.yaml Datei ist vollständig.

Einrückprobleme sind sehr nervig bei YAML, ich habe hier gute Erfahrungen mit dem Studio Code Editor gemacht, der ist zwar auch nicht frei von Fehlern, aber macht seine Sache recht gut.

Auf der Seite kannst du prüfen ob mit dem Code alles in Ordnung ist.

1 Like

Added a customization to use the values of the energy meter in the energy dashboard:


You need to add this at the end of the configuration.yaml:

homeassistant:
  customize:
    sensor.daheimlader_energy_meter_scaled:
      state_class: total_increasing
      unit_of_measurement: kWh

With this customization it is possible to choose the entity in the energy dashboard.

Please note:
As @HoloSan already mentioned in this Node Red solution, some register numbers are wrong and don’t match the numbers in documentation of the API.

Unfortunately his corrected numbers does not match to my wallbox too. Don’t know if daheimladen uses different modbus controllers in the smart or touch version or it depends on the revision.

I cannot really test which values are the correct ones for the current e. g. My electric car has just a single phase charger.

And note 2nd:
There is already a newer beta firmware available from daheimladen (should be v1.23) which you can receive if you contact the daheimladen team.

Hi, at all. Thx, Running now, just L1 with Adresse 16 delivered no values, Tried adress 17, Same, have asked Support from daheimladen

I think u have a typo as i had issues, it refers to daheimlader.yaml and the file to be created called daheimladen.yaml - jfyi

i get this as errors now in log

  • TemplateError(‘ValueError: Template error: float got invalid input ‘unknown’ when rendering template ‘{{ states(‘sensor.daheimLader_energy_meter’) | float / 10 }}’ but no default was specified’) while processing template ‘Template<template=({{ states(‘sensor.daheimLader_energy_meter’) | float / 10 }}) renders=4>’ for attribute ‘_attr_native_value’ in entity ‘sensor.daheimlader_energy_meter_scaled’
  • TemplateError(‘ValueError: Template error: float got invalid input ‘unknown’ when rendering template ‘{{ states(‘sensor.daheimLader_charged_energy’) | float / 10 }}’ but no default was specified’) while processing template ‘Template<template=({{ states(‘sensor.daheimLader_charged_energy’) | float / 10 }}) renders=4>’ for attribute ‘_attr_native_value’ in entity ‘sensor.daheimlader_charged_energy_scaled’

And this one too:

Logger: homeassistant.helpers.event
Quelle: helpers/template.py:635
Erstmals aufgetreten: 01:33:24 (6 Vorkommnisse)
Zuletzt protokolliert: 02:10:05

Error while processing template: Template<template=({{ states(‘sensor.daheimLader_energy_meter’) | float / 10 }}) renders=2>
Error while processing template: Template<template=({{ states(‘sensor.daheimLader_charged_energy’) | float / 10 }}) renders=2>
Traceback (most recent call last):
File “/usr/src/homeassistant/homeassistant/helpers/template.py”, line 2354, in forgiving_float_filter
return float(value)
^^^^^^^^^^^^
ValueError: could not convert string to float: ‘unknown’

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “/usr/src/homeassistant/homeassistant/helpers/template.py”, line 633, in async_render
render_result = _render_with_context(self.template, compiled, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/src/homeassistant/homeassistant/helpers/template.py”, line 2735, in _render_with_context
return template.render(**kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.12/site-packages/jinja2/environment.py”, line 1304, in render
self.environment.handle_exception()
File “/usr/local/lib/python3.12/site-packages/jinja2/environment.py”, line 939, in handle_exception
raise rewrite_traceback_stack(source=source)
File “”, line 1, in top-level template code
File “/usr/src/homeassistant/homeassistant/helpers/template.py”, line 2357, in forgiving_float_filter
raise_no_default(“float”, value)
File “/usr/src/homeassistant/homeassistant/helpers/template.py”, line 1911, in raise_no_default
raise ValueError(
ValueError: Template error: float got invalid input ‘unknown’ when rendering template ‘{{ states(‘sensor.daheimLader_energy_meter’) | float / 10 }}’ but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File “/usr/src/homeassistant/homeassistant/helpers/template.py”, line 750, in async_render_to_info
render_info._result = self.async_render( # noqa: SLF001
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/src/homeassistant/homeassistant/helpers/template.py”, line 635, in async_render
raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: float got invalid input ‘unknown’ when rendering template ‘{{ states(‘sensor.daheimLader_energy_meter’) | float / 10 }}’ but no default was specified