FHEM Forum

FHEM - Energiemanagement und Energieerzeugung => Solaranlagen => Thema gestartet von: Jackie am 23 April 2025, 10:22:19

Titel: Hoymiles MS-A2 in FHEM integrierbar?
Beitrag von: Jackie am 23 April 2025, 10:22:19
Hallo,

ich würde gerne den Hoymiles MS-A2 ohne Balkonkraftwerk betreiben, eine (große) PV Anlage ist bereits vorhanden, und somit quasi gerne über FHEM - hier kommen alle Daten vom Fronius Wechselrichter und Smartmeter (ISKRA) an - eine Nulleinspeisung umsetzen. Leider finde ich aber kein Modul, um den Hoymiles MS-A2 in FHEM zu integrieren. Habt ihr eine Idee wie das möglich wäre?
Titel: Aw: Hoymiles MS-A2 in FHEM integrierbar?
Beitrag von: Gerrit am 23 April 2025, 10:36:00
Zitat von: Jackie am 23 April 2025, 10:22:19Habt ihr eine Idee wie das möglich wäre?

Moin,

Ende Mai soll wohl ein Firmwareupdate kommen, welches eine Anbindung per MQTT möglich machen sollte.
Titel: Aw: Hoymiles MS-A2 in FHEM integrierbar?
Beitrag von: Jackie am 23 April 2025, 10:45:18
Danke, wäre übergangsweise das hier eine Option?

https://ahoydtu.de/
Titel: Aw: Hoymiles MS-A2 in FHEM integrierbar?
Beitrag von: Gerrit am 23 April 2025, 10:57:08
Zitat von: Jackie am 23 April 2025, 10:45:18Danke, wäre übergangsweise das hier eine Option?

https://ahoydtu.de/

Nein, ich denke nicht. Ahoy bzw. OpenDTU sprechen per Funkmodul NRF24L01+ (oder CMT2300A für HMS / HMT) auf 868MHz mit den Hoymiles-Wechselrichtern.
Der MS-A2 kann nur WLAN und Bluetooth.
Titel: Aw: Hoymiles MS-A2 in FHEM integrierbar?
Beitrag von: TomLee am 23 April 2025, 11:08:58

Zitat... auf 868MHz ...

NRF24L0+

Titel: Aw: Hoymiles MS-A2 in FHEM integrierbar?
Beitrag von: Gerrit am 23 April 2025, 11:16:21
ja, recht hast Du natürlich! Die 868MHz sollten sich auf den CMT2300 beziehen.  ;)
Bleibt aber dabei: der MS-A2 kann nur WLAN und Bluetooth.
Titel: Aw: Hoymiles MS-A2 in FHEM integrierbar?
Beitrag von: tomcat.x am 23 April 2025, 14:56:12
Hallo,

zumindest zum Abruf der Daten nutze ich übergangsweise (bis zur direkten MQTT-Anbindung):

https://github.com/krikk/hoymiles-ms-a2-to-mqtt (https://github.com/krikk/hoymiles-ms-a2-to-mqtt)

Viele Grüße
Thomas
Titel: Aw: Hoymiles MS-A2 in FHEM integrierbar?
Beitrag von: Gerrit am 06 Juni 2025, 07:11:28
Zur Info: der MS-A2 lässt sich seit gestern nun auch per MQTT anbinden.
(Vorher App-Update unter Android/IOS machen und dann die Firmware des MS-A2 aktualisieren)
Einstellungen für den Broker findet man dann in der App unter Systemeinstellungen -> MQTT-Service.
Titel: Aw: Hoymiles MS-A2 in FHEM integrierbar?
Beitrag von: VB90 am 06 Juni 2025, 11:51:48
Kommen die Daten in Echtzeit, vom Gerät selbst, oder verzögert aus der Cloud?

vb
Titel: Aw: Hoymiles MS-A2 in FHEM integrierbar?
Beitrag von: Gerrit am 06 Juni 2025, 11:54:06
Netzintern ohne Cloud. Die wichtigen Parameter sekündlich. Alle anderen alle 5min.
Titel: Aw: Hoymiles MS-A2 in FHEM integrierbar?
Beitrag von: sprudelverduenner am 08 März 2026, 16:57:19
Hallo zusammen,

