Erfahrungen mit der Anbindung von Huawei Wechselrichtern?

Begonnen von lingerb, 30 Oktober 2020, 20:02:56

Vorheriges Thema - Nächstes Thema

bertl

#255
Hallo Pit,

bezüglch Modbus Definitionsdatei 98_ModbusSUN2000WR hast du das richtig verstanden.

Die Datei von meinem Post aktuelle Modbus Definition downloaden, je nach Belieben die Register/Readings löschen welche du nicht benötigst, und dann nach FHEM kopieren.

Viel Spaß mit der Auswertung deiner Anlage
Robert


piet_pit

Hallo,
vielen Dank für die Info. Ich habe jetzt die Definitionsdatei geladen, klappt soweit. Ich bin mir nur nicht sicher, ob die Daten richtig in FHEM ankommen, muss ich jetzt mal prüfen.
Ist viel Neuland für mich.

Vielen Dank und viele Grüße
Pit
FHEM Latest Revision: 29615
Raspberry Pi 3, Rasbian-Stretch
FRITZ!Box 7690
HM-Mod-RPI-PCB, JeeLink
CUNO 1.47

piet_pit

Hallo,

nun klappt es auch bei mir, die Daten aus dem WR kommen in FHEM an, ich hatte die falsche modbusID angegeben.

Vielen Dank nochmals für die tolle Arbeit.
viele Gruesse
Pit
FHEM Latest Revision: 29615
Raspberry Pi 3, Rasbian-Stretch
FRITZ!Box 7690
HM-Mod-RPI-PCB, JeeLink
CUNO 1.47

Wasserwerk33

Zitat von: bertl am 07 Februar 2025, 10:46:35Hallo Wasserwerk33,

ich habe nur einen Wechselrichter (WR), aber soweit ich das System verstanden habe,
musst du den zweiten WR zusätzlich über eine eigen Modbus-ID in FHEM einbinden.
Welcher WR welche Modbus-ID hat, findest du unter den RS485_1 Einstellungen als Komm.adresse (via FusionSolar-App als Installateur auf den jeweiligen WR einloggen oder Installateur fragen welcher WR welche Modbus-ID eingestellt hat).
Laut Doku hat der Master-WR die Modbus-ID 1 und jeder zusätzliche Slave-WR wird aufsteigend nummeriert.

Beispiel:
define mdbsWR_Master ModbusSUN2000WR 1 60 <IP-Adresse>:502 TCP
define mdbsWR_Slave1 ModbusSUN2000WR 2 60 <IP-Adresse>:502 TCP

Schönen Tag
Robert


Leider funktioniert das bei mir so nicht. Sie springen immer hin und her zwischen opend und disconnected.
Sie sind untereinander verbunden(kaskadiert). Ich greife die Daten vom WLAN doungle ab. Aber bekomme ja leider immer nur den einen mitgeteilt. Wenn ich den einen aktiv und den anderen inaktiv setze passen die Solarwerte auch zusammen ( rechnerisch), aber das kann so ja nicht richtig sein.

Hat noch jemand eine Idee?

rallye

Hallo zusammen!

