Skip to main content

Elk M1 Gold / EZ8

GEM integrates with an Elk M1 Gold (and EZ8 / M1EZ8) security + automation panel over the LAN through the panel's M1XEP Ethernet gateway. GEM opens a TCP connection to the M1XEP and speaks the Elk M1 ASCII protocol to arm and disarm the panel. The driver issues the panel's arm-stay, arm-away, and disarm commands carrying a panel user code, and can request a zone-status report from the panel on demand.

This is a local integration — GEM talks straight to the M1XEP on the building network. There is no cloud account and no ELK-RP/monitoring subscription involved.

Hardware this driver supports

This driver works with an Elk M1 Gold / EZ8 panel that has an M1XEP (or a compatible Ethernet-to-M1 serial bridge) on the network and reachable over TCP. It is not for DSC or Honeywell panels — for those see DSC PowerSeries Neo, Honeywell Vista (AlarmDecoder), or Envisalink EVL-4 — and it is not a cloud integration; for cloud-monitored systems see Alarm.com.

GEM dials out to the M1XEP

GEM connects out to the M1XEP at the IP and TCP port you give it and keeps the connection open, reconnecting on its own if it drops. There is nothing for the panel to "call in" to — you point GEM at the M1XEP and leave it.

What you get

  • Arm / Disarm the panel as GEM device commands you can put on a macro, a trigger, or your own UI button: Arm Home (stay), Arm Away, and Disarm. Each command carries the panel user code that actually performs the action, plus an optional partition (area) number.
  • On-demand zone-status request. The get_zone_status command asks the panel for its current zone report. See Live zone state and armed feedback below for what GEM does and does not do with the reply today — it is an honest limitation, not a bug.

Prerequisites

  • An Elk M1 Gold or EZ8 / M1EZ8 panel with healthy programming.
  • An M1XEP Ethernet module (or a compatible serial-to-IP bridge) installed on the panel's data/serial bus and given a reachable IP on the building LAN.
  • A valid Elk user code (4–6 digits) with arm/disarm rights on the partition you will control. This is an ordinary user code, not the master or installer code. The code is not stored on the device — it is supplied with each arm/disarm command.
  • The Security subsystem (it ships by default, labeled Security). Panel zones live under it.
Two different numbers — keep them straight

The partition (Elk calls it an area, 1–8) is the logical area you are arming. The zone number is a physical Elk zone (1–208) you map a GEM zone's address to. Most residential M1 installs use a single partition — leave the partition at 1 unless the panel is programmed for multiple areas.

Setup

1. Configure the M1XEP

Using ElkRP (or the M1XEP web setup), confirm:

  1. The M1XEP has a reachable static IP on the building LAN.
  2. The non-secure (plaintext) ASCII port is enabled. The Elk default is TCP 2101. Some M1XEP firmware ships with the non-secure port disabled — re-enable it in M1XEP setup, because this driver uses the plaintext port.
  3. Note the IP and port — you enter both in GEM.
Secure port 2601 is not used by this driver

The M1XEP also offers a TLS-secured ASCII port (default 2601). This driver connects to the non-secure port (default 2101) only; it does not open the secure port. Keep port 2101 reachable only from the GEM server / a trusted management VLAN — it carries arm/disarm traffic with the user code in cleartext, so it must never be exposed to an untrusted network or the internet.

2. Add the device

  1. Open Devices and add a new device with the driver set to Elk M1 Gold / EZ8.
  2. Fill in the connection fields:
    • M1XEP IP Address — the LAN IP of the M1XEP (or serial-to-IP bridge).
    • TCP Port — the non-secure ASCII port, default 2101.
  3. Save and enable the device. GEM connects to the M1XEP and keeps the link open.

When you pick Elk M1 Gold / EZ8 in the device form, the View integration guide toggle in Devices opens this page inline — it is the same content you are reading now.

3. Point the Security subsystem at the panel

So zone grouping and the homeowner workflow find the panel:

  1. Open Subsystems and edit Security.
  2. Set its Device to the Elk panel you just added.
  3. Save.

