v0.4.5 #266
3dg1luk43
announced in
Announcements
v0.4.5
#266
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
0.4.5 - 2026-06-02
✨ Features
Card Tap / Hold / Double-Tap Actions: The WashData tile card now supports the standard Home Assistant gesture actions. Three new visual-editor options — Tap Action, Hold Action, and Double Tap Action — let each gesture trigger
more-info(the previous and still-default tap behaviour),toggle,call-service/perform-action,navigate,url, ornone. The card switched from a singleclicklistener to pointer-event gesture recognition (500 ms hold, 250 ms double-tap window, with a small movement tolerance so a scroll or drag does not register as a tap); a single tap fires immediately unless a double-tap action is configured. Existing cards are unaffected — the default tap action ismore-info, exactly as before. Originally submitted as PR by @kingpepe85 but did not satisfy the requirements to merge.Notification Lifecycle Is Now One Thread ([FR] Notification Timeout #248): Cycle start, live progress, the pre-end reminder, and the finished alert now share a single per-device notification
tag, so each one replaces the previous on the mobile companion app instead of stacking up. The finished notification replaces the live progress card in place (rather than the old behaviour of dismissing the live card and posting a separate finished card). For setups with no notify service configured (the persistent-notification fallback shown in the Home Assistant Notifications panel), the same identity is reused as a stablenotification_id, so the lifecycle collapses to a single card per device instead of accumulating one card per cycle. The clean-laundry "still inside" nag keeps its own separate tag because it can fire up to an hour after the finished alert.Notification Auto-dismiss Timeout ([FR] Notification Timeout #248): A new Auto-dismiss After (seconds) option forwards a
timeoutto the companion app so WashData notifications vanish automatically after the configured time (e.g. 3600 = one hour). Default0keeps the previous behaviour (notifications persist until dismissed). Applies to every notification type.Per-type Notification Channels ([FR] Notification channels #253): Two new options (Notification Channel (status/live/reminder) and Finished Notification Channel) let each device route its notifications to dedicated Android companion-app channels. Status, live, and reminder notifications use the first channel; the finished alert (and the reminder + laundry-waiting nag) use the second, so a cycle finishing can have its own distinct sound while status updates stay quiet. Both default to empty (the companion app's default channel). Note: a channel's sound/importance is configured in the companion app the first time the channel name is used. WashData only sets the channel name.
Optional Device Link ([FR] Assign Washdata entry to a HA device #242): A new Device Link section in advanced settings adds an optional Linked Device picker. When set, the WashData device is exposed as "Connected via <device>" in the Home Assistant device registry, so it can reference the smart plug or the appliance device it monitors. WashData keeps its own device card and entities (this is a reference link, not a merge); clearing the selection removes the link, and a linked device that is later deleted is treated as no link rather than a dangling reference. Defaults to empty — standalone behaviour, unchanged for existing setups.
🐛 Bug Fixes
Suggested Thresholds Rejected for High-power Appliances ([BUG] Can't apply Suggested Settings #257): Applying suggested settings on a high-power device (e.g. a domestic well pump with a ~914 W active-power floor) failed with "Value 1096.68 is too large for dictionary value @ data['detection_section']['start_threshold_w']" and the form would not save. The detection-section Start/Stop Threshold (W) selectors were hard-capped at 500 W / 100 W, ceilings tuned for washers and dryers, so the form rejected the very values the suggestion engine produced and also locked the user out on re-open once such a value was saved. The two ceilings now expand automatically to admit the currently-saved value and any pending suggestion (rounded up to the next 100 W for headroom), while keeping the friendly 500 W / 100 W bounds for typical appliances.
Pre-end Reminder No Longer Looks Like It Fires "5 Minutes Before End": The "X minutes before end" reminder previously reused the same message text as the recurring live progress updates ("Less than N minutes remaining"), so a routine live update near the end was indistinguishable from the reminder, making a reminder set to 20 minutes appear to fire at ~5 minutes. The reminder now has its own dedicated Reminder Message Format (default
{device}: about {minutes} minutes left.), fires exactly once at the configured time, shares the lifecycle tag so it updates the thread in place, and is routed to the finished channel without the livealert_onceflag so it makes a sound once. The live-update message field has been relabelled Live Update Message Format to reflect what it actually controls.Time Remaining Sensor Now Always Declares Its Unit ([FR] remaining time has no unit #261): The Time Remaining and Total Duration sensors declared their
minunit through a state-dependent property that returnedNonewhile the appliance was idle. Opening the entity settings while the machine was off therefore showed no unit, so Home Assistant did not offer the duration display-format options (e.g. switching the display to hours/minutes/seconds). The unit is now declared statically on the entity description (matching the Elapsed Time sensor), so both sensors are always recognised as duration entities and the display-format options are available regardless of state; the value still reads unknown while idle.Config & Options Screens Now Follow Each User's Profile Language ([BUG] Does not follow User language settings #258): The options menu and the Device Type picker were rendered in the Home Assistant system language (Settings > System > General) for every user, instead of following each signed-in user's own profile language. The options menu now hands its entries to the frontend as option IDs so the labels resolve per user, and the Device Type dropdown exposes its choices for per-user resolution instead of fixed labels. The conditional deprecated-device-type warning and the phase-catalog summary wording were routed through the shared localized-text helper, and several dead or duplicated form placeholders were removed. Text that WashData assembles in Python (notification bodies, and the deprecated-type warning, which is conditional) still follows the system language, because Home Assistant does not expose the requesting user's profile language to integrations.
Clean-Laundry Reminder Now Clears When the Laundry Is Removed: The "your wash has been sitting there" reminder uses its own notification tag rather than the cycle lifecycle tag, so nothing replaced it once the clean state resolved. Opening the door (or otherwise leaving the Clean state) previously only purged any still-queued clean notifications from the internal queue but left an already-delivered reminder stranded on the mobile companion app. WashData now also issues a best-effort
clear_notificationfor the clean tag whenever the laundry is taken, so a delivered reminder is dismissed in place instead of lingering. A clear for a non-existent tag is harmless, so this runs whenever a clean/finish delivery target or notification action is configured.Card Gestures: Scrolling No Longer Registers as a Tap: When a pointer drifted past the movement tolerance (a scroll or drag started on the card), the card cancelled the pending hold but the subsequent pointer-up still fired the configured tap action. The pointer-move handler now also marks the gesture as cancelled, and pointer-up bails out without firing a tap, so dragging or scrolling over the card no longer triggers
more-info(or any other configured tap action). Affects the tap / hold / double-tap gesture support added earlier in this release.🎨 UI & UX
Auto-Label Old Cycles: Readable Profile List: The auto-label screen previously listed every matching profile as a single comma-joined run-on line. Profiles are now shown one per line as a bulleted list.
Manage Phase Catalog: Shorter Landing Page: The phase-catalog landing page listed every phase of every device type, making it very long to scroll. It now shows the current device type's phases in full plus a one-line count of the other device types that have phases; creating, editing, and deleting phases still works across all device types.
📖 Documentation & Templates
New Notifications & Events Guide ([DOCS] Notification & Event & Attributes #252): The notification options were under-documented, and the multiple ways of sending a notification (per-event target lists, notify entities, Notification Actions, and bus events) were a common source of confusion. A new NOTIFICATIONS.md guide explains all three delivery paths and when to use each, documents every notification option in a single table, describes the cycle notification lifecycle (start -> live -> reminder -> finished and how they replace each other), lists the message placeholders and the companion-app payload keys, and folds in the full Events reference plus useful entity attributes. The README's inline Events section was condensed into a short summary that links to the new guide.
Notifications Guide: Language Behaviour Note: Added a short note to NOTIFICATIONS.md clarifying that notification text WashData composes (the default message templates and the learning / auto-tune prompts) follows the Home Assistant system language rather than each user's profile language, and pointing to the editable message templates and the bus-event automations as the way to localize notifications per recipient.
Bug Report: "Debug Logs" Renamed to "Logs / Error Evidence": The field previously labelled Debug Logs in the bug report template has been renamed Logs / Error Evidence and its description rewritten to make explicit that any log or error evidence is acceptable — a single error line from the HA logbook, a warning trace, or a full debug session all count. Several reporters were filling logs into the issue description body while marking the dedicated field as empty because they read "Debug Logs" as requiring HA-level debug output. The preflight checkbox, the issue-validator bot error message, and the heading regex in
issue_validator.ymlwere all updated to match the new field name. The validator acceptsN/Awith a reason exactly as before.🛠 Internal / Developer Experience
Notification Delivery (Behaviour Note): On cycle finish, WashData no longer sends a service-level
clear_notificationto live-progress targets; same-tag replacement by the finished notification handles dismissal. Custom notification action templates still receive theclear_notificationmarker for backward compatibility. Config entries migrate to schema3.5(new options are populated with defaults; no user data is touched).Contributor PR Flow — Issue-First with Owner Acceptance: Non-translation pull requests now require a linked issue carrying the
acceptedlabel before they are accepted. The intended flow is: open a bug report or feature request → check the new "I plan to submit a PR" checkbox → wait for the maintainer to add theacceptedlabel → then open the PR referencing that issue. A newvalidate_pr.ymlworkflow enforces this on every PR open/edit/reopen event: translation-only PRs (where every changed file is undertranslations/) and PRs opened by the repository owner are exempt; all others that do not reference an accepted issue are closed immediately with an explanatory comment. A companionprotect_accepted_label.ymlworkflow fires onissues: labeledand removes theacceptedlabel if it was applied by anyone other than the repository owner, then leaves a comment explaining the restriction. Bug report and feature request issue templates each received a new optional "Contributing a Fix / Implementation" checkbox section at the bottom to signal contributor intent. The PR template gained a prominent[!IMPORTANT]callout at the top and a dedicated Linked Accepted Issue field. Two new repository labels are required:acceptedandneeds description(see below).PR Quality Gate with 5-Day Auto-Close: The same
validate_pr.ymlworkflow also checks whether the PR description template has been meaningfully filled in: it verifies that the Description section contains content beyond placeholder HTML comments and that at least one Type of Change checkbox is checked. Incomplete PRs receive a warning comment (updated in-place on re-check) and theneeds descriptionlabel. A separateclose_incomplete_prs.ymlworkflow runs daily at 11:00 UTC and automatically closes any open PR carrying that label for more than 5 days. PRs that are later completed have the label and warning comment removed automatically. Both checks are skipped for the repository owner.Profile & Phase Names Escaped in Option-Flow Summaries: User-supplied profile and phase names are free text but were embedded raw into the markdown summaries rendered by the auto-label and phase-catalog screens, so a name containing markdown metacharacters could inject emphasis, code spans, links, or table cells, or break list rendering with embedded newlines. A new
_escape_markdownhelper collapses whitespace runs (including newlines) into single spaces and escapes\`*_[]~|before the name is interpolated, so names render literally everywhere they appear in option-flow text.Card "Open URL" Action Hardened Against Reverse Tabnabbing: The card's
urlgesture action opened the link with a barewindow.open(url, "_blank"), which leaves the opened page with a livewindow.openerreference back to the dashboard tab. The call now passes"noopener,noreferrer"so the destination cannot navigate or otherwise reach back into the Home Assistant tab.Deprecated-Type Warning Device Label Now Localized: The interpolated device-type name inside the deprecated-device-type warning was taken from the raw English
DEVICE_TYPESmap, so a localized warning still showed the English type name. The label is now resolved through the same selector translations the rest of the form uses, falling back to the English value only when no translation exists. The trailing blank line that separates the warning from the form was also moved out of the translation string into Python, since the Home Assistant translation validator rejects values with leading/trailing whitespace.CI: Pinned
github-scriptand Least-Privilege PR Validation: Allactions/github-scriptreferences in the PR-automation workflows (validate_pr.yml,protect_accepted_label.yml,close_incomplete_prs.yml) were pinned from the floating@v7tag to a specific commit SHA to harden the supply chain.validate_pr.yml(which runs on the elevatedpull_request_targettrigger) now defaults tocontents: readand grantsissues: write/pull-requests: writeonly to the individual jobs that comment on, label, or close a PR, instead of handing the elevated token write scopes for every step.This discussion was created from the release v0.4.5.
Beta Was this translation helpful? Give feedback.
All reactions