Pool Card
Water quality, filtration and equipment of a swimming pool or a spa.
Cards for a swimming pool or a spa: colored gauges with their ideal ranges, advice when a value drifts, an animated scene of the pool, the filtration of the day and buttons for the pump, the light, the heat pump, the cover and the electrolyser.
Highlights
- Gauges for water temperature, pH, ORP, free chlorine, salt and TDS, with their ideal ranges
- Advice for every value out of range, and for equipment running without water flow
- Animated pool or spa scene: ripples, bubbles, heat pump, cover, light
- Filtration time of the day against a daily target
- Buttons for the pump, light, heat pump, cover and electrolyser
- iopool, Blue Connect, ESPHome, ScreenLogic, IntelliCenter, OmniLogic and more
- Mini card with a detail button showing the full card
Cards
type: custom:pool-cardInstall
- 1Open the repository in the Marketplace with the Add to Marketplace button above, or add
github.com/juju35/ha-pool-cardas a custom repository (category Dashboard). - 2Download it from the Marketplace.
- 3Reload the browser and add the card from the dashboard editor.
Gallery 16
Documentation
From the README Features
Features
- Two cards: a full Pool Card (
custom:pool-card) and a compact Pool Mini Card (custom:pool-mini-card), for a pool or a spa (kind, guessed from the name) - Animated scene of the pool (or of the round spa) on its deck: the water ripples and a current crosses it while the pump filters, bubbles rise in a spa, the heat pump spins its fan and its flame flickers while it heats, the underwater light glows in its color, the roller cover unrolls and rolls back; the water turns teal on a critical value and green when the disinfection is too low (see Animations)
- Header icon (pool or spa) in a round badge colored with the water status, and a status pill on the title line: Water OK, Check the water, Action needed; its dot blinks while something runs
- Big water temperature with the air temperature, heating and cover state next to the scene
- Colored gauges for water temperature, pH, ORP, free chlorine, salt and TDS: the ideal range in green, a warning margin in orange, critical beyond it in red (cold water in blue), the value marked on it, the ideal range written under it; all ranges configurable (
ranges), in the unit of each sensor (°C or °F, g/L or ppm) - Advice for every value out of its range (pH too high: add pH minus…) and for equipment running without water flow (heat pump heating or electrolyser on while the pump is stopped)
- Filtration: pump state, speed buttons (select or fan presets), time filtered today against a daily target (the
filtration_hoursoption, iopool's recommendation, or the classic rule water temperature ÷ 2), from a sensor or computed from the pump's history - Control buttons for the pump, the light, the heat pump, the cover and the electrolyser; heat pump target with − / + buttons; stopping the pump while the heat pump heats (pump button, or the off option of its speed select) asks for a confirmation (popup at the top of the card, Cancel focused)
- Collapsible sections (advice, filtration, equipment; equipment folded by default), folded back by a click anywhere else on the page
- Detail button on the mini card (top right): it switches the mini card to the full card's content and back; a click anywhere outside the card brings the compact view back
- Click any value to open its Home Assistant history (more-info dialog); buttons disabled while their entity is unavailable
- Visual editor in the dashboard UI for both cards (no YAML needed)
- Light and dark mode, English, French, German, Spanish, Serbian (Cyrillic and Latin), Italian, Dutch, European Portuguese, Polish, Romanian, Danish, Swedish, Bulgarian, Russian, Ukrainian, Hungarian, Slovak, Czech, Slovenian, Latvian and Greek
- Single file, no external dependency, the scene is drawn by the card itself
Supported integrations
Supported integrations
The card reads standard Home Assistant entities: any integration exposing them works. Those below are the usual ones; their entities are found from the device when you pick it.
| Integration | Devices | What the cards show |
|---|---|---|
| iopool ECO probe | Water temperature, pH, ORP, filtration recommendation (target of the day), filtration state (its Filtration binary sensor: the time of the day is computed from its history) | |
| Blue Riiot / Blue Connect — through BlueRiiot2MQTT or an ESPHome BLE bridge | Blue Connect, Blue Connect Go | Water temperature, pH, ORP, salinity |
| DIY probes and controllers (Atlas Scientific, DFRobot…), spa controllers | Any sensor, switch, select, climate, light and cover, recognized from their names (ph, orp, chlorine, salt, tds, pump, light…) |
|
| ScreenLogic, IntelliChem, IntelliChlor, IntelliFlo | Air temperature, pH, ORP and salt (IntelliChem and IntelliChlor sensors, filed as diagnostic but found all the same), pool / spa heaters (climate; their current temperature is the water temperature), lights. The filter pump runs with the Pool circuit: set that switch as pump |
|
| IntelliCenter | Water and air temperature, heaters, pump state (binary sensor; set the Pool body switch as pump to command it), lights, pH, ORP, salt |
|
| OmniLogic, OmniHub | Water and air temperature, pH, ORP, salt level, filter pump (switch), chlorinator output (electrolyser) | |
| iAquaLink | Pool / spa heaters (climate), water and air temperature, pump and aux switches, lights | |
| Any other | Shelly / Sonoff switches, history_stats, template sensors, helpers |
Set each entity in the options: pump, speed, heat pump, electrolyser, light, cover, sensors |
How the card recognizes each entity is detailed in How it works.
Prerequisites
Prerequisites
Home Assistant 2024.8 or later, with the pool's sensors available as entities (see Supported integrations). The filtration time computed from the pump's history needs the pump to be recorded (the default).
Configuration
Configuration
Card types#
| Card | Type |
|---|---|
| Pool Card | custom:pool-card |
| Pool Mini Card | custom:pool-mini-card |
Visual editor#
Edit a dashboard, click Add card and search for Pool Card or Pool Mini Card. The device with the most water quality sensors is preselected; pick another one, set the entities the device does not have under Entities (the pump of another brand, the heat pump, the cover…), the ideal ranges, the daily filtration target, the sections and the language. The preview updates live, and options left at their default are kept out of the generated YAML.
Minimal#
type: custom:pool-card
type: custom:pool-mini-card
Without any option, the card takes the device with the most water quality sensors.
Full options#
type: custom:pool-card
device: Pool
title: Pool
kind: pool
# Entities: each one replaces what the device gives (or completes it)
water_temperature: sensor.pool_temperature
air_temperature: sensor.outdoor_temperature
ph: sensor.pool_ph
orp: sensor.pool_orp
chlorine: sensor.pool_free_chlorine
salt: sensor.pool_salt
tds: sensor.pool_tds
pump: switch.filtration_pump
pump_speed: select.pump_speed
filtration_time: sensor.filtration_today
filtration_target: sensor.pool_filtration_recommendation
heat_pump: climate.pool_heat_pump
electrolyser: switch.pool_electrolyser
light: light.pool_light
cover: cover.pool_cover
filtration_hours: 10
ranges:
ph_min: 7.0
ph_max: 7.4
orp_min: 700
orp_max: 780
chlorine_min: 1
chlorine_max: 2
salt_min: 4
salt_max: 6
water_temperature_min: 26
water_temperature_max: 29
show_title: true
show_subtitle: true
show_controls: true
show_advice: true
show_filtration: true
show_equipment: true
collapsed:
- equipment
language: fr
type: custom:pool-mini-card
device: Garden spa
kind: spa
show_controls: true
zoom: true
Options reference#
| Option | Card | Default | Description |
|---|---|---|---|
device |
both | Device with the most water sensors | Device of the pool (its name as shown in Home Assistant, or its device id, set by the visual editor): its sensors and equipment are discovered |
title |
both | Device name | Card title |
kind |
both | auto |
pool, spa or auto (a spa when the name says spa, jacuzzi, hot tub…): the scene, the icon and the default temperature range |
water_temperature |
both | Discovered | Water temperature sensor (else the heat pump's current temperature) |
air_temperature |
both | Discovered | Air temperature sensor |
ph, orp, chlorine, salt, tds |
both | Discovered | Water quality sensors (chlorine in mg/L or ppm, or in mV for probes that report it so; salt in g/L or ppm) |
pump |
both | Discovered | Filtration pump: switch, input_boolean, fan (its preset modes are the speeds), select (its options are the speeds, its off option stops it) or binary_sensor (state only) |
pump_speed |
both | Discovered | Speed select of the pump |
filtration_time |
both | Discovered | Time filtered today (in min, h or s: a history_stats sensor, a controller's counter…); without it, computed from the pump's history |
filtration_target |
both | Discovered | Daily filtration target (iopool's Filtration recommendation) |
filtration_hours |
both | — | Daily filtration target in hours, instead of the sensor or of water temperature ÷ 2 (pool only) |
heat_pump |
both | Discovered | Heat pump or heater (climate): on / off, target with − / +, heating animation |
electrolyser |
both | Discovered | Salt electrolyser: a switch (on / off button) or a production sensor (in %) |
light |
both | Discovered | Pool light (light or switch): button, glow in the scene in the light's color |
cover |
both | Discovered | Pool cover (cover): open / close button, drawn at its position, animated while it moves |
ranges |
both | See below | Ideal ranges: <measure>_min and <measure>_max for water_temperature, ph, orp, chlorine, salt and tds, in the unit of the sensor |
show_title |
both | true |
Show the title in the header |
show_subtitle |
both | true |
Show the subtitle (filtration state and time of the day) |
show_controls |
both | true |
Control buttons (pump, light, heat pump, cover, electrolyser; pump and light on the mini card) |
show_advice |
full | true |
Advice section |
show_filtration |
full | true |
Filtration section |
show_equipment |
full | true |
Equipment section |
collapsed |
full | [equipment] |
Sections folded by default, among advice, filtration and equipment ([] to unfold everything). Click a section title (or Tab to it and press Enter or Space) to fold or unfold it |
zoom |
mini | true |
Detail button at the top right of the mini card: it shows the full card's content (with the same options) and switches back; a click outside the card also brings the compact view back. false removes the button |
language |
both | Auto | Force language: fr, en, de, es, sr, sr-Latn, it, nl, pt, pl, ro, da, sv, bg, ru, uk, hu, sk, cs, sl, lv or el (auto-detects from HA settings) |
Default ideal ranges#
| Measure | Ideal | Warning margin (beyond: critical) |
|---|---|---|
| Water temperature, pool | 24–30 °C | 3 °C above (below: cold, in blue) |
| Water temperature, spa | 36–39 °C | 1 °C above, critical above 40 °C (below: cold, in blue) |
| pH | 7.2–7.6 | 0.2 (critical outside 7.0–7.8) |
| ORP | 650–800 mV | 50 mV (critical below 600 mV) |
| Free chlorine, pool | 1–3 mg/L | 0.5 below, 2 above (critical above 5 mg/L) |
| Free chlorine, spa | 3–5 mg/L | 1 below, 5 above (critical above 10 mg/L) |
| Salt, in g/L | 3–5 g/L | 0.5 below, 1 above |
| Salt, in ppm | 2700–3400 ppm | 400 below, 600 above |
| TDS | 0–1500 ppm (salt pool: its salt + 1500 ppm) | 500 ppm |
These follow the CDC (free chlorine at least 1 ppm in a pool and 3 ppm in a hot tub, pH 7.0–7.8), the CDC Model Aquatic Health Code (ORP 600–900 mV, chlorine 10 ppm at most), the WHO (ORP around 720 mV) and the US hot tub limit of 40 °C (104 °F). The salt range depends on the electrolyser: a sensor in ppm (Pentair, Hayward and Jandy controllers) gets the 2700–3400 ppm of their cells, one in g/L the 3–5 g/L of most European ones. The TDS of a salt pool includes its salt, so its ideal maximum is the salt level plus 1500 ppm (3000 ppm assumed with an electrolyser and no salt sensor).
Temperatures in °F are converted. Set your own ideal ranges with ranges (or Ideal ranges in the visual editor), for instance the salt range of your electrolyser's manual.
How it works
How it works
With a device, the card goes through the entities of that device in the Home Assistant entity registry and gives each one a role from its domain, device class, unit and names (entity id, translation key, names; the English names of the integrations, and a few French, German and Spanish words for ESPHome and template entities):
| Role | Recognized as |
|---|---|
water_temperature / air_temperature |
A temperature sensor; air, outdoor, ambient… in its name for the air; one named water / pool first; set points, desired temperatures and the controller's own (internal, cpu, solar…) left out |
ph |
Device class ph, or ph as a word in its name, without a unit or in pH |
orp |
orp, redox, red_ox (in mV), or any other sensor in mV |
chlorine, salt, tds |
salt / sel / salinity (in g/L, ppm or mg/L, checked before the chlorine: Chlorinator salt is salt), chlor (in mg/L, ppm or mV), tds (in ppm or mg/L) in the name. Set points, supply and tank levels, dosing states and volumes, alarms are never a measure |
filtration_time / filtration_target |
A filtration sensor in min, h or s; recommendation / target for the target |
pump, pump_speed |
A switch, fan, select or binary sensor named pump, pompe, filtration — not a heat pump, a dosing (pH, chlorine, acid) pump, a booster or a cleaner; a switch first, a binary sensor (state only) last; a select named speed for the speed |
heat_pump, light, cover |
The climate, light and cover entities (and switches named light) |
electrolyser |
A switch named electrolyser / chlorinator (not superchlorinate), or a chlorinator / production sensor in % |
Configuration, disabled and hidden entities are left out, and so are diagnostic ones except water measures (ScreenLogic files its chemistry sensors there). Any role set in the options replaces the discovered one, so the card also works with no device at all, entity by entity.
The status is the worst level of the water quality gauges (a cold water counts as in range) and of the advice. The filtration time of the day comes from the filtration_time sensor, or else from the pump's history since midnight (read with the history/history_during_period websocket command at most every 5 minutes and whenever the pump changes state, the time since added while it runs). The target is filtration_hours, else the filtration_target sensor, else, for a pool, half the water temperature in °C (27 °C → 13.5 h, rounded to the degree).
Changelog
CHANGELOG.md 1.0.0Nov 13, 2026Latest
Features
- Pool Card (
custom:pool-card): animated pool or spa scene (water rippling while the pump filters, spa bubbles, heat pump fan and flame while it heats, underwater light glowing in its color, roller cover unrolling and rolling back, the water turning green when the disinfection is too low), water temperature, air temperature, colored gauges with ideal ranges for pH, ORP, free chlorine, salt, TDS and water temperature, advice for every value out of its range and for equipment running without water flow, filtration state, speed and time of the day against a daily target, control buttons and an equipment section (heat pump target, electrolyser, cover, light). - Pool Mini Card (
custom:pool-mini-card): compact summary (scene, values with their level, filtration of the day, first advice, pump and light buttons) with a detail button that switches to the full card. - Entities discovered from a device (iopool, ESPHome, Pentair ScreenLogic and IntelliCenter, Hayward OmniLogic, Jandy iAquaLink, Blue Riiot through MQTT…), whatever their ids or language, each one replaceable in the options; pump as a switch, a select (speeds) or a fan (presets).
- Filtration time of the day from a sensor (a
history_statssensor, a controller's counter) or computed from the pump's history; target from the options, from iopool's recommendation or water temperature ÷ 2. - Ideal ranges configurable per measure (
ranges), in the unit of each sensor (°C / °F, g/L / ppm). - Stopping the pump while the heat pump heats (pump button, or the off option of its speed select) asks for a confirmation (popup at the top of the card, Cancel focused).
- Default ideal ranges after the CDC, the CDC MAHC and the WHO, with spa-specific chlorine and temperature, salt per unit (ppm for US controllers, g/L for European cells) and a salt pool's TDS including its salt.
- Visual editor for both cards, 22 languages (English in the bundle, the others loaded on demand), light and dark themes,
prefers-reduced-motionhonoured.