Ich habe mir aus diesem Beitrag von @passible die Definition kopiert und aus diesem Beitrag von @bertl das Modul ModbusSUN2000WR in mein FHEM geladen.
Abgesehen von den "attr"s sieht meine Definition so aus:
defmod pv_wr ModbusSUN2000WR 1 30 192.168.57.20 TCP und der Status springt in kurzen Abständen zwischen "disconnected, waiting to reappear" und "reappeared" hin und her.
2025.05.04 17:11:27 3: 192.168.57.20:502 reappeared (pv_wr)
2025.05.04 17:11:27 3: 192.168.57.20:502 disconnected, waiting to reappear (pv_wr)
2025.05.04 17:11:28 3: 192.168.57.20:502 reappeared (pv_wr)
2025.05.04 17:11:28 3: 192.168.57.20:502 disconnected, waiting to reappear (pv_wr)
2025.05.04 17:11:29 3: 192.168.57.20:502 reappeared (pv_wr)
2025.05.04 17:11:29 3: 192.168.57.20:502 disconnected, waiting to reappear (pv_wr)
2025.05.04 17:11:30 3: 192.168.57.20:502 reappeared (pv_wr)
2025.05.04 17:11:30 3: 192.168.57.20:502 disconnected, waiting to reappear (pv_wr)
2025.05.04 17:11:31 3: 192.168.57.20:502 reappeared (pv_wr)
2025.05.04 17:11:31 3: 192.168.57.20:502 disconnected, waiting to reappear (pv_wr)
2025.05.04 17:11:32 3: 192.168.57.20:502 reappeared (pv_wr)
2025.05.04 17:11:32 3: 192.168.57.20:502 disconnected, waiting to reappear (pv_wr)
2025.05.04 17:11:33 3: 192.168.57.20:502 reappeared (pv_wr)
2025.05.04 17:11:33 3: 192.168.57.20:502 disconnected, waiting to reappear (pv_wr)
2025.05.04 17:11:34 3: 192.168.57.20:502 reappeared (pv_wr)
2025.05.04 17:11:34 3: 192.168.57.20:502 disconnected, waiting to reappear (pv_wr)

Meine ModbusAttr-Definition hingegen funktioniert einwandfrei
defmod Sun2000 ModbusAttr 1 10 192.168.57.20:502 TCPKann mir bitte jemand sagen was ich falsch mache?

Danke

NB: ob ich den Port angebe oder nicht ändert am Problem leider nichts
RaspiPi v4, HM-LGW, 6x HM-TC-IT-WM-W-EU, 11x HM-CC-RT-DN, 1x HUE Bridge, 4x HUE-RC, 5x HUE White&Color, 15xHUE White, 3xHM-LC-SW1-FM, 1xHM-LC-SW2-FM, 1x ConBeeII, 15x Shelly1, 5xShellyplug, Aquara: 2x Temp-Sensor, 1x Vibrationssensor, 2x Lichtsensor, 19x Tür/Fenstersensor

cs-online

...nur zum Verständnis, das läuft beides zur selben Zeit? Würde meinen, dass immer nur ein device gleichzeitig auf die IP zugreifen kann oder?

Grüße Christian
FHEM auf RPI 4 4GB, HM-WLAN-Gateway, einige HM-Aktoren,2x EBUSD an Heizung+Solar, ESP8266/32 am Strom-,Gas-,Wasserzähler, in WLAN-Steckdosen und Relaisleisten, Sonoff S20+S26,Shelly1/2/2.5, Lacrosse-Gateway und Sensoren,Sduino,Alexa-Fhem,Huawei PV+Speicher, alles auf einem RPI und da geht noch mehr

rallye

Zitat von: cs-online am 04 Mai 2025, 20:48:30...nur zum Verständnis, das läuft beides zur selben Zeit? Würde meinen, dass immer nur ein device gleichzeitig auf die IP zugreifen kann oder?
Ja, hatte ich so eingerichtet - und du hast Recht: es geht immer nur eines!

Danke und Grüße
Joe
RaspiPi v4, HM-LGW, 6x HM-TC-IT-WM-W-EU, 11x HM-CC-RT-DN, 1x HUE Bridge, 4x HUE-RC, 5x HUE White&Color, 15xHUE White, 3xHM-LC-SW1-FM, 1xHM-LC-SW2-FM, 1x ConBeeII, 15x Shelly1, 5xShellyplug, Aquara: 2x Temp-Sensor, 1x Vibrationssensor, 2x Lichtsensor, 19x Tür/Fenstersensor

TheTrumpeter

Zitat von: bertl am 29 Oktober 2024, 10:48:56ich poste euch hiermit mal meine aktuelle Modbus Definition und alle Register in einer Excel-Datei.

