Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. JS für Switch + State anpassen

    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

    JS für Switch + State anpassen

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

      Moin,
      in einem anderen Beitrag( Datenpunkte zusammenführen switch + state) hat @Paul53 ein JS zur Verfügung gestellt:

      // IDs anpassen
      const idButton = 's7.0.DBs.DB1.NI02';
      const idActor = 's7.0.DBs.DB1.Q02';
       
      const js = 'system.adapter.javascript.' + instance;
      const common = getObject(idButton).common;
      const idVis = 'LOGO.s7-0.' + common.name.replace(/\s/g, '_');
       
      common.read = true;
      createState(idVis, getState(idActor).val, common);
       
      on({id: 'javascript.0.' + idVis, change: 'ne', fromNe: js}, function() {
          setState(idButton, true);
      });
       
      on(idActor, function(dp) {
          setState(idVis, dp.state.val, true);
      });
      
      

      Kurz erklärt, es gibt in der S7/Logo ein Button "idButton" der kurz getastet wird und ein Ausgang der den Zustand anzeigt "idActor".

      Jetzt möchte ich dies für meine Beleuchtung etc die über die S7 laufen benutzen, ein Test ist positiv verlaufen.
      Ich möchte aber ungern für jede Lampe ein extra Skript machen, deswegen habe ich mir überlegt, geht sowas nicht mit einer Schleife?
      Sowas wie

      // IDs anpassen
      const idButton1 = 's7.0.DBs.DB1.NI02';
      const idActor1 = 's7.0.DBs.DB1.Q02';
      const idButton2 = 's7.0.DBs.DB1.NI03';
      const idActor2 = 's7.0.DBs.DB1.Q03';
      ...
      

      Also immer eine fortlaufende Nummer angehangen an der Variable.
      Jetzt könnte man ja im folgenden eben die Schleife erstellen, sodass er immer einen weiterzählt und dann immer von vorne durchgeht, bis er alle durch hat und dann wieder von vorne.
      Dann hätte ich nur ein Skript.

      Jetzt bin ich leider in JS nicht so fit, dass ich diese Schleife mir selber basteln kann.
      Aber vielleicht hilft mir hier einer?

      Gruß Thomas

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

        @tugsi sagte:

        Also immer eine fortlaufende Nummer angehangen an der Variable.

        Variablenbezeichner können nicht dynamisch modifiziert werden. Man muss Arrays verwenden.

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

          @paul53
          Ok, macht dies denn Sinn bzw einfacher oder doch Copy+Paste und das Script dann x-mal kopieren für die einzelnen "Taster"?

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

            @tugsi sagte:

            macht dies denn Sinn

            Ja, bei vielen Aktoren macht es schon Sinn. Versuche es mal so (nicht getestet):

            // IDs anpassen
            const idsButton = ['s7.0.DBs.DB1.NI02','usw.'];
            const idsActor  = ['s7.0.DBs.DB1.Q02','usw.'];
            
            const js = 'system.adapter.javascript.' + instance;
            
            var idsVis = [];
            for(let i = 0; i < idsButton.length; i++) {
                let common = getObject(idsButton[i]).common;
                idsVis[i] = 'javascript.' + instance + '.LOGO.s7-0.' + common.name.replace(/\s/g, '_');
                common.read = true;
                createState(idsVis[i], getState(idsActor[i]).val, common);
            }
            
            on({id: idsVis, change: 'ne', fromNe: js}, function(dp) {
                let i = idsVis.indexOf(dp.id);
                if(i > -1) setState(idsButton[i], true);
            });
             
            on(idsActor, function(dp) {
                let i = idsActor.indexOf(dp.id);
                if(i > -1) setState(idsVis[i], dp.state.val, true);
            });
            
            tugsi 1 Reply Last reply Reply Quote 0
            • tugsi
              tugsi @paul53 last edited by

              @paul53 sagte in JS für Switch + State anpassen:

                                                                                                                                          // IDs anpassen                                                                                                                                                                            const idsButton = ['s7.0.DBs.DB1.NI02','usw.'];                                                                                                                                                                            const idsActor  = ['s7.0.DBs.DB1.Q02','usw.'];                                                                                                                                                                                                                                                                                                                                                         const js = 'system.adapter.javascript.' + instance;                                                                                                                                                                                                                                                                                                                                                         var idsVis = [];                                                                                                                                                                            for(let i = 0; i < idsButton.length; i++) {                                                                                                                                                                                let common = getObject(idsButton[i]).common;                                                                                                                                                                                idsVis[i] = 'javascript.' + instance + '.LOGO.s7-0.' + common.name.replace(/\s/g, '_');                                                                                                                                                                                common.read = true;                                                                                                                                                                                createState(idsVis[i], getState(idsActor[i]).val, common);                                                                                                                                                                            }                                                                                                                                                                                                                                                                                                                                                         on({id: idsVis, change: 'ne', fromNe: js}, function(dp) {                                                                                                                                                                                let i = idsVis.indexOf(dp.id);                                                                                                                                                                                if(i > -1) setState(idsButton[i], true);                                                                                                                                                                            });                                                                                                                                                                                                                                                                                                                                                         on(idsActor, function(dp) {                                                                                                                                                                                let i = idsActor.indexOf(dp.id);                                                                                                                                                                                if(i > -1) setState(idsVis[i], dp.state.val, true);                                                                                                                                                                            });                                            
              

              Kam erst heute dazu es zu testen, hab es mit drei Tastern/Aktoren ausprobiert, klappt 1a !
              Danke dafür!

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

              Support us

              ioBroker
              Community Adapters
              Donate

              398
              Online

              31.8k
              Users

              80.0k
              Topics

              1.3m
              Posts

              javascript
              2
              5
              472
              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