Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. ioBroker Allgemein
  4. Huawei Sun2000 & ioBroker via JS script funktioniert

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.6k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.1k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.0k

Huawei Sun2000 & ioBroker via JS script funktioniert

Geplant Angeheftet Gesperrt Verschoben ioBroker Allgemein
481 Beiträge 62 Kommentatoren 122.9k Aufrufe 63 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • D Offline
    D Offline
    dragst3r
    schrieb am zuletzt editiert von dragst3r
    #424

    Hier stand Mist. Sorry!

    bahnuhrB 1 Antwort Letzte Antwort
    0
    • D dragst3r

      Hier stand Mist. Sorry!

      bahnuhrB Online
      bahnuhrB Online
      bahnuhr
      Forum Testing Most Active
      schrieb am zuletzt editiert von
      #425

      @dragst3r

      was ist frigate ?
      war ist camx ?

      Bist du im richtigen thread ?


      Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
      Danke.
      gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
      ScreenToGif :https://www.screentogif.com/downloads.html

      D 1 Antwort Letzte Antwort
      0
      • bahnuhrB bahnuhr

        @dragst3r

        was ist frigate ?
        war ist camx ?

        Bist du im richtigen thread ?

        D Offline
        D Offline
        dragst3r
        schrieb am zuletzt editiert von
        #426

        @bahnuhr
        OMG, sorry. Ich hatte nach dem Login ein 503 fehler und bin daher zum falschen Thread gekommen. Beitrag bitte löschen wenn es geht.

        bahnuhrB 1 Antwort Letzte Antwort
        0
        • D dragst3r

          @bahnuhr
          OMG, sorry. Ich hatte nach dem Login ein 503 fehler und bin daher zum falschen Thread gekommen. Beitrag bitte löschen wenn es geht.

          bahnuhrB Online
          bahnuhrB Online
          bahnuhr
          Forum Testing Most Active
          schrieb am zuletzt editiert von
          #427

          @dragst3r sagte in Huawei Sun2000 & ioBroker via JS script funktioniert:

          Beitrag bitte löschen

          geht nicht.


          Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
          Danke.
          gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
          ScreenToGif :https://www.screentogif.com/downloads.html

          1 Antwort Letzte Antwort
          0
          • B Offline
            B Offline
            bishop
            schrieb am zuletzt editiert von bishop
            #428

            ich bin kein Script Experte aber ich benötige manche DP als bestätigt also
            ack = true

            habe das nun so gelöst

            // perform createState() only if variable does not yet exist, and perform the check via existsState() only once for each processing round
            {   if (testCreateState == 0)
                {   if (!existsState(JavaInst + objectname)) { createState(objectname, value, options); }
                    else                                            { setState(objectname, value, true); }
                } else
                {   setState(objectname, value, true);
                }
            }  
            

            also nach dem value "wert" mache ich noch ein true.
            Ist das so korrekt, kann man das so machen oder ist das falsch? Jetzt sind die ganzen Datenpunkte auch nicht mehr rot :)

            bahnuhrB 1 Antwort Letzte Antwort
            0
            • B bishop

              ich bin kein Script Experte aber ich benötige manche DP als bestätigt also
              ack = true

              habe das nun so gelöst

              // perform createState() only if variable does not yet exist, and perform the check via existsState() only once for each processing round
              {   if (testCreateState == 0)
                  {   if (!existsState(JavaInst + objectname)) { createState(objectname, value, options); }
                      else                                            { setState(objectname, value, true); }
                  } else
                  {   setState(objectname, value, true);
                  }
              }  
              

              also nach dem value "wert" mache ich noch ein true.
              Ist das so korrekt, kann man das so machen oder ist das falsch? Jetzt sind die ganzen Datenpunkte auch nicht mehr rot :)

              bahnuhrB Online
              bahnuhrB Online
              bahnuhr
              Forum Testing Most Active
              schrieb am zuletzt editiert von
              #429

              @bishop sagte in Huawei Sun2000 & ioBroker via JS script funktioniert:

              benötige manche DP als bestätigt also
              ack = true

              Bitte mal Rückinfo warum man dies braucht ?


              Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
              Danke.
              gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
              ScreenToGif :https://www.screentogif.com/downloads.html

              B 2 Antworten Letzte Antwort
              0
              • bahnuhrB bahnuhr

                @bishop sagte in Huawei Sun2000 & ioBroker via JS script funktioniert:

                benötige manche DP als bestätigt also
                ack = true

                Bitte mal Rückinfo warum man dies braucht ?

                B Offline
                B Offline
                bishop
                schrieb am zuletzt editiert von bishop
                #430

                @bahnuhr

                z.b. bei dem awtrix-light Adapter werden die Werte an der Uhr nicht aktualisiert wenn sie nicht bestätigt sind.
                Und die rote Farbe mag ich nicht :)

                bahnuhrB 1 Antwort Letzte Antwort
                0
                • B bishop

                  @bahnuhr

                  z.b. bei dem awtrix-light Adapter werden die Werte an der Uhr nicht aktualisiert wenn sie nicht bestätigt sind.
                  Und die rote Farbe mag ich nicht :)

                  bahnuhrB Online
                  bahnuhrB Online
                  bahnuhr
                  Forum Testing Most Active
                  schrieb am zuletzt editiert von
                  #431

                  @bishop sagte in Huawei Sun2000 & ioBroker via JS script funktioniert:

                  awtrix-light Adapter

                  kenn ich nicht.

                  @bishop sagte in Huawei Sun2000 & ioBroker via JS script funktioniert:

                  Und die Rote Farbe mag ich nicht

                  Hat mich noch nie gestört.
                  Und hat bisher auch alles mit "roter Farbe" geklappt.

                  Aber ja, bei Aktoren z.B. Homematic ist es schon wichtig dass der Wert auch bestätigt wird.
                  Aber bei Daten vom Huawei Wechselrichter ?!


                  Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
                  Danke.
                  gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
                  ScreenToGif :https://www.screentogif.com/downloads.html

                  B 1 Antwort Letzte Antwort
                  0
                  • bahnuhrB bahnuhr

                    @bishop sagte in Huawei Sun2000 & ioBroker via JS script funktioniert:

                    awtrix-light Adapter

                    kenn ich nicht.

                    @bishop sagte in Huawei Sun2000 & ioBroker via JS script funktioniert:

                    Und die Rote Farbe mag ich nicht

                    Hat mich noch nie gestört.
                    Und hat bisher auch alles mit "roter Farbe" geklappt.

                    Aber ja, bei Aktoren z.B. Homematic ist es schon wichtig dass der Wert auch bestätigt wird.
                    Aber bei Daten vom Huawei Wechselrichter ?!

                    B Offline
                    B Offline
                    bishop
                    schrieb am zuletzt editiert von
                    #432

                    @bahnuhr
                    muss ja nicht geändert werden. Finde es halt somit abgeschlossen.

                    1 Antwort Letzte Antwort
                    0
                    • B Offline
                      B Offline
                      bishop
                      schrieb am zuletzt editiert von
                      #433

                      @Chris_B
                      ist es evtl. möglich das Script um ein paar Infos zu erweitern?
                      Ich habe die Datenpunkte bei z.b.

                      {
                        "common": {
                          "name": "Solarpower.Huawei.Inverter.1.Battery.RunningStatus",
                          "unit": "",
                          "role": "state",
                          "type": "mixed",
                          "states": {
                            "0": "offline",
                            "1": "stand by",
                            "2": "running",
                            "3": "fault",
                            "4": "sleep mode"
                          }
                        },
                      

                      oder

                      {
                        "common": {
                          "name": "Solarpower.Huawei.Meter.Status",
                          "unit": "",
                          "role": "state",
                          "type": "mixed",
                          "states": {
                            "0": "offline",
                            "1": "normal"
                          }
                        },
                      

                      erweitert da ich nur mit der Zahl nichts anfangen kann.
                      Ist es möglich das in deinem Script zu integrieren?

                      C 1 Antwort Letzte Antwort
                      0
                      • bahnuhrB bahnuhr

                        @bishop sagte in Huawei Sun2000 & ioBroker via JS script funktioniert:

                        benötige manche DP als bestätigt also
                        ack = true

                        Bitte mal Rückinfo warum man dies braucht ?

                        B Offline
                        B Offline
                        bishop
                        schrieb am zuletzt editiert von
                        #434

                        @bahnuhr
                        hier z.b.

                        
                        awtrix-light.0
                        2023-10-31 19:25:50.383	info	[initCustomApps] State value of custom app "verbrauch" (javascript.0.Solarpower.Derived.HouseConsumption) is not acknowledged (ack: false) - waiting for new value
                        

                        brauch ich den Wert als bestätigt!

                        bahnuhrB 1 Antwort Letzte Antwort
                        0
                        • B bishop

                          @bahnuhr
                          hier z.b.

                          
                          awtrix-light.0
                          2023-10-31 19:25:50.383	info	[initCustomApps] State value of custom app "verbrauch" (javascript.0.Solarpower.Derived.HouseConsumption) is not acknowledged (ack: false) - waiting for new value
                          

                          brauch ich den Wert als bestätigt!

                          bahnuhrB Online
                          bahnuhrB Online
                          bahnuhr
                          Forum Testing Most Active
                          schrieb am zuletzt editiert von
                          #435

                          @bishop
                          Is ja nen Ding.
                          Hab ich noch nicht gesehen sowas.

                          Klappt dein kleines Script wie gewollt ?


                          Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
                          Danke.
                          gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
                          ScreenToGif :https://www.screentogif.com/downloads.html

                          1 Antwort Letzte Antwort
                          0
                          • B bishop

                            @Chris_B
                            ist es evtl. möglich das Script um ein paar Infos zu erweitern?
                            Ich habe die Datenpunkte bei z.b.

                            {
                              "common": {
                                "name": "Solarpower.Huawei.Inverter.1.Battery.RunningStatus",
                                "unit": "",
                                "role": "state",
                                "type": "mixed",
                                "states": {
                                  "0": "offline",
                                  "1": "stand by",
                                  "2": "running",
                                  "3": "fault",
                                  "4": "sleep mode"
                                }
                              },
                            

                            oder

                            {
                              "common": {
                                "name": "Solarpower.Huawei.Meter.Status",
                                "unit": "",
                                "role": "state",
                                "type": "mixed",
                                "states": {
                                  "0": "offline",
                                  "1": "normal"
                                }
                              },
                            

                            erweitert da ich nur mit der Zahl nichts anfangen kann.
                            Ist es möglich das in deinem Script zu integrieren?

                            C Offline
                            C Offline
                            Chris_B
                            schrieb am zuletzt editiert von
                            #436

                            @bishop Danke für die Frage.
                            ich habe mich sehr lange nicht gemeldet. Ich habe genau das, und noch etwas mehr umgesetzt. Die Status von Inverter und Battery werden als Text ausgegeben. Zusätzlich werden gewisse Variable, welche im Standby der Battery nicht mehr zur Verfügung stehen entsprechend gesetzt, sodass diese dann in den Status 'standby' wechseln. Ich konnte das erst jetzt gut testen, da meine Anlage erst jetzt regelmässig in diesen Modus wechselt.
                            Ich werde das so erweiterte Skript am Wochenende zur Verfügung stellen. Ich aknn nicht früher, zu viel zu tun...

                            B 1 Antwort Letzte Antwort
                            0
                            • C Chris_B

                              @bishop Danke für die Frage.
                              ich habe mich sehr lange nicht gemeldet. Ich habe genau das, und noch etwas mehr umgesetzt. Die Status von Inverter und Battery werden als Text ausgegeben. Zusätzlich werden gewisse Variable, welche im Standby der Battery nicht mehr zur Verfügung stehen entsprechend gesetzt, sodass diese dann in den Status 'standby' wechseln. Ich konnte das erst jetzt gut testen, da meine Anlage erst jetzt regelmässig in diesen Modus wechselt.
                              Ich werde das so erweiterte Skript am Wochenende zur Verfügung stellen. Ich aknn nicht früher, zu viel zu tun...

                              B Offline
                              B Offline
                              bishop
                              schrieb am zuletzt editiert von
                              #437

                              @chris_b
                              Das hört sich doch super an! Kein Stress ich kann warten :)

                              C 1 Antwort Letzte Antwort
                              0
                              • B Online
                                B Online
                                bolliy
                                Developer
                                schrieb am zuletzt editiert von bolliy
                                #438

                                Hallo Zusammen, ich habe mein Huawai Wechselrichter dank des JS script von @chrisB gut im Griff. Nun ist mir allerdings aufgefallen, dass die Funktion/Methode "readHoldingRegisters" mit einem Callback aufgerufen wird. Der Callback führt zu einem asynchronem Programmablauf. Deshalb muss die Abfrage der Register zeitverzögert erfolgen, da die die Modbus-Schnittstelle nur seriell angsprochen werden kann. Es kann also die nächste Abfrage erst nach dem Modbus-Response erfolgen.

                                Die Funktion readHoldingRegisters gibt aber auch ein Promise zurück - also ein Versprechen auf einen Wert, der später kommt.
                                Die Lösung: async/await! Unter der Haube arbeitet ein Promise, aber wir werden von den ganzen Unannehmlichkeiten befreit. Nun habe ich die Funkion "readRegisterSpace" umgebaut. Der Programmablauf ist nun synchron. Der Aufruf "await client.readHoldingRegisters" wartet bis das Ergebnis vorliegt ohne zu blockieren!

                                async function readRegisterSpaceAsync(id, address, length) {  
                                    try {
                                      //console.log('ReadRegisters 1');  
                                      await client.setID(ModBusIDs[id-1]);
                                      //console.log('ReadRegisters 1');
                                      let data = await client.readHoldingRegisters(address, length);
                                      //console.log('ReadRegisters 2');
                                      return data.data;    
                                    } catch (err) {
                                       //console.error("Error received writing adress "+ address + " from id: " +  ModBusIDs[id-1] + " with error: " + modbusErrorMessages[err.modbusCode], err);
                                       //return -1;
                                       throw err; //Fehler weiterreichen
                                    }
                                    
                                }
                                

                                Mein readRegisters kann nun als synchroner Programmablauf - recht schnell - die Register auslesen.

                                async function ReadRegister(Reg) {
                                    for (let id = 1; id <= ModBusIDs.length; id++) {
                                        for (let i = 0; i < Reg.length; i++) {
                                            let address = Reg[i][0];
                                            let length = Reg[i][1];
                                            try { 
                                              console.debug("Try to read data from id/address " + ModBusIDs[id-1] + "/" + address);
                                              let data = await readRegisterSpaceAsync(id, address, length);
                                              console.debug("Read data from id/address " + ModBusIDs[id-1] + "/" + address + "\nData is: " + data);
                                              for (var y = 0; y < length; y++) Buffer[id-1][address + y - BufOffset] = data[y]; 
                                            } catch(err) {
                                                // if error, handle them here (it should not)
                                                if (err.modbusCode == null) {
                                                  console.warn("Lost connection to client. ");
                                                }  else { 
                                                  console.error("Error received writing adress "+ address + " from id: " +  ModBusIDs[id-1] + " with error: " + modbusErrorMessages[err.modbusCode], err);
                                                }  
                                                return -1;           
                                            } 
                                           
                                        }      
                                    }     
                                
                                }
                                

                                Hier eine gute Erklärung zum Thema asynchroner Code: link text

                                Lg Stephan

                                C 2 Antworten Letzte Antwort
                                1
                                • B bolliy

                                  Hallo Zusammen, ich habe mein Huawai Wechselrichter dank des JS script von @chrisB gut im Griff. Nun ist mir allerdings aufgefallen, dass die Funktion/Methode "readHoldingRegisters" mit einem Callback aufgerufen wird. Der Callback führt zu einem asynchronem Programmablauf. Deshalb muss die Abfrage der Register zeitverzögert erfolgen, da die die Modbus-Schnittstelle nur seriell angsprochen werden kann. Es kann also die nächste Abfrage erst nach dem Modbus-Response erfolgen.

                                  Die Funktion readHoldingRegisters gibt aber auch ein Promise zurück - also ein Versprechen auf einen Wert, der später kommt.
                                  Die Lösung: async/await! Unter der Haube arbeitet ein Promise, aber wir werden von den ganzen Unannehmlichkeiten befreit. Nun habe ich die Funkion "readRegisterSpace" umgebaut. Der Programmablauf ist nun synchron. Der Aufruf "await client.readHoldingRegisters" wartet bis das Ergebnis vorliegt ohne zu blockieren!

                                  async function readRegisterSpaceAsync(id, address, length) {  
                                      try {
                                        //console.log('ReadRegisters 1');  
                                        await client.setID(ModBusIDs[id-1]);
                                        //console.log('ReadRegisters 1');
                                        let data = await client.readHoldingRegisters(address, length);
                                        //console.log('ReadRegisters 2');
                                        return data.data;    
                                      } catch (err) {
                                         //console.error("Error received writing adress "+ address + " from id: " +  ModBusIDs[id-1] + " with error: " + modbusErrorMessages[err.modbusCode], err);
                                         //return -1;
                                         throw err; //Fehler weiterreichen
                                      }
                                      
                                  }
                                  

                                  Mein readRegisters kann nun als synchroner Programmablauf - recht schnell - die Register auslesen.

                                  async function ReadRegister(Reg) {
                                      for (let id = 1; id <= ModBusIDs.length; id++) {
                                          for (let i = 0; i < Reg.length; i++) {
                                              let address = Reg[i][0];
                                              let length = Reg[i][1];
                                              try { 
                                                console.debug("Try to read data from id/address " + ModBusIDs[id-1] + "/" + address);
                                                let data = await readRegisterSpaceAsync(id, address, length);
                                                console.debug("Read data from id/address " + ModBusIDs[id-1] + "/" + address + "\nData is: " + data);
                                                for (var y = 0; y < length; y++) Buffer[id-1][address + y - BufOffset] = data[y]; 
                                              } catch(err) {
                                                  // if error, handle them here (it should not)
                                                  if (err.modbusCode == null) {
                                                    console.warn("Lost connection to client. ");
                                                  }  else { 
                                                    console.error("Error received writing adress "+ address + " from id: " +  ModBusIDs[id-1] + " with error: " + modbusErrorMessages[err.modbusCode], err);
                                                  }  
                                                  return -1;           
                                              } 
                                             
                                          }      
                                      }     
                                  
                                  }
                                  

                                  Hier eine gute Erklärung zum Thema asynchroner Code: link text

                                  Lg Stephan

                                  C Offline
                                  C Offline
                                  Chris_B
                                  schrieb am zuletzt editiert von
                                  #439

                                  @bolliy INteressanter Input. Muss ich mir anschauen. Ich veröffentliche gleich eine neue Version des Skripts (endlich, nach längerer Abwesenheit). Diese Version übersetzt nun Meldungen in verständliche Strings (bspw. den Zustand des Inverters). Deine Überlegungen sind allerdings da noch nicht eingebaut. Schau ich mir noch an und baue das ein - sofern ich es verstehe...
                                  Gruss

                                  1 Antwort Letzte Antwort
                                  0
                                  • B bishop

                                    @chris_b
                                    Das hört sich doch super an! Kein Stress ich kann warten :)

                                    C Offline
                                    C Offline
                                    Chris_B
                                    schrieb am zuletzt editiert von
                                    #440

                                    @bishop Hallo zusammen. Nach längerer Abwesenheit endlich eine neue Version des Skripts. Das beinhaltet (endlich) einen Übersetzung von vielen Zuständen in lesbaren Text. So ist bspw. der Inverterzustand jetz nicht mehr eine Zahl, sondern ein lesbarer Text, bspw. "On-grid" oder "Standby: no irradiation". Das gleiche ist für die Batterie- und die Batterystack Zustände umgesetzt.

                                    Der Kommentar von @bolliy habe ich noch nicht umgesetzt, schaue ich mir noch an.

                                    Das Ganze findet sich, inklusive erweiterter Beschreibung auf Github:
                                    Github Sun2000
                                    Gruss, Christian

                                    B 1 Antwort Letzte Antwort
                                    3
                                    • C Chris_B

                                      @bishop Hallo zusammen. Nach längerer Abwesenheit endlich eine neue Version des Skripts. Das beinhaltet (endlich) einen Übersetzung von vielen Zuständen in lesbaren Text. So ist bspw. der Inverterzustand jetz nicht mehr eine Zahl, sondern ein lesbarer Text, bspw. "On-grid" oder "Standby: no irradiation". Das gleiche ist für die Batterie- und die Batterystack Zustände umgesetzt.

                                      Der Kommentar von @bolliy habe ich noch nicht umgesetzt, schaue ich mir noch an.

                                      Das Ganze findet sich, inklusive erweiterter Beschreibung auf Github:
                                      Github Sun2000
                                      Gruss, Christian

                                      B Offline
                                      B Offline
                                      bishop
                                      schrieb am zuletzt editiert von
                                      #441

                                      @chris_b

                                      vielen Dank hab gleich mal geupdated :)
                                      auf den ersten blick was ich bräuchte sind die DP als bestätigt.

                                      Macht man das in JavaScript generell nicht?

                                      {   if (testCreateState == 0)
                                          {   if (!existsState(JavaInst + objectname)) { createState(objectname, value, options); }
                                              else                                            { setState(objectname, value, true); }
                                          } else
                                          {   setState(objectname, value, true);
                                          }
                                      }  
                                      

                                      hab das so hinbekommen.
                                      Aber leider hab ich zu wenig Ahnung wie man das auch

                                      javascript.0.Solarpower.Derived
                                      

                                      hier macht.

                                      C 1 Antwort Letzte Antwort
                                      0
                                      • B bishop

                                        @chris_b

                                        vielen Dank hab gleich mal geupdated :)
                                        auf den ersten blick was ich bräuchte sind die DP als bestätigt.

                                        Macht man das in JavaScript generell nicht?

                                        {   if (testCreateState == 0)
                                            {   if (!existsState(JavaInst + objectname)) { createState(objectname, value, options); }
                                                else                                            { setState(objectname, value, true); }
                                            } else
                                            {   setState(objectname, value, true);
                                            }
                                        }  
                                        

                                        hab das so hinbekommen.
                                        Aber leider hab ich zu wenig Ahnung wie man das auch

                                        javascript.0.Solarpower.Derived
                                        

                                        hier macht.

                                        C Offline
                                        C Offline
                                        Chris_B
                                        schrieb am zuletzt editiert von
                                        #442

                                        @bishop Sorry, aber ich verstehe die Frage nicht. Ich bin kein Javascript Experte, aber im Skript selbst brauche ich das nicht. Für was brauchst Du das? Die Werte (Du nennst sie Datenpunkte) kann man Problemlos in Vis verwenden...
                                        Gruss

                                        1 Antwort Letzte Antwort
                                        0
                                        • B bolliy

                                          Hallo Zusammen, ich habe mein Huawai Wechselrichter dank des JS script von @chrisB gut im Griff. Nun ist mir allerdings aufgefallen, dass die Funktion/Methode "readHoldingRegisters" mit einem Callback aufgerufen wird. Der Callback führt zu einem asynchronem Programmablauf. Deshalb muss die Abfrage der Register zeitverzögert erfolgen, da die die Modbus-Schnittstelle nur seriell angsprochen werden kann. Es kann also die nächste Abfrage erst nach dem Modbus-Response erfolgen.

                                          Die Funktion readHoldingRegisters gibt aber auch ein Promise zurück - also ein Versprechen auf einen Wert, der später kommt.
                                          Die Lösung: async/await! Unter der Haube arbeitet ein Promise, aber wir werden von den ganzen Unannehmlichkeiten befreit. Nun habe ich die Funkion "readRegisterSpace" umgebaut. Der Programmablauf ist nun synchron. Der Aufruf "await client.readHoldingRegisters" wartet bis das Ergebnis vorliegt ohne zu blockieren!

                                          async function readRegisterSpaceAsync(id, address, length) {  
                                              try {
                                                //console.log('ReadRegisters 1');  
                                                await client.setID(ModBusIDs[id-1]);
                                                //console.log('ReadRegisters 1');
                                                let data = await client.readHoldingRegisters(address, length);
                                                //console.log('ReadRegisters 2');
                                                return data.data;    
                                              } catch (err) {
                                                 //console.error("Error received writing adress "+ address + " from id: " +  ModBusIDs[id-1] + " with error: " + modbusErrorMessages[err.modbusCode], err);
                                                 //return -1;
                                                 throw err; //Fehler weiterreichen
                                              }
                                              
                                          }
                                          

                                          Mein readRegisters kann nun als synchroner Programmablauf - recht schnell - die Register auslesen.

                                          async function ReadRegister(Reg) {
                                              for (let id = 1; id <= ModBusIDs.length; id++) {
                                                  for (let i = 0; i < Reg.length; i++) {
                                                      let address = Reg[i][0];
                                                      let length = Reg[i][1];
                                                      try { 
                                                        console.debug("Try to read data from id/address " + ModBusIDs[id-1] + "/" + address);
                                                        let data = await readRegisterSpaceAsync(id, address, length);
                                                        console.debug("Read data from id/address " + ModBusIDs[id-1] + "/" + address + "\nData is: " + data);
                                                        for (var y = 0; y < length; y++) Buffer[id-1][address + y - BufOffset] = data[y]; 
                                                      } catch(err) {
                                                          // if error, handle them here (it should not)
                                                          if (err.modbusCode == null) {
                                                            console.warn("Lost connection to client. ");
                                                          }  else { 
                                                            console.error("Error received writing adress "+ address + " from id: " +  ModBusIDs[id-1] + " with error: " + modbusErrorMessages[err.modbusCode], err);
                                                          }  
                                                          return -1;           
                                                      } 
                                                     
                                                  }      
                                              }     
                                          
                                          }
                                          

                                          Hier eine gute Erklärung zum Thema asynchroner Code: link text

                                          Lg Stephan

                                          C Offline
                                          C Offline
                                          Chris_B
                                          schrieb am zuletzt editiert von
                                          #443

                                          @bolliy Hallo Stephan.
                                          Ich habe versucht Deinen Vorschlag zu verstehen, ist mir leider nicht vollständig gelungen - bis jetzt. Also: readRegisterSpace wird durch ReadRegisterSpaceAsync ersetzt. Aber wie / wo wird ReadRegister(reg) im Skript verwendet, sorry ich steh auf dem Schlauch. Ich würde gerne das Skript entsprechend anpassen, aber ohne zu verstehen geht das nicht...
                                          Gruss

                                          1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate
                                          FAQ Cloud / IOT
                                          HowTo: Node.js-Update
                                          HowTo: Backup/Restore
                                          Downloads
                                          BLOG

                                          771

                                          Online

                                          32.4k

                                          Benutzer

                                          81.5k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe