Skip to main content

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

  1. Install Infinitude. The Docker pattern is:
    docker run -d --name infinitude -p 3000:3000 nebulous/infinitude
  2. On the thermostat, switch the destination from the Carrier / Bryant cloud to the Infinitude host. The unit will check in within ~5 minutes.
  3. Verify the proxy is alive: curl http://<infinitude-ip>:3000/api/status should return a JSON document with a zones array.
  4. In GEM admin, add a device with driver carrier_infinity and set ip to the Infinitude server. Leave port at 3000 and system_id at 1 unless you intentionally run a multi-system Infinitude install.
  5. Run the get_zones command to enumerate the (up to 8) Infinity zones reported by the thermostat. For each zone you want to control, create a GEM zone with address = the Infinity zone id ("1", "2", ...).

Attributes

Device

NameRequiredDescription
ipyesLAN IP / hostname of the Infinitude server.
portnoHTTP port. Default 3000.
protocolnohttp or https. Default http.
system_idnoInfinitude system identifier (1 for typical deployments).
usernamenoOnly set if you reverse-proxy Infinitude behind HTTP basic auth.
passwordnoBasic-auth password — encrypted at rest.
status_intervalnoPoll 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_modeauto / 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 of state for clarity when the macro author wants per-zone vs. system distinction.

Commands

CommandArgsNotes
get_statusRaw /api/status.
get_configRaw /api/config.
get_zonesSummarized list of zones (id, name, enabled).
set_modemodeSystem-wide. off / auto / heat / cool / fanonly.
set_setpointaddress, 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.
holdaddress, htsp?, clsp?, fan?, until?Alias of set_setpoint without the optional mode field.
set_fanaddress, fanPer-zone fan override.
clear_holdaddressReleases a manual hold; the zone returns to its schedule.
refreshForce 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/status returns 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 username and password on the device row.