Wie die AhoyDTU korrekt konfiguriert wird um den Wechselrichter auszulesen soll hier nicht das Thema sein. Anleitungen gibt es im Internet dazu genug. Aber die Punkte die wichtig sind um die verfügbaren Werte aus der AhoyDTU in HomeAssistant zu bekommen schon.
Hierfür muss im Setup von AhoyDTU folgendes beachtet werden.
Der Name unter Inverter ist wichtig und bei MQTT muss als Broker die IP-Adresse von HomeAssistant, der Port, und ein Topic definiert sein. Ich habe mir in HomeAssistant einen eigenen User angelegt. Auch hierzu gibt es in Bezug auf MQTT ausreichend YT-Videos und Dokumentationen
Danach habe ich in der configuration.yaml die Zeile
mqtt: !include mqtt.yaml
hinzugefügt, die Datei mqtt.yaml angelegt und wie folgt befüllt.
Hier findet man in den “state_topic” den im AhoyDTU angelegten Topic und den Namen des Inventers (siehe Screenshot oben). Man kann also meine Daten einfach kopieren und “ahoy/” durch den eigenen Topic ersetzen und “HM-800” durch den eigenen Name, den man dem Wechselrichter gegeben hat.
#####################################################
### MQQT Sensoren anlegen
#####################################################
#AhoyDTU HM-800
sensor:
#<TOPIC>/#
- name: "AHOY comm_start"
state_topic: ahoy/comm_start
- name: "AHOY comm_start_extended"
state_topic: ahoy/comm_start
value_template: >-
{{ value | int | timestamp_custom('%d.%m.%Y %H:%M:%S') }}
- name: "AHOY comm_stop"
state_topic: ahoy/comm_stop
- name: "AHOY comm_stop_extended"
state_topic: ahoy/comm_stop
value_template: >-
{{ value | int | timestamp_custom('%d.%m.%Y %H:%M:%S') }}
- name: "AHOY dis_night_comm"
state_topic: ahoy/dis_night_comm
- name: "AHOY mqtt"
state_topic: ahoy/mqtt
- name: "AHOY status"
state_topic: ahoy/status
- name: "AHOY status extended"
state_topic: ahoy/status
value_template: >-
{% if (value | int) == 0 %}
offline
{% elif (value | int) == 1 %}
partial
{% elif (value | int) == 2 %}
online
{% endif %}
- name: "AHOY sunrise"
state_topic: ahoy/sunrise
- name: "AHOY sunrise_extended"
state_topic: ahoy/sunrise
value_template: >-
{{ value | int | timestamp_custom('%d.%m.%Y %H:%M:%S') }}
- name: "AHOY sunset"
state_topic: ahoy/sunset
- name: "AHOY sunset_extended"
state_topic: ahoy/sunset
value_template: >-
{{ value | int | timestamp_custom('%d.%m.%Y %H:%M:%S') }}
- name: "AHOY Uptime"
state_topic: ahoy/uptime
unit_of_measurement: "s"
- name: "AHOY Uptime_extended"
state_topic: ahoy/uptime
value_template: >-
{{ value | int | timestamp_custom('%H:%M:%S', local=false) }}
- name: "AHOY Version"
state_topic: ahoy/version
- name: "AHOY Device"
state_topic: ahoy/device
- name: "AHOY WiFi"
state_topic: ahoy/wifi_rssi
unit_of_measurement: "dBm"
- name: "AHOY Gesamtertrag"
state_topic: ahoy/YieldTotal
unit_of_measurement: "kWh"
#<TOPIC>/<INVERTER_NAME_FROM_SETUP>/#
- name: "AHOY available"
state_topic: ahoy/HM-800/available
- name: "AHOY available extended"
state_topic: ahoy/HM-800/available
value_template: >-
{% if (value | int) == 0 %}
not available and not producing
{% elif (value | int) == 1 %}
available but not producing
{% elif (value | int) == 2 %}
available and producing
{% endif %}
- name: "AHOY last_success"
state_topic: ahoy/HM-800/last_success
- name: "AHOY last_success_extended"
state_topic: ahoy/HM-800/last_success
value_template: >
{{ value | int | timestamp_custom('%d.%m.%Y %H:%M:%S') }}
#Basic <TOPIC>/<INVERTER_NAME_FROM_SETUP>/ch0/#
- name: "AHOY U_AC"
state_topic: ahoy/HM-800/ch0/U_AC
unit_of_measurement: "V"
- name: "AHOY I_AC"
state_topic: ahoy/HM-800/ch0/I_AC
unit_of_measurement: "A"
- name: "AHOY P_AC"
state_topic: ahoy/HM-800/ch0/P_AC
unit_of_measurement: "W"
- name: "AHOY Q_AC"
state_topic: ahoy/HM-800/ch0/Q_AC
- name: "AHOY F_AC"
state_topic: ahoy/HM-800/ch0/F_AC
unit_of_measurement: "Hz"
- name: "AHOY PF_AC"
state_topic: ahoy/HM-800/ch0/PF_AC
- name: "AHOY Temperatur"
state_topic: ahoy/HM-800/ch0/Temp
unit_of_measurement: "°C"
- name: "AHOY EVT"
state_topic: ahoy/HM-800/ch0/EVT
- name: "AHOY YieldDay"
state_topic: ahoy/HM-800/ch0/YieldDay
device_class: power
unit_of_measurement: "Wh"
- name: "AHOY YieldTotal"
state_topic: ahoy/HM-800/ch0/YieldTotal
device_class: energy
unit_of_measurement: "kWh"
- name: "AHOY P_DC"
state_topic: ahoy/HM-800/ch0/P_DC
unit_of_measurement: "W"
- name: "AHOY Efficiency"
state_topic: ahoy/HM-800/ch0/Efficiency
unit_of_measurement: "%"
- name: "AHOY FWVersion"
state_topic: ahoy/HM-800/ch0/FWVersion
- name: "AHOY FWBuildYear"
state_topic: ahoy/HM-800/ch0/FWBuildYear
- name: "AHOY FWBuildMonthDay"
state_topic: ahoy/HM-800/ch0/FWBuildMonthDay
- name: "AHOY HWPartID"
state_topic: ahoy/HM-800/ch0/HWPartId
- name: "AHOY PowerLimit"
state_topic: ahoy/HM-800/ch0/PowerLimit
- name: "AHOY LastAlarmCode"
state_topic: ahoy/HM-800/ch0/LastAlarmCode
#Panel 1 - UNTEN - <TOPIC>/<INVERTER_NAME_FROM_SETUP>/ch<CHANNEL_NUMBER>/#
- name: "AHOY U_DC 1"
state_topic: ahoy/HM-800/ch1/U_DC
unit_of_measurement: "V"
- name: "AHOY I_DC 1"
state_topic: ahoy/HM-800/ch1/I_DC
unit_of_measurement: "A"
- name: "AHOY P_DC 1"
state_topic: ahoy/HM-800/ch1/P_DC
unit_of_measurement: "W"
- name: "AHOY YieldDay 1"
state_topic: ahoy/HM-800/ch1/YieldDay
unit_of_measurement: "Wh"
- name: "AHOY YieldTotal 1"
state_topic: ahoy/HM-800/ch1/YieldTotal
unit_of_measurement: "kWh"
- name: "AHOY Irradiation 1"
state_topic: ahoy/HM-800/ch1/P_DC
unit_of_measurement: "%"
#Panel 2 - OBEN - <TOPIC>/<INVERTER_NAME_FROM_SETUP>/ch<CHANNEL_NUMBER>/#
- name: "AHOY U_DC 2"
state_topic: ahoy/HM-800/ch2/U_DC
unit_of_measurement: "V"
- name: "AHOY I_DC 2"
state_topic: ahoy/HM-800/ch2/I_DC
unit_of_measurement: "A"
- name: "AHOY P_DC 2"
state_topic: ahoy/HM-800/ch2/P_DC
unit_of_measurement: "W"
- name: "AHOY YieldDay 2"
state_topic: ahoy/HM-800/ch2/YieldDay
unit_of_measurement: "Wh"
- name: "AHOY YieldTotal 2"
state_topic: ahoy/HM-800/ch2/YieldTotal
unit_of_measurement: "kWh"
- name: "AHOY Irradiation 2"
state_topic: ahoy/HM-800/ch2/P_DC
unit_of_measurement: "%"
Neben den Werten, die mir die AhoyDTU liefert habe ich auch einige Identifier gleich in “verständliche Werte” transformiert und Zeitstempel im UTC-Format gleich ich menschlich lesbare Notationen.
Die Darstellung der “Uptime” ist mir nicht wirklich gelungen, da muss ich nochmals suchen. Stunden, Minuten, Sekunden ist da nicht ausreichen ein “Tage” fehlt noch.
Nach den ersten Tagen der Nutzung sind mir folgende Ungereimtheiten aufgefallen, die ich dann wie folgt versucht habe abzufangen. Der Wechselrichter hat einen Eigenverbrauch. Darum nutze ich für die Werte der Stromproduktion den sensor “sensor.ahoy_p_ac” das entspricht zwar nicht der Gleichstromproduktion des BKWs, aber den am Ende bereitgestellten Strom.
Dann ist mir aufgefallen, dass dieser Sensor den Wert von ca. 5Watt nie unterschreitet. Also auch bei schlechtem Wetter und in der Nacht produziert das BKW 5Watt (erwartet hätte ich eher negative Werte). Das ist natürlich Quatsch und darum habe ich einen weiteren Sensor in der template.yaml angelegt, der mir diesen “Fehlstrom” herausrechnen soll.
#Wenn nur noch der Wechselrichter Strom zieht (<5 Watt), dann soll das auch als Verbrauch gezählt werden
#und nicht als Produktion. Der Verbrauch wird dann im Shelly 3EM ermittelt.
- sensor:
- name: "Total Power Solar"
device_class: power
unit_of_measurement: "W"
state: >
{{
states('sensor.ahoy_p_ac')|float(0) if states('sensor.ahoy_p_ac')| int > 5 else 0
}}
Um dann meine kWh für den EnergieMonitor zu bekommen habe ich einen Helfer angelegt
Eingangssensor: Total Power Solar
Typ: Integration - Riemann Summenintegralsensor
Integrationsmethode: linke Riemannsche Summe
Genauigkeit: 2
Metrisches Präfix: k
Zeitschnitt: Stunden
Da man diesen Helfer im Nachhinein nicht mehr aufrufen kann um sich die Einstellungen anzuschauen empfehle ich hiervor einen Screenshot zu machen. Man kann sich sicherlich den Helfer und den Sensor "Total Power Solar" sparen und auf einen der kWh- oder Wh-Werte die der Wechselrichter liefert einbinden, jedoch fand ich die Umsetzung über den eigenen Helfer ansprechender.
Der eigene Helfer birgt natürlich das Risiko bei einem Ausfall der AhoyDTU oder des HomeAssistant Daten zu verlieren, die mit der Einbindung der kWh-Werte des Wechselrichters nicht passieren würden. Man hätte bei der direkten Einbindung der Wechselrichterwerte nur bei einem Reconnect einen WertePeak. Trotzdem habe ich mich entschieden den Wert in HomeAssistant selbst zu ermitteln, auch unter dem Hintergrund, dass ich nicht wusste wie die 5Watt bei schlechtem Wetter oder in der Nacht in den Wert "sensor.ahoy_yieldtotal" einfliesst oder nicht. (--> man hätte das auch einfach mal einige Nächste beobachten können. Da fehlte die Geduld)
OFFENE FRAGEN:
wie würden sich die Werte ändern, wenn ein 2. Hoymiles hinzugefügt werden würde, da es doch einige Sensoren gibt, die in ihrem state_topic keinen Bezug auf den "name" des Wechselrichters haben?