Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Script mit Astro und Variablen Lampe einschalten

    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

    Script mit Astro und Variablen Lampe einschalten

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

      Hi,

      versuche mich mal wieder etwas an Javascript.

      Mein Ziel: Die Stehlampe im Wohnzimmer soll sich einschalten wenn "Astro=Sunset" + Variable "Stehlampe Automatik" + Harmony Variable "Fernsehen" oder "FireTV"

      Die Variable "Stehlampe Automatik" habe ich mit drin, da ich die Lampe auch unabhängig mit einem Taster schalten möchte und wenn dies über den Taster geschehen ist, soll sie auch an bleiben und nicht, wenn ich den Fernseher ausschalte aus gehen. Die Variable triggere ich über ein HM Programm (vorerst).

      Ist das Script so korrekt? Bzw. wird die Astrofunktion ständig abgefragt oder nur einmal zum Sonnenuntergang, da ja nach dem Sonnenuntergang die Lampe eingeschaltet werden soll, sobald ich den Fernseher oder FireTV an habe oder eben umgekehrt, wenn der Fernseher/FireTV schon an ist, soll sie bei Sonnenuntergang sich einschalten.

      schedule({astro:"sunset"}, function () {
      on("hm-rega.0.11040" && ("harmony.0.CoyoteHarmonyHub.activities.Fernsehen" || "harmony.0.CoyoteHarmonyHub.activities.FireTV"), function (obj) {          // Variable Stehlampe Automatik & Variable TV eingeschaltet // alternativ auch "hm-rega.0.5198"
          if (obj.newState.val === true || obj.newState.val === "true" || obj.newState.val === 2){
              setState("hm-rpc.0.LEQ0870824.1.STATE", true);              //Stehlampe einschalten
              log("Stehlampe einschalten wenn TV und Automatik wahr!");
          }
         else {
             setState("hm-rpc.0.LEQ0870824.1.STATE", false);              //Stehlampe ausschalten   
             log("Stehlampe ausschalten wenn TV oder Automatik aus!");
          }
      });
      });
      
      1 Reply Last reply Reply Quote 0
      • paul53
        paul53 last edited by

        @coyote:

        wird die Astrofunktion ständig abgefragt oder nur einmal zum Sonnenuntergang `
        Nur einmal zum Sonnenuntergang
        @coyote:

        on("hm-rega.0.11040" && ("harmony.0.CoyoteHarmonyHub.activities.Fernsehen" || "harmony.0.CoyoteHarmonyHub.activities.FireTV"),
        ```` `  
        

        Eine Oder- bzw. Und-Verknüpfung von Auslösern ist wohl nicht vorgesehen, denn dann müsste man mehrere Objekte an die Callback-Funktion übergeben können.

        Versuche es mal so:

        var night = false;    // ab Sonnenuntergang bis Sonnenaufgang
        var tasteein = false; // Taste: Auto/Ein
        var fernseh = false;  // Fernseher Aus/Ein
        var fireTV = false;   // fireTV Aus/Ein
        
        function lampe() {
          if (tasteein) {
              log("Licht über Taster ein");
              setState("hm-rpc.0.LEQ0870824.1.STATE", true);         //Stehlampe einschalten
          } else if (night && (fernseh || fireTV)) { 
              log("Licht nachts über TV ein");
              setState("hm-rpc.0.LEQ0870824.1.STATE", true);         //Stehlampe einschalten
          } else { 
              log("Licht aus");
              setState("hm-rpc.0.LEQ0870824.1.STATE", false);        //Stehlampe ausschalten
          }
        }
        
        schedule({astro:"sunset"}, function () {
            night = true;
            lampe();
        });
        schedule({astro:"sunrise"}, function () {
            night = false;
            lampe();
        });
        
        on("hm-rega.0.11040", function(obj) {
            tasteein = obj.newState.val;
            lampe();
        });
        
        on("harmony.0.CoyoteHarmonyHub.activities.Fernsehen", function(obj) {
            fernseh = obj.newState.val;
            lampe();
        });
        
        on("harmony.0.CoyoteHarmonyHub.activities.FireTV", function(obj) {
            fireTV = obj.newState.val;
            lampe();
        });
        
        

        2665_cea017c9-8d76-4936-80aa-a63c6edad4c6.jpeg

        1 Reply Last reply Reply Quote 0
        • Homoran
          Homoran Global Moderator Administrators last edited by

          @paul53:

          Eine Oder- bzw. Und-Verknüpfung von Auslösern ist wohl nicht vorgesehen, denn dann müsste man mehrere Objekte an die Callback-Funktion übergeben können. `
          Heisst das ich muss kein javascript lernen, da ich die CCU-Programme sowieso nicht in ioBroker ausführen lassen kann??

          Ich hatte dieses hier gerade als genau meinen Einstieg in js gesehen, da so in der Art meine Programme aufgebaut sein üssten.

          Gruß

          Rainer

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

            @Homoran:

            Heisst das ich muss kein javascript lernen, da ich die CCU-Programme sowieso nicht in ioBroker ausführen lassen kann?? `
            Wie sollte ioBroker CCU-Programe ausführen ?
            @Homoran:

            Ich hatte dieses hier gerade als genau meinen Einstieg in js gesehen, da so in der Art meine Programme aufgebaut sein üssten. `
            Alle CCU-Programme lassen sich durch JS-Programme in ioBroker ersetzen. Der Aufbau der Programme muss allerdings an ioBroker angepasst werden.

            1 Reply Last reply Reply Quote 0
            • Homoran
              Homoran Global Moderator Administrators last edited by

              @paul53:

              Wie sollte ioBroker CCU-Programe ausführen ? `
              Nicht direkt natürlich, nur inhaltlich 😉

              Da habe ich mich wohl etwas ungenau ausgedrückt.

              Ich möchte irgendwann alle Programme, die jetzt auf der CCU laufen in ioBroker portieren, also nicht einfach kopieren, sondern umschreiben.

              Abgesehen davon, dass ich kein js kann, hatte mich deine Aussage von eben etwas irritiert, dass keine UND oder ODER Verknüpfungen bei Triggern möglich seien.

              Dieses ist jedoch bei vielen meiner CCU Programme ein elementarer Bestandteil.

              @paul53:

              Der Aufbau der Programme muss allerdings an ioBroker angepasst werden. `
              Das weiß ich, und daran hapert es bei mir leider noch.

              Ein solches Programm wäre für mich wieder ein Codeschnipsel mehr, js verstehen zu lernen.

              Gruß

              Rainer

              1 Reply Last reply Reply Quote 0
              • coyote
                coyote Most Active last edited by

                Hmm ok, werde ich heute Abend dann so mal testen.

                Bin da auch noch blutiger Anfänger.

                Hilf mir kurz auf die Sprünge, was ist "lampe()" im unteren Teil? Ist das ein Sprungbefehl nach "function lampe()" im ersten Teil nach den Variablen? Ja oder?

                Damit````
                on("harmony.0.CoyoteHarmonyHub.activities.Fernsehen", function(obj) {
                fernseh = obj.newState.val;
                lampe();

                
                komme ich auch noch nicht so klar, was wird hier an "fernseh" zurückgegebenund wie wird es dann hier
                

                else if (night && (fernseh || fireTV)) {

                verarbeitet?
                
                Der Harmony Adapter kann 0/1/2/3 zurück geben. 0 wäre Activity gestoppt also aus und 2 wäre gestartet, also Fernseher an.
                
                Wäre prima wenn du es mir etwas erklären könntest.
                
                Danke
                
                PS: geht mir genau wie Rainer. Versuche momentan immer mehr meine CCU2 Programme umzuziehen. Aber da ich erst ganz am Anfang bei JS stehen, versuche ich mir immer etwas aus den ganzen Codes zusammen zu bauen. Was mehr oder weniger gut gelingt ;)
                1 Reply Last reply Reply Quote 0
                • paul53
                  paul53 last edited by

                  @Homoran:

                  …hatte mich deine Aussage von eben etwas irritiert, dass keine UND oder ODER Verknüpfungen bei Triggern möglich seien. `
                  Auch bei HM werden Trigger ausschließlich ODER-Verknüpft. Die ODER- bzw. UND-Verknüpfungen in der WebUI prüfen die statischen Bedingungen zur Entscheidung, welcher Zweig ausgeführt werden soll.
                  @Homoran:

                  Ein solches Programm wäre für mich wieder ein Codeschnipsel mehr, js verstehen zu lernen. `
                  Das Script in diesem Beispiel ist dazu geeignet:

                  • Deklaration Script-weiter Variablen zur Wert-Übergabe von den Triggern an die Funktion mit Bedingungsauswertung

                  • Funktion mit Auswertung der Werte in Bedingungen (mit ODER- und UND-Verknüpfung)

                  • 5 Auslöser (schedule, on).

                  1 Reply Last reply Reply Quote 0
                  • Homoran
                    Homoran Global Moderator Administrators last edited by

                    @paul53:

                    Das Script in diesem Beispiel ist dazu geeignet: `

                    Danke

                    Rainer

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

                      @coyote:

                      was ist "lampe()" im unteren Teil? Ist das ein Sprungbefehl nach "function lampe()" im ersten Teil nach den Variablen? Ja oder? `
                      lampe() im unteren Teil ist ein Funktionsaufruf der Funktion (Unterprogramm) lampe(){…}, die im ersten Teil nach den Variablen deklariert ist.
                      @coyote:

                      Der Harmony Adapter kann 0/1/2/3 zurück geben. 0 wäre Activity gestoppt also aus und 2 wäre gestartet, also Fernseher an. `
                      JS nimmt eine implizite Typwandlung vor: 0 = false, 1/2/3 = true. Wenn das Einschalten nur bei Zustand 2 erfolgen soll, musst Du den Teil ändern:

                      on("harmony.0.CoyoteHarmonyHub.activities.Fernsehen", function(obj) {
                          if(obj.newState.val == 2) {
                            fernseh = true;
                          } else {
                            fernseh = false;
                          }
                          lampe();
                      });
                      

                      Ebenso für "fireTV".
                      2665_ical2.png

                      1 Reply Last reply Reply Quote 0
                      • Homoran
                        Homoran Global Moderator Administrators last edited by

                        @paul53:

                        coyote hat geschrieben:

                        Der Harmony Adapter kann 0/1/2/3 zurück geben. 0 wäre Activity gestoppt also aus und 2 wäre gestartet, also Fernseher an.

                        JS nimmt eine implizite Typwandlung vor: 0 = false, 1/2/3 = true. Wenn das Einschalten nur bei Zustand 2 erfolgen soll, musst Du den Teil ändern: `

                        Ich kenne bisher nur die Zustände 0-2, 3 ist mir nicht bekannt (heisst aber nichts)

                        0 = aus

                        1 = gestartet (oder soll starten)

                        2 = läuft (Start bestätigt)

                        Gruß

                        Rainer

                        1 Reply Last reply Reply Quote 0
                        • coyote
                          coyote Most Active last edited by

                          Ok, alles klar soweit verstanden. Das mit der Typwandlung wusste ich nicht. Danke dir, ich werde mal testen.

                          Hier Rainer aus dem Github:

                          During the activity's exit sequence the status changes from 3 (stopping) to 0 (stopped)

                          1 Reply Last reply Reply Quote 0
                          • coyote
                            coyote Most Active last edited by

                            So, scheint soweit zu funktioieren. Danke dir für das Script und deine Erklärung.

                            Eine Frage noch, wie kann ich den Ausschaltzeitpunkt 1min verschieben?

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

                              @coyote:

                              wie kann ich den Ausschaltzeitpunkt 1min verschieben? `
                              Versuche es mal so:

                              setTimeout(function() {setState("hm-rpc.0.LEQ0870824.1.STATE", false)}, 60 * 1000);  //Lampe ausschalten
                              
                              1 Reply Last reply Reply Quote 0
                              • coyote
                                coyote Most Active last edited by

                                Sehr gut, das sollte funktionieren, kann ich heute Abend erst testen.

                                Gehen wir mal noch einen Schritt weiter, vllt denke ich zu kompliziert und das Ganze kann vereinfacht werden und vllt kann ich dann das Programm auf der CCU2 entfernen.

                                Ich würde ja gerne die Lampe, immer über den Wandsender ein/ausschalten können und zusätzlich im Zeitraum ab Sonnenuntergang + Fernseher/FireTV an, soll sie sich von selbst einschalten, aber ich möchte sie trotzdem über den Wandsender auch ausschalten können.

                                Momentan mach ich das über die Variable "hm-rega.0.11040" die auf true/false gesetzt wird, wenn ich den Wandsender betätige. Das ist meine AutomatikVariable, diese wird um 18:30Uhr immer auf "true" gesetzt damit die Bedingung passt für das Automatische Einschalten.

                                Das geht doch bestimmt auch anders oder? Hoffe ihr versteht was ich meine 😉

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

                                  @coyote:

                                  Ich würde ja gerne die Lampe, immer über den Wandsender ein/ausschalten können und zusätzlich im Zeitraum ab Sonnenuntergang + Fernseher/FireTV an, soll sie sich von selbst einschalten, aber ich möchte sie trotzdem über den Wandsender auch ausschalten können. `
                                  Also mit einer Taste toggeln ? Das sollte so gehen:

                                  on("ID der Taste", function() {
                                      var licht = getState("hm-rpc.0.LEQ0870824.1.STATE").val;
                                      if (licht) setState("hm-rpc.0.LEQ0870824.1.STATE", false);
                                      else setState("hm-rpc.0.LEQ0870824.1.STATE", true);
                                  });
                                  

                                  Die Variable "tasteein" und der zugehörige Programmblock entfallen dann. Die Funktion lampe() vereinfacht sich:

                                  function lampe() {
                                    if (night && (fernseh || fireTV)) {
                                        log("Licht nachts über TV ein");
                                        setState("hm-rpc.0.LEQ0870824.1.STATE", true);         //Stehlampe einschalten
                                    } else {
                                        log("Licht aus");
                                        setState("hm-rpc.0.LEQ0870824.1.STATE", false);        //Stehlampe ausschalten
                                    }
                                  }
                                  
                                  
                                  1 Reply Last reply Reply Quote 0
                                  • coyote
                                    coyote Most Active last edited by

                                    Also ich hab das jetzt mal so umgeschrieben

                                    var night = false;    // ab Sonnenuntergang bis Sonnenaufgang
                                    var fernseh = false;  // Fernseher Aus/Ein
                                    var fireTV = false;   // fireTV Aus/Ein
                                    
                                    function lampe() {
                                      if (night && (fernseh || fireTV)) {
                                          log("Licht nachts über TV ein");
                                          setState("hm-rpc.0.LEQ0870824.1.STATE", true);         //Stehlampe einschalten
                                      } else {
                                          log("Licht aus");
                                          setTimeout(function() {setState("hm-rpc.0.LEQ0870824.1.STATE", false)}, 60 * 1000);        //Stehlampe ausschalten
                                      }
                                    }
                                    
                                    schedule({astro:"sunset"}, function () {
                                        night = true; 
                                        lampe();
                                    });
                                    schedule({astro:"sunrise"}, function () {
                                        night = false;
                                        lampe();
                                    });
                                    
                                    on("hm-rpc.0.MEQ0024459.2.PRESS_SHORT", function() {
                                        var licht = getState("hm-rpc.0.LEQ0870824.1.STATE").val;
                                        if (licht) setState("hm-rpc.0.LEQ0870824.1.STATE", false);
                                        else setState("hm-rpc.0.LEQ0870824.1.STATE", true);
                                    });
                                    
                                    on("harmony.0.CoyoteHarmonyHub.activities.Fernsehen", function(obj) {
                                        if(obj.newState.val == 2) {
                                          fernseh = true;
                                        } else {
                                          fernseh = false;
                                        }
                                        lampe();
                                    });
                                    
                                    on("harmony.0.CoyoteHarmonyHub.activities.Fire_TV_Stick", function(obj) {
                                      if(obj.newState.val == 2) {
                                          fireTV = true;
                                        } else {
                                          fireTV = false;
                                        }
                                        lampe();
                                    });
                                    

                                    funktioniert nur leider nicht. Die Lampe schaltet sich schon mal nach einer Minute wieder aus. Togglen über den Taster geht auch nicht.

                                    Anschalten wenn, Fernseher/FireTV an ist funktioniert und ausschalten über den Taster, wenn die Lampe an ist geht auch. Irgendwie ist da noch ein Fehler drin

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

                                      @coyote:

                                      funktioniert nur leider nicht. Die Lampe schaltet sich schon mal nach einer Minute wieder aus. Togglen über den Taster geht auch nicht. `
                                      Keine Ahnung, warum :?

                                      Vielleicht funktioniert das Toggeln so:

                                      on({id:"hm-rpc.0.MEQ0024459.2.PRESS_SHORT", valNe: 2}, function() {
                                          var licht = getState("hm-rpc.0.LEQ0870824.1.STATE").val;
                                          if (licht) {
                                              setState("hm-rpc.0.LEQ0870824.1.STATE", false);
                                          } else {
                                              setState("hm-rpc.0.LEQ0870824.1.STATE", true);
                                          }
                                      });
                                      
                                      

                                      EDIT: Habe gerade http://forum.iobroker.org/viewtopic.php?f=21&t=448&p=2990#p3029: Anstellevon valNe: 2 funktioniert auch val:true.

                                      1 Reply Last reply Reply Quote 0
                                      • coyote
                                        coyote Most Active last edited by

                                        Hi,

                                        habe jetzt mal alle Konstelationen getestet, funktioniert soweit, bis auf eine.

                                        Schalte ich die Lampe über den Taster ein (nach Sonnenuntergang), der TV/FireTV ist noch aus und ich schalte jetzt TV/FireTV ein, schaltet sich die Lampe nach einer Minute aus.

                                        Weiß leider nicht warum, vllt hast du ja noch ne Idee @paul53

                                        var night = false;    // ab Sonnenuntergang bis Sonnenaufgang
                                        var fernseh = false;  // Fernseher Aus/Ein
                                        var fireTV = false;   // fireTV Aus/Ein
                                        
                                        function lampe() {
                                          if (night && (fernseh || fireTV)) {
                                           log("Licht nachts über TV ein");
                                              setState("hm-rpc.0.LEQ0870824.1.STATE", true);         //Stehlampe einschalten
                                          } else {
                                              log("Licht aus");
                                              setTimeout(function() {setState("hm-rpc.0.LEQ0870824.1.STATE", false)}, 60 * 1000);        //Stehlampe ausschalten
                                          }
                                        }
                                        
                                        schedule({astro:"sunset"}, function () {
                                            night = true; 
                                            lampe();
                                        });
                                        schedule({astro:"sunrise"}, function () {
                                            night = false;
                                            lampe();
                                        });
                                        
                                        on({id:"hm-rpc.0.MEQ0024459.2.PRESS_SHORT", valNe: 2}, function() {
                                            var licht = getState("hm-rpc.0.LEQ0870824.1.STATE").val;
                                            if (licht) {
                                                setState("hm-rpc.0.LEQ0870824.1.STATE", false);
                                            } else {
                                                setState("hm-rpc.0.LEQ0870824.1.STATE", true);
                                            }
                                        });
                                        
                                        on("harmony.0.CoyoteHarmonyHub.activities.Fernsehen", function(obj) {  
                                        
                                            if(obj.newState.val == 2) {
                                              fernseh = true;
                                            } else {
                                              fernseh = false;
                                            }
                                            lampe();
                                        });
                                        
                                        on("harmony.0.CoyoteHarmonyHub.activities.Fire_TV_Stick", function(obj) {
                                          if(obj.newState.val == 2) {
                                              fireTV = true;
                                            } else {
                                              fireTV = false;
                                            }
                                            lampe();
                                        });
                                        
                                        1 Reply Last reply Reply Quote 0
                                        • paul53
                                          paul53 last edited by

                                          @coyote:

                                          Schalte ich die Lampe über den Taster ein (nach Sonnenuntergang), der TV/FireTV ist noch aus und ich schalte jetzt TV/FireTV ein, schaltet sich die Lampe nach einer Minute aus. `
                                          Das dürfte nicht sein, wenn der Wert von fireTV auf 2 bleibt, solange das Gerät an ist. Kann es sein, dass fireTV nur einen kurzen Impuls mit dem Wert 2 liefert ?

                                          Füge mal zum Testen ein Log ein:

                                          on("harmony.0.CoyoteHarmonyHub.activities.Fire_TV_Stick", function(obj) {
                                            log("fireTV: " + obj.newState.val);
                                            if ...
                                          
                                          
                                          1 Reply Last reply Reply Quote 0
                                          • coyote
                                            coyote Most Active last edited by

                                            Ich werd wahnsinnig :shock:

                                            Habe jetzt nochmal alles probiert und es läuft jetzt…

                                            Aber vllt hast du ne Idee wie man den doppelten Start weg bekommt oder ist es egal, schau mal

                                            536_snip_20150917003343.png

                                            Also bei dem HarmonyAdapter wechselt es von 0 nach 1 dann nach 2, denke deshalb kommt es doppelt oder?

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            992
                                            Online

                                            31.7k
                                            Users

                                            79.9k
                                            Topics

                                            1.3m
                                            Posts

                                            4
                                            22
                                            3850
                                            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