Wie am besten in ECMA Intervallfunktion mit Rahmenbedingungen erstellen? Timer?
Verfasst: 13. Aug 2021 01:16
Ich stehe gerade etwas auf dem Schlauch wie ich denn folgendes am elegantesten Umsetze:
Wenn der Taupunktvergleich ergibt, dass Lüften jetzt Sinn macht (Und die relative Luftfeuchtigkeit Innen unter sagen wir mal 60% liegt, darüber bei entsprechenden Werten Dauerlüftung), dann Beginne am Lüfter folgenden Ablauf
Wichtig ist vor allem, dass dieser Vorgang die Rule in soweit entweder einfach blockiert oder neue Events abgefangen werden, dass der Intervall nicht nach jedem positiven Triggereingang wieder von vorne Beginnt. Einmal ausgelöst soll das Stumpf durchlaufen und erst nach Ende der Lüftungszeit UND der Ruhezeit entscheiden.
Zu Timern in JS habe ich folgende Variante gefunden:
Wie verhält sich das? Läuft der timer los, sobald ich die letzte Zeile ausführe?
Wird eine erneute Aktivi3erung durch die Laufzeit verhindert, oder müsste ich irgendwie den Timerstate abfragen?
Müsste ich dann den Timerstate nach Ablauf von Hand auf Null (oder undefined?) stellen, oder wird der nach Ablauf automatisch geleert?
Für meine Funktion bräuchte ich dann ja schon 2 Timer und kann die expire-Variante des Items nicht benutzen.
Wäre hier nicht ein fall, in dem ein klassisches, unelegantes thread.sleep() nicht einfach nur Vorteile bringt, weil ich ja genau die "Nachteile" wie blockieren der Rule haben möchte? Oder würde mir die Laufzeit einfach x Instanzen nebeneinander setzen? Soweit ich das verstanden habe, läuft in OH3 jede Rule in einem eigenen Thread. Ab welcher Anzahl würden blockierende Threads kritisch fürs System? 3? 100? 58764?
Also, spricht etwas gegen folgenden Pseudocode-Ablauf:
Wenn der Taupunktvergleich ergibt, dass Lüften jetzt Sinn macht (Und die relative Luftfeuchtigkeit Innen unter sagen wir mal 60% liegt, darüber bei entsprechenden Werten Dauerlüftung), dann Beginne am Lüfter folgenden Ablauf
Code: Alles auswählen
1:
- 30 min Lüfter an
- 30 min Lüfter aus
- Überprüfe, ob die Rahmenbedingungen noch fürs Lüften sprechen
ja? -gehe zu 1
nein? Ende
Zu Timern in JS habe ich folgende Variante gefunden:
Code: Alles auswählen
var ScriptExecution = Java.type("org.openhab.core.model.script.actions.ScriptExecution");
var runme = function(){ logger.info("Timer expired!"); }
var ZonedDateTime = Java.type("java.time.ZonedDateTime");
var now = ZonedDateTime.now();
var timer = SE.createTimer(now.plusSeconds(1), runme);
Wird eine erneute Aktivi3erung durch die Laufzeit verhindert, oder müsste ich irgendwie den Timerstate abfragen?
Müsste ich dann den Timerstate nach Ablauf von Hand auf Null (oder undefined?) stellen, oder wird der nach Ablauf automatisch geleert?
Für meine Funktion bräuchte ich dann ja schon 2 Timer und kann die expire-Variante des Items nicht benutzen.
Wäre hier nicht ein fall, in dem ein klassisches, unelegantes thread.sleep() nicht einfach nur Vorteile bringt, weil ich ja genau die "Nachteile" wie blockieren der Rule haben möchte? Oder würde mir die Laufzeit einfach x Instanzen nebeneinander setzen? Soweit ich das verstanden habe, läuft in OH3 jede Rule in einem eigenen Thread. Ab welcher Anzahl würden blockierende Threads kritisch fürs System? 3? 100? 58764?
Also, spricht etwas gegen folgenden Pseudocode-Ablauf:
Code: Alles auswählen
if (hum_rel < 60%){
while (Alle Randbedingungen(über Items) = True)
fan_on;
thread.sleep(30min)
fan_off;
thread.sleep(30min)
end while
}else{
fan_on
}