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. JavaScript
  5. Bits to Word / Word to Bits

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.4k

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

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.6k

Bits to Word / Word to Bits

Geplant Angeheftet Gesperrt Verschoben JavaScript
6 Beiträge 3 Kommentatoren 581 Aufrufe 2 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.
  • K Offline
    K Offline
    Kev 0
    schrieb am zuletzt editiert von
    #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 Antworten Letzte Antwort
    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
      schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
      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 Nicht stören
        T Nicht stören
        ticaki
        schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
        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
          schrieb am zuletzt editiert von
          #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 Antwort Letzte Antwort
          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 Nicht stören
            T Nicht stören
            ticaki
            schrieb am zuletzt editiert von
            #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 Antwort Letzte Antwort
            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
              schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
              1
              Antworten
              • In einem neuen Thema antworten
              Anmelden zum Antworten
              • Älteste zuerst
              • Neuste zuerst
              • Meiste Stimmen


              Support us

              ioBroker
              Community Adapters
              Donate

              745

              Online

              32.5k

              Benutzer

              81.7k

              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