Re: Alarm Rule - Bitte checken ob korrekt?
Verfasst: 28. Feb 2020 00:30
Das liegt daran, dass die Forensoftware einen Tabulator alle acht Zeichen setzt, während default andere Editoren vier Zeichen nutzen. Am besten gar keine Tabulatoren nutzen und nur mit Leerzeichen formatieren. Tipp: in VisualStudio Code kann man wählen, ob der Editor Tabs oder Leerzeichen einfügt.
Ja, das hast Du soweit korrekt umgesetztBoris099 hat geschrieben: 1. Die Mai Infos werden nur gesendet wenn der neu aufgesetzte Dummy Switch "InfoSenden" auf ON steht.
Dazu müsstest Du aber auch zwei zusätzliche Timer verwenden, nicht den einen, der schon an anderer Stelle genutzt wird.Boris099 hat geschrieben: 2. Ich schalte mit 2 zusätzlichen Timer einen LED Strahler
Da Du keine zusätzlichen Timer verwendest, geht das komplett schief.Boris099 hat geschrieben: Insbesondere diese neuen shutoffTimer, die ich da eingebaut haben, gehen die an diesen Positionen,
und stören die nicht den eigentlichen Alarmtimer?
Ich habe hier einige Kommentare entfernt, damit die Rule lesbar bleibt:
Code: Alles auswählen
import java.util.List
var List<Timer> timers = newArrayList // Timer Liste
var Timer shutoffTimer = null // Timer zum Beenden des Alarms
var Timer LEDTimer1 = null // Timer für Bewegungserkennung
var Timer LEDTimer2 = null // Timer für optischne Alarm
var lastRun = 0 // Zeitstempel
rule "Rule Datei eingelesen"
when
System started
then
lastRun = now.minusMinutes(2)
end
rule "Motion detected 3 times in a minute"
when
Member of gBW changed from OFF to ON
then
// sobald die Rule triggert
if(AlarmAussen.state == OFF) { // Alarm unscharf-Block
logInfo("bw_alarm","Alarmanlage aus, Rule Ende!")
return;
}
// Wenn der Alarm scharf ist
if(LEDTimer1 === null) { // Nur, falls die LED noch nicht an ist
LED_GaesteV.sendCommand(ON) // LED Strahler ein und
LEDTimer1 = createTimer(now.plusSeconds(2), [ | // Timer zum Abschalten des LED Strahler anlegen
LED_GaesteV.sendCommand(OFF)
LEDTimer1 = null
] )
}
val mailActions = getActions("mail","mail:smtp:c1a3d968") // MailAction Objekt auf jeden Fall anlegen
if(InfoSenden.state == ON) { // Falls InfoSenden aktiv
val mailText = "Bewegungsmelder " + triggeringItem.name + " hat ausgelöst"
mailActions.sendMail("xxx@gmail.com","Alarm "+ triggeringItem.name, mailText)
}
if(shutoffTimer !== null) { // Falls shuttoffTimer existiert
logInfo("bw_alarm","Alarm schon aktiv, Rule Ende!")
return;
}
// Wenn der Alarm scharf und gerade nicht aktiv ist
if(lastRun.isAfter(now.minusMinutes(2))) { // Falls letzter Alarm vor weniger als 2 Minuten
logInfo("bw_alarm","letzter Alarm vor weniger als 2 Minuten, Rule Ende!")
return;
}
// Wenn der letzte Alarm schon 2 Minuten her ist
if(timers.size < 3) { // Falls weniger als 3 Timer laufen
val t = createTimer(now.plusMinutes(1), [ |
timers.remove(0)
] )
timers.add(t)
}
if(timers.size == 3) { // Falls Liste 3 Timer umfasst
if(InfoSenden.state == ON) { // Falls InfoSenden aktiv
mailActions.sendMail("xxx@gmail.com","Sirene aktiviert ", "Sirene wurde aktiviert")
}
Sirene_Gaeste.sendCommand(ON)
LEDTimer2 = createTimer(now.plusMillis(10), [ | // LEDTimer anlegen
if(LED_GaesteV.state != ON) { // Falls LED aus
LED_GaesteV.sendCommand(ON) // LED ein
LEDTimer2.reschedule(now.plusSeconds(3)) // und Timer in 3 Sekunden erneut ausführen
} else { // Falls LED an
LED_GaesteV.sendCommand(OFF) // LED aus
LEDTimer2.reschedule(now.plusSeconds(2)) // und Timer in 2 Sekunden erneut ausführen
}
] )
lastRun = now
while(timers.size > 0) {
timers.get(0).cancel
timers.remove(0)
}
shutoffTimer = createTimer(now.plusSeconds(30), [ | // Timer zum Abschalten des Alarms anlegen
Sirene_Gaeste.sendCommand(OFF)
logInfo("Alarmrule", "Sirene Ende")
LEDTimer2?.cancel // Falls LEDTimer2 existiert, abbrechen
LEDTimer2 = null
if(LED_GaesteV.state != OFF) // Falls die LED gerade an ist
LED_GaesteV.sendCommand(OFF) // abschalten
shutoffTimer = null
] )
}
end
Sobald der Timer zum Abschalten der Sirene abläuft, wird auch der LEDTimer2 beendet und die LED, falls noch eingeschaltet, wird ausgeschaltet.