NEWS
Funktion bei Trigger und zeitgesteuert ausführen
-
Moin zusammen,
ich stehe vor folgendem Problem, auf das ich leider nichts mit der Suche gefunden habe (evtl. auch das falsche gesucht):
Ich habe immer wieder Berechnungen oder dergleichen, die getriggert ausgeführt werden sollen. Manche Trigger kommen aber sehr unregelmäßig, sodass ich entweder bei Trigger oder nach Zeitplan die gleiche Funktion ausführen möchte (quasi: bei Trigger oder spätestens nach x Minuten).
Ich versuche mir dazu eine Funktion zu schreiben, die Trigger-id, Intervall und auszuführende Funktion (inkl. der Argumente) als Argument haben soll. Leider ohne Erfolg.
Vielleicht kann mir hier jemand weiterhelfen? Vielleicht gibt es auch eine viel einfacherer Lösung?function FunctionSubscrAndPeriodic (funcName, minutesVar, id2Subscribe, changeVar = 'any') { on ({id: id2Subscribe, change: changeVar}, funcName); schedule(`*/${minutesVar} * * * *`, function() { funcName }); } function Addition (a, b) { setState('0_userdata.0.example_state', a + b); } FunctionSubscrAndPeriodic(Addition(1,2), 1, '0_userdata.0.kPreCtrl');``` Wäre über eine Hilfestellung sehr dankbar! Grüße
-
@mortalskillz cronjob ??? warum schwer wenns einfach geht ?
-
Wäre dann aber nur zeigesteuert (ohne subscribe), oder?
Hättest Du vielleicht ein kleines Beispiel, was auch Noobs wie ich verstehen?
-
@mortalskillz sagte: bei Trigger oder spätestens nach x Minuten
Innerhalb der Trigger-Callback-Funktion ein Intervall stoppen und starten. Dann erfolgt der zyklische Funktionsaufruf nur, wenn Trigger ausbleiben. Beispiel:
const idSrc1 = '...'; const idSrc2 = '...'; const idDst = '0_userdata.0.example_state'; function Addition(a) { setState(idDst, a + getState(idSrc2).val, true); } var timer = null; on({id: idSrc1}, function(dp) { Addition(dp.state.val); clearInterval(timer); timer = setInterval(function() { Addition(dp.state.val); }, 60000); });
-
@paul53
Genau. Die Lösung wäre natürlich perfekt. Werde ich definitiv testen (bin zur Zeit im Urlaub).
Meine hätte ja bei jedem Trigger und einmal pro Minute ausgeführt, d.h. wenn ein Trigger kommt, wären zwei Ausführungen pro Minute passiert (eine durch den Trigger, die andere durch den schedule).Da ich das aber ganz oft brauche mit unterschiedlichsten Callback Funktionen, wollte ich eine Funktion schreiben, der ich Trigger-ID, Intervall und Callback-Funktion (inkl. Argumenten) übergebe. Und daran scheitere ich leider.
Irgendwie bekomme ich es nicht hin, einer Funktion eine andere Funktion als Argument zu übergeben...
Aber ich werde das mal mit Deiner Version prüfen!Danke schon einmal bisher!
-
@mortalskillz sagte in Funktion bei Trigger und zeitgesteuert ausführen:
Ich versuche mir dazu eine Funktion zu schreiben, die Trigger-id, Intervall und auszuführende Funktion (inkl. der Argumente) als Argument haben soll.
FunctionSubscrAndPeriodic(Addition(1,2), 1, '0_userdata.0.kPreCtrl');
Du führst so aber die Funktion
Addion
direkt aus und übergibst das Ergebnis als 1. Parameter anFunctionSubscrAndPeriodic
. Somit steht infuncName
wahrscheinlichundefined
(gibt ja nix zurück).Du müsstest schon die Funktion selbst als Parameter übergeben:
FunctionSubscrAndPeriodic(Addition, 1, '0_userdata.0.kPreCtrl');
Und dann innerhalb
FunctionSubscrAndPeriodic
aufrufen mitfuncName(1, 2)
. Wenn Du die Parameter auch mit übergeben willst (verstehe das Beispiel mit den statischen Werten nicht), dann könnte man die Funktion noch einmal in eine anonyme Funktion wrappen.EDIT: so
function FunctionSubscrAndPeriodic(func, minutesVar, id2Subscribe, changeVar = 'any') { on ({id: id2Subscribe, change: changeVar}, func); schedule(`*/${minutesVar} * * * *`, func); } function Addition(a, b) { setState('0_userdata.0.example_state', a + b); } FunctionSubscrAndPeriodic(function() { Addition(1, 2); }, 1, '0_userdata.0.kPreCtrl');
-
Ich würde aber die Reihenfolge der Parameter ändern und die Callback-Funktion nach hinten packen. So ist es ja bei
on
undschedule
z.B. auch. Dann kann man das schöner formatieren. z.B.function FunctionSubscrAndPeriodic(id2Subscribe, minutesVar, callback, changeVar = 'any') { on ({ id: id2Subscribe, change: changeVar }, callback); schedule(`*/${minutesVar} * * * *`, callback); } function Addition(a, b) { setState('0_userdata.0.example_state', a + b); } FunctionSubscrAndPeriodic('0_userdata.0.kPreCtrl', 1, () => { Addition(1, 2); });