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.
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 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_statuscommand 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.
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:
- The M1XEP has a reachable static IP on the building LAN.
- 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.
- Note the IP and port — you enter both in GEM.
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
- Open Devices and add a new device with the driver set to Elk M1 Gold / EZ8.
- 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.
- 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:
- Open Subsystems and edit Security.
- Set its Device to the Elk panel you just added.
- 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:
- Open Zones and add a zone under the Security subsystem.
- Set the zone's address to the Elk zone number (1–208) — an integer, not a name.
- Give the zone a friendly label (for example Front Door, Kitchen Motion).
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:
| Command | Arms the panel as | Notes |
|---|---|---|
arm_home | Armed Stay (perimeter, occupants home) | |
arm_away | Armed Away (full, perimeter + interior) | |
disarm | Disarms |
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.partition— optional. 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_homewithuser_codeset 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_codeargument and, if needed, the area inpartition. - Your own UI button — wire a control button to send
arm_home/arm_away/disarmwith auser_codeargument.
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_statussends 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_stateattribute), 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
| Attribute | Required | Type | Notes |
|---|---|---|---|
ip | yes | string | LAN IP of the M1XEP (or serial-to-IP bridge). Shown as M1XEP IP Address. |
port | yes | integer | Non-secure ASCII TCP port. Default 2101. Shown as TCP Port. |
Zone attributes
| Attribute | Required | Type | Notes |
|---|---|---|---|
address | yes | string | The 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
| Symptom | Check |
|---|---|
| Device won't connect / keeps reconnecting | Confirm 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 arm | Pass 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 arm | A 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/disarms | Set the partition argument to the correct Elk area (1–8). It defaults to 1. |
| GEM zones never show live status | Expected — 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 uptime | The 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. |
Related documentation
- 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, anddisarmare dispatched and wired into automation. - Macros and Triggers — arm/disarm on a
schedule or in response to events, passing the
user_code(and optionalpartition) 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.