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

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Frage zum Timing von setState

    This topic has been deleted. Only users with topic management privileges can see it.
    • 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

                        878
                        Online

                        31.8k
                        Users

                        80.0k
                        Topics

                        1.3m
                        Posts

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