A Home Assistant custom integration for Gulfstream, Aqua Comfort, Built Right, and other pool/spa heat pumps that use the ICM Controls Compass WiFi module and the Compass mobile app.
| Platform | Entities |
|---|---|
| Climate | Full thermostat control — Off / Pool Heat / Spa Heat, target temperature (50-104°F or Off) |
| Sensors | Water Temperature, Coil Temperature, Pool Setpoint, Spa Setpoint, System Mode, Fault Status, Defrost Mode, Last Online |
| Switches | Vacation Hold, Pool Cool, Pool Heat/Cool, Defrost Mode (Air/Reverse Cycle), Panel Lock |
| Numbers | Pool Heat/Cool Deadband (2-8°F), Defrost End Temperature (42-50°F), Sensor Calibration (-10 to +10°F), Spa Timer Hours (0-20), Spa Timer Minutes (0/15/30/45) |
- A pool/spa heat pump with the ICM Controls Compass WiFi module
- An active Compass app account (email + password)
- The heat pump registered and working in the Compass mobile app
- Open HACS in Home Assistant
- Go to Integrations → three-dot menu → Custom repositories
- Add
https://github.com/cjam28/compass-pool-heater-haas an Integration - Click Download
- Restart Home Assistant
Copy the custom_components/compass_pool_heater folder into your Home Assistant config/custom_components/ directory and restart.
- Go to Settings → Devices & Services → Add Integration
- Search for Compass Pool Heater
- Enter your Compass app email and password
- If you have multiple heat pumps, select which one to add
- Done — entities appear automatically
The main thermostat entity with:
- HVAC Modes: Off, Heat
- Presets: Pool, Spa
- Temperature range: 50-104°F (setpoint of 0 = Off)
| Sensor | Description |
|---|---|
| Water Temperature | Current water temperature (°F) — RMT register |
| Coil Temperature | Heat pump coil temperature (°F) — GEN15 register |
| Pool Setpoint | Current pool target temperature or "Off" |
| Spa Setpoint | Current spa target temperature or "Off" |
| System Mode | Off / Pool Heat / Spa Heat |
| Fault Status | No Fault, No Flow, or fault code |
| Defrost Mode | Air Defrost or Reverse Cycle |
| Last Online | Timestamp of last communication |
| Switch | App Setting | API Field |
|---|---|---|
| Vacation Hold | Vacation Hold | VH |
| Pool Cool | #11 Pool Cool | DF1 |
| Pool Heat/Cool | #12 Pool Heat/Cool | DF2 |
| Defrost Mode (Air Defrost) | #17 Defrost Mode | DFL (1=Air, 0=Reverse Cycle) |
| Panel Lock | #2 Lock | LKO |
| Control | App Setting | API Field | Range |
|---|---|---|---|
| Pool Heat/Cool Deadband | #13 Pool Heat/Cool Deadband | DFU |
2-8°F |
| Defrost End Temperature | #18 Defrost End | AXD |
42-50°F |
| Sensor Calibration | Sensor Calibration | CAL |
-10 to +10°F |
| Spa Timer Hours | #15 Spa Timer (hours) | DF3 |
0-20 |
| Spa Timer Minutes | #15 Spa Timer (minutes) | STOF |
0, 15, 30, 45 |
This integration communicates with the ICM Controls cloud API at captouchwifi.com — the same backend used by the Compass mobile app. The heat pump connects to WiFi and maintains a persistent connection to the cloud; commands are relayed through it.
Polling interval: 30 seconds (configurable).
| API Field | Compass App Setting | Description |
|---|---|---|
MD |
#1 System Mode | 0=Off, 1=Pool Heat, 4=Spa Heat |
LKO |
#2 Lock | 0=Unlocked, 1=Locked |
CHGF |
#3 Fault Conditions | 0=No Fault, 8=No Flow |
GEN15 |
#4 Coil Temperature | Read-only sensor (°F) |
RMT |
Water Temperature | Read-only sensor (°F) |
DF1 |
#11 Pool Cool | 0=Disabled, 1=Enabled |
DF2 |
#12 Pool Heat/Cool | 0=Disabled, 1=Enabled |
DFU |
#13 Pool Heat/Cool Deadband | Range 2-8 (°F) |
DF3 |
#15 Spa Timer (hours) | Range 0-20 |
STOF |
#15 Spa Timer (minutes) | 0, 15, 30, 45 |
DFL |
#17 Defrost Mode | 0=Reverse Cycle, 1=Air Defrost |
AXD |
#18 Defrost End | Range 42-50 (°F) |
CAL |
Sensor Calibration | Range -10 to +10 (°F) |
VH |
Vacation Hold | 0=Off, 1=On |
RSV1 |
Pool Setpoint | 0=Off, 50-104 (°F) |
RSV2 |
Spa Setpoint | 0=Off, 50-104 (°F) |
Any pool/spa heat pump using the ICM Controls Compass WiFi module, including:
- Gulfstream (confirmed working)
- Aqua Comfort
- Built Right
- Other ICM Controls-based units with the Compass app
This blueprint automatically coordinates your pool pump with the heater to prevent "No Flow" faults and handle stale temperature readings (the water temp sensor at the heater reads stagnant pipe water when the pump is off).
Three behaviors:
- Auto-Start — turns the pump on when heating is activated
- Periodic Check — every N minutes, if the heater wants to heat but the pump is off, starts the pump, waits for a fresh reading, and decides whether to keep it running or shut it back off
- Auto-Stop — optionally turns the pump off after a configurable delay when the heater is turned off
The blueprint works with any pump controller — njsPC-HA, Pentair ScreenLogic, Hayward OmniLogic, a simple relay switch, or anything else in Home Assistant. You define exactly what "start pump" and "stop pump" mean for your setup via the action selectors.
The blueprint is automatically installed when you add the integration. After installing or updating via HACS and restarting Home Assistant, you will see a persistent notification prompting you to configure it.
- Go to Settings → Automations & Scenes → Blueprints
- Find Compass Pool Heater – Pump Coordination
- Click Create Automation
- Configure the inputs (see below) for your pump setup
- Save and enable the automation
Manual import (alternative)
If you prefer to import manually, go to Blueprints → Import Blueprint and paste:
https://github.com/cjam28/compass-pool-heater-ha/raw/main/blueprints/automation/compass_pool_heater/pump_coordination.yaml
| Input | Description | Default |
|---|---|---|
| Pool Heater | Compass heater climate entity | — |
| Water Temperature Sensor | Water temp sensor (from heater) | — |
| Pump State Entity | Entity showing pump on/off (binary_sensor, switch, etc.) | — |
| Pump "On" State Value | State value meaning the pump is running | on |
| Pump Start Action | Action(s) to start the pump | — |
| Pump Stop Action | Action(s) to stop the pump | — |
| Check Frequency | How often to check temp when pump is off | Every 60 min |
| Pump Warmup Time | Seconds to run pump for a fresh temp reading | 120 |
| Pump-Off Delay | Minutes to keep pump on after heater turns off (0 = disabled) | 5 |
| Input | Value |
|---|---|
| Pump State Entity | switch.pool_pump |
| Pump "On" State Value | on |
| Pump Start Action | Service switch.turn_on on switch.pool_pump |
| Pump Stop Action | Service switch.turn_off on switch.pool_pump |
| Input | Value |
|---|---|
| Pump State Entity | binary_sensor.pump_running_state |
| Pump "On" State Value | on |
| Pump Start Action | Service script.turn_on on script.pump_set_speed_exclusive with data target: default |
| Pump Stop Action | Service script.turn_on on script.pump_all_speeds_off |
An all-in-one blueprint for pump scheduling with optional occupancy-based speed control and heater guest/vacant temperature management. Occupancy sensors are not required — without them the blueprint works as a pure time-based pump schedule. Use it alongside the Pump Coordination blueprint above.
Three usage tiers:
| Tier | What you configure | What you get |
|---|---|---|
| Time-only | Pump actions + schedule times | Pump runs low overnight, default midday, off otherwise |
| Time + manual occupied/vacant | Add the Pool Occupied Mode Toggle | Same pump schedule plus a dashboard toggle (ON = Occupied, OFF = Vacant) to switch between occupied and vacant heater temperatures |
| Full occupancy | Add occupancy sensors | Automatic occupied/vacant switching based on house presence, and pump max speed when the pool is in use |
What it does:
- Pump Schedule — runs the pump at low speed overnight and default speed midday (times are configurable)
- Heater-Aware Pump Control — at schedule boundaries, if the heater is in heat mode the pump drops to low speed instead of turning off, preventing No Flow faults
- Pool Occupancy Override (optional) — when the pool area is occupied, the pump switches to max speed; when guests leave, it returns to the scheduled speed
- Heater Occupied/Vacant Mode (optional) — when the house is occupied, the heater is set to the occupied temperature (default 86°F); after no occupancy for a configurable period (default 12 hours), it drops to the vacant temperature (default 78°F)
- Dashboard Toggle (optional) — a Pool Occupied Mode
input_boolean(ON = Occupied, OFF = Vacant) can be toggled manually from the dashboard to override occupancy detection
If using occupied/vacant temperature mode (Tier 2 or 3), create one helper:
- Settings → Devices & Services → Helpers → Create Helper → Toggle
- Name it
Pool Occupied Mode(entity:input_boolean.pool_occupied_mode) - ON = Occupied (heater at occupied temperature), OFF = Vacant (heater at vacant temperature)
For time-only mode (Tier 1), no helpers are needed.
- Go to Settings → Automations & Scenes → Blueprints
- Find Compass Pool Heater – Smart Schedule
- Click Create Automation
- Configure the required inputs (Pool Heater, pump actions, schedule times)
- Optionally fill in Pool Occupied Mode Toggle, House Occupancy Sensor, and/or Pool Area Occupancy Sensor for additional features
- Save and enable
Manual import (alternative)
If you prefer to import manually, go to Blueprints → Import Blueprint and paste:
https://github.com/cjam28/compass-pool-heater-ha/raw/main/blueprints/automation/compass_pool_heater/pool_smart_schedule.yaml
| Input | Required | Description | Default |
|---|---|---|---|
| Pool Heater | Yes | Compass heater climate entity | — |
| Pool Occupied Mode Toggle | No | input_boolean helper (ON = Occupied, OFF = Vacant) |
(blank) |
| House Occupancy Sensor | No | Binary sensor or group for house occupancy | (blank) |
| Pool Area Occupancy Sensor | No | Binary sensor or group for pool area | (blank) |
| Pump Low Speed Action | Yes | Action(s) to set pump to low speed | — |
| Pump Default Speed Action | Yes | Action(s) to set pump to default speed | — |
| Pump Max Speed Action | No | Action(s) to set pump to max speed (only with pool occupancy) | (none) |
| Pump Off Action | Yes | Action(s) to turn pump off | — |
| Occupied Temperature | — | Heater setpoint when toggle is ON (occupied) | 86°F |
| Vacant Temperature | — | Heater setpoint when toggle is OFF (vacant) | 78°F |
| Vacant Mode Delay | — | Hours of no occupancy before switching to vacant temp | 12 |
| House Occupied Debounce | — | Seconds house sensor must stay on before toggling to occupied | 30s |
| Pool Occupied Debounce | — | Seconds pool sensor must stay on before switching to max speed | 30s |
| Pool Cooldown | — | Minutes after pool area clears before dropping from max speed | 5 |
| Night Pump Start | — | Overnight low-speed filtration start time | 10:00 PM |
| Night Pump End | — | Overnight filtration end time | 6:00 AM |
| Midday Pump Start | — | Midday circulation start time | 11:00 AM |
| Midday Pump End | — | Midday circulation end time | 2:00 PM |
| Input | Value |
|---|---|
| Pool Heater | climate.bali |
| Pump Low Speed Action | Service switch.turn_on on switch.pool_pump |
| Pump Default Speed Action | Service switch.turn_on on switch.pool_pump |
| Pump Off Action | Service switch.turn_off on switch.pool_pump |
Leave Pool Occupied Mode Toggle, House Occupancy Sensor, Pool Area Occupancy Sensor, and Pump Max Speed Action blank.
| Input | Value |
|---|---|
| Pool Occupied Mode Toggle | input_boolean.pool_occupied_mode |
| House Occupancy Sensor | binary_sensor.house_occupancy |
| Pool Area Occupancy Sensor | binary_sensor.pool_area_motion |
| Pump Low Speed Action | script.pump_set_speed_exclusive with data target: low |
| Pump Default Speed Action | script.pump_set_speed_exclusive with data target: default |
| Pump Max Speed Action | script.pump_set_speed_exclusive with data target: max |
| Pump Off Action | script.pump_all_speeds_off |
The Pump Coordination and Smart Schedule blueprints are designed to work together. Smart Schedule manages the pump timetable and heater setpoints; Pump Coordination acts as a safety net to ensure the pump runs whenever the heater needs water flow.
Recommended Pump Coordination settings when using Smart Schedule:
| Setting | Recommended Value | Why |
|---|---|---|
| Pump-Off Delay | 0 (disabled) | Smart Schedule already manages pump on/off timing. A non-zero delay would turn the pump off mid-schedule window when the heater turns off. |
| Check Frequency | Every 15 minutes | Shorter interval means Pump Coordination catches any gaps faster. |
How they interact: Smart Schedule controls the pump schedule, but if the heater is in heat mode it keeps the pump at low speed instead of turning it off at schedule boundaries. Pump Coordination's periodic check catches any remaining case where the pump is off but the heater needs flow, starts the pump, checks the temperature, and either keeps it running or shuts it back off.
- "Invalid email or password": The API uses your email as the
usernamefield. Make sure you can log in to the Compass mobile app with the same credentials. - Stale data: The cloud API is polled every 30 seconds. If the heater is offline, the last known state is shown.
- "No Flow" fault: This is reported by the heat pump itself when it detects insufficient water flow. Check your pool pump.
Extracted from the Compass app source:
| CHGF Value | Fault Description |
|---|---|
| 0 | No Current Fault |
| 8 | No Flow (confirmed) |
| ? | Evap. Sensor Malfunction |
| ? | Water Sensor Malfunction |
| ? | Low Pressure Switch |
| ? | High Pressure Switch |
Only CHGF=8 has been confirmed via live testing. The other fault codes exist in the app but their exact CHGF values haven't been mapped yet. If you encounter a different fault code, the raw value will be shown — please report it so we can complete the mapping!
MIT