ich versuche seit heute eine Hoymiles Battery AC 1920 in FHEM per MQTT zu integrieren.

Die Readings kommen grundsätzlich rein.

Jetzt versuche ich den EMS-Mode von general auf mqtt_ctrl zu ändern damit ich die Ein- oder Ausspeisung selber steuern kann - es gelingt mir aber nicht.

In den Readings steht unter anderem:
supported_topics_ems_mode
homeassistant/select/MSA-280425400590/ems_mode/command

Also habe ich ein setList in meinem device mit
ems_mode_on:noArg homeassistant/select/MSA-280425400590/ems_mode/command mqtt_ctrlangelegt und versuche dann mit
set <device> ems_mode_onden MQTT-MODE zu ändern - aber es geht nicht.

Kann mich einer in die richtige Richtung schubsen?

Besten Dank vorab.
LG, Sprudelverduenner
Titel: Aw: Hoymiles MS-A2 in FHEM integrierbar?
Beitrag von: Jochen_M am 25 Mai 2026, 21:26:48
Hallo Sprudelverduenner, bist du hier zu einer Lösung gekommen? Kannst Du die noch teilen?

LG Jochen
Titel: Aw: Hoymiles MS-A2 in FHEM integrierbar?
Beitrag von: sprudelverduenner am 26 Mai 2026, 22:54:14
Hi Jochen,

ja... ich habe es ein paar Tage später ans Laufen bekommen - die Infos im Netz hierüber sind nur sehr spärlich.

Die Vorgehensweise aus den vorherigen Beitrag ist grundsätzlich richtig.

Nach dem
set <device> ems_mode_ongeht es noch weiter.

Man muss dann alle 10 Sekunden z.B. ein
set <device> set 100senden. Nach maximal 5 Minuten wird das Reading ems_mode aktualisiert und steht nun auf den Wert mqtt_ctrl.

Jetzt muss man z.B. alle 10 Sekunden einen charge oder discharge Befehl senden z.B. mit einem DOIF. Macht man das nicht dann fällt der Speicher 60 Senkunden nach dem letzten set-Befehl zurück auf die Einstellungen in der APP, dass heißt er speißt dauerhaft mit einem festen Wert aus oder lädt mit einem festen Wert.

LG, Sprudelverduenner
Titel: Aw: Hoymiles MS-A2 in FHEM integrierbar?
Beitrag von: Jochen_M am 19 Juni 2026, 18:47:24
Hallo Sprudelverduenner,
war eine weile im Urlaub, habe nun auch einen Hoymiles HiBattery 1920 AC und versuche Ihne einzubinden.
Geht mir wie Dir, auslesen geht, aber umstellen... ;-)

Kannst Du evtl. Dein Setup nochmal komplett bereitstellen, z.B. als kompletten code der Einbindung?

Hast Du eine attrTemplate verwendet?

Danke, bin für jede Hilfe dankbar ;-)

Jochen
Titel: Aw: Hoymiles MS-A2 in FHEM integrierbar?
Beitrag von: sprudelverduenner am 19 Juni 2026, 19:41:00
Moin Jochen,

Jetzt bin ich noch bis Montag im Urlaub - ich kann mich dann nochmal gerne melden...
Titel: Aw: Hoymiles MS-A2 in FHEM integrierbar?
Beitrag von: matthias_t am 19 Juni 2026, 20:34:15
Hallo zusammen,

was für ein Zufall, ich scheitere auch just in diesem Moment an dieser Angelegenheit.

@sprudelverduenner: Deine komplette Config wäre wirklich Gold wert, vorab vielen Dank! :)

