Keba Wallbox – warum ich zu Modbus in Home Assistant wechselte

Ich habe seit nunmehr ca. 1,5 Jahren ein Keba P30 x-Series Wallbox. Mit dem integrierten geeichten Zählwerk kann ich sauber die Abrechnung mit meinem Arbeitgeber machen, hinsichtlich der Stromkosten des Dienstwagens.

Verbindungsprobleme…..

Die Wallbox ist bei mir baulich bedingt nur über WLAN in der Garage angebunden und hat eine zugegeben schlechte Anbindung ans WLAN. Pingzeiten von über 500ms können leider auch mal auftreten. Und diese sind sicherlich auch der Grund meines Problems, für das ich hier nun eine sehr einfache Lösung gefunden habe.

Die Wallbox habe ich natürlich auch gleich über die native Integration von Home Assistant für Keba Wallboxen implementiert. Und war schnell enttäuscht, weil einerseits der Funktionsumfang sehr gering ist, aber auch, weil die Wallbox nicht immer reagierte, beziehungsweise beim Neustart von HA sehr oft nicht erreichbar ist.

Also gesucht und in HACS die „Beta-Version“ von der nativen Integration gefunden. Dachte super, die ist nicht nur über YAML konfigurierbar, sondern schon mal GUI und bringt noch ein paar Extra’s mit (z.B. Unterstützt diese auch die Einbindung mehrerer Keba Wallboxen).
Also installierte ich über HACS diese Erweiterung: https://github.com/dannerph/homeassistant-keba

Der Entwickler Dannerph hat sich hier super ins Zeug gelegt und eine Integration auf hohem Niveau geschrieben, die keine Wünsche offen lässt. Auch sind die Verbindungsprobleme, die ich mit der nativen hatte fast kein Problem mehr. Die Wallbox wird beim Start von HA sauber gelesen. Aber immer noch habe ich Probleme beim Drücken der Enable/Disable Tasten, selbst wenn ich diese mehrfach in den Automations mit Pausen drücken lasse.

Analyse:

Wer sich die Integrationen genauer anschaut, merkt, dass diese auf dem Protokoll UDP aufbauen. UDP ist ein sogenanntes Stateless Protokoll, d.h. ich schicke einen Befehl los, warte aber nicht, ob er auch angenommen wird und eine Rückmeldung erhalte. Quasi ein one-way Befehlssystem.

Besser wäre es, TCP einsetzen zu können, da es ein stateful protokoll im IP-Stack ist. Hier bekomme ich eine Rückmeldung, ob mein Befehl angenommen wurde und wenn nicht, korrigiert das TCP Protokoll das mit einem Resend. Und genau das ist die

Lösung:

Keba war so klug und hat nicht nur das UDP Protokoll programmiert, für die Fernbedienung, sondern auch MODBUS TCP. Also kann ich sicher stellen, dass meine Befehle nicht nur übermittelt werden, sondern auch angenommen.

Wie sieht die Konfiguration in HA hierfür aus?

