Releases: eyalgal/simple-timer-card
v2.2.1 - Fix MQTT sync regression
This release fixes a regression introduced in v2.2.0 where timers no longer synced across devices when using the legacy MQTT configuration.
🐛 Fixed
- MQTT sync broken when using
default_timer_entity: sensor.*without explicitstorage: mqtt
In v2.2.0, users who relied on the previous implicit behavior experienced timers not syncing between devices.
This has been restored for full backward compatibility. (See: #84)
✅ What’s restored
- If
default_timer_entityis set to asensor.*and no explicitstorageormqtt:block is defined, the card now correctly infers MQTT storage (as in v2.1.x). - Existing dashboards should work again without configuration changes.
If you already switched to explicit storage: mqtt configuration, everything will continue to work as expected.
v2.2.0 – Sorting, Pinned Control, and Safer Internals
✨ New Features
-
Timer sorting
- Sort timers by time left or name
- Ascending or descending order
- Defaults remain unchanged (time left, ascending)
-
Pinned timer placement
- Keep pinned timers mixed inline (default)
- Optionally force pinned timers to the top or bottom of the list
-
Improved multi-card behavior
- Multiple timer cards can coexist safely on the same dashboard
- Pinned timers in one card no longer affect pinned timers in another card
🛠 Improvements
-
Safer internal timer model
- Unified internal representation for timers
- Improves pause, resume, and time calculations
- Fully backward compatible with existing setups
-
More robust MQTT handling
- Preserves v2.1.1 MQTT payload format by default
- Avoids breaking existing MQTT sensors and templates
-
Editor enhancements
- Sorting controls moved to the Layout section
- Default values are automatically cleaned from YAML
🐛 Bug Fixes
- Fixed pause and resume not stopping timers correctly
- Fixed custom timers not starting in some configurations
- Fixed edge cases with pinned timers and shared storage
- Fixed
minute_buttonsnot supporting seconds in some cases (#81)
v2.1.1 - Firefox Fix, MQTT Pinned IDs & Danish Support
This maintenance release resolves a critical loading issue on Firefox and improves MQTT event reliability for pinned timers.
Highlights ✨
- Firefox support restored: The card is now bundled with its dependencies, resolving the CORS / "Custom element doesn't exist" errors on Firefox. 🦊✅
- Smarter MQTT events: Pinned timers now correctly use their user-configured
idin MQTT payloads instead of a generic index, making automations much more reliable (fixes #78). 📡 - New language: Added Danish translation! 🇩🇰
Changes 🔧
Fixes
- Bundled Architecture: Switched to a bundled build process (Rollup). This fixes the
Cross-Origin Request Blockederrors seen on Firefox and improves reliability for offline/local-only setups (fixes #77). - MQTT Pinned IDs: Fixed a bug where
pinned_idin MQTT events would default topinned-0,pinned-1, etc., ignoring the manualidset in the config. It now correctly respects your configured ID (e.g.,study_1h), allowing for robust automation triggers. Thanks @andrewfoster!
Localization
Breaking changes ⚠️
- None expected.
v2.1.0 - Voice PE Local Control + Auto Voice PE Timers
Highlights ✨
- Voice PE local timers (advanced): start timers from the UI and pause / resume / cancel them (requires the advanced Voice PE ESPHome + template sensor setup). 🎛️
- Auto Voice PE timers (new): optional setting to automatically create new custom/pinned timers as local Voice PE timers. 🚀
- MQTT events improved: MQTT payloads now include
pinned_idfor pinned timers (fixes #76). 📡✅ - Voice PE docs split: clearer “mirror-only” vs “advanced” setup guides. 📚
Changes 🔧
Voice PE
- Added support for locally controllable Voice PE timers (advanced setup).
- Added config option
auto_voice_pe(default:false) to auto-create new custom/pinned timers as local Voice PE timers (requires Voice PE control entity). - Added config option
voice_pe_control_entity(default:null) to explicitly set whichtext.*/input_text.*entity receives Voice PE timer commands.
MQTT / Automations
- MQTT event payloads now include additional metadata (where available), including
pinned_idfor pinned timers.
Docs
- voice-pe.md is now the recommended mirror-only setup (read-only).
- Added voice-pe-esphome-readonly.md for the mirror-only ESPHome walkthrough.
- voice-pe-esphome.md is now the advanced walkthrough (remote mirroring + locally controllable timers).
Breaking changes ⚠️
- None expected.
v2.0.0 – Unified Timers & Pinned Presets
This is a big one. 🎉
Highlights
- Pinned timers: define one-tap timers (name, duration, icon, color, expiry message, optional audio). Starting one creates a normal running timer and hides the pinned entry until that run is gone.
- Unified timer model: all timer sources (local, MQTT, helper entities, timer.* entities, Alexa, Voice PE, timestamps) flow through the same rendering and sorting logic for a more consistent experience.
- Editor overhaul: cleaner, collapsible sections and a much nicer flow for Entities and Pinned Timers.
- Cleaner YAML: the editor no longer writes empty
entities: []/pinned_timers: []or other default values.
Audio
- Global audio settings work again (with per-entity and per-pinned overrides).
- Removed the "Enable Alexa-specific audio notifications" toggle. If you want different audio for Alexa timers, configure per-entity audio on the Alexa entity.
Fixes
- Sorting: timers are ordered by time-left across running timers and pinned timers.
- Snooze: works across timer types, including pinned timers.
- Editor stability: fixed old configs that could prevent opening the editor (e.g. timer_name_presets parsing).
Breaking changes
- Removed Alexa-specific audio config (
alexa_audio_enabled,alexa_audio_file_url,alexa_audio_repeat_count,alexa_audio_play_until_dismissed). These were previously supported (and documented) but are now gone in favor of global + per-entity/per-timer audio.
As always, thank you for the issues, testing, and screenshots. 🙏
v1.6.0 - Timer duration editor + UI refinements
What's Changed
- Added an inline duration editor for native
timer.*entities (when idle or paused). Click the time/status to adjust the default duration, then Save (update only) or Start (update + start). - Improved timer list parsing across sources (supports both
[id, timer]tuples and object-style timer arrays). - UI refinements across multiple styles:
- Circle: progress ring rendering and layering improvements
- Progress bar (vertical): action buttons placement aligned with prior behavior
- Background fill (vertical + horizontal): drain behavior and padding/corner rendering improvements
- Theme blending tweaks for icon and background elements for better consistency on transparent or heavily themed dashboards.
Notes
- The native timer duration editor relies on the
timer/updatewebsocket API. If your Home Assistant version does not support it, you'll see an error toast and the timer will behave as it did in v1.5.1.
Breaking Changes
- None expected (no config key renames or removals between v1.5.1 and v1.6.0).
v1.5.1 - Responsive Buttons, Active Presets & Alexa Fixes
What's Changed
- Flexible layout for minute buttons: The minute adjustment buttons (
+1m,+5m, etc.) now use a responsive layout that fills available space and wraps only when needed, instead of being forced into a fixed 3-column grid. (Fixes #69) - Presets in Active Timers header: Timer preset chips can now be shown and used from the Active Timers header, making it easier to start multiple timers even after the first one has started. (Fixes #65)
- Alexa timers show again: Updated Alexa parsing to support the newer attribute structure (including
alarms_brief) so Alexa timers appear correctly again.- Note: You may need to update Alexa Media Player to v5.8.4 or newer for compatibility: https://github.com/alandtse/alexa_media_player/releases/tag/v5.8.4 (Fixes #64)
v1.5.0 – Time Formats, Milestones & Entity UX
v1.5.0 – Time Formats, Milestones & Entity UX
This release adds a major upgrade to time presentation (including human-readable formats), introduces a milestone-based progress mode, and improves entity handling and editor UX across multiple timer sources.
🚀 New Features
- Human-readable time formats: New
time_formatoptions allow you to display remaining time as:human_compact,human_short,human_natural- Plus numeric formats like
hms,hm,ss, anddhms.
- Configurable unit ordering: New
time_format_unitslets you choose which units to show (and in what order), e.g.years,months,weeks,days,hours,minutes,seconds. - Milestone-based progress mode: Added
progress_mode: milestones(bar styles only), rendering segmented “unit milestones” (with optional pulsing on the active segment).- New options:
milestone_unit(auto|none|years|months|weeks|days|hours|minutes|seconds) andmilestone_pulse(defaulttrue).
- New options:
- New entity mode:
minutes_attr: Support timers based on an entity attribute that contains “minutes remaining / minutes to arrival” style data (configurable viaminutes_attr). - Per-entity expired subtitle override: Entity configs can override
expired_subtitleso each timer source can show a custom “Time’s up” message.
✨ Improvements
- Better finished/idle handling across sources: Expanded render-state logic supports clearer
idle,paused, andfinishedpresentation, including “Time’s up – X ago” style messaging. - Smarter duration parsing: Improved parsing of timer durations (including support for ISO-like
PT#H#M#Sparsing via_toMs). - Expanded localization: Translation keys now cover additional time units and formats (weeks/months/years and short unit labels), enabling better human-readable formatting across languages.
- Editor upgrades: Added UI controls for:
- Time format
- Unit order
- Progress milestones settings (when milestones mode is selected)
- Minutes attribute configuration for
minutes_attrentities - Conditional display of relevant fields to reduce clutter
📡 MQTT Events
- Richer event payloads: MQTT events include
remainingandduration(milliseconds) at the time of the event, enabling more precise automations. - Broader event coverage: The card publishes events for key timer interactions (
started,expired,cancelled,paused,resumed,snoozed). - Improved publish consistency: Events can publish even when storage is local, as long as an MQTT sensor (
default_timer_entity: sensor.*) is configured.
🐛 Bug Fixes
- Improved auto-detection coverage: Auto mode detection now recognizes attribute-driven minute timers and additional timestamp patterns more reliably.
- More consistent progress rendering: Unified progress handling across bar/fill/circle styles and new modes to avoid mismatched progress visuals.
v1.4.1: The Automation & Reliability Update
This point release addresses a critical bug in local timer validation and significantly expands the MQTT event system for better automation control.
🚀 New Features
- Expanded MQTT Events: The card now publishes specific events for cancelled, paused, resumed, and snoozed (in addition to started and expired). This allows for precise automation triggers based on any user interaction with the timer.
- Enhanced Event Payloads: MQTT event payloads now include remaining time and duration (in milliseconds) at the time of the event, enabling more complex logic in Home Assistant.
🐛 Bug Fixes
- Fixed Local Storage Timers: Resolved a logic error in the validation engine (_validateStoredTimerData) that was incorrectly rejecting valid timer IDs. This fix restores the ability to start timers using browser storage, presets, and the custom selector.
- State Sync Fix: Improved UI responsiveness by triggering immediate state updates when timers are paused, resumed, or cancelled, ensuring the visual state stays in sync with the underlying storage.
✨ Improvements
- MQTT Consistency: Optimized the event publishing logic to ensure events are sent regardless of whether the storage is set to local or mqtt, provided a default MQTT entity is configured.
v1.4.0 - Smarter Auto Mode & Editor Overhaul
This release brings a major overhaul to the configuration editor, making it easier to set up complex entities, along with a smarter "Auto" detection mode and improved MQTT integration.
🚀 New Features
- Configurable Default Time: You can now set the default duration for the custom timer picker (defaults to 15 minutes). No more scrolling from 15m every time you want a 1h timer! (Addresses #53)
- MQTT 'Started' Event: The card now publishes a started event to MQTT immediately when a new timer is created. This allows Home Assistant automations to trigger the moment a timer begins. (Addresses #55)
- Smart Editor Feedback: When selecting "Auto" mode, the editor now displays exactly which mode was detected (e.g., Detected mode: Alexa), taking the guesswork out of configuration.
- Language Support: Added support for German (de) and Spanish (es). (Addresses #52)
✨ Improvements
- Editor Layout: The configuration editor has been completely reorganized into logical sections (Appearance, Behavior, Storage, Audio) with a compact side-by-side layout.
- Timestamp Configuration: Fields for "Start time entity" and "Start time attribute" now only appear when they are relevant (Timestamp mode), reducing clutter. (Addresses #56)
- Smarter Detection: The auto-detection logic has been rewritten to be stricter. It now validates that an entity state looks like a date/time before assuming it is a timestamp sensor, preventing errors with unknown entities.
🐛 Bug Fixes
- Fixed an issue where the "Start time attribute" field was missing from the editor.
- Fixed logic for calculating durations when using a separate start time entity.
⚠️ Breaking Changes
- Stricter Auto Mode: If you were relying on "Auto" mode for an entity that didn't strictly look like a timer or timestamp, the card might now ignore it instead of trying to render it broken. Fix: Manually select the correct mode in the editor if Auto doesn't pick it up.