Grüße
Matthias
Titel: Aw: Hoymiles MS-A2 in FHEM integrierbar?
Beitrag von: Jochen_M am 22 Juni 2026, 11:57:38
Hallo @sprudelverduenner, @matthias_t,
Ich habe den Hoymiles HiBattery 1920 AC am Wochenende in meiner FHEM Umgebung zum Laufen bekommen und alles hier mal zusammengefasst.

Ist vielleicht nicht der beste Weg, ab so scheint es bei mir zu funktionieren.
Gerne freue ich mich über Verbesserungsvorschläge oder Optimierungen.

Danke an die Community. 8)


Ich habe eine HiBattery 1920 AC und lesen meinen GRID Status mit einem IR Reader (Tasmota base) aus.

Devices:
- HiBattery 1920 AC >> MSA_xxxxxxxxxxxxx
  --> muss angepasst werden
  --> Arbeitsbereich SoC 15-95%
  --> Notfallbeladung SoC < 12% (Vermeidung einer Tiefenentladung)
- GRID Strommesser (Tasmota IR Reader) >> MQTT2_DVES_aaaaaa --> muss angepasst werden

Hier die Definition des Devices:
define MSA_xxxxxxxxxxxxx MQTT2_DEVICE MSA_xxxxxxxxxxxxx
attr MSA_xxxxxxxxxxxxx alias HiBattery_1920_AC
attr MSA_xxxxxxxxxxxxx devStateIcon {\
    my $onl = ReadingsVal($name,'bat_sts','standby') eq 'charge'?'10px-kreis-gruen':'10px-kreis-rot';;\
    $onl = FW_makeImage($onl);;\
    my $light = ReadingsVal($name,'bat_sts','standby') eq 'standby'?FW_makeImage('off'):FW_makeImage('on');;\
    my $emsmode = ReadingsVal($name,'ems_mode','general');;\
    my $plug_p = ReadingsNum($name,'sys_plug_p',0);;\
    my $grid_p = ReadingsNum($name,'sys_grid_p',0);;\
    my $soc = ReadingsNum($name,'soc',0);;\
    my $temp = ReadingsVal($name,'bat_temp','-100');; \
    my $batsts = ReadingsVal($name,'bat_sts','standby');; \
    my $batheating = ReadingsVal($name,'heat','false');;\
    my $connection = ReadingsNum($name,'rssi',0);;\
    \
    my $eIn = ReadingsNum($name,'grid_1_ein',0);;  # eingespeiste Energie in Batterie heute [Wh]\
    my $eOut = ReadingsNum($name,'grid_1_eout',0);; # entnommene Energie in Batterie heute [Wh]\
    my $etIn = ReadingsNum($name,'grid_1_etin',0);; # eingespeiste Energie in Batterie gesammt [Wh]\
    my $etOut = ReadingsNum($name,'grid_1_etout',0);; # entnommene Energie in Batterie gesammt [Wh]    \
    my $etRation = ReadingsNum($name,'myetRatio',0);; # Wirkungsgrad etout/etin\
    \
    qq(${light}${onl}<div>EMSmode: $emsmode / Mode: $batsts / SOC: $soc % / RSSI: $connection dBm</div><div>Power Plug: $plug_p W / Grid Plug: $grid_p W / Temp: $temp °C / BATheating: $batheating</div><div>Energie: today In: $eIn Wh Out: $eOut Wh / Total In: $etIn Wh Out: $etOut Wh / Wirkungsgrad: $etRation %</div>)\
}
attr MSA_xxxxxxxxxxxxx group Energie Devices
attr MSA_xxxxxxxxxxxxx icon measure_battery_100
attr MSA_xxxxxxxxxxxxx readingList MSA_xxxxxxxxxxxxx:homeassistant/sensor/MSA-xxxxxxxxxxxxx/quick/state:.* { json2nameValue($EVENT) }\
MSA_xxxxxxxxxxxxx:homeassistant/switch/MSA-xxxxxxxxxxxxx/config:.* { json2nameValue($EVENT) }\
MSA_xxxxxxxxxxxxx:homeassistant/sensor/MSA-xxxxxxxxxxxxx/attributes:.* { json2nameValue($EVENT) }\
MSA_xxxxxxxxxxxxx:homeassistant/number/MSA-xxxxxxxxxxxxx/power_ctrl/config:.* config\
MSA_xxxxxxxxxxxxx:homeassistant/sensor/MSA-xxxxxxxxxxxxx/soc/config:.* { json2nameValue($EVENT) }\
MSA_xxxxxxxxxxxxx:homeassistant/sensor/MSA-xxxxxxxxxxxxx/bat_p/config:.* { json2nameValue($EVENT) }\
MSA_xxxxxxxxxxxxx:homeassistant/select/MSA-xxxxxxxxxxxxx/ems_mode/config:.* config\
MSA_xxxxxxxxxxxxx:homeassistant/sensor/MSA-xxxxxxxxxxxxx/system/state:.* { json2nameValue($EVENT) }\
MSA_xxxxxxxxxxxxx:homeassistant/sensor/MSA-xxxxxxxxxxxxx/device/state:.* { json2nameValue($EVENT) }
attr MSA_xxxxxxxxxxxxx room MQTT2_DEVICE
attr MSA_xxxxxxxxxxxxx setList ems_mode_on:noArg homeassistant/select/MSA-xxxxxxxxxxxxx/ems_mode/command mqtt_ctrl\
set:slider,-500,-400,-300,-200,-100,-50,0,50,100,200,300,400,500 homeassistant/number/MSA-xxxxxxxxxxxxx/power_ctrl/set

