NEWS


  • 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


  • @tugsi sagte:

    Also immer eine fortlaufende Nummer angehangen an der Variable.

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


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


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

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

Suggested Topics

1.7k
Online

36.9k
Users

42.6k
Topics

590.2k
Posts