American Standard Home / Trane Home (Nexia)
GEM controls American Standard Home, Trane Home and legacy Nexia thermostats — the Trane XL824 / XL850 / XL1050 and American Standard Gold / Platinum models — through the same cloud service the homeowner's phone app uses. You sign in with the account email and password; there is no activation code to fetch from the thermostat.
One GEM device covers the whole house. Every Nexia zone in the account becomes its own GEM climate zone with its own temperature, heat and cool setpoints, and mode. That matters on a zoned system: a single XL1050 can drive several dampered zones, and each one shows up separately.
There is no LAN path to these thermostats — the GEM server needs outbound HTTPS. It works reliably, but a service change on the vendor's side can break it until the driver is updated. Keep local hardware (relays, BACnet, Modbus) for anything that must run with the internet down.
Pick the right brand
The service split by brand, and the old mynexia.com host no longer signs in accounts that have
been migrated — it answers with "you'll need to download American Standard Home". Set the
Brand attribute to match the app the homeowner actually uses:
| Brand | Service | App |
|---|---|---|
asair (default) | asairhome.com | American Standard Home |
trane | tranehome.com | Trane Home |
nexia | www.mynexia.com | Legacy Nexia accounts that were never migrated |
If sign-in fails telling you to download a different app, that message names the brand you should be using. Switch the attribute and save.
Prerequisites
- A working account with the thermostats enrolled and online — confirm they respond in the phone app before adding them to GEM.
- The account email and password.
- Outbound HTTPS from the GEM server.
Each sign-in adds an entry to the homeowner's connected-devices list in their app, and revokes the previous entry for that brand. GEM stores the credentials it gets back and reuses them across restarts, so this normally happens once. If the homeowner signs the same account into another integration that also uses username/password, the two will keep revoking each other — give each integration its own account login if you can.
Add the house
- Open System → Devices and click Add Device.
- For Driver, choose American Standard Home / Trane Home (Nexia).
- Subsystem pre-selects Climate. Leave it there.
- Name the device for the house (e.g.
driftwood_hvac), not for one thermostat. - Under Authentication, enter the Account Email and Account Password (stored encrypted). Leave Mobile ID and API Key blank — GEM fills them in after signing in.
- Under Connection, set the Brand. Leave House ID blank unless the account holds more than one house; GEM discovers it and saves it.
- Save. GEM signs in, finds the house, and creates one climate zone per Nexia zone.
Zones are named from the thermostat and zone names in the app. A single-zone thermostat is named
after the thermostat itself (the cloud's internal NativeZone placeholder is never shown); on a
zoned system you get names like Kitchen and Kitchen Upstairs.
To map zones by hand instead, turn off Auto-create Zones and set each zone's address to
the Nexia zone id. Run discover to list them.
How you control it
Commands are addressed to a zone, so the normal path is the zone's climate control in a UI, or a macro/trigger/schedule targeting the zone.
| Command | Argument | Values | What it does |
|---|---|---|---|
setpoint | setpoint, mode | whole number; mode = heat or cool | Sets one side of the zone's setpoint pair. With mode omitted it follows the zone's current mode |
system_mode | mode | off, heat, cool, auto | Sets the zone's mode |
fan_mode | mode | auto, on, circulate | Sets the fan mode — thermostat-level, see below |
run_mode | mode | run_schedule, permanent_hold | Follow the thermostat's schedule, or hold the current setpoints |
get_status | — | — | Refreshes the whole house now instead of waiting for the next poll |
discover | — | — | Lists every thermostat and zone with its id, model, mode and readings |
sign_in | — | — | Forces a fresh sign-in. Only needed if the stored credentials were lost |
Setpoints are whole numbers in the thermostat's own scale (°F on a typical North American install) — GEM passes them through without converting.
Setpoints are clamped, and the pair is kept apart
Each thermostat reports its own limits (typically heat 55–90, cool 60–99) and a minimum separation between the heat and cool setpoints (usually 3°). The cloud enforces the separation by silently moving the other setpoint, and it does not range-check at all — it will accept a cool setpoint of 120.
So GEM does both checks before sending: a value outside the reported limits is clamped, and if the
new setpoint would crowd the other side, the other side moves to preserve the separation. Both
adjustments are written to the device log, so if a setpoint lands somewhere other than what you
asked for, the log says why. A wider separation can be set per zone with the deadband attribute
or on the Climate subsystem; a narrower one than the equipment allows is ignored.
Setpoints only stick if the zone is holding
A zone following its schedule will revert your setpoint at its next scheduled transition. Send
run_mode = permanent_hold first (or as part of the same macro) to make a change persist.
Zones that don't run a schedule don't expose run mode at all, and the command reports that
rather than pretending to work.
Fan mode belongs to the thermostat
Fan mode is a property of the thermostat, not the zone. On a zoned system, changing it from one zone changes it for every zone on that thermostat. This is how the equipment works, not a GEM limitation.
Live status
Every poll (default 60 seconds — one request covers the entire house) refreshes each zone:
| Reading | Meaning |
|---|---|
temperature | Current measured temperature in the zone |
setpoint | The active setpoint — the cool side in Cool and Auto, the heat side in Heat |
heat_setpoint / cool_setpoint | The two setpoints individually |
system_mode | heat, cool, auto, or off |
fan_mode | auto, on, or circulate |
run_mode | run_schedule or permanent_hold, on zones that have a schedule |
system_status | What the equipment is doing (Cooling, Damper Open, System Idle, …) |
humidity | Indoor humidity, where the thermostat measures it |
min / max | Setpoint limits reported by the equipment |
system_modes / fan_modes | The modes this equipment actually offers, written once so a control can build its picker from the hardware rather than a fixed list |
These are stored as zone attributes, so they carry history and can drive attribute triggers. The
house's outdoor temperature is stored on the device as outdoor_temperature. A thermostat
that drops offline marks its zones disconnected rather than freezing at a stale reading.
Known limitations
- Cloud-only. No LAN path; a vendor service change can break the integration.
- Fan mode is per thermostat, so zones sharing a thermostat share a fan mode.
- Whole-degree setpoints.
- One account per device. An account with several houses needs one GEM device per house, each with its House ID set.
- Sign-in is exclusive per brand — a second integration signing into the same account revokes GEM's credentials, and GEM's next sign-in revokes theirs.
Troubleshooting
| Symptom | Check |
|---|---|
| Sign-in fails saying to download a different app | The account was migrated to another brand. Set Brand to match the app the homeowner uses. |
Device offline, log shows mobile device is not valid | The stored registration was revoked, usually because the same account was signed into another integration. GEM re-signs in automatically, at most once a minute. If it repeats, the account is being shared. |
Device offline, log shows missing username/password attribute | Fill in both authentication fields and save. |
| No zones were created | Confirm the Climate subsystem exists and Auto-create Zones is on. Run discover to see what the account reports. |
| A setpoint landed somewhere else | It was clamped to the thermostat's limits, or the other side moved to keep the minimum separation. The device log records the adjustment. |
| A setpoint reverted a few hours later | The zone is following its schedule. Send run_mode = permanent_hold. |
run_mode reports the zone doesn't support it | That zone has no schedule to hold or resume — expected on some single-zone systems. |
| Changing fan mode on one zone changed another | Expected: zones on the same thermostat share one fan. |
| One zone shows disconnected while others are fine | That thermostat is offline. Confirm it in the app — it is a Wi-Fi or power problem at the thermostat. |