NEWS

[GELÖST]Variablen außerhalb einer Funktion?


  • Anfängerfrage:#

    Sollte es nicht möglich sein Variablen außerhalb von function zu deklarieren, und diese dann in einer function zu benutzen?

    das geht nicht, es funktioniert nur so…

    createState('zustände.fenstererd', 0);
    
    var timere = null;
    
    //Function zur Abfrage der Zustände
    function zustanderd()
    {
        var b = getState("hm-rpc.0.MEQ0751783.1.STATE").val;//Stube rechts
        var c = getState("hm-rpc.0.MEQ0751896.1.STATE").val;//Stube mitte
        var d = getState("hm-rpc.0.MEQ0752856.1.STATE").val;//Stube links
    
        if(b || c || d)
        {
             if (!timere) {
             timere = setTimeout(function () {
                timere = null;
                setState('zustände.fenstererd', 1);
            toLog("Fenster Erdgeschoss geöffnet!", true);
            }, 1000);//eine Sekunde Verzögerung 
          }  
        }
        else
        {
            if (timere) {
             clearTimeout(timere);
             timere = null;
             }
            setState('zustände.fenstererd', 0);
            toLog("Fenster Erdgeschoss geschlossen!", true);
        }
    }
    
    // Bei Änderrung der Zustände aufruf der Functionen
    //*******************ERDGESCHOSS**************************
    on({id: "hm-rpc.0.MEQ0751783.1.STATE"}, function()
    {
        zustanderd();
    });
    on({id: "hm-rpc.0.MEQ0751896.1.STATE"}, function()
    {
        zustanderd();
    });
    on({id: "hm-rpc.0.MEQ0752856.1.STATE"}, function()
    {
        zustanderd();
    });
    

    wobei die "timere" Variable funktioniert.


  • So funktioniert es auch und ist die bessere Lösung (geringere CPU-Belastung):

    var timere = null;
    var b;
    var c;
    var d;
    
    //Function zur Abfrage der Zustände
    function zustanderd()
    {
        if(b || c || d)
        {
             if (!timere) {
             timere = setTimeout(function () {
                timere = null;
                setState('zustände.fenstererd', 1);
            toLog("Fenster Erdgeschoss geöffnet!", true);
            }, 1000);//eine Sekunde Verzögerung
          } 
        }
        else
        {
            if (timere) {
             clearTimeout(timere);
             timere = null;
             }
            setState('zustände.fenstererd', 0);
            toLog("Fenster Erdgeschoss geschlossen!", true);
        }
    }
    
    // Bei Änderrung der Zustände aufruf der Functionen
    //*******************ERDGESCHOSS**************************
    on({id: "hm-rpc.0.MEQ0751783.1.STATE"}, function(dp)
    {
       b = dp.newState.val;
        zustanderd();
    });
    on({id: "hm-rpc.0.MEQ0751896.1.STATE"}, function(dp)
    {
       c = dp.newState.val;
        zustanderd();
    });
    on({id: "hm-rpc.0.MEQ0752856.1.STATE"}, function(dp)
    {
       d = dp.newState.val;
        zustanderd();
    });
    
    

  • Perfekt!

    Viel weniger Schreibaufwand!

    Aber eine Erklärung steht noch aus, warum man nicht getState() außerhalb einer Funktion an einer Variable übergeben kann und diese dann in der Funktion benutzen? :oops:


  • @blauholsten:

    …warum man nicht getState() außerhalb einer Funktion an einer Variable übergeben kann und diese dann in der Funktion benutzen? `
    Die Programmteile außerhalb der Funktion werden nur einmal bei Scriptstart ausgeführt. Die per getState() außerhalb der Funktion eingelesenen Werte würden sich also nie wieder ändern (außer bei erneutem Scriptstart).

    Will man sich ändernde Werte einlesen, muss man das innerhalb der durch on(id, function) aufgerufenen Funktion(en) machen.


  • Okay…..jetzt hab ich es verstanden. Danke :!:


  • Möchte man sofort nach Scriptstart ein gültges Ergebnis, dann deklariert man die Variablen nicht nur außerhalb der Funktion, sondern initialisiert sie auch und führt die Funktion bei Scriptstart aus:

    // Deklaration und Initialsierung von Variablen
    var timere = null;
    var b = getState("hm-rpc.0.MEQ0751783.1.STATE").val;//Stube rechts
    var c = getState("hm-rpc.0.MEQ0751896.1.STATE").val;//Stube mitte
    var d = getState("hm-rpc.0.MEQ0752856.1.STATE").val;//Stube links
    
    //Function zur Abfrage der Zustände
    function zustanderd()
    {
        if(b || c || d)
        {
             if (!timere) {
             timere = setTimeout(function () {
                timere = null;
                setState('zustände.fenstererd', 1);
            toLog("Fenster Erdgeschoss geöffnet!", true);
            }, 1000);//eine Sekunde Verzögerung
          }
        }
        else
        {
            if (timere) {
             clearTimeout(timere);
             timere = null;
             }
            setState('zustände.fenstererd', 0);
            toLog("Fenster Erdgeschoss geschlossen!", true);
        }
    }
    
    // Bei Änderrung der Zustände aufruf der Functionen
    //*******************ERDGESCHOSS**************************
    on({id: "hm-rpc.0.MEQ0751783.1.STATE"}, function(dp)
    {
       b = dp.newState.val;
        zustanderd();
    });
    on({id: "hm-rpc.0.MEQ0751896.1.STATE"}, function(dp)
    {
       c = dp.newState.val;
        zustanderd();
    });
    on({id: "hm-rpc.0.MEQ0752856.1.STATE"}, function(dp)
    {
       d = dp.newState.val;
        zustanderd();
    });
    
    // Scriptstart mit Initialwerten
    zustanderd();
    
    

  • Hi,

    das unterstreicht das, was du vorher erklärt hast. Danke

Suggested Topics

2.1k
Online

36.9k
Users

42.7k
Topics

591.6k
Posts