Loop für Alarmanlage (Licht blinken)

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

sonic
Beiträge: 74
Registriert: 19. Jan 2020 10:39
Answers: 0

Loop für Alarmanlage (Licht blinken)

Beitrag von sonic »

Hallo zusammen,

mit verschiedenen Fenster/Tür-Sensoren und Bewegungsmeldern bin ich aktuell dabei eine Alarmanlage zu bauen. Also unterschiedliche Stati, "Scharf, Nachtmodus, Aus....".

Wenn jetzt im Status "Scharf" zum Beispiel unberechtigt ein Fenster oder eine Tür geöffnet werden passieren verschiedene Aktionen, Push Mail aufs Handy, Licht in verschiedenen Räumen geht an etc.

Ich würde jetzt gerne das zum Beispiel eine Lampe für 5 Minuten blinkt, wahlweise meine Türklingel für 5 Min klingelt.

Die Lampen sind alle via Sonoff Mini gesteuert, die Klingel über einen Sonoff Basic der einfach kurz die 230V meiner Klingel freigibt.

Gibt es eine art "loop" den man für eine bestimmte Zeit ausführen kann innerhalb einer Rule?
---------------------------------
OpenHAB 3 auf Dell ThinClient unter Debian Bullseye und ConBee II
RaspberryPi 4b 2GB in Din Rail Gehäuse mit PiVCCU3
Allerlei Sonoff, Shelly, NodeMCU, Sensoren, Aqara Krams und und und.

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

Re: Loop für Alarmanlage (Licht blinken)

Beitrag von udo1toni »

Das wäre keine gute Idee (besonders wenn es um 5 Minuten geht)- Es ist ken Problem, etwas einzuschalten und nach 5 Minuten wieder auszuschalten, es ist ebenfalls kein Problem, für 5 Minuten (z.B.) alle 5 Sekunden einen Switch zu toggeln, aber bitte nicht eine Rule 5 Minuten lang laufen lassen.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

sonic
Beiträge: 74
Registriert: 19. Jan 2020 10:39
Answers: 0

Re: Loop für Alarmanlage (Licht blinken)

Beitrag von sonic »

Hallo Udo,

herzlichen Dank für die Infos.
Ein toggeln über 5 minuten alle 5 sekunden wäre grundsätzlich genau die Lösung die ich anstrebe.

Aber wie mache ich das denn konkret das die rule nicht die entsprechenden 5 Minuten läuft. Das verstehe ich noch nicht ganz.

Hast du ggf. ein Beispiel?

besten Dank und liebe Grüße
---------------------------------
OpenHAB 3 auf Dell ThinClient unter Debian Bullseye und ConBee II
RaspberryPi 4b 2GB in Din Rail Gehäuse mit PiVCCU3
Allerlei Sonoff, Shelly, NodeMCU, Sensoren, Aqara Krams und und und.

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

Re: Loop für Alarmanlage (Licht blinken)

Beitrag von udo1toni »

Na ja, Du benutzt dazu einen Timer, der sich selbst aufruft. z.B. so:

Code: Alles auswählen

var Timer tToggle = null // Timer
var Number nCount = 0     // Zähler
val Integer iTimeOn = 5  // Einschaltdauer
val Integer iTimeOff = 5  // Ausschaltdauer

rule "toggle"
when
   Item Alarm changed   // Alarmitem hat Zustand geändert
then
    tToggle?.cancel    // Falls Timer läuft, abbrechen
    nCount = 60 // und Zähler initialisieren
    if(Alarm.state == OFF) { // Falls Alarm OFF
        Licht.sendCommand(OFF) // Licht aus
        return;  // und Rule abbrechen
    } 
    // Ab hier wird der Timer initialisiert
    tToggle = createTimer(now,[|  // Timer initialisieren und sofoert ausführen
        var Integer iSched = 0       // Variable für geplante Dauer
        nCount = nCount - 1 // Zähler runterzählen
        if((nCount/2).intValue == (nCount/2)) { // gerade oder ungerade? Falls gerade
             Licht.sendCommand(OFF) // Licht aus
             iSched = iTimeOff // und Timerzeit für Off übernehmen
        } else {            // falls ungerade
             Licht.sendCommand(ON)    // Licht an
             sched = iTimeOn   // und Timerzeit für On übernehmen
        }
        if(nCount > 0)    // Falls Zähler > 0
            tToggle.reschedule(now.plusSeconds(iSched)) // Timer erneut in iSched Sekunden ausführen
    ])
