[SOLVED]Alarm Rule - Bitte checken ob korrekt?

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Benutzeravatar
udo1toni
Beiträge: 15249
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Alarm Rule - Bitte checken ob korrekt?

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

bastler
Beiträge: 121
Registriert: 7. Jan 2020 19:36
Answers: 2

Re: Alarm Rule - Bitte checken ob korrekt?

Beitrag 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

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

Re: Alarm Rule - Bitte checken ob korrekt?

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

bastler
Beiträge: 121
Registriert: 7. Jan 2020 19:36
Answers: 2

Re: Alarm Rule - Bitte checken ob korrekt?

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

Boris099
Beiträge: 383
Registriert: 19. Feb 2020 20:51
Answers: 3
Wohnort: Saarbrücken

Re: Alarm Rule - Bitte checken ob korrekt?

Beitrag 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 :-)
Zuletzt geändert von Boris099 am 21. Feb 2020 16:20, insgesamt 1-mal geändert.
Raspberry 4, Rev.1.2b, 4GB, Openhab 2.5.12 (OH3 kommt im Winter dran:-))

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

Re: Alarm Rule - Bitte checken ob korrekt?

Beitrag 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


openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

bastler
Beiträge: 121
Registriert: 7. Jan 2020 19:36
Answers: 2

Re: Alarm Rule - Bitte checken ob korrekt?

Beitrag 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

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

Re: Alarm Rule - Bitte checken ob korrekt?

Beitrag von udo1toni »

probiere mal timers.get(0).cancel

Gesendet von meinem SM-G973F mit Tapatalk

openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

bastler
Beiträge: 121
Registriert: 7. Jan 2020 19:36
Answers: 2

Re: Alarm Rule - Bitte checken ob korrekt?

Beitrag 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
Zuletzt geändert von bastler am 22. Feb 2020 15:31, insgesamt 2-mal geändert.

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

Re: Alarm Rule - Bitte checken ob korrekt?

Beitrag 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

openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten