openDTU mit Hoymiles HMS-2000-4T Mikrowechselrichter

Begonnen von holle75, 23 Juni 2025, 10:21:29

Vorheriges Thema - Nächstes Thema

holle75

Hello, in Vorbereitung der Erweiterung meiner Solaranlage habe ich mir bei openelab ein openDTU Fertigkästchen besorgt -> https://openelab.io/de/products/opendtu?_pos=1&_psq=Dual-Mode+NRF%2FCMT+DTU&_ss=e&_v=1.0
und integriere es gerade in fhem. Dank dem mqtt template (Danke!) war die Kommunikation schnell hergestellt.

Dann habe ich alles was auf openDTU als mqtt topics aufgeführt war (https://www.opendtu.solar/firmware/mqtt_topics/) eingebaut. Was es davon später braucht, wird sich zeigen.

Daraus ist jetzt erstmal das geworden

defmod MQTT2_openDTU MQTT2_DEVICE
attr MQTT2_openDTU autocreate 1
attr MQTT2_openDTU bridgeRegexp openDTU/([[:xdigit:]]+)/.*:.*  "openDTU_$1"
attr MQTT2_openDTU event-min-interval .*:900
attr MQTT2_openDTU event-on-change-reading uptime:60,temperature:1,rssi:3,.*
attr MQTT2_openDTU event-on-update-reading .*
attr MQTT2_openDTU icon solar
attr MQTT2_openDTU model hoymiles_opendtu_hub_bridge
attr MQTT2_openDTU readingList openDTU/status:.* status\
openDTU/dtu/uptime:.* uptime\
openDTU/dtu/ip:.* ip\
openDTU/dtu/rssi:.* rssi\
openDTU/dtu/temperature:.* temperature\
openDTU/dtu/hostname:.* hostname\
\
openDTU/ac/power:.* power_ac\
openDTU/ac/yieldtotal:.* yieldtotal\
openDTU/ac/yieldday:.* yieldday\
openDTU/ac/is_valid:.* is_valid\
\
openDTU/dc/power:.* power_dc\
openDTU/dc/irradiation:.* irradiation\
openDTU/dc/is_valid:.* is_validdc\
\
openDTU/[serial]/name:.* Name_of_the_inverter_as_configured_in_web_GUI\
openDTU/[serial]/device/bootloaderversion:.* Bootloader_version_of_the_inverter\
openDTU/[serial]/device/fwbuildversion:.* Firmware_version_of_the_inverter\
openDTU/[serial]/device/fwbuilddatetime:.* Build_date__time_of_inverter_firmware\
openDTU/[serial]/device/hwpartnumber:.* Hardware_part_number_of_the_inverter\
openDTU/[serial]/device/hwversion:.* Hardware_version_of_the_inverter\
openDTU/[serial]/radio/tx_request:.* Amount_of_sent_packet_requests\
openDTU/[serial]/radio/tx_re_request:.* Amount_of_sent_fragment_resend_requests\
openDTU/[serial]/radio/rx_success:.* Amount_of_successfully_received_packets\
openDTU/[serial]/radio/rx_fail_nothing:.* Amount_of_failed_packets_nothing_was_received\
openDTU/[serial]/radio/rx_fail_partial:.* Amount_of_failed_packets_some_fragments_were_missing\
openDTU/[serial]/radio/rx_fail_corrupt:.* Amount_of_failed_packets_payload_corrupt\
openDTU/[serial]/radio/rssi:.* RSSI_of_last_received_packet\
openDTU/[serial]/status/reachable:.* Indicates_whether_the_inverter_is_reachable\
openDTU/[serial]/status/producing:.* Indicates_whether_the_inverter_is_producing_AC_power\
openDTU/[serial]/status/last_update:.* Unix_timestamp_of_last_inverter_statistics_update\
\
openDTU/[serial]/0/current:.* AC_current_in_ampere\
openDTU/[serial]/0/efficiency:.* Ratio_AC_Power_over_DC_Power_in_percent\
openDTU/[serial]/0/frequency:.* AC_frequency_in_hertz\
openDTU/[serial]/0/power:.* AC_active_power_in_watts\
openDTU/[serial]/0/powerdc:.* DC_power_in_watts\
openDTU/[serial]/0/powerfactor:.* Power_factor_in_percent\
openDTU/[serial]/0/reactivepower:.* AC_reactive_power_in_VAr\
openDTU/[serial]/0/temperature:.* Temperature_of_inverter_in_degree_celsius\
openDTU/[serial]/0/voltage:.* AC_voltage_in_volt\
openDTU/[serial]/0/yieldday:.* Energy_converted_to_AC_per_day_in_watt_hours\
openDTU/[serial]/0/yieldtotal:.* Energy_converted_to_AC_since_reset_watt_hours\
\
openDTU/[serial]/1/current:.* CH1_DC_current_of_specific_input_in_ampere\
openDTU/[serial]/1/name:.* CH1_Name_of_the_DC_input_channel_as_configured_in_web_GUI\
openDTU/[serial]/1/irradiation:.* CH1_Ratio_DC_Power_over_set_maximum_power_in_web_GUI\
openDTU/[serial]/1/power:.* CH1_DC_power_of_specific_input_in_watt\
openDTU/[serial]/1/voltage:.* CH1_DC_voltage_of_specific_input_in_volt\
openDTU/[serial]/1/yieldday:.* CH1_Energy_converted_to_AC_per_day_on_specific_input\
openDTU/[serial]/1/yieldtotal:.* CH1_Energy_converted_to_AC_since_reset_on_specific_input\
\
openDTU/[serial]/2/current:.* CH2_DC_current_of_specific_input_in_ampere\
openDTU/[serial]/2/name:.* CH2_Name_of_the_DC_input_channel_as_configured_in_web_GUI\
openDTU/[serial]/2/irradiation:.* CH2_Ratio_DC_Power_over_set_maximum_power_in_web_GUI\
openDTU/[serial]/2/power:.* CH2_DC_power_of_specific_input_in_watt\
openDTU/[serial]/2/voltage:.* CH2_DC_voltage_of_specific_input_in_volt\
openDTU/[serial]/2/yieldday:.* CH2_Energy_converted_to_AC_per_day_on_specific_input\
openDTU/[serial]/2/yieldtotal:.* CH2_Energy_converted_to_AC_since_reset_on_specific_input\
\
openDTU/[serial]/3/current:.* CH3_DC_current_of_specific_input_in_ampere\
openDTU/[serial]/3/name:.* CH3_Name_of_the_DC_input_channel_as_configured_in_web_GUI\
openDTU/[serial]/3/irradiation:.* CH3_Ratio_DC_Power_over_set_maximum_power_in_web_GUI\
openDTU/[serial]/3/power:.* CH3_DC_power_of_specific_input_in_watt\
openDTU/[serial]/3/voltage:.* CH3_DC_voltage_of_specific_input_in_volt\
openDTU/[serial]/3/yieldday:.* CH3_Energy_converted_to_AC_per_day_on_specific_input\
openDTU/[serial]/3/yieldtotal:.* CH3_Energy_converted_to_AC_since_reset_on_specific_input\
\
openDTU/[serial]/4/current:.* CH4_DC_current_of_specific_input_in_ampere\
openDTU/[serial]/4/name:.* CH4_Name_of_the_DC_input_channel_as_configured_in_web_GUI\
openDTU/[serial]/4/irradiation:.* CH4_Ratio_DC_Power_over_set_maximum_power_in_web_GUI\
openDTU/[serial]/4/power:.* CH4_DC_power_of_specific_input_in_watt\
openDTU/[serial]/4/voltage:.* CH4_DC_voltage_of_specific_input_in_volt\
openDTU/[serial]/4/yieldday:.* CH4_Energy_converted_to_AC_per_day_on_specific_input\
openDTU/[serial]/4/yieldtotal:.* CH4_Energy_converted_to_AC_since_reset_on_specific_input\
\
openDTU/[serial]/status/limit_relative:.* Current_applied_production_limit_of_the_inverter\
openDTU/[serial]/status/limit_absolute:.* Current_applied_production_limit_of_the_inverter
attr MQTT2_openDTU room MQTT2_DEVICE
attr MQTT2_openDTU setList limit_of_total_production_persistent_PROZENT:20,40,60,80,100 openDTU/[serial]/cmd/limit_persistent_relative $EVTPART1\
limit_of_total_production_persistent_WATT:200,400,800,1200,1600,2000 openDTU/[serial]/cmd/limit_persistent_absolute $EVTPART1\
limit_of_total_production_NON_persistent_PROZENT:20,40,60,80,100 openDTU/[serial]/cmd/limit_nonpersistent_relative $EVTPART1\
limit_of_total_production_NON_persistent_WATT:200,400,800,1200,1600,2000 openDTU/[serial]/cmd/limit_nonpersistent_absolute $EVTPART1\
on:noArg openDTU/[serial]/cmd/power 1\
off:noArg openDTU/[serial]/cmd/power 0\
restart:noArg openDTU/[serial]/cmd/restart 1
attr MQTT2_openDTU webCmd limit_of_total_production_persistent_PROZENT:limit_of_total_production_persistent_WATT:limit_of_total_production_NON_persistent_PROZENT:limit_of_total_production_NON_persistent_WATT
attr MQTT2_openDTU webCmdLabel limit_of_total_production_persistent_PROZENT\
:\
limit_of_total_production_persistent_WATT\
:\
limit_of_total_production_NON_persistent_PROZENT\
:\
limit_of_total_production_NON_persistent_WATT

Da ich im Moment noch nicht weiß, was dann nach Verbindung mit dem Mikrowechselrichter an Informationen fließt, ist das noch ein wenig hypothetisch.

Fragen (Image im Anhang):

1) wie schaffe ich es, dass nach senden von zB "limit_of_total_production_persistent_WATT" der string nicht im state erscheint und das "ein/aus Lämpchen" überschreibt?
2) wie schaffe ich es, dass die DropDowns den tatsächlich eingetragenen Wert wiederspiegeln? Falls überhaupt möglich.
3) das topic status auf state umzulegen in Kombi mit "attr MQTT2_openDTU devStateIcon online:rc_GREEN offline:rc_RED" hat auch nur halb funktioniert, mit dem selben Problem wie in 1)