Logfile:
define FileLog_MSA_xxxxxxxxxxxxx FileLog ./log/MSA_HiBattery-%Y-%m.log MSA_xxxxxxxxxxxxx:my.*:.*
attr FileLog_MSA_xxxxxxxxxxxxx logtype text
attr FileLog_MSA_xxxxxxxxxxxxx room MQTT2_DEVICE

#falls HiBattery in "ems_mode" "general" wechselt, rückstellung auf "mqtt_ctrl"
#dazu Funktion "EMSModeWatchdog" in 99_myUtils.pm (siehe unten)

define di_ems_mode_watchdog DOIF (\
 ([MQTT2_DVES_aaaaaa:SML_curr_w])\
 and\
 ([?di_ems_mode_watchdog:active] <= 1)\
 and\
 ([?MSA_xxxxxxxxxxxxx:ems_mode] ne "mqtt_ctrl")\
)\
(\
  { EMSModeWatchdog("MSA_xxxxxxxxxxxxx") }\
)\
DOELSE\
()
attr di_ems_mode_watchdog cmdState 1#wakeUp|#2MQTTconnected
attr di_ems_mode_watchdog cmdpause 60:60
attr di_ems_mode_watchdog do always
attr di_ems_mode_watchdog icon time_timer
attr di_ems_mode_watchdog room MQTT2_DEVICE,Power_Analyse

#Steuerung, basierend auf dem Verbrauch/Einspeisungswert des GRID Strommesser (Tasmota IR Reader)

