Voralarm mit Lua Szene

Advertisements

Im hektischen Alltag kommt es bei uns manchmal vor, dass man vergisst den Alarm mit dem RFID Chip zu deaktivieren. Dann wird es plötzlich sehr laut! Deswegen habe ich eine Szene erstellt die mittels Voralarm auf die noch aktive Alarmanlage hinweist. Weiterhin ermöglicht die Szene auch eine zyklische Benachrichtigung über das Schärfen der Anlage. In diesem Artikel erkläre ich, wie die Szene funktioniert und was sie alles kann.

Voralarm

Voralarm

Trigger finden

Als erstes musste ich einen geeigneten Trigger für die Szene finden. Unsere Haustür ist mit einem Türsensor in die Alarmanlage eingebunden der mit einer Verzögerung von 40 Sekunden reagiert. So dass beim Verlassen und Betreten des Hauses genug Zeit ist und nicht jedes Mal der Alarm ausgelöst wird. Ich konnte also beim schärfen der Anlage nicht auf den armed Wert zurückgreifen und für den Vorlarm ist keiner der häufig verwendeten Werte nutzbar. Ein tieferer Blick in die JSON Ausgabe hat dann doch zum Erfolg geführt.

armTimeTimestamp und alarmTimeTimestamp

Sobald der 40 Sekunden Timer anfängt zu laufen wird ein Timestamp in armTimeTimestamp geschrieben. Selbiges passiert beim Auslösen des Sensors für den Alarm mit alarmTimeTimestamp. Diese beiden Werte habe ich genutzt um die Szene zu starten und unterscheiden zu können, ob der Alarm aktiviert oder ausgelöst wurde.

--[[
%% properties
118 armTimeTimestamp
118 alarmTimeTimestamp
%% events
%% globals
--]]

Benachrichtigung

Die Benachrichtigung lasse ich von meiner Sirene durchführen indem ich diese ein und sofort wieder ausschalte. Das hat dann den Effekt eines Quittungstons und lässt sofort erkennen, dass die Alarmanlage noch aktiv bzw. gerade eingeschaltet wurde. Die Funktion wird entsprechend der eingestellten Zeiten in der Variable signalTimeSplit ggf. mehrfach aufgerufen.

-- SignalConfirm Funktion
-----------------------------------------------
-- Hier kann kann jeder beliebige Lua Code stehen der zur Benachrichtigung über den Delay informiert.
-- Im Beispiel wird eine Sirene ganz kurz eingeschaltet und gleich wieder ausgeschaltet.
local function ConfirmSignal(value)
	-- Beim Schärfen
	if armBeep and armTime ~= 0 then
		fibaro:call(signalDevice, "turnOn")
		fibaro:call(signalDevice, "turnOff")
	end
	-- Voralarm
	if disarmBeep and disarmTime ~= 0 then
		fibaro:call(signalDevice, "turnOn")
		fibaro:call(signalDevice, "turnOff")
	end
end

Hier liegt es am Geschmack des Einzelnen, ob ein Ton aus der Sirene oder das Aufleuchten einer Lampe über den Status informieren soll. Lua lässt hier keine Wünsche offen.

Entschärfen

Wird die Alarmanlage vor Ablauf des Delays entschäft, wird die Szene automatich unterbrochen und keine weiteren Benachrichtigungen ausgegeben.

Konfiguration der Szene

-- Konfiguration
-----------------------------------------------
local advdebug			= true
local alarmSensor		= 118 
local signalDevice		= 176 
local armBeep			= false
local disarmBeep		= true
local armTime 			= tonumber(fibaro:getValue(alarmSensor, "armTimeTimestamp"))
local disarmTime 		= tonumber(fibaro:getValue(alarmSensor, "alarmTimeTimestamp"))
local deviceDelay 		= tonumber(fibaro:getValue(alarmSensor, "alarmDelay"))
local signalTimeSplit	= {50,70,75,80,85,90,95}

alarmSensor (118) ist der Türkontakt meiner Haustür und signalDevice meine Sirene. Die Werte von armBeep und disarmBeep (jeweils true oder false) bestimmen, ob eine Benachrichtigung erfolgen soll. Die Werte armTime, disarmTime und deviceDelay lese ich aus um zu erkennen was getan wurde und um die Verzögerung zu ermitteln.

Die Variable signalTimeSplit ist ein Array in dem angegeben wird nach wieviel Prozent abgelaufenem Delay eine erneute Benachrichtigung erfolgen soll. In meinem Beispiel rechnet sich das folgendermaßen:

40 Sekunden Delay
50% entsprechen 20 Sekunden
70% entsprechen 28 Sekunden
..
95% entsprechen 38 Sekunden

Die vollständige Voralarm Szene

