Alarm - Fehlalarme minimieren

Hallo,

aus irgendwelchen Gründen, löst meine Bewegungsmelder in Küche häufiger, spontan aus. Die Folge sind gelegentliche Fehlalarme. Nun ist mir in einem Gespräch mit eine Loxone-User die Idee gekommen, genau wie in diesem System, den Alarm so zu programmieren, dass der Alarm erst auslöst, wenn zwei Sensoren in einem Zeitintervall ausgelöst haben. Sprich:

  1. Fenstersensor = unscharf -> 1min warten, ob etwas passiert
  2. BewFlur = unscharf in dieser Minute = ALARM
  3. kein weiterer Sensor unscharf in dieser einen Minute = zurücksetzen und kein Alarm

Dieses Vorgehen würde die Anzahl der Fehlalarm in jedem System deutlich minimieren. Unter der Voraussetzung, dass eh in jedem Raum ein Motion Sensor/ Fensterkontakte verbaut ist, wäre es dennoch sicher.

Meine Frage nun: Wie kann ich das mit meiner HC2 umsetzen? Habt ihr Ideen?

Hallo Eldar,

interessante Idee. Auf Grund der gelegentlichen Fehlalarme habe ich all meine Motion Sensoren aus dem Alarmsystem entfernt. Alle sonstigen Eingänge und Fenster sind mit Sensoren versehen. Ich bilde mir ein, dass ein Einbrecher den Kontakt auslöst und nicht einfach das Fenster einschlägt und durchsteigt.

Aber zu Deiner Herausforderung: Das dürfte zumindest mit dem HC2 Alarmpanel nicht möglich sein, da jede Auslösung eines Alarmsensors den Alarm auslöst.
Möglich wäre es ggf., wenn Du eine Szene schreibst die den Status der Sensoren prüft ohne dass sie “armed” sind. Dazu Alarm An/Aus mittels globaler Variable. Du würdest aber allen Komfort der Apps etc. dadurch verlieren und müsstest alles selbst erfinden.

Ich möchte jetzt doch nochmal diesen Thread auskramen. Nachdem ich die Sensibilität meiner Motion Sensoren nun bereits gesenkt habe (zu lasten des direkten Licht einschaltens am Abend :frowning: ) bekomme ich nach wie vor vereinzelte Fehlalarme. Immer unterschiedlich. Das nervt :slight_smile:

Daher noch einmal die Idee, dass die Alarmszene nur beim Auslösen von 2 Sensoren in einer vorher festgelegten Zeit triggert. Dazu brauch man das Alarmpanel nicht. Was mir jedoch dafür fehlt ist eine Idee/ der Code für diese Zeitvariable. Habt ihr da Ideen?

Kann man das sinnvoll mit einer Variablen machen? Wenn Motion = Zeitintervall -> 1; wenn Zeitintervall = 1 und Motion = Alarm; wie setzte ich die Zeitvariable dann nach der Zeit X automatisch wieder auf 0?

Danke für eure Ideen

Eldar,

dass lässt sich relativ einfach über eine Variable lösen.
Lege eine Variable z.B. Auslösezeit an:
Jedes mal wenn du einen Alarm bekommst und der Auslösesensor Motion ist, frage nach ob (os.time() - Auslösezeit) < 60 ist.
Wenn ja Alarm auslösen wenn nicht Auslösezeit = os.time().
Musst nur sicherstellen dass du einen numerischen Wert das erste Mal reinschreibst (Wenn du die Variable anlegst)
Das ganze geht dann ohne komplizierte Abfragen.

Danke für die schnelle Antwort mdietinger! Verstehe ich leider nur so halb :slight_smile: Ich lege die Variable an und dann?

… programmierst du :wink:

boomx, genau.

Eldar,

kannst mal Deine Alarm Szene posten?