define DI_HiBattery_1_SMLcurrW DOIF
(
 (
  ([MQTT2_DVES_aaaaaa:SML_curr_w] >= 0)
  and
  ([?MSA_xxxxxxxxxxxxx:ems_mode] eq "mqtt_ctrl")
 )
)
(
 {
  my $tag = "DI_HiBattery_1_SMLcurrW"; 
  my $cmdLevel = "cmd1";
  my $GRIDpower = round(ReadingsNum('MQTT2_DVES_aaaaaa','SML_curr_w',0),0);
  my $soc = ReadingsNum('MSA_xxxxxxxxxxxxx','soc',0);
  my $AlertChargeStatus = ReadingsNum('DI_HiBattery_1_SMLcurrW','AlertCharge',0);
  my $MSApower = round(ReadingsNum('MSA_xxxxxxxxxxxxx','bat_p',0),0);
  my $newValue = 0;
  my $hour = (localtime(time))[2];
  my $PowerOutReductionTime = 17;
  my $PowerOutMax = 400;
  if ($AlertChargeStatus == 1) {
    $cmdLevel = "cmd1.1";
    $newValue = -50;
  }
  elsif ($soc <= 15) {
    $cmdLevel = "cmd1.2";
    $newValue = 0;
  }
  elsif (($GRIDpower >= 51) && ($soc >= 15.1)) {
    if ($MSApower <= 1) {
      $cmdLevel = "cmd1.3.1";
      $newValue = round($MSApower + $GRIDpower - 40,0);
      $newValue = $PowerOutMax if (($hour >= $PowerOutReductionTime) && ($newValue > $PowerOutMax));
    }
    else {
      $cmdLevel = "cmd1.3.2";
      $newValue = round($GRIDpower - 40,0);
      $newValue = $PowerOutMax if (($hour >= $PowerOutReductionTime) && ($newValue > $PowerOutMax));
    }
  }
  else {
    if ($GRIDpower + $MSApower <= 0 ) {
      $cmdLevel = "cmd1.4.1";
      $newValue = round($MSApower + $GRIDpower +25,0);
      $newValue = $PowerOutMax if (($hour >= $PowerOutReductionTime) && ($newValue > $PowerOutMax));
    }
    else {
      $cmdLevel = "cmd1.4.2";
      $newValue = $MSApower;
      $newValue = 0 if ($newValue <= 0);
    }
  }
  fhem("set MSA_xxxxxxxxxxxxx set $newValue");
 }
)
DOELSEIF
(
 (
  ([MQTT2_DVES_aaaaaa:SML_curr_w] <= -1)
  and
  ([?MSA_xxxxxxxxxxxxx:ems_mode] eq "mqtt_ctrl")
  and
  ([?MSA_xxxxxxxxxxxxx:bat_p] >= 1)
 )
)
(
 {
  my $tag = "DI_HiBattery_1_SMLcurrW"; 
  my $cmdLevel = "cmd2";
  my $soc = ReadingsNum('MSA_xxxxxxxxxxxxx','soc',0);
  my $GRIDpower = ReadingsNum('MQTT2_DVES_aaaaaa','SML_curr_w',0);
  my $MSApower = ReadingsNum('MSA_xxxxxxxxxxxxx','bat_p',0);
  my $newValue = $GRIDpower+$MSApower+20;
  $newValue = 0 if ($newValue > 0);
  fhem("set MSA_xxxxxxxxxxxxx set $newValue");
 }
)
DOELSEIF
(
 (
  ([MQTT2_DVES_aaaaaa:SML_curr_w] <= -25)
  and
  ([?MSA_xxxxxxxxxxxxx:ems_mode] eq "mqtt_ctrl")
  and
  ([?MSA_xxxxxxxxxxxxx:soc] <= 94.9)
 )
)
(
 {
  my $tag = "DI_HiBattery_1_SMLcurrW"; 
  my $cmdLevel = "cmd3";
  my $soc = ReadingsNum('MSA_xxxxxxxxxxxxx','soc',0);
  my $GRIDpower = ReadingsNum('MQTT2_DVES_aaaaaa','SML_curr_w',0);
  my $MSApower = ReadingsNum('MSA_xxxxxxxxxxxxx','bat_p',0);
  my $newValue = round($MSApower+$GRIDpower+20,0);
  fhem("set MSA_xxxxxxxxxxxxx set $newValue");
 }
)
DOELSEIF
(
  ([MQTT2_DVES_aaaaaa:SML_curr_w] <= -10)
  and
  ([?MSA_xxxxxxxxxxxxx:ems_mode] eq "mqtt_ctrl")
    and
  ([?MSA_xxxxxxxxxxxxx:soc] <= 94.9)
)
(
 {
  my $tag = "DI_HiBattery_1_SMLcurrW"; 
  my $cmdLevel = "cmd4";
  my $soc = ReadingsNum('MSA_xxxxxxxxxxxxx','soc',0);
  my $GRIDpower = ReadingsNum('MQTT2_DVES_aaaaaa','SML_curr_w',0);
  my $MSApower = round(ReadingsNum('MSA_xxxxxxxxxxxxx','bat_p',0),0);
  my $newValue = $MSApower; 
  fhem("set MSA_xxxxxxxxxxxxx set $newValue");
 }
)
DOELSEIF
(
  ([MQTT2_DVES_aaaaaa:SML_curr_w] <= 0)
    and
  ([?MSA_xxxxxxxxxxxxx:ems_mode] eq "mqtt_ctrl")
    and
  ([?MSA_xxxxxxxxxxxxx:soc] >= 95)
)
(
 {
  my $tag = "DI_HiBattery_1_SMLcurrW"; 
  my $cmdLevel = "cmd5";
  my $soc = ReadingsNum('MSA_xxxxxxxxxxxxx','soc',0);
  my $GRIDpower = ReadingsNum('MQTT2_DVES_aaaaaa','SML_curr_w',0);
  my $MSApower = round(ReadingsNum('MSA_xxxxxxxxxxxxx','bat_p',0),0);
  my $newValue = 0;
  fhem("set MSA_xxxxxxxxxxxxx set $newValue");
 }
)
DOELSE
(
 {
  my $tag = "DI_HiBattery_1_SMLcurrW"; 
  my $cmdLevel = "cmd6";
  my $soc = ReadingsNum('MSA_xxxxxxxxxxxxx','soc',0);
  my $GRIDpower = ReadingsNum('MQTT2_DVES_aaaaaa','SML_curr_w',0);
  my $MSApower = round(ReadingsNum('MSA_xxxxxxxxxxxxx','bat_p',0),0);
  my $newValue = $MSApower; 
  fhem("set MSA_xxxxxxxxxxxxx set $newValue");
 }
)
attr DI_HiBattery_1_SMLcurrW checkall event
attr DI_HiBattery_1_SMLcurrW cmdState #1AkkuDisCharge|#2AkkuCharge|#3KeepAlive
attr DI_HiBattery_1_SMLcurrW do always
attr DI_HiBattery_1_SMLcurrW icon measure_power
attr DI_HiBattery_1_SMLcurrW room MQTT2_DEVICE

