I’m in no position to criticise use of LLMs for programming as one wrote most of this project! I am a professional software engineer but just didn’t have time to learn the ins and outs of HA, I at least know what questions to ask.
I’m about to release this version to production, it has a bunch of optimisations for card registration so hopefully will fix most of these issues.
v1.14.7 released and available in HACS, loads of fixes and updates in this one and I think the cache busting is finally working…
[1.14.7] - 2026-01-10
Summary
Added
Scheduler Component Compatibility: Switch entities now expose schedule data in scheduler-component format
Each schedule creates a switch.schedule_<name>_<token> entity
Attributes include next_trigger, next_slot, actions, and next_entries
Compatible with integrations like Intelligent-Heating-Pilot that consume scheduler data
Supports both single-entity and multi-entity group schedules
Documentation: Added SCHEDULER_COMPATIBILITY.md with integration examples
Documentation: Added TESTING_SCHEDULER_FORMAT.md with validation methods
Validation script: validate_scheduler_format.py for verifying data format compliance
Updated
Frontend Card Registration: Improved card registration following HACS best practices
Card now registers in picker immediately when JavaScript loads, before class definition
Registration wrapped in IIFE with error handling to prevent cascade failures
Better logging for debugging registration issues
Automatic Browser Refresh Detection: Frontend now detects when cached version is stale
Version checking in both climate-scheduler-card.js and panel.js
Shows toast notification when browser cache doesn’t match server version
Uses sessionStorage to avoid showing notification repeatedly
Works for both dashboard cards and panel views
Automatic Reload on Install/Upgrade: Integration automatically reloads after first install or version upgrade
Detects first install and upgrades by tracking version in config entry
Triggers automatic reload 2 seconds after setup completes
Ensures all entities and UI components are properly initialized
Eliminates need for manual reload after installation or updates
Changed
Removed “(Dev)” suffix from “Reload Integration” service and button
Service name: climate_scheduler.reload_integration (unchanged)
Display name now: “Reload integration” (was “Reload integration (Dev)”)
Description updated to remove “development only” text
Frontend version checking moved from backend to JavaScript
More accurate detection of stale browser cache
Backend cannot know what’s cached in user’s browser
Switch entities now use token-based unique IDs for better uniqueness (format: switch.schedule_<name>_<token>)
Actions array now properly populates with all schedule nodes and entities
Enhanced _compute_schedule_attributes() to derive entity from group name when missing
Fixed
Node Activated Events: Events now only fire on scheduled time transitions, not when editing current node
climate_scheduler_node_activated events now only trigger when node time changes (scheduled transition)
Editing the current active node’s settings no longer fires spurious events
Climate entities still update immediately when current node is edited, but events are suppressed
Prevents unwanted automation triggers when adjusting schedules in the UI
Issue 101 Graph Rendering: Enhanced fix for graph line drawing at the start of the day in 7-day and weekday/weekend modes
Graph now correctly uses previous day’s last temperature node when drawing the line at the start of the current day
Added setPreviousDayLastTemp() method to graph.js for cross-day continuity
Helper function in app.js determines correct previous day based on schedule mode (all_days, 5/2, individual)
Fixes visual issue where graph would incorrectly draw from current day’s last node at midnight
Timezone Handling: Fixed coordinator to use Home Assistant’s configured timezone instead of system timezone
Replaced all datetime.now() calls with dt_util.now() in coordinator.py (11 instances)
Ensures schedule activation respects HA’s timezone configuration, not the host system’s timezone
Critical for users where Home Assistant timezone differs from system timezone
Properly handles daylight saving time (DST) transitions
Storage format unchanged - times remain as “HH:MM” strings
Card registration now more resilient to loading errors
Version mismatch detection works correctly in both panel and dashboard contexts
Issue 102: climate_scheduler_node_activated events fired by coordinator and the test events button didn’t match. entity_id is used if there’s a single entity but entities is used where there are multiple. In the future I will remove entity_id and have single
Issue 101: In 7 day or weekday/weekend modes tha coordinator wasn’t checking the last node from the previous session and incorrectly using the last from the new session.
Issue 102: climate_scheduler_node_activated events fired by coordinator and the test events button didn’t match. entity_id is used if there’s a single entity but entities is used where there are multiple. In the future I will remove entity_id and have single
Fixed AttributeError: ‘entity_id’ property no longer blocks Home Assistant from setting the entity ID
Automatic cleanup of old switch entities without token suffixes (removes duplicates on reload)
Empty entities list now handled gracefully - derives entity from single-entity group name
Actions and next_entries now properly populated even when entities list is temporarily empty
Great integration which reproduce more or less what I have implemented long time ago with automation, script … It will dramatically simplify my configuration.
I have several electrical heaters in different rooms. All of them must be monitored with two profiles : Home and Office on a day by day basis.
May I ask some questions :
Is there a way to enlarge the scheduler graph ? Much too small for my eyes.
With the two profiles defined above, I can select for example Home profile for Monday in the Active Profile selector. then the climate scheduler immediately displays the profile of the current day (in my case Sunday whereas I would like to keep seeing Monday).
I want to schedule for Monday: a) I click on Monday (Mon box in blue) , b) I select Office c) Save d) the climate scheduler displays Sun (Sun box in blue) e) The heater switches On (Why ? - No reason for that - the temperature is above the target)
What does exactly the selector ‘Active profile’ show ? (unclear for me). If today is Sunday. I understand that I can switch between the two profiles for the current day. Does it display the profile of the current day ? or the profile of the day I’m scheduling. If I select Monday, the Office profile is well displayed but the Active profile selector still displays Home which is the profile of today. I would have expected that the Active profile selector displays the one choosen for the day I’m working on and not the profile of the current day (In this case, the Office profile saved for Monday).
What kind of controls are implemented when the current temperature is above the target because the heater’ switch does not receive the order ? like sending a notification ?
I have seen there is a rate (temperature variation per hour)
Do you use this rate to swich the heater on before the targeted start time in order to reach the targeted temperature at the targeted time ? If the rate is 0,5°C/h it means you need one hour to increase the temperature by 0,5°C. If the current temperature is 18°C and the targeted temperature is 19°C, the heater should be switched on two hours before the targeted time.
Two small green boxes with red cross around 10:00 can be seen on the profile. What does it mean ? How to delete them ?
What should be displayed on the right, starting with AC ?
The title and the value are not aligned : Current is in the middle or left of the box, whereas the value 21,3°C is on the right, both in the middle would be niceier.
Add the capability to send a message (with template) to the companion app to inform the user (when the heater starts or ends with the current, targeted temperatures, …)
Sorry for my english. If it’s unclear I will try to reformulate.
The green boxes show times when the schedule advance feature was activated, this instantly applies the next node in the schedule. For example, if you get home early you can activate this to warm up the house. It will show a green dot at the time you clicked advance and a green line to the next node, this shows it’s a temporary adjustment. If you then click “Cancel Advance” it goes back to the original schedule and leaves a red cross behind at the time you cancelled. I thought this useful so that you can see when people wanted the schedule to change and maybe adjust it.
“Advance” is used to mean “use the next” so I may need a term that translates better.
Under Settings on the schedule there is a “Clear Advance History” button, if you click this those icons should be cleared.
Regarding the UI, it’s a mess at the minute and something I’m concentrating on for the next phase of development. I only made this work as a full size panel, if you use “Panel (Single Card)” the layout should be better at least.
Profiles
A profile is currently for the entire schedule so for individual days and weekday/weekend it applies the same to all periods, I hadn’t considered that people would want different profiles per day/period but I can add this in. I work from home so I’m always here and have a daily schedule with no profiles, I don’t hit a lot of these issues as a result.
When you change profile it currently refreshes the UI and defaults to showing the current day, I can understand why this is frustrating for sure! I’ll add it to the list to improve.
Temperature Control
What kind of controls are implemented when the current temperature is above the target because the heater’ switch does not receive the order ? like sending a notification ?
I have seen there is a rate (temperature variation per hour)
Do you use this rate to swich the heater on before the targeted start time in order to reach the targeted temperature at the targeted time ? If the rate is 0,5°C/h it means you need one hour to increase the temperature by 0,5°C. If the current temperature is 18°C and the targeted temperature is 19°C, the heater should be switched on two hours before the targeted time.
The Climate Scheduler doesn’t actually do anything smart, it just sets the climate entity to the settings you request at the time you set them in the schedule. The rate is just a sensor so that I can see how my rooms are behaving, they aren’t currently doing anything clever. Someone requested I expose data that Intelligent Heating Pilot could use to automate with but they haven’t been able to test it yet. That uses Versatile Thermostat underneath which I need to look at too as it’d solve a lot of my problems.
I’m starting to think I need to rewrite this whole thing to be a new front end for Scheduler Component to be honest, it has a foothold in the community and everyone has used it as the basis for other cool components and automations and would basically fix loads of problems others are asking about. I need to have a proper think about that.
In the profile, you set a temperature which may be different from the preset-mode of the heater.
Don’t you think it would be clearer to set the preset-mode instead of a temperature.
Otherwise the climate-scheduler settings may be incoherent with the climate settings behind.
It should also help to define profiles for group with several heaters which may need different comfort temperatures in each room (eg because the isolation is different in each and to feel confortable in room you need 20°C whereas in another room you only need 19°C). Both rooms will use climate-scheduler switching to Comfort, but for one room Comfort = 20°C and for the other Comfort = 19°C), thus saving energy and money.
Discard my previous suggestion
Some enhancement suggestions :
Add the capability to send a message (with template) to the companion app to inform the user (when the heater starts or ends with the current, targeted temperatures, …)
Stupid idea = an automation triggered by the climate is better.
Going back to the rate, what does it measure exactly ? The temperature variation in degrees/hour ? That’s all ?
The rate is high when the heating cycle starts. The rate was 0.0°C/H when the heating cycle was finished.
What I use in my current settings is more/or less Intelligent Heating Pilot without Versatile Thermostat.
Home made because Versatile Thermostat didn’t work well at the time I implemented HA.
If IHP is embedded in Climate-Scheduler it would be very smart as you save a lot of energy by starting when needed. Right now, I have set in Climate-Scheduler a start time taking into account the slope to be warm at the right time.
The idea behind this is that Climate Scheduler is the primary way climate entities are automated and that there shouldn’t be anything else behind the scenes altering things. It includes lots of actions that let you automate different things while keeping CS in the middle coordinating things. If anything is changed manually, for example on the wall thermostat in the physical room, CS will respect the change and not override it though.
I was thinking temperature first as that’s just how it’s done in the UK so it’s my way of thinking, I’m learning this is different around the world though and factored that in
One of the things CS can do is automate the changing of climate presets at each node, without changing the temperature too. Apparently preset based thermostats are very common in France and this was an early user requested feature.
In the example below I clicked on the middle node and the “no change” box, this removes the temperature change from that node. “Preset Mode” that is expanded are actually the presets that the underlying thermostat presents. I don’t use them but the ones listed are the defaults my devices come with.
If your underlying climate entity has some internal automation that is based off the presets it presents then this should work.
If you click “No Change” for each node in the graph and choose which preset you wish to use I think it’ll do what you want it to.
For the sensors, it’s just a very simple thing that calculates degrees per hour, it was an experiment more than anything.
Regarding the messaging you requested, it can be easily automated I think. When a node is activated Climate Scheduler creates a climate_scheduler_node_activated event. You should be able to create an automation that sends a notification I think, either way it’s a way for you to implement your request. I added as many things like this so that it’s versatile for people to create custom behaviours as they wish.
ClimateScheduler works really well for me. However, all my schedules (to be precise: the scheduler groups) keep getting deactivated somehow. I woke up on three consecutive days now to cold radiators - activated the groups, and everything works just fine. I can’t think of any of my automations that would do that. Does that happen when I edit schedules? Is there something in the documentation that I missed? Or ideas anyone how I could troubleshoot?
I had accidentally created a cyclic dependency in my automations involving Climate Scheduler: action setting schedule profiles + action triggered on schedule profile change. When I broke the cycle by adding additional conditions, the behavior was gone.
But then when I tried to build something similar to confirm, I could not reproduce anymore. So I really don’t know… problem is gone, but I’m not sure why.
Oh crap, there was a bug I thought I squashed where it will recreate entities with climate_scheduler_ in front of them for some reason. I had some that had recursed about a dozen times, I’m guessing as I so frequently updated…
“All Zones” isn’t a valid group, but I could look at adding something similar if it’d be helpful?
That’s a really odd one, I’ve not heard or seen that behaviour to be honest. If you look in Settings → Entities and search for “Schedule ” though you should be able to bring up the history, there are also virtual climate entities that represent your schedules too.
Thank you. I did look at the entities for the schedules, and I could also actually watch the schedule groups being deactivated live when I triggered these automations for the profiles by hand. As I wrote above, problem is solved now, but I don’t know exactly why, and I can unfortunately not reproduce.
Again, thank you for your work. Apart from the hickup certainly caused by my own automations, this works like a charm. Finally something intuitive enough for less nerdy family members to use, which is a huge plus.
That was what I was aiming for, I want something my girlfriend can use without needing a tutorial. She’s astonishingly intelligent so it’s not that she couldn’t figure it out, the point is it needs to be simple enough no one has to.
At the minute I think it’s a good balance of being able to understand how it works at a glance once it’s set up, with enough stuff for automations underneath for the power user.