end
ferrdisch...
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

sonic
Beiträge: 74
Registriert: 19. Jan 2020 10:39
Answers: 0

Re: Loop für Alarmanlage (Licht blinken)

Beitrag von sonic »

Lieber Udo,

vielen Dank für das Beispiel, ich habe es auf meine Bedürfnisse angepasst und es funktioniert SUPER.

Eine Bitte habe ich aber noch,

währen des wild Blinkt und Bimmelt benötige ich die Funktion, diese Situation zu unterbrechen. Und zwar wenn die Alarmanlage ausgeschaltet wird.

Ich nutze verschiedene Stati:
AlamanlageStatus = 3 ist der Modus "Alarmanlage scharf"
AlamanlageStatus = 4 ist der Modus "Alarmanlage scharf Nachtmodus" (Hier sind nicht alle Bewegungsmelder eingebunden)
AlamanlageStatus = 5 ist der Modus "Alarmanlage AUS"

Es soll also der der Timer quasi unterbrochen werden sobald ich während des Blinken den Status "5" setze.


Ein Beispiel wann Alarm ausgelöst wird. Dann wird auch "AlarmAktiv" auf ON gesetzt um dann den "Toggle" zu starten.

Code: Alles auswählen

rule "Alarm Balkontür"
when
	Item M_BalkontuerDataOpen changed to OPEN
then
	if (AlamanlageStatus.state == "3" || AlamanlageStatus.state == "4"){
		AlarmAktiv.sendCommand(ON)
		sendBroadcastNotification("!!! ALARM !!! - Balkontür wurde geöffnet!")
        sendBroadcastNotification("!!! ALARM !!! - Balkontür wurde geöffnet!")
		sendBroadcastNotification("!!! ALARM !!! - Balkontür wurde geöffnet!")
		sendBroadcastNotification("!!! ALARM !!! - Balkontür wurde geöffnet!")
        M_Text_to_Speech_Vol_1.sendCommand('100')
        M_Text_to_Speech_1.sendCommand('ALARM ALARM ALARM - Balkontür wurde unberechtigt geöffnet')
        M_Text_to_Speech_Vol_2.sendCommand('100')
        M_Text_to_Speech_2.sendCommand('ALARM ALARM ALARM - Balkontür wurde unberechtigt geöffnet')
		AlarmAktiv.sendCommand(OFF)
	}
end

Der angepasste Toggle nach Udos Vorlage

Code: Alles auswählen

rule "Alarm Toggle"
when
   Item AlarmAktiv changed to ON
then
    tToggle?.cancel    // Falls Timer läuft, abbrechen
    nCount = 10 // und Zähler initialisieren
    if(AlamanlageStatus.state == "5") { // Falls Alarm OFF
        MFlurlichtPOWERSwitch.sendCommand(OFF) // Licht aus
        return;  // und Rule abbrechen
    } 
    // Ab hier wird der Timer initialisiert
    tToggle = createTimer(now,[|  // Timer initialisieren und sofoert ausführen
        var Integer iSched = 0       // Variable für geplante Dauer
        nCount = nCount - 1 // Zähler runterzählen
        if((nCount/2).intValue == (nCount/2)) { // gerade oder ungerade? Falls gerade
             MFlurlichtPOWERSwitch.sendCommand(OFF) // Licht aus
             iSched = iTimeOff // und Timerzeit für Off übernehmen
        } else {            // falls ungerade
             MFlurlichtPOWERSwitch.sendCommand(ON)    // Licht an
             iSched = iTimeOn   // und Timerzeit für On übernehmen
        }
        if(nCount > 0)    // Falls Zähler > 0
            tToggle.reschedule(now.plusSeconds(iSched)) // Timer erneut in iSched Sekunden ausführen
    ])
end
---------------------------------
OpenHAB 3 auf Dell ThinClient unter Debian Bullseye und ConBee II
RaspberryPi 4b 2GB in Din Rail Gehäuse mit PiVCCU3
Allerlei Sonoff, Shelly, NodeMCU, Sensoren, Aqara Krams und und und.

