Beveiliging

Een slim huis kan uiteraard niet zonder goed alarmsysteem. Gezien de aard van een ‘slim huis’ willen we een alarmsysteem dat automatisch aangeschakeld wordt op het moment dat de bewoners het huis verlaten en bij terugkomst ook automatisch uitgeschakeld wordt. Daarnaast willen we meldingen ontvangen van rook– en waterlekkage-sensors, zowel op onze telefoon als via een akoestisch signaal in huis.

In Home Assistant is een Alarm Paneel aangemaakt en via automatiseringsregels worden op de ingestelde tijden de raamsensors, deursensors en bewegingsmelders gebruikt om het alarm te ‘triggeren‘ bij activatie. Daarbij wordt onderscheid gemaakt tussen zones zodat het ‘Inschakelen Thuis‘ andere zones bewaakt dan ‘Inschakelen Afwezig‘ of ‘Inschakelen Nacht‘. In deze blog komen de volgende items aan bod:

Aanmaken alarm-paneel in Home Assistant

Het Alarm Paneel wordt gemaakt door het volgende in configuration.yaml te zetten:

alarm_control_panel:
  - platform: manual
    name: Home Alarm
    code_arm_required: false
    code: !secret alarmcode
    arming_time: 30
    delay_time: 20
    trigger_time: 4
    disarmed:
      trigger_time: 0
    armed_vacation:
      arming_time: 10
      delay_time: 0
    armed_night:
      arming_time: 10
      delay_time: 0 
  • code: Dit is de secret code die gebruikt wordt om het alarmsysteem te (de)activeren.
  • code_arm_required: Indien false dan hoeft geen code ingevoerd te worden voor activatie van het alarm. Voor de-activatie is altijd een code nodig.
  • arming_time: De uitlooptijd in secondes nadat het systeem wordt geactiveerd. (standaard 60)
  • delay_time: de vertraging in secondes nadat een alarm wordt getriggered na een ‘pending’ state. (standaard 60)
  • trigger_time: De tijd in secondes in de ‘triggered’ state voordat een alarm wordt gegeven. (standaard 120)
  • disarm_after_trigger: true of false om het alarm uit te zetten na een activering (standaard false)

Nadat Home Assistant opnieuw gestart is zal het Alarm Panel beschikbaar zijn en in een Dashboard ziet dat er alsvolgt uit, (afhankelijk van je gekozen thema):

De volgende statussen zijn beschikbaar voor het Alarm Panel:

  • disarmed: het alarmsysteem is uitgeschakeld
  • arming: het alarm is aangezet en wacht op uitloopvertraging
  • armed_away: Actief op de ‘Afwezig’ stand
  • armed_night: Actief op de ‘Nacht’ stand
  • armed_vacation: Actief op de ‘Vakantie‘ stand
  • triggered: het alarm is geactiveerd.
  • pending: alarm is triggered, wacht op delay_time.

Zodra het alarm wordt geactiveerd gaat de ‘state’ naar ‘arming‘ en na de ‘arming_time‘ naar ‘armed_night‘, ‘armed_away‘ of ‘armed_vacation‘, afhankelijk van de gekozen keuze.

Als een alarm wordt geactiveerd, gaat de ‘state’ naar pending voor het aantal seconden dat is aangegeven bij de gewenste activering met delay_time. Hierna gaat de ‘state’ op triggered.

Het alarmsysteem blijft in de triggered ‘state’ voor het aantal seconden dat is ingesteld met trigger_time bij de gewenste activering. Afhankelijk van de disarm_after_trigger instelling zal de ‘state’ of teruggaan naar de vorige ‘state’ of naar disarmed gaan.

Het alarmsysteem wordt geactiveerd door de ingestelde code in te geven en te kiezen voor ‘Inschakelen voor Afwezig‘, ‘Inschakelen voor Nacht‘ of ‘Inschakelen voor Vakantie‘. Indien code_arm_required: false is gezet hoeft geen code ingevoerd te worden om het alarm in te schakelen.

Alarmfuncties in Node-RED

Het alarmsysteem kan getriggered worden doordat sensors op status ‘on’ of ‘active’ komen te staan. Dit kunnen raam/deur-sensors zijn of bewegingsmelders. Het bewaken van de status van het alarmsysteem kan met behulp van Automatiseringen gedaan worden maar mooier is het om dit met node-RED te doen. Bijvoorbeeld:

Switch options:

  • Pending
  • Triggered
  • Disarmed
  • Armed_away
  • Armed_home
  • Armed_night
  • Armed_vacation
  • Arming

Zodra de ‘state’ van het alarm-panel wijzigt, zal de switch-node naar de bijbehorende actie worden gestuurd. Bij een triggered van het alarm wordt een verwijzing gemaakt met een ‘link-out-node‘ en volgt een ‘notification‘ op de iPhone en op de TV. De overige ‘state’ wijzigingen sturen alleen een ‘notification’ naar mijn iPhone. De ‘message‘ (payload) is aangepast door de change-node. Bij status ‘arming‘ wordt gecontroleerd of de deuren wel dicht zijn. De test-mode wordt gecontroleerd aan de hand van een Helper in Home Assistant. Deze controle dient ook toegevoegd te worden aan de ‘triggered‘ uitgang van de change-node.

Responsive Notifications (iPhone)

Bij die trigger wordt ook een verwijzing gemaakt naar een vervolg flow om het licht te laten knipperen en een sirene afspelen op alle smart-speakers. Voor dit laatste wordt, bij een trigger van het alarm, een responsive notification gestuurd naar de iPhone met een aantal opties.

Voor een iPhone komt er hiervoor de volgende code in de data van een notify-node in Node-RED:

{
   "title": "ALARM TRIGGERED!",
   "message":msg.payload,
   "data": {
        "push": {
              "sound": {
                 "name": "default",
                 "critical": 1,
                 "volume": 1.0
              }
        },
        "actions": [
          {
            "action": "SOUND_ALARM",
            "title": "Wel Alarm",
            "destructive": true,
            "uri": "/lovelace/alarm"
          },
          { "action": "SILENCE_ALARM",
            "title": "Geen Alarm"
          }
        ],
        "persistent": true,
        "tag": "alarm"
      }
}

Er zijn twee ‘actions‘ mogelijk:

  • SOUND_ALARM
  • SILENCE_ALARM

Indien op de notificatie op de iPhone “Wel Alarm” wordt gekozen, zal tevens getracht worden de URL te openen. De URL is een dashboard in Home Assistant met daarin de URL ‘alarm’.

De gekozen action wordt vanaf de iPhone teruggegeven als een ‘event’ aan Home Assistant. Volgt er geen action, dan wordt in Node-RED alsnog de SILENCE_ALARM gebruikt en gaan dus de lampen knipperen.

Alarm sound via smart speakers

Dat ziet er in Node-RED zo uit:

Het ‘event-node‘ krijgt de action binnen van de iPhone:

De ‘function-node‘ bevat het volgende:

en geeft dat door aan een ‘switch-node‘ met twee uitgangen:

De uitgang 2 met SOUND_ALARM gaat naar de ‘service-node‘ om het volume van de Google speaker voluit te zetten om daarna een mp3 af te spelen.

HUE Lampen rood laten knipperen

Vervolgens gaan een aantal HUE lampen op rood knipperen waarna ze op hun voorkeur-instelling worden teruggezet.

De laatste twee service-nodes worden gebruikt om de lampen op een voorkeur-instelling te zetten zodat ze niet rood blijven branden, of op rood aan gaan bij de volgende keer inschakelen. HUE ‘onthoudt’ namelijk de laatst ingestelde waardes voor de lampen. De ‘scene‘ die gebruikt wordt is eerder gemaakt toen de lampen met ‘normale’ waardes aan stonden. Daarna mogen ze uit.

Controle bij inschakelen alarm

Als het alarm-systeem aangezet wordt, zal een controle uitgevoerd worden of de ramen en deuren wel gesloten zijn. Dit gebeurt in de ‘arming‘ state en deze is ingesteld op 10 seconden bij ‘nacht’ en op 30 seconden bij ‘afwezig’ (uitloopvertraging). Mocht er een deur of raam open staan, dan wordt het alarm weer uitgezet en volgt een melding op de telefoon welke deur of raam nog open staat.

In node-RED staat achter de ‘arming‘ status van het ‘alarm_control_panel‘ een ‘current state‘ node die controleert of de state van de te controleren sensors op ‘on‘ staat. Indien dat zo is, zet een service-node het ‘alarm_control_panel’ op ‘disarmed‘ en stuurt een notify naar mijn telefoon.

Nu kan het zo zijn dat bv. ’s zomers het slaapkamerraam express open gezet is en dat deze dus niet gecontroleerd hoeft te worden door het alarm-systeem. Hiervoor maak ik een ‘custom-attribute‘ op de deur- of raamsensor genaamd ‘skip‘ en met een ‘input_boolean‘ kan deze aan of uit gezet worden. Via het alarm-dashboard kunnen de switches aan/uit gezet worden.

Overbruggen sensors

Op de deur- of raamsensor die ik will kunnen overbruggen bij gebruik van het alarm-paneel maak ik een zgn. ‘custom-attribute‘ genaamd ‘overbrug‘ in een template voor nieuwe sensors. De overbrug-attributen worden bediend met behulp van een input_boolean. Dit komt dan in templates.yaml:

