Variable aus einer per Call aufgerufenen Function übergeben

  • Moinssen,

    ich versuche grad mit Shellys Scripting klar zu kommen.

    Würdet ihr mir helfen - was ist an folgendem Code falsch, warum bekomme ich nichts zurück?

    Edit: Die Toolbox ist implementiert. Und wenn ich innerhalb der Function einfach mit Print() arbeite, bekomme ich auch eine korrekte Antwort. Es fehlt lediglich eine vernünftige Übergabe an eine Variable.

    Oder kann ich das Ganze eleganter lösen??


    Code
    	function istLampeOn(IP) {
    			var ret=false;
    			Call("http.get",{url: "http://192.168.1." + IP + "/light/0", timeout: 3}, // Status der Lampe abfragen
    				function (x) { if (JSON.parse(x.body).ison) ret=true; });	
    			return ret;				
    		}
    
    
    
    print('Status: ' + istLampeOn(186));

    Einmal editiert, zuletzt von Hanutaminator (22. Dezember 2024 um 19:36)

  • Hanutaminator 22. Dezember 2024 um 19:32

    Hat den Titel des Themas von „Variable aus einer vpn Call aufgerufenen Function übergeben“ zu „Variable aus einer per Call aufgerufenen Function übergeben“ geändert.
  • Kann es leider nicht Testen...
    Habe ein Callback eingefügt weil der Code Asynchron abläuft.

  • Moins Viedotraum,

    zuerst danke für dein Script, es funktioniert ohne Probs - Aber :-(

    Es löst nicht mein Problem. Ich möchte die Function "istLampeOn" direkt mit einem Rückgabewert nutzen. Und dies für mehrere andere Functions.

    Also nach diesem Prinzip:

    Code
    if (istLampeOn(IP) || andereBedingung) dann... 

    Du hast da die Variable "state", die ähnlich wie bei mir in einer Unterfunction genutzt wird. Ich habe schon ein "return state" am Ende der Function "istLampeOn" versucht, aber das kommt nicht an.

  • Wie Gesagt dein wie mein Code läuft Asynchron.

    Code
    Zeitlicher Ablauf deines Codes vereinfacht:
    
    1. var ret=false;
    2. Call Function istLampeOn(IP){..}; // Http.Get Aufruf Benötigt Zeit um Daten zu lesen.. -> Übergabe in funktion(x)
       Äußere Funktions Aufruf beendet -> Rückgabe: return ret	= false weil  
         function (x) { if (JSON.parse(x.body).ison) ret=true; }); noch nicht beendet ist.
    3. Print immer false 
    4. Ende
    
    5. Erst jetzt würde (JSON.parse(x.body).ison) ret=true; }) gelesen werden

    Deswegen der Callback fuction Aufruf, der auf die Fertigstellung der Anfrage wartet und dann das Ergebnis liefert.
    In anderen Programmiersprachen wie z.B. Swift wird das als CompletionHandler bezeichnet.

    Man könnte auch ein Timer einsetzen und 1 Sekunde warten.. Aber das ist kein guter Programmierstiel.

  • Ah, ok, jetzt sehe ich das Problem. Und es gibt keine Möglichkeit, das Script einfach nur auf die Antwort warten zu lassen?
    Gehe ich vielleicht zu umständlich ran? Ich möchte eigentlich nur folgendes realisieren:

    2fach Switch.
    Taste 1 drücken:
    if (RGBW an und farbig) dann RGBW an und weiß
    if (RGBW aus) dann RGBW an und weiß
    if (RGBW an) dann RGBW aus

    Taste 2 drücken:
    if (RGBW an und weiß) dann RGBW an und farbig
    if (RGBW an) dann RGBW aus
    if (RGBW aus) dann RGBW an und farbig

  • Dieses Thema enthält 11 weitere Beiträge, die nur für registrierte Benutzer sichtbar sind.