Skip to main content

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.

One device, many zones

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:
PlatformProtocolDefault port
ISY994http80
eisy / Polisyhttps8443
note

The eisy/Polisy HTTPS certificate is self-signed. GEM accepts it automatically — you do not need to install or trust anything.

Setup steps

  1. In Admin → Devices, create a device with driver isy_iox.

  2. Set the required attributes:

    • IP Address — the controller's LAN IP.
    • Admin Username / Admin Password — the ISY/IoX local account.
  3. If you have an eisy or Polisy, set Protocol = https and Port = 8443. Leave the defaults for an ISY994.

  4. Save the device, then open it and switch to the Commands tab (it appears once the device is saved with its isy_iox command set, which GEM assigns automatically). Select get_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: <device_id>, action: 'get_devices'}).

  5. 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.
    • SubsystemLights 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_devices reports 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

AttributeRequiredDefaultDescription
ipyesLAN IP or hostname of the controller.
usernameyesISY/IoX admin account username.
passwordyesISY/IoX admin account password (stored encrypted).
portno8080 for ISY994, 8443 for eisy/Polisy.
protocolnohttphttp or https.
status_intervalno15000Milliseconds 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

CommandArgsISY action
onaddressDON
offaddressDOF
set_leveladdress, levelDON/<raw> (see scaling below)
fast_onaddressDFON (INSTEON fast-on)
fast_offaddressDFOF (INSTEON fast-off)
brightenaddressBRT (one step brighter)
dimaddressDIM (one step dimmer)
run_programprogram_id/rest/programs/<id>/run
stop_programprogram_id/rest/programs/<id>/stop
get_devicesEnumerate nodes + scenes
get_statusRead 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. Reported state is scaled back the same way.

warning

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:

  • stateon when the raw value is greater than 0, otherwise off.
  • 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_program take 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

SymptomCheck
authentication failed (401) in the logUsername/password wrong, or the account lacks local access. Re-enter credentials.
Connects but no zones ever updateConfirm each zone's Address matches a real node id from get_devices, including the spaces.
Timeouts / never connectsWrong 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 brightnessNon-INSTEON node interpreting the on-level differently — see the dimmer scaling warning.
eisy/Polisy shows a certificate error elsewhere but works in GEMExpected — GEM accepts the self-signed cert; other tools may not.
  • 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