Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Boolean Verknüpfung

    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

    Boolean Verknüpfung

    This topic has been deleted. Only users with topic management privileges can see it.
    • R
      rewenode last edited by

      Mein function-node hat noch Schönheitsfehler. Habe erst zuspät bemerkt, dass der Input Hex-Zahlen sind. Deshalb ist auf die Regular Expression kein Verlass. Außerdem verhält sich die string.split() Methode recht sperrig bei regEx. Mit string.match() gehts deutlich einfacher.

      ! ````
      //splitte string in int-Array
      let aI = msg.payload.match(/.{1,2}(?=(.{2})+(?!.))|.{1,2}$/g) //split in 2stellige strings
      .map(x => parseInt(x,16)); //konvertiere HEX strings nach Integer
      ! //xor vom inputArray
      let mustXor = aI[aI.length-1];
      ! //xor aus inputArry entfernen, ist nötig, damit sich die reduce() Methode verwenden läßt
      aI.splice(-1, 1);
      ! //xor aus inputarry bilden
      let ifXor = aI.reduce((v, vnext) => v ^ vnext);
      ! if (ifXor == mustXor) { //no error
      ! node.status({fill:"green",shape:"dot",text:'no error'})
      node.send([{payload: aI[0]},
      {payload: aI[1]},
      {payload: aI[2]},
      {payload: aI[3]},
      {payload: aI[4]},
      {payload: aI[5]},
      {payload: aI[6]},
      {payload: 'no error'}]);
      ! } else { //xor error

      node.status({fill:"red",shape:"dot",text:'XOR error'})
      node.send([null,null,null,null,null,null,null,{payload: 'XOR error'}]);
      

      }

      ! ````

      Du kannst den beiliegenden Code einfach komplett in das function-node pasten.

      Ist soweit eigentlich kommentiert. Ansonsten frag einfach.

      1 Reply Last reply Reply Quote 0
      • P
        pfuhsy last edited by

        Top. Das geht. Danke.

        In "mustXor" steht der errechnete Wert, soviel hab ich verstanden. Wie bekomme ich ihn wieder in Hex gewandelt, also damit 3A anstatt 58 drin steht ? Am besten auch immer 2stellig. D.h. wenn ich eine 4 habe, brauche ich in Hex genauer genommern eine 04.

        1 Reply Last reply Reply Quote 0
        • R
          rewenode last edited by

          Also mit toString() Methode kannst du eine Zahl wieder in einen String konvertieren.

          https://www.w3schools.com/jsref/jsref_t … number.asp

          Also falls do mustXor wieder als String brauchst, wäre das mustXor.toString(16). Aber wozu? Der XOR Test ist ja schon gemacht.

          1 Reply Last reply Reply Quote 0
          • P
            pfuhsy last edited by

            Weil ich einen Sheldon-Tick habe und die beiden auch noch in 2 Objekten sehen will.
            6863_unbenannt.jpg

            1 Reply Last reply Reply Quote 0
            • R
              rewenode last edited by

              Na dann schreib ihn vlt. gleich zum Ausgang 8.

              if (ifXor == mustXor) {  //no error
              
                  node.status({fill:"green",shape:"dot",text:'no error'})
                  node.send([{payload: aI[0]},
                             {payload: aI[1]},
                             {payload: aI[2]},
                             {payload: aI[3]},
                             {payload: aI[4]},
                             {payload: aI[5]},
                             {payload: aI[6]},
                             {payload: mustXor.toString(16)}]);
              
              } else {  //xor error
              
                  node.status({fill:"red",shape:"dot",text:'XOR error'})
                  node.send([null,null,null,null,null,null,null,{payload: 'XOR error'}]);
              }
              
              

              Falls du ihn im Fehlerfall auch haben willst, dann halt statt {payload: 'XOR error'} ebenfalls {payload: mustXor.toString(16)}

              1 Reply Last reply Reply Quote 0
              • P
                pfuhsy last edited by

                Ok ist drin. Funkioniert. Und wie bekomme ich den letzten Schönheitsfehler noch raus, 2Stellig ? ich suche gerne bei google "node red String format". Ich finde was mit "%2" oder so ähnlich. Kenn ich auch C, hab ich die Syntax noch nicht richtig drin.

                1 Reply Last reply Reply Quote 0
                • R
                  rewenode last edited by

                  Versuch mal````
                  {payload: mustXor.toString(16).padStart(2, '0')}

                  Fall du alle Ausgänge als hex 2stellig haben willst, dann musst du das .toString(16).padStart(2, '0') überall anhängen.
                  1 Reply Last reply Reply Quote 0
                  • P
                    pfuhsy last edited by

                    Super. Ich danke dir für die Unterstützung, hast mir sehr geholfen. Ich probiere das morgen mal aus.

                    1 Reply Last reply Reply Quote 0
                    • R
                      rewenode last edited by

                      Sorry, ich seh grad, das geht wohl in node-red nicht mit dem padstart() hier getestet: https://www.jdoodle.com/execute-nodejs-online

                      Muss mal sehen was man da machen kann.

                      1 Reply Last reply Reply Quote 0
                      • R
                        rewenode last edited by

                        Nicht schön, aber auf die Schnelle fällt mir auch nur eine eigene Funktion ein.

                        //splitte string in int-Array 
                        let aI = msg.payload.match(/.{1,2}(?=(.{2})+(?!.))|.{1,2}$/g)  //split in 2stellige strings
                                            .map(x => parseInt(x,16));                 //konvertiere HEX strings nach Integer
                        
                        //xor vom inputArray
                        let mustXor = aI[aI.length-1];
                        
                        //xor aus inputArry entfernen
                        aI.splice(-1, 1);
                        
                        //xor aus inputaary bilden
                        let ifXor = aI.reduce((v, vnext) => v ^ vnext);
                        
                        let fix2 = (x) => ('0'+x).slice(-2);  // einstelligen String mit führender Null
                        
                        if (ifXor == mustXor) {  //no error
                        
                            node.status({fill:"green",shape:"dot",text:'no error'})
                            node.send([{payload: fix2(aI[0].toString(16))},
                                       {payload: fix2(aI[1].toString(16))},
                                       {payload: fix2(aI[2].toString(16))},
                                       {payload: fix2(aI[3].toString(16))},
                                       {payload: fix2(aI[4].toString(16))},
                                       {payload: fix2(aI[5].toString(16))},
                                       {payload: fix2(aI[6].toString(16))},
                                       {payload: fix2(mustXor.toString(16))}]);
                        
                        } else {  //xor error
                        
                            node.status({fill:"red",shape:"dot",text:'XOR error'})
                            node.send([null,null,null,null,null,null,null,{payload: 'XOR error'}]);
                        }
                        

                        Jetzt wird an allen Ausgängen ein 2stelliger String ausgegeben.

                        Edit: geht auch etwas kürzer s.o. und diesmal ohne Copy/Paste Fehler –hoffe ich 😉

                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        679
                        Online

                        31.7k
                        Users

                        79.9k
                        Topics

                        1.3m
                        Posts

                        2
                        20
                        3000
                        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