Seite 1 von 1

Fensterscript (unzuverlässig)

Verfasst: 20. Nov 2024 23:06
von Oekel
Ich habe folgendes "Sammelscript", welches von ca. 15 Kontakten getriggert wird:
Bildschirmfoto 2024-11-20 um 22.59.20.png

Code: Alles auswählen

var realItem, delayedItem, realState, delayedState;


realItem = items.getItem(event.itemName);
delayedItem = items.getItem((String(event.itemName) + '_delayed'));
if (cache.private.exists(delayedItem.name) === false || cache.private.get(delayedItem.name).hasTerminated()) {
  cache.private.put(delayedItem.name, actions.ScriptExecution.createTimer(delayedItem.name, time.ZonedDateTime.now().plusMinutes(3), function (timer_context) {
    realState = realItem.state;
    delayedState = delayedItem.state;
    if (realState != delayedState) {
      delayedItem.postUpdate(realState);
    }
    }, undefined));
} else {
  cache.private.get(delayedItem.name).reschedule(time.ZonedDateTime.now().plusMinutes(3));
};
Leider habe ich entweder einen Denkfehler, oder das System verschluckt regelmäßig Trigger.
Jedenfalls bleibt das "xxx_delayed" ab und zu unberührt und nimmt nicht den Zustand des Kontaktes entgegen.

Wofür das ganze?
Ich regel damit Heizkörper (AN/AUS), die ich nicht direkt an die Kontakte hängen kann, da diese (bedingt durch Wind) ab und zu flattern.
Wir jeden also von einem überdimensionierten Debouncing.

Sieht Jemand etwas?


PS: Das Script funktioniert (min. mehrfach pro Quelle+Ziel) richtig. Es handelt sich also nicht um irgendeinen Typo bei der Item-Namensvergabe....

Re: Fensterscript (unzuverlässig)

Verfasst: 21. Nov 2024 02:45
von udo1toni
Kannst Du bitte den yaml Code einfügen? Der ist einfach leichter zu lesen.

Re: Fensterscript (unzuverlässig)

Verfasst: 21. Nov 2024 05:43
von Harka
Moin,
in den 3 Minuten kann ein anderes Item deine Variablen kapern. Wenn du den Triggername erst mal nur zur Benennung des Timers nutzt und als context mit übergibst, kannst du darauf innerhalb der Timerfunktion mit dem timer_context Block in privater Umgebung zugreifen.

Re: Fensterscript (unzuverlässig)

Verfasst: 22. Nov 2024 15:09
von Oekel
Harka hat geschrieben: 21. Nov 2024 05:43 Moin,
in den 3 Minuten kann ein anderes Item deine Variablen kapern. Wenn du den Triggername erst mal nur zur Benennung des Timers nutzt und als context mit übergibst, kannst du darauf innerhalb der Timerfunktion mit dem timer_context Block in privater Umgebung zugreifen.
Sollte es hierraus hinaus laufen? (noch nicht getestet):
Bildschirmfoto 2024-11-22 um 15.08.16.png

Code: Alles auswählen

var realItem, delayedItem, cx_realItem, cx_delayedItem, realState, delayedState;


realItem = items.getItem(event.itemName);
delayedItem = items.getItem((String(event.itemName) + '_delayed'));
if (cache.private.exists(delayedItem.name) === false || cache.private.get(delayedItem.name).hasTerminated()) {
  cache.private.put(delayedItem.name, actions.ScriptExecution.createTimer(delayedItem.name, time.ZonedDateTime.now().plusMinutes(3), function (timer_context) {
    cx_realItem = (timer_context)['real'];
    cx_delayedItem = (timer_context)['delayed'];
    realState = cx_realItem.state;
    delayedState = cx_delayedItem.state;
    if (realState != delayedState) {
      delayedItem.postUpdate(realState);
    }
    }, {'real': realItem, 'delayed': delayedItem}));
} else {
  cache.private.get(delayedItem.name).reschedule(time.ZonedDateTime.now().plusMinutes(3));
};

Re: Fensterscript (unzuverlässig)

Verfasst: 22. Nov 2024 15:51
von Harka
Moin,
Jain. Geht noch einfacher.
ForumTrigger2411.png