Hallo,
ich bin nun etwas mutig und packe noch ein paar Kleinigkeiten in das rule, könnt ihr bitte da nochmal drauf schauen,
das ist bestimmt noch nicht korrekt so. Das ist nun wirklich knifflig und nur was für Insider
(Ich bekomme das mit dem Kopieren des Codes nicht ordentlich hin, sieht leider alles etwas schräg aus

)
Ich möchte folgendes erreichen:
1. Die Mai Infos werden nur gesendet wenn der neu aufgesetzte Dummy Switch "InfoSenden" auf ON steht.
2. Ich schalte mit 2 zusätzlichen Timer einen LED Strahler
a. Immer wenn Alarm an und ein Bewegungsmelder triggert -> hier nur für 2 Sekunden
b. wenn der Alarm echt aktiv wird -> Kann man diesen Timer mehrfach wiederholen? z.B. 3Sek an dann 3Sek aus, evtl. solange bis Alarmzeit ausläuft, und das wären dann mehrere LED Strahler, also nicht nur dieser eine im Beispiel, die das Alarmsignal abwechselnd auch optisch begleiten.
Insbesondere diese neuen shutoffTimer, die ich da eingebaut haben, gehen die an diesen Positionen,
und stören die nicht den eigentlichen Alarmtimer?
Code: Alles auswählen
import java.util.List // Notwendiger Import
var List<Timer> timers = newArrayList // globale gültige Liste
var Timer shutoffTimer = null // global gültiges Timer Objekt
var lastRun = 0 // global gültige Variable für den 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
// hier kommt hin, was auf jeden Fall passieren soll, wenn die Rule triggert
if(AlarmAussen.state == OFF) { // Anfang Alarm unscharf-Block
logInfo("bw_alarm","Alarmanlage aus, Rule Ende!") // kurze Meldung
return; // und Ende der Rule
} // Ende Alarm unscharf-Block
// hier kommt hin, was auf jeden Fall passieren soll, wenn der Alarm scharf ist
LED_GaesteV.sendCommand(ON) // Wenn ein Bewegungsmelder auslöst schaltet dieser LED Strahler ein
shutoffTimer = createTimer(now.plusSeconds(2), [ | // Timer zum Abschalten des LED Strahler anlegen
LED_GaesteV.sendCommand(OFF) // Bei Ablauf LED Strahler nach 2 Sekunden aus
shutoffTimer = null // und Timer löschen
] ) // Ende Timer
if(InfoSenden.state == ON) { // Abfrage ob Switch InfoSenden aktiv
val mailActions = getActions("mail","mail:smtp:c1a3d968") // MailAction Objekt anlegen
val mailText = "Bewegungsmelder " + triggeringItem.name + " hat ausgelöst" // MailBody erzeugen
mailActions.sendMail("xxx@gmail.com","Alarm "+ triggeringItem.name, mailText) // Mail verschicken
} // Ende Mail nur senden wenn item InfoSenden aktiv
if(shutoffTimer !== null) { // Anfang shuttoffTimer existiert
logInfo("bw_alarm","Alarm schon aktiv, Rule Ende!") // Meldung ausgeben
return; // und Rule Ende
} // Ende shuttoffTimer existiert
// hier kommt hin, was nur passieren soll, wenn der Alarm scharf und gerade nicht aktiv ist
if(lastRun.isAfter(now.minusMinutes(2))) { // Anfang letzter Alarm vor weniger als 2 Minuten
logInfo("bw_alarm","letzter Alarm vor weniger als 2 Minuten, Rule Ende!") // Meldung ausgeben
return; // und Rule Ende
} // Ende letzter Alarm vor weniger als 2 Minuten
// hier kommt alles hin, was nur passieren soll, wenn der letzte Alarm schon 2 Minuten her ist
if(timers.size < 3) { // Angang weniger als 3 Timer laufen
val t = createTimer(now.plusMinutes(1), [ | // Timer anlegen
timers.remove(0) // Bei Ablauf des Timers, den ältesten Timer von der Liste entfernen
] ) // Ende Timer
timers.add(t) // Den gerade erzeugten Timer der Liste hinzufügen
} // Ende weniger als 3 Timer laufen
if(timers.size == 3) { // Anfang Liste umfasst 3 Timer
/*
val mailActions = getActions("mail","mail:smtp:c1a3d968") ist ier nicht nötig, da die Action schon oben definiert wurde
*/
if(InfoSenden.state == ON) { // Abfrage ob Switch InfoSenden aktiv
mailActions.sendMail("xxx@gmail.com","Sirene aktiviert ", "Sirene wurde aktiviert") // Alarmmail ausgeben
} // Ende Mail nur senden wenn item InfoSenden aktiv
Sirene_Gaeste.sendCommand(ON) // Sirene aktivieren
LED_GaesteV.sendCommand(ON) // LED Strahler ein
Wiederholen shutoffTimer = createTimer(now.plusSeconds(3), [ | // Timer zum Abschalten des LED Strahler anlegen
LED_GaesteV.sendCommand(OFF) // Bei Ablauf LED Strahler nach 3 Sekunden aus
shutoffTimer = null // und Timer löschen
] ) // Ende Timer
lastRun = now // Zeitstempel für letzten Alarm setzen
while(timers.size > 0) { // Solange die Liste Elemente enthält
timers.get(0).cancel // den ältesten Timer canceln
timers.remove(0) // und von der Liste entfernen
}
shutoffTimer = createTimer(now.plusSeconds(30), [ | // Timer zum Abschalten des Alarms anlegen
Sirene_Gaeste.sendCommand(OFF) // Bei Ablauf Sirene aus
logInfo("Alarmrule", "Sirene Ende") // Meldung ausgeben
shutoffTimer = null // und Timer löschen
] ) // Ende Timer
} // Ende Liste umfasst 3 Timer
end
Ich habe den Code an diesen beiden Stellen geändert:
Anmerkung 2020-02-27 183018.gif
Anmerkung 2020-02-27.gif
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.