Carrier Infinity / Bryant Evolution
Multi-zone HVAC control for Carrier Infinity and Bryant Evolution Wi-Fi touchscreen thermostats (SYSTXBBWIFI01, SYSTXBBECW01, and Bryant SYSTXBB equivalents). GEM talks to a local Infinitude proxy server rather than the manufacturer cloud — the thermostat is re-pointed at Infinitude on the LAN, and Infinitude exposes a REST API that this driver consumes.
Prerequisites
- An Infinitude server running on the LAN. The reference implementation is the open-source project at https://github.com/nebulous/infinitude; published Docker images make this a one-line deployment. The GEM server itself is a fine host.
- The Carrier Infinity Touch or Bryant Evolution Connex thermostat reconfigured to talk to Infinitude instead of the vendor cloud (see the Infinitude README for the destination-server setting).
- Thermostat firmware version that reports zone-level activity over Wi-Fi. All current Infinity Touch / Connex models qualify; legacy Infinity controls (ABCD-bus only, no Wi-Fi) do not.
Setup
- Install Infinitude. The Docker pattern is:
docker run -d --name infinitude -p 3000:3000 nebulous/infinitude
- On the thermostat, switch the destination from the Carrier / Bryant cloud to the Infinitude host. The unit will check in within ~5 minutes.
- Verify the proxy is alive:
curl http://<infinitude-ip>:3000/api/statusshould return a JSON document with azonesarray. - In GEM admin, add a device with driver
carrier_infinityand setipto the Infinitude server. Leaveportat 3000 andsystem_idat1unless you intentionally run a multi-system Infinitude install. - Run the
get_zonescommand to enumerate the (up to 8) Infinity zones reported by the thermostat. For each zone you want to control, create a GEM zone withaddress= the Infinity zone id ("1","2", ...).
Attributes
Device
| Name | Required | Description |
|---|---|---|
ip | yes | LAN IP / hostname of the Infinitude server. |
port | no | HTTP port. Default 3000. |
protocol | no | http or https. Default http. |
system_id | no | Infinitude system identifier (1 for typical deployments). |
username | no | Only set if you reverse-proxy Infinitude behind HTTP basic auth. |
password | no | Basic-auth password — encrypted at rest. |
status_interval | no | Poll period in ms. Default 30000. The thermostat itself only phones home every ~90 s; polling faster yields no new data. |
Zone
address is required and is the Infinity zone id ("1".."8"). Single-zone systems use "1".
The driver writes the following attributes per zone on every status sweep:
state— current system mode (off/heat/cool/auto/fanonly).room_temp_f— measured room temperature.room_humidity— measured humidity %.heat_setpoint,cool_setpoint— current setpoints in °F.fan_mode—auto/low/med/high.current_activity— Infinity activity name (e.g.home,away,sleep,manual).hold_active— true if the zone is in a manual hold.system_mode— duplicate ofstatefor clarity when the macro author wants per-zone vs. system distinction.
Commands
| Command | Args | Notes |
|---|---|---|
get_status | — | Raw /api/status. |
get_config | — | Raw /api/config. |
get_zones | — | Summarized list of zones (id, name, enabled). |
set_mode | mode | System-wide. off / auto / heat / cool / fanonly. |
set_setpoint | address, htsp, clsp, mode?, fan?, until? | Per-zone hold. until accepts "HH:MM" (24 h) or "forever". If mode is set, the system mode is updated first. |
hold | address, htsp?, clsp?, fan?, until? | Alias of set_setpoint without the optional mode field. |
set_fan | address, fan | Per-zone fan override. |
clear_hold | address | Releases a manual hold; the zone returns to its schedule. |
refresh | — | Force an immediate status poll. |
Known limitations
- Setpoint writes take 60–120 s to propagate. The thermostat polls Infinitude on its own cadence; the proxy holds the change until the next check-in.
- High fan speed is not available on all blower configurations — request silently downgrades.
- Schedule editing (changing the program itself) is intentionally out of scope. Infinitude has a UI for that; use it directly when you need it. This driver only manipulates holds.
- Multi-system Infinitude installs are supported by configuring
system_id, but the driver is single-system per GEM device row. Add a second device row to control a second system.
Troubleshooting
/api/statusreturns 404: the Infinitude server is running but the thermostat hasn't phoned home yet. Wait 5–10 minutes after re-pointing the unit.- Status reads work but holds do nothing: confirm the thermostat is still pointed at Infinitude (factory updates occasionally reset the destination URL).
- Polling errors with
ECONNREFUSED: Infinitude container is down. Restart it. - HTTP 401: a reverse proxy is in front. Set
usernameandpasswordon the device row.