Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Node-Red
    5. [HowTo] Huawei SUN2000 WR Modbus mit node-red (read + write)

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [HowTo] Huawei SUN2000 WR Modbus mit node-red (read + write)

    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      MaGe @mickym last edited by

      @mickym, den von dir aufgezeigten Ansatz finde ich sehr interessant und würde diesen gerne verwenden.

      Nur leider verstehe ich nicht wie du von den Modbus-Adressen auf die Bytes im Node inject kommst. 🤷‍♂️
      Könntest du dies bitte an den beiden ersten Werten im buffer-parser (PV1_voltage und PV1_current) mit den Adressen 32016 und 32017 erklären?

      Jetzt wünsche ich allen aber erstmal einen guten Rutsch ins neue Jahr.

      mickym 1 Reply Last reply Reply Quote 0
      • mickym
        mickym Most Active @MaGe last edited by

        @mage Nun wenn Du Dir den buffer mal als String im debug Fenster anschaust, dann steht da nur Schmarrn drin. 😉

        Den Buffer muss Dir schon Deine getter-Node liefern. Mein Ansatz beginnt da, wie die buffer Node dieser Puffer interpretiert.

        Also vergiss den Inhalt der Inject Node selbst.

        Wie Du mehrere Register ausliest, und also die 3 großen Blöcke machst oder diese sogar in einen Buffer abfrägst hat @Spexx ja beschrieben. Dieser Puffer wird nur mit meinem Ansatz anders aufbereitet, als dann zig-Ausgänge zu haben und diese einzeln zu schreiben.

        Wie Du also x-Bytes aufeinmal in einen Puffer ausliest wurde hier beschrieben:
        https://forum.iobroker.net/post/1007480

        Für die Interpretation der Bytes hat ja mal 2 Tabellen mit angehängt, das musst Du ggf. in eigener Doku nachlesen.

        Für dieses Jahr mache ich aber auch erst mal Schluß hier und wünsche Dir und allen Lesern auch einen guten Rutsch. Antwort also bei Bedarf erst nächstes Jahr. 😉

        M 1 Reply Last reply Reply Quote 0
        • 6
          652145 last edited by 652145

          Hallo Zusammen,

          Gibt es die Möglichkeit, die Wirkleistung auf den einzelnen Phasen (Grid) auszulesen, wenn ja, auf welche Register?

          Die einzelnen Spannungen und die einzelnen Ströme bekommen ich auf den Register:

          37101 - Grid voltage Phase 1 [V]
          37103 - Grid voltage Phase 2 [V]
          37105 - Grid voltage Phase 3 [V]

          37107 - Grid current Phase 1 [A]
          37109 - Grid current Phase 2 [A]
          37111 - Grid current Phase 3 [A]

          Habe die Regiester inzwischen gefunden:

          37132 - Phase A ActivePower

          37134 - Phase B ActivePower

          37136 - Phase C ActivePower

          1 Reply Last reply Reply Quote 0
          • M
            MaGe @mickym last edited by MaGe

            @mickym, vielen lieben Dank. Da lag ich wohl komplett daneben. 🙂

            Ich habe die Abfrage mal für die Adressen vom Dongle erstellt.
            bsp.json

            Die Abfrage funktioniert auch.
            09d43645-bfbf-453f-86e5-b97221a84bca-grafik.png

            Nur verstehe ich nicht weshalb bei der Load_power und Total_Battery_power so große Werte ausgegeben werden.

            Laut der Doku ist der Faktor der Gleiche.
            674545f1-9a3d-4454-aa1e-f0402e452bf9-grafik.png

            Bei der einzelnen Abfrage bekomme ich die Werte richtig angezeigt.
            bsp2.json
            0553d1bc-bca8-40a3-a075-6af8c2b4c4c2-grafik.png

            mickym 1 Reply Last reply Reply Quote 0
            • mickym
              mickym Most Active @MaGe last edited by mickym

              @mage

              Grundsätzlich solltest nichts in den Node-Red adapter reinschrieben, sondern immer unter 0_userdata.0

              9ab37556-db84-4d05-8384-31e9b1940dbf-image.png

              Ich denke ich habe Deinen Fehler gefunden:

              bde89a7b-3b41-4f15-b0ff-54f688c72789-image.png

              Wenn Du Dir meinen Flow anschaust - dann sind 32bit Zahlen 4 Bytes groß und nicht 2 Bytes. Bei Deinen Registern mag 2 stimmen - weil die immer in Modbus glaub jedes Register aus 2 Bytes besteht (als 16 bit) und nicht ein Byte - also müsstest Du den Offset neu berechnen.

              Probiere es also mal bei Deiner Sammelabfrage mit dieser Buffer Node:

              [
                 {
                     "id": "55661601dff750a4",
                     "type": "buffer-parser",
                     "z": "00c7a07c321a2bc1",
                     "name": "",
                     "data": "payload",
                     "dataType": "msg",
                     "specification": "spec",
                     "specificationType": "ui",
                     "items": [
                         {
                             "type": "uint32be",
                             "name": "Total_Input_power",
                             "offset": 0,
                             "length": 1,
                             "offsetbit": 0,
                             "scale": "/1000",
                             "mask": ""
                         },
                         {
                             "type": "uint32be",
                             "name": "Load_power",
                             "offset": 4,
                             "length": 1,
                             "offsetbit": 0,
                             "scale": "/1000",
                             "mask": ""
                         },
                         {
                             "type": "int32be",
                             "name": "Grid_power",
                             "offset": 8,
                             "length": 1,
                             "offsetbit": 0,
                             "scale": "/1000",
                             "mask": ""
                         },
                         {
                             "type": "int32be",
                             "name": "Total_Battery_power",
                             "offset": 12,
                             "length": 1,
                             "offsetbit": 0,
                             "scale": "/1000",
                             "mask": ""
                         },
                         {
                             "type": "int32be",
                             "name": "Total_Active_power",
                             "offset": 16,
                             "length": 1,
                             "offsetbit": 0,
                             "scale": "/1000",
                             "mask": ""
                         }
                     ],
                     "swap1": "",
                     "swap2": "",
                     "swap3": "",
                     "swap1Type": "swap",
                     "swap2Type": "swap",
                     "swap3Type": "swap",
                     "msgProperty": "payload",
                     "msgPropertyType": "str",
                     "resultType": "value",
                     "resultTypeType": "output",
                     "multipleResult": true,
                     "fanOutMultipleResult": false,
                     "setTopic": true,
                     "outputs": 1,
                     "x": 380,
                     "y": 240,
                     "wires": [
                         [
                             "f69401eb16129112"
                         ]
                     ]
                 }
              ]
              

              Wenn die Buffer-Node verwendest:

              f6c2acc2-5942-494d-b3fb-45d6a74093e4-image.png

              Dann sollten alle 32 Bit Zahlen die korrekten Byte Offset von 4 enthalten. Also Register im Modbus (16 bit) - Offset im Bufferparse 1 Byte (8 bit)

              M 1 Reply Last reply Reply Quote 0
              • M
                MaGe @mickym last edited by

                @mickym, vielen Dank. Es lag tatsächlich am Offset. Den Pfad habe ich auch geändert.

                Jetzt habe ich gerade versucht, den nächsten Block anzuhängen. Muss ich dabei irgendwas beachten, was ich übersehen habe? Es werden beim zweiten Block keine Werte ausgegeben.

                6720854a-beec-4b63-8ba0-4436a405d47f-grafik.png

                bsp3.json

                mickym 1 Reply Last reply Reply Quote 0
                • mickym
                  mickym Most Active @MaGe last edited by mickym

                  @mage das kann ich nicht beantworten- schaut aber erst mal so aus, als ob da die Node noch nicht bereit ist- warum liest man aber nicht alles auf einmal aus? Das würde den Bus viel weniger belasten? Du kannst wieder eine Delay dazwischen hängen, aber warum liest man nicht 100 Register auf einmal? Oder halt mit einer debug node schauen, wo die Nachricht verschluckt wird.

                  M 1 Reply Last reply Reply Quote 0
                  • M
                    MaGe @mickym last edited by

                    @mickym, es wird folgende Fehlermeldung ausgegeben:

                    "Error: Modbus exception 2: Illegal data address (register not supported by device)"

                    Die Adressen sind aber richtig? 🤷‍♂️
                    f92f3902-1874-43e6-b968-ce7cba5687c6-grafik.png

                    bsp4.json

                    mickym 1 Reply Last reply Reply Quote 0
                    • mickym
                      mickym Most Active @MaGe last edited by

                      @mage wie gesagt, alles was Möbus selbst angeht, da kann ich nicht helfen. Ich würde halt mal versuchen, alles auf einmal auszulesen. Kann doch sein, dass der bus überfordert ist. Oder mach eine Delay Node dazwischen. Aber lieber 100 Register auf einmal, als 10 mal 10. prüfe halt, ob es geht, wenn du nur die untere triggerst. Wenn das geht, dann weißt du, dass der Bus noch nicht in der Lage war, weitere Anfragen zu verkraften.

                      M 1 Reply Last reply Reply Quote 0
                      • M
                        MaGe @mickym last edited by

                        @mickym, nun habe ich den Fehler endlich gefunden. 🙂
                        Der Dongle hat die ID:100 und der Inverter, der Meter und die Batterie die ID:1.
                        Und wenn man überall die ID:100 setzt, kann es ja auch nicht gehen.
                        Jetzt funktioniert es wie es soll.

                        Gibt es eigentlich bei Node-Red eine Möglichkeit die Last eines flows im Bus zu messen?
                        Dann könnte ich meinen ersten flow (Einzelabfrage) mit dem jetzigen flow (Blockabfrage) vergleichen.
                        Und bei Notwendigkeit das von dir angesprochene zusammenfassen weiterer Blöcke noch umsetzen.

                        mickym 1 Reply Last reply Reply Quote 0
                        • mickym
                          mickym Most Active @MaGe last edited by

                          @mage Nein - bzw. ist das keine Funktion von NodeRed an sich. Die ganzen Nodes, die in NodeRed mit Hardware sprechen - basieren entweder auf Standardkommunikationsmethoden, APIs der Hersteller, die entweder direkt oder über NodeJS Bibliotheken angesprochen werden. Trotzdem ist es immer ein Overhead - wenn ich mehrere kleine Abfragen mache, als eine große - weil dann nicht jedesmal neue Anforderungen übertragen werden müssen - das ist ja bei Datenbankabfragen in der Regel auch so. Allerdings dauern größere Abfragen eher länger.

                          Im Prinzip würde ich die Größe der Abfrage von der nötigen Aktualität der Daten abhängig machen. Daten, die sich häufig ändern und die unbedingt aktuelle sein müssen, sollte man in kleinen Stücken dafür öfters abfragen, während andere Teile in größeren Zeitabständen und dafür in größeren Blöcken abgerufen werden sollten. Ich kenn mich mit den Modbus Nodes nicht aus - generell ist die Frage ob man pollt oder lieber bei Änderungen triggern lässt.

                          1 Reply Last reply Reply Quote 0
                          • FragMike
                            FragMike @FragMike last edited by

                            ich habe die ID im "neuen Webportal" selber ausfindig machen können. Ging auch ohne Installateur Zugang. Der zweite WR hat bei mir die ID 16. Darunter finde ich auch nun den "Meter"

                            Bekomme nun entsprechend Werte.

                            1 Reply Last reply Reply Quote 0
                            • B
                              bolliy Developer last edited by

                              Ich habe gerade den Adapter sun2000 in der Version 0.1.3 hier https://github.com/bolliy/ioBroker.sun2000 veröffentlicht. Der Adapter ist ebenfalls auch auf https://www.npmjs.com/package/iobroker.sun2000 deployed.
                              Kann mit max. 5 Wechselrichtern betrieben werden!

                              Changelog:
                              • display the data from PV strings (#27)
                              • optimize the timing of interval loop
                              • improved handling of read timeouts from more then 2 inverters

                              Über Tests und euer Feedback freue mich sehr freuen.
                              Eure Anmerkungen könnt ihr auch gerne hier https://forum.iobroker.net/topic/71768/test-adapter-sun2000-huawei-wechselrichter-per-modbus oder https://github.com/bolliy/ioBroker.sun2000/issues posten.
                              LG Stephan

                              1 Reply Last reply Reply Quote 0
                              • M
                                micklafisch last edited by

                                Hallo,
                                ich setze für meinen Huawei das oben gepostete NodeRed ein (zugegeben habe ich von NodeRed keinerlei Ahnung und mich bisher nur sehr spärlich darum gekümmert).

                                Leider kommt es immer wieder vor, dass der Wert für "Accumulated_Energy_Yield" irre Sprünge macht und mir damit das Sourceanalytix zerstört. Hier ein Auszug vom parallel per historie geloggten DP:

                                17.1.2024 11:03:27.590;31710.56;true;node-red.0
                                17.1.2024 11:17:05.292;31710.56;true;node-red.0
                                17.1.2024 11:17:45.018;31710.57;true;node-red.0
                                17.1.2024 11:24:01.366;31710.57;true;node-red.0
                                17.1.2024 11:25:40.496;2669977.62;true;node-red.0
                                17.1.2024 11:26:46.486;31710.57;true;node-red.0
                                17.1.2024 11:57:11.041;31710.57;true;node-red.0
                                17.1.2024 11:57:23.566;31710.58;true;node-red.0
                                17.1.2024 12:20:41.719;31710.58;true;node-red.0
                                

                                Kann ein derartiger unplausibler Wert bereits im NodeRed Flow abgefangen werden (z.B. wenn der neue Wert im Vergleich zum alten Wert höher ist als "200" dann nicht speichern)?

                                mickym 1 Reply Last reply Reply Quote 0
                                • mickym
                                  mickym Most Active @micklafisch last edited by

                                  @micklafisch Du kannst entweder mit einer switch node - absolute Werte ausfiltern oder Du nimmst eine filter node, damit kannst Du Sprünge generell ausschalten. Die kannst Du im Nahbandmodus betreiben um zu große Sprünge auszufiltern. Lies halt die Hilfe durch. Hier der entsprechende Auszug.

                                  In den Nahband-Modies werden die Eingangswerte geblockt, wenn die Wertänderung größer oder größer-gleich ist als ± des Bandes um den voherigen Wert. Dies ist beispielsweise nützlich, um Ausreißer eines fehlerhaften Sensors zu ignorieren.

                                  In den Totband und Nahband-Modies müssen die Eingangswerte analysierbare (parseable) Zahlenwerte sein und beide unterstützen auch % (prozentuale Angabe), d.h. der Node sendet nur, wenn der Eingangswert mehr als x% vom vorherigen Wert abweicht.

                                  Die Totband- und Nahband-Modies erlauben den Vergleich entweder gegen den letzten gültigen Ausgangswert, dieses zum Ignorieren von Werten außerhalb des gültigen Bereichs, oder gegen den des vorherigen Eingangswertes, welches den Sollwert rücksetzt, was einen allmähligen Drift (Totband) oder einen eine schrittweise Veränderung (Nahband) ermöglicht.

                                  1 Reply Last reply Reply Quote 1
                                  • M
                                    marcelinho last edited by

                                    Hallo zusammen,
                                    hat jemand in Verbindung mit dem Speicher Luna2000 die richtigen Werte hinbekommen ?„Daily Energy Yield“zeigt mir seit dem Speicher falsche Werte an. Die App stimmt nicht mit dem in NodeRed überein.
                                    Desweiteren kann mir jemand vielleicht helfen, wie ich dem Wechslrichter sage, wenn ich das Auto mit einer Wallbox laden möchte, dass er nicht die Batterie entläd? Habe eine Zappi Wallbox die Überschuss laden kann und möchte nicht dass Sie an die Batterie geht. Oder wenn möglich dann als Beispiel wenn Batterie zwischen 100% bis 70% kompensiere eine Wolke wenn nicht genug PV Energie kommt mit der Batterie wenn unter 70% beziehe Netzbezug. Vielleicht mit einem Blockly.
                                    Dankbar über jeden Tipp bzw. Hilfe.

                                    Grüße

                                    C 1 Reply Last reply Reply Quote 0
                                    • B
                                      BF0911 last edited by BF0911

                                      Guten Morgen zusammen,

                                      ich habe einen Huawei SUN2000-4KTL-L1 in Betrieb. Die L1-Serie scheint ja kein Dongle mehr bei liegen zu haben, sondern dort ist das Wlan direkt im Wechselrichter verbaut.

                                      Hat es hier schon jemand mal geschafft, die L1 per Modbus TCP auszulesen ohne einen Dongle zu kaufen?

                                      1 Reply Last reply Reply Quote 0
                                      • C
                                        cksoft @marcelinho last edited by

                                        @marcelinho : Daily Energy Yield = Ausgabe des WR an AC.

                                        Energieertrag bei Huawei in der App = Daily Energy Yield + eingespeicherte kWh - ausgespeicherte kWh.

                                        B 1 Reply Last reply Reply Quote 0
                                        • W
                                          WolfgangK @Christof Lewandowski last edited by

                                          @christof-lewandowski
                                          Hallo Christof,
                                          ich versuche gerade ähnliches zu erreichen habe aber Probleme den Proxy ans Laufen zu bekommen.
                                          Der Proxy sagt ready, aber der NodeRed Zugriff meldet den Fehler : "Port not open".
                                          Wie hast du den Proxy in NodeRed konfiguriert ?

                                          1 Reply Last reply Reply Quote 0
                                          • J
                                            Joogibaer last edited by Joogibaer

                                            Hallo zusammen,

                                            ich habe zum wiederholten male das Problem, dass zwar alles connected ist, aber keine Werte kommen. Lief fast ein Jahr ohne Komplikationen und nun immer mal wieder dieses Problem. Geändert an der Hardware wurde nichts.

                                            be3c0fe3-9e27-4279-9e57-15ea066b8519-image.png

                                            b59cdb11-d357-473b-84bd-827fba814bcd-image.png

                                            verstehe leider nicht, warum es auf einmal nicht mehr gehen soll....

                                            Tips und Ideen?

                                            Vielen Dank

                                            J 2 Replies Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            1.2k
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

                                            110
                                            573
                                            176260
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo