Seite 1 von 2

Loop für Alarmanlage (Licht blinken)

Verfasst: 26. Jan 2021 14:16
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?

Re: Loop für Alarmanlage (Licht blinken)

Verfasst: 26. Jan 2021 20:42
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.

Re: Loop für Alarmanlage (Licht blinken)

Verfasst: 27. Jan 2021 12:25
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

Re: Loop für Alarmanlage (Licht blinken)

Verfasst: 27. Jan 2021 19:33
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...

Re: Loop für Alarmanlage (Licht blinken)

Verfasst: 28. Jan 2021 14:44
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

Re: Loop für Alarmanlage (Licht blinken)

Verfasst: 29. Jan 2021 09:54
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

Re: Loop für Alarmanlage (Licht blinken)

Verfasst: 21. Mai 2021 00:03
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?

Re: Loop für Alarmanlage (Licht blinken)

Verfasst: 21. Mai 2021 12:31
von udo1toni
Mit DER Rule? wie sieht Deine Rule aus?

Re: Loop für Alarmanlage (Licht blinken)

Verfasst: 22. Mai 2021 08:09
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

Re: Loop für Alarmanlage (Licht blinken)

Verfasst: 22. Mai 2021 19:47
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.