76_SMAInverter.pm - Abfrage von SMA Wechselrichter

Begonnen von sct14675, 28 Juli 2016, 11:01:16

Vorheriges Thema - Nächstes Thema

Panzerschrauber

Zitat von: cwagner am 09 September 2026, 12:48:10Der erwähnte Update von SMA ( 4.08.29.R ) womöglich in Verbindung mit einem Update des Storages samt BMS (1.01.54.R) führt auch an anderen Stellen Veränderungen von Stringdefinitionen sowie Messages zu Ausfällen/Veränderungen. Bei mir (STP 6.0 SE, also Hybrid-WR) ist es zum Beispiel die Readings bat_temp, .....
Christian
Da ich zwei STP8 am laufen habe und der zweite glücklicherweise noch nicht geändert wurde, konnte ich mit einem TCP dump von beiden Wechselrichtern mit sudo tcpdump -i any -nn -X -s 0 host <IP des geänderten Wechselrichters> and port 9522 -w stp8_neu.pcap und sudo tcpdump -i any -nn -X -s 0 host <IP des 'alten' Wechselrichters> and port 9522 -w stp8_alt.pcap ziehen. Den habe ich von ChatGbt analysieren lassen.
Weiterhin kann mit folgenden Änderungen im 76_SMAInverter.pm die Antwort des Wechselrichters ins fhem-xxx.log geschrieben werden.
Im sub SMAInverter_getstatusDoParse($) {:
nach dem Kommando suchen, mit dem das Modul die Daten vom Wechselrichter holt (z.B. f($detail_level > 1) {
          ....
          elsif ($INVTYPE_NAME =~ /SBS(1\.5|2\.0|2\.5)/xs || $INVCLASS eq "8009")
#der STP8 läuft unter 8009
     {
      push(@commands, "sup_BatteryInfo_2");     # Check BatteryInfo Voltage
      push(@commands, "sup_BatteryInfo_Charge");
     }         
Nach dem sup weiter unten im Code suchen
Dort zu finden: ($sup_BatteryInfo_2,$inv_BAT_TEMP,$inv_BAT_UDC,$inv_BAT_IDC,$inv_susyid,$inv_serial) = SMAInverter_SMAcommand($hash, $hash->{HOST}, 0x51000200, 0x00491E00, 0x00495DFF); Dei letzten zwei Parameter sind im Aufruf sub SMAInverter_SMAcommand($$$$$) {
 my ($hash,$host,$command,$first,$last) $first und $last (Adressbereich der aus dem WR ausgelesen werden soll)
nach # Check the data identifier
if ($first == 0x00491E00)
{
    Log3 $name, 1, sprintf("$name - Data identifier 0x%08X", $data_ID);
    my $raw_data = unpack("H*", substr($data, 55, $size - 55));
    Log3 $name, 1, "$name - RAW=$raw_data";
}
Bitte beachten: die data_Id ist in der Logausgabe gedreht (4a49 im Log ist tatsächlich 494A), ...
(Little-Endian: das niederwertige Byte zuerst gespeichert), oder einfach den HexCode einer AI übergeben.
Die Werte können dann mit denen im Wechselrichter verglichen werden, sofern ein Zugang auf die Webseite möglich ist.
Über den Weg bin ich auch die Sub Ids und deren Bedeutung gestoßen.


300P

Warum denn solch ein Umweg ?? :o
Verbose 5 und es gibt doch alle gesendeten und empfangenen Daten ins Log....  ;)
2026.09.09 19:06:28 4: SB40 - ###############################################################
2026.09.09 19:06:28 4: SB40 - ##########  Begin of new SMAInverter get data cycle  ##########
2026.09.09 19:06:28 4: SB40 - ###############################################################
2026.09.09 19:06:28 4: SB40 - timeout cycles since module start: 2, Interval: 15
2026.09.09 19:06:28 4: SB40 - start BlockingCall
2026.09.09 19:06:28 4: SB40 - running BlockingCall SMAInverter_getstatusDoParse
2026.09.09 19:06:28 4: SB40 -> INVCLASS 8001
2026.09.09 19:06:28 4: SB40 -> INVTYPE 9403
2026.09.09 19:06:28 4: SB40 -> start BlockingCall SMAInverter_getstatusDoParse
2026.09.09 19:06:28 4: SB40 - current time: 09.09.2026 17:06:28
2026.09.09 19:06:28 4: SB40 - operation time begin: 09.09.2026 06:17:08
2026.09.09 19:06:28 4: SB40 - operation time end: 09.09.2026 20:33:58
2026.09.09 19:06:28 4: SB40 - detail-level: 2
2026.09.09 19:06:28 5: SB40 - SB4.0-1AV-41 (Sunny Boy 4.0 AV-41)
2026.09.09 19:06:28 4: SB40 - Send login to 192.xxxxxxxxxx on Port 9522 with password xxxxxxxxx as user
2026.09.09 19:06:28 5: SB40 - Send: 534D410000.....................
2026.09.09 19:06:28 5: SB40 - Received: 534d4100000.............
2026.09.09 19:06:28 4: SB40 - logged in to inverter serial: 3xxxxxx, susyid: xxxx
2026.09.09 19:06:28 5: SB40 - Logged in now
2026.09.09 19:06:28 5: SB40 -> sup_TypeLabel
2026.09.09 19:06:28 3: SB40 - Send request 000..... to 192.1xxxxxxx on port 9522
2026.09.09 19:06:28 5: SB40 - send: 534D4100000........
2026.09.09 19:06:28 5: SB40 - Received: 534d4100000........
2026.09.09 19:06:28 5: SB40 - Data identifier 33310
2026.09.09 19:06:28 5: SB40 - Found Data CLASS=xxxxxx and TYPE=xxxxx
2026.09.09 19:06:28 5: SB40 -> sup_EnergyProduction
2026.09.09 19:06:28 3: SB40 - Send request 0002....... to 192.xxxxxxxxxx on port 9522
2026.09.09 19:06:28 5: SB40 - send: 534D4100.....
2026.09.09 19:06:28 5: SB40 - Received: 534d4100000.....
2026.09.09 19:06:28 5: SB40 - Data identifier 9729
2026.09.09 19:06:28 5: SB40 - Data SPOT_ETOTAL=11111111111 and SPOT_ETODAY=111111111
2026.09.09 19:06:28 5: SB40 -> sup_SpotDCPower........usw. etc.......
Gruß
300P

FHEM 6.4|RPi|SMAEM|SMAInverter|SolarForecast| DbLog|DbRep|MariaDB|Buderus-MQTT_EMS|
Fritzbox|fhempy|JsonMod|HTTPMOD|Modbus ser+TCP| ESP32_AI_on_the_Edge|ESP32CAM usw.

Panzerschrauber

Zitat von: 300P am 09 September 2026, 19:14:53Warum denn solch ein Umweg ?? :o
Verbose 5 und es gibt doch alle gesendeten und empfangenen Daten ins Log....  ;)
2026.09.09 19:06:28 4: SB40 - ###############################################################
[/quote]
Danke für den Hinweis, hat den Vorteil, nichts in der 76 er Routine ändern zu müssen.
Mit meiner wird nur die Nachricht ausgegeben, die mich interessiert und auch nur der Teil beginnend mit der data_id. Spart etwas Sucharbeit im Logeintrag.