Da tenkte jeg å presentere alarmsystemet mitt. Det er sikkert noen som kan hente ut litt tips eller inspirasjon ut av det.
Mitt mål var at det skulle gjøre minst mulig ut av seg. Verken jeg eller kona kommer til å gidde med å slå av og på alarm med kodetasting. Og der er jeg vel nå, synes jeg. Har ikke hatt behov for å trykke inn kode på månedsvis.
I tillegg til avslått har systemet 3 tilstander - armert hjemme, natt og borte.
Armert natt er enkel. Den tilstanden blir slått på og av kun basert på en status på om det er sovetid eller ikke.
Armert hjemme blir slått av og på basert på bevegelsesensorer i gang foran utgangsdør og innvendig i garasje. Er vi i 2. etg og utgangsdør blir åpnet så går alarmen. Men går jeg ned en etasje og åpner døren selv så er alarmen avslått i det jeg blir sett av bevegelsesensoren.
Armert borte blir aktivert så snart huset er tomt. Her bruker jeg tilstanden for om "noen er hjemme" som baserer seg på mer enn 10 forskjellige innganger. Alarmen blir avslått så snart jeg eller kona sin telefon kommer innenfor en gitt avstand til huset. Vanligvis er alarmen avslått 10s før garasjeporten åpnes.
Hvis dør, vindu eller port åpnes uten at vi er i nærheten, så går alarmen etter 30s. Men det sendes en beskjed til telefonene om å oppdatere posisjonsstatus og hvis denne kommer og er innenfor en gitt avstand i løpet av 30s så blir alarm avslått. Og har en av oss glemt telefonen hjemme, så kan jeg sette en status på det også for å hindre alarmen i å bli avslått.
Varsling er også forskjellig i de tre tilstandene. Ved armert borte blir det varslet kun på telefon, men det blir også tatt et bilde av inngangspartiet. Ved armert natt blir kun lyset på soverommet slått på. Og ved armert hjemme vil det blinke et kort blink i lyset i noen utvalgte rom.
Ved brannalarm så vil jeg ikke sette i gang med støvsuging hvis noen studerer koden og stusser på den saken. Scene.stovsuge er fullt lys i hele huset og det er jo greit å ha ved brann også. Så da ble det til at det ble valgt.
Systemet er det som er innebygd i Home Assistant og der jeg har lagd all automasjon rundt dette med Appdaemon.
I alarm.py
import appdaemon.plugins.hass.hassapi as hass
class AlarmTrigger(hass.Hass):
def initialize(self):
for tr in self.args["triggers"]:
self.listen_state(self.trig, tr, new = "on", old = "off")
def trig(self, entity, attribute, old, new, kwargs):
if self.get_state("alarm_control_panel.hjemmealarm") == self.args["state"]:
self.call_service("variable/set_variable", variable = "alarm_trigger", value = self.get_state(entity, attribute="friendly_name"))
self.call_service("alarm_control_panel/alarm_trigger", entity_id = "alarm_control_panel.hjemmealarm")
self.call_service("notify/mobile_app_sm_g955f", message = "request_location_update")
self.call_service("notify/mobile_app_sm_g930f", message = "request_location_update")
self.log('Alarm utløst')
class Arm(hass.Hass):
def initialize(self):
self.listen_state(self.armhome, "binary_sensor.gang_1_etg_presence", new = "off", old = "on", duration = 300)
self.listen_state(self.armhome, "binary_sensor.gang_u_etg_presence", new = "off", old = "on", duration = 300)
self.listen_state(self.armhome, "binary_sensor.garasje_presence", new = "off", old = "on", duration = 300)
self.listen_state(self.disarmhome, "binary_sensor.gang_1_etg_presence", new = "on", old = "off")
self.listen_state(self.disarmhome, "binary_sensor.gang_u_etg_presence", new = "on", old = "off")
self.listen_state(self.disarmhome, "binary_sensor.garasje_presence", new = "on", old = "off")
self.listen_state(self.armnight, "input_boolean.sleeptime", new = "on", old = "off")
self.listen_state(self.disarmnight, "input_boolean.sleeptime", new = "off", old = "on")
self.listen_state(self.armaway, "binary_sensor.noen_er_hjemme", new = "off")
self.listen_state(self.disarmaway, "person.__________", new = "home")
self.listen_state(self.disarmaway, "person.__________", new = "home")
def armhome(self, entity, attribute, old, new, kwargs):
if ( self.get_state("alarm_control_panel.hjemmealarm") == "disarmed"
and self.get_state("binary_sensor.gang_1_etg_presence") == "off"
and self.get_state("binary_sensor.gang_u_etg_presence") == "off"
and self.get_state("binary_sensor.garasje_presence") == "off" ):
self.call_service("alarm_control_panel/alarm_arm_home", entity_id = "alarm_control_panel.hjemmealarm", code = "xxxx")
def disarmhome(self, entity, attribute, old, new, kwargs):
if self.get_state("alarm_control_panel.hjemmealarm") == "armed_home":
self.call_service("alarm_control_panel/alarm_disarm", entity_id = "alarm_control_panel.hjemmealarm", code = "xxxx")
def armnight(self, entity, attribute, old, new, kwargs):
self.call_service("alarm_control_panel/alarm_arm_night", entity_id = "alarm_control_panel.hjemmealarm", code = "xxxx")
def disarmnight(self, entity, attribute, old, new, kwargs):
self.call_service("alarm_control_panel/alarm_disarm", entity_id = "alarm_control_panel.hjemmealarm", code = "xxxx")
def armaway(self, entity, attribute, old, new, kwargs):
self.call_service("alarm_control_panel/alarm_arm_away", entity_id = "alarm_control_panel.hjemmealarm", code = "xxxx")
def disarmaway(self, entity, attribute, old, new, kwargs):
if ((self.get_state("alarm_control_panel.hjemmealarm") == "pending" or self.get_state("alarm_control_panel.hjemmealarm") == "armed_away")
and self.get_state("input_select.phone_status") == "Auto"):
self.call_service("alarm_control_panel/alarm_disarm", entity_id = "alarm_control_panel.hjemmealarm", code = "xxxx")
self.log('Slo av alarm automatisk')
class NotifyCommon(hass.Hass):
def initialize(self):
self.listen_state(self.notify, "alarm_control_panel.hjemmealarm", new = "triggered")
def notify(self, entity, attribute, old, new, kwargs):
self.call_service("script/send_melding", title = "Alarm {}".format(self.get_state("sensor.time")), message = "Alarm er utløst av {}".format(self.get_state("variable.alarm_trigger")))
self.call_service("camera/snapshot", entity_id = "camera.kamera1_cam", filename = "www/snapshot_alarm.jpg")
class NotifyHome(hass.Hass):
def initialize(self):
self.listen_state(self.notify, "alarm_control_panel.hjemmealarm", new = "triggered", old = "armed_home", duration = 5)
def notify(self, entity, attribute, old, new, kwargs):
self.turn_on("light.stue", flash = "short")
self.turn_on("light.kjoekken", flash = "short")
self.turn_on("light.bad_u_etg", flash = "short")
self.turn_on("light.soverom_u_etg", flash = "short")
self.turn_on("light.garasje", flash = "short")
self.turn_on("light.vaskerom", flash = "short")
class NotifyNight(hass.Hass):
def initialize(self):
self.listen_state(self.notify, "alarm_control_panel.hjemmealarm", new = "triggered", old = "armed_night")
def notify(self, entity, attribute, old, new, kwargs):
self.turn_on("light.soverom_u_etg", brightness = 200)
class NotifyFire(hass.Hass):
def initialize(self):
self.listen_state(self.notify, "binary_sensor.brannvarsler", new = "on", old = "off")
def notify(self, entity, attribute, old, new, kwargs):
self.turn_on("scene.stovsuge")
self.call_service("script/send_melding", title = "BRANN!!", message = "Brannvarsling utløst!!!!")
self.log("Brannvarsling utløst!!!!")
I alarm.yaml
awayalarmtrigger:
module: alarm
class: AlarmTrigger
triggers:
- binary_sensor.garasjeport
- binary_sensor.hoveddor
- binary_sensor.gang_1_etg_presence
- binary_sensor.gang_u_etg_presence
- binary_sensor.garasje_presence
- binary_sensor.hagestue_dor
- binary_sensor.garasjedor
- binary_sensor.hoveddor_u_etg
- binary_sensor.boddor
- binary_sensor.stue_og_kjokken_presence
- binary_sensor.glassdor_b
- binary_sensor.glassdor_c
- binary_sensor.vindu_2_etg_a
- binary_sensor.vindu_2_etg_b
state: armed_away
homealarmtrigger:
module: alarm
class: AlarmTrigger
triggers:
- binary_sensor.garasjeport
- binary_sensor.hoveddor
- binary_sensor.garasjedor
- binary_sensor.hoveddor_u_etg
- binary_sensor.boddor
state: armed_home
nightalarmtrigger:
module: alarm
class: AlarmTrigger
triggers:
- binary_sensor.garasjeport
- binary_sensor.hoveddor
- binary_sensor.garasje_presence
- binary_sensor.hagestue_dor
- binary_sensor.garasjedor
- binary_sensor.hoveddor_u_etg
- binary_sensor.boddor
- binary_sensor.glassdor_b
- binary_sensor.glassdor_c
- binary_sensor.vindu_2_etg_a
- binary_sensor.vindu_2_etg_b
state: armed_night
arm:
module: alarm
class: Arm
notifycommon:
module: alarm
class: NotifyCommon
notifyhome:
module: alarm
class: NotifyHome
notifynight:
module: alarm
class: NotifyNight
notifyfire:
module: alarm
class: NotifyFire
I configuration.yaml
alarm_control_panel:
- platform: manual
code_arm_required: false
name: Hjemmealarm
code: xxxx
pending_time: 30
delay_time: 60
trigger_time: 4
disarmed:
trigger_time: 0
armed_home:
pending_time: 0
delay_time: 0
trigger_time: 300
armed_night:
pending_time: 0
delay_time: 0
triggered:
pending_time: 0