Ich habe mir die Anleitung mal angesehen. Es wird leider nichts von REST erwähnt. Eine Modbus Schnittstelle scheint es zu geben. Was ich jedoch gesehen habe ist folgender Hinweis: OCPP.
Du könntest es eventuell über bestehende HACS Plugins wie z.B: GitHub - lbbrhzn/ocpp: Home Assistant integration for electric vehicle chargers that support the Open Charge Point Protocol (OCPP). · GitHub probieren. Dieses Plugin funktioniert bisher nur mit den alten Version 1.13
Ich habe doch eine amtron 4you 510 11kw
Ich habe sie jetzt komplett über Modbus in HA bekommen. Und zwar mit Hilfe von Chat gpt. Ich versuche heute Abend mal eine kurze Anleitung zu erstellen, wenn Interesse besteht.
Man kann sie auch komplett steuern. Mit Phasenumschaltung und Lademodi nach Belieben. Ich habe manuell, aus, Menge laden kWh, laden bis Prozent. PV Überschussladen mache ich noch.
Danke dir, das klingt interessant
Ich habe meine Box vor ca. 1 Jahr oder so mit RESTful angebunden. Das ist nicht komfortabel, aber es funktioniert. Ich habe die für mich wichtigsten Entitäten angelegt. Mit OCPP habe ich es auf die schnelle auch nicht hinbekommen.
by HarryP: Zusammenführung Doppelpost (bei Änderungen oder hinzufügen von Inhalten bitte die „Bearbeitungsfunktion“ anstatt „Antworten“ zu nutzen)
So, ich versuche mal eine Anleitung zu liefern. Wie gesagt habe ich eine Amtron 4you 510 11kw. Es sollten aber auch die professional und die charge control so zu integrieren gehen. Erstmal vorweg, wie ich drauf gekommen bin, weil das sicher der beste Weg für jeden ist. Und zwar habe ich ChatGPT gefragt, wie ich die Box integrieren kann. Kurz gesagt, er hat über Modbus einbinden vorgeschlagen und mit mir gemeinsam dann mehrere Registeradressen probiert. Irgendwann habe ich selbst nach einer Doku dafür gesucht und zeitgleich haben ChatGPT und ich die Registertabelle (https://www.mennekes.de/fileadmin/MEN-Deutschland/emobility/01_documents/04_installer/ECU_modbus_tcp_server_spec_rev_1.07.pdf) gefunden. Das war ein Gamechanger, weil dann vieles klarer und einfacher wurde.
Ich versuche kurz zu umschreiben, wie es prinzipiell klappt. Ich würde aber empfehlen ein Abo für Chatgpt abzuschließen, das Vorhaben schildern und dann immer Screenshots zu schicken. Da gibt es prompt Lösungen. Manchmal musste ich mir auch einen Punkt genauer erklären lassen, geht alles super.
So, hier mein grober Weg:
Zuerst Webinterface der Wallbox öffnen. Am besten im Netzwerk IP der Wallbox suchen und öffnen. Als Installateur anmelden. Dann grob folgende Einstellungen:
- 3 Phasen, L1 L2 L3, dynamische Phasenumschaltung, Wechselpause mittel, Spannungsüberwachung aktivieren
- Lastmanagement, keine Schieflastregelung und bei Energiezähler kein Zähler
- Vernetzung: Lan, kein Backend, kein App Backend, Externes Energiemanagement Modbus TCP, Energiemanagement aktivieren, 6 Ampere Sicherheitsstrom, Modbus Server: unit ID 1, Port 502
- Authorisierungsmodus Autostart
Alles Speichern und Wallbox neu starten.
In Home assistant File Editor installieren. Dort gibt es eine Datei configuration.yaml. Hier könnte ein ganzer Code rein. Ich habe mir aber zwei eigene Ordner erstellt (EigeneYamls und EigeneTemplates). Los geht’s im Ordner EigeneYamls, ich habe dann einen Unterordner mit Wallbox erstellt und darin eine Datei modbus.yaml. In diese Datei müssen die Sensoren. Das sieht so aus:
- name: amtron
type: tcp
host: 192.168.178.XXX (hier IP Adresse vom HA nehmen)
port: 502
sensors:
- name: "AMTRON Status"
unique_id: amtron_status
slave: 1
address: 104
input_type: holding
data_type: uint16
scan_interval: 10
- name: "AMTRON Ladezustand"
unique_id: amtron_ladezustand
slave: 1
address: 122
input_type: holding
data_type: uint16
scan_interval: 5
- name: "AMTRON Leistung L1"
unique_id: amtron_leistung_l1
slave: 1
address: 206
input_type: holding
data_type: uint32
unit_of_measurement: "W"
device_class: power
state_class: measurement
- name: "AMTRON Leistung L2"
unique_id: amtron_leistung_l2
slave: 1
address: 208
input_type: holding
data_type: uint32
unit_of_measurement: "W"
device_class: power
state_class: measurement
- name: "AMTRON Leistung L3"
unique_id: amtron_leistung_l3
slave: 1
address: 210
input_type: holding
data_type: uint32
unit_of_measurement: "W"
device_class: power
state_class: measurement
- name: "AMTRON Gesamtenergie Wh"
unique_id: amtron_gesamtenergie_wh
slave: 1
address: 218
input_type: holding
data_type: uint32
unit_of_measurement: "Wh"
device_class: energy
state_class: total_increasing
- name: "Amtron Summe geladene Energie"
unique_id: amtron_summe_geladene_Energie
slave: 1
address: 716
input_type: holding
data_type: uint32
unit_of_measurement: "Wh"
device_class: energy
state_class: total_increasing
- name: "Amtron Signalisierter Strom"
unique_id: amtron_signalisierter_strom
slave: 1
address: 706
input_type: holding
data_type: uint16
unit_of_measurement: "A"
scan_interval: 5
- name: "Amtron Mindeststrom"
unique_id: amtron_mindeststrom
slave: 1
address: 712
input_type: holding
data_type: uint16
unit_of_measurement: "A"
scan_interval: 5
- name: "Amtron Maximalstrom Fahrzeug"
unique_id: amtron_maximalstrom_fahrzeug
slave: 1
address: 715
input_type: holding
data_type: uint16
unit_of_measurement: "A"
scan_interval: 5
- name: "Amtron Geladene Energie Session"
unique_id: amtron_geladene_energie_session
slave: 1
address: 716
input_type: holding
data_type: uint32
unit_of_measurement: "Wh"
scan_interval: 5
- name: "Amtron HEMS Stromlimit"
unique_id: amtron_hems_stromlimit
slave: 1
address: 1000
input_type: holding
data_type: uint16
unit_of_measurement: "A"
- name: "Amtron Test Register 1002"
unique_id: amtron_test_register_1002
slave: 1
address: 1002
input_type: holding
data_type: uint16
scan_interval: 5
Das sind die Sensoren, die ich gebraucht habe. Slave ist die Unit ID. Hier immer auf die richtige Einrückung der Zeilen achten, da kann Chatgpt (ich mache keine Werbung, aber es hilft extrem) sehr gut helfen.
Jetzt muss diese yaml noch von HA gestartet werden. Das machen wir im File Editor im Home assistant Grundverzeichnis unter configuration.yaml. Hier muss folgender Eintrag rein:
modbus: !include EigeneYamls/Wallbox/Modbus.yaml (das ist der Ordner, wo die Modbus Datei liegt).
Und weiter gleich für später das noch alles:
template: !include_dir_merge_list EigeneTemplates/
input_number: !include EigeneYamls/Wallbox/InputNumber.yaml
utility_meter: !include EigeneYamls/Wallbox/UtilityMeter.yaml
input_select: !include EigeneYamls/Wallbox/InputSelect.yaml
Die Dateien müssen alle erstellt werden in den jeweiligen Ordnern.
Jetzt kann man testen. Und zwar in HA unter Einstellungen, Entwicklerwerkzeuge, Yaml überprüfen und dann neu starten. Danach kann man unter Zustände die o.g. Sensoren (einfach Amtron eingeben) suchen und müsste Werte ausgespuckt bekommen. Diese Sensoren kann man dann in die Übersicht oder Dashboards packen.
Das ist der Schritt für die Sensoren. Ich habe dann weiter gemacht (oder machen lassen) und mir Lademodi gebaut. Und zwar wollte ich Aus, manuell (also einfach losladen), Menge laden (kWh) (also eine Menge an kwh vorgeben und bis dahin laden), Laden bis % (also Auto abfragen und aufhören, wenn Ladung bei zB 60% steht), PV Überschussladen.
Weiter geht es mit Templates. Dafür in den Templates Ordner eine Datei WallboxTemplates.yaml anlegen. Hier habe ich folgendes:
- sensor:
- name: "AMTRON Gesamtleistung"
unique_id: amtron_gesamtleistung
unit_of_measurement: "W"
device_class: power
state_class: measurement
state: >
{{
states('sensor.amtron_leistung_l1') | float(0)
+ states('sensor.amtron_leistung_l2') | float(0)
+ states('sensor.amtron_leistung_l3') | float(0)
}}
- name: "AMTRON Gesamtleistung kW"
unique_id: amtron_gesamtleistung_kw
unit_of_measurement: "kW"
device_class: power
state_class: measurement
state: >
{{ (states('sensor.amtron_gesamtleistung') | float(0) / 1000) | round(2) }}
- name: "AMTRON Status Text"
unique_id: amtron_status_text
state: >
{% set s = states('sensor.amtron_status') | int(0) %}
{% if s == 1 %}
Bereit
{% elif s == 4 %}
Laden wird vorbereitet
{% elif s == 3 %}
Lädt
{% elif s == 5 %}
Lädt
{% elif s == 6 %}
Lädt
{% elif s == 9 %}
Beendet
{% else %}
Unbekannt ({{ s }})
{% endif %}
- name: "Amtron Ladezustand Text"
unique_id: amtron_ladezustand_text
state: >
{% set v = states('sensor.amtron_ladezustand') | int(0) %}
{% if v == 1 %}
Auto nicht verbunden
{% elif v == 2 %}
Auto verbunden, nicht bereit zum Laden
{% elif v == 3 %}
Laden ohne Ventilation
{% elif v == 4 %}
Laden mit Ventilation
{% elif v == 5 %}
Kurzschluss
{% else %}
Unbekannt
{% endif %}
- name: "AMTRON Gesamtenergie kWh"
unique_id: amtron_gesamtenergie_kwh
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
state: >
{{ (states('sensor.amtron_gesamtenergie_wh') | float(0) / 1000) | round(3) }}
- name: "Amtron Summe geladene Energie kWh"
unique_id: amtron_summe_geladene_energie_kwh
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
state: >
{{ (states('sensor.amtron_summe_geladene_energie') | float(0) / 1000) | round(3) }}
- name: "Amtron Sollstrom"
unique_id: amtron_sollstrom
unit_of_measurement: "A"
state: >
{% set kw = states('input_number.amtron_ladeleistung_kw') | float(0) %}
{{ ((kw * 1000) / (230 * 3)) | round(0) }}
- name: "Amtron Sollleistung"
unique_id: amtron_sollleistung
unit_of_measurement: "kW"
state: >
{% set a = states('sensor.amtron_hems_stromlimit') | float(0) %}
{{ ((a * 690) / 1000) | round(1) }}
- name: "Amtron Restlademenge"
unique_id: amtron_restlademenge
unit_of_measurement: "kWh"
state: >
{% set ziel = states('input_number.amtron_lademenge_kwh') | float(0) %}
{% set start = states('input_number.amtron_lademenge_start_wh') | float(0) %}
{% set aktuell = states('sensor.amtron_geladene_energie_session') | float(0) %}
{% set geladen = (aktuell - start) / 1000 %}
{{ [ziel - geladen, 0] | max | round(2) }}
Ich habe das letzte Template weggelassen, da es für PV Überschussladen ist und es mit der eigenen PV bzw deren Sensoren gekoppelt werden muss.
In die Datei InputNumber.yaml kommt das hier:
amtron_ladeleistung_kw:
name: Einst. Ladeleistung
min: 1.5
max: 11
step: 0.1
unit_of_measurement: kW
mode: slider
amtron_lademenge_kwh:
name: Einst. Lademenge
min: 0.5
max: 30
step: 0.5
unit_of_measurement: kWh
mode: slider
amtron_lademenge_start_wh:
name: Lademenge Start Wh
min: 0
max: 999999
step: 1
unit_of_measurement: Wh
mode: box
In die InputSelect.yaml das hier:
amtron_lademodus:
name: Lademodus
options:
- Aus
- Manuell
- Menge laden (kWh)
initial: Manuell
icon: mdi:ev-station
Ich lasse die lademodi Laden bis % und PV Überschuss außen vor, weil man dazu die eigenen PV und Auto Sensoren braucht.
UtilityMeter.yaml das hier:
amtron_energie_tag:
source: sensor.amtron_summe_geladene_energie_kwh
cycle: daily
unique_id: amtron_energie_tag
amtron_energie_woche:
source: sensor.amtron_summe_geladene_energie_kwh
cycle: weekly
unique_id: amtron_energie_woche
amtron_energie_monat:
source: sensor.amtron_summe_geladene_energie_kwh
cycle: monthly
unique_id: amtron_energie_monat
amtron_energie_jahr:
source: sensor.amtron_summe_geladene_energie_kwh
cycle: yearly
unique_id: amtron_energie_jahr
Zum Schluss im Basisverzeichnis die automations.yaml bearbeiten:
- alias: Wallbox Slider auf HEMS Stromlimit
trigger:
- platform: state
entity_id: input_number.amtron_ladeleistung_kw
condition:
- condition: template
value_template: >
{{ states('input_select.amtron_lademodus') in ['Manuell', 'Menge laden (kWh)', 'Laden bis %'] }}
action:
- variables:
kw: "{{ states('input_number.amtron_ladeleistung_kw') | float(0) }}"
ampere: >
{% if kw < 4.2 %}
{{ ((kw * 1000 / 230) | round(0)) | int }}
{% else %}
{{ ((kw * 1000 / 690) | round(0)) | int }}
{% endif %}
- service: modbus.write_register
data:
hub: amtron
slave: 1
address: 1002
value: "{{ (kw * 1000) | int }}"
mode: restart
- alias: Wallbox Lademodus Aus
trigger:
- platform: state
entity_id: input_select.amtron_lademodus
to: "Aus"
action:
- service: modbus.write_register
data:
hub: amtron
slave: 1
address: 1000
value: 0
mode: single
- alias: Amtron Manuell Sliderwert sofort setzen
trigger:
- platform: state
entity_id: input_select.amtron_lademodus
to: "Manuell"
action:
- variables:
kw: "{{ states('input_number.amtron_ladeleistung_kw') | float(0) }}"
ampere: >
{% if kw < 4.2 %}
{{ ((kw * 1000 / 230) | round(0)) | int }}
{% else %}
{{ ((kw * 1000 / 690) | round(0)) | int }}
{% endif %}
strom: "{{ [6, [ampere, 16] | min] | max }}"
- service: modbus.write_register
data:
hub: amtron
slave: 1
address: 1000
value: 32
- delay: "00:00:01"
- service: modbus.write_register
data:
hub: amtron
slave: 1
address: 1002
value: "{{ (kw * 1000) | int }}"
- delay: "00:00:03"
- service: modbus.write_register
data:
hub: amtron
slave: 1
address: 1002
value: "{{ (kw * 1000) | int }}"
mode: restart
- alias: Amtron Menge laden (kWh) starten
trigger:
- platform: state
entity_id: input_select.amtron_lademodus
to: "Menge laden (kWh)"
action:
- service: input_number.set_value
target:
entity_id: input_number.amtron_lademenge_start_wh
data:
value: "{{ states('sensor.amtron_geladene_energie_session') | float(0) }}"
- variables:
kw: "{{ states('input_number.amtron_ladeleistung_kw') | float(0) }}"
- service: modbus.write_register
data:
hub: amtron
slave: 1
address: 1000
value: 32
- delay: "00:00:01"
- service: modbus.write_register
data:
hub: amtron
slave: 1
address: 1002
value: "{{ (kw * 1000) | int }}"
- delay: "00:00:03"
- service: modbus.write_register
data:
hub: amtron
slave: 1
address: 1002
value: "{{ (kw * 1000) | int }}"
mode: restart
- alias: Amtron Menge laden (kWh) stoppen
trigger:
- platform: time_pattern
seconds: "/10"
condition:
- condition: state
entity_id: input_select.amtron_lademodus
state: "Menge laden (kWh)"
- condition: template
value_template: >
{% set start = states('input_number.amtron_lademenge_start_wh') | float(0) %}
{% set aktuell = states('sensor.amtron_geladene_energie_session') | float(0) %}
{% set ziel = states('input_number.amtron_lademenge_kwh') | float(0) * 1000 %}
{{ aktuell - start >= ziel }}
action:
- service: modbus.write_register
data:
hub: amtron
slave: 1
address: 1000
value: 0
- service: input_select.select_option
target:
entity_id: input_select.amtron_lademodus
data:
option: "Aus"
mode: single
Und das müsste es gewesen sein. Das ist meine nahezu komplette Integration. wie gesagt, man kann auch mit Chatgpt erstmal mit dem Modbus anfangen, auch erstmal nur paar Sensoren und dann testen. Also nur den Bezug in der Configurations.yaml auf die Modbus Datei herstellen und diese Anlegen und die Daten der Sensoren eintragen.
Ich hoffe, das hilft. Bin gespannt, ob es andere auch durch die Anleitung hinbekommen.
Ich habe noch gesehen, dass der Sensor 1002 noch Test Sensor heißt. Das war spannend. Denn diesen Sensor gab es in der Anleitung nicht. chatgpt hat etwas in einem Forum gefunden und dann haben wir 1001-1010 probiert. Bzw glaube sogar bis 1020. Aber 1002 war es dann, der beschrieben werden muss.
Anmerkung: beim Überschussladen fiel heute auf, dass der Sensor Sollstrom falsch berechnet hat. Ich habe es oben geändert.