Ich frage mich, ob es überhaupt möglich ist, das Gewünschte zu erreichen:

- DropDowns stellen den aktuellen Wert dar und setzen diesen bei Betätigung
- Online/Offline wird mit einem grünen/roten icon dargestellt. Bei klick auf Icon wird zwischen on/off umgeschaltet. Daneben noch ein "Reboot"-Icon, wäre die Krönung.

Und vielleicht macht die Idee der Darstellung generell keinen Sinn oder macht es übertrieben komplex. Falls jemand sinnvollere Vorschläge hat ....

Das sind im Prinzip keine direkten mqtt Fragen, aber in Kombi doch sehr zusammengehörig. Die Darstellungsmöglichkeiten in fhem und die Kombinationen der zu setzenden attr überfordern mein Hirn ;)



rudolfkoenig

Ungetestete Vorschlaege:

Zitatwie schaffe ich es, dass nach senden von zB "limit_of_total_production_persistent_WATT" der string nicht im state erscheint und das "ein/aus Lämpchen" überschreibt?
stateFormat und/oder webCmd Attribut setzen.

Zitatwie schaffe ich es, dass die Slider den tatsächlich eingetragenen Wert wiederspiegeln?
Das Frontend sucht nach einem Reading mit dem gleichen Namen wie der Befehl.