In dieser Definition sind sehr viele Register enthalten, welche sicher nicht von allen benötigt werden.
Falls diverse Register/Readings nicht benötigt werden einfach auskommentieren oder löschen.

Mir geht es in erster Linie darum, mal eine halbwegs vollständige Definition zu posten, wo sich jeder das heraus nimmt, was er benötigt.

Ich habe eine Benachrichtigung bei WR-Status ungleich den "üblichen guten" Status.
Dabei habe ich einige Status beobachtet, die nicht als "Klartext" verfügbar/bekannt sind. Fast alle Status treten ohne gesetzte Alarm-Bits auf und scheinen nur kurz "anzuliegen". Eine Auswirkung auf die Leistung ist nicht sichtbar.

Weiß jemand wofür diese Werte stehen? In der Excel-Tabelle habe ich nichts gefunden & an die FusionSolar-App werden die - im Gegensatz beispielsweise zum "Ausschaltfehler 0x0300" - auch nicht gemeldet:

0x34A0
0x2AA2
0x2DC0
0x0A78
0x2B4B
0x34F2
0x3707
0x087D
0x2806
0x305D
0x144F in Kombination mit Alarmbits 0, 4, 5, 7, 8
0x098C
0x046F
0x1BE5
0x066B
0x2E15
0x1DC1
0x0C58
0x001F
0x0066
0x1BA6
0x08E2 in Kombination mit Alarm-Bit 3
0x2848
0x0703
0x0421
0x0923
0x220C
0x2179
0x01B1

Wenn ich mich nicht verschaut habe ist kein einziger Status 2x gekommen, scheint fast irgendeine Übertragungsstörung zu sein???
FHEM auf RPi3, THZ (LWZ404SOL), RPII2C & I2C_MCP342x (ADCPiZero), PowerMap, CustomReadings, RPI_GPIO, Twilight, nanoCUL (WMBus für Diehl Wasserzähler & Regenerationszähler für BWT AqaSmart), ESPEasy, TPLinkHS110

bertl

Hallo TheTrumpeter,

ich kann deine Frage leider nicht ganz nachvollziehen - von wo bekommst du diese Werte?

Wenn du meine Vorlage verwendet hast, dann müssen die Status- und Alarm-Werte anders aussehen.
  "h32000" =>  {
                 expr        => 'sprintf( "0b%010b",$val )',
                 len         => 1,
                 reading     => "A_Status_1",
                 unpack      => "n",
               },
  "h32002" =>  {
                 expr        => 'sprintf( "0b%03b",$val )',
                 len         => 1,
                 reading     => "A_Status_2",
                 unpack      => "n",
               },
  "h32003" =>  {
                 expr        => 'sprintf( "0b%02b",$val )',
                 len         => 2,
                 reading     => "A_Status_3",
                 unpack      => "N",
               },
  "h32008" =>  {
                 expr        => 'sprintf( "0b%016b",$val )',
                 len         => 1,
                 reading     => "A_Alarm_1",
                 unpack      => "n",
               },
  "h32009" =>  {
                 expr        => 'sprintf( "0b%016b",$val )',
                 len         => 1,
                 reading     => "A_Alarm_2",
                 unpack      => "n",
               },
  "h32010" =>  {
                 expr        => 'sprintf( "0b%014b",$val )',
                 len         => 1,
                 reading     => "A_Alarm_3",
                 unpack      => "n",
               },
Oder geht es bei deiner Frage um andere Stati und Alarme?

