Chronos
Scheduler
Advanced scheduler for Home Assistant. Manages thermostats, lights, blinds, irrigation, switches, fans, water heaters, mowers and vacuums through daily time slots with conditional weather rules. Distributed via HACS.
What it is
Chronos is an advanced scheduler for Home Assistant. It manages thermostats, lights, blinds, irrigation, switches, fans, water heaters, robotic mowers and vacuums through daily time slots with conditional weather rules.
A single Lovelace card provides everything you need:
- Schedule overview with live KPIs
- Timeline editor (linear, radial, list) with drag-and-drop and 5/15/30/60-minute snapping
- Weather-based IF/THEN rules (temperature, rain, wind, UV, sun position) to skip, shift, force or change the duration of the active block, shareable across schedules
- 7-day week view with per-schedule filters
- Live screen with an animated weather hero, sun card, interactive forecast and a map with precipitation radar
- History screen with the log of every run
- 6-step wizard for guided creation, with duplicate and JSON export/import
- Theme that follows Home Assistant, a palette customisable per device type, weather sensor overrides
All persisted by Home Assistant, accessible via the WebSocket API and auto-registered as a custom card.
Why it was created
Home Assistant’s native automations are powerful but rigid when you need complex schedules: a thermostat that changes setpoint at different times on weekdays and weekends, irrigation that skips days with rain or high humidity, blinds that close based on the sun’s position, a robotic mower that avoids days below a temperature threshold. Each case requires separate automations hand-written in YAML, hard to review and edit over time.
Chronos centralises everything in a single visual interface that thinks in terms of schedules and rules, not discrete automations. You change a thermostat from the week view, immediately see which rule affects it, and skip it if needed without touching YAML.
Supported domains
| HA domain | Chronos type | Typical capabilities |
|---|---|---|
climate.* |
Thermostat | set_temperature, set_hvac_mode, preset |
light.* |
Light | turn_on/off, brightness, color |
cover.* |
Blind | open, close, set_position |
switch.* |
Switch | turn_on, turn_off |
fan.* |
Fan | turn_on, set_percentage, oscillate |
vacuum.* |
Vacuum | start, pause, return_to_base |
lawn_mower.* |
Mower | start_mowing, dock, pause |
water_heater.* |
Water heater | set_temperature, set_operation_mode |
valve.* |
Irrigation | open_valve, close_valve |
alarm_control_panel.* |
Alarm | arm_home, arm_away, arm_night, arm_vacation, disarm, trigger |
Beyond devices, Chronos also drives Home Assistant helpers (input_boolean, input_number, input_select), handy for setting the values your existing automations read without rewriting them. There’s also the service-call schedule, a generic type where each block invokes any HA service (mqtt.publish, backup.create, script.run, etc.) with an optional JSON payload.
Weather rules
A schedule can have any number of weather rules. Each rule has three components:
IF condition — a weather attribute compared with an operator and a threshold:
temperature > 22
wind_speed > 30
rain_state == 'raining'
sun.minutes_until_sunset < 30
uv_index >= 7
THEN action — what to do when the condition is true:
skip— skip the active blockshift— shift the start time by N minutesforce— force a specific actionduration— change the block’s duration
Fire mode — when the THEN is “force”:
every— fires on every false→true transition (can oscillate if the condition crosses the threshold)once_per_day— at most once per calendar day, re-arms at midnightonce_per_daytime— at most once between sunrise and sunset, re-arms at the next sunriseonce_per_nighttime— at most once between sunset and sunrise, re-arms at the next sunset
Rules can be attached to schedules with time blocks (the rule changes the block’s behaviour) or to schedules with no blocks at all (automation triggered only by weather conditions).
From v1.17 rules are independent objects with a stable id, decoupled from schedules: one rule can target several schedules and blocks, and each schedule combines several of them. A dedicated manager lists them with target chips, a per-schedule filter and manual or alphabetical sorting, and removing a shared rule from a schedule only detaches it there (the rule itself is deleted only when it was the last link). Existing per-schedule rules are migrated automatically on first start.
Solar anchors for blocks
A block’s start and end can be a fixed time (e.g. 08:30) or anchored to sunrise/sunset with an offset in minutes. The integration resolves the anchor against sun.sun on every tick, so a block anchored to sunset - 15 min automatically follows the seasonal changes with no manual intervention: in winter it fires around 16:30, in summer around 21:00.
Live screen
The Live screen is the weather picture underneath the rules, and it’s the part that received the most visible work in recent versions.
- Weather hero with feels-like temperature and stat chips (humidity, wind, gust, UV, pressure, rain rate), over a background that animates with the current condition: a breathing sun, drifting clouds, fog banks, rain with randomized drops, storms with lightning, snowfall. They’re lightweight CSS effects (transform and opacity only) that honour the system reduced-motion preference and can be switched off in Settings.
- Local station comparison: if sensor overrides are mapped, the hero switches between the weather entity and your home sensors, or shows them side by side with per-attribute delta badges highlighting the drift between the two sources.
- Sun card with the sunrise-to-sunset arc, the current position, daylight duration and a countdown to the next sunset or sunrise.
- Interactive 24h forecast: tap an hour and it opens condition, temperature, rain amount and probability, wind and humidity.
- Weather map centred on the home zone, with an animated precipitation radar (past frames plus nowcast, with play and scrub), free and with no API key. An optional OpenWeatherMap key unlocks the temperature, wind, cloud and pressure overlays, and the map can be turned off entirely for offline installations.
Scenes
A block can activate a scene, and by default it does so at block start: the scene fires and turns on every light it controls. That isn’t always what you want, because the house then lights up on its own at a set time.
With the apply on demand mode the behaviour flips: Chronos activates nothing at block start, but applies the scene only when one of its member lights is switched on during the window (manually or by another automation), and immediately for those already on. Nothing turns on by itself, yet any light switched on in that window takes the scene’s look. The picker lists the devices each scene controls underneath it, so two similarly named scenes stay distinguishable, and the search matches those names too.
Sequential irrigation
Irrigation schedules have two duration modes. In global mode all valves open in parallel for one shared duration and are closed at the end. In sequential mode the stations start one at a time, each for its own minutes, and the total program length is the sum of the times. It’s built for multi-station controllers (for example the Solem BL-IP) where stations must run in sequence due to water-pressure limits, with no need for external scripts.
Restart safety is always on: the valve open-time is owned by Chronos, so if Home Assistant restarts mid-program the valves left open are defensively closed on the next boot and the event is logged to History.
Auto-off timer
Turn-on blocks for lights, plugs, fans and climate can ask Chronos to switch the device off after N minutes (a field in the block panel, empty to disable). The safety contract is the same as timed irrigation: the in-flight timer is persisted, so if Home Assistant restarts mid-way the devices are switched off defensively on the next boot. On climate, the new set_hvac_mode action (heat, cool, dry, fan_only, auto) is the reliable way to actually power on air conditioners, which don’t always respond to a plain turn_on.
Reliability: offline devices
Home Assistant accepts service calls to unavailable entities without erroring: a command sent to a device that’s off used to be silently lost, and History still reported ‘executed’. Chronos now checks availability before acting.
If an entity is offline at block dispatch, History records the real offline and the action is re-armed and retried as soon as the device comes back online, as long as the block is still active (with on/off and a max number of attempts in Settings). The switch-off recall is even more defensive: it’s always on, not bounded by the block window (switching off late is the safe direction, a valve left open keeps watering), survives restarts and is persisted, and only gives up after 12 hours offline with a note in History.
Schedules as Home Assistant entities
Beyond living inside the card, every schedule is exposed as three native entities under a single Chronos Scheduler device: a switch to enable or disable it, a binary_sensor telling whether it’s running right now, and a timestamp sensor with the next change (current action, block window and device count in the attributes). So a schedule goes on any dashboard with native cards, enters automations and conditions, or responds to voice, without embedding the full card. The entities are keyed on the id, so renaming a schedule doesn’t break automations, and creating or deleting one updates the entities live with no restart.
For staying inside Chronos but smaller, the card has a single-view mode (the view option): it renders one screen with no sidebar or bar, becoming a widget to place side by side into a custom dashboard. And there’s a non-interactive status card to recap a single schedule at a glance (a Now and Next line, a timeline, a tri-state log, with a red alarm glow when the latest activity is an error).
History
The History screen is an append-only log (up to 5000 entries) of every run. You filter it by date range, schedule, kind and outcome, with KPIs at the top, a daily bar chart and the detailed event list. It’s the tool to understand why a schedule fired, or why it didn’t, and errors carry the Python exception class to tell at a glance an unregistered service from a wrong parameter.
Duplicate, export, import
A schedule can be duplicated from the editor header or the wizard, choosing name, devices, days and whether to also copy the weather rules (copies start disabled). It can be exported to JSON (device links are saved as entity ids) and re-imported by pasting the JSON or from a file: devices are re-matched by entity id and unmatched ones are reported.
Installation
Via HACS (recommended)
- HACS → Integrations → top-right menu → Custom repositories
- Add
https://github.com/Pricesswg/Chronos-Scheduleras type Integration - Search for “Chronos Scheduler” in HACS, click Download
- Restart Home Assistant
- Settings → Devices & Services → Add Integration → Chronos Scheduler
- Add the card to your dashboard:
type: custom:chronos-card
The frontend card is registered automatically by the integration on every start: the bundle is copied to <config>/www/chronos-card.js, the Lovelace resource is created or updated to /local/chronos-card.js?v=<version> (UI mode), with an add_extra_js_url fallback to /chronos_static/chronos-card.js.
For Lovelace YAML-mode dashboards, add the resource once:
resources:
- url: /local/chronos-card.js?v=1.6.0
type: module
Manual installation
- Copy
custom_components/chronos/(includingwww/chronos-card.js) into<config>/custom_components/ - Restart Home Assistant
- Settings → Devices & Services → Add Integration → Chronos Scheduler
- Add
type: custom:chronos-cardto the dashboard
Initial setup
On first start the integration asks you to select a weather.* entity as the weather source. It can be changed later from the in-card Settings. You can also leave it empty if you only use point sensors (Ecowitt, WeatherFlow) configured per attribute from Settings → Weather source → sensor overrides.
Services
| Service | Description |
|---|---|
chronos.reload |
Reloads the Chronos configuration from storage |
chronos.fire_block |
Runs the currently active block, bypassing timing and rules |
chronos.schedule_toggle |
Enables or disables a schedule (by id or by name) from HA automations and scripts |
Tech stack
Python backend — native Home Assistant integration with a tick scheduler (1 minute), weather rule evaluator, action dispatcher, offline-device recall, persistence via the HA Store API, guided config flow, built-in i18n.
TypeScript + Lit frontend — custom Lovelace element with its screens (overview, timeline editor, weather rules manager, week view, wizard, History, settings, etc.), a default top-bar navigation with icon chips (the classic left sidebar stays an option), localisation in eight languages (IT, EN, FR, DE, ES, PT, NL, PL), theme that follows Home Assistant.
Auto-registration — bundle copied automatically to /www/chronos-card.js at boot, Lovelace resource created or updated via WebSocket, fallback to add_extra_js_url with the static path /chronos_static/.
Persistence — all configuration (schedules, rules, settings, sensor overrides) saved by the Home Assistant Store API, exposed to the card via a custom WebSocket API.
License
Distributed under the MIT license.