In Home Assistant is een Alarm Paneel aangemaakt en via automatiseringsregels worden op gezette tijden de raamsensors, deursensors en bewegingsmelders gebruikt om het alarm te ‘triggeren‘. 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: !secret alarmcode
    arming_time: 30
    delay_time: 20
    trigger_time: 4
    disarmed:
      trigger_time: 0
    armed_home:
      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.
  • 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 lovelace 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_home: Actief op ‘Thuis’ stand
  • armed_away: Actief op de ‘Afwezig’ stand
  • armed_night: Actief op de ‘Nacht’ 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_home‘ of ‘armed_away‘.

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 Thuis‘, ‘Inschakelen Afwezig‘ of ‘Inschakelen Nacht‘.

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:

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.

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 Alexa speakers. Voor dit laatste wordt, bij een trigger van het alarm, een responsive notification gestuurd naar de iPhone met twee opties: ‘SILENCE ALARM’ of ‘SOUND ALARM’. Bij ‘SOUND ALARM’ wordt de sirene afgespeeld.

Voor een iPhone komt er hiervoor de volgende code in configuration.yaml:

ios:
   push:
     categories:
       - name: "Alarm Control"
         identifier: 'alarm_notification'
         actions:
           - identifier: 'SOUND_ALARM'
             title: 'Sound Alarm'
           - identifier: 'SILENCE_ALARM'
             title: 'Dismiss Alarm'

De category wordt meegegeven in de ‘Notify iPhone-node‘ door de volgende json-code in de data te zetten:

{
    "title": "ALARM",
    "message":"Alarm has been triggered!",
    "data": {
       "push":{
         "category": "alarm_notification"
       }
    }
 }

Alarm sound via Alexa speakers

Dat ziet er in Node-RED zo uit:

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

De ‘function-node‘ bevat het volgende:

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

HUE Lampen rood laten knipperen

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

De huidige status van de aan te sturen lamp wordt opgeslagen in de message:data en na het laten knipperen van de lamp in de kleur rood wordt de data gebruikt om de lamp weer terug te zetten op de waardes zoals ze vóór de trigger waren. De code daarvoor is alsvolgt in de ‘function-node‘ gemaakt:

msg.payload =
 {
     "data": {
         "rgb_color": msg.data.attributes.rgb_color,
         "brightness": msg.data.attributes.brightness
     }
 };
 return msg;

De laatste service-aanroep gebruikt de aangepaste payload om de lamp aan te zetten.

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 ‘thuis’ en op 30 seconden bij ‘verlaten’ (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.

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-lovelace scherm kunnen de switches aan/uit gezet worden.

Overbruggen sensors

Op de deur- of raamsensor die ik will kunnen overslaan bij gebruik van het alarm-paneel maak ik een zgn. ‘custom-attribute‘ genaamd ‘skip’ in een template voor nieuwe sensors.

- platform: template
  sensors:
    logeerkamerdeur:
      friendly_name: "Logeerkamerdeur"
      value_template: >-
        {% if is_state('binary_sensor.logeerkamer', 'off') %}
          off
        {% elif is_state('binary_sensor.logeerkamer', 'on') %}
          on
        {% endif %}
      attribute_templates:
        skip: >-
          {% if is_state('input_boolean.overrule_logeerkamerdeur', 'on') %}
            on
          {% else %}
            off
          {% endif %}

De ‘value’ van deze sensors gaan mee met de ‘state’ van de originele ‘binary_sensors’ en als extra zet ik een attribute ‘skip’ die gestuurd wordt door de ‘input_boolean’ switches. (vanaf de lovelace-pagina) In HA ziet de sensor er alsvolgt 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 overgeslagen mogen worden volgt een ‘function’ node waarin de ‘state’ van de ‘skip-attribute’ opgevraagd wordt:

msg.payload = msg.data.attributes.skip
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 overgeslagen 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 overrule 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. 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 kan dat er dan alsvolgt uit zien:

Zodra het alarm op ‘armed’ staat zal een detectie van een deur die open gaat het alarm triggeren.

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 function-node heeft hiervoor de volgende code:

De ‘msg.payload‘ zal vervolgens via een switch-node 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.