sonic
Beiträge: 74
Registriert: 19. Jan 2020 10:39
Answers: 0

Re: Loop für Alarmanlage (Licht blinken)

Beitrag von sonic »

Die Lösung ist eigentlich logisch und einfach :lol: :lol:
Manchmal sieht man den Wald vor lauter Bäumen nicht :-)

Code: Alles auswählen

rule "Alarm unterbrechen"
when
	Item AlamanlageStatus changed to "5"
then
	tToggle?.cancel
	AlleLampen.sendCommand(ON)
end
---------------------------------
OpenHAB 3 auf Dell ThinClient unter Debian Bullseye und ConBee II
RaspberryPi 4b 2GB in Din Rail Gehäuse mit PiVCCU3
Allerlei Sonoff, Shelly, NodeMCU, Sensoren, Aqara Krams und und und.

mcdandrew
Beiträge: 175
Registriert: 13. Dez 2018 17:42
Answers: 0

Re: Loop für Alarmanlage (Licht blinken)

Beitrag von mcdandrew »

Mein Plan ist es beim Auslösen von Türsensoren in der Nacht die Aussenbeleuchtung im Intervall blinken zu lassen.
Leider funktioniert es mit der Rule nicht....ich erhalt die folgende Fehlermeldung

Code: Alles auswählen

[WARN ] [ore.internal.scheduler.SchedulerImpl] - Scheduled job failed and stopped
Was mache ich falsch?

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

Re: Loop für Alarmanlage (Licht blinken)

Beitrag von udo1toni »

Mit DER Rule? wie sieht Deine Rule aus?
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

mcdandrew
Beiträge: 175
Registriert: 13. Dez 2018 17:42
Answers: 0

Re: Loop für Alarmanlage (Licht blinken)

Beitrag von mcdandrew »

Ich habe im Grunde deine Rule aus diesem Thema genommen und nur ein wenig angepasst.
Getriggert wird diese wenn ein Item der Gruppe Kontaktsensoren auslöst gleichzeitig das Dummy Item "Alarmanlage" aktiv gesetzt ist.
Derzeit habe ich den Code nur ein Testrule drin

Code: Alles auswählen

var Timer tToggle = null // Timer
var Number nCount = 0     // Zähler
val Integer iTimeOn = 5  // Einschaltdauer
val Integer iTimeOff = 5 // Ausschaltdauer
var Timer timer = null

rule "TEST"
when
    Item test_switch changed
then
   	tToggle?.cancel    // Falls Timer läuft, abbrechen
	nCount = 60 // und Zähler initialisieren
			
	// Ab hier wird der Timer initialisiert
	tToggle = createTimer(now,[|  // Timer initialisieren und sofoert ausführen
        var Integer iSched = 0       // Variable für geplante Dauer
        nCount = nCount - 1 // Zähler runterzählen
        if((nCount/2).intValue == (nCount/2)) 
	{ 
             	gshelly_dachboden_vorne_switch.sendCommand(OFF) // Licht aus
		gshelly_dachboden_hinten_switch.sendCommand(OFF) // Licht aus
	 	iSched = iTimeOff // und Timerzeit für Off übernehmen
        } 
	else 
	{    // falls ungerade
           	 gshelly_dachboden_vorne_switch.sendCommand(ON)    // Licht an
		 gshelly_dachboden_hinten_switch.sendCommand(ON)    // Licht an	
             	isched = iTimeOn   // und Timerzeit für On übernehmen
        }
        if(nCount > 0)    // Falls Zähler > 0
            tToggle.reschedule(now.plusSeconds(iSched)) // Timer erneut in iSched Sekunden ausführen
		])
end

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

Re: Loop für Alarmanlage (Licht blinken)

Beitrag von udo1toni »

Also, von der Formatierung abgesehen sieht die Rule erst mal gut aus. Es kann sein, dass der erste Timer zu schnell gestartet wird. ersetze bitte
(now, durch (now.plusMillis(10),

Die Rule läuft in openHAB2, in openHAB3 kann es sein, dass man ein paar Anpassungen vornehmen muss. Insbesondere gibt es dort kein .plusMillis(), stattdessen muss man mit plusNanos() arbeiten, was dann also now.plusNanos(10000000) ergibt. plusNanos() steht nur unter openHAB3 zur Verfügung.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Antworten