Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Bits to Word / Word to Bits

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Bits to Word / Word to Bits

    This topic has been deleted. Only users with topic management privileges can see it.
    • K
      Kev 0 last edited by

      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

      paul53 T 3 Replies Last reply Reply Quote 0
      • paul53
        paul53 @Kev 0 last edited by paul53

        @kev-0
        Siehe hier oder hier

        1 Reply Last reply Reply Quote 0
        • T
          ticaki Developer @Kev 0 last edited by 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 1 Reply Last reply Reply Quote 0
          • K
            Kev 0 @ticaki last edited by

            @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 Reply Quote 0
            • T
              ticaki Developer @Kev 0 last edited by

              @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));
                      }
                  });
              }
              
              1 Reply Last reply Reply Quote 0
              • paul53
                paul53 @Kev 0 last edited by paul53

                @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
                }; 
                
                1 Reply Last reply Reply Quote 1
                • First post
                  Last post

                Support us

                ioBroker
                Community Adapters
                Donate

                893
                Online

                31.8k
                Users

                80.0k
                Topics

                1.3m
                Posts

                3
                6
                342
                Loading More Posts
                • Oldest to Newest
                • Newest to Oldest
                • Most Votes
                Reply
                • Reply as topic
                Log in to reply
                Community
                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                The ioBroker Community 2014-2023
                logo