Um die Stati und Alarme auszuwerten habe ich folgenden Code im Einsatz:
define ntf_mdbsWR notify mdbsWR:A_.*:.* {\
  my %mdbsWREvents = (\
    A_Status_1 => [ 'standby',\
                    'grid connected',\
                    'normally',\
                    'with derating due to power rationing',\
                    'with derating due to internal causes of the solar inverter',\
                    'stop normal',\
                    'stop due to faults',\
                    'stop due to power rationing',\
                    'shutdown',\
                    'spot check', ],\
    A_Status_2 => [ 'status unlocked',\
                    'PV status connected',\
                    'DSP data collection yes',\
                    'status locked',\
                    'PV status disconnected',\
                    'DSP data collection no', ],\
    A_Status_3 => [ 'grid off',\
                    'grid switch off',\
                    'grid on',\
                    'grid switch on', ],\
    A_Alarm_1  => [ 'High String Input Voltage - 2001',\
                    'DC Arc Fault [1] - 2002',\
                    'String Reverse Connection - 2011',\
                    'String Current Backfeed - 2012',\
                    'Abnormal String Power - 2013',\
                    'AFCI Self-Check Fail [1] - 2021',\
                    'Phase Wire Short-Circuited to PE - 2031',\
                    'Grid Loss - 2032',\
                    'Grid Undervoltage - 2033',\
                    'Grid Overvoltage - 2034',\
                    'Grid Volt. Imbalance - 2035',\
                    'Grid Overfrequency - 2036',\
                    'Grid Underfrequency - 2037',\
                    'Unstable Grid Frequency - 2038',\
                    'Output Overcurrent - 2039',\
                    'Output DC Component Overhigh - 2040', ],\
    A_Alarm_2  => [ 'Abnormal Residual Current - 2051',\
                    'Abnormal Grounding - 2061',\
                    'Low Insulation Resistance - 2062',\
                    'Overtemperature - 2063',\
                    'Device Fault - 2064',\
                    'Upgrade Failed or Version Mismatch - 2065',\
                    'License Expired - 2066',\
                    'Faulty Monitoring Unit - 61440',\
                    'Faulty Power Collector [2] - 2067',\
                    'Battery abnormal - 2068',\
                    'Active Islanding - 2070',\
                    'Passive Islanding - 2071',\
                    'Transient AC Overvoltage - 2072',\
                    'Peripheral port short circuit [3] - 2075',\
                    'Churn output overload [4] - 2077',\
                    'Abnormal PV module configuration - 2080', ],\
    A_Alarm_3  => [ 'Optimizer fault [5] - 2081',\
                    'Built-in PID operation abnormal [6] - 2085',\
                    'High input string voltage to ground - 2014',\
                    'External Fan Abnormal - 2086',\
                    'Battery Reverse Connection [7] - 2069',\
                    'On-grid/Off-grid controller abnormal [4] - 2082',\
                    'PV String Loss - 2015',\
                    'Internal Fan Abnormal - 2087',\
                    'DC Protection Unit Abnormal [8] - 2088',\
                    'EL Unit Abnormal - 2089',\
                    'Active Adjustment Instruction Abnormal - 2090',\
                    'Reactive Adjustment Instruction Abnormal - 2091',\
                    'CT Wiring Abnormal - 2092',\
                    'DC Arc Fault (ADMC Alarm to be clear manually) - 2003', ],\
  );;\
  my $mdbsWRreading = ( split( ":",$EVTPART0 ) )[0];;\
  my $val = oct( $EVTPART1 );;\
  my $message = "";;\
\
  foreach my $group (keys %mdbsWREvents) {\
    if( $group eq $mdbsWRreading ) {\
      my $imax = $#{ $mdbsWREvents{$group} };;\
      if( $mdbsWRreading eq "A_Status_2" || $mdbsWRreading eq "A_Status_3" ) {\
        $imax = ( $imax - 1 ) / 2;;\
      }\
      for( my $i = 0;; $i <= $imax;; $i++ ) {\
        if( $val>>$i & 1 ) {\
          if( $message ne "" ) {\
            $message .= " + ";;\
          }\
          $message .= $mdbsWREvents{$group}[$i];;\
        }\
        else {\
          if( $mdbsWRreading eq "A_Status_2" || $mdbsWRreading eq "A_Status_3" ) {\
            if( $message ne "" ) {\
              $message .= " + ";;\
            }\
            $message .= $mdbsWREvents{$group}[$i+$imax+1];;\
          }\
        }\
      }\
      if( $mdbsWRreading ne "A_Status_1" && $mdbsWRreading ne "A_Status_2" ) {\
        Log 3, "$SELF: $mdbsWRreading - Bit-Aenderung von '".OldReadingsVal( $NAME,$mdbsWRreading,'-' )."' auf '$EVTPART1'";;\
        Log 3, "$SELF: $mdbsWRreading - $message";;\
      }\
      if( $mdbsWRreading =~ "A_Alarm_" ) {\
        fhem( "set Telegram message \@Robert_Prenninger $SELF: <b>$mdbsWRreading</b>\n$message" );;\
      }\
      last;;\
    }\
  }\
}
attr ntf_mdbsWR group ModbusHuaweiWR
attr ntf_mdbsWR icon measure_photovoltaic_inst
attr ntf_mdbsWR room Photovoltaik
Bitte um mehr Infos bzw. Details.