- sensor:
    - name: "Logeerkamerdeur"
      unique_id: 6b47acfa-11b2-483b-938b-89cd1e0ccf44
      state: "{{ iif(is_state('binary_sensor.logeerkamer_buitendeur', 'on'), 'Open', 'Dicht') }}"
      attributes:
        overbrug: >
          {{ states('input_boolean.overrule_logeerkamerdeur') }}

De ‘value’ van deze ‘sensors‘ gaan mee met de ‘state’ van de originele ‘binary_sensors‘ en als extra zet ik dus een attribute ‘overbrug‘ die gestuurd wordt door de ‘input_boolean’ helper. In HA ziet de sensor er dan als volgt uit:

Controle

De controle loopt via Node-Red:

Als eerste een ‘switch’ node die de payload ‘arming’ opvangt en stuurt naar de ‘current state’ nodes voor de deur- en raam-sensors. Voor de sensors die overbrugd mogen worden volgt een ‘function’ node waarin de ‘state’ van de ‘overbrug-attribute’ opgevraagd wordt:

msg.payload = msg.data.attributes.overbrug
return msg;

Deze payload wordt vervolgens naar een ‘switch’ node gestuurd die 1 uitgang heeft als de payload ‘off’ is. ‘Off’ houdt immers in dat er niet overbrugd wordt en dus wordt het alarm ook niet aangezet.

Ik stuur de ‘friendly_name’ attribuut via een ‘notify’ naar mijn iPhone zodat ik een melding krijg welke deur of raam nog open staat:

{
  "title":"ALARM!",
  "message":"Kan alarm niet activeren, " & msg.data.attributes.friendly_name & " is nog open!"
 }

Zijn de deuren en ramen gesloten dan hoeven we niets te doen, zo ook als de overbrug switches op ‘on’ staan en dan hoeft het alarm niet uitgezet te worden. (voordat de ‘arming’ tijd verlopen is)

Trigger van het alarm

Het alarm wordt getriggered door deur-, raam- en bewegingsmelders maar op onze deuren zit niet overal hetzelfde type sensor. Op de voordeur bijvoorbeeld, zit een sensor die alleen een melding geeft bij openen en dus niet als de deur dicht gaat. Dit is bewust gedaan omdat de voordeur nooit lange tijd open blijft staan. Om nu toch aan Home Assistant te melden dat de sensor weer op OFF gezet kan worden, maak ik gebruik van een MQTT binary_sensor en met een MQTT bericht kan Home Assistant deze op OFF zetten. (er kan ook een ‘off_delay:‘ in de yaml file voor de mqtt-entities gezet worden).

Andere deur-sensors kunnen wel melden dat de deur weer dicht is, dit zijn dan deuren die eventueel open kunnen blijven staan voor langere tijd, zoals de deur naar de tuin of het balkon.

In node-RED worden de ramen en deuren gecontroleerd met state-nodes waarna een change-node de ‘friendly-name’ van de sensor in een variabele plaatst. Is het alarm actief dan wordt die naam gebruikt om aan te geven welke sensor het alarm heeft ge-activeerd.

Voor bewegingsmelders ziet dat er hetzelfde uit. De notify-data:

{
  "title": "ALARM",
  "message": "Alarm geactiveerd via " & msg.payload
}

Alarm aan/uit met NFC tags

NFC tags zijn ideaal om als schakelaar te gebruiken om het alarm aan of uit te zetten. Zo kan een tag buiten bij de voordeur gebruikt worden om het alarm uit te zetten en een NFC tag bij de slaapkamer om het alarm op ‘armed_night’ te zetten, etc…

In Node RED dient een event-node gebruikt te worden om het id van de tag af te vangen zodra deze gescanned wordt. Dat ziet er dan bv. zo uit:

De tag-id wordt vanuit de event-node doorgegeven aan de switch-node via ‘msg.topic‘ en zal de alarm-functies aansturen en een bericht naar het alarm-panel sturen. De eerdere controles op open deuren/ramen en overbruggen worden ook dan weer meegenomen dus die hoeven we bij de NFC-tags niet nogmaals aan te geven.

Alarm aan/uit op basis van geolocatie telefoon

De iPhone’s die wij gebruiken hebben een geo-location sensor omdat we de Home Assistant Companion app hebben geïnstalleerd. In de configuratie hiervan kan ingesteld worden dat de geo-locatie doorgegeven wordt aan Home Assistant zodra er een zone-wijziging plaats vindt.

In Node-Red kan dat er bijvoorbeeld zo uitzien, waarbij rekening wordt gehouden met de sensors van twee telefoons en een zone in Home Assistant die een diameter van 50 meter om ons huis heeft: