Home Assistant projects
All projects

Smart Comfort

Integration + card · Climate & weather
v1.18.0 · Nov 13, 2026 HA 2024.12.0+ Marketplace

Fewer, smarter comfort alerts, and climate devices and lights that adjust themselves, room by room.

Tracks each comfort problem as an episode: notified once when it starts, again only if it gets worse. Temperature, CO₂, humidity, noise, indoor and outdoor air quality and windows to open or close, automatic control of air conditioners, fans and purifiers with a quiet night, and adaptive lighting. Everything is set up room by room in its own panel.

Highlights

  • Eleven alerts per room for heat, cold, windows, CO₂, humidity, polluted air, noise and outdoor air
  • Indoor air quality from PM2.5, PM10 and air quality index sensors per room, the purifiers' own sensors found by Discover
  • Polluted air alert with its reading, the room's purifiers boosted until the air is clean, then back to their previous state
  • Episodes instead of cooldowns, grouped in one digest notification
  • Quiet hours, presence and iOS / Android interruption levels, with Snooze and Got it buttons
  • Air conditioners, fans and purifiers controlled automatically, quieter at night
  • Adaptive lighting by time of day, with a quiet morning and nap slots per room
  • Lights on presence, with time slots, night lights and a color per slot
  • Outdoor places and air quality index to suggest opening or closing the windows
  • Setup panel in the sidebar, with room discovery, a day schedule and the YAML of the setup
  • Activity log in the panel and in an activity card for the dashboard
  • Diagnostics with the notifiers redacted
  • Calendar of past alerts, with the peak of each episode
  • Mini card with the alerts of the moment and the switches, opening the full card
  • Full card a section wide, with every alert, a tile per room, the switches and the latest activity
  • Comfort score per room, 0 to 100 %, with its statistics for the day or the week

Cards

smart-comfort-cardsmart-comfort-mini-cardsmart-comfort-activity-card
type: custom:smart-comfort-card

Install

  1. 1Open the repository in the Marketplace with the Add to Marketplace button above, or addgithub.com/juju35/ha-smart-comfort as a custom repository (category Integration).
  2. 2Download it from the Marketplace.
  3. 3Restart Home Assistant and add the integration from Settings → Devices & services.

Documentation

From the README

Features