Schönes WE
Robert

TheTrumpeter

#264
Danke für die Antwort.

Ich habe hier mit irgendeiner Definition begonnen bevor es Dein Template gab, habe aber verschiedene Dinge ,,nachgezogen".

Die genannten Werte bekomme ich über das Status-Register wie z.B. ,,Standby" oder ,,Netz verbunden".
In den letzten ca. 2 Jahren sind da zusätzlich zu den üblichen Status auch die oben genannten Werte gekommen. (Ich habe ein Notify, was auf andere Werte als die bekannten ,,guten" triggert.)

attr myHuawei obj-h32089-expr $val/1
attr myHuawei obj-h32089-group 3-1
attr myHuawei obj-h32089-len 1
attr myHuawei obj-h32089-map 0:Standby, 1:Standby, 2:Standby, 3:Standby, 256:Starting, 512:Netz verbunden, 513:Leistung begrenzt, 514:Selbstabsenkung, 768:Ausschaltfehler, 769:shutdown_command, 770:Shutdown OVGR, 771:Shutdown Comm Disconn, 772:Shutdown leistungsbegrenzt, 773:Shutdown Handeinschaltung benötigt, 774:Shutdown DC Schalter nicht verbunden, 775:Shutdown Schnellabschaltung, 776:Shutdown Eingangsminderleistung, 1025:Grid_scheduling_cosφ-P_curve, 1026:Grid_scheduling_Q-U_curve, 1027:Grid_scheduling_PF-U_curve, 1028:Grid_scheduling_dry_contact, 1029:Grid_scheduling_Q-P_curve, 1280:Spot Check Bereit, 1281:Spot Checking, 1536:Inspektion, 1792:AFCI Self Check, 2048:I-V Scannen, 2304:DC Eingangserkennung, 2560:Netzunterbrechung laden, 40960:Standby ohne Strahlung
attr myHuawei obj-h32089-poll 1
attr myHuawei obj-h32089-reading Device_status
attr myHuawei obj-h32089-unpack n
FHEM auf RPi3, THZ (LWZ404SOL), RPII2C & I2C_MCP342x (ADCPiZero), PowerMap, CustomReadings, RPI_GPIO, Twilight, nanoCUL (WMBus für Diehl Wasserzähler & Regenerationszähler für BWT AqaSmart), ESPEasy, TPLinkHS110

bertl

Ok verstehe!

Ich habe mir gerade meine Werte vom Register h32089 in der Datenbank angesehen und bei mir kommen nur folgende definierten Werte (0, 1, 2, 3, 512, 513, 768, 769, 40960) seit 2 Jahren vor.

Falls doch mal undefinierte Werte (nicht unter 'map' angeführt) gekommen sein sollten (so wie bei dir), müssten in den Log Dateien Meldungen sein.
grep --include=\fhem-20*.log -rnw '/opt/fhem/log/' -e "MapConvert called from CreateDataObjects did not find"
Bei mir kommen keine solche undefinierten Werte vor.

Somit dürfte das wohl ein spezifischen Problem bei deiner Anlage sein - sorry!