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. 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.