A simple Home Assistant integration that turns entities on and off with a precise countdown timer and daily runtime tracking.
π Out-of-the-box, pre-packaged timer solution, eliminating manual creation of multiple Home Assistant entities, sensors, and automations.
π Flexible Timer Control - Set countdown timers in seconds, minutes, hours, or days for any switch, input_boolean, light, or fan
β‘ Default Timer - Automatically starts a countdown when the device is turned on manually (Auto-Off functionality)
π Daily Runtime Tracking - Automatically tracks and displays daily usage time
π Smart Auto-Cancel - Timer automatically cancels if the controlled device is turned off externally
π¨ Professional Timer Card - Beautiful, modern UI with customizable timer buttons and real-time countdown
π Notification Support - Optional notifications for timer start, finish, and cancellation events
π Midnight Reset - Daily usage statistics reset automatically at midnight
π Manual Usage Reset - Long-press the daily usage display to reset statistics manually
β° Delayed Start Timers - Turns devices ON when timer completes and keeps them on indefinitely until manually turned off
β Extend Timer - Add time to actively running timers on the fly without restarting
- Water Heater Control - Manage boiler schedules
- Kitchen Timers - Control smart switches for appliances
- Garden Irrigation - Time watering systems
- Lighting Control - Automatic light timers
- Fan Control - Bathroom or ventilation fans
- Any Timed Device - Universal timer for any switchable device
Use this link to open the repository in HACS and click on Download
- Download the latest release from GitHub Releases
- Extract the
custom_components/simple_timerfolder to your Home Assistantcustom_componentsdirectory - Restart Home Assistant
- Note: You do NOT need to add the dashboard resource manually. It is automatically registered when the integration starts.
That's it! The timer card is automatically installed and ready to use.
- Go to Settings β Devices & Services
- Click "Add Integration"
- Search for "Simple Timer"
- Select the device you want to control (switch, light, fan, input_boolean)
- Give your timer instance a descriptive name (e.g., "Kitchen Timer", "Water Heater")
- Choose notification entitiy (optional) - can be add more than one
- Check show seconds (optional) - display seconds in uasge time and notifications
- Edit your dashboard
- Add a card
- Search for "Simple Timer Card" (should appear in the card picker)
- Configure the card:
- Select your timer instance
- Customize timer buttons
- Add a custom card title (optional)
- Go to Settings β Devices & Services
- Find your Simple Timer integration
- Click Configure (βοΈ gear icon)
- Change the name and save
If you use the 3-dots menu to rename, open Configure once afterward to sync the change.
Use the card editor in the Home Assistant UI for easy configuration.
Copy this block to your dashboard configuration and uncomment/edit the lines you need.
type: custom:timer-card
# -------------------------------------------------------------------------
# REQUIRED: Link to your timer instance
# -------------------------------------------------------------------------
timer_instance_id: your_timer_entry_id # Select the integration entry ID
# -------------------------------------------------------------------------
# TIMER SETTINGS
# -------------------------------------------------------------------------
# Presets: Use numbers (minutes) or strings with units ("30s", "1h", "1d").
timer_buttons:
- 15
- 30
- 45
- 1h
- 2d
# reverse_mode will always take priority if both are set to true.
reverse_mode: false # If true, timer works as "Delayed Start" (turns ON when time ends)
turn_off_on_cancel: true # Turn off the device when timer is cancelled?
# -------------------------------------------------------------------------
# SLIDER & DISPLAY
# -------------------------------------------------------------------------
card_title: "Water Heater" # Custom title
hide_slider: false # Set true to hide the slider
show_daily_usage: true # Show/Hide the daily usage stats
slider_max: 120 # Maximum value for the slider
slider_unit: min # Unit for slider: 's', 'min', 'h', 'd'
# -------------------------------------------------------------------------
# STYLING (Optional)
# -------------------------------------------------------------------------
# Icons
entity_state_icon: mdi:lightbulb
# Colors (Hex or RGBA)
slider_thumb_color: "#2ab69c"
slider_background_color: "#424242"
timer_button_font_color: "#ffffff"
timer_button_background_color: "#424242"
power_button_icon_color: "#03a9f4"
power_button_background_color: "#424242"
entity_state_button_icon_color: "#727272"
entity_state_button_background_color: "#1c1c1c"
entity_state_button_icon_color_on: "#03a9f4"
entity_state_button_background_color_on: "#1c1c1c"| Option | Type | Default | Description |
|---|---|---|---|
type |
string | - | Must be custom:timer-card |
timer_instance_id |
string | - | Entry ID of your timer instance |
timer_buttons |
array | [15,30,60,90,120,150] | Timer duration buttons. Supports mixed units (e.g., [30, "15s", "1.5h", "1day"]) |
card_title |
string | - | Custom title for the card |
slider_max |
integer | 120 | The maximum value for the slider (supported range: 1β9999) |
slider_unit |
string | min | Unit for the slider (s, min, h) |
reverse_mode |
boolean | false | Enable delayed start (turns device ON when timer ends). Note: Disabled if Default Timer is enabled for this entity. |
hide_slider |
boolean | false | Hide the slider control completely |
show_daily_usage |
boolean | true | Display daily usage statistics |
turn_off_on_cancel |
boolean | true | Whether to turn off the entity when the timer is cancelled |
slider_thumb_color |
string | - | Custom color for the slider thumb (hex or rgba) |
slider_background_color |
string | - | Custom color for the slider track |
timer_button_font_color |
string | - | Custom font color for timer buttons |
timer_button_background_color |
string | - | Custom background color for timer buttons |
power_button_background_color |
string | - | Custom background color for the power button |
power_button_icon_color |
string | - | Custom icon color for the power button |
entity_state_icon |
string | - | Custom icon for the state button (top-left) |
entity_state_button_icon_color |
string | - | Custom icon color for the entity state button (top-left) |
entity_state_button_icon_color_on |
string | - | Custom icon color for the entity state button when ON |
entity_state_button_background_color |
string | - | Custom background color for the entity state button (top-left) |
entity_state_button_background_color_on |
string | - | Custom background color for the entity state button when ON |
Yes! Add multiple integrations for different devices.
Yes, active timers resume automatically with offline time compensation.
Yes! You can add multiple cards for the same timer instance on different dashboards (or the same one). They will stay synchronized.
You can use the simple_timer.start_timer service in your automations or scripts.
triggers:
- at: "10:00:00"
trigger: time
actions:
- data:
entry_id: your_entry_id # Find this in the entity attributes (e.g.: 01KDQ6WPZDBB3EB89DX407GR6M)
duration: 30
unit: s
reverse_mode: false
action: simple_timer.start_timerNot directly, but you can achieve this easily!
- Create a Helper (Input Boolean) for your timer (e.g.,
input_boolean.ac_timer). - Point the Simple Timer integration to this helper.
- Create an automation that acts on the helper's state changes:
alias: "A/C Timer Control"
trigger:
- platform: state
entity_id: input_boolean.ac_timer
to: "on"
id: "start"
- platform: state
entity_id: input_boolean.ac_timer
to: "off"
id: "stop"
action:
- choose:
- conditions:
- condition: trigger
id: "start"
sequence:
- service: climate.turn_on
target:
entity_id: climate.living_room_ac
- conditions:
- condition: trigger
id: "stop"
sequence:
- service: climate.turn_off
target:
entity_id: climate.living_room_acYes! You can configure values with explicit units. Example: timer_buttons: [30, "45s", "1.5h", "1d"].
This appears when HA was offline during a timer to indicate potential time sync issues.
- Restart Home Assistant: The card is installed during integration setup
- Check integration logs: Look for any errors during the card installation process
- Verify automatic installation: Check if
/config/www/simple-timer/timer-card.jsexists - Clear browser cache: Hard refresh with Ctrl+F5 (Windows) or Cmd+Shift+R (Mac)
- Check browser console: Press F12 and look for JavaScript errors
- Check device entity: Ensure the controlled device exists and is accessible
- Verify integration setup: Go to Settings β Devices & Services β Simple Timer
- Check logs: Look for errors in Settings β System β Logs
- Restart integration: Remove and re-add the integration if needed
- Device state changes: Timer only tracks when the device is actually ON
- Manual control: If you turn the device off manually, tracking stops (by design)
- Midnight reset: Usage resets at 00:00 each day automatically
If the automatic card installation fails:
- Check file permissions: Ensure Home Assistant can write to the
wwwdirectory - Verify disk space: Ensure sufficient space for file copying
- Check integration logs: Look for specific error messages
- Manual fallback: You can still manually copy the card file from the integration's
distfolder
If you don't see new features (like the Default Timer option) after updating:
- Clear browser cache: Hard refresh with Ctrl+F5 (Windows) or Cmd+Shift+R (Mac)
- Reload Resources: Call the
simple_timer.reload_resourcesservice from Developer Tools β Services to force the frontend to load the latest version.
If you encounter issues:
- Check the Issues page for existing solutions
- Enable debug logging:
logger: logs: custom_components.simple_timer: debug
- Create a new issue with:
- Home Assistant version
- Integration version
- Detailed error description
- Relevant log entries
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create a feature branch
- Make your changes
- Test thoroughly
- Submit a pull request
This project is licensed under the MIT License - see the LICENSE file for details.
If you find this integration useful, please consider:
- β Starring this repository
- π Reporting bugs you encounter
- π‘ Suggesting new features
- π Improving documentation
Made with β€οΈ for the Home Assistant community