Zitat- Online/Offline wird mit einem grünen/roten icon dargestellt. Bei klick auf Icon wird zwischen on/off umgeschaltet. Daneben noch ein "Reboot"-Icon, wäre die Krönung.
Siehe webCmd/webCmdLabel

Damit ich was testen kann, brauche ich zu der oben gezeigten Definition passende Nachrichten.

holle75

Hallo Rudolf, bin die letzten Stunden am Rumprobieren gewesen. Recht erfolglos. Ich werde das Ding binnen der nächsten zwei Wochen in Betrieb nehmen und dann hoffe ich auf Readings.

Die Idee, das "aus dem Kopf" zu machen war vielleicht ein bißchen überambitioniert. Ich wollte vorarbeiten ...

Schreibe hier dann weiter.

Beta-User

"setStateList" wäre noch ein Stichwort.

Die Vermischung von dtu und Inverter-Device ist m.E. auch nicht zu empfehlen, und dass openDTU kein JSON kann, ist ein Makel, der bei einem Inverter noch nicht besonders ins Gewicht fällt.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

DasQ

Hat für die opendtu nicht auch ein Template?
Fhem on MacMini/Ubuntu.
Absoluter Befürworter der Konsequenten-Kleinschreibung https://de.wikipedia.org/wiki/Kleinschreibung
Infos zu Klimawandel http://www.globalcarbonatlas.org

holle75

Hats, das ist auch gut, aber ein wenig "reduziert". Betas Idee mit der Trennung von DTU und Inverter aufgenommen und bißchen weitergekommen. Obs funktioniert wird sich zeigen, wenn Werte kommen.
Mit dem setStateList ignore bin ich mir noch nicht ganz so sicher, ob das so stimmen kann. Frequenz hats noch kein Reading

