Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. widgets mit einem Word belegen / Bit Aufschlüsselung

    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

    widgets mit einem Word belegen / Bit Aufschlüsselung

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

      Hallo zusammen,
      ich war schon im Visualisierungs-Kategorie unterwegs und bräuchte ien paar Tipps.
      Ich möchte Widgets mit eine Word belegen und entsprechen Werte schreiben und lesen.
      Das ganze hat den Hintergrund, dass ich unser Haus an eine SPS hängen hab und diese nur eine bestimmte Anzahl an Variablen schreiben/lesen kann. Deswegen habe ich sehr viele boolsche Variablen als Word zusammen gefasst.
      Das muss jetzt wieder im IO-Broker zerlegt werden.
      Als Beispiel beim Licht:
      Bit 0: Software Schalter
      Bit 1: Licht ist an
      Dafür möchte ich einen bool.button aus dem hqwidget nehmen.
      allerdings bin ich (noch) keine Erfahrung mit Javascript und dem entsprechenden ansprechen der Funktionen (z.B. button betätigt)
      ich hoffe hier kann mir jemand helfen

      Gruß T.Spooner

      paul53 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @T.Spooner last edited by paul53

        @t-spooner
        Prinzip mit Beispiel Kommando = Bit 3 und Rückmeldung = Bit 2:

        // IDs anpassen!
        const idVis = '0_userdata.0.xyz'; // boolean
        const idWord = 's7.0.abc'; 
        
        var word = getState(idWord).val;
        
        on({id: idWord, ack: true}, function(dp) {
            word = dp.state.val;
            setState(idVis, !!(word & 4), true); // bit 2
        });
        
        on({id: idVis, change: 'ne', fromNe: 'system.adapter.javascript.0'}, function(dp) {
            const bitval = 8; // bit 3
            if(dp.state.val) word |= bitval;
            else word &= ~bitval;
            setState(idWord, word);
        });
        
        T.Spooner 1 Reply Last reply Reply Quote 0
        • T.Spooner
          T.Spooner @paul53 last edited by

          @paul53
          danke für den Tipp, aber mir stellt sich schon die nächste Frage:
          Die Variable idWord ist klar, aber was ist die idVis?
          das ist doch die zum Button gehörige Variable, oder sehe ich das falsch?
          Wo deklariere ich die bzw wo sehe ich die?

          paul53 1 Reply Last reply Reply Quote 0
          • paul53
            paul53 @T.Spooner last edited by paul53

            @t-spooner sagte: idVis? das ist doch die zum Button gehörige Variable

            Ja.

            @t-spooner sagte in widgets mit einem Word belegen / Bit Aufschlüsselung:

            Wo deklariere ich die bzw wo sehe ich die?

            Dafür muss ein eigener Datenpunkt vom Typ "boolean" unter "0_userdata.0" erstellt werden.

            T.Spooner 1 Reply Last reply Reply Quote 0
            • T.Spooner
              T.Spooner @paul53 last edited by

              @paul53
              Ok habe es hinbekommen, und wieder ne Frage (wirst mich jetzt nicht mehr los 😉 ).
              Wie sage ich dem Button jetzt, dass die Leuchte an ist?
              246bedeb-9086-48bd-a282-77479c053048-grafik.png
              Übrigens musste ich ne kleine Änderungen machen und zwar hier:
              49a117c0-1a7d-4e44-91b4-eec59e7f0a5b-grafik.png .
              Es dreht sich nämlich um das erste Bit, dass die Rückmeldung gibt.
              Kannst mir mir da nochmals auf die Sprünge helfen?

              paul53 1 Reply Last reply Reply Quote 0
              • paul53
                paul53 @T.Spooner last edited by paul53

                @t-spooner sagte: Wie sage ich dem Button jetzt, dass die Leuchte an ist?

                Bei mir funktioniert es so (es ist kein Taster):

                Bild_2021-12-19_174535.png

                Mit Vis kenne ich mich aber nicht wirklich aus.

                @t-spooner sagte in widgets mit einem Word belegen / Bit Aufschlüsselung:

                Übrigens musste ich ne kleine Änderungen machen und zwar hier:

                Das war auch nur ein Beispiel. Die Kommentare sind falsch: Wert 1 ist Bit 0, Wert 2 ist Bit 1.

                T.Spooner 1 Reply Last reply Reply Quote 0
                • T.Spooner
                  T.Spooner @paul53 last edited by

                  @paul53 ok.
                  Danke mal vorab

                  paul53 1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 @T.Spooner last edited by

                    @t-spooner
                    Beispiel für ein 4-Bit-Wort, beliebig erweiterbar:

                    // IDs anpassen!
                    const idWord = 'beckhoff.0.plc.PLCIOB.Buro_Light.wReply'; 
                    const idVis1 = '0_userdata.0.Buero.Licht'; // boolean
                    const idVis2 = '0_userdata.0.xyz';
                    
                    var word = getState(idWord).val;
                    
                    on({id: idWord, ack: true}, function(dp) {
                        word = dp.state.val;
                        setState(idVis1, !!(word & 2), true); // bit 1
                        setState(idVis2, !!(word & 8), true); // bit 3
                    });
                    
                    on({id: idVis1, change: 'ne', fromNe: 'system.adapter.javascript.0'}, function(dp) {
                        const bitval = 1; // bit 0
                        if(dp.state.val) word |= bitval; // set bit
                        else word &= ~bitval; // reset bit
                        setState(idWord, word);
                    });
                    on({id: idVis2, change: 'ne', fromNe: 'system.adapter.javascript.0'}, function(dp) {
                        const bitval = 4; // bit 2
                        if(dp.state.val) word |= bitval; // set bit
                        else word &= ~bitval; // reset bit
                        setState(idWord, word);
                    });
                    
                    C 1 Reply Last reply Reply Quote 0
                    • C
                      captainchaos666 @paul53 last edited by

                      @paul53 habe dein Script hier gefunden und sollte ebenfalls deine Unterstüzung haben da ich es nicht wirklich verstehe, kannst du mir weiter helfen

                      on({id: idWord, ack: true}, function(dp) {
                          word = dp.state.val;
                          setState(idVis1, !!(word & 2), true); // bit 1
                          setState(idVis2, !!(word & 8), true); // bit 3
                      });
                      

                      Meine Fragen zu dem Code:

                      • Wieso hast du hier "ack:true" verwendet
                      • Wann werden bzw. wie werden die Bits wieder auf false gesetzt
                      • Was machen die zwei !!, habe was gelesen das du hier zweimal negierst und indirekt eine Typenwandlung von Word auf Bool machst, stimmt das oder liege ich hier komplett falsch
                      on({id: idVis1, change: 'ne', fromNe: 'system.adapter.javascript.0'}, function(dp) {
                         const bitval = 1; // bit 0
                         if(dp.state.val) word |= bitval; // set bit
                         else word &= ~bitval; // reset bit
                         setState(idWord, word);
                      });
                      
                      • Wieso gibt es hier ({id: idVis1, change: 'ne', fromNe: 'system.adapter.javascript.0'}, zwei Aufzählungen change 'ne' und fromNe: 'sys..'
                      • Was macht fromNe

                      Grund: Habe einen WR der ebenfalls ein Statuswort hat, das würde ich gerne in einzelne Bits zerlegen damit ich die Stati in meiner VIS anzeigen kann

                      Aufbau Statuswort, Beispiel:

                      Batterie Laden => Bit 1 = 0 => Nicht Laden
                      Batterie Laden => Bit 1 = 1 => Laden

                      Batterie Entladen => Bit 2 = 0 => Nicht Entladen
                      Batterie Entladen => Bit 2 = 1 => Entladen

                      Leistungsbezug => Bit 5 = 0 => Keine Leistung aus dem Netz
                      Leistungsbezug => Bit 5 = 1 => Netz Bezug

                      vielen Dank für deine Unterstüzung

                      Alex

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

                        @captainchaos666 sagte: Meine Fragen zu dem Code:

                        • Wieso hast du hier "ack:true" verwendet
                          Weil in einen eigenen Datenpunkt unter "0_userdata.0" geschrieben wird

                        • Wann werden bzw. wie werden die Bits wieder auf false gesetzt
                          Wenn das Wort an der Bitposition eine 0 enthält

                        • Was machen die zwei !!
                          Wandeln die Zahlen 0 und 1 in false und true.

                        • Was macht fromNe
                          Verhindert ein Triggern, wenn die Quelle der Wertänderung ein Skript ist: Dient zur Vermeidung von Endlos-Trigger-Schleifen.

                        Bit 1: Maske 2; Bit 2: Maske 4; bit 5: Maske 32

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        495
                        Online

                        31.8k
                        Users

                        80.0k
                        Topics

                        1.3m
                        Posts

                        3
                        10
                        523
                        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