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.6k

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.
  • 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 Offline
            mickymM Offline
            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 Offline
                mickymM Offline
                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

                      525

                      Online

                      32.5k

                      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