… nur als Anregung: Kaufe mindestens einen weiteren Motion Sensor und platziere ihn oder sie im sensiblen Bereich. Ich habe das so gelöst:
Wenn 3 MS im Wohnzimmer (Sind in 3 Ecken des zu überwachenden Bereichs platziert) gleichzeitig auslösen, dann werden diverse Reaktionen aktiviert (Sirene, Push, Licht an (je nach Tageszeit)). Damit schliesst man Fehlauslösungen aus.

Darf ich fragen auf welche Werte Ihr eure Motion Sesnoren gestellt habt, um Fehlalarme zu reduzieren?

Würde auch gerne testen, ob das als erste Instanz reicht. Habe ähnliche Probleme, wie von Eldar beschrieben…

Mit Parameter Änderungen wirst Du wahrscheinlich nicht allzuviel erreichen.
Das Problem liegt eher an der Arbeitsweise der Sensoren und den externen Einflüssen welche Fehlauslösungen produzieren.
Jene Sensoren welche im Innenraum ohne direkte Sonneneinstrahlung liegen haben in der Regel keine Fehlauslösungen.
Auch Außennbereich im dauerhaften Schatten sind kein Problem.
Sobald die Sonne (und Wolken) ins Spiel kommen fängt das Problem an.
Alle Sensoren die ich kenne haben einen weiten Erfassungsbereich(Rund) und decken damit eine sehr große Fläche ab.
Damit kann man sie nicht optimal auf den relevanten Bereich ausrichten und hat damit mehr Störeinflüsse.
Idealerweise sollten die Bewegungssensoren auF Radar Basis sein um Fehlauslösungen zu reduzieren.
Aber da habe ich leider noch nichts auf Z-Wave Basis gefunden.
Entweder selbst Bau oder mit Fehlauslösungen Leben lernen.
Eine weitere Möglichkeit könnte auch sein den “Sichtbereich” des Sensors durch abkleben zu verkleinern. (Müsste ich mal experimentieren)

Ich denke auch, dass das Feintuning der Parameter nicht besonders viel bringt. Daher ja die Idee, mit einem Zeitfenster zu arbeiten.

So, ich komme jetzt erst wieder dazu mich mit dem Thema zu befassen. @boomx + mdietinger: Mit der os.time sagt mir leider nicht viel, bzw konnte ich mir da auch mit google keinen Reim bzgl. der Arbeitsweise daraus machen.

Mein Ansatz wäre: Sensor breached -> Variable auf 1 -> neuer Breach während Variable auf 1 = Alarm, keine neuer Breach setze Variable nach 1 Minute zurück auf 0.

Danke :slight_smile:

Eldar,

os.time() liefert dir die UNIX Zeit in Sekunden seit dem 1.1.1970(wenn ich nicht komplett falsch liege)
Wenn Du bei jeder Melder auslösung os.time in eine Variable schreibst kannst du elegant prüfen wieviele Sekunden seit der letzten Auslösung vergangen sind.
Nachdem du die selbe Variable für alle Melder nimmst brauchst du nicht Melder für Melder prüfen.
Falls du dein Haus in Segmente eineilst dann kannst du mehrere Variablen verwenden.

Einzige logik ist prüfen ob letzter Breach innerhalb x Sekunden ist, wenn nicht Variable auf neue Zeit abdaten

Klingt gut! Danke für die Erklärung! Nur wie umsetzen? Kann mir jemand mit einem Code-Schnipsel weiterhelfen der die os.Time in die Variable X schreibt und abfragt bzw die 60 Sekunden erkennt? Ich habe keine Ahnung wie das aussehen könnte…Den Rest sollte ich selber hinbekommen. Würde das ganze dann auch hier wieder posten :slight_smile:

Eldar,

