Seite 2 von 8

Re: Alarm Rule - Bitte checken ob korrekt?

Verfasst: 21. Feb 2020 13:30
von udo1toni
bastler hat geschrieben: 21. Feb 2020 12:02
udo1toni hat geschrieben:Was passiert aber, wenn man alle 2 Minuten einmal triggert?
udo1toni hat auch hier recht: ich habs gerade probiert, die sirene geht tatsächlich auch dann los wenn man immer 2minuten wartet, schade also aber dann funktioniert das ganze so leider doch nicht!
:) Schade, aber wir werden eine Lösung finden. Ich muss aber etwas drüber nachdenken.

~Geistesblitz~

Versuch bitte mal, ob ein timers.remove(0) (oder timers.remove(1)) funktioniert. Rein von der Logik sollte der älteste Timer immer der erste in der Liste sein, so dass der ablaufende Timer immer nur das erste Element löschen muss. Die Elemente sollten dann automatisch aufrücken. Ich bin mir nur nicht sicher, ob der Index hier 0-basiert ist.

Re: Alarm Rule - Bitte checken ob korrekt?

Verfasst: 21. Feb 2020 14:39
von bastler
ja prima:

Code: Alles auswählen

timers.remove(0)
funktioniert.

aber jetzt bleibt noch das problem dass wenn die sirene ausgelöst hat dann wird ja mit

Code: Alles auswählen

timers.clear()
die liste gelöscht. dann kommt ne fehlermeldung wenn die drei timer im lambda am ende der laufzeit removed werden sollen weil die ja dann gar nicht mehr da sind.

da sollte dann also ins lambda noch so was in der art wie

Code: Alles auswählen

if(timers(0) == NULL)
rein um sicherstellen zu können ob der timer überhaupt existiert. leider weiß ich da nicht wie man abfragen kann ob timers(0) existiert bzw undefined ist

Re: Alarm Rule - Bitte checken ob korrekt?

Verfasst: 21. Feb 2020 14:52
von udo1toni
Genau. Das bekommt man aber auch in Griff. statt timers.clear() schreibst Du ein paar Befehle mehr:

Code: Alles auswählen

while(timers.size > 0) {
    timers(0).cancel
    timers.remove(0)
}
Ich bin mir allerdings nicht sicher, ob das so stimmt. Um sicherzugehen, dass das klappt, könntest Du den Code im Timer mit einem logInfo() Befehl ergänzen. Nun sollte bei jedem abgelaufenen Timer eine Meldung in openhab.log erscheinen.
Anschließend probierst Du aus, ob die Timer-Löschroutine von oben funktioniert. Ist das der Fall, schaust Du nach einer Minute nach, ob dennoch eine log-Meldung erscheint. Wenn nicht, hat alles funktioniert, wenn doch, müssen wir noch mal schauen...

Re: Alarm Rule - Bitte checken ob korrekt?

Verfasst: 21. Feb 2020 15:36
von bastler

Code: Alles auswählen

timers(0).cancel
da meckert er:

Code: Alles auswählen

'cancel' is not a member of 'java.util.List<java.lang.String>'
ich habs jetzt oben ins lambda mit reingenommen, was hälst du davon:

Code: Alles auswählen

if(timers.size < 3) {
    val t = createTimer(now.plusSeconds(5), [|
        if(timers.size > 0)
            timers.remove(0)
    ])
    timers.add(t)
}

Re: Alarm Rule - Bitte checken ob korrekt?

Verfasst: 21. Feb 2020 16:15
von Boris099
Oh das ist keine gute Nachricht, wie hast du das denn getestet?
Habt ihr eine Idee wie ich das denn sonst realisieren kann, unter Berücksichtigung meiner begrenzten Programmierkenntnissen?

Edit:
Oh Sorry sehe gerade das ihr schon viel weiter seid, bin gerade in Spanien (Urlaub) und der refresh hat wohl nicht funktioniert.

Ich bin dann mal ruhig und staune :-)

Re: Alarm Rule - Bitte checken ob korrekt?

