Timer nur einmal setzen

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Antworten
Baumtasche
Beiträge: 82
Registriert: 14. Sep 2020 21:52
Answers: 0

Timer nur einmal setzen

Beitrag 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);
}

Harka
Beiträge: 308
Registriert: 30. Apr 2021 13:13
Answers: 15

Re: Timer nur einmal setzen

Beitrag 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.

Benutzeravatar
udo1toni
Beiträge: 13986
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Timer nur einmal setzen

Beitrag 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
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Baumtasche
Beiträge: 82
Registriert: 14. Sep 2020 21:52
Answers: 0

Re: Timer nur einmal setzen

Beitrag von Baumtasche »

Vielen Dank für eure Hilfe

Antworten