--[[
%% properties
118 armTimeTimestamp
118 alarmTimeTimestamp
%% events
%% globals
--]]
-----------------------------------------------
-- mkshb.de - Alarm Delay Funktion ------------
-----------------------------------------------
--[[
Voralarm und Benachrichtigung über schärfen der Alarmanlage
Trigger: armTimeTimestamp und alarmTimeTimestamp
--]]
---------------------------------------------------
--------- Schleifenschutz -------------------------
if (fibaro:countScenes()>1) then
fibaro:debug('Kill the second scene!');
fibaro:abort();
end
-- Konfiguration
-----------------------------------------------
local advdebug			= true
local alarmSensor		= 118 
local signalDevice		= 176 
local armBeep			= false
local disarmBeep		= true
local armTime 			= tonumber(fibaro:getValue(alarmSensor, "armTimeTimestamp"))
local disarmTime 		= tonumber(fibaro:getValue(alarmSensor, "alarmTimeTimestamp"))
local deviceDelay 		= tonumber(fibaro:getValue(alarmSensor, "alarmDelay"))
local signalTimeSplit	= {50,70,75,80,85,90,95}
---------------------------------------------------
--------- Farbiges Debug --------------------------
---------------------------------------------------
debug = function ( color, message )
if (advdebug) then 
fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, message, "span"));
end
end	
-- Signalzeitpunkte ausrechnen und in Array einfügen
-----------------------------------------------
signalTimes = {}
for i=1,#signalTimeSplit do
signalTime = (math.floor(deviceDelay/100*signalTimeSplit[i])-deviceDelay)*-1
table.insert(signalTimes, signalTime)
end
-- Contains Funktion für array
-----------------------------------------------
local function contains(table, val)
for i=1,#table do
if table[i] == val then 
return true
end
end
return false
end
-- SignalConfirm Funktion
-----------------------------------------------
-- Hier kann kann jeder beliebige Lua Code stehen der zur Benachrichtigung über den Delay informiert.
-- Im Beispiel wird eine Sirene ganz kurz eingeschaltet und gleich wieder ausgeschaltet.
local function ConfirmSignal(value)
-- Beim Schärfen
if armBeep and armTime ~= 0 then
fibaro:call(signalDevice, "turnOn")
fibaro:call(signalDevice, "turnOff")
end
-- Voralarm
if disarmBeep and disarmTime ~= 0 then
fibaro:call(signalDevice, "turnOn")
fibaro:call(signalDevice, "turnOff")
end
end
-- Skript
-----------------------------------------------
if(armTime ~= 0) then
debug("green","ARM DELAY")
ConfirmSignal()
i = 0
while i < deviceDelay do  
debug("green", armTime - os.time().." Seconds until arm")
if tonumber(fibaro:getValue(alarmSensor, "armTimeTimestamp")) ~= 0 then
if (contains(signalTimes, armTime - os.time())) then
ConfirmSignal()
end
fibaro:sleep(1000)
i=i+1
else 
debug("green", "Alarm activation aborted")
i = deviceDelay
end
end
debug("yellow","--- powered by mkshb.de ---")
elseif(disarmTime ~= 0) then
debug("red","ALARM DELAY")
ConfirmSignal()
i = 0
while i < deviceDelay do  
debug("red",disarmTime - os.time().." Seconds until alarm")
if tonumber(fibaro:getValue(alarmSensor, "alarmTimeTimestamp")) ~= 0 then
if (contains(signalTimes, disarmTime - os.time())) then
ConfirmSignal()
end
fibaro:sleep(1000)
i=i+1
else
debug("green", "Alarm disarmed")
i = deviceDelay	
end
end
debug("yellow","--- powered by mkshb.de ---")
end

Feedback erwünscht

Dir hat die Szene gefallen, oder Du findest sie unnötig? Dann schreibe Dein Feedback oder Deine Kritik zu diesem Artikel in die Kommentaren. Gern auch Anregungen für neue Szenen und Erweiterungen meines Blogs.

Posted in Alarm and tagged , .

