Schluter DITRA-HEAT-E-WiFi (Cloud)
GEM controls Schluter DITRA-HEAT-E-WiFi floor-heating thermostats through the ditra-heat-e-wifi.schluter.com cloud REST API. One GEM device represents one Schluter account; each thermostat registered to the account appears as a zone underneath it, keyed by its serial number. Zones are created automatically on the first poll after connect.
The thermostat is an OJ Electronics OWD5 white-label. It has no local API — the cloud portal is the only programmatic control surface, so state freshness is bounded by the poll interval (60 seconds by default).
Prerequisites
- A Schluter DITRA-HEAT-E-WiFi account (created in the mobile app or at ditra-heat-e-wifi.schluter.com) with the thermostats registered to it.
- Outbound HTTPS (port 443) from the GEM server to
ditra-heat-e-wifi.schluter.com.
If you can sign into the Schluter app and see the thermostat, the driver will be able to reach it.
Setup
- Add a new device of type Schluter DITRA-HEAT-E-WiFi (Cloud) under System → Devices.
- Set:
- Schluter Account Email — same email used to sign into the Schluter app.
- Schluter Account Password — same password (stored encrypted as a secure attribute).
- Save and reload. On the first poll the driver creates one Climate zone per registered thermostat, addressed by serial number and using the Climate (Setpoint) control. Rename the zones and assign them to site spaces as you like — the driver never rewrites a zone it has already created.
- Optional: run the
get_thermostatscommand from System → Commands (or the Script Console) to see what the account reports; the response is an array of{serial_number, room, group, temperature, setpoint, regulation_mode, heating, online, sw_version}.
The driver polls the account every 60 seconds (configurable via status_interval) and surfaces temperature, setpoint, state, demand, regulation_mode, online, watts, sw_version, and error_code per zone.
Zone auto-creation
Auto-creation is on by default and can be turned off with the auto_create_zones device attribute, which leaves zone mapping entirely manual (Address = thermostat serial number, subsystem = Climate).
The zone label comes from the thermostat's room name in the Schluter app, prefixed by the group name when the account uses one — a thermostat in room Primary 1 becomes a zone labelled Primary 1. When neither is set, the label falls back to thermostat <serial>.
The driver will not recreate a zone you disabled — disabling a zone is how you tell it to leave a thermostat alone. If the derived zone name collides with an unrelated zone, the new zone is created with the serial number appended; if that is taken too, the create is skipped and logged.
Temperature units
The Schluter API works in centi-degrees Celsius (2450 = 24.5 °C). The driver converts to whole degrees Fahrenheit for all GEM zone attributes and converts back on writes, snapping setpoints to the thermostat's 0.5 °C steps.
Attribute reference
Device attributes
| Attribute | Required | Type | Default | Notes |
|---|---|---|---|---|
username | yes | string | — | Schluter account email |
password | yes | string (secure) | — | Schluter account password |
status_interval | no | int | 60000 | Cloud poll interval in ms (minimum 15000) |
auto_create_zones | no | bool | true | Create a Climate zone per thermostat the account reports. Turn off to map zones by hand. |
Zone attributes
| Attribute | Required | Type | Notes |
|---|---|---|---|
address | yes | string | Thermostat serial number from get_thermostats. Filled in automatically when auto_create_zones is on. |
min | no | int | Lower setpoint clamp (°F); defaults to the thermostat's own limit |
max | no | int | Upper setpoint clamp (°F); defaults to the thermostat's own limit |
Zone state attributes (driver-maintained)
| Attribute | Type | Notes |
|---|---|---|
temperature | int | Floor temperature (°F) |
setpoint | int | Active target temperature (°F) |
state | string | on while the relay is heating, else off |
demand | bool | Same signal as state, boolean form |
regulation_mode | string | schedule, comfort, manual, or vacation |
online | bool | Thermostat reachable from the Schluter cloud |
watts | int | Measured heating load, when the thermostat reports one |
error_code | int | 0 when healthy — non-zero indicates a fault (GFCI trip, sensor fault) |
sw_version | string | Thermostat firmware version |
Commands
| Command | Args | Notes |
|---|---|---|
setpoint | address, setpoint (°F) | Permanent manual hold at the given temperature |
regulation_mode | address, mode (schedule | manual) | schedule follows the program; manual holds the current setpoint |
resume_schedule | address | Cancel any hold and return to the programmed schedule |
get_thermostats | — | List all thermostats on the account |
comfort (temporary hold) and vacation modes are reported when set from the Schluter app but cannot be written from GEM — comfort requires an end time and vacation a date window, neither of which the portal accepts on a bare mode write.
Behavior notes
- Session handling — the portal expires sessions server-side without notice. The driver re-authenticates on 401 and retries the request once; on invalid credentials it stops polling entirely until the device is reloaded with corrected values.
- Backoff — when the cloud is unreachable the poll interval backs off exponentially (capped at 15 minutes) and the device is flagged disconnected after 5 consecutive failures.
- Setpoint writes are confirmed by a fast follow-up poll about 3 seconds after the write.
Troubleshooting
| Symptom | Check |
|---|---|
| Login fails / device never connects | Verify credentials by signing into ditra-heat-e-wifi.schluter.com. Reload the device after correcting them. |
| No zones were created | Confirm a Climate subsystem exists and auto_create_zones is on. Run get_thermostats — a thermostat the portal does not list cannot be auto-created. A zone you previously disabled is deliberately not recreated. |
get_thermostats returns nothing | Confirm the thermostats are assigned to this account in the Schluter app — on WiFi alone is not enough. |
| One zone offline while others update | The portal reports that thermostat offline — check its WiFi from the thermostat screen (Settings → WiFi). A tripped GFCI also drops it offline. |
| Setpoint accepted but the floor stays cold | Check the error_code attribute and the thermostat screen — a GFCI trip or floor-sensor fault blocks heating regardless of setpoint. |