ELK M1 Security Integration — 54 zones, 61 automations, complete documentation

Wanted to share a project I’ve been working on for about 3 months: a complete ELK M1 Gold integration with HA.

System overview

  • ELK M1 Gold with M1XEP (FW 2.0.51)
  • 4x M1XIN expander boards (54 wired zones total)
  • 14 PIR motion sensors + 40 door/window contacts
  • 4x Vivotek IP cameras with VCA person detection
  • UPB powerline lighting (54 lights, 17 scenes)
  • ELK-124V3 voice module with 7 distributed speakers
  • HomeKit bridge for Apple Home integration

Automations (61 total across 10 packages)

  • Alarm response with light flash + camera snapshots + push notification disarm
  • Presence-based auto-arm/disarm with geofencing
  • Zone-triggered night lights (PIR + camera AI dual-source)
  • Garage auto-close on timer while armed
  • Camera AI webhook pipeline (person detection → boolean → timer)
  • Camera push notifications with critical alerts when armed
  • Security mode notifications on every arm/disarm state change

Key technical challenges solved

1. TLS connection: M1XEP 2.0.51 uses AES128-SHA cipher. HAOS OpenSSL 3.x blocks it. Fix: use elksv1_2:// URL scheme instead of elks://. No custom component needed.

2. Expander zone sync timing: sync_complete fires before expander SD chain finishes. Fix: auto_configure: False creates all entities regardless of sync state.

3. M1XEP TCP drop during alarm: Firmware drops TCP during active burglar alarm. Remote disarm silently fails. Workaround: double-disarm + integration reload. Real fix: physical keypad.

4. NO zone type suppression: M1 suppresses state changes on NO zones when disarmed. PIR motion sensors don’t trigger HA automations. Fix: change zone type to NC in ElkRP2.

5. YAML gotcha — to: on: Unquoted on in YAML is boolean True, not string “on”. Silently breaks triggers. Always quote: to: "on".

Automation architecture pattern

I use a Sensor → Boolean → Timer → Action pattern for everything:

Sensor fires (webhook, PIR, contact)
  -> Set input_boolean ON
    -> Automation triggers on boolean
      -> Execute action + start timer
        -> Timer expires -> boolean OFF

This decouples sensors from actions, works with HomeKit (booleans appear as switches), survives restarts, and allows multiple sensors to trigger the same boolean.

I documented the entire process with YAML templates in a guide if anyone’s interested: The Complete ELK M1 + Home Assistant Security Blueprint

I also write a twice-weekly newsletter covering HA automation patterns and security integration tips: The Automated Home

Happy to answer questions about the integration.