defmod MQTT2_openDTU MQTT2_DEVICE
attr MQTT2_openDTU autocreate 1
attr MQTT2_openDTU bridgeRegexp openDTU/([[:xdigit:]]+)/.*:.*  "openDTU_$1"
attr MQTT2_openDTU comment https://www.opendtu.solar/firmware/mqtt_topics/
attr MQTT2_openDTU devStateIcon online:rc_GREEN offline:rc_RED
attr MQTT2_openDTU event-min-interval .*:900
attr MQTT2_openDTU event-on-change-reading uptime:60,temperature:1,rssi:3,.*
attr MQTT2_openDTU event-on-update-reading .*
attr MQTT2_openDTU icon solar
attr MQTT2_openDTU model hoymiles_opendtu_hub_bridge
attr MQTT2_openDTU readingList openDTU/status:.* status\
openDTU/dtu/uptime:.* uptime\
openDTU/dtu/ip:.* ip\
openDTU/dtu/rssi:.* rssi\
openDTU/dtu/temperature:.* temperature\
openDTU/dtu/hostname:.* hostname\
\
openDTU/ac/power:.* power_ac\
openDTU/ac/yieldtotal:.* yieldtotal\
openDTU/ac/yieldday:.* yieldday\
openDTU/ac/is_valid:.* is_valid\
\
openDTU/dc/power:.* power_dc\
openDTU/dc/irradiation:.* irradiation\
openDTU/dc/is_valid:.* is_validdc\
\
openDTU/[serial]/name:.* Name_of_the_inverter_as_configured_in_web_GUI\
openDTU/[serial]/device/bootloaderversion:.* Bootloader_version_of_the_inverter\
openDTU/[serial]/device/fwbuildversion:.* Firmware_version_of_the_inverter\
openDTU/[serial]/device/fwbuilddatetime:.* Build_date__time_of_inverter_firmware\
openDTU/[serial]/device/hwpartnumber:.* Hardware_part_number_of_the_inverter\
openDTU/[serial]/device/hwversion:.* Hardware_version_of_the_inverter\
openDTU/[serial]/radio/tx_request:.* Amount_of_sent_packet_requests\
openDTU/[serial]/radio/tx_re_request:.* Amount_of_sent_fragment_resend_requests\
openDTU/[serial]/radio/rx_success:.* Amount_of_successfully_received_packets\
openDTU/[serial]/radio/rx_fail_nothing:.* Amount_of_failed_packets_nothing_was_received\
openDTU/[serial]/radio/rx_fail_partial:.* Amount_of_failed_packets_some_fragments_were_missing\
openDTU/[serial]/radio/rx_fail_corrupt:.* Amount_of_failed_packets_payload_corrupt\
openDTU/[serial]/radio/rssi:.* RSSI_of_last_received_packet\
openDTU/[serial]/status/reachable:.* Indicates_whether_the_inverter_is_reachable\
openDTU/[serial]/status/producing:.* Indicates_whether_the_inverter_is_producing_AC_power\
openDTU/[serial]/status/last_update:.* Unix_timestamp_of_last_inverter_statistics_update\
\
openDTU/[serial]/0/current:.* AC_current_in_ampere\
openDTU/[serial]/0/efficiency:.* Ratio_AC_Power_over_DC_Power_in_percent\
openDTU/[serial]/0/frequency:.* AC_frequency_in_hertz\
openDTU/[serial]/0/power:.* AC_active_power_in_watts\
openDTU/[serial]/0/powerdc:.* DC_power_in_watts\
openDTU/[serial]/0/powerfactor:.* Power_factor_in_percent\
openDTU/[serial]/0/reactivepower:.* AC_reactive_power_in_VAr\
openDTU/[serial]/0/temperature:.* Temperature_of_inverter_in_degree_celsius\
openDTU/[serial]/0/voltage:.* AC_voltage_in_volt\
openDTU/[serial]/0/yieldday:.* Energy_converted_to_AC_per_day_in_watt_hours\
openDTU/[serial]/0/yieldtotal:.* Energy_converted_to_AC_since_reset_watt_hours\
\
openDTU/[serial]/1/current:.* CH1_DC_current_of_specific_input_in_ampere\
openDTU/[serial]/1/name:.* CH1_Name_of_the_DC_input_channel_as_configured_in_web_GUI\
openDTU/[serial]/1/irradiation:.* CH1_Ratio_DC_Power_over_set_maximum_power_in_web_GUI\
openDTU/[serial]/1/power:.* CH1_DC_power_of_specific_input_in_watt\
openDTU/[serial]/1/voltage:.* CH1_DC_voltage_of_specific_input_in_volt\
openDTU/[serial]/1/yieldday:.* CH1_Energy_converted_to_AC_per_day_on_specific_input\
openDTU/[serial]/1/yieldtotal:.* CH1_Energy_converted_to_AC_since_reset_on_specific_input\
\
openDTU/[serial]/2/current:.* CH2_DC_current_of_specific_input_in_ampere\
openDTU/[serial]/2/name:.* CH2_Name_of_the_DC_input_channel_as_configured_in_web_GUI\
openDTU/[serial]/2/irradiation:.* CH2_Ratio_DC_Power_over_set_maximum_power_in_web_GUI\
openDTU/[serial]/2/power:.* CH2_DC_power_of_specific_input_in_watt\
openDTU/[serial]/2/voltage:.* CH2_DC_voltage_of_specific_input_in_volt\
openDTU/[serial]/2/yieldday:.* CH2_Energy_converted_to_AC_per_day_on_specific_input\
openDTU/[serial]/2/yieldtotal:.* CH2_Energy_converted_to_AC_since_reset_on_specific_input\
\
openDTU/[serial]/3/current:.* CH3_DC_current_of_specific_input_in_ampere\
openDTU/[serial]/3/name:.* CH3_Name_of_the_DC_input_channel_as_configured_in_web_GUI\
openDTU/[serial]/3/irradiation:.* CH3_Ratio_DC_Power_over_set_maximum_power_in_web_GUI\
openDTU/[serial]/3/power:.* CH3_DC_power_of_specific_input_in_watt\
openDTU/[serial]/3/voltage:.* CH3_DC_voltage_of_specific_input_in_volt\
openDTU/[serial]/3/yieldday:.* CH3_Energy_converted_to_AC_per_day_on_specific_input\
openDTU/[serial]/3/yieldtotal:.* CH3_Energy_converted_to_AC_since_reset_on_specific_input\
\
openDTU/[serial]/4/current:.* CH4_DC_current_of_specific_input_in_ampere\
openDTU/[serial]/4/name:.* CH4_Name_of_the_DC_input_channel_as_configured_in_web_GUI\
openDTU/[serial]/4/irradiation:.* CH4_Ratio_DC_Power_over_set_maximum_power_in_web_GUI\
openDTU/[serial]/4/power:.* CH4_DC_power_of_specific_input_in_watt\
openDTU/[serial]/4/voltage:.* CH4_DC_voltage_of_specific_input_in_volt\
openDTU/[serial]/4/yieldday:.* CH4_Energy_converted_to_AC_per_day_on_specific_input\
openDTU/[serial]/4/yieldtotal:.* CH4_Energy_converted_to_AC_since_reset_on_specific_input\
\
openDTU/[serial]/status/limit_relative:.* limit_relative\
openDTU/[serial]/status/limit_absolute:.* limit_absolute
attr MQTT2_openDTU room MQTT2_DEVICE
attr MQTT2_openDTU setList limit_relative:slider,10,10,100 openDTU/[serial]/cmd/limit_persistent_relative $EVTPART1\
limit_absolute:slider,200,100,2000 openDTU/[serial]/cmd/limit_persistent_absolute $EVTPART1\
limit_nonpersistent_relative:slider,10,10,100 openDTU/[serial]/cmd/limit_nonpersistent_relative $EVTPART1\
limit_nonpersistent_absolute:slider,200,100,2000 openDTU/[serial]/cmd/limit_nonpersistent_absolute $EVTPART1\
Inverter_on_off:uzsuSelectRadio,1,0 openDTU/[serial]/cmd/power $EVTPART1
attr MQTT2_openDTU setStateList ignore
attr MQTT2_openDTU stateFormat status\
<br>\
<br>\
Leistung power_ac W\
<br>\
Tag yieldday Wh\
<br>\
Frequenz AC AC_frequency_in_hertz Hz\
<br>\
<a href="http://ip" target="_blank">http://ip</a>
attr MQTT2_openDTU webCmd limit_relative:limit_absolute:limit_nonpersistent_relative:limit_nonpersistent_absolute:Inverter_on_off
attr MQTT2_openDTU webCmdLabel Limit Leistung Persistent PROZENT\
:\
Limit Leistung Persistent WATT\
:\
Limit Leistung Temp PROZENT\
:\
Limit Leistung Temp WATT\
:\
Inverter AN(1) / AUS(0)

Beta-User

Trockenübungen bringen einfach nichts, und das mit der Trennung ergibt 2 Devices, nicht eins...

Habe hier z.B. 8 Inverter, das ergibt 9 Devices - 8 kann man (theoretisch) regeln, eines repräsentiert die (Ahoy-) DTU (mit Summen-Werten usw.).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

holle75

Denke, bei einem Inverter kann man das auch in ein Device packen. Dachte du meinst die Online Anzeige der DTU nicht mit dem Schalten An/Aus des Inverters zu verbinden.