Envisalink EVL-4 (DSC PowerSeries)
The Envisalink EVL-4 is a small network module (made by Eyez-On) that wires onto a DSC PowerSeries alarm panel's keybus and exposes the panel over the LAN. GEM talks to it using DSC's TPI (Third Party Interface) protocol over TCP port 4025. One GEM device represents the whole panel; from there GEM can arm and disarm partitions, watch each panel zone go open/closed/in-alarm, and surface panel trouble conditions (AC loss, low battery, bell fault, tamper).
This is a local integration — GEM connects straight to the EVL-4 on the building network, with no cloud account involved. The module keeps the connection alive with a poll every few seconds and reconnects on its own if the link drops.
This driver targets the DSC panel family (PowerSeries / PowerSeries Neo) behind an EVL-4. The EVL-4 also has a Honeywell/Vista variant; this driver speaks the DSC TPI dialect, so pair it with a DSC panel.
What you get
- Arm / Disarm by partition: arm away, arm stay (home), and disarm, issued from GEM as device commands you can put on a UI button, a macro, or a trigger.
- Live zone state. Each panel zone you create in GEM tracks its real-time condition —
open,closed,alarm,fault, ortamper— as the panel reports events. - Partition status feedback. The panel's armed/disarmed/exit-delay/entry-delay/alarm state is published back onto the device, so the homeowner control and your automations can react to it.
- Trouble monitoring. AC-power loss, low panel battery, bell trouble, and system tamper are published as on/off device attributes the moment the panel raises or clears them.
Prerequisites
- An Envisalink EVL-4 installed on a DSC PowerSeries panel's keybus and powered up, with the panel programming healthy (a working PC-Link/keybus connection).
- The EVL-4's TPI password, set in the EVL-4's own web interface — not the DSC
installer code. The factory default is
user; change it before deploying. - A reachable IP address for the module. Give it a DHCP reservation (or a static IP) so it does not move — GEM connects to it by address.
- Network access from the GEM server to the EVL-4 on TCP 4025.
- The Security subsystem (it ships by default, labeled Security). Panel zones live under it, and the built-in homeowner Security control looks here for the panel device.
Two different secrets are easy to confuse. The TPI password is local to the EVL-4 and is what GEM sends to log in. The user/installer codes are programmed into the DSC panel and are what disarm needs. Get the TPI password from the EVL-4 web page; get the disarm user code from the panel programming.
Setup
1. Add the device
- Open Devices and add a new device with the driver set to Envisalink EVL-4.
- Fill in the connection fields:
- EVL-4 IP Address — the module's IP (for example
192.168.1.50). - TPI Password — the password from the EVL-4 web UI. Stored encrypted.
- TPI Port — leave at the default 4025 unless you changed it on the module.
- Partition Count / Zone Count — optional. These are planning hints describing how many partitions and zones the panel has; the driver tracks whatever the panel actually reports, so they don't change behavior. Fill them in for documentation if you like.
- EVL-4 IP Address — the module's IP (for example
- Save and enable the device. GEM connects to the module, logs in with the TPI password, and begins receiving panel events.
2. Point the Security subsystem at the panel
So the homeowner Security control and the standard security workflow find the panel:
- Open Subsystems and edit Security.
- Set its Device to the Envisalink EVL-4 you just added.
- Save.
The subsystem's Device is how GEM resolves "the security panel" for the homeowner control and for any security zone that doesn't name a device of its own.
3. Create a zone for each panel zone
The driver does not auto-create zones — you add them so GEM knows the friendly name for each panel zone and where to publish its state:
- Open Zones and add a zone under the Security subsystem.
- Set its Address to the panel zone number (the integer the DSC panel uses —
1,2,3, …). This is the link between a TPI zone event and the GEM zone. - Give it a clear Label (for example Front Door, Kitchen Motion). The homeowner control groups zones into Doors, Windows, Motion, Smoke, and Water by matching keywords in the label, so naming a motion sensor with "motion" or a door with "door" puts it in the right group.
- Leave the zone's Device blank to inherit the Security subsystem's device (set in step 2), or set it explicitly to the EVL-4. Either way works; an explicit device on the zone wins.
Repeat for every panel zone you want visible in GEM. A zone event for a panel zone with no
matching GEM zone is logged and ignored (look for Unknown zone number in the device log).
4. Enable arming from the touch panel (optional)
The built-in homeowner Security control hides its arm/disarm buttons until arming is turned on for the subsystem:
- On the Security subsystem, add the attribute
arm_enabled(type boolean) and set it to true. (Add it from the subsystem's attribute editor — it is offered in the name picker.) - Reopen the homeowner Security control; the Arm/Disarm buttons are now active. With
arm_enabledoff, the control shows "System arming is DISABLED."
Arming and disarming
Arming is done with device commands. The driver exposes:
| Command | What it sends | Notes |
|---|---|---|
arm_away | TPI arm-away on the partition | Arms with interior + perimeter. |
arm_stay | TPI arm-stay on the partition | Arms perimeter only (stay/home). |
arm_night | TPI arm-stay on the partition | DSC over TPI has no separate night mode, so this maps to the same arm-stay command as arm_stay. |
disarm | TPI disarm + the user code | Disarms the partition. The code is sent to the panel and the panel validates it. |
Every one of these commands requires a user code to be passed as the code argument (the
driver also accepts user_code). Without it the command returns "User code required for
arm/disarm." Two important behaviors to understand:
- Disarm sends the code to the panel — it must be a valid DSC user code, or the panel refuses to disarm.
- Arm commands require the
codeargument too, but they do not forward it to the panel; the panel arms on its own programming (quick-arm style). The code requirement on arming is a GEM-side gate, not a panel check.
Each command also takes an optional partition argument (the partition number). If omitted
it defaults to partition 1, which is the only partition the homeowner Security control
targets. To arm or disarm a second partition, call the command from a macro or the
Commands screen with partition set to that partition number.
You can fire these three ways:
- For testing — run the command from the device's command list or the
Commands screen with
code(andpartitionif needed) and watch the result. - From a UI — the homeowner Security control wires its Arm Away and Disarm buttons
to
arm_awayanddisarm; both prompt for a code on an on-screen keypad (minimum 4 digits) before sending. See Known limitations about the Arm Home button. - From automation — call the command in a macro or trigger (for example, "arm Away when the
site goes to Away mode"). See Macros and
Triggers. Store the user code in the macro step's
codeargument.
Reading the panel's state
The partition's current state is published to the device's arm_state attribute (for
partition 1) as one of ready, not_ready, armed_away, armed_stay, disarmed,
exit_delay, entry_delay, or alarm. A macro condition or trigger can read it — for example
to avoid re-arming, or to flash a light during entry delay. The homeowner Security control reads
arm_state for its big status banner and to highlight the active arm button, and it shows a
live countdown during exit/entry delay.
Zones and live state
Each GEM security zone mirrors its panel zone. As the panel reports events, the driver updates two attributes on the zone:
state— the current condition:open,closed,alarm,fault, ortamper.last_message— the most recent raw event, useful for detail:zone_open,zone_restored,zone_alarm,zone_alarm_restore,zone_fault,zone_fault_restore,zone_tamper, orzone_tamper_restore.
In the homeowner Security control, a zone shows red when it is open or faulted and green otherwise, and faulted zones float to the top of their group. You can search zones by name and toggle between Show Faults and Show All.
Zone bypass
The driver provides a bypass_zone command. It bypasses a zone by sending the DSC virtual
keypad sequence (*1 followed by the zone number) — the same keystrokes you'd enter on a
physical keypad.
Call it with the panel zone number in the zone argument — for example from a macro or
the Commands screen: bypass_zone with zone = 5. See Known limitations
for why the homeowner control's on-screen Bypass buttons don't currently reach this driver.
Attribute reference
Device attributes — configuration
| Attribute | Required | Type | Notes |
|---|---|---|---|
ip | yes | string | The EVL-4's IP address. Shown as EVL-4 IP Address. |
password | yes | string (secure) | The EVL-4 TPI Password (not the DSC installer code). Stored encrypted. |
port | no | integer | TPI port. Defaults to 4025. Shown as TPI Port. |
partition_count | no | integer | Planning hint for how many partitions the panel has. The driver does not act on it. |
zone_count | no | integer | Planning hint for how many panel zones exist. The driver does not act on it. |
Device attributes — published by the driver
These appear automatically as the panel reports state; you don't set them.
| Attribute | Type | Notes |
|---|---|---|
arm_state | string | Partition 1's state: ready / not_ready / armed_away / armed_stay / disarmed / exit_delay / entry_delay / alarm. |
partition_<n>_status | string | Per-partition state (partition_1_status, partition_2_status, …) using the same values as arm_state. |
panel_ac_trouble | boolean | true while the panel reports AC-power loss; clears to false on restore. |
panel_battery_trouble | boolean | true while the panel reports a low/failed backup battery. |
bell_trouble | boolean | true while the panel reports a bell/siren circuit fault. |
general_system_tamper_trouble | boolean | true while the panel reports a system tamper. |
Zone attributes
| Attribute | Required | Type | Notes |
|---|---|---|---|
address | yes | string | The panel zone number. This is what ties a TPI event to the GEM zone — set it yourself when you create the zone. |
state | auto | string | Live zone condition: open / closed / alarm / fault / tamper. |
last_message | auto | string | Most recent raw zone event (see Zones and live state). |
Diagnostic commands
| Command | What it does |
|---|---|
status | Asks the panel for a full status refresh. Useful right after connecting to repopulate every partition and zone. |
poll | Sends a single keep-alive poll. The driver already polls automatically; this is for manual testing. |
How it works
Connecting and logging in. GEM opens a TCP connection to the EVL-4 on port 4025 and authenticates with the TPI password. The module silently drops the connection if the password is wrong, so "connects then immediately disconnects" almost always means a password mismatch.
Keep-alive. Once logged in, GEM sends a poll roughly every 20 seconds. If it hears nothing back from the module for about 60 seconds, it assumes the link is dead, drops it, and reconnects a few seconds later. Occasional reconnect lines in the device log are normal; a tight reconnect loop is not (see Troubleshooting).
Events. The panel pushes TPI messages as things happen — partition arm/disarm, zone
open/restore, alarms, and trouble conditions — and the driver maps each one onto the
corresponding arm_state, zone state/last_message, or trouble attribute. There is no
constant polling of individual zones; updates are event-driven and arrive within seconds.
Known limitations
- "Arm Home" button on the homeowner Security control. That control's three buttons are
Arm Home, Disarm, and Arm Away. Arm Away and Disarm work with this driver, but the
Arm Home button sends an
arm_homecommand that this driver does not implement (it providesarm_stay), so pressing it returns an error instead of arming in stay mode. To arm stay/home, callarm_stay(orarm_night) from a macro, a trigger, or a custom UI button, or from the Commands screen. (This is a driver/UI naming mismatch, noted here for accuracy.) - On-screen Bypass buttons don't reach this driver. The Security control's per-zone Bypass
and Bypass Faulted buttons pass the zone's address, but
bypass_zonereads thezoneargument, so those buttons don't currently bypass anything on a DSC panel. Bypass instead by callingbypass_zonewith thezoneargument from a macro or the Commands screen, or from the panel's own keypad. The driver also has nounbypass_zonecommand and does not publish a per-zone "bypassed" flag, so the control won't display zones as bypassed. - Stay vs. night arming. Over DSC TPI there is no distinct night-arm command, so
arm_nightperforms the same stay-arm asarm_stay. - Disarm needs a valid panel code. Disarming forwards the
codeto the panel, which validates it; an invalid or missing code will not disarm. (Arming requires acodeargument in GEM but does not send it to the panel.) - Single-partition by default. The arm/disarm commands target partition 1 unless you pass a
partitionargument, and the homeowner control only ever targets partition 1. Multi-partition arming has to be driven from macros/commands with an explicitpartition.
Troubleshooting
| Symptom | Check |
|---|---|
| Device connects but receives nothing, or drops immediately | TPI password mismatch — the EVL-4 silently disconnects on a bad login. Confirm the TPI Password against the EVL-4 web UI (the default is user). It is not the DSC installer code. |
| Reconnect loop every ~60 seconds | The keep-alive poll isn't getting answered. Power-cycle the EVL-4 and confirm the panel programming / keybus (PC-Link) wiring is healthy. |
Zone events appear for unknown zones (Unknown zone number in the log) | Create a GEM zone under the Security subsystem whose Address equals that panel zone number. The driver never auto-creates zones. |
| Zones never update | Confirm each zone's Address is the panel zone number and the zone resolves to this device — either give the zone a Device of the EVL-4, or set the Security subsystem's Device to it. |
| Arm/disarm returns "User code required for arm/disarm" | Pass the user code as the code argument (the homeowner keypad does this for you; a macro step must include it). |
| Disarm rejected by the panel | The code isn't a valid DSC user code, or the panel is in a state that refuses disarm. Verify the code on a physical keypad. |
| Arm "succeeds" but the panel doesn't arm | A zone is faulted (open door/window) or the panel has a trouble condition; clear or bypass it, then re-arm. |
| Homeowner control shows "System arming is DISABLED" | Set the arm_enabled attribute on the Security subsystem to true. |
| Homeowner control shows "Missing security device" | Set the Security subsystem's Device to the EVL-4 under Subsystems. |
Related documentation
- Devices — where the EVL-4 device is added and its connection fields are set.
- Subsystems — assign the EVL-4 as the Security subsystem's
device and add the
arm_enabledattribute. - Zones — create one zone per panel zone, with the panel zone number as the address.
- Commands — where
arm_away,arm_stay,disarm, andbypass_zoneare dispatched and wired into automation. - Macros and Triggers — arm/disarm on a
schedule or in response to events, and react to
arm_stateand zone state.