Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • 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

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Bits to Word / Word to Bits

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.9k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    916

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

Bits to Word / Word to Bits

Scheduled Pinned Locked Moved JavaScript
6 Posts 3 Posters 616 Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • K Offline
    K Offline
    Kev 0
    wrote on last edited by
    #1

    Hi,

    ich schreibe gerade meine ersten Skripte mit JavaScript (habe bis jetzt Erfahrungen mit C++ und SCL) und wollte Mal eure Meinung zu folgenden einfachen Skripten hören. Anregungen und Verbesserungen gerne gewünscht.

    WordsToBits

    const BIT0 = 1;
    const BIT1 = 2;
    const BIT2 = 4;
    const BIT3 = 8;
    const BIT4 = 16;
    const BIT5 = 32;
    const BIT6 = 64;
    const BIT7 = 128;
    const BIT8 = 256;
    const BIT9 = 512;
    const BIT10 = 1024;
    const BIT11 = 2048;
    const BIT12 = 4096;
    const BIT13 = 8192;
    const BIT14 = 16384;
    const BIT15 = 32768;
    
    let arrWordsToBits = [
        [
            "0_userdata.0.Test.MyInt",
            [
                ["0_userdata.0.Test.MyBool", BIT0],
                ["0_userdata.0.Test.MyBool2", BIT2]
            ]
        ]
    ]
    
    function ConvertWordToBit(word, position)
    {
        return Boolean(word & position);
    }
    
    for (const outer_element of arrWordsToBits)
    {
        on({id: outer_element[0].toString(), change: 'ne'}, function(obj)
        {
            var word_value = getState(outer_element[0].toString()).val;
            for (const inner_element of outer_element[1])
            {
                setState(inner_element[0].toString(), ConvertWordToBit(word_value, inner_element[1]));
            }
        });
    }
    

    BitsToWords

    const BIT0 = 1;
    const BIT1 = 2;
    const BIT2 = 4;
    const BIT3 = 8;
    const BIT4 = 16;
    const BIT5 = 32;
    const BIT6 = 64;
    const BIT7 = 128;
    const BIT8 = 256;
    const BIT9 = 512;
    const BIT10 = 1024;
    const BIT11 = 2048;
    const BIT12 = 4096;
    const BIT13 = 8192;
    const BIT14 = 16384;
    const BIT15 = 32768;
    
    let arrBitsToWords = [
        [ "0_userdata.0.Test.MyBool", "0_userdata.0.Test.MyInt2", BIT0 ],
        [ "0_userdata.0.Test.MyBool2", "0_userdata.0.Test.MyInt2", BIT2 ]
    ]
    
    
    function ModifyWord(word, bit, position)
    {
        if (bit) // value true --> set position
        {
            return word | position;
        }
        else // value false --> reset position
        {
            return word & ~position;
        }
    }
    
    
    for (const element of arrBitsToWords)
    {
        on({id: element[0].toString(), change: 'ne'}, function(obj)
        {
            var bit_value = getState(element[0].toString()).val;
            var word_value = getState(element[1].toString()).val;
            setState(element[1].toString(), ModifyWord(word_value, bit_value, element[2]));
        });
    }
    

    Mit freundlichen Grüßen
    Kevin

    paul53P T 3 Replies Last reply
    0
    • K Kev 0

      Hi,

      ich schreibe gerade meine ersten Skripte mit JavaScript (habe bis jetzt Erfahrungen mit C++ und SCL) und wollte Mal eure Meinung zu folgenden einfachen Skripten hören. Anregungen und Verbesserungen gerne gewünscht.

      WordsToBits

      const BIT0 = 1;
      const BIT1 = 2;
      const BIT2 = 4;
      const BIT3 = 8;
      const BIT4 = 16;
      const BIT5 = 32;
      const BIT6 = 64;
      const BIT7 = 128;
      const BIT8 = 256;
      const BIT9 = 512;
      const BIT10 = 1024;
      const BIT11 = 2048;
      const BIT12 = 4096;
      const BIT13 = 8192;
      const BIT14 = 16384;
      const BIT15 = 32768;
      
      let arrWordsToBits = [
          [
              "0_userdata.0.Test.MyInt",
              [
                  ["0_userdata.0.Test.MyBool", BIT0],
                  ["0_userdata.0.Test.MyBool2", BIT2]
              ]
          ]
      ]
      
      function ConvertWordToBit(word, position)
      {
          return Boolean(word & position);
      }
      
      for (const outer_element of arrWordsToBits)
      {
          on({id: outer_element[0].toString(), change: 'ne'}, function(obj)
          {
              var word_value = getState(outer_element[0].toString()).val;
              for (const inner_element of outer_element[1])
              {
                  setState(inner_element[0].toString(), ConvertWordToBit(word_value, inner_element[1]));
              }
          });
      }
      

      BitsToWords

      const BIT0 = 1;
      const BIT1 = 2;
      const BIT2 = 4;
      const BIT3 = 8;
      const BIT4 = 16;
      const BIT5 = 32;
      const BIT6 = 64;
      const BIT7 = 128;
      const BIT8 = 256;
      const BIT9 = 512;
      const BIT10 = 1024;
      const BIT11 = 2048;
      const BIT12 = 4096;
      const BIT13 = 8192;
      const BIT14 = 16384;
      const BIT15 = 32768;
      
      let arrBitsToWords = [
          [ "0_userdata.0.Test.MyBool", "0_userdata.0.Test.MyInt2", BIT0 ],
          [ "0_userdata.0.Test.MyBool2", "0_userdata.0.Test.MyInt2", BIT2 ]
      ]
      
      
      function ModifyWord(word, bit, position)
      {
          if (bit) // value true --> set position
          {
              return word | position;
          }
          else // value false --> reset position
          {
              return word & ~position;
          }
      }
      
      
      for (const element of arrBitsToWords)
      {
          on({id: element[0].toString(), change: 'ne'}, function(obj)
          {
              var bit_value = getState(element[0].toString()).val;
              var word_value = getState(element[1].toString()).val;
              setState(element[1].toString(), ModifyWord(word_value, bit_value, element[2]));
          });
      }
      

      Mit freundlichen Grüßen
      Kevin

      paul53P Offline
      paul53P Offline
      paul53
      wrote on last edited by paul53
      #2

      @kev-0
      Siehe hier oder hier

      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 Reply Last reply
      0
      • K Kev 0

        Hi,

        ich schreibe gerade meine ersten Skripte mit JavaScript (habe bis jetzt Erfahrungen mit C++ und SCL) und wollte Mal eure Meinung zu folgenden einfachen Skripten hören. Anregungen und Verbesserungen gerne gewünscht.

        WordsToBits

        const BIT0 = 1;
        const BIT1 = 2;
        const BIT2 = 4;
        const BIT3 = 8;
        const BIT4 = 16;
        const BIT5 = 32;
        const BIT6 = 64;
        const BIT7 = 128;
        const BIT8 = 256;
        const BIT9 = 512;
        const BIT10 = 1024;
        const BIT11 = 2048;
        const BIT12 = 4096;
        const BIT13 = 8192;
        const BIT14 = 16384;
        const BIT15 = 32768;
        
        let arrWordsToBits = [
            [
                "0_userdata.0.Test.MyInt",
                [
                    ["0_userdata.0.Test.MyBool", BIT0],
                    ["0_userdata.0.Test.MyBool2", BIT2]
                ]
            ]
        ]
        
        function ConvertWordToBit(word, position)
        {
            return Boolean(word & position);
        }
        
        for (const outer_element of arrWordsToBits)
        {
            on({id: outer_element[0].toString(), change: 'ne'}, function(obj)
            {
                var word_value = getState(outer_element[0].toString()).val;
                for (const inner_element of outer_element[1])
                {
                    setState(inner_element[0].toString(), ConvertWordToBit(word_value, inner_element[1]));
                }
            });
        }
        

        BitsToWords

        const BIT0 = 1;
        const BIT1 = 2;
        const BIT2 = 4;
        const BIT3 = 8;
        const BIT4 = 16;
        const BIT5 = 32;
        const BIT6 = 64;
        const BIT7 = 128;
        const BIT8 = 256;
        const BIT9 = 512;
        const BIT10 = 1024;
        const BIT11 = 2048;
        const BIT12 = 4096;
        const BIT13 = 8192;
        const BIT14 = 16384;
        const BIT15 = 32768;
        
        let arrBitsToWords = [
            [ "0_userdata.0.Test.MyBool", "0_userdata.0.Test.MyInt2", BIT0 ],
            [ "0_userdata.0.Test.MyBool2", "0_userdata.0.Test.MyInt2", BIT2 ]
        ]
        
        
        function ModifyWord(word, bit, position)
        {
            if (bit) // value true --> set position
            {
                return word | position;
            }
            else // value false --> reset position
            {
                return word & ~position;
            }
        }
        
        
        for (const element of arrBitsToWords)
        {
            on({id: element[0].toString(), change: 'ne'}, function(obj)
            {
                var bit_value = getState(element[0].toString()).val;
                var word_value = getState(element[1].toString()).val;
                setState(element[1].toString(), ModifyWord(word_value, bit_value, element[2]));
            });
        }
        

        Mit freundlichen Grüßen
        Kevin

        T Do not disturb
        T Do not disturb
        ticaki
        wrote on last edited by ticaki
        #3

        @kev-0
        Ich persönlich würde dazu raten Datenstrukturen in Json zu verwenden, außer das wäre eine große geistige Umstellung. Zum Beispiel so:

        const arrWordsToBits={
            "0_userdata.0.Test.MyInt":
                [
                    {
                        dp: "0_userdata.0.Test.MyBool",
                        val: BIT0
                    },
                    {
                        dp: "0_userdata.0.Test.MyBool2",
                        val: BIT2
                    }
                ]
        }
        
        function ConvertWordToBit(word,position) {
            return Boolean(word&position);
        }
        
        for (const outer_element of arrWordsToBits) {
            on({ id: outer_element,change: 'ne' },function (obj) {
                //var word_value=getState(obj._id).val;
                const word_value = obj.state.val;
                for (const inner_element of arrWordsToBits[obj.id]) {
                    setState(inner_element.id.toString(), ConvertWordToBit(word_value,inner_element.val));
                }
            });
        }
        

        Hoffe ich hab keinen Fehler gemacht, fällt mir mittlerweile schwer arrays in arrays in arrays zu lesen :) nicht Wunder über die const... typescript eslint hat mich umerzogen.

        Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

        Spenden

        K 1 Reply Last reply
        0
        • T ticaki

          @kev-0
          Ich persönlich würde dazu raten Datenstrukturen in Json zu verwenden, außer das wäre eine große geistige Umstellung. Zum Beispiel so:

          const arrWordsToBits={
              "0_userdata.0.Test.MyInt":
                  [
                      {
                          dp: "0_userdata.0.Test.MyBool",
                          val: BIT0
                      },
                      {
                          dp: "0_userdata.0.Test.MyBool2",
                          val: BIT2
                      }
                  ]
          }
          
          function ConvertWordToBit(word,position) {
              return Boolean(word&position);
          }
          
          for (const outer_element of arrWordsToBits) {
              on({ id: outer_element,change: 'ne' },function (obj) {
                  //var word_value=getState(obj._id).val;
                  const word_value = obj.state.val;
                  for (const inner_element of arrWordsToBits[obj.id]) {
                      setState(inner_element.id.toString(), ConvertWordToBit(word_value,inner_element.val));
                  }
              });
          }
          

          Hoffe ich hab keinen Fehler gemacht, fällt mir mittlerweile schwer arrays in arrays in arrays zu lesen :) nicht Wunder über die const... typescript eslint hat mich umerzogen.

          K Offline
          K Offline
          Kev 0
          wrote on last edited by
          #4

          @ticaki Vielen Dank für deine Antwort aber leider habe ich so meine Probleme damit bzw. auch Javascript
          Ich bekomme die Fehlermeldung dass arrWordsToBits nicht iterierbar ist.
          Viell. war es an meinem ersten Beispiel nicht gut ersichtlich aber es kann noch mehr MyInts geben die wiederum andere Bool schreiben z.B.

          let arrWordsToBits = [
              [
                  "modbus.1.holdingRegisters.0_Fensterkontakte",
                  [
                      ["0_userdata.0.Fensterkontakte.BalkonKindNordGeschlossen", BIT0],
                      ["0_userdata.0.Fensterkontakte.BalkonKindSuedGeschlossen", BIT1],
                      ["0_userdata.0.Fensterkontakte.BalkonSchlafGeschlossen", BIT2],
                      ["0_userdata.0.Fensterkontakte.FensterAnkleideGeschlossen", BIT3],
                  ]
              ],
              [
                  "modbus.1.holdingRegisters.1_Lichtzustaende_1",
                  [
                      ["0_userdata.0.Leuchten.Zustaende.Dielentreppe", BIT0],
                      ["0_userdata.0.Leuchten.Zustaende.Technik", BIT1],
                      ["0_userdata.0.Leuchten.Zustaende.Werkstatt", BIT2],
                  ]
              ]
          

          Dann ist mir aufgefallen, dass du unten inner_element.id verwendest aber müsste das nicht inner_element.dp sein?

          T 1 Reply Last reply
          0
          • K Kev 0

            @ticaki Vielen Dank für deine Antwort aber leider habe ich so meine Probleme damit bzw. auch Javascript
            Ich bekomme die Fehlermeldung dass arrWordsToBits nicht iterierbar ist.
            Viell. war es an meinem ersten Beispiel nicht gut ersichtlich aber es kann noch mehr MyInts geben die wiederum andere Bool schreiben z.B.

            let arrWordsToBits = [
                [
                    "modbus.1.holdingRegisters.0_Fensterkontakte",
                    [
                        ["0_userdata.0.Fensterkontakte.BalkonKindNordGeschlossen", BIT0],
                        ["0_userdata.0.Fensterkontakte.BalkonKindSuedGeschlossen", BIT1],
                        ["0_userdata.0.Fensterkontakte.BalkonSchlafGeschlossen", BIT2],
                        ["0_userdata.0.Fensterkontakte.FensterAnkleideGeschlossen", BIT3],
                    ]
                ],
                [
                    "modbus.1.holdingRegisters.1_Lichtzustaende_1",
                    [
                        ["0_userdata.0.Leuchten.Zustaende.Dielentreppe", BIT0],
                        ["0_userdata.0.Leuchten.Zustaende.Technik", BIT1],
                        ["0_userdata.0.Leuchten.Zustaende.Werkstatt", BIT2],
                    ]
                ]
            

            Dann ist mir aufgefallen, dass du unten inner_element.id verwendest aber müsste das nicht inner_element.dp sein?

            T Do not disturb
            T Do not disturb
            ticaki
            wrote on last edited by
            #5

            @kev-0
            sry, of und in werfe ich gelegentlich durcheinander. Habs jetzt mal so umgeschrieben dass ich es auch verstehe :) hoffe du verstehst auch noch. Json hat doch einige Vorteile vorallem das sowohl der "index" als auch der "Value" einen aussagekräfigen wert hat.

            for (const dp in arrWordsToBits) {
                on({ id: dp,change: 'ne' },function (obj) {
                    //var word_value=getState(obj._id).val;
                    const word_value=obj.state.val;
                    for (const index in arrWordsToBits[obj.id]) {
                        const inner_element = arrWordsToBits[obj.id][index]
                        const dp = inner_element.id.toString()
                        setState(dp,ConvertWordToBit(word_value,inner_element.val));
                    }
                });
            }
            

            Darauf war mein Beispiel ausgelegt.

            Du kannst es auch so machen:

            const arrWordsToBits = {
                                '0_userdata.0.Test.MyInt': {
                                    '0_userdata.0.Test.MyBool': BIT0,
                                    '0_userdata.0.Test.MyBool2': BIT2,
                                },
                            };
            
            for (const dp in arrWordsToBits) {
                on({ id: dp,change: 'ne' },function (obj) {
                    //var word_value=getState(obj._id).val;
                    const word_value=obj.state.val;
                    for (const dp in arrWordsToBits[obj.id]) {
                        const value = arrWordsToBits[obj.id][dp]
                        
                        setState(dp,ConvertWordToBit(word_value,value));
                    }
                });
            }
            

            Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

            Spenden

            1 Reply Last reply
            0
            • K Kev 0

              Hi,

              ich schreibe gerade meine ersten Skripte mit JavaScript (habe bis jetzt Erfahrungen mit C++ und SCL) und wollte Mal eure Meinung zu folgenden einfachen Skripten hören. Anregungen und Verbesserungen gerne gewünscht.

              WordsToBits

              const BIT0 = 1;
              const BIT1 = 2;
              const BIT2 = 4;
              const BIT3 = 8;
              const BIT4 = 16;
              const BIT5 = 32;
              const BIT6 = 64;
              const BIT7 = 128;
              const BIT8 = 256;
              const BIT9 = 512;
              const BIT10 = 1024;
              const BIT11 = 2048;
              const BIT12 = 4096;
              const BIT13 = 8192;
              const BIT14 = 16384;
              const BIT15 = 32768;
              
              let arrWordsToBits = [
                  [
                      "0_userdata.0.Test.MyInt",
                      [
                          ["0_userdata.0.Test.MyBool", BIT0],
                          ["0_userdata.0.Test.MyBool2", BIT2]
                      ]
                  ]
              ]
              
              function ConvertWordToBit(word, position)
              {
                  return Boolean(word & position);
              }
              
              for (const outer_element of arrWordsToBits)
              {
                  on({id: outer_element[0].toString(), change: 'ne'}, function(obj)
                  {
                      var word_value = getState(outer_element[0].toString()).val;
                      for (const inner_element of outer_element[1])
                      {
                          setState(inner_element[0].toString(), ConvertWordToBit(word_value, inner_element[1]));
                      }
                  });
              }
              

              BitsToWords

              const BIT0 = 1;
              const BIT1 = 2;
              const BIT2 = 4;
              const BIT3 = 8;
              const BIT4 = 16;
              const BIT5 = 32;
              const BIT6 = 64;
              const BIT7 = 128;
              const BIT8 = 256;
              const BIT9 = 512;
              const BIT10 = 1024;
              const BIT11 = 2048;
              const BIT12 = 4096;
              const BIT13 = 8192;
              const BIT14 = 16384;
              const BIT15 = 32768;
              
              let arrBitsToWords = [
                  [ "0_userdata.0.Test.MyBool", "0_userdata.0.Test.MyInt2", BIT0 ],
                  [ "0_userdata.0.Test.MyBool2", "0_userdata.0.Test.MyInt2", BIT2 ]
              ]
              
              
              function ModifyWord(word, bit, position)
              {
                  if (bit) // value true --> set position
                  {
                      return word | position;
                  }
                  else // value false --> reset position
                  {
                      return word & ~position;
                  }
              }
              
              
              for (const element of arrBitsToWords)
              {
                  on({id: element[0].toString(), change: 'ne'}, function(obj)
                  {
                      var bit_value = getState(element[0].toString()).val;
                      var word_value = getState(element[1].toString()).val;
                      setState(element[1].toString(), ModifyWord(word_value, bit_value, element[2]));
                  });
              }
              

              Mit freundlichen Grüßen
              Kevin

              paul53P Offline
              paul53P Offline
              paul53
              wrote on last edited by paul53
              #6

              @kev-0 sagte: Anregungen und Verbesserungen gerne gewünscht.

              Die vielen Konstanten benötigt man nicht. Ich verwende 3 globale Funktionen für Bitoperationen:

              function checkBit(val, bit) {
                  return !!(val >> bit & 1);
              }
              
              function setBit(val, bit) {
                  return val | (1 << bit);
              }
              
              function resetBit(val, bit) {
                  return val & ~(1 << bit);
              }
              

              Das Objekt für die Zuordnung von Bit-Position zu Datenpunkt-IDs könnte so aussehen:

              const bits = {
                  '0_userdata.0.Test.MyBool': 0,
                  '0_userdata.0.Test.MyBool2': 2
              }; 
              

              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 Reply Last reply
              1
              Reply
              • Reply as topic
              Log in to reply
              • Oldest to Newest
              • Newest to Oldest
              • Most Votes


              Support us

              ioBroker
              Community Adapters
              Donate

              317

              Online

              32.6k

              Users

              82.2k

              Topics

              1.3m

              Posts
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
              ioBroker Community 2014-2025
              logo
              • Login

              • Don't have an account? Register

              • Login or register to search.
              • First post
                Last post
              0
              • Home
              • Recent
              • Tags
              • Unread 0
              • Categories
              • Unreplied
              • Popular
              • GitHub
              • Docu
              • Hilfe