Hallo, auf mehrfachen Wunsch dokumentiere ich hier meine Mini-Alarmanlage.
Funktion:
- Fenster- und Türkontakte als Auslöser
- Funkgong und Rauchmelder als Alarmgeber
- Aktivierung- und Deaktivierung manuell durch Fernbedienungen (user1, user2, user3)
- Automatische Aktivierung um 00:30 Uhr
- Automatische Deaktivierung um 06:00 Uhr
- Verzögerte Auslösung mit Warnton beim Betreten der Wohnungstür
- Pushover und Anruf für Signalisierung bei Auslösung
Geräte:
- HM-SEC-SCo (Optische Tür-/Fensterkontakte)
- HM-OU-CFM-TW Funkgong für Sirene und Ansagen
- HM-SEC-SD-2 Rauchmelder Mitnutzung als Sirene
- HM-OU-LED16 Statusanzeige (Zustand Alarmanlage, Fenster und Türen)
Weitere Voraussetzungen:
- Konfiguriertes Pushover (für Smartphone Benachrichtigung)
- Evtl. konfigurierter SipClient (für Anruf Benachrichtigung)
- Einige MP3-Texte für die Zustände, Töne und Sirene der Alarmanlage (Siehe unten als Download).
- Konfiguriertes Rauchmelder Teaming
Hier verwendete MP3's:
001_Alarm_Countdown
002_Alarm
003_Sirene
004_Beep
005_Alarmanlage_scharf
006_Alarmanlage_unscharf
020_Alarmanlage_Terrassentür_offen
021_Alarmanlage_Fentser_Fitness_offen
022_Alarmanlage_Fenster_Gäste-WC_offen
023_Alarmanlage_Haustür_offen
024_Alarmanlage_Fenster_Küche_offen
LOS GEHT'S!
Zunächst werden zwei Dummies angelegt, um den Zustand der Alarmanlage und die Art der Scharfschaltung (manuell/automatisch) darzustellen.
define Alarmanlage dummy
attr Alarmanlage devStateIcon on:ios-on-green off:ios-off
attr Alarmanlage group Zustände
attr Alarmanlage icon ring
attr Alarmanlage room Alarmanlage
attr Alarmanlage setList on off
attr Alarmanlage sortby 10
define RemoteArm dummy
attr RemoteArm devStateIcon on:ios-on-green off:ios-off
attr RemoteArm group Zustände
attr RemoteArm icon it_remote
attr RemoteArm room Alarmanlage
attr RemoteArm setList on off
Jetzt folgen ein paar Scripte, welche man unter "Edit files > 99_myUtils.pm" speichert.
Es sind natürlich die Bezeichnungen der Fenster- und Türkontakte anzupassen:
# Ablauf Auslösen der Alarmanlage
sub Alarm($) {
my ($action) = @_;
fhem("set pushmsg msg 'fhem' 'Alarmanlage hat durch $action ausgelöst!'");
# Abspielen der Sirene (002) 40x mit Laustärke 10
fhem("set FunkGong_MP3 playTone 002 40 10");
# Alle Rauchmelder auslösen
fhem("set Rauchmelder_Team alarmOn");
# Rolläden öffnen
fhem("set Rolladen_Nord pct 100") if (ReadingsVal("Rolladen_Nord","pct","0") < 100);
fhem("set Rolladen_Sued pct 100") if (ReadingsVal("Rolladen_Sued","pct","0") < 100);
# Alle Philips HUE Leuchten blinken lassen
fhem("set HUEGroup0 alert lselect");
# Funkgong LED blinken lassen
fhem("set FunkGong_LED led redS 60");
# Anruf an mein Smartphone
fhem("set MySipClient call 017112345678 30 !Die Alarmanlage hat durch $action ausgelöst");
}
# Ablauf beim Schärfen der Alarmanlage
sub Alarm_Scharf($) {
my ($user) = @_;
my $i;
my $zustand;
my $noarm = 0;
# Alarmanlagen Devices
# HM_5D4130 = Terrassentür; ETC:
my @device_name = ("Haustuer","Terassentuer","Fenster1","Fenster2","Fenster3");
# MP3 Töne für Warnungen
# (020) = Achtung! Die Alarmanlage konnte nicht schraf geschaltet werden, weil die Terrassentür noch geöffnet ist
my @mp3 = ("020","021","022","023","024");
# Loop über alle Devices
for ($i = 0; $i <= $#device_name; $i++) {
$zustand = ReadingsVal($device_name[$i], "state", "0");
if ($zustand eq "open") {
fhem("set FunkGong_MP3 playTone $mp3[$i]");
$noarm = 1;
}
}
if ($noarm == 0) {
fhem("set Alarmanlage on");
fhem("set FunkGong_MP3 playTone 004,005 1 6");
fhem("set FunkGong_LED led redL");
if ($user ne "auto") { fhem("set pushmsg msg 'fhem' 'Alarmanlage scharf ($user)!'"); }
}
}
# Ablauf bein Entschärfen der Alarmanlage
sub Alarm_Unscharf($) {
my ($user) = @_;
fhem("delete temp_alarm");
fhem("set RemoteArm off");
fhem("set Rauchmelder_Team alarmOff") if (ReadingsVal("Rauchmelder_Team","smoke_detect","0") ne "none");
fhem("set FunkGong_MP3 off");
fhem("set FunkGong_LED off");
# Beep + Ansage unscharf + Begrüßung des Users
if ($user eq "user1") { fhem("set FunkGong_MP3 playTone 004,006,010"); }
if ($user eq "user2") { fhem("set FunkGong_MP3 playTone 004,006,011"); }
if ($user eq "user3") { fhem("set FunkGong_MP3 playTone 004,006,012"); }
if ($user ne "auto") { fhem("set pushmsg msg 'fhem' 'Alarmanlage unscharf ($user)!'"); }
fhem("set HUEGroup0 alert none");
fhem("set Alarmanlage off") if (ReadingsVal("Alarmanlage","state","0") ne "off");
}
Jetzt kommen drei DOIF's um die die Alarmanlage scharf/unscharf zu schalten und im Einbruchsfall auszulösen.
AlarmanlageScharf (Natchs um 00:30 Uhr sowie über Fernbedienungen (AliRF_XXXXXX).
define AlarmanlageScharf DOIF ( [Alarmanlage] eq "off" && [00:30] ) ( {Alarm_Scharf("auto")} )\
DOELSEIF ( [Alarmanlage] eq "off" && ( time() - time_str2num(ReadingsTimestamp("Alarmanlage","state","0")) > 2 ) && [AliRF_589E10:motion] ) ( set RemoteArm on;; {Alarm_Scharf("user1")} )\
DOELSEIF ( [Alarmanlage] eq "off" && ( time() - time_str2num(ReadingsTimestamp("Alarmanlage","state","0")) > 2 ) && [AliRF_0A2E10:motion] ) ( set RemoteArm on;; {Alarm_Scharf("user2")} )\
DOELSEIF ( [Alarmanlage] eq "off" && ( time() - time_str2num(ReadingsTimestamp("Alarmanlage","state","0")) > 2 ) && [AliRF_00B3A0:motion] ) ( set RemoteArm on;; {Alarm_Scharf("user3")} )\
AlarmanlageUnscharf (Morgens um 06:00 Uhr sowie über Fernbedienungen (AliRF_XXXXXX).
define AlarmanlageUnscharf DOIF ( [06:00] && [RemoteArm] eq "off" ) ( set Alarmanlage off;; {Update_Statusanzeige_LED("all")} )\
DOELSEIF ( [Alarmanlage] eq "on" && ( time() - time_str2num(ReadingsTimestamp("Alarmanlage","state","0")) > 2 ) && [AliRF_589D9C:motion] ) ( {Alarm_Unscharf("user1")} )\
DOELSEIF ( [Alarmanlage] eq "on" && ( time() - time_str2num(ReadingsTimestamp("Alarmanlage","state","0")) > 2 ) && [AliRF_0A2D3C:motion] ) ( {Alarm_Unscharf("user2")} )\
DOELSEIF ( [Alarmanlage] eq "on" && ( time() - time_str2num(ReadingsTimestamp("Alarmanlage","state","0")) > 2 ) && [AliRF_00B31C:motion] ) ( {Alarm_Unscharf("user3")} )\
attr AlarmanlageUnscharf do always
AlarmanlagenSteuerung: (erst nachdem scharf geschalten wurde und 60 Sekunden vergangen sind, reagiert die Alarmanlage auf die Haustür)
define AlarmanlagenSteuerung DOIF ( [Alarmanlage] eq "on" && [Haustuer] eq "open" && ( time() - time_str2num(ReadingsTimestamp("Alarmanlage","state","0")) > 60 ) )\
( define temp_alarm at +00:00:18 {Alarm("Haustür")};; set FunkGong_MP3 playTone 001 )\
\
DOELSEIF ( [Alarmanlage] eq "on" && ( [Terrassentuer] eq "open" || [HM_5D4130] eq "open" ) )\
( {Alarm("Terrassentür")} )\
\
DOELSEIF ( [Alarmanlage] eq "on" && [Fenster1] eq "open" )\
( {Alarm("Fenster Fitness")} )\
\
DOELSEIF ( [Alarmanlage] eq "on" && [Fenster2] eq "open" )\
( {Alarm("Fenster Gäste-WC")} )\
\
DOELSEIF ( [Alarmanlage] eq "on" && [Fenster3] eq "open" )\
( {Alarm("Fenster Küche")} )\
\
attr AlarmanlagenSteuerung do always
Letztendlich noch die Updates der Statusanzeige (falls gewünscht).
Im DOIF werden einfach alle Gerätebezeichnungen aufgeführt
DOIF
define UpdateStatusanzeige DOIF ( [Haustuer] || [Terassentuer] || [Fenster1] || [Fenster2] || [Fenster3] || || [Alarmanlage] ) ( { Update_Statusanzeige_LED("$DEVICE") } )
attr UpdateStatusanzeige do always
Und nochmal ein Script zur Speicherung in 99_myUtils.pm
# Statusanzeige LED Farben setzen
sub Update_Statusanzeige_LED($) {
my ($action) = @_;
my $i;
my $zustand;
my $led;
my $farbe;
# Devices mit eq und ne Prüfung
my @device_name = ("Haustuer","Terrassentuer","Fenster1","Fenster2","Fenster3","Alarmanlage");
my @device_reading = ("state","state","state","state","state","state");
my @led_name = ("Status_Haustuer","Status_Terrassentuer","Status_Fenster1","Status_Fenster2","Status_Fenster3","Status_Alarmanlage");
my @reading_green = ("closed","closed","closed","closed","closed","off");
# Loop über alle Devices
for ($i = 0; $i <= $#device_name; $i++) {
if ($action eq $device_name[$i] || $action eq "all") {
# Aktuellen Zustand lesen
$zustand = ReadingsVal($device_name[$i], $device_reading[$i], "0");
# LED ermitteln
$led = $led_name[$i];
# Farbe setzen
if ($zustand eq $reading_green[$i]) {
$farbe = "green";
} elsif ($zustand ne $reading_green[$i]) {
$farbe = "red";
} else {
$farbe = "off";
}
# LED setzen
fhem("set $led led $farbe") if (ReadingsVal("Statusanzeige","state","0") ne $farbe);
}
}
}
Nachfolgend noch meine MP3-Sammlung für den Funkgong.
Viel Spaß damit.
Gruß
Thomas