modbus:
  – name: KEBAP30

    delay: 5

    timeout: 5

    type: tcp

    host: 192.168.1.102 # your callbox IP address goes here

    port: 502

    sensors:

      # Lesbare Sensoren

      – name: KebaP30_charging_state

        address: 1000

        scan_interval: 30

        data_type: uint32

        unique_id: KebaP30_charging_state

      – name: KebaP30_cable_state

        address: 1004

        scan_interval: 30

        data_type: uint32

        unique_id: KebaP30_cable_state

      – name: KebaP30_error_code # 0=kein Error

        address: 1006

        scan_interval: 600

        data_type: uint32

        unique_id: KebaP30_error_code

      – name: KebaP30_charging_current_P1

        address: 1008

        scan_interval: 60

        data_type: uint32

        scale: 0.001

        precision: 1

        unit_of_measurement: „A“

        device_class: current

        unique_id: KebaP30_charging_current_P1

      – name: KebaP30_charging_current_P2

        address: 1010

        scan_interval: 60

        data_type: uint32

        scale: 0.001

        precision: 1

        unit_of_measurement: „A“

        device_class: current

        unique_id: KebaP30_charging_current_P2

      – name: KebaP30_charging_current_P3

        address: 1012

        scan_interval: 60

        data_type: uint32

        scale: 0.001

        precision: 1

        unit_of_measurement: „A“

        device_class: current

        unique_id: KebaP30_charging_current_P3

      – name: KebaP30_serial_number

        address: 1014

        scan_interval: 3600

        data_type: uint32

        unique_id: KebaP30_serial_number

      – name: KebaP30_product_features

        address: 1016

        scan_interval: 3600

        data_type: uint32

        unique_id: KebaP30_product_features

      – name: KebaP30_firmware_version

        address: 1013

        scan_interval: 3600

        data_type: uint32

        unique_id: KebaP30_firmware_version

      – name: KebaP30_active_power

        address: 1020

        scan_interval: 60

        data_type: uint32

        scale: 0.001

        precision: 1

        unit_of_measurement: „W“

        device_class: power

        unique_id: KebaP30_active_power

      – name: KebaP30_total_energy

        address: 1036

        scan_interval: 300 # every 10 min

        data_type: uint32

        scale: 0.0001

        unit_of_measurement: „kWh“

        precision: 2

        state_class: total_increasing

        device_class: energy

        unique_id: KebaP30_total_energy

      – name: KebaP30_voltage_P1

        address: 1040

        scan_interval: 60

        data_type: uint32

        unit_of_measurement: „V“

        device_class: voltage

        unique_id: KebaP30_voltage_P1

      – name: KebaP30_voltage_P2

        address: 1042

        scan_interval: 60

        data_type: uint32

        unit_of_measurement: „V“

        device_class: voltage

        unique_id: KebaP30_voltage_P2

      – name: KebaP30_voltage_P3

        address: 1044

        scan_interval: 60

        data_type: uint32

        unit_of_measurement: „V“

        device_class: voltage

        unique_id: KebaP30_voltage_P3

      – name: KebaP30_power_factor

        address: 1046

        scan_interval: 60

        data_type: uint32

        scale: 0.1

        unit_of_measurement: „%“

        unique_id: KebaP30_power_factor

      – name: KebaP30_max_charging_current

        address: 1100

        scan_interval: 60

        data_type: uint32

        scale: 0.001

        precision: 1

        unit_of_measurement: „A“

        device_class: current

        unique_id: KebaP30_max_charging_current

      – name: KebaP30_max_supported_charging_current

        address: 1110

        scan_interval: 600           #*

        data_type: uint32

        scale: 0.001

        unit_of_measurement: „A“

        precision: 1

        device_class: current

        unique_id: KebaP30_max_supported_charging_current

      – name: KebaP30_session_energy

        address: 1502

        scan_interval: 600           #*

        data_type: uint32

        scale: 0.0001

        precision: 2

        unit_of_measurement: „kWh“

        device_class: energy

        unique_id: KebaP30_session_energy

    switches:

      – name: KebaP30_OnOff

        address: 5014

        command_on: 1

        command_off: 0

        unique_id: KebaP30_OnOff


template:
  – sensor:

    – name: KebaP30_charging_state_text

      state: >

        {% if states(’sensor.KebaP30_charging_state‘)|int == 0 %}

          starting

        {% elif states(’sensor.KebaP30_charging_state‘)|int == 1 %}

          not ready for charging

        {% elif states(’sensor.KebaP30_charging_state‘)|int == 2 %}

          ready for charging

        {% elif states(’sensor.KebaP30_charging_state‘)|int == 3 %}

          charging

        {% elif states(’sensor.KebaP30_charging_state‘)|int == 4 %}

          error

        {% elif states(’sensor.KebaP30_charging_state‘)|int == 5 %}

          interrupted

        {% endif %}

    – name: KebaP30_cable_state_text

      state: >

        {% if states(’sensor.KebaP30_cable_state‘)|int == 7 %}

          cable_ready

        {% else %}

          cable_not_ready

        {% endif %}

Mit den Sensor Entitäten wird die Wallbox über Modbus ausgelesen, mit dem Switch Entity wird die Wallbox an und ausgeschaltet und das äußerst zuverlässig.

Für weitere Ideen in Automationen könnt Ihr vielleicht diese Daten noch verwenden:

# WriteOnly Daten
# in Automationen wie folgt verwenden:
#
# **** maximalen Ladestrom auf den Wert setzen, der in „input_number.wallboxlinks_target_current“ steht
# service: modbus.write_register
# data:
# address: 5004
# hub: WallboxLinks
# value: „{{states(‚input_number.wallboxlinks_target_current‘)}}“. # or put a fixed value here
#
# **** Session Energie setzen
# service: modbus.write_register
# data:
# address: 5010
# hub: WallboxLinks
# value: # put value for session energy here

Ich hoffe, dass ich Euch damit ein wenig helfen konnte, wenn auch Ihr eine Keba Wallbox einsetzt. Der Modbus Guide ist mit allen Einstellungen beim Hersteller auf der Website im Downloads Bereich zu finden. Es gibt noch viel mehr Einstellungen, wie zum Beispiel Failsafe Mode spezifische.

Hinweis: Durch die Nutzung der obigen Links erhalte ich unter Umständen eine kleine Provision.