Universal Devices ISY / IoX
Controls Universal Devices controllers — the legacy ISY994 and the current IoX platforms (eisy, Polisy) — over their on-LAN REST interface. Each ISY node (INSTEON, Z-Wave or UPB device) or scene becomes a GEM zone, and ISY programs can be run or stopped from macros and the command surface.
The driver talks HTTP(S) basic auth to /rest and polls /rest/status for node state. No cloud account and no Universal Devices portal login are involved.
Add a single GEM device for the ISY controller itself — not one per light. Each INSTEON, Z-Wave or UPB node and each scene you want to control then becomes its own zone bound to that one device, addressed by its ISY node id.
Prerequisites
- An ISY/IoX admin account (username + password) with local access. On a fresh ISY994 this is
admin/admin— change it before deploying. - Network reachability from the GEM server to the controller.
- Know which platform you have — it decides the protocol and port:
| Platform | Protocol | Default port |
|---|---|---|
| ISY994 | http | 80 |
| eisy / Polisy | https | 8443 |
The eisy/Polisy HTTPS certificate is self-signed. GEM accepts it automatically — you do not need to install or trust anything.
Setup steps
-
In Admin → Devices, create a device with driver
isy_iox. -
Set the required attributes:
- IP Address — the controller's LAN IP.
- Admin Username / Admin Password — the ISY/IoX local account.
-
If you have an eisy or Polisy, set Protocol =
httpsand Port =8443. Leave the defaults for an ISY994. -
Save the device, then open it and switch to the Commands tab (it appears once the device is saved with its
isy_ioxcommand set, which GEM assigns automatically). Selectget_devices, run it, and read the response console — it lists every INSTEON / Z-Wave / UPB node and every scene with its address and name. If you prefer code, run the same call from System → Script Console:await gem.command({device_id: <device_id>, command: 'get_devices'}). -
For each node or scene you want to control, go to Admin → Zones and add a zone:
- Device — select this ISY controller. Picking it makes the Address field show the ISY addressing hint.
- Subsystem — Lights for dimmers and switches, Switches for relay / appliance modules. The subsystem sets the zone's on / off / level controls and iconography.
- Address — the ISY address exactly as
get_devicesreports it (see the zone-address notes below).
GEM does not create zones automatically from
get_devices— the command only lists what is available; you add each zone yourself and bind it to this device.
Attribute reference
Device attributes
| Attribute | Required | Default | Description |
|---|---|---|---|
ip | yes | — | LAN IP or hostname of the controller. |
username | yes | — | ISY/IoX admin account username. |
password | yes | — | ISY/IoX admin account password (stored encrypted). |
port | no | 80 | 80 for ISY994, 8443 for eisy/Polisy. |
protocol | no | http | http or https. |
status_interval | no | 15000 | Milliseconds between /rest/status polls. |
Zone address
The zone Address is the ISY node address, entered exactly as get_devices reports it:
- INSTEON — four space-separated hex bytes, e.g.
1D 3C 5B 1. - Z-Wave — e.g.
ZW002_1. - Scene (group) — the numeric scene id, e.g.
29051.
The driver URL-encodes the address, so the embedded spaces are handled for you — enter them verbatim, do not substitute %20.
Commands
| Command | Args | ISY action |
|---|---|---|
on | address | DON |
off | address | DOF |
set_level | address, level | DON/<raw> (see scaling below) |
fast_on | address | DFON (INSTEON fast-on) |
fast_off | address | DFOF (INSTEON fast-off) |
brighten | address | BRT (one step brighter) |
dim | address | DIM (one step dimmer) |
run_program | program_id | /rest/programs/<id>/run |
stop_program | program_id | /rest/programs/<id>/stop |
get_devices | — | Enumerate nodes + scenes |
get_status | — | Read all node states from /rest/status |
Dimmer level scaling
ISY dimmers use a raw 0–255 on-level (128 ≈ 50%). GEM zones use 0–100, so set_level scales your 0–100 value to the nearest 0–255 raw value before sending DON. Values outside 0–100 are clamped; a missing or non-numeric level is sent as 0. Reported state is scaled back the same way.
The 0–255 scale is the INSTEON convention. UPB and Z-Wave nodes may interpret the DON on-level parameter as a 0–100 percentage or a 0–99 range instead. If a dimmer lands at the wrong brightness, verify the node's expected range against Universal Devices' documentation and adjust the level you send.
State polling
The driver polls /rest/status every status_interval milliseconds and reflects each node's ST property onto its zone:
state→onwhen the raw value is greater than 0, otherwiseoff.level→ the raw 0–255 value scaled to 0–100.
It does not subscribe to the ISY real-time event stream, so a change made at the switch or in another app appears in GEM within one poll interval rather than instantly. Lower status_interval for snappier feedback at the cost of more requests.
Known limitations
- Polling, not events. Real-time subscription (the ISY WebSocket / SOAP event stream) is not yet wired; state is reconciled by polling.
- No node/scene management. The driver controls existing nodes, scenes and programs; it does not add, remove, link or rename them — do that in ISY's Admin Console.
- Program addressing.
run_program/stop_programtake the numeric program id shown in the ISY program tree, not the program name. - On-level scale for non-INSTEON dimmers is unverified against real UPB/Z-Wave hardware — see the warning above.
Troubleshooting
| Symptom | Check |
|---|---|
authentication failed (401) in the log | Username/password wrong, or the account lacks local access. Re-enter credentials. |
| Connects but no zones ever update | Confirm each zone's Address matches a real node id from get_devices, including the spaces. |
| Timeouts / never connects | Wrong protocol/port for the platform (ISY994 = http/80, eisy/Polisy = https/8443), or a firewall between GEM and the controller. |
| Dimmer goes to the wrong brightness | Non-INSTEON node interpreting the on-level differently — see the dimmer scaling warning. |
| eisy/Polisy shows a certificate error elsewhere but works in GEM | Expected — GEM accepts the self-signed cert; other tools may not. |
Related documentation
- Devices — adding and configuring the ISY controller device
- Zones — creating one zone per node or scene and setting its address
- Subsystems — placing the zones under Lights or Switches
- Commands — the full driver-managed command list
- Macros — running ISY programs and scenes from automations
- Triggers — reacting to node state changes polled from the ISY