Verfasst: 21. Feb 2020 16:19
von udo1toni
Ja, das ist aber nicht schön. Der Timer sollte ja angehalten werden. Ach, vermutlich muss man der Liste die Eigenschaft für das Array mitgeben.

Code: Alles auswählen

var List<Timer> Times = newArrayList
Gesendet von meinem SM-G973F mit Tapatalk



Re: Alarm Rule - Bitte checken ob korrekt?

Verfasst: 21. Feb 2020 16:57
von bastler
leider auch nicht, vsc gibt den hinweis
The method or field cancel is undefined for the type List<Timer>
und die fehlermeldung im log ist die gleiche wie vorher

ich sehe auch dass vsc bei "timer" hier

Code: Alles auswählen

timers(0).cancel
anmerkt:

Code: Alles auswählen

Invalid number of arguments. The field timers is not applicable for the arguments

Re: Alarm Rule - Bitte checken ob korrekt?

Verfasst: 21. Feb 2020 17:13
von udo1toni
probiere mal timers.get(0).cancel

Gesendet von meinem SM-G973F mit Tapatalk


Re: Alarm Rule - Bitte checken ob korrekt?

Verfasst: 21. Feb 2020 17:31
von bastler
ganz große klasse, das wars! ein herzliches dankeschön an udo1toni!!

soweit ich das erkennen kann funktioniert es jetzt perfekt und ohne fehler. hier der endgültige code:

Code: Alles auswählen

import java.util.List
var List<Timer> timers = newArrayList
var Timer shutoffTimer = null
var lastRun = now.minusMinutes(2)

rule "Alarmrule"
    when
        Item iAA_cen_71_1_2_an changed to "PRESSED"
    then
        logInfo("Alarmrule", "alarmrule gestartet")
	Sirene_Gaeste.sendCommand(ON)
        val mailActions = getActions("mail","mail:smtp:xxxxx")
        mailActions.sendMail("xxx@xxx.de","Alarm "+ triggeringItem.name, "bewegungsmelder " + triggeringItem.name.toString + " hat angeschlagen")

        if(shutoffTimer !== null || lastRun.isAfter(now.minusMinutes(2))) return;

        if(timers.size < 3) {
            val t = createTimer(now.plusMinutes(1), [|
                timers.remove(0)
                logInfo("Alarmrule", "timer ende")
            ])
            timers.add(t)
            logInfo("Alarmrule", "neuer timer gestartet: " + timers.toString)
        }

        if(timers.size == 3) {
            logInfo("Alarmrule", "3x aktiviert - alarm " + timers.toString)

            sendMail("xxx@gmail.com", "Sonbas", "Sonbas Motion")
            lastRun = now

            while(timers.size > 0) {
                logInfo("Alarmrule", "timer abbrechen und löschen: " + timers.toString)
                timers.get(0).cancel
                timers.remove(0)
            }

            shutoffTimer = createTimer(now.plusSeconds(10)) [|
                Sirene_Gaeste.sendCommand(OFF)
                logInfo("Alarmrule", "alarm ende")
                shutoffTimer = null
            ]
        }
    end

Re: Alarm Rule - Bitte checken ob korrekt?

Verfasst: 21. Feb 2020 20:44
von udo1toni
Bitte nicht logError für normale Meldungen verwenden, das verstößt gegen die Regeln. Allgemein:

Ausgaben, die zur Fehlersuche wichtig sein können, werden mit logDebug() geloggt. Normale Informationen werden mit logInfo() geloggt. Wenn irgendwas schief geht, wird das mit logWarn() geloggt, und nur fatale Fehler werden mit logError() geloggt.

Ja, die Meldungen werden so schön farblich hervorgehoben... Nein, so ist das nicht gedacht. In frontail gibt es oben einen Filter, mit dem man gezielt auf Schlüsselworte eingrenzen kann.
Der Loglevel lässt sich für jeden Logger getrennt einstellen, man kann also gezielt die Meldungen nach Wichtigkeit komplett abschalten. Dafür gibt es die Loglevel.

Gesendet von meinem SM-G973F mit Tapatalk