#Vermeidung der vielen Events im LOG, eigene Readings zum loggen der "wichtigen" Messwerte
#Quick Daten, alle 1 Minuten
define atPowerDataStore_HiBatttery_1 at +*00:01:00 {\
  my $function = "atPowerDataStore_HiBatttery_1";;\
  my $DeviceName_HiBatt = "MSA_xxxxxxxxxxxxx";;\
  my $Value_sys_plug_p = ReadingsNum($DeviceName_HiBatt,'sys_plug_p',0) || 0;;\
  if ($Value_sys_plug_p != 0) {\
   fhem ("setreading $DeviceName_HiBatt myPowerPlug $Value_sys_plug_p");;\
   Log 3, $function.": data stored";;\
  }\
}
attr atPowerDataStore_HiBatttery_1 alignTime 00:00
attr atPowerDataStore_HiBatttery_1 icon time_clock
attr atPowerDataStore_HiBatttery_1 room MQTT2_DEVICE

#Status Daten, alle 5 Minuten
define atPowerDataStore_HiBatttery_2 at +*00:05:00 {\
  my $function = "atPowerDataStore_HiBatttery_5";;\
  my $DeviceName_HiBatt = "MSA_xxxxxxxxxxxxx";;\
  my $Value_soc = ReadingsNum($DeviceName_HiBatt,'soc',0) || 0;;\
  my $Value_ems_mode = ReadingsVal($DeviceName_HiBatt,'ems_mode',"na");;\
  my $Value_grid_1_ein = ReadingsNum($DeviceName_HiBatt,'grid_1_ein',0) || 0;;\
  my $Value_grid_1_eout = ReadingsNum($DeviceName_HiBatt,'grid_1_eout',0) || 0;;\
  my $Value_grid_1_etin = ReadingsNum($DeviceName_HiBatt,'grid_1_etin',0) || 0;;\
  my $Value_grid_1_etout = ReadingsNum($DeviceName_HiBatt,'grid_1_etout',0) || 0;;\
  my $ValueetRatio = 0;;\
  if ($Value_grid_1_etout >= 0.1) {\
   $ValueetRatio = round($Value_grid_1_etout/$Value_grid_1_etin*100,0);;\
  }\
  fhem ("setreading $DeviceName_HiBatt mysoc $Value_soc");;  \
  fhem ("setreading $DeviceName_HiBatt myems_mode $Value_ems_mode");;\
  fhem ("setreading $DeviceName_HiBatt myein $Value_grid_1_ein");;\
  fhem ("setreading $DeviceName_HiBatt myeout $Value_grid_1_eout");;\
  fhem ("setreading $DeviceName_HiBatt myetin $Value_grid_1_etin");;\
  fhem ("setreading $DeviceName_HiBatt myetout $Value_grid_1_etout");;\
  fhem ("setreading $DeviceName_HiBatt myetRatio $ValueetRatio");;\
  Log 3, $function.": data stored";;\
}
attr atPowerDataStore_HiBatttery_2 alignTime 00:01
attr atPowerDataStore_HiBatttery_2 icon time_clock
attr atPowerDataStore_HiBatttery_2 room MQTT2_DEVICE

