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. Skripten / Logik
  4. Bitfield übersetzen/konvertieren

NEWS

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

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

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

Bitfield übersetzen/konvertieren

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
javascript
19 Beiträge 6 Kommentatoren 1.9k Aufrufe 5 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
    darkbrain85
    schrieb am zuletzt editiert von
    #1

    Hi!

    Ich habe ein kniffeliges Problem, bei dem ihr mir sicher behilflich sein könnte.

    Ich lese meine Waterkotte Wärmepumpe per Modbus aus. Dabei erhalte ich auch diverse Werte. Funktioniert sehr gut.

    Den Zustand einzelner Komponenten kann ich allerdings nur als bitfield in einem gemeinsamen Register abrufen. Hier erhalte ich einen Integer Wert den ich entsprechend interpretieren müsste.
    Hier mal die Liste aus der Doku:

    521d80f2-9fb9-4fa1-8e78-15e4b396b5bb-image.png

    Ich müsste also den Integer Wert übersetzen und dann die einzelnen Zustände zuordnen.
    Beim Betrieb der Heizungsumwälzpumpe erhalte ich z.B. den Wert 2.

    Gibt es dafür irgendwo ein Beispiel, oder kann mir da jemand auf die Sprünge helfen?

    Danke Euch jetzt schon!

    paul53P wendy2702W 2 Antworten Letzte Antwort
    0
    • D darkbrain85

      Hi!

      Ich habe ein kniffeliges Problem, bei dem ihr mir sicher behilflich sein könnte.

      Ich lese meine Waterkotte Wärmepumpe per Modbus aus. Dabei erhalte ich auch diverse Werte. Funktioniert sehr gut.

      Den Zustand einzelner Komponenten kann ich allerdings nur als bitfield in einem gemeinsamen Register abrufen. Hier erhalte ich einen Integer Wert den ich entsprechend interpretieren müsste.
      Hier mal die Liste aus der Doku:

      521d80f2-9fb9-4fa1-8e78-15e4b396b5bb-image.png

      Ich müsste also den Integer Wert übersetzen und dann die einzelnen Zustände zuordnen.
      Beim Betrieb der Heizungsumwälzpumpe erhalte ich z.B. den Wert 2.

      Gibt es dafür irgendwo ein Beispiel, oder kann mir da jemand auf die Sprünge helfen?

      Danke Euch jetzt schon!

      paul53P Offline
      paul53P Offline
      paul53
      schrieb am zuletzt editiert von paul53
      #2

      @darkbrain85
      Es gibt Bit-Operatoren in Javascript. Ich würde ein einer Schleife Bit 0 testen und nach rechts verschieben.

      if(x & 1) { // testet Bit 0
      // 
      }
      x = x >> 1;
      

      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

      D 1 Antwort Letzte Antwort
      0
      • paul53P paul53

        @darkbrain85
        Es gibt Bit-Operatoren in Javascript. Ich würde ein einer Schleife Bit 0 testen und nach rechts verschieben.

        if(x & 1) { // testet Bit 0
        // 
        }
        x = x >> 1;
        
        D Offline
        D Offline
        darkbrain85
        schrieb am zuletzt editiert von
        #3

        @paul53

        Danke für den Hinweis, aber da stehe ich noch immer auf dem Schlauch. Ich sollte vielleicht hinzufügen, das meine Scriptkenntnisse aus ganz viel copy&paste bestehen.

        Einfache Sachen bekomme ich hin, aber hier bin ich gerade wirklich überfordert... :-D

        paul53P 1 Antwort Letzte Antwort
        0
        • D darkbrain85

          @paul53

          Danke für den Hinweis, aber da stehe ich noch immer auf dem Schlauch. Ich sollte vielleicht hinzufügen, das meine Scriptkenntnisse aus ganz viel copy&paste bestehen.

          Einfache Sachen bekomme ich hin, aber hier bin ich gerade wirklich überfordert... :-D

          paul53P Offline
          paul53P Offline
          paul53
          schrieb am zuletzt editiert von paul53
          #4

          @darkbrain85
          Versuche es mal so:

          // Binärwert 12 Bit decodieren und in Datenpunkte schreiben
          const idModbus = '...'; // ID zuweisen !
          const idWP = 'Waermepumpe.';
          const idsWP = [
              'Quellenpumpe',
              'Heizungspumpe',
              'Freigabe',
              'Verdichter_1',
              'Verdichter_2',
              'ext_Waermeerzeuger',
              'Alarm',
              'MV_Kuehlen',
              'MV_Warmwasser',
              'MV_Poolheizung',
              'Solarbetrieb',
              'Kaeltekreis_4_Wege_Ventil'
          ];
          
          for(let i = 0; i < idsWP.length; i++) {
              createState(idWP + idsWP[i], false, {type: 'boolean', name: idsWP[i], read: true, write: false});
          }
          
          on(idModbus, function(dp) {
              let val = dp.state.val;
              for(let i = 0; i < idsWP.length; i++) {
                  setState(idWP + idsWP[i], !!(val & 1), true);
                  val = val >> 1;
              }
          });
          

          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

          1 Antwort Letzte Antwort
          0
          • D Offline
            D Offline
            darkbrain85
            schrieb am zuletzt editiert von darkbrain85
            #5

            Die neuen Objekte werden angelegt, aber leider bleiben alle auf "false".
            Natürlich habe ich oben entsprechend die ID des Modbus Objekts eingefügt. Diese ändert sich auch entsprechend.

            Müsste der Wert nicht erst zu einem Binärwert konvertiert werden?
            Ich habe mal die einzelnen Werte der Schleife in's Log schreiben lassen.

            09:27:10.611	info	javascript.0 (19111) script.js.common.Skript_1: 2
            09:27:10.611	info	javascript.0 (19111) script.js.common.Skript_1: 1
            09:27:10.611	info	javascript.0 (19111) script.js.common.Skript_1: 0
            09:27:10.611	info	javascript.0 (19111) script.js.common.Skript_1: 0
            09:27:10.612	info	javascript.0 (19111) script.js.common.Skript_1: 0
            09:27:10.612	info	javascript.0 (19111) script.js.common.Skript_1: 0
            09:27:10.612	info	javascript.0 (19111) script.js.common.Skript_1: 0
            09:27:10.612	info	javascript.0 (19111) script.js.common.Skript_1: 0
            09:27:10.612	info	javascript.0 (19111) script.js.common.Skript_1: 0
            09:27:10.612	info	javascript.0 (19111) script.js.common.Skript_1: 0
            09:27:10.612	info	javascript.0 (19111) script.js.common.Skript_1: 0
            09:27:10.613	info	javascript.0 (19111) script.js.common.Skript_1: 0
            09:27:10.613	info	javascript.0 (19111) script.js.common.Skript_1: 0
            
            

            Das scheint also zu funktionieren. Jetzt frage ich mich nur noch, warum nicht entsprechend der Wert des jeweiligen Objekts nicht auf "true" geht.

            paul53P 1 Antwort Letzte Antwort
            0
            • D darkbrain85

              Die neuen Objekte werden angelegt, aber leider bleiben alle auf "false".
              Natürlich habe ich oben entsprechend die ID des Modbus Objekts eingefügt. Diese ändert sich auch entsprechend.

              Müsste der Wert nicht erst zu einem Binärwert konvertiert werden?
              Ich habe mal die einzelnen Werte der Schleife in's Log schreiben lassen.

              09:27:10.611	info	javascript.0 (19111) script.js.common.Skript_1: 2
              09:27:10.611	info	javascript.0 (19111) script.js.common.Skript_1: 1
              09:27:10.611	info	javascript.0 (19111) script.js.common.Skript_1: 0
              09:27:10.611	info	javascript.0 (19111) script.js.common.Skript_1: 0
              09:27:10.612	info	javascript.0 (19111) script.js.common.Skript_1: 0
              09:27:10.612	info	javascript.0 (19111) script.js.common.Skript_1: 0
              09:27:10.612	info	javascript.0 (19111) script.js.common.Skript_1: 0
              09:27:10.612	info	javascript.0 (19111) script.js.common.Skript_1: 0
              09:27:10.612	info	javascript.0 (19111) script.js.common.Skript_1: 0
              09:27:10.612	info	javascript.0 (19111) script.js.common.Skript_1: 0
              09:27:10.612	info	javascript.0 (19111) script.js.common.Skript_1: 0
              09:27:10.613	info	javascript.0 (19111) script.js.common.Skript_1: 0
              09:27:10.613	info	javascript.0 (19111) script.js.common.Skript_1: 0
              
              

              Das scheint also zu funktionieren. Jetzt frage ich mich nur noch, warum nicht entsprechend der Wert des jeweiligen Objekts nicht auf "true" geht.

              paul53P Offline
              paul53P Offline
              paul53
              schrieb am zuletzt editiert von
              #6

              @darkbrain85 sagte:

              Wert des jeweiligen Objekts nicht auf "true" geht.

              Sorry, mein Fehler: Habe oben Zeile 26 korrigiert in

                      setState(idWP + idsWP[i], !!(val & 1), true);
              

              Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
              Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

              D S 2 Antworten Letzte Antwort
              0
              • paul53P paul53

                @darkbrain85 sagte:

                Wert des jeweiligen Objekts nicht auf "true" geht.

                Sorry, mein Fehler: Habe oben Zeile 26 korrigiert in

                        setState(idWP + idsWP[i], !!(val & 1), true);
                
                D Offline
                D Offline
                darkbrain85
                schrieb am zuletzt editiert von darkbrain85
                #7

                @paul53

                Das scheint vorerst zu klappen! Ich konnte jetzt spontan nur die Pumpen testen, da ich den Verdichter nicht unnötig starten will, aber es sieht gut aus!

                Vielen vielen Dank für Deine Unterstützung! :+1:

                Edit: Jetzt konnte ich fast alle Werte testen! Läuft!

                1 Antwort Letzte Antwort
                0
                • paul53P paul53

                  @darkbrain85 sagte:

                  Wert des jeweiligen Objekts nicht auf "true" geht.

                  Sorry, mein Fehler: Habe oben Zeile 26 korrigiert in

                          setState(idWP + idsWP[i], !!(val & 1), true);
                  
                  S Offline
                  S Offline
                  Schwabe_CH
                  schrieb am zuletzt editiert von
                  #8

                  @paul53

                  Hallo
                  Ich stelle mich eigentlich bei copy&paste nicht so schusselig an, aber nun habe ich doch etwas viel Zeit mit lesen und probieren aufgewendet und wäre um direkte Hilfe froh.

                  Ich möchte den Betriebsstatus (sowie weitere Daten) meines Stiebel-Eltron Wärmepumpen ISG auslesen und in er InfluxDB speichern und die Informationen zur neunen E3/DC PV-Anlage gegenüber zu stellen.

                  Ich denke ich habe alles wie beschrieben eingetragen und entsprechend angepasst. Aber auch bei mir sind alle Werte aus JS auf false.

                  Wenn ich diese Werte parallel in node-red (16Bit Array) auslese habe ich den 2. Wert auf true.

                  Ich vermute, ich habe ein Durcheinander mit der ID oder Namen im JS gemacht.
                  Ich habe schon mehrere Varianten ausprobiert aber nun seh ich vor lauter Bäumen den Wald nicht mehr.

                  Nachfolgend Screenshots meiner Eingaben.

                  Bildschirmfoto 2021-05-20 um 19.35.03.png
                  Bildschirmfoto 2021-05-20 um 19.33.54.png
                  Bildschirmfoto 2021-05-20 um 19.35.41.png
                  Bildschirmfoto 2021-05-20 um 19.34.36.png

                  Danke vielmal

                  paul53P 1 Antwort Letzte Antwort
                  0
                  • S Schwabe_CH

                    @paul53

                    Hallo
                    Ich stelle mich eigentlich bei copy&paste nicht so schusselig an, aber nun habe ich doch etwas viel Zeit mit lesen und probieren aufgewendet und wäre um direkte Hilfe froh.

                    Ich möchte den Betriebsstatus (sowie weitere Daten) meines Stiebel-Eltron Wärmepumpen ISG auslesen und in er InfluxDB speichern und die Informationen zur neunen E3/DC PV-Anlage gegenüber zu stellen.

                    Ich denke ich habe alles wie beschrieben eingetragen und entsprechend angepasst. Aber auch bei mir sind alle Werte aus JS auf false.

                    Wenn ich diese Werte parallel in node-red (16Bit Array) auslese habe ich den 2. Wert auf true.

                    Ich vermute, ich habe ein Durcheinander mit der ID oder Namen im JS gemacht.
                    Ich habe schon mehrere Varianten ausprobiert aber nun seh ich vor lauter Bäumen den Wald nicht mehr.

                    Nachfolgend Screenshots meiner Eingaben.

                    Bildschirmfoto 2021-05-20 um 19.35.03.png
                    Bildschirmfoto 2021-05-20 um 19.33.54.png
                    Bildschirmfoto 2021-05-20 um 19.35.41.png
                    Bildschirmfoto 2021-05-20 um 19.34.36.png

                    Danke vielmal

                    paul53P Offline
                    paul53P Offline
                    paul53
                    schrieb am zuletzt editiert von
                    #9

                    @schwabe_ch
                    Die ID des Triggers stimmt nicht.

                    const idModbus = 'modbus.0.inputRegisters.32500_Betriebstatus';
                    

                    Als Zielordner würde ich angeben:

                    const idWp = '0_userdata.0.Waermepumpe.Betriebstatus.';
                    

                    Bitte Code immer in Code tags posten!

                    Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                    Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                    S 1 Antwort Letzte Antwort
                    0
                    • paul53P paul53

                      @schwabe_ch
                      Die ID des Triggers stimmt nicht.

                      const idModbus = 'modbus.0.inputRegisters.32500_Betriebstatus';
                      

                      Als Zielordner würde ich angeben:

                      const idWp = '0_userdata.0.Waermepumpe.Betriebstatus.';
                      

                      Bitte Code immer in Code tags posten!

                      S Offline
                      S Offline
                      Schwabe_CH
                      schrieb am zuletzt editiert von
                      #10

                      @paul53

                      Danke für die superschnelle Antwort. ;-)

                      Ich habe alles vorhandene entfernt und "neu angefangen".
                      Dabei ist schon mal ein Fehler von mir aufgefallen. Betriebsstatus mit 2 * s. :-(

                      // Binärwert 12 Bit decodieren und in Datenpunkte schreiben
                      const idModbus = 'modbus.0.inputRegisters.32500_Betriebsstatus'; // ID zuweisen !
                      const idWP = '0_userdata.0.Waermepumpe.Betriebsstatus.';
                      const idsWP = [
                         'B0_HK1_Pumpe',
                         'B1_HK2_Pumpe',
                         'B2_Aufheizprogramm',
                         'B3_NHZ_Stufen_in_Betieb',
                         'B4_WP_im_Heizbetrieb',
                         'B5_WP_im_Warmwasserbetrieb',
                         'B6_Verdichter_in_Betrieb',
                         'B7_Sommerbetrieb_aktiv',
                         'B8_Kuehlbetrieb_aktiv',
                         'B9_Abtauen',
                         'B10_Silentmode1',
                         'B11_Silentmode2'
                      ];
                      
                      for(let i = 0; i < idsWP.length; i++) {
                         createState(idWP + idsWP[i], false, {type: 'boolean', name: idsWP[i], read: true, write: false});
                      }
                      
                      on(idModbus, function(dp) {
                         let val = dp.state.val;
                         for(let i = 0; i < idsWP.length; i++) {
                             setState(idWP + idsWP[i], !!(val & 1), true);
                             val = val >> 1;
                         }
                      });
                      

                      Das Ergebnis ist jedoch immer noch alles "false".

                      Bildschirmfoto 2021-05-24 um 11.36.07.png

                      Node-red zeigt mir aber

                      24.5.2021, 11:33:56node: 7702536.90156ac
                      msg.payload : array[16]
                      array[16]
                      [0 … 9]
                      0: false
                      1: true
                      2: false
                      3: false
                      4: false
                      5: false
                      6: false
                      7: false
                      8: false
                      9: false
                      [10 … 15]
                      10: false
                      11: false
                      12: false
                      13: false
                      14: false
                      15: false

                      Was wiederum mit "modbus.0.inputRegisters.32500_Betriebsstatus" als Ausgabewert 2 übereinstimmen würde.

                      Liegt es evtl. am Datentype - Unsigned 16 bit

                      Bildschirmfoto 2021-05-24 um 11.58.38.png

                      paul53P 2 Antworten Letzte Antwort
                      0
                      • S Schwabe_CH

                        @paul53

                        Danke für die superschnelle Antwort. ;-)

                        Ich habe alles vorhandene entfernt und "neu angefangen".
                        Dabei ist schon mal ein Fehler von mir aufgefallen. Betriebsstatus mit 2 * s. :-(

                        // Binärwert 12 Bit decodieren und in Datenpunkte schreiben
                        const idModbus = 'modbus.0.inputRegisters.32500_Betriebsstatus'; // ID zuweisen !
                        const idWP = '0_userdata.0.Waermepumpe.Betriebsstatus.';
                        const idsWP = [
                           'B0_HK1_Pumpe',
                           'B1_HK2_Pumpe',
                           'B2_Aufheizprogramm',
                           'B3_NHZ_Stufen_in_Betieb',
                           'B4_WP_im_Heizbetrieb',
                           'B5_WP_im_Warmwasserbetrieb',
                           'B6_Verdichter_in_Betrieb',
                           'B7_Sommerbetrieb_aktiv',
                           'B8_Kuehlbetrieb_aktiv',
                           'B9_Abtauen',
                           'B10_Silentmode1',
                           'B11_Silentmode2'
                        ];
                        
                        for(let i = 0; i < idsWP.length; i++) {
                           createState(idWP + idsWP[i], false, {type: 'boolean', name: idsWP[i], read: true, write: false});
                        }
                        
                        on(idModbus, function(dp) {
                           let val = dp.state.val;
                           for(let i = 0; i < idsWP.length; i++) {
                               setState(idWP + idsWP[i], !!(val & 1), true);
                               val = val >> 1;
                           }
                        });
                        

                        Das Ergebnis ist jedoch immer noch alles "false".

                        Bildschirmfoto 2021-05-24 um 11.36.07.png

                        Node-red zeigt mir aber

                        24.5.2021, 11:33:56node: 7702536.90156ac
                        msg.payload : array[16]
                        array[16]
                        [0 … 9]
                        0: false
                        1: true
                        2: false
                        3: false
                        4: false
                        5: false
                        6: false
                        7: false
                        8: false
                        9: false
                        [10 … 15]
                        10: false
                        11: false
                        12: false
                        13: false
                        14: false
                        15: false

                        Was wiederum mit "modbus.0.inputRegisters.32500_Betriebsstatus" als Ausgabewert 2 übereinstimmen würde.

                        Liegt es evtl. am Datentype - Unsigned 16 bit

                        Bildschirmfoto 2021-05-24 um 11.58.38.png

                        paul53P Offline
                        paul53P Offline
                        paul53
                        schrieb am zuletzt editiert von
                        #11

                        @schwabe_ch sagte: Das Ergebnis ist jedoch immer noch alles "false".

                        Hat sich denn der Wert von "modbus.0.inputRegisters.32500_Betriebsstatus" mal geändert? Es wird nur bei Wertänderung getriggert.

                        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                        1 Antwort Letzte Antwort
                        0
                        • S Schwabe_CH

                          @paul53

                          Danke für die superschnelle Antwort. ;-)

                          Ich habe alles vorhandene entfernt und "neu angefangen".
                          Dabei ist schon mal ein Fehler von mir aufgefallen. Betriebsstatus mit 2 * s. :-(

                          // Binärwert 12 Bit decodieren und in Datenpunkte schreiben
                          const idModbus = 'modbus.0.inputRegisters.32500_Betriebsstatus'; // ID zuweisen !
                          const idWP = '0_userdata.0.Waermepumpe.Betriebsstatus.';
                          const idsWP = [
                             'B0_HK1_Pumpe',
                             'B1_HK2_Pumpe',
                             'B2_Aufheizprogramm',
                             'B3_NHZ_Stufen_in_Betieb',
                             'B4_WP_im_Heizbetrieb',
                             'B5_WP_im_Warmwasserbetrieb',
                             'B6_Verdichter_in_Betrieb',
                             'B7_Sommerbetrieb_aktiv',
                             'B8_Kuehlbetrieb_aktiv',
                             'B9_Abtauen',
                             'B10_Silentmode1',
                             'B11_Silentmode2'
                          ];
                          
                          for(let i = 0; i < idsWP.length; i++) {
                             createState(idWP + idsWP[i], false, {type: 'boolean', name: idsWP[i], read: true, write: false});
                          }
                          
                          on(idModbus, function(dp) {
                             let val = dp.state.val;
                             for(let i = 0; i < idsWP.length; i++) {
                                 setState(idWP + idsWP[i], !!(val & 1), true);
                                 val = val >> 1;
                             }
                          });
                          

                          Das Ergebnis ist jedoch immer noch alles "false".

                          Bildschirmfoto 2021-05-24 um 11.36.07.png

                          Node-red zeigt mir aber

                          24.5.2021, 11:33:56node: 7702536.90156ac
                          msg.payload : array[16]
                          array[16]
                          [0 … 9]
                          0: false
                          1: true
                          2: false
                          3: false
                          4: false
                          5: false
                          6: false
                          7: false
                          8: false
                          9: false
                          [10 … 15]
                          10: false
                          11: false
                          12: false
                          13: false
                          14: false
                          15: false

                          Was wiederum mit "modbus.0.inputRegisters.32500_Betriebsstatus" als Ausgabewert 2 übereinstimmen würde.

                          Liegt es evtl. am Datentype - Unsigned 16 bit

                          Bildschirmfoto 2021-05-24 um 11.58.38.png

                          paul53P Offline
                          paul53P Offline
                          paul53
                          schrieb am zuletzt editiert von paul53
                          #12

                          @schwabe_ch
                          Wenn schon bei Skriptstart die richtigen Werte gesetzt werden sollen, verwende eine Funktion, die auch bei Skriptstart aufgerufen wird.

                          // Binärwert 12 Bit decodieren und in Datenpunkte schreiben
                          const idModbus = 'modbus.0.inputRegisters.32500_Betriebsstatus'; // ID zuweisen !
                          const idWP = '0_userdata.0.Waermepumpe.Betriebsstatus.';
                          const idsWP = [
                             'B0_HK1_Pumpe',
                             'B1_HK2_Pumpe',
                             'B2_Aufheizprogramm',
                             'B3_NHZ_Stufen_in_Betieb',
                             'B4_WP_im_Heizbetrieb',
                             'B5_WP_im_Warmwasserbetrieb',
                             'B6_Verdichter_in_Betrieb',
                             'B7_Sommerbetrieb_aktiv',
                             'B8_Kuehlbetrieb_aktiv',
                             'B9_Abtauen',
                             'B10_Silentmode1',
                             'B11_Silentmode2'
                          ];
                          
                          function word2bits(val) {
                             for(let i = 0; i < idsWP.length; i++) {
                                 if(existsState(idWP + idsWP[i])) setState(idWP + idsWP[i], !!(val & 1), true);
                                 else createState(idWP + idsWP[i], !!(val & 1), {type: 'boolean', name: idsWP[i], read: true, write: false});
                                 val = val >> 1;
                             }
                          }
                           
                          word2bits(getState(idModbus).val); // Skriptstart
                          on(idModbus, function(dp) {
                             word2bits(dp.state.val);
                          });
                          

                          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                          S H 2 Antworten Letzte Antwort
                          0
                          • paul53P paul53

                            @schwabe_ch
                            Wenn schon bei Skriptstart die richtigen Werte gesetzt werden sollen, verwende eine Funktion, die auch bei Skriptstart aufgerufen wird.

                            // Binärwert 12 Bit decodieren und in Datenpunkte schreiben
                            const idModbus = 'modbus.0.inputRegisters.32500_Betriebsstatus'; // ID zuweisen !
                            const idWP = '0_userdata.0.Waermepumpe.Betriebsstatus.';
                            const idsWP = [
                               'B0_HK1_Pumpe',
                               'B1_HK2_Pumpe',
                               'B2_Aufheizprogramm',
                               'B3_NHZ_Stufen_in_Betieb',
                               'B4_WP_im_Heizbetrieb',
                               'B5_WP_im_Warmwasserbetrieb',
                               'B6_Verdichter_in_Betrieb',
                               'B7_Sommerbetrieb_aktiv',
                               'B8_Kuehlbetrieb_aktiv',
                               'B9_Abtauen',
                               'B10_Silentmode1',
                               'B11_Silentmode2'
                            ];
                            
                            function word2bits(val) {
                               for(let i = 0; i < idsWP.length; i++) {
                                   if(existsState(idWP + idsWP[i])) setState(idWP + idsWP[i], !!(val & 1), true);
                                   else createState(idWP + idsWP[i], !!(val & 1), {type: 'boolean', name: idsWP[i], read: true, write: false});
                                   val = val >> 1;
                               }
                            }
                             
                            word2bits(getState(idModbus).val); // Skriptstart
                            on(idModbus, function(dp) {
                               word2bits(dp.state.val);
                            });
                            
                            S Offline
                            S Offline
                            Schwabe_CH
                            schrieb am zuletzt editiert von
                            #13

                            @paul53

                            Ein grosses DANKESCHÖN !! ;-)

                            bfc2c3de-2eed-4cba-9a6b-e71d3de1b0cd-image.png

                            Bildschirmfoto 2021-05-24 um 13.15.19.png

                            Nun kann ich weitermachen mit meinem kleinen Projekt.

                            Noch einen schönen Pfingstmontag.

                            mickymM 1 Antwort Letzte Antwort
                            0
                            • S Schwabe_CH

                              @paul53

                              Ein grosses DANKESCHÖN !! ;-)

                              bfc2c3de-2eed-4cba-9a6b-e71d3de1b0cd-image.png

                              Bildschirmfoto 2021-05-24 um 13.15.19.png

                              Nun kann ich weitermachen mit meinem kleinen Projekt.

                              Noch einen schönen Pfingstmontag.

                              mickymM Online
                              mickymM Online
                              mickym
                              Most Active
                              schrieb am zuletzt editiert von
                              #14

                              @schwabe_ch Wenn Du eh mit NodeRed arbeitest, da gibts eine tolle Buffer Node. ;)

                              Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

                              S 1 Antwort Letzte Antwort
                              1
                              • mickymM mickym

                                @schwabe_ch Wenn Du eh mit NodeRed arbeitest, da gibts eine tolle Buffer Node. ;)

                                S Offline
                                S Offline
                                Schwabe_CH
                                schrieb am zuletzt editiert von
                                #15

                                @mickym
                                Danke für den Hinweis.
                                „Mit Nodered arbeitest“ das wäre zu schön, für den Moment war es das Produkt welches mir im Zusammenhang mit Modbus als erstes in die Finger kam. Wir haben seit 2 Monaten eine E3/DC Pro . Damit fing das ganze an. Nun taste ich mich langsam vor.
                                Buffer Node? Hast Du mir wohl einen Link dazu, unter suchen erhalte ich 50 Seiten 😎 wo finde ich mehr Informationen?

                                mickymM 1 Antwort Letzte Antwort
                                0
                                • S Schwabe_CH

                                  @mickym
                                  Danke für den Hinweis.
                                  „Mit Nodered arbeitest“ das wäre zu schön, für den Moment war es das Produkt welches mir im Zusammenhang mit Modbus als erstes in die Finger kam. Wir haben seit 2 Monaten eine E3/DC Pro . Damit fing das ganze an. Nun taste ich mich langsam vor.
                                  Buffer Node? Hast Du mir wohl einen Link dazu, unter suchen erhalte ich 50 Seiten 😎 wo finde ich mehr Informationen?

                                  mickymM Online
                                  mickymM Online
                                  mickym
                                  Most Active
                                  schrieb am zuletzt editiert von mickym
                                  #16

                                  @schwabe_ch
                                  Man muss bissi ausprobieren, aber ich finde die Node ziemlich mächtig. Anhand der Screenshots kannst Dir ja schon mal ein Eindruck verschaffen und ist ja auch schnell installiert bzw. wieder deinstalliert.

                                  https://flows.nodered.org/node/node-red-contrib-buffer-parser

                                  Auf der Seite sind auch einige Beispielflows zum Testen.

                                  Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

                                  1 Antwort Letzte Antwort
                                  0
                                  • paul53P paul53

                                    @schwabe_ch
                                    Wenn schon bei Skriptstart die richtigen Werte gesetzt werden sollen, verwende eine Funktion, die auch bei Skriptstart aufgerufen wird.

                                    // Binärwert 12 Bit decodieren und in Datenpunkte schreiben
                                    const idModbus = 'modbus.0.inputRegisters.32500_Betriebsstatus'; // ID zuweisen !
                                    const idWP = '0_userdata.0.Waermepumpe.Betriebsstatus.';
                                    const idsWP = [
                                       'B0_HK1_Pumpe',
                                       'B1_HK2_Pumpe',
                                       'B2_Aufheizprogramm',
                                       'B3_NHZ_Stufen_in_Betieb',
                                       'B4_WP_im_Heizbetrieb',
                                       'B5_WP_im_Warmwasserbetrieb',
                                       'B6_Verdichter_in_Betrieb',
                                       'B7_Sommerbetrieb_aktiv',
                                       'B8_Kuehlbetrieb_aktiv',
                                       'B9_Abtauen',
                                       'B10_Silentmode1',
                                       'B11_Silentmode2'
                                    ];
                                    
                                    function word2bits(val) {
                                       for(let i = 0; i < idsWP.length; i++) {
                                           if(existsState(idWP + idsWP[i])) setState(idWP + idsWP[i], !!(val & 1), true);
                                           else createState(idWP + idsWP[i], !!(val & 1), {type: 'boolean', name: idsWP[i], read: true, write: false});
                                           val = val >> 1;
                                       }
                                    }
                                     
                                    word2bits(getState(idModbus).val); // Skriptstart
                                    on(idModbus, function(dp) {
                                       word2bits(dp.state.val);
                                    });
                                    
                                    H Offline
                                    H Offline
                                    HelmutLinner
                                    schrieb am zuletzt editiert von
                                    #17

                                    @paul53 Hi danke für das Skript,
                                    funktioniert einwandfrei zum Lesen. Gibt es noch eine Möglichkeit dass ich auch Schreiben kann in die Einzelnen Bit? Ich will darüber ein und aus befehle an eine Steuerung mit Codesys schicken.
                                    Viele Grüße Helmut

                                    paul53P 1 Antwort Letzte Antwort
                                    0
                                    • H HelmutLinner

                                      @paul53 Hi danke für das Skript,
                                      funktioniert einwandfrei zum Lesen. Gibt es noch eine Möglichkeit dass ich auch Schreiben kann in die Einzelnen Bit? Ich will darüber ein und aus befehle an eine Steuerung mit Codesys schicken.
                                      Viele Grüße Helmut

                                      paul53P Offline
                                      paul53P Offline
                                      paul53
                                      schrieb am zuletzt editiert von paul53
                                      #18

                                      @helmutlinner sagte: Möglichkeit dass ich auch Schreiben kann in die Einzelnen Bit?

                                      Siehe hier.

                                      function writeBit(val, set, bit) {
                                         let x = 1  << bit;
                                         if(set) return val | x;
                                         return val & ~x;
                                      }
                                      

                                      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                                      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                                      1 Antwort Letzte Antwort
                                      0
                                      • D darkbrain85

                                        Hi!

                                        Ich habe ein kniffeliges Problem, bei dem ihr mir sicher behilflich sein könnte.

                                        Ich lese meine Waterkotte Wärmepumpe per Modbus aus. Dabei erhalte ich auch diverse Werte. Funktioniert sehr gut.

                                        Den Zustand einzelner Komponenten kann ich allerdings nur als bitfield in einem gemeinsamen Register abrufen. Hier erhalte ich einen Integer Wert den ich entsprechend interpretieren müsste.
                                        Hier mal die Liste aus der Doku:

                                        521d80f2-9fb9-4fa1-8e78-15e4b396b5bb-image.png

                                        Ich müsste also den Integer Wert übersetzen und dann die einzelnen Zustände zuordnen.
                                        Beim Betrieb der Heizungsumwälzpumpe erhalte ich z.B. den Wert 2.

                                        Gibt es dafür irgendwo ein Beispiel, oder kann mir da jemand auf die Sprünge helfen?

                                        Danke Euch jetzt schon!

                                        wendy2702W Online
                                        wendy2702W Online
                                        wendy2702
                                        schrieb am zuletzt editiert von wendy2702
                                        #19

                                        @darkbrain85 sagte in Bitfield übersetzen/konvertieren:

                                        Hi!

                                        Ich habe ein kniffeliges Problem, bei dem ihr mir sicher behilflich sein könnte.

                                        Ich lese meine Waterkotte Wärmepumpe per Modbus aus. Dabei erhalte ich auch diverse Werte. Funktioniert sehr gut.

                                        Den Zustand einzelner Komponenten kann ich allerdings nur als bitfield in einem gemeinsamen Register abrufen. Hier erhalte ich einen Integer Wert den ich entsprechend interpretieren müsste.
                                        Hier mal die Liste aus der Doku:

                                        521d80f2-9fb9-4fa1-8e78-15e4b396b5bb-image.png

                                        Ich müsste also den Integer Wert übersetzen und dann die einzelnen Zustände zuordnen.
                                        Beim Betrieb der Heizungsumwälzpumpe erhalte ich z.B. den Wert 2.

                                        Gibt es dafür irgendwo ein Beispiel, oder kann mir da jemand auf die Sprünge helfen?

                                        Danke Euch jetzt schon!

                                        Ist zwar schon was älter aber gerade erst gesehen.

                                        Kannst du mir sagen welche WP das ist, welches Register und wie eingestellt im Adapter?

                                        Hast du eine Übersicht über alle Register die man lesen/schreiben kann?

                                        Bitte keine Fragen per PN, die gehören ins Forum!

                                        Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                                        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

                                        815

                                        Online

                                        32.4k

                                        Benutzer

                                        81.6k

                                        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