Seite 1 von 1

Timer nur einmal setzen

Verfasst: 27. Dez 2023 09:48
von Baumtasche
Hallo zusammen,

dank der Erklärungen in diesem Forum - insbesondere von Udo , habe ich - denke ich - das Thema verstanden und zwar das Timer nichts mit der Rule zu tun haben.
Dennoch habe ich eine ergänzende Frage, könnt ihr euch bitte mein ECMA - Skript mal ansehen, ob das so passt?

Hintergrund: ich überwache eine Steckdose, diese soll, wenn eine bestimmte Spannung unterschritten wird, sich nach zwei Minuten ausschalten. . Jetzt ist es natürlich so, dass wenn der Timer auf 2 Minuten gesetzt wurde, die rule innerhalb dieser 2 Minuten erneut ausgeführt wird, sofern die Spannung unterhalb der Grenze bleibt. (Rule Trigger ist : Change Power) Jetzt gilt es, aus meiner Sicht, zu verhindern, das erneut Timer gesetzt werden, denn ansonsten habe x Timer am laufen, oder sehe ich das falsch.

Code: Alles auswählen

var scriptExecution = Java.type('org.openhab.core.model.script.actions.ScriptExecution');
var zdt = Java.type('java.time.ZonedDateTime');

if (typeof this.timers === 'undefined') {
  this.timers = [];
}

function StromBuero2() {
  if (itemRegistry.getItem('CIOfficeManuell').getState() == 'OFF') {
    events.sendCommand('StromDGBuro_Switch2', 'OFF');
    this.timer = undefined;
  }  
 } 

if (typeof this.timers['StromBuro2'] === 'undefined' || this.timers['StromBuro2'].hasTerminated()) {
  this.timers['StromBuro2'] = scriptExecution.createTimer(ZonedDateTime.now().plusSeconds(120), StromBuero2);
}

Re: Timer nur einmal setzen

Verfasst: 27. Dez 2023 15:39
von Harka
Moin,

so wie ich das sehe sorgst Du doch mit "if (typeof this.timers['StromBuro2'] === 'undefined''" ... dafür, das der Timer nur gestartet, wird wenn er noch nicht existiert.

PS: Du bist noch mit Nashorn unterwegs. Schau Dir bei Gelegenheit mal das neuere GraalJS (JavaScript Scripting 2022+) an. Falls es von Deiner OH-Version unterstützt wird kannst Du beide JS-Versionen parallel nutzen. Vorteile sind u.a. das eine Hilfe existiert, schönerer Code erzeugt wird und noch gepflegt wird.

Re: Timer nur einmal setzen

Verfasst: 27. Dez 2023 22:34
von udo1toni
Ich nutze ja kein JavaScript, aber die grundsätzliche Vorgehensweise sollte so aussehen:

Messwert geändert -> Rule wird gestartet.
Falls Messwert gut, breche Timer ab, falls dieser Läuft.
Falls Messwert schlecht, prüfe, ob Timer läuft.
- - > Falls Timer nicht läuft, starte Timer.
- - > andernfalls tue nichts.

Sieht als DSL Rule so aus:

Code: Alles auswählen

var Timer tUnterspannung = null

rule "Aktion bei Unterspannung"
when
    Item Spannung changed
then
    val untergrenze = 215.1                                    // Grenzwert
    if(!(newState instanceof Number) return;                   // ohne gültige Messung keine Entscheidung
    if((newState as Number).floatValue > untergrenze) {        // Grenzwert überschritten
        tUnterspannung?.cancel                                 // Timer abbrechen, falls vorhanden (das ist das ?
        tUnterspannung = null                                  // Timervariable leeren
    } else                                                     // Grenzwert nicht erreicht
        if(tUnterspannung === null)                            // Falls kein Timer läuft
            tUnterspannung = createTimer(now.plusMinutes(2),[  // Timer anlegen
                // auszuführender Code 
                tUnterspannung = null                          // Timervariable nach getanter Arbeit leeren
            ])
end

Re: Timer nur einmal setzen

Verfasst: 28. Dez 2023 07:55
von Baumtasche
Vielen Dank für eure Hilfe