15 Comments

  1. Hallo. Ist es evtl. so auch möglich während des scharf schalten – sprich wenn der Countdown( zb. 30 Sekunden) startet , eine Szene auszuführen ? Zb. Fenster und Türen überprüfen und gegebenenfalls das Schärfen zu stoppen? Gruß

    • Hallo Campos,
      sicher ist das möglich. Ich habe eine solche Szene parallel laufen die mich benachrichtigt. Die Integration in den Voralarm ist gar keine schlecht Idee. Ich schaue mir das morgen oder übermorgen mal an und gebe dann Feedback.
      Gruß
      Bastian

  2. Ja, das wäre super. Momentan läuft es bei mir so das die Abfrage der Fenster und Türen erst nach dem Countdown startet – mit der Folge das geöffnete Fenster halt nicht scharf sind. Bekomme zwar ein Popup das es noch offen ist , aber smart wäre es wenn das Schärfen abgebrochen wird und er sagt – Fenster xy noch geöffnet- Anlage wird nicht scharf geschaltet.. Hab das eine oder andere schon probiert – aber meine Fähigkeiten reichen dafür nicht aus… Gruß

    • Hallo campos,

      so komliziert ist es gar nicht. Ich habe mir das jetzt mal genauer angesehen und bin zu dem Schluß gekommen, dass dies nicht die richtige Stelle ist um offene Fenster/Türen zu prüfen. Dies gehört meiner Meinung nach in die Alarmszene. Schau mal im Artikel zum RFID Scanner. Dort habe ich eine Alarm-Szene veröffentlicht die bei geöffneten Fenstern und/oder Türen eine Benachrichtigung verschickt. Bisher benachrichtige die Szene nur, aber die Alarmaktivierung zu unterbrechen lässt sich schnell einbauen.

      Gruß
      Bastian

  3. Hi Bastian (ohne Se) 😉

    habe das Script bei mir eingebaut und es funktioniert einwandfrei. Habe meine Flurlampe zur Warnung verwendet (Pause eingebaut 😉 bis die Popp Feuermelder da sind. Dann verwende ich auch den Beep.

    Dein Blog und deine Hilfe in Foren und hier sind superklasse und mir als Neuling eine Riesenhilfe! Vielen Dank nochmal dafür!

    Viele Grüße
    Roman

  4. Pingback: Basics: Das Alarmpanel | Mein kleiner Smart Home Blog

  5. Moin Bastian,

    Dank Eurer Hilfe („Siio.de“ und „hier“) habe ich meine Alarmanlage nun zur (fast) vollsten Zufriedenheit umgesetzt. Inclusive Zipato RFID Reader , verschiedene Sirenen, Bewegungs und Fenster/Tür-Sensoren. Besonders Deine Idee zum „Voralarm“ finde ich extrem nützlich. Unter anderem begrüßt uns nun unser virtueller SONOS-Rottweiler sobald die Eingangstüre bei scharfem Alarm geöffnet wird. Meine Frau hat sich gut an unseren Mitbewohner gewöhnt und möchte ihn nicht mehr missen.
    Leider lässt das Script von Dir aber nur ein Device zu um den AlarmTimeTimestamp abzufragen. Wenn der Einbrecher also durch die Hintertür kommt dann funktioniert zwar das sonstige Alarmszenario, das Hundegebell aber leider nicht. Gäbe es eine Lösung um noch weitere Trigger für den Voralarm einzubauen?

    Viele Grüße
    Alex

    • Hallo Alex,
      der Grundgedanke des Voralarms ist die Vorwarnung derjenigen die das Haus betreten dürfen. Er dient also in erster Linie der Erinnerung, dass die Alarmanlage noch aktiv ist. Dies für dann illegal geöffnete Fenster und Türen einzubauen halte ich für nicht zielführend, denn ein Einbrecher braucht nicht vorgewarnt werden. Der Alarm sollte hier mMn sofort losgehen.
      Grüße
      Bastian

  6. Moin Bastian,
    danke für die schnelle Antwort. Sicher, die Hauptaufgabe des Voralarms ist die Erinnerung für den Eigentümer/Bewohner. Bisher habe ich noch bei allen Sensoren den „Arming/Disarming Delay“ eingeschaltet. Vielleicht sollte ich das noch mal überdenken und dies nur bei Haustür und ggf. bei den Motion Sensoren schalten. Ich gebe Dir Recht wenn jemand überraschend durch die Terrassentür kommt, dann braucht es keine Warnung mehr.
    Trotzdem fände ich es interessant, wie man in der Szene mehrere Sensoren berücksichtigen könnte. Ein Beispiel wäre ein separater Hauseingang durch die Garage. Wenn der Voralarm nur auf das Öffnen der Haustür reagiert könnte man beim Entladen seines Fahrzeugs böse überrascht werden. Ich weiß, das ist ein wenig konstruiert, aber ich finde die Frage nicht so unnütz und bin zurzeit noch durch meine rudimentären LUA Kenntnisse eingeschränkt und auf Hilfe von „Profis“ angewiesen.
    Viele Grüße
    Alex

    • Hallo Alex,

      ich wollte nicht sagen, dass Deine Frage unnütz sei, aber die Einbindung eines weiteren Sensors für den Voralarm ist nicht ganz trivial und würde die Überarbeitung der ganzen Szene bedeuten, sobald ich Zeit finde schaue ich es mir mal intensiver an.

      Grüße
      Bastian

      • Hi Bastian,
        Klar, kein Problem. Hatte ich auch so nicht verstanden. Wenn Du mal Zeit und Lust hast wärs prima wenn Du noch ne Idee zum Thema hast.
        Vielen Dank und Grüße
        Alex

  7. Moin Basti – ein sehr interessantes Skript! Bin gerade dabei das zu integrieren und habe versucht signalTimeSplit auf zwei Werte zu reduzieren, sodass auch nur zwei Mal der Beep ertönt. Bei mir haut das allerdings nicht hin. Es sind immer mindestens drei Signalisierungen – eine davon sehr früh. Kann das sein?

    • Moin Hannes,

      in Zeile 106 des Sktiptes findest Du den Grund dafür. Die erste Erinnerung wird sofort beim Einstieg in die Schleife (108-120) ausgeführt. Wenn Du die Variable signalTimeSplit aufd zwei Werte reduziert hast, dann sollten also insgesamt 3 Töne erklingen. Um die sofortige Erinnerung zu deaktivieren kannst Du einfach die Zeile 106 löschen oder auskommentieren (–).

      Grüße
      Bastian

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Ich akzeptiere