here you go. (Nehme an du verwendest das Alarmscript von SIIO (rfid_alarm variable)
Untenstehenden Code in ein eigenes Script.
Alle Bewegungsmelder bei XXX eintragen.
Variable Last_Alarm anlegen und auf z.b. 1 setzen.
Wichtig du darfst die Bewegungsmelder nicht scharf stellen damit sie keinen Alarm auslösen.
Alarm könntest Du z.B mit einer Variable auslösen (z.B. BEWEGUNG=1).
Die Variable als Trigger für Dein Alarmscript nehmen. (Beim Scharfstellen muss du sie auf 0 setzten)

--[[
%% properties
XXX value
XXXvalue

--]]

if (fibaro:getGlobalValue("rfid_alarm") == '1' ) then -- nur ausführen wenn Alarmanlage scharf ist
 local trigger = fibaro:getSourceTrigger()
 local ID = tonumber(trigger['deviceID'])
 local lastAlarm =  tonumber(fibaro:getGlobalValue("Last_Alarm"))
 fibaro:debug("Device: " ..ID)

   if (tonumber(fibaro:getValue(ID, "value")) > 0 )then
    	fibaro:debug("open")    
  	if os.time() - lastAlarm >60 then
    fibaro:setGlobal("Last_Alarm",os.time())
		fibaro:debug((os.time() - lastAlarm) .."s - update Zeit")
		
	else
		fibaro:setGlobal("Last_Alarm",os.time())
		fibaro:debug((os.time() - lastAlarm) .."s - Alarm ausgelöst!!!!!")
		--AUFRUF ALARMSCRIPT ODER VARIABLE SETZEN	
	end
  end
end

Danke :slight_smile:

Habe eben meine anderen Skripte umgeschrieben (damit er weiterhin meldet ob noch Fenster etc offen sind). Nun habe ich jedoch folgendes Problem. Habe die Variable alarm und Last_Alarm angelegt und verwende folgenden Code:

--[[
%% properties
81 value 
65 value 
54 value 
122 value 
152 value 
154 value 
106 value 
%% globals
alarm
--]]
 
if (fibaro:getGlobalValue("alarm") == 'an' ) then -- nur ausführen wenn Alarmanlage scharf ist
 local trigger = fibaro:getSourceTrigger()
 local ID = tonumber(trigger['deviceID'])
 local lastAlarm =  tonumber(fibaro:getGlobalValue("Last_Alarm"))
 fibaro:debug("Device: " ..ID)
 
   if (tonumber(fibaro:getValue(ID, "value")) > 0 )then
    	fibaro:debug("open")    
  	if os.time() - lastAlarm >60 then
    fibaro:setGlobal("Last_Alarm",os.time())
		fibaro:debug((os.time() - lastAlarm) .."s - update Zeit")
		
	else
		fibaro:setGlobal("Last_Alarm",os.time())
		fibaro:debug((os.time() - lastAlarm) .."s - Alarm ausgelöst!!!!!")
	
	end
  end
end

Leider bekomme ich dann das als debug:

Direkt beim schärfen:
[DEBUG] 19:42:49: line 18: attempt to concatenate local ‘ID’ (a nil value)

und beim auslösen:
[DEBUG] 19:47:39: Device: 122
[DEBUG] 19:47:39: open
[DEBUG] 19:47:39: line 22: attempt to perform arithmetic on local ‘lastAlarm’ (a nil value)
[DEBUG] 19:48:09: Device: 81
[DEBUG] 19:48:10: Device: 122

Weiß jemand wo der Fehler liegt?

Vielen vielen Dank schonmal :slight_smile:

Hast du die Variable Last_Alarm im Variablen Pannel definiert und mit einem Numerischen Wert befüllt. Z.b.1?

Weiters musst du den alarm trigger nach %%globals rauswerfen.
Was Du dann noch brauchst ist Dein Alarmskript aufzurufen, oder eine Variable als Trigger zu setzen

Juhu. Funktioniert alles wie gewollt. Ich lasse das Script eine Scene triggern, die dann wiederum die Sonos Boxen, RGWB und Hue befeuert. Letztes Manko; wenn der Alarm scharf ist, ich die Haustür öffne und zum Tag-Reader gehe lösen logischerweise Haustür und der Bewegungsmelder im Flur aus, da unter 60 Sekunden. Wie könnte man denn jetzt noch eine Delay-Time einbauen? Wenn ich die in die Alarmszene baue dann startet sie ja am Ende trotzdem…Einfach zwischen Zeile 26/27 einbauen?

--[[
%% properties
81 value 
65 value 
54 value 
122 value 
152 value 
154 value 
106 value 
--]]
 
if (fibaro:getGlobalValue("alarm") == 'an' ) then -- nur ausführen wenn Alarmanlage scharf ist
 local trigger = fibaro:getSourceTrigger()
 local ID = tonumber(trigger['deviceID'])
 local lastAlarm =  tonumber(fibaro:getGlobalValue("Last_Alarm"))
 fibaro:debug("Device: " ..ID)
 
   if (tonumber(fibaro:getValue(ID, "value")) > 0 )then
    	fibaro:debug("open")    
  	if os.time() - lastAlarm >60 then
    fibaro:setGlobal("Last_Alarm",os.time())
		fibaro:debug((os.time() - lastAlarm) .."s - update Zeit")
		
	else
		fibaro:setGlobal("Last_Alarm",os.time())
		fibaro:debug((os.time() - lastAlarm) .."s - Alarm ausgelöst!!!!!")
	    fibaro:startScene(58)
	end
  end
end

Eldar,

dies ist mein Grundgerüst des Alarmskripts.
Wenn ein Alarm ausglöst hat hat mein 30" die Anlage zu entschärfen.
Ich lass die Sirene 2 x piepen um darauf hinzuweisen.
Du könntest Sonos verwenden um Hinzuweisen das Vorausgelöst wurde.

local start_alarm = 30
local max_alarm = 600
local count = 1 
 

while true do  -- Infinite loop
  
  if (fibaro:getGlobalValue("alarm") ~= 'an' ) then  --Alarmanlage wurde entschärft Script abbrechen
    -- Optional 
    if (count > start_alarm) then
		-- Code um Sirene abzuschalten
    end
      fibaro:abort()
  end  
  
  if (fibaro:getGlobalValue("alarm") == 'an' and count == 1) then --Alarm wurde ausgelöst, Voralarm 30" Zeit um Anlage zu entschärfen.
     -- Information über Voralarm 
   end
  
  if (count == start_alarm) then -- Alarm
	-- Code für Alarm
  end
 
  if (count == max_alarm) then --max Alarmzeit erreicht
   -- Wir sollten die Nachbarn nicht ewig nerven
		fibaro:abort()
   end
 
  -- Increase the value of a by 1
  count = count + 1
   -- Wait 1 second (1000 milliseconds)
  fibaro:sleep(1000)
 end

Sorry, ich war beruflich unterwegs und komme jetzt erst wieder dazu :slight_smile:

Hm, so richtig verstehe ich das obere Script nicht…Habe eben folgendes probiert: Nach auslösen von zwei Sensoren innerhalb des Zeitfensters und ablaufen von erneut 60 Sekunden (sleep(…)) wird einen Variable auf EIN gesetzt. Ist diese Variable EIN löst meine Alarmszene aus und es kommt Stimmung in die Bude. Nun habe ich versucht, diese Variable mit dem deaktivieren des Alarms über RFID auf AUS zu setzen und gehofft, dass dann der Alarm auch aus bleibt. Natürlich passiert das nicht! Nach den besagten 60 Sekunden triggert das HomeCenter brav die Variable auf EIN und die Party beginnt.
Wie bekomme ich das am besten gelöst? Sprich, wie kann ich mein System dazu verdonnern, dass es bei rfid_alarm OFF egal was passiert die Variable ALARM nicht auf EIN schaltet bzw nur bei rfid_alarm ON diese Variable unter den oben genannten Bedingungen triggert.

Danke für eure Hilfe :slight_smile:

Hmm schwer ohne die Szene zu sehen.
könntest z.B.
Im Bewegungsmelder Skript nach dem Sleep noch fragen ob alarm noch “an” ist.
Wenn ja dann Alarmskript, wenn nein dann Skript Ende.