#Plot zum Darstung der Leistung "myPowerPlug" und SoC Status "mysoc"
define SVG_FileLog_MSA_xxxxxxxxxxxxx_1 SVG FileLog_MSA_xxxxxxxxxxxxx:SVG_FileLog_MSA_xxxxxxxxxxxxx_1:CURRENT
attr SVG_FileLog_MSA_xxxxxxxxxxxxx_1 alias HiBatteryStatus#0
attr SVG_FileLog_MSA_xxxxxxxxxxxxx_1 plotsize 800,320
attr SVG_FileLog_MSA_xxxxxxxxxxxxx_1 room MQTT2_DEVICE

#wenn SoC < 12% dann LadeAlert setzen, entfernen wenn 15% erreicht ist
#Sicherstellung, das das HiBattery nicht tiefentladen wird (z.B. im Winter)
define DI_HiBattery_1_AlertCharge DOIF (\
  ([MSA_xxxxxxxxxxxxx:soc] <= 12)\
)\
(\
  {\
    fhem("setreading DI_HiBattery_1_SMLcurrW AlertCharge 1");;\
    my $soc = ReadingsNum('MSA_xxxxxxxxxxxxx','soc',0);;\
    Log 3, "DI_HiBattery_1_AlertCharge - cmd1 : SoC= $soc % - AlertCharge >> 1 (Alert)";; \
  }\
)\
DOELSEIF\
(\
  ([MSA_xxxxxxxxxxxxx:soc] >= 15)\
  and\
  ([?DI_HiBattery_1_SMLcurrW:AlertCharge] >= 0.1)\
)\
(\
  {\
    fhem("setreading DI_HiBattery_1_SMLcurrW AlertCharge 0");;\
    my $soc = ReadingsNum('MSA_xxxxxxxxxxxxx','soc',0);;\
    Log 3, "DI_HiBattery_1_AlertCharge - cmd1 : SoC= $soc % - AlertCharge >> 0";; \
  }\
)\
DOELSE\
()\
attr DI_HiBattery_1_AlertCharge checkall event
attr DI_HiBattery_1_AlertCharge cmdState #1SoCState-Charging|#2SoCState-ChargingFinish|#3:-
attr DI_HiBattery_1_AlertCharge do always
attr DI_HiBattery_1_AlertCharge icon measure_power
attr DI_HiBattery_1_AlertCharge room MQTT2_DEVICE

