Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Frage zum Timing von setState

NEWS

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    10
    1
    198

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.5k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.4k

Frage zum Timing von setState

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
11 Beiträge 3 Kommentatoren 1.7k Aufrufe 1 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • Christof.KacC Offline
    Christof.KacC Offline
    Christof.Kac
    schrieb am zuletzt editiert von
    #1

    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

    ioBroker admin 6 mit cloud in einer VM mit CCU2, Rademacher Homepilot, FS20, Homematic, Google Home

    1 Antwort Letzte Antwort
    0
    • paul53P Offline
      paul53P Offline
      paul53
      schrieb am zuletzt editiert von
      #2

      @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.

      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

      hanssH 1 Antwort Letzte Antwort
      0
      • Christof.KacC Offline
        Christof.KacC Offline
        Christof.Kac
        schrieb am zuletzt editiert von
        #3

        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

        ioBroker admin 6 mit cloud in einer VM mit CCU2, Rademacher Homepilot, FS20, Homematic, Google Home

        1 Antwort Letzte Antwort
        0
        • paul53P Offline
          paul53P Offline
          paul53
          schrieb am zuletzt editiert von
          #4

          @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.

          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

          1 Antwort Letzte Antwort
          0
          • Christof.KacC Offline
            Christof.KacC Offline
            Christof.Kac
            schrieb am zuletzt editiert von
            #5

            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

            ioBroker admin 6 mit cloud in einer VM mit CCU2, Rademacher Homepilot, FS20, Homematic, Google Home

            1 Antwort Letzte Antwort
            0
            • paul53P Offline
              paul53P Offline
              paul53
              schrieb am zuletzt editiert von
              #6

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

              Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
              Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

              1 Antwort Letzte Antwort
              0
              • Christof.KacC Offline
                Christof.KacC Offline
                Christof.Kac
                schrieb am zuletzt editiert von
                #7

                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();

                ioBroker admin 6 mit cloud in einer VM mit CCU2, Rademacher Homepilot, FS20, Homematic, Google Home

                1 Antwort Letzte Antwort
                0
                • paul53P Offline
                  paul53P Offline
                  paul53
                  schrieb am zuletzt editiert von paul53
                  #8

                  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'
                  });
                  

                  Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                  Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                  1 Antwort Letzte Antwort
                  0
                  • Christof.KacC Offline
                    Christof.KacC Offline
                    Christof.Kac
                    schrieb am zuletzt editiert von
                    #9

                    Danke….das ist natürlich einfacher.

                    Dann baue ich mein Skript etwas um.

                    Danke!

                    Christof

                    ioBroker admin 6 mit cloud in einer VM mit CCU2, Rademacher Homepilot, FS20, Homematic, Google Home

                    1 Antwort Letzte Antwort
                    0
                    • paul53P paul53

                      @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.

                      hanssH Offline
                      hanssH Offline
                      hanss
                      schrieb am zuletzt editiert von
                      #10

                      @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);
                      
                      paul53P 1 Antwort Letzte Antwort
                      0
                      • hanssH hanss

                        @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);
                        
                        paul53P Offline
                        paul53P Offline
                        paul53
                        schrieb am zuletzt editiert von paul53
                        #11

                        @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).

                        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                        1 Antwort Letzte Antwort
                        0
                        Antworten
                        • In einem neuen Thema antworten
                        Anmelden zum Antworten
                        • Älteste zuerst
                        • Neuste zuerst
                        • Meiste Stimmen


                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        805

                        Online

                        32.5k

                        Benutzer

                        81.7k

                        Themen

                        1.3m

                        Beiträge
                        Community
                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                        ioBroker Community 2014-2025
                        logo
                        • Anmelden

                        • Du hast noch kein Konto? Registrieren

                        • Anmelden oder registrieren, um zu suchen
                        • Erster Beitrag
                          Letzter Beitrag
                        0
                        • Home
                        • Aktuell
                        • Tags
                        • Ungelesen 0
                        • Kategorien
                        • Unreplied
                        • Beliebt
                        • GitHub
                        • Docu
                        • Hilfe