Any zone you place under the Security subsystem then resolves to this panel automatically. (Alternatively, set an individual zone's Device directly to the panel; a zone's own Device takes priority over its subsystem's Device.)

4. (Optional) Create a zone per Elk zone

The driver does not auto-create zones. If you want a GEM zone to represent an Elk physical zone (for labeling, grouping, or future use), create it manually:

  1. Open Zones and add a zone under the Security subsystem.
  2. Set the zone's address to the Elk zone number (1–208) — an integer, not a name.
  3. Give the zone a friendly label (for example Front Door, Kitchen Motion).
Zone state is not live yet — see the limitation below

Creating a GEM zone here records the mapping, but this driver does not currently push the panel's live open/faulted state onto these zones. Read Live zone state and armed feedback before relying on per-zone status in the UI.

Arming and disarming

Arming is done with device commands. The driver exposes:

CommandArms the panel asNotes
arm_homeArmed Stay (perimeter, occupants home)
arm_awayArmed Away (full, perimeter + interior)
disarmDisarms

Each command takes:

  • user_code — the Elk user code (4–6 digits) the panel validates and acts on. The driver sends it zero-padded to 6 digits automatically, so a 4-digit code is fine. The code is not stored on the device, so every arm/disarm must supply it.
  • partitionoptional. The Elk area number (1–8). It defaults to 1 when omitted — leave it blank on a single-partition system.

You fire these from:

  • The Commands screen or the device's command list — for commissioning and testing. Run arm_home with user_code set to a real Elk user code and watch the panel arm.
  • Automation — call the command in a macro or trigger (for example, Arm Away when the site goes to Night mode). See Macros and Triggers. Put the code in the step's user_code argument and, if needed, the area in partition.
  • Your own UI button — wire a control button to send arm_home / arm_away / disarm with a user_code argument.
The built-in Security touch-panel control does not arm this panel

GEM's homeowner Security control sends its on-screen keypad PIN as a code argument, which is what the DSC integration expects. This driver reads the code from user_code instead, so the control's Arm Home / Disarm / Arm Away buttons do not drive an Elk panel — an arm attempt with no user_code returns an error and nothing is sent. Drive Elk arming from macros, the Commands screen, or a custom UI button that passes user_code.

Live zone state and armed feedback

This driver is, today, a control-out integration: it reliably arms and disarms the panel, but it does not decode the panel's replies back into GEM.

  • get_zone_status sends a zone-status request to the panel, and the panel's reply is received and logged — but the driver does not parse that reply into per-zone open/closed/faulted state. GEM zones you create for Elk zones therefore do not show live status from this driver, and the homeowner Security control's zone list will not populate from an Elk panel.
  • The driver does not publish the panel's armed state back to GEM (there is no arm_state attribute), so the homeowner control's Armed/Disarmed indicator and any automation that wants to read "is the panel armed?" will not reflect the Elk panel's current state.

In short: use this driver to command the panel (arm/disarm via macros, schedules, the Commands screen, or a custom button). If you need GEM to display live zone faults and the panel's armed state, that feedback path is not implemented for Elk yet — a Honeywell or DSC panel through Vista (AlarmDecoder) or DSC PowerSeries Neo provides live zone and arm-state reporting today.

Attribute reference

Device attributes — configuration

AttributeRequiredTypeNotes
ipyesstringLAN IP of the M1XEP (or serial-to-IP bridge). Shown as M1XEP IP Address.
portyesintegerNon-secure ASCII TCP port. Default 2101. Shown as TCP Port.

Zone attributes

AttributeRequiredTypeNotes
addressyesstringThe Elk zone number (1–208). You set this when you create the zone. Used for labeling/grouping; live state is not pushed (see above).

How it works

Outbound connection. When the device is enabled, GEM opens a TCP connection to the M1XEP at the configured IP and port and keeps it open. If the connection drops, GEM reconnects on its own — the M1XEP can close idle connections, so brief reconnects are normal.

Arm/disarm framing. Each arm_home / arm_away / disarm command is encoded as a proper Elk ASCII arming message: the arming level (Armed Stay, Armed Away, or Disarm), the partition/area, and the zero-padded user code. The panel validates the code and acts.

Zone-status request. get_zone_status sends the panel's zone-status request frame. The reply arrives and is logged but, as noted above, is not yet mapped onto GEM zones.

Troubleshooting

SymptomCheck
Device won't connect / keeps reconnectingConfirm the M1XEP IP Address and TCP Port (default 2101), that the M1XEP's non-secure ASCII port is enabled (some firmware ships with it off), and that the GEM server can reach the M1XEP.
arm_home / arm_away / disarm returns an error and the panel doesn't armPass a real Elk user code in the user_code argument. The built-in Security control sends code instead — use a macro or the Commands screen. Make sure it is a user code with arm/disarm rights, not the master or installer code.
Arm command sends but the panel doesn't armA zone is faulted (open door/window) or the panel has a trouble, so it refuses to arm. Clear or bypass the fault at a keypad, then re-arm. The wrong user code or wrong partition is also rejected by the panel.
Wrong area arms/disarmsSet the partition argument to the correct Elk area (1–8). It defaults to 1.
GEM zones never show live statusExpected — this driver does not push live zone state. See Live zone state and armed feedback. Use the Commands screen / panel keypad to confirm panel state during commissioning.
Connection drops after long uptimeThe M1XEP can close idle TCP sessions; GEM auto-reconnects. If reconnects are frequent, enable keep-alive in M1XEP setup and confirm only one client is holding the non-secure port.
  • Devices — where the Elk panel device is added and its M1XEP IP and port are set.
  • Subsystems — assign the panel as the Security subsystem's device.
  • Zones — create one zone per Elk zone with address = the Elk zone number.
  • Commands — where arm_home, arm_away, and disarm are dispatched and wired into automation.
  • Macros and Triggers — arm/disarm on a schedule or in response to events, passing the user_code (and optional partition) argument.
  • DSC PowerSeries Neo, Honeywell Vista (AlarmDecoder), and Envisalink EVL-4 — panel integrations that also report live zone and arm state.
  • Alarm.com — cloud-monitored panels without a local integration path.