Skip to main content

Hubitat Elevation (Maker API)

Bridge a Hubitat Elevation hub into GEM via the local Maker API. Every device an integrator has paired into Hubitat (Z-Wave, Zigbee, Lutron, cloud apps) becomes a GEM zone addressable by Hubitat device id. No cloud token, no re-pairing of hardware.

Prerequisites

  • Hubitat Elevation hub on platform 2.2.4 or newer.
  • The built-in Maker API app installed: Apps → Add Built-In App → Maker API.
  • Inside the Maker API app, the devices you want GEM to control already selected and saved.
  • The hub on a reserved LAN IP (router DHCP reservation, or set statically in Hubitat).

Setup steps

  1. Open the Maker API app in Hubitat (Apps → Maker API). Note three values:
    • App ID — shown at the top of the page (e.g. 142).
    • Access token — listed under "Local URLs", a long hex string.
    • Hub IP — the IP shown in the Local URL.
  2. Create a Device in GEM with driver hubitat_elevation. Fill in:
    • ip — hub IP.
    • app_id — Maker API app id.
    • api_key — the access token. Stored encrypted (the name api_key triggers auto-encryption).
  3. Run the get_devices command. The response is the full list of devices exposed by the Maker API, each with id, name, label, type, and capabilities.
  4. Create one GEM Zone per Hubitat device. Set zone.address to the numeric Hubitat device id.
  5. Set each zone's subsystem (lights, shade, lock, security, climate, plug, etc.) so verbs dispatch correctly.

Attribute reference

Required

AttributeTypeDescription
ipstringHub LAN IP. No scheme — driver builds http://<ip>:<port> internally.
app_idstringMaker API app id (numeric, but stored as string so leading zeros / textual ids survive).
api_keystringMaker API access token. Stored encrypted.

Optional

AttributeTypeDefaultDescription
portint80Override if the hub runs behind a port-mapped NAT (rare; the hub serves Maker API on 80 by default).
status_intervalint15000Per-zone poll interval in ms. 2000–300000. Hubitat is single-threaded for API; sub-second polling will starve it.

Zone address format

zone.address is the numeric Hubitat device id. It is visible in the Hubitat web UI when editing a device (the URL contains …/device/edit/<id>).

Commands

CommandArgsNotes
on / offaddressMaps to Hubitat on / off.
set_leveladdress, level (0-100)Maps to setLevel/<level>.
open / closeaddressFor shades and other openable devices.
lock / unlockaddressLocks.
arm_home / arm_away / disarmaddressSecurity panels with armHome, armAway, disarm capability.
push_buttonaddress, button (default 1)Hubitat button devices — push/<n>.
get_devicesEnumerate devices exposed by Maker API.
get_statusaddressRead current attributes for one device.
raw_commandaddress, hubitat_command, argEscape hatch — sends /devices/<id>/<command>[/<arg>] verbatim. Use this for capabilities the verb table doesn't cover (e.g. thermostat mode, fan speed, scene activation).
set_coloraddress, hue, saturation, levelTODO — not yet implemented. Returns {error: 'not yet implemented'}.

State reporting

The status loop reads /devices/<id> for each zone, then writes back GEM attributes derived from the Hubitat attribute array. First match wins for zone.state:

Hubitat attributeGEM zone.state value
switchon / off
contactopen / closed
locklocked / unlocked
motionmotion / idle
windowShadepassthrough (lowercased)
presencepresent / away

Additionally:

  • levelzone.brightness
  • temperaturezone.temperature
  • humidityzone.humidity
  • batteryzone.battery_level

Known limitations

  • Polling only. Maker API does not push events. For fast motion / button reactions, build the rule on the Hubitat side and have Hubitat call a GEM macro via HTTP rather than relying on this driver's poll loop.
  • No color control. set_color is a stub. Hubitat exposes hue / saturation / level as separate attributes and a setColor JSON command; we have not wired the multi-arg form yet.
  • Thermostat verbs are not mapped. set_temperature, mode changes, and fan speed all go through raw_command for now (hubitat_command: setHeatingSetpoint, arg: 72, etc.).
  • One Hubitat hub per GEM device row. Multi-hub installs need multiple device rows; that is normal — Hubitat itself doesn't pretend to federate hubs.

Troubleshooting

  • connect warns "missing app_id" / "missing api_key": confirm both are saved on the device row. The api_key gets encrypted on save; reload the row to check it persisted.
  • get_devices returns {error: 'Request failed with status code 401'}: access token is wrong or expired. Open the Maker API app in Hubitat, copy the token from "Local URLs" again, paste into the api_key attribute.
  • get_devices returns an empty list: the Maker API app has no devices selected. Open the app in Hubitat, add devices, save.
  • Commands succeed but state never updates: make sure the corresponding capability is exposed in the Maker API app's "select devices" list. A device added to the hub but not to Maker API stays invisible to GEM.
  • Hub slows down under polling: raise status_interval. 15 s is the default for a reason; hubs with hundreds of devices want 30 s or higher.