Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. JS für Switch + State anpassen

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.0k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    925

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

JS für Switch + State anpassen

Scheduled Pinned Locked Moved JavaScript
javascript
5 Posts 2 Posters 544 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • tugsiT Offline
    tugsiT Offline
    tugsi
    wrote on last edited by tugsi
    #1

    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

    Master ioBroker in Proxmox als LXC auf 1. Tiny-Lenovo, Proxmox-VM als Slave auf 2. Tinyi-Lenovo mit Zigbee und Monitor zur Visualisierung, Hauptautomatisierung über S7 auf Beckhoff CX, dazu noch Shelly, Homematic...

    paul53P 1 Reply Last reply
    0
    • tugsiT 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

      paul53P Offline
      paul53P Offline
      paul53
      wrote on last edited by
      #2

      @tugsi sagte:

      Also immer eine fortlaufende Nummer angehangen an der Variable.

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

      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

      tugsiT 1 Reply Last reply
      0
      • paul53P paul53

        @tugsi sagte:

        Also immer eine fortlaufende Nummer angehangen an der Variable.

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

        tugsiT Offline
        tugsiT Offline
        tugsi
        wrote on last edited by
        #3

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

        Master ioBroker in Proxmox als LXC auf 1. Tiny-Lenovo, Proxmox-VM als Slave auf 2. Tinyi-Lenovo mit Zigbee und Monitor zur Visualisierung, Hauptautomatisierung über S7 auf Beckhoff CX, dazu noch Shelly, Homematic...

        paul53P 1 Reply Last reply
        0
        • tugsiT tugsi

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

          paul53P Offline
          paul53P Offline
          paul53
          wrote on last edited by paul53
          #4

          @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);
          });
          

          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

          tugsiT 1 Reply Last reply
          0
          • paul53P 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);
            });
            
            tugsiT Offline
            tugsiT Offline
            tugsi
            wrote on last edited by
            #5

            @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!

            Master ioBroker in Proxmox als LXC auf 1. Tiny-Lenovo, Proxmox-VM als Slave auf 2. Tinyi-Lenovo mit Zigbee und Monitor zur Visualisierung, Hauptautomatisierung über S7 auf Beckhoff CX, dazu noch Shelly, Homematic...

            1 Reply Last reply
            0
            Reply
            • Reply as topic
            Log in to reply
            • Oldest to Newest
            • Newest to Oldest
            • Most Votes


            Support us

            ioBroker
            Community Adapters
            Donate

            494

            Online

            32.6k

            Users

            82.2k

            Topics

            1.3m

            Posts
            Community
            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
            ioBroker Community 2014-2025
            logo
            • Login

            • Don't have an account? Register

            • Login or register to search.
            • First post
              Last post
            0
            • Home
            • Recent
            • Tags
            • Unread 0
            • Categories
            • Unreplied
            • Popular
            • GitHub
            • Docu
            • Hilfe