Integration meiner Mennekes Amtron Professional Wallbox

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

1 „Gefällt mir“

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.

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

2 „Gefällt mir“