Features

  • Eleven alerts per room: too hot, too cold, open the windows (warmer inside than outside), close the windows (hotter outside), window open in the cold, high CO₂, polluted air (PM2.5, PM10 or air quality index), high humidity, noisy room, close the windows (noisy outside), close the windows (poor air outside) — each with its threshold, hysteresis, delay, severity and escalation step, globally and per room
  • Comfort score per room, 0 to 100 %, lowered by each problem under way according to its severity; its statistics give the comfort of the day or the week
  • Episodes, not cooldowns: one notification when a problem starts, none while it lasts; again when it gets worse by the escalation step, or after the reminder delay (off by default)
  • Hysteresis and delay: a problem starts once its condition has held for the delay, and ends only once the value is back past the threshold by the hysteresis — no flapping. An unavailable sensor changes nothing
  • Digest: what comes up within the digest window (5 minutes by default) goes out in one notification listing every current problem, replacing the previous one on the phone (notification tag) instead of piling up
  • Quiet hours and presence: during quiet hours, or while nobody is home, only critical alerts are sent; the others go out at the end if they are still relevant, and those over meanwhile are never sent
  • Severities mapped to the iOS / Android interruption levels: info (silent), warning (time-sensitive, sound), critical (bypasses silent mode and Focus, configurable volume)
  • Actionable notifications: Snooze 4 h and Got it (no more reminders for these problems) buttons, right from the phone
  • Cleared when resolved: the notification is removed from the phones once every notified problem is over
  • Device control per room:
    • air conditioner: cools above a temperature once the openings have been closed for a while, turns off below another one, or when an opening stays open (whatever its mode, heating included)
    • fans: on above a temperature, off below another one (hysteresis band in between), full speed while a window is open during the day
    • air purifiers: boost while a window is open during the day (preset, speed, or a mode select such as manual/automatic), back to normal when closed (the closed preset / mode, or else the state it had before the boost), boosted while the room's air is polluted (the same settings, at any hour; a purifier with night settings stays quiet at night) and back to the state it had before once the air is clean again, and optionally kept on (turned back on after a power cut)
    • commands are sent only when the target changes and the device isn't already in that state; a device changed by hand is left alone for an hour (configurable)
    • a room whose air conditioner or fan Smart Comfort has turned on gets no "too hot" alert, and one whose purifier it has boosted no "polluted air" alert (a device turned on by hand doesn't count)
    • indicator lights and displays of the devices (an on/off indicator light or switch, a display brightness, a brightness select such as bright / dim / off) turned off in their hours (the quiet night by default) and during the naps of their room, and back on after at the brightness or option they had; found by Discover
    • back to normal at a set time, per device (reset_at): the purifier back to its automatic mode at 20:40, even after a change by hand
    • quiet night: in the night hours (22:00–07:00 by default), devices with night settings run quieter — a fan at a lower speed or a sleep preset, a purifier in its sleep preset or mode, an air conditioner in its silent fan mode — and get no window boost; the day settings (or the state before the night) come back in the morning
  • Adaptive lighting: the dimmable lights of each room that are on get the brightness of the moment — day with the sun up, evening once it is down, night in the quiet night hours — at once when turned on, then gradually; optionally the warmth too (color temperature, can be turned off). Smart Comfort never turns a light on or off, night lights are only set at night, and a light changed by hand is left alone until it is turned off
  • Lights on presence, per room: lights turned on when someone comes in (only when the room is dark enough, with a light level sensor) at the brightness of the moment, and off once nobody is left for a while; slots keep some lights off (weekday mornings…) or set their brightness (a dim entrance at night), lights chosen to stay off during the naps of the house, night lights only at night, a color per slot (a blue night light), a presence that must last a few seconds (someone passing by doesn't count), and a light turned off by hand stays off until the room is empty
  • Outdoors: outdoor places (garden, terrace…) with their temperature, air quality and noise sensors, plus sensors in no area (weather entity, a city air quality index such as Atmo France)
  • Noise: a sound level sensor per room (noisy room alert), and outdoor noise sensors: no suggestion to open the windows while it is noisy outside, and an alert to close them when they are open in the noise
  • Indoor air quality: PM2.5, PM10 and air quality index sensors per room — those of the air purifiers too (sensor.*_pm2_5_density, a HomeKit air quality from 1 excellent to 5 poor…), the worst counts — for a polluted air alert with its value ("PM2.5 47 µg/m³, above 25 µg/m³"), and the purifiers of the room boosted until the air is clean again
  • Outdoor air quality: an index from 1 (good) to 6 (extremely poor) — European indexes (Atmo, EAQI) as is, US AQI by its bands, text states (good, poor…) — the worst sensor counts: no suggestion to open the windows while the air is poor, and an alert to close them when they are open then
  • Calendar of the alerts: every alert is an event of the Comfort alerts calendar, from when it started to when it ended, with its room, its kind and its worst value ("29.5 °C, above 26 °C"); kept 90 days, so the calendar view of Home Assistant shows when each room was too hot, too humid or noisy
  • No re-notification after a restart: episodes, snoozes and device targets are stored; nothing is sent during the startup grace period
  • YAML or UI: configure everything in YAML (imported at startup), in the Smart Comfort panel of the sidebar, or in the integration options — rooms, alerts, control
  • Dashboard cards, added by the integration: a card (custom:smart-comfort-card: every alert, the rooms, the switches, the latest activity), a mini card (custom:smart-comfort-mini-card: the alerts of the moment and the switches, with a button that opens the full card) and an activity card (custom:smart-comfort-activity-card: what Smart Comfort did and why, live)
  • Sensors for the active alerts and the comfort of each room, switches to pause the notifications or the device control, buttons, actions and events
  • English, French, German, Spanish, Italian, Dutch, European Portuguese, Polish, Serbian (Cyrillic and Latin), Romanian, Danish, Swedish, Bulgarian, Russian, Ukrainian, Hungarian, Slovak, Czech, Slovenian, Latvian and Greek

Prerequisites

Prerequisites

  • Home Assistant 2024.12 or newer
  • A notify action: the Companion app (notify.mobile_app_…) or a notify group of several phones. The snooze buttons, replacement and clearing of notifications need the Companion app; other notifiers get the title and message (and no clearing message)
  • Temperature (and optionally CO₂ / humidity / noise / PM2.5 / PM10 / air quality index) sensors per room, door/window binary_sensors, and outdoor temperature sensors (or a weather entity) for the window alerts; optionally outdoor air quality and noise sensors

Configuration

Configuration

Both ways can be used together:

  • YAML: add a smart_comfort: section (below). At startup it creates the integration, or replaces its options if the YAML changed since the last import. While the YAML stays the same, changes made in the UI are kept
  • UI: Add integration — Settings → Devices & services → Add integration → Smart Comfort, then the Smart Comfort panel in the sidebar (below), or Configure for the same settings as forms

Configuration panel#

Once set up, Smart Comfort adds a Smart Comfort page to the sidebar, for administrators:

  • Overview: while nothing is set up (no room nor outdoor place), a Discover button that runs the discovery and opens its result in the Rooms tab; the active alerts with their state (notified, snoozed, acknowledged, handled by a running device) and Snooze / Got it buttons, the readings and devices of each room with their targets and manual overrides, the last notification, and switches for the notifications and the device control
  • Activity: what Smart Comfort did and why, live and by day — devices (cooling, window boost, night mode, back to normal…), lights (brightness of the moment, on with presence, off with nobody), indicator lights, notifications sent and cleared, changes by hand that pause a device or a light, reset times, commands that failed — drawn by the panel itself, at once, with filters (devices, lights, notifications, by hand) and a room filter; a line opens its entity
  • Rooms: Discover adds a room for every Home Assistant area with something to follow (a comfort sensor, an air conditioner, a fan, a purifier or a dimmable light — not a hallway with only its door) and sets it up: temperature, CO₂, humidity and noise sensors (a weather station preferred over a device's own sensor; never the temperatures of machines — NAS, internet box, server, UPS, printer, fridge…), PM2.5, PM10 and air quality index sensors (those of the purifiers too), windows and doors, air conditioner (only one that can cool), fans with their natural / direct presets, purifiers with their auto / manual mode select or presets, dimmable lights (not the indicators of devices nor the floodlights of cameras; night lights flagged as such), the quiet morning of the bedrooms, and the night settings from their quiet presets and fan modes. Areas, bedrooms, night lights, indicators and machines are recognised by their names in English, French, German, Spanish, Italian, Dutch, Portuguese, Polish and Serbian (Garden, Jardin, Giardino, Tuin, Jardim, Ogród, Bašta / Башта…). The outdoor areas (garden, terrace, balcony…) with a sensor become outdoor places (an outdoor module counts by its device's area); outdoor sensors in no area — a sensor named outdoor, a city air quality index (Atmo France, WAQI…), and the weather entity when there is no outdoor temperature sensor — go to the other outdoor sensors. What is already set is kept, and running it again only adds what is new. Nothing is saved until Save. Each room shows the icon of its area (or one from its name) and folds into sections — Sensors, Windows and doors, Devices, Lighting (lights, quiet morning, naps), Alerts — each with a one-line summary; only what the room has is shown, and + buttons add the rest (a CO₂ sensor, a fan, a light, a nap, a customized alert…). Device settings stay folded under each device
  • Outdoors: the outdoor places (garden, terrace…) with their temperature, air quality and noise sensors, and the other outdoor sensors (weather entity, city air quality index) with how the temperatures are combined
  • Alerts: one line per alert with its state, threshold and severity; open it to change them (hysteresis, delay and escalation under Advanced)
  • Schedule: every time window on one 24-hour line with the time now — quiet hours (notifications), quiet night (devices and lights), quiet morning (bedroom lights) and window boost — and their times, all in one place
  • Settings: notifications (where, presence, grouping, reminder; the rest under Advanced), device control (with the air conditioner, fan and purifier defaults folded) and adaptive lighting (the brightness of each moment on one row, the warmth only when it is on)
  • YAML: the configuration of Smart Comfort only, as it goes under smart_comfort: in configuration.yaml (the defaults are not repeated), with a Copy button — to move to YAML or keep a copy. Unsaved changes are included

Changes are checked and saved with Save (or dropped with Discard); the integration reloads with them, and the page keeps following its status. Only the settings that differ from the defaults are stored. When the configuration comes from YAML, the page says so: what is saved there stays until the YAML changes.

Each tab has its own address, e.g. /smart-comfort/rooms (the addresses of earlier versions, /notifications and /control, open Settings).

Example#

smart_comfort:
  notify:
    - notify.family            # a notify group, or notify.mobile_app_…
  outdoor_temperature: [weather.home]       # outdoor sensors in no outdoor place
  outdoor_aggregate: min       # min avoids a sensor in the sun
  outdoor_air_quality: [sensor.atmo_france_qualite_globale_rennes]
  quiet_start: "22:30"
  quiet_end: "08:00"
  presence: zone.home
  url: homeassistant://navigate/lovelace/comfort

  alerts:
    too_hot: { threshold: 27, delay: 15, escalation: 1 }
    close_windows: { min_outdoor: 27, severity: critical }
    co2_high: { threshold: 1300 }
    polluted_air: { threshold: 25, pm10_threshold: 50, aqi_threshold: 3 }

  control:
    start: "09:00"             # window boost hours
    end: "21:00"
    night_start: "22:00"       # quiet night
    night_end: "07:00"
    climate: { night_fan_mode: silent }
    fans: { on_above: 23, off_below: 22, percentage: 50, open_percentage: 100, night_percentage: 20 }
    purifiers: { open_percentage: 100, keep_on: true }

  rooms:
    - name: Living room
      temperature: sensor.living_room_temperature
      co2: sensor.living_room_co2
      pm25: [sensor.living_room_purifier_pm2_5_density]   # lists: the worst counts
      air_quality: [sensor.living_room_purifier_air_quality]
      openings:
        - binary_sensor.living_room_window
        - binary_sensor.living_room_french_door
      climate: climate.living_room_ac
      fans:
        - entity_id: fan.living_room_fan
          preset: Natural
          open_preset: Standard
      purifiers:
        - entity_id: fan.living_room_purifier
          mode_select: select.living_room_purifier_mode
          open_mode: manual
          closed_mode: automatic

    - name: Bedroom
      temperature: sensor.bedroom_temperature
      noise: sensor.bedroom_sound_level
      openings: [binary_sensor.bedroom_window]
      alerts:
        too_hot: { threshold: 25 }   # overrides for this room only
      purifiers:
        - entity_id: fan.bedroom_purifier
          open_preset: Favorite
          closed_preset: Auto
          night_preset: Sleep        # quieter at night
      lights:
        - light.bedroom
        - entity_id: light.bedroom_night_light
          night_only: true           # set only at night

    - name: Bathroom
      humidity: sensor.bathroom_humidity

  outdoors:
    - name: Terrace
      temperature:
        - sensor.outdoor_north_temperature
        - sensor.outdoor_south_temperature
      noise: [sensor.street_sound_level]
    - name: Garden
      air_quality: [sensor.garden_aqi]

General options#

Option Default Description
notify none Notify actions the alerts go to
outdoor_temperature none Outdoor sensors (or weather entities, their temperature attribute), with those of the outdoor places; unavailable ones are ignored
outdoor_aggregate min min, max or mean of the outdoor temperature sensors
outdoor_noise none Outdoor sound level sensors (dB, mean of the available ones, with those of the outdoor places) for the noise alerts
outdoor_air_quality none Outdoor air quality index sensors (the worst of the available ones, with those of the outdoor places) for the air alerts
digest_window 5 min Wait for other alerts before sending one grouped notification. Critical alerts don't wait
reminder 0 Minutes after which a problem still going on is notified again. 0: never (only when it gets worse)
snooze_duration 240 min Duration of the Snooze button and of the snooze action by default
startup_grace 10 min Nothing is sent during this time after Home Assistant starts
quiet_start / quiet_end none Quiet hours (may cross midnight): only critical alerts are sent
presence none Zone (zone.home: number of people), person, group, tracker or boolean: while nobody is home, only critical alerts are sent
clear_when_resolved true Remove the notification once every notified problem is over
critical_volume 0.5 Volume of the iOS critical sound, 0 to 1
url none Opened when the notification is tapped
tag smart_comfort Notification tag: each notification replaces the previous one

Alerts#

Set under alerts: for every room, and under rooms[].alerts: for one room.

Alert Condition Default
too_hot temperature > threshold 27 °C, warning
too_cold temperature < threshold 17 °C, warning
ventilate openings closed, temperature ≥ min_indoor and ≥ outdoor + threshold 24 °C, +2 °C, info
close_windows an opening open, outdoor ≥ min_outdoor and ≥ temperature + threshold 25 °C, +0.5 °C, warning
window_open_cold an opening open for the delay, outdoor ≤ max_outdoor, and the room has no too_hot, co2_high, polluted_air or humidity_high problem 12 °C, 20 min, disabled
co2_high CO₂ > threshold 1200 ppm, info
polluted_air PM2.5 > threshold, or PM10 > pm10_threshold, or the air quality level > aqi_threshold (room pm25, pm10, air_quality sensors) 25 µg/m³, 50 µg/m³, 3, warning
humidity_high humidity > threshold 70 %, info
noise_high room noise > threshold (room noise sensor) 60 dB, info
noisy_outside an opening open, outdoor noise > threshold (outdoor noise sensors) 65 dB, info
bad_air_outside an opening open, outdoor air quality level > threshold (outdoor air quality sensors) 3 (degraded), info

polluted_air ends at or below threshold − hysteresis (25 − 10 = 15 µg/m³ of PM2.5), pm10_threshold − pm10_hysteresis (50 − 20 = 30 µg/m³) and aqi_threshold − aqi_hysteresis (3 − 1: level 2), after 10 minutes by default; its value is the first reading over its threshold, PM2.5 first, with its unit (metric attribute: pm25, pm10 or aqi). The room sensors are lists (pm25, pm10, air_quality): the worst one counts. The air quality index is read like the outdoor one (see below), except a HomeKit one (homekit_controller, 1 excellent … 5 poor), taken as is: level 4 (inferior) and 5 (poor) are polluted by default, a US AQI from 151. While the alert is on, the purifiers of the room are boosted with their window boost settings (open_mode / open_preset / open_percentage), at any hour but not at night for a purifier with night settings, and go back to the state they had before (or their closed preset / mode) once it ends; a purifier changed by hand is left alone for the manual override. With suppress_when_handled, the alert isn't notified while a purifier is boosted.

window_open_cold stays quiet while the room airs out: as long as it is too hot, or its CO₂, polluted air or humidity is above its threshold (pending or alerting, hysteresis included), an open window is no alert, and one already on ends. Its delay starts again once that problem is over.

ventilate also takes max_outdoor_noise (65 dB) and max_outdoor_air (3): no suggestion to open while the outdoor noise or air quality level is above them. Without an outdoor noise or air quality sensor (or while it is unavailable) it doesn't hold anything back.

Outdoor places#

Under outdoors:, one entry per place: name, and lists of entities temperature (sensors or weather entities), air_quality and noise. Their sensors add up with the top-level outdoor_temperature, outdoor_air_quality and outdoor_noise.

Air quality is read as a level from 1 (good) to 6 (extremely poor): a European index (Atmo France, EAQI) as is, a US AQI (device class aqi, or a value above 6) by its bands (≤ 50: 1, ≤ 100: 2, ≤ 150: 3, ≤ 200: 4, ≤ 300: 5, above: 6), a text state (good, fair, moderate, poor, very_poor, extremely_poor, bon, mauvais…) by its name. 0 means no data (Atmo).

Each alert also takes enabled, hysteresis (how far back past the threshold the value must go for the problem to end), delay (minutes the condition must hold), severity (info, warning, critical) and escalation (notify again when the value gets this much worse; 0: never).

Device control#

The first six rows (enabled, start / end, manual_override, suppress_when_handled, night_start / night_end, display_off / display_on) are global: set them under control: only. The climate.*, fans.* and purifiers.* options are set under control: for every room, under rooms[].control: for one room, and on the device item itself for one device (without the climate. / fans. / purifiers. prefix).

Option Default Description
enabled true Control the devices (also the Device control switch)
start / end 09:00 / 21:00 Window boost hours of the fans and purifiers. Both empty (or equal): all day
manual_override 60 min A device changed by hand is left alone this long, then its target is applied again. 0: never paused
suppress_when_handled true No "too hot" alert for a room whose air conditioner or fan is running on Smart Comfort's command, nor "polluted air" one while its purifier is boosted
night_start / night_end 22:00 / 07:00 Quiet night hours: devices with night settings use them, and get no window boost
display_off / display_on the quiet night Hours the indicator lights and displays of the devices are off (e.g. 20:00 / 10:00)
display none On a device item: its indicator light or display — a light or switch (on/off), a number (off: its minimum), a select (off: its off option, such as Off or Fermer). Off in the display hours and during the naps of the room; Smart Comfort acts only when these start or end, so one turned back on by hand stays on until the next change
reset_at none On a device item: a time it goes back to its normal state (closed preset / mode, temperature control), its manual pause ended
climate.cool_above / off_below 23 / 21 °C Cool above, turn off below
climate.setpoint / fan_mode 22 °C / none Setpoint and fan mode when cooling
climate.closed_for / off_on_open 2 / 1 min Openings closed for this long before cooling; off when one stays open this long
climate.night_fan_mode none Fan mode when cooling at night (e.g. silent)
fans.on_above / off_below 23 / 22 °C On above, off below. Leave both empty for fans driven by the windows only
fans.percentage / preset 50 % / none When on
fans.open_percentage / open_preset 100 % / none While a window is open in the boost hours
fans.off_preset none Preset set before turning off (the fan restarts in it)
fans.night_percentage / night_preset none Speed and preset when on at night (unset: the day ones)
purifiers.open_percentage / open_preset 100 % / none While a window is open in the boost hours, and while the room's air is polluted
purifiers.closed_preset none When the windows are closed. Without it (nor closed_mode), the purifier goes back to the state it had before the boost
purifiers.mode_select / open_mode / closed_mode none A select entity and its options for the two states (e.g. manual / automatic)
purifiers.keep_on false Turn the purifier back on when it has been off for 10 seconds
purifiers.night_percentage / night_preset / night_mode none At night: speed, preset, mode select option (e.g. Sleep). An off purifier stays off; the state before the night comes back in the morning (or the closed preset / mode)

An air conditioner in another mode than cool or off (heat, dry…) is left alone by the temperature control, but turned off when an opening stays open.

Presets and modes depend on each device: set them on the device item (Discover picks them from the device's own list), not under control:. The panel offers them per device only.

      fans:
        - entity_id: fan.living_fan
          preset: Naturel
          open_preset: Standard
          display: number.living_fan_screen_brightness
      purifiers:
        - entity_id: fan.bedroom_purifier
          open_preset: Favorite
          closed_preset: Auto
          night_preset: Sleep
          display: light.bedroom_purifier_indicator_light
          reset_at: "20:40"          # back to Auto, even after a change by hand

Thresholds and messages are in °C; sensors in °F or K are converted. An opening unavailable for 10 minutes (dead battery…) is left out of its room instead of blocking its alerts and devices (ignored_openings attribute of the room sensor). The problems of a sensor removed from a room end.

Adaptive lighting#

Set under lighting: for every light, under rooms[].lighting: for the lights of one room, and on the light item itself (rooms[].lights:) for one light. enabled and transition are global.

Option Default Description
enabled true Adapt the lights (also the Adaptive lighting switch)
day 100 % Brightness with the sun up (elevation above 6°)
evening 60 % Brightness once the sun is down (below −6°); in between, a blend of the two
night 15 % Brightness in the quiet night hours (control.night_start / night_end)
warmth true Also set the color temperature, for the lights that support it. false: brightness only
day_kelvin / evening_kelvin / night_kelvin 4000 / 2700 / 2200 K Color temperature by time of day (within what each light can do)
transition 120 s Duration of the gradual changes; a light just turned on gets its brightness at once
morning 40 % Brightness of the quiet morning (rooms with quiet_morning), from the end of the night until morning_end
morning_end 09:30 End of the quiet morning (global)
quiet_morning false Dimmer lights in the morning for this room or light (Discover sets it on bedrooms)
nap 15 % Brightness during the nap slots of the room (rooms[].naps)
morning_kelvin / nap_kelvin 3000 / 2200 K Color temperature of the quiet morning and of the naps
night_only false On a light item: a night light, set only in the night hours and the naps, left alone by day

Naps are set per room under rooms[].naps: — start, end and optionally days (mon … sun, every day when none). Discover never adds any. Order of precedence: night, nap, quiet morning, then day / evening.

Only the lights that are on are set: Smart Comfort never turns a light on or off. A brightness or warmth changed by hand pauses the light until it is turned off, or for control.manual_override minutes. On/off-only lights are left alone.

smart_comfort:
  lighting:
    evening: 50
    night: 10
    warmth: false              # brightness only
  rooms:
    - name: Living room
      lights: [light.living_room, light.sofa]
      lighting: { evening: 70 }  # this room only
    - name: Kids' bedroom
      lights: [light.kids, { entity_id: light.kids_night_light, night_only: true }]
      lighting: { quiet_morning: true }   # dimmer until morning_end (09:30)
      naps:
        - { start: "13:30", end: "15:30", days: [sat, sun] }

Lights on presence#

Set per room under rooms[].presence: (in the panel: room → Lighting → Lights on presence). Discover never adds it: an existing presence automation would do the same.

Option Default Description
sensors required Presence, occupancy or motion binary_sensors: someone is there while one of them is on
lights the room's The lights turned on and off; any light can be added (the hallway's from the entrance)
lux / max_lux none A light level sensor, and the level above which no light is turned on
on_after 0 s Seconds a presence must last before the lights are turned on
off_after 2 min Minutes with nobody before the lights are turned off (decimals allowed)
transition none Seconds of the fade when the lights are turned on and off
not_during_naps none Lights not turned on while a room of the house has its nap (rooms[].naps)
slots none start, end, optional days and lights (all when none), then off: true (not turned on) or brightness (in %) and color (RGB, for the color lights), and optionally off_after (minutes with nobody before off while the slot applies: longer in the evening for a bathroom). The first slot that applies to a light decides

A light is turned on only when none of the presence lights is already on, at the brightness of the moment (adaptive lighting) unless a slot sets one; a night light only at night and during the naps. Every presence light that is on is turned off once nobody is left. A presence light turned off by hand while someone is there is not turned back on until the room is empty. A light that is a presence light of two rooms (the hallway's, from the entrance and the hallway) stays on while someone is in either of them, and a light on because of the other room doesn't stop this room from turning its own on.

    - name: Entrance
      lights: [light.entrance]
      presence:
        sensors: [binary_sensor.entrance_occupancy]
        lights: [light.entrance, light.hallway]
        lux: sensor.entrance_illuminance
        max_lux: 10
        off_after: 2
        not_during_naps: [light.hallway]
        slots:
          - { start: "06:30", end: "08:00", days: [mon, tue, wed, thu, fri], off: true }
          - { start: "20:00", end: "09:00", lights: [light.entrance], brightness: 20 }
          - { start: "20:00", end: "09:00", lights: [light.hallway], off: true }
    - name: Hallway
      lights: [light.hallway, { entity_id: light.hallway_night_light, night_only: true }]
      presence:
        sensors: [binary_sensor.hallway_occupancy]
        on_after: 5                  # someone passing by doesn't count
        off_after: 0.2
        slots:
          - { start: "20:00", end: "10:00", lights: [light.hallway_night_light], brightness: 30, color: [0, 0, 255] }
          - { start: "20:00", end: "10:00", lights: [light.hallway], off: true }
          - { start: "10:00", end: "20:00", lights: [light.hallway_night_light], off: true }
          - { start: "13:30", end: "17:00", off: true }

A slot color, like a slot brightness, is kept until the light is turned off (the adaptive lighting leaves it alone).

Cards#

The integration adds its cards to the dashboards itself (no resource to add), for any user: the card (custom:smart-comfort-card), the mini card (custom:smart-comfort-mini-card), its compact version, and the activity card (custom:smart-comfort-activity-card).

Card (custom:smart-comfort-card)#

Everything at a glance: every alert with since when and its state (snoozed, handled by a device, seen), a tile per room with its temperature (else humidity, else CO₂) and its main problem, the notifications, device control and adaptive lighting switches (a tap turns them on or off), and the latest activity. It is what the mini card shows once switched to its full view. A tap on an alert or a room opens its comfort sensor.

type: custom:smart-comfort-card
title: Smart Comfort        # optional
show_title: false           # optional: no title (shown by default)
show_subtitle: false        # optional: no subtitle (shown by default)
rooms: [Living room]        # optional: only these rooms, their names as shown in the panel
activity: 5                 # activity entries (5 by default, 0 for none)

In a Sections view the card is a whole section wide (at least 6 columns). With rooms set to a single room, its activity is that room's.

Mini card (custom:smart-comfort-mini-card)#

The alerts of the moment (the ones to deal with first, then the snoozed or handled ones), the outdoor temperature, and the notifications, device control and adaptive lighting switches, which a tap turns on or off. Its button at the top right switches it to the full card — every alert with since when and its state (snoozed, handled by a device, seen), a tile per room with its temperature (else humidity, else CO₂) and its main problem, the latest activity — and back; a click anywhere outside the card brings it back to the compact view too. A tap on an alert or a room opens its comfort sensor.

type: custom:smart-comfort-mini-card
title: Smart Comfort        # optional
show_title: false           # optional: no title (shown by default)
show_subtitle: false        # optional: no subtitle (shown by default)
rooms: [Living room]        # optional: only these rooms, their names as shown in the panel
alerts: 3                   # alerts listed in the compact view (3 by default)
activity: 5                 # activity entries in the full card (5 by default, 0 for none)
zoom: false                 # optional: no full card button

In a Sections view the mini card is 6 columns wide (half a section), the full card a whole section. On a narrow card the switches keep their icon only. With rooms set to a single room, the activity of the full card is that room's.

Activity card (custom:smart-comfort-activity-card)#

The latest activity of Smart Comfort, live: devices turned on or off and why, lights adjusted, notifications sent, changes made by hand.

type: custom:smart-comfort-activity-card
title: Smart Comfort        # optional ("" for no header)
show_title: false           # optional: no title (shown by default)
limit: 10                   # entries shown (10 by default)
kinds: [device, presence]   # optional: device, lighting, presence, display, notified, manual, reset, failed
room: Living room           # optional: one room only, its name as shown in the panel

In a Sections view the card is at least 6 columns wide (half a section): narrower, its lines would hold a word each. The visual editor lists the kinds by their translated names.

The activity (the last 300 entries) is kept across restarts. It is also available to any user with the WebSocket command smart_comfort/activity (limit), which sends the latest entries, then each new one.

Entities#

Entity Description
sensor.smart_comfort_active_alerts Number of current problems. Attributes: alerts (room, kind, value, since, notified_at, snoozed, acknowledged, handled…), snoozes, outdoor_temperature, outdoor_noise, outdoor_air_quality
sensor.smart_comfort_<room>_comfort ok or the main problem of the room. Attributes: room_name, readings, open and ignored openings, alerts, device targets and manual overrides
sensor.smart_comfort_<room>_comfort_score How comfortable the room is now, 0 to 100 %: 100 with nothing wrong, minus 10 per info problem under way, 25 per warning, 50 per critical (the severity set for each alert). Its long-term statistics give the day's, the week's or the month's comfort in a statistics card or graph
sensor.smart_comfort_last_notification Time of the last notification. Attributes: title, message, severity, alerts
calendar.smart_comfort_comfort_alerts The alerts as events: one per alert, from its start to its end (the ones going on end a minute ahead, so the calendar is on while they last). Summary 🌡️ Bedroom: Too hot, location the room, description its worst value. Finished alerts are kept 90 days (at most 1000)
switch.smart_comfort_notifications Send notifications (problems are still tracked when off)
switch.smart_comfort_device_control Control the devices
switch.smart_comfort_adaptive_lighting Adapt the brightness of the lights
button.smart_comfort_notify_now Send every current problem now, ignoring quiet hours and the digest window
button.smart_comfort_cancel_snoozes Cancel every snooze

Actions#

Action Fields Description
smart_comfort.snooze duration (min), rooms, kinds Don't notify for a while. Without kinds, problems that come up meanwhile in these rooms are snoozed too
smart_comfort.unsnooze rooms Cancel the snoozes
smart_comfort.acknowledge rooms, kinds No reminder nor escalation for the current problems until they end
smart_comfort.notify_now Send a summary now; returns sent
smart_comfort.get_config Returns the options in use (response only), to copy into the YAML or check what is set

Rooms are given by name or id (Living room or living_room).

action: smart_comfort.snooze
data:
  rooms: [Bedroom]
  duration: 480

Events#

  • smart_comfort_notified: at, title, message, severity, alerts
  • smart_comfort_control: entity_id, action, data, target, for each command sent to a device

Diagnostics#

Settings → Devices & services → Smart Comfort → ⋮ → Download diagnostics gives the options and the current state (alerts, snoozes, rooms with their readings and device targets, outdoor values, switches, last notification), to attach to an issue. The notifiers (notify) and the notification link (url) are redacted.

How it works

How it works

Every 30 seconds, and a few seconds after a watched sensor or device changes, Smart Comfort reads the rooms, decides the device targets and sends their commands, updates the episodes, then decides whether a notification is due:

  1. A problem is pending while its condition holds for less than the delay, active after that, and over once the value is back past the threshold by the hysteresis
  2. An active problem is due when it has never been notified, when it got worse by the escalation step, or after the reminder delay. Snoozed problems are skipped; acknowledged ones are only notified once
  3. The first due problem starts the digest window; at its end, one notification lists every current problem (new, worse, still going on), since it replaces the previous one. A critical problem is sent right away
  4. During quiet hours or while nobody is home, only critical problems are sent; the others are still due at the end
  5. When no notified problem is left, the notification is cleared

To debug:

logger:
  logs:
    custom_components.smart_comfort: debug

Support

Support

If you find this project useful, you can support its development:

Buy Me a Coffee

1.18.0Nov 13, 2026Latest

Improvements

  • Window open in the cold (window_open_cold): no alert while the room airs out, that is while it has a too hot, high CO₂, polluted air or high humidity problem (pending or alerting). An alert already on ends, and the delay starts again once that problem is over.

1.17.0Nov 12, 2026

Features

  • show_title and show_subtitle options (also in the visual editor) hide the header's title and its subtitle separately on the card and mini card (the activity card gets show_title), for a card placed under a section heading of its own (asked in juju35/ha-vehicle-card#72).

1.16.1Nov 11, 2026

Fixes

  • Discover: no more deprecation warning accesses ChildDeviceEntry.model in the log (it would stop discovery from Home Assistant 2027.9) when a device is a sub-device: its model is read from its parent device (#58, #59, thanks @FredM67).

1.16.0Nov 10, 2026

Improvements

  • Panel, Activity tab: drawn by the panel itself instead of embedding the activity card, so it shows at the first opening. The lines by day with their time on the right, the filters on one line (all, devices, lights, notifications, by hand) and a new room filter.
  • Panel shown at once: the release keeps its languages in the panel file instead of a separate file to wait for.

1.15.5Nov 10, 2026

Fixes

  • Panel empty on its first opening (fine when coming back to it): in the release, the panel is only defined once the page's language file has loaded, and Home Assistant had already handed it the connection, the address and the layout by then; they were lost and nothing was drawn. They are now taken up when the panel is defined.

1.15.4Nov 10, 2026

Performance

  • Panel opens faster: its files are cached by the browser (every URL is versioned, so a new release is still fetched), and the settings load alongside the translations instead of after them.