Mini Alarmanlage ohne AlarmModul

Begonnen von thgorjup, 02 Juni 2018, 15:55:05

Vorheriges Thema - Nächstes Thema

thgorjup

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


FHEM auf Ubuntu 18.04LTS, 2x nanoCUL, JeeLink, nanoPIR, MQTT, ESP-Easy, HUE.
Sensoren+Aktoren: HM, IT, Lacrosse, Multitrade-PIR, VU+, Somfy