NEWS
Frage zum Timing von setState
-
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.
-
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
-
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. -
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
-
Poste bitte das Skript, wie Du es bisher gelöst hast (oder lösen wolltest).
-
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(); -
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' });
-
Danke….das ist natürlich einfacher.
Dann baue ich mein Skript etwas um.
Danke!
Christof
-
@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);
-
@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).