A modern, fully async Home Assistant integration for Warmup underfloor heating thermostats (4IE, 6IE). Configurable entirely through the UI — no YAML required.
Forked from ha-warmup/warmup and rewritten to use modern Home Assistant patterns: config flow,
DataUpdateCoordinator, async aiohttp, and proper sensor entities.
The original integration required editing configuration.yaml and used a synchronous blocking API client. This fork rewrites the integration from the ground up:
- GUI setup — add your Warmup account via Settings → Integrations, no YAML needed
- Re-authentication flow — prompts you to log in again if your session expires, without breaking your existing setup
- Async polling — uses Home Assistant's shared aiohttp session; no extra Python packages required
DataUpdateCoordinator— all thermostats share a single 60-second polling cycle- Proper sensor entities — floor temperature, air temperature, away/comfort/sleep/override temperatures, energy and cost are now real HA sensor entities with device classes, state classes and units — not hidden state attributes
- Device registry — each thermostat appears as a named HA device with all its entities grouped together
- Modern service definition —
warmup.set_overrideuses atarget:selector so you can pick the thermostat from the UI
| Device | Status |
|---|---|
| 4IE | Full support |
| 6IE | Works — keep your Wi-Fi SSID ≤ 32 chars and password ≤ 15 chars |
- In Home Assistant, go to HACS → Integrations → ⋮ → Custom repositories
- Add
https://github.com/andrejkurlovic/warmupas an Integration - Search for Warmup and install it
- Restart Home Assistant
cd /path/to/your/ha/config
git clone https://github.com/andrejkurlovic/warmup.git /tmp/warmup-fork
rm -rf ./custom_components/warmup
cp -r /tmp/warmup-fork/custom_components/warmup ./custom_components/warmup
rm -rf /tmp/warmup-forkRestart Home Assistant after copying.
- Go to Settings → Devices & Services → Add Integration
- Search for Warmup
- Enter your my.warmup.com email and password
- Done — your thermostats appear as devices automatically
Each thermostat is registered as a HA device named after the room. You'll get:
- A climate entity to control temperature and mode
- Sensor entities for floor temp, air temp, and more (see below)
One per thermostat. Supports:
| Feature | Detail |
|---|---|
| HVAC modes | heat, auto, off |
| Preset modes | home (programme), away (frost protection) |
| Target temperature | 0.5 °C steps |
| Sensor | Enabled by default |
|---|---|
| Floor temperature | Yes |
| Air temperature | Yes |
| Away temperature | No |
| Comfort temperature | No |
| Sleep temperature | No |
| Override temperature | No |
| Energy | No |
| Cost | No |
Disabled sensors can be enabled per-device in Settings → Devices & Services → Warmup → [device] → entities.
Override the target temperature until a given time.
| Field | Required | Description |
|---|---|---|
target (entity) |
Yes | The climate entity to override |
temperature |
Yes | Target temperature in °C (0.5° steps) |
until |
No | End time as HH:MM. Defaults to 1 hour from now |
Example:
service: warmup.set_override
target:
entity_id: climate.bathroom
data:
temperature: 22.5
until: "14:00"Every 60-second poll, the integration fetches the weekly programme schedule from the Warmup cloud and exposes it on each climate entity:
| Attribute | Contents |
|---|---|
schedule_raw |
Full 7-day programme list as returned by the Warmup API |
schedule_today |
Today's entry extracted from schedule_raw |
These are visible in Developer Tools → States and usable in template sensors. They are read-only via polling. To write a schedule, use warmup.set_schedule.
Logs the current room schedule to the HA system log in a format ready to paste into warmup.set_schedule. No API writes, no state changes.
| Field | Required | Description |
|---|---|---|
entity_id |
Yes | Climate entity to read the schedule from |
service: warmup.copy_current_schedule_template
data:
entity_id: climate.bathroomCheck Settings → System → Logs for a WARNING entry from custom_components.warmup containing the schedule JSON.
Write a weekly programme schedule to the Warmup cloud for one room.
Warning: Each call fully replaces the programme for the days in that group. Days that share identical time-window patterns are sent in one
setProgrammecall — matching Warmup Android app behaviour. Only use this on rooms inauto(programme) mode.
dry_run defaults to true — no API call is made unless you explicitly pass dry_run: false. Always verify the dry-run log before live-writing.
| Field | Required | Default | Description |
|---|---|---|---|
entity_id |
Yes | — | Climate entity to write the schedule to |
schedule |
Yes | — | List of exactly 7 day entries (day 0=Sunday … 6=Saturday) |
dry_run |
No | true |
true = log payload only; false = send to API |
Recommended workflow:
- Call
warmup.copy_current_schedule_template→ copy the logged JSON - Edit times/temperatures as needed
- Call
warmup.set_schedulewithdry_run: true→ inspect the log output - Call
warmup.set_schedulewithdry_run: falseto commit
Safe example (write back the existing schedule unchanged, dry-run first):
service: warmup.set_schedule
data:
entity_id: climate.bathroom
dry_run: true # set to false only after confirming the dry-run log
schedule:
- day: "0" # Sunday
mode: "0"
type: "0"
node: "2"
value:
- {start: "07:00", end: "11:00", temp: "220"}
- {start: "18:00", end: "23:00", temp: "200"}
- day: "1" # Monday
mode: "0"
type: "0"
node: "2"
value:
- {start: "06:00", end: "08:00", temp: "220"}
- {start: "19:00", end: "23:00", temp: "200"}
- day: "2" # Tuesday (same as Monday)
mode: "0"
type: "0"
node: "2"
value:
- {start: "06:00", end: "08:00", temp: "220"}
- {start: "19:00", end: "23:00", temp: "200"}
- day: "3" # Wednesday
mode: "0"
type: "0"
node: "2"
value:
- {start: "06:00", end: "08:00", temp: "220"}
- {start: "19:00", end: "23:00", temp: "200"}
- day: "4" # Thursday
mode: "0"
type: "0"
node: "2"
value:
- {start: "06:00", end: "08:00", temp: "220"}
- {start: "19:00", end: "23:00", temp: "200"}
- day: "5" # Friday
mode: "0"
type: "0"
node: "2"
value:
- {start: "06:00", end: "08:00", temp: "220"}
- {start: "19:00", end: "23:00", temp: "200"}
- day: "6" # Saturday
mode: "0"
type: "0"
node: "2"
value:
- {start: "07:00", end: "11:00", temp: "220"}
- {start: "18:00", end: "23:00", temp: "200"}temp values are tenths-of-a-degree strings: "220" = 22.0 °C, "185" = 18.5 °C.
Add to your configuration.yaml:
logger:
default: warning
logs:
custom_components.warmup: debugApache 2.0 — see LICENSE.md.
This fork is maintained by @andrejkurlovic.
The integration originated as @alex-0103's Home Assistant custom component, inspired by @alyc100's SmartThings driver. It was developed further by the ha-warmup community — notably @foxy82, @artmg, @rct, @robchandhok, and @kkoenen — before this fork modernised the architecture.
Warmup Plc are not affiliated with or involved in this project. All Warmup trademarks belong to them.