#Email, wenn SoC LadeAlert gesetzt wird
define DI_HiBattery_1_AlertCharge_EMail DOIF ([DI_HiBattery_1_SMLcurrW:AlertCharge] >= 0.1) \
(\
  {\
  my $soc = ReadingsNum('MSA_xxxxxxxxxxxxx','soc',0);;\
  DebianMail('myemail@provider.de',"RASPI Info HiBattery SoC Alert - SoC Wert: ".$soc,\
     "INFO: DI_HiBattery_1_SMLcurrW - SoC Alert"\
    ."\n"."   Batteriestatus: ".$soc." %"\
    ."\n"\
     ."\n"."Datenerhebung vom ".JM_time_DE_system()."\n"\
    ,'');;\
  }\
)\
DOELSE\
()
attr DI_HiBattery_1_AlertCharge_EMail checkall event
attr DI_HiBattery_1_AlertCharge_EMail cmdState #1:AlertEMail|#2:-
attr DI_HiBattery_1_AlertCharge_EMail do always
attr DI_HiBattery_1_AlertCharge_EMail icon message_mail_open
attr DI_HiBattery_1_AlertCharge_EMail room MQTT2_DEVICE


Funktion in 99_myUtils.pm
sub EMSModeWatchdog($)
{
  my ($dev) = @_;

  my $target = "mqtt_ctrl";
  my $mode   = ReadingsVal($dev, 'ems_mode', '');

  my $state  = ReadingsNum('di_ems_mode_watchdog','active',0);
  my $start  = ReadingsNum('di_ems_mode_watchdog','start',0);
  my $now    = time();

  # Start initialisieren
  if(!$state)
  {
    fhem("setreading di_ems_mode_watchdog active 1");
    fhem("setreading di_ems_mode_watchdog start $now");
  }

  # Ziel erreicht -> Stop
  if($mode eq $target)
  {
    fhem("setreading di_ems_mode_watchdog active 0");
    return;
  }

  my $elapsed = $now - $start;

  # 10 Minuten Timeout
  if($elapsed >= 600)
  {
    fhem("set Mailer msg 'EMS Mode Fehler: mqtt_ctrl nicht erreicht'");
    fhem("setreading di_ems_mode_watchdog active 0");
    return;
  }

  # alle 120s re-init
  if(($now - ReadingsNum('di_ems_mode_watchdog','lastInit',0)) >= 120)
  {
    fhem("set $dev ems_mode_on");
    fhem("setreading di_ems_mode_watchdog lastInit $now");
  }

  # 15s retry
  fhem("set $dev set 0");

  InternalTimer($now+15, "EMSModeWatchdog", $dev, 0);
}

Titel: Aw: Hoymiles MS-A2 in FHEM integrierbar?
Beitrag von: matthias_t am 22 Juni 2026, 12:24:54
Hallo Jochenm_M,

besten Dank für den umfangreichen Input!

Mein Use Case ist ein wenig anders, ich will in die automatische Einspeisung meiner beiden MS-A2 gar nicht eingreifen, das läuft wunderbar autark über den Shelly Pro 3 EM. Ich möchte aber die beiden MS-A2 auf Einspeisung "0" setzen, wenn unser künftiges eAuto an der mobilen Wallbox hängt. Bisher weigern sich die beiden MS-A2 aber beharrlich, überhaupt aus dem ems-Mode "general" herauszukommen. :(

Aber für meinen Ansatz werde ich sicherlich ein Paar Zeilen bei dir abschreiben... ;)

Akzeptiert Deine HiBattery mehrmals hintereinander identische Zielwerte per set? Hier ließt man auch immer verschiedenes...

Grüße
Matthias
Titel: Aw: Hoymiles MS-A2 in FHEM integrierbar?
Beitrag von: Jochen_M am 22 Juni 2026, 13:21:13
Hallo matthias_t,
ich auch noch am evaluieren, aber bisher hatte ich noch keine Problemen mit der aktuellen FW.

EDIT: 2026-07-07 Zur Info: bisher noch keine Probleme mit dem regelmäßigen senden des gleichen Zielwertes (Akzeptiert Deine HiBattery mehrmals hintereinander identische Zielwerte per set? Hier ließt man auch immer verschiedenes...)

Viel Erfolg und die Shelly EM 3Pro habe ich noch nicht implementiert, das kommt erst, wenn der andere Weg zu viel Aufwand macht ;-)

Viel Erfolg
Jochen