Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Umwandlung DEC in BIN bzw. Aufteilung in einzelner 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

    Umwandlung DEC in BIN bzw. Aufteilung in einzelner BITS

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

      Hallo zusammen,

      habe jetzt schon gefühlt das ganze Forum dreimal durchsucht und nichts gefunden. 😢

      Ich habe folgendes Probelem:

      Ich bekommen einen Wert (DEC-Dezimalwert) im Modubus gesendet von einer 8BIT Digital-Eingangskarte.

      Der Wert wird als Dezimalzahl gesendet, d.H. wenn der Wert 170 ist (BIN 10101010) bedeutet das die Eingänge 1,3,5,7 auf "1" sind und die 2,4,6,8 auf "0" sind.

      Jetzt stehe ich vor dem Problem die Digitaleingänge im IOBroker zu nutzen.

      Also ich würde gerne im IOBroker Objekte erzeugen für die Digitaleingänge 1-8 aus dem DEC-Wert.

      Ich denke wenn es hierfür einen Weg gibt, wäre der weg für die 8Bit Digitalausgangkarte dann auch klar.

      Ich habe von einem Anderen System ein Funktion die dieses Problem einfach löst:

      3802_var_iobroker.png

      Vielen Dank schon mal für Eure Zeit

      1 Reply Last reply Reply Quote 0
      • paul53
        paul53 last edited by

        const idVar = '...'; // Datenpunkt-ID Modbus Input
        
        var name = 'Modbus.DI';
        var di;
        
        for(var i = 0; i < 8; i++) {
           di = 8 - i;
           createState(name + di, false, {type: 'boolean'});
        }   
        
        function dec2bool(dp) {
           var in = dp.state.val;
           var b;
           for(var i = 0; i < 8; i++) {
              b = !!(in >> i & 1);
              di = 8 - i;
              setState(name + di, b, true);
           }
        }
        
        on(idVar, dec2bool); // Triggern bei Wertänderung
        
        
        1 Reply Last reply Reply Quote 0
        • paul53
          paul53 last edited by

          Damit der Zeitstempel der Datenpunkte den Zeitpunkt der Änderung des jeweiligen DI enthält, sollte man prüfen, ob sich das Bit geändert hat.

          `const idVar = '...'; // Datenpunkt-ID Modbus Input
          
          var name = 'Modbus.DI';
          var bits = [false,false,false,false,false,false,false,false];
          
          for(var i = 0; i < 8; i++) {
             var di = 8 - i;
             createState(name + di, false, {type: 'boolean'});
          }   
          
          function dec2bool(in) {
             for(var i = 0; i < 8; i++) {
                var b = !!(in >> i & 1);
                if(b != bits[i]) {
                   var di = 8 - i;
                   setState(name + di, b, true);
                   bits[i] = b;
                }   
             }
          }
          
          on(idVar, function(dp) { // Triggern bei Wertänderung
             dec2bool(dp.state.val);
          });` [/i][/i]
          
          1 Reply Last reply Reply Quote 0
          • T
            techer2 last edited by

            Hallo Paul,

            schon mal vielen Dank für deine Antwort und LÖSUNG!!! 😄

            Ich habe diese heute morgen mal Studiert und ausprobiert.

            Da meine JS-Kenntnisse sich auf 0,1% definieren lassen(0,1% = ich weiß das es einen JS-Adapter gibt. ENDE :lol: ), war es nicht ganz so einfach wie gedacht :lol:

            Aber ich denke ich habe es jetzt verstanden und mal versucht es für JS-Anfänger zu beschreiben.

            Ich hatte bei dem Import noch eine Fehlermeldung die ich jetzt hoffentlich berichtigt habe?

            function dec2bool(in) { (habe ich in dp geändert)

            for(var i = 0; i < 8; i++) {

            var b = !!(in >> i & 1); (habe ich in dp geändert)

            (Es läuft auf jeden fall bei mir mal)

            Nur ich denke das der Weg "Rückwärts", also DOs zu schreiben doch nicht so einfach ist wie gedacht. Aber ich werde es demnächst versuchen und mein Ergebnis Posten 😄

            `const idVar = 'ASIM.Telegram.MODBUS_DI2'; // Datenpunkt-ID Modbus Input
            
            var name = 'Modbus.DI_2';               //Legt 8 Datenpunkte im Javascript-Objektordner an
            var bits = [false,false,false,false,false,false,false,false];
            
            for(var i = 0; i < 8; i++) {
               var di = 8 - i;
               createState(name + di, false, {type: 'boolean'});
            }   
            
            function dec2bool(dp) {                 // function = js befehl / dec2bool = frei vergebener Name für die Funktion / dp = temporäre Variable für die funktion
               for(var i = 0; i < 8; i++) {
                  var b = !!(dp >> i & 1);
                  if(b != bits[i]) {
                     var di = 8 - i;
                     setState(name + di, b, true);
                     bits[i] = b;
                  }   
               }
            }
            
            on(idVar, function(dp) { // Triggern bei Wertänderung
               dec2bool(dp.state.val);
            })`[/i][/i]
            
            1 Reply Last reply Reply Quote 0
            • First post
              Last post

            Support us

            ioBroker
            Community Adapters
            Donate

            723
            Online

            31.7k
            Users

            79.8k
            Topics

            1.3m
            Posts

            2
            4
            710
            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