A beautiful, Tado-inspired heating scheduler for controlling smart TRVs (Thermostatic Radiator Valves) in Home Assistant. Features a visual timeline interface, per-day scheduling, and easy copy/paste between days.
✨ Beautiful Visual Interface
- Tado-inspired timeline view showing temperature blocks
- Color-coded temperature visualization
- Clean, modern dark theme design
📅 Flexible Scheduling
- Different schedules for each day of the week
- Copy and paste schedules between days
- Unlimited time blocks per day
- Drag and drop time selection
🏠 Multi-Zone Support
- Manage multiple rooms/zones from one interface
- Tab-based zone switching
- Independent schedules per zone
🌡️ Temperature Control
- Visual temperature sliders
- Customizable min/max temperatures
- Default and comfort temperature presets
🔧 Universal Compatibility
- Works with any climate entity (Matter, Zigbee, Z-Wave, etc.)
- Tested with Eve Thermostat via Matter
- Multiple TRVs per zone supported
-
Download the files:
trv-heating-scheduler-card.jstrv-heating-scheduler-card-editor.js
-
Copy to Home Assistant:
# Create the www directory if it doesn't exist mkdir -p /config/www/community/trv-heating-scheduler/ # Copy the files cp trv-heating-scheduler-card.js /config/www/community/trv-heating-scheduler/ cp trv-heating-scheduler-card-editor.js /config/www/community/trv-heating-scheduler/
-
Add to Lovelace resources:
Go to Settings → Dashboards → Resources (top right menu) → Add Resource
url: /local/community/trv-heating-scheduler/trv-heating-scheduler-card.js type: JavaScript module
-
Restart Home Assistant
This card will be submitted to HACS soon
- Open HACS
- Go to "Frontend"
- Search for "TRV Heating Scheduler"
- Click Install
Add the card to your dashboard:
type: custom:trv-heating-scheduler-card
title: Heating Schedule
zones:
- id: living_room
name: Living Room
entities:
- climate.living_room_trv
- id: bedroom
name: Bedroom
entities:
- climate.bedroom_trv
default_temperature: 16
comfort_temperature: 19type: custom:trv-heating-scheduler-card
title: Heating Schedule
zones:
- id: living_room
name: Living Room
entities:
- climate.living_room_trv
- climate.living_room_underfloor
- id: master_bedroom
name: Master Bedroom
entities:
- climate.master_bedroom_trv
- id: kids_room
name: Kids Room
entities:
- climate.kids_room_trv_1
- climate.kids_room_trv_2
default_temperature: 16 # Temperature when away/sleeping
comfort_temperature: 19 # Comfortable daytime temperature
min_temperature: 5 # Minimum settable temperature
max_temperature: 30 # Maximum settable temperature
time_step: 30 # Time picker step in minutes| Option | Type | Default | Description |
|---|---|---|---|
title |
string | 'Heating Schedule' |
Card title |
zones |
list | required | List of zones/rooms to control |
default_temperature |
number | 16 |
Default/away temperature (°C) |
comfort_temperature |
number | 19 |
Comfort temperature (°C) |
min_temperature |
number | 5 |
Minimum temperature (°C) |
max_temperature |
number | 30 |
Maximum temperature (°C) |
time_step |
number | 30 |
Time picker increment (minutes) |
Each zone requires:
| Option | Type | Description |
|---|---|---|
id |
string | Unique identifier (lowercase, no spaces) |
name |
string | Display name |
entities |
list | Climate entity IDs to control |
- Select a Zone: Click the zone tab at the top
- Select a Day: Click the day button
- Add Time Blocks: Click "Add time block"
- Set Times: Use the time pickers to set start/end times
- Set Temperature: Use the slider to set the desired temperature
- Copy/Paste: Use copy/paste buttons to duplicate schedules to other days
- Edit Time: Click on the time inputs to change start/end times
- Change Temperature: Drag the slider or click to set temperature
- Delete Block: Click the × button to remove a time block
- Visual Timeline: View all blocks at once in the timeline at the top
- Select the day you want to copy
- Click the "Copy" button
- Select the destination day
- Click "Paste"
- The schedule is now duplicated!
The card displays and edits schedules, but you need to set up automation to apply them. Choose one method:
Most sophisticated option with automatic schedule application.
- Install AppDaemon (if not already installed)
- Copy
trv_scheduler.pyto/config/appdaemon/apps/ - Configure in
apps.yaml:
trv_scheduler:
module: trv_scheduler
class: TRVHeatingScheduler
zones:
- name: "Living Room"
id: "living_room"
entities:
- climate.living_room_trv
- name: "Bedroom"
id: "bedroom"
entities:
- climate.bedroom_trv
default_temperature: 16
comfort_temperature: 19
check_interval: 60 # Check every 60 seconds- Restart AppDaemon
The app will automatically:
- Apply schedules based on current time
- Update TRVs when schedules change
- Handle multiple zones
- Log all temperature changes
Use built-in automations (simpler but less flexible).
-
Create input_text helpers for each zone/day combination:
input_text: living_room_schedule_monday: name: "Living Room Schedule - Monday" max: 255
-
Create automation to check and apply schedules every minute
-
See
automations.yamlfor a complete example
If you use Node-RED, you can create a flow that:
- Reads schedule data from localStorage via browser
- Applies schedules based on time
- Provides visual flow debugging
- Check that the JavaScript file is loaded in Resources
- Check browser console for errors (F12)
- Verify the file path is correct
- Clear browser cache (Ctrl+Shift+R)
- Check that you've set up the automation/AppDaemon app
- Verify climate entity IDs are correct
- Check Home Assistant logs for errors
- Ensure TRVs are responsive and connected
- Check browser localStorage is enabled
- Verify you're not in a private/incognito window
- Try refreshing the page
- Verify climate entities are working (test manually)
- Check entity IDs match exactly
- Ensure TRVs support temperature setting
- Check for automations that might override settings
- The card allows overlaps - last applied wins
- Consider deleting overlapping blocks
- Use the timeline view to visualize conflicts
- Use 16°C for nighttime/away periods
- Set 19-20°C for comfort periods
- Consider setback periods when everyone is out
- Use lower temperatures for bedrooms (better sleep)
- Start with a basic daily pattern, then adjust
- Use copy/paste to quickly set up weekdays
- Keep weekends separate for lie-ins
- Consider your family's routine
- Living areas: warm during evening
- Bedrooms: warm before bedtime, cool overnight
- Bathroom: warm in mornings
- Home office: warm during work hours
If using Matter TRVs (like Eve Thermostat):
- Ensure Thread network is stable
- Keep border routers close to TRVs
- Update firmware regularly
- Use local control for faster response
# Clone the repository
git clone https://github.com/yourusername/trv-heating-scheduler
# Make changes to the JavaScript files
# Test in Home Assistant
cp *.js /config/www/community/trv-heating-scheduler/Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes
- Test thoroughly
- Submit a pull request
The card stores schedules in browser localStorage by default. This means:
✅ Pros:
- Instant updates
- No Home Assistant storage needed
- Works offline
❌ Cons:
- Not synced across devices
- Lost if browser data is cleared
- Not accessible to automations
Future feature: Option to store in Home Assistant input_text entities for multi-device sync.
- HACS integration
- Store schedules in Home Assistant entities
- Multi-device sync
- Temperature profiles (Home/Away/Sleep)
- Holiday mode
- Boost function
- Week view with all days visible
- Import/Export schedules
- Sunrise/sunset relative times
- Weather-based adjustments
- Issues: GitHub Issues
- Discussions: Home Assistant Community
- Documentation: Wiki
MIT License - see LICENSE file for details
- Inspired by Tado's elegant scheduling interface
- Built for the Home Assistant community
- With love for smart home automation ❤️
Beautiful timeline view with temperature blocks
Tab-based zone switching
Works perfectly on phones and tablets
Made with ☕ and 🏠 automation
