Rule | Timer | Trotz cancel läuft der Timer weiter. | ECMAScript-2021
Verfasst: 24. Jul 2022 20:40
Ich verzweifel gerade ein wenig ... 
Es sollen die "Member" einer Sprinkler_Gruppe solange laufen, wie die Zeit "in Minuten" angegeben wurde. (Zum TEST habe ich hier nur Sekunden im Script)
Wenn ich nun SP1, SP2, und SP3 aktiviere und SP3 direkt ausschalte, werden auch SP1 und SP2 abgestellt. Das ist auch korrekt so. Davon ab, soll noch ein Interlock rein. Dass nur einer der Gruppen-Member aktiv sein kann. Das hängt mit dem Wasserdruck hier zusammen.
Aber das größte Problem ist, dass die "beiden" Timer von SP1 und SP2 weiterzulaufen scheinen. Denn beide melden im LOG, dass der Timer beendet ist. Nach genau 10sec, welche eingestellt sind.
Meine Frage ist daher, wie kann ich den Timer "sp_timer" so entfernen, dass er für alle Sprinkler weg ist...
Der Übersicht halber, habe ich das Script von der Rule getrennt gepostet.

Es sollen die "Member" einer Sprinkler_Gruppe solange laufen, wie die Zeit "in Minuten" angegeben wurde. (Zum TEST habe ich hier nur Sekunden im Script)
Wenn ich nun SP1, SP2, und SP3 aktiviere und SP3 direkt ausschalte, werden auch SP1 und SP2 abgestellt. Das ist auch korrekt so. Davon ab, soll noch ein Interlock rein. Dass nur einer der Gruppen-Member aktiv sein kann. Das hängt mit dem Wasserdruck hier zusammen.
Aber das größte Problem ist, dass die "beiden" Timer von SP1 und SP2 weiterzulaufen scheinen. Denn beide melden im LOG, dass der Timer beendet ist. Nach genau 10sec, welche eingestellt sind.
Meine Frage ist daher, wie kann ich den Timer "sp_timer" so entfernen, dass er für alle Sprinkler weg ist...
Der Übersicht halber, habe ich das Script von der Rule getrennt gepostet.
Code: Alles auswählen
configuration: {}
triggers:
- id: "1"
configuration:
groupName: Garten_SprinklerValves
type: core.GroupStateChangeTrigger
conditions: []
actions:
- inputs: {}
id: "3"
configuration:
type: application/javascript;version=ECMAScript-2021
script: >
// SCRIPT HIER
type: script.ScriptAction
Code: Alles auswählen
var logger = log("Sprinkler");
var item = items.getItem(event.itemName);
var state = item.state;
var spNext = items.getItem(item.name + "_nextSprinkler").state;
var spDuration = items.getItem(item.name + "_Duration").state;
var spAutomatic = items.getItem("GartenSprinkler_AutomaticNext").state;
if (state == "ON") {
if ( spAutomatic == "ON" && spNext == "0" ) {
logger.info("AUTOMATIC STOP AFTER :: " + item.name);
items.getItem("GartenSprinkler_AutomaticNext").sendCommand("OFF");
}
logger.info("SET TIMER :: " + item.name + " :: " + spDuration + " min");
sp_timer = actions.ScriptExecution.createTimer(time.ZonedDateTime.now().plusSeconds(spDuration), function() {
logger.info("TIMER ENDS :: " + item.name + " :: " + spDuration + " min");
item.sendCommandIfDifferent("OFF");
});
}
if (state == "OFF") {
// stop complete automatic process, because sprinkler was set manually to OFF
if (typeof sp_timer != "undefined" && sp_timer != null) {
sp_timer.cancel();
sp_timer = null;
logger.info("TIMER STOP BY :: " + item.name + " :: ALL_VALVES=OFF // AUTOMATIC=OFF");
items.getItem("Garten_SprinklerValves").sendCommandIfDifferent("OFF"); // GROUP OFF
items.getItem("GartenSprinkler_AutomaticNext").sendCommandIfDifferent("OFF"); // AUTOMATIC OFF
}
if ( spAutomatic == "ON") {
logger.info("AUTOMATIC STILL ACTIVE :: START NEXT SPRINKLER :: " + spNext);
items.getItem("Garten_Sprinkler"+spNext).sendCommandIfDifferent("ON");
}
}