Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst]Astro abhängig schedule verändern

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [gelöst]Astro abhängig schedule verändern

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

      @Fitti:

      ich möchte gerne für ein Script Tagsüber ein cron von jede zwei Minuten und Nachts soll das Skript nicht laufen. `
      Versuche es mal so:

      var timer = null;
      
      schedule({astro: "sunrise", shift: 0}, function () {
        timer = schedule("*/2 * * * *", function () {
                // Mein eigentliches Programm
        }
      });
      
      schedule({astro: "sunset", shift: 0}, function () {
        if(timer) clearSchedule(timer);
      });
      
      1 Reply Last reply Reply Quote 0
      • paul53
        paul53 last edited by

        @Fitti:

        Ich benötige aber eine Funktion indem ich abhängig ob

        => "isAstroDay() dann schedule alle 2 Minuten",

        => wenn !isAstroDay() , dann schedule jede 30 Minuten. `
        Das sollte so funktionieren:

        var timer = null;
        
        function myFunction() {
                  // Mein eigentliches Programm
        }
        
        schedule({astro: "sunrise", shift: 0}, function () {
          if(timer) clearSchedule(timer);
          timer = schedule("*/2 * * * *", myFunction);
        });
        
        schedule({astro: "sunset", shift: 0}, function () {
          if(timer) clearSchedule(timer);
          timer = schedule("*/30 * * * *", myFunction);
        });
        
        1 Reply Last reply Reply Quote 0
        • P
          pix last edited by

          Hallo,

          abhängig von der Wichtigkeit des Skriptes würde ich zu Dutchman's Methode tendieren und den Schedule alle zwei Minuten starten und auf isAstroDay prüfen.

          Denn sollte der Zeitpunkt Sunset oder Sunrise verpasst werden, wird die Änderung nicht vorgenommen. Und das kann leicht passieren, wenn ioBroker oder zumindest die JavaScript Instanz gerade aus ist (IoBroker Backup, Fehler in einem anderen Skript und deshalb Neustart-Schleife).

          Gruß

          Pix

          1 Reply Last reply Reply Quote 0
          • Dutchman
            Dutchman Developer Most Active Administrators last edited by

            @pix:

            Hallo,

            abhängig von der Wichtigkeit des Skriptes würde ich zu Dutchman's Methode tendieren und den Schedule alle zwei Minuten starten und auf isAstroDay prüfen.

            Denn sollte der Zeitpunkt Sunset oder Sunrise verpasst werden, wird die Änderung nicht vorgenommen. Und das kann leicht passieren, wenn ioBroker oder zumindest die JavaScript Instanz gerade aus ist (IoBroker Backup, Fehler in einem anderen Skript und deshalb Neustart-Schleife).

            Gruß

            Pix `

            War auch genau de grund warum ich as s gemacht habe, mal zur erklaehrung:

            • Ich benutzte astro um eine variable zu setzten

            • Der 2 minuten interval triggerd immer und ist unabhaenging van astro getriggerd wurde (da gebe ich pix recht die chance ist zu gross dem moment zu verpassen

            Um dan 2 min und 30 min zu unterscheiden wuerde ich 2 mal einen cron machen aber dan de IF anders einfuellen:

            var Daytime;
            
            schedule({astro: "sunrise", shift: 0}, function () {
              Daytime = true;
            });
            schedule({astro: "sunset", shift: 0}, function () {
              Daytime = false;
            });
            //Shedule alle 2 minuten, trigger nur wenn Daytime = True
            schedule("*/2 * * * *", function () {
              if (Daytime == true) {
                      // Mein eigentliches Programm
              }
            
            //Shedule alle 30 minuten, trigger nur wenn Daytime = False
            schedule("*/30 * * * *", function () {
              if (Daytime !== true) {
                      // Mein eigentliches Programm
              }
            });
            
            

            Alternatief ginge auch den trigger auf astro zu legen und mit einer while schleife + time-out zu arbeiten finde ich aber weniger schoene loesung.

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

              @pix:

              Denn sollte der Zeitpunkt Sunset oder Sunrise verpasst werden, wird die Änderung nicht vorgenommen. `
              Das lässt sich durch Auswertung von isAstroDay() bei Skriptstart umgehen:

              var timer = null;
              
              function myFunction() {
                        // Mein eigentliches Programm
              }
              
              schedule({astro: "sunrise", shift: 0}, function () {
                if(timer) clearSchedule(timer);
                timer = schedule("*/2 * * * *", myFunction);
              });
              
              schedule({astro: "sunset", shift: 0}, function () {
                if(timer) clearSchedule(timer);
                timer = schedule("*/30 * * * *", myFunction);
              });
              
              // Script start
              if(isAstroDay()) timer = schedule("*/2 * * * *", myFunction);
              else timer = schedule("*/30 * * * *", myFunction);
              
              

              @Dutchman: Die Variable Daytime wird bei einem Skriptstart gelöscht (undefined), d.h. ein Skriptstart führt zu einem Schedule von 30 Minuten bis zum nächsten Sonnenaufgang.

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

                Man kann das Setzen unterschiedlicher Schedule-Perioden auch in einer Funktion zusammenfassen:

                var timer = null;
                
                function setSchedule() {
                  var t = "*/30 * * * *";
                  if(isAstroDay()) t = "*/2 * * * *";
                  if(timer) clearSchedule(timer);
                  timer = schedule(t, function() {
                          // Mein eigentliches Programm
                  }
                }
                
                schedule({astro: "sunrise", shift: 0}, setSchedule);
                schedule({astro: "sunset", shift: 0}, setSchedule);
                setSchedule();  // Script start
                
                
                1 Reply Last reply Reply Quote 0
                • F
                  Fitti last edited by

                  Wow - so viele Antworten, Möglichkeiten und geballtes Wissen. Vielen Dank!!

                  Ich denke die letzten Vorschläge passen genau auf meine Situation. Sprich pauls letzte + vorletzte zusammen. Ich würde dann noch ein Systemstart isAstroDay dazupacken.

                  Ich habe ja gelesen, das gerade auch node das Triggermanagment sehr gut handelt. Da ich andauernd auf dem Arduino in Grenzen gestoßen bin, mache ich mir hier auch immer viele Sorgen, wieviel ONs so ein System gut verträgt. Frage mich wirklich, wie das genau gehandelt wird.

                  Z. B. Vis kommt ja auch ins schleudern, wenn zu viele Variablen und Bindings vorhanden sind.

                  Aber vermutlich mache ich mir da zu iele Gedanken, oder?

                  Ich nehme also an, dass Systemoptimiert betrachtet alle Lösungen gleich wenig das System belasten, richtig?

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

                    @Fitti:

                    Ich denke die letzten Vorschläge passen genau auf meine Situation. Sprich pauls letzte + vorletzte zusammen. `
                    Entweder den letzten oder den vorletzten Vorschlag. Das Ergebnis ist bei beiden gleich.
                    @Fitti:

                    Ich würde dann noch ein Systemstart isAstroDay dazupacken. `
                    Nach einem Systemstart wird auch ein Skriptstart ausgeführt und somit isAstroday() ausgewertet. Zusätzlich ist nichts erforderlich.

                    1 Reply Last reply Reply Quote 0
                    • F
                      Fitti last edited by

                      Ahh- die letzte Zeile war nicht zu sehen im letzten Beitrag. Für mich sah es so aus, als ob die Funktion erst einmal nicht gestartet wird.

                      So ist aber alles noch einfacher. genial!

                      ABER auch noch einmal Danke an all die Anderen Helfer! Topp!

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

                        Kurze Frage zu dem Script…Auch wenn schon paar Tage her, würde ich diesen Beitrag gerne wieder beleben...

                        Wenn ich nur morgens und abends ein shedule laufen lassen möchte, z.B für ein Rolladen Programm kann man das dann so machen? siehe Script unten...Wenn es Käse ist, lösche ich es wieder, damit kein Müll hier verbleibt...

                        Oder gibt es noch die Möglichkeit anstatt TimeInRange auch ein Zeitfenster anhand von astro zu definieren?

                        Z.B

                        1h vor sunrise - 1h nach sunriseEnd

                        1h vor sunsetStart - 1h nach sunset

                        würde damit gerne meine Rolladensteuerung abspulen...

                        Danke für die Hilfe schonmal...

                        var timer = null;
                        
                        function myFunction() {
                                  // Mein eigentliches Programm
                        }
                        
                        schedule({isTimeInRange('18:30:00', '23:00:00'))}, function () {
                          if(timer) clearSchedule(timer);
                          timer = schedule("*/1 * * * *", myFunction);
                        });
                        
                        schedule({isTimeInRange('06:30:00', '10:00:00'))}, function () {
                          if(timer) clearSchedule(timer);
                          timer = schedule("*/1 * * * *", myFunction);
                        });
                        
                        // Script start
                        if(isTimeInRange('10:00:00', '18:30:00')) timer = null
                        else timer = schedule("*/1 * * * *", myFunction);
                        
                        1 Reply Last reply Reply Quote 0
                        • Dutchman
                          Dutchman Developer Most Active Administrators last edited by

                          eine timerange nicht, astro is ein trigger also zum beisspiel : Sonnenuntergang = 21.15, 21.15 wird im speicher fest gehalten und wen dieser zeitpunkt erreicht wird werden alle scripte mit dem trigger "sonnenuntergang" ausgefuehrt.

                          Man kan jetzt wohl sagen 1ne stunde vor bzw eine stunde nach sonnenuntertang.

                          Man koennte auch ein shedule laufen lassen (alle x minuten) und dan sagen zeit zwischen start sonnenuntergang und sonnenuntergang.

                          Im enddefeckt ist astro eine dynamische weise eine Urzeit zu ermitteln und diese dan spaeter als abfrage oder trigger fuer ein script zu benutzen.

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

                            Hi, ja nach Astro möchte ich auch nicht triggeren, da ich den Zeitpunkt verpassen könnte, zuviele if Bedingungen im Script…Deshalb ja das Zeitfenster... Würde den das angepasste Script von mir oben funktionieren?

                            Aus der antwort bin ich auch nicht ganz schlau geworden. Wäre diese von bis Astro Abfrage nun Möglich als Zeitfenster zu definieren? Damit könnte ich das Zeitfenster verkleinern, da es ja dynamisch wäre... Ansonsten mit Time in Range müsste ich ja ein größeres Zeitfenster abbilden...

                            1 Reply Last reply Reply Quote 0
                            • Dutchman
                              Dutchman Developer Most Active Administrators last edited by

                              ehm, mal lose von der themologie time-range usw. was moechtest du genau erreichten wofuer ein zeitfenster benoetigt wird ?

                              (und ist das zum ueberpruefen, abfragen oder triggeren noetig ?)

                              1 Reply Last reply Reply Quote 0
                              • L
                                Linedancer last edited by

                                Ich verwende seit Monaten das hier.

                                viewtopic.php?f=21&t=4891&hilit=minuten+vor+SU

                                Funktioniert absolut zufriedenstellend und ist universell verwendbar.

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

                                  Ich möchte damit sämtliche ( var ) abfragen durchführen, welche ich als if Bedingung für mein Rollandenscript verwende..Im Idealfall auch damit triggern…

                                  im Moment triggere ich auf Helligkeit.... siehe Script...

                                  Da ich für jeden Rolladen einen eigen Block habe und unzählige Variablen, möchte ich dies nur im Zeitfenster abfragen...

                                  Eventuell auch alle variablen gesammelt abrufen, so dass es nicht in jedem Block erneut erfolgt...

                                  @Linedancer, ich möchte eigentlich vermeiden mit Blockly zu arbeiten. Deshalb auch ein eigenes Rolladen Script.....Danke trotzdem..

                                  on({id: 'hm-rpc.0.PEQXXXXXX.1.BRIGHTNESS', change: "ne"}, function (obj) {
                                    	var Helligkeit = obj.state.val;
                                  //	var Helligkeit = getState ('hm-rpc.0.PEQXXXXX.1.BRIGHTNESS').val;
                                  	var BehanghoeheGaesteWC = getState('hm-rpc.0.OEQ13XXXXX.1.LEVEL').val;
                                  	var AutomatikGesamt = getState('javascript.0.Rolladen.Gesamt.Automatik').val;
                                  	var AutomatikGaesteWC = getState('javascript.0.Rolladen.GaesteWC.Automatik').val;
                                  	var Brand = getState ('javascript.0.Status.Brandmelder.Anzahl_melden_Brand').val;
                                  	var Alarm = getState('javascript.0.alarm.out.alarm_intern').val;
                                  		if (Helligkeit <=40 && BehanghoeheGaesteWC >= 1 && AutomatikGesamt === true && AutomatikGaesteWC === true && Brand === 0 && Alarm === false && isTimeInRange('18:30:00', '23:00:00')) {
                                              setStateDelayed('hm-rpc.0.OEQXXXXXX.1.LEVEL', 0, 1000);
                                              if('hm-rpc.0.OEQ1XXXXX.1.LEVEL', 0);
                                              console.log('Rolladen Gaeste WC geschlossen'); 
                                  	}
                                  });
                                  
                                  1 Reply Last reply Reply Quote 0
                                  • First post
                                    Last post

                                  Support us

                                  ioBroker
                                  Community Adapters
                                  Donate

                                  979
                                  Online

                                  31.7k
                                  Users

                                  79.8k
                                  Topics

                                  1.3m
                                  Posts

                                  6
                                  18
                                  3185
                                  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