Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Frage zum Timing von setState

    NEWS

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    • Save The Date: ioBroker@Smart Living Forum Solingen, 14.06.

    Frage zum Timing von setState

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

      Hallo,

      ich bin heute über etwas gestolpert, dass ich nicht verstehe.

      Angenommen, der State 'javascript.0.Settings.Weckzeit' steht gerade auf 7:15 und ich führe folgende Codezeilen aus:

      setState('javascript.0.Settings.Weckzeit', "7:19");
      log(getState('javascript.0.Settings.Weckzeit').val);
      

      Ich würde erwarten, dass ich im log "7:19" sehen würde.

      Vielmehr sehe ich aber 7:15.

      Es scheint so, dass setState asynchron den State setzt und dafür etwas Zeit braucht. Damit liest ein folgendes getState den vorherigen Wert aus (der bei Skriptstart auch mal null sein kann).

      Dies hat mich etwas von meiner Nacht gekostet, da der Wecker beim Start des Skriptes um 4.30 Uhr (da setze ich alle Timings für den folgenden Tag) angefangen hatte, minütlich zu klingeln. Hat meiner Reputation bezüglich meiner Frau einen ziemlichen Knick gebracht 😉

      Langer Rede kurzer Sinn, man kann das bestimmt durch verzögertes auslesen der States, z.B. per

      setTimeout(myFunction, 100);
      

      umgehen. Da ich das zeitliche Verhalten aber nicht kenne, würde ich gerne verstehen, was die "richtige" Lösung für dieses Problem ist.

      Danke

      Christof

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

        @Christof.Kac:

        würde ich gerne verstehen, was die "richtige" Lösung für dieses Problem ist. `

        setState('javascript.0.Settings.Weckzeit', "7:19", function() {
           log(getState('javascript.0.Settings.Weckzeit').val);
        });
        

        Nennt sich Callback.

        hanss 1 Reply Last reply Reply Quote 0
        • Christof.Kac
          Christof.Kac last edited by

          Hi,

          da ich nun eine ganze Handvoll States initialisiere und dann in einer Funktion auswerte:

          Kann ich davon ausgehen, dass ich die CallBack Funktion beim letzten setState nutzen soll? Es macht ja keinen Sinn, bei 10 verschiedenen States den gleichen Callback zu definieren und ausführen zu lassen, oder?

          Oder habe ich da einen Denkfehler?

          Danke

          Christof

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

            @Christof.Kac:

            Kann ich davon ausgehen, dass ich die CallBack Funktion beim letzten setState nutzen soll? `
            Nein.
            @Christof.Kac:

            Es macht ja keinen Sinn, bei 10 verschiedenen States den gleichen Callback zu definieren und ausführen zu lassen, oder? `
            Die Callbacks sind in dem Beispiel nicht gleich, denn sie verwenden verschiedene Datenpunkt-IDs.

            1 Reply Last reply Reply Quote 0
            • Christof.Kac
              Christof.Kac last edited by

              Hi,

              dann brauche ich noch einen kleinen Tip.

              Meine Lösung sieht so aus, dass ich in einem Skript alle schedules für den Tag aufsetze (also nicht eins per Datenpunkt).

              Damit habe ich nicht ein Callback pro State.

              Sollte ich mein Skript aufteilen (wobei manchmal zwei States gebraucht werden, um einen schedule aufzusetzen => wird also schwierig) oder gibt es eine pfiffigere Lösung für mein Problem?

              Danke für den Support!

              Christof

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

                Poste bitte das Skript, wie Du es bisher gelöst hast (oder lösen wolltest).

                1 Reply Last reply Reply Quote 0
                • Christof.Kac
                  Christof.Kac last edited by

                  Hi,

                  hier mein Skript. Ich hoffe, daraus wird meine Idee klar.

                  ! ````
                  createState('Settings', {
                  name: 'Feiertag'
                  });
                  createState('Settings.SprachansageWochentag', {
                  name: 'Uhrzeit für die Sprachansage am Wochentag'
                  });
                  createState('Settings.SprachansageWochenende', {
                  name: 'Uhrzeit für die Sprachansage am Wochenende'
                  });
                  createState('Settings.Nachtruhe', {
                  name: 'Uhrzeit für das Abschalten aller Lampen'
                  });
                  createState('Settings.LampenAusMorgens', {
                  name: 'Uhrzeit für das Abschalten aller Lampen am Morgen'
                  });
                  createState('Settings.FruehestensRollosHochWochentag', {
                  name: 'Uhrzeit für die früheste Zeit, wann Rollos Wochentags hochgehen dürfen'
                  });
                  createState('Settings.RollosHochWochenende', {
                  name: 'Uhrzeit für Rollos hoch am Wochenende'
                  });
                  createState('Settings.Weckzeit', {
                  name: 'Uhrzeit für den Wecker'
                  });
                  ! function initStates()
                  {
                  setState('javascript.0.Settings.Nachtruhe', "23:00");
                  setState('javascript.0.Settings.SprachansageWochentag', "7:20");
                  setState('javascript.0.Settings.SprachansageWochenende', "10:45");
                  setState('javascript.0.Settings.LampenAusMorgens', "7:40");
                  setState('javascript.0.Settings.FruehestensRollosHochWochentag', "6:30");
                  setState('javascript.0.Settings.RollosHochWochenende', "9:30");
                  setState('javascript.0.Settings.Weckzeit', "6:10");
                  }
                  ! var Morgenschedule;
                  var Weckerschedule;
                  ! function getScheduleObject(state) {
                  var t = getState(state).val.split(":");
                  var h = parseInt(t[0]);
                  var m = parseInt(t[1]);
                  var SchedStr = m + ' ' + h + ' * * *';
                  return SchedStr;
                  }
                  ! // Jeden Morgen werden die schedules gesetzt
                  on({time: {hour: 4, minute: 30}}, function () {
                  TriggerSchedules();
                  });
                  ! function TriggerSchedules()
                  {
                  clearSchedule(Morgenschedule);
                  clearSchedule(Weckerschedule);
                  // Rollos hoch bei Sonnenaufgang, aber nicht vor 6.30 uhr am Wochentag
                  if (getState("javascript.0.Feiertag.freierTag"/Heute frei (Feiertag oder Wochenende/).val === false)
                  {
                  // *********** Rollosteuerung ******************
                  var today = new Date();
                  var sonnenaufgang = getAstroDate('sunrise', today);
                  today.setHours(6);
                  today.setMinutes(30);
                  var timeHourUp, timeMinuteUp;
                  if (sonnenaufgang > today)
                  {
                  timeHourUp = sonnenaufgang.getHours();
                  timeMinuteUp = sonnenaufgang.getMinutes();
                  }
                  else
                  {
                  var t = getState('javascript.0.Settings.FruehestensRollosHochWochentag').val.split(":");
                  timeHourUp = parseInt(t[0]);
                  timeMinuteUp = parseInt(t[1]);
                  }

                      // *********** Wecker ******************
                      if (getState("ical.0.events.Urlaub"/*Urlaub*/).val === false)
                      {
                  
                          var to = getScheduleObject('javascript.0.Settings.Weckzeit');
                          Weckerschedule = schedule(to, function ()
                          {
                              //setState("tr-064.0.states.ring"/*ring*/, '**611,5');
                              sendTo('telegram', 'Wecker');
                          });
                          log("Wecker: "+ getState('javascript.0.Settings.Weckzeit').val + " Uhr");
                      }
                  }
                  else
                  {
                      // *********** Rollosteuerung ******************
                      t = getState('javascript.0.Settings.RollosHochWochenende').val.split(":");
                      timeHourUp = parseInt(t[0]);
                      timeMinuteUp = parseInt(t[1]);
                  }
                  
                  Morgenschedule = schedule(timeMinuteUp + ' ' + timeHourUp + ' * * *', function () 
                  {
                      RolloSteuerung(0);
                  });
                  log("Rollos auf: "+ timeHourUp+":"+timeMinuteUp + " Uhr");
                  

                  }
                  // Skriptstart
                  initStates();
                  TriggerSchedules();

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

                    Das kann man durchaus so machen. Allerdings erscheint mir der Aufruf von initStates() bei jedem Skriptstart nicht sinnvoll, denn das setzt bei jedem Skriptstart manuell im Datenpunkt geänderte Zeiten (z.B. neue Weckzeit) auf die Zeiten im Skript zurück.

                    Eine Erstinitialisierung der Datenpunktwerte macht man eigentlich mit createState(). Beispiel:

                    createState('Settings.Nachtruhe', '23:00', {
                        name: 'Uhrzeit für das Abschalten aller Lampen',
                        type: 'string'
                    });
                    
                    1 Reply Last reply Reply Quote 0
                    • Christof.Kac
                      Christof.Kac last edited by

                      Danke….das ist natürlich einfacher.

                      Dann baue ich mein Skript etwas um.

                      Danke!

                      Christof

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

                        @paul53
                        Wie kann ich der Callback Funktion einen Wert mitgeben?

                        val test = 5
                        setState('javascript.0.Settings.Weckzeit', "7:19", function(f_test) {
                           log(getState('javascript.0.Settings.Weckzeit').val);
                           log("test: "+f_test)
                        },test);
                        
                        paul53 1 Reply Last reply Reply Quote 0
                        • paul53
                          paul53 @hanss last edited by paul53

                          @hanss sagte:

                          Wie kann ich der Callback Funktion einen Wert mitgeben?

                          Man kann keinen Wert mitgeben, denn was an die Callback-Funktion übergeben wird, bestimmt die aufgerufene Funktion setState(id, val, ack, callback). setState() liefert nichts an die Callback-Funktion zurück (undefined).

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

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          736
                          Online

                          31.6k
                          Users

                          79.4k
                          Topics

                          1.3m
                          Posts

                          3
                          11
                          1593
                          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