v0.4.4.2 #244
3dg1luk43
announced in
Announcements
v0.4.4.2
#244
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.4.2 - 2026-05-11
✨ Features
telegram_bot) alongside legacynotify.<service>services. When the picked target is a notify entity, the dispatcher routes through the universalnotify.send_messageaction withentity_idset; legacynotify.*services continue to be called directly. No reconfiguration is required — existing setups keep working unchanged, and users who could previously only reach a Telegram chat via theCONF_NOTIFY_ACTIONSscript field or theha_washdata_cycle_endedevent can now pick the entity directly.HH:MMorHH:MM:SS, one per line) inside the displayed cycle window; the form shows a preview SVG of the cycle and the exact start/end wall-clock times so you can pick a known boundary (e.g. from HA history). N timestamps produce N+1 segments; each segment must be at least 1 minute long. After confirmation, the preview SVG, per-segment profile assignment, and post-split envelope rebuild work exactly as in auto mode.🎨 UI & UX
selector.BooleanSelector()while every other boolean used the bareboolvoluptuous type, which the frontend renders as a checkbox). Fifteen fields across Advanced Settings, Notifications, Settings, and the suggestion-apply confirm step were migrated toBooleanSelectorso the visual language is consistent and the active/inactive state is obvious at a glance. No stored values change — switches and checkboxes both serialize to Pythonbool.async_show_menu. Converted: Manage Cycles, Manage Profiles, Manage Phase Catalog, Merge/Split Interactive Editor, Assign Phase Ranges, Record Cycle (Manual), and Diagnostics & Maintenance. Each button is a single click that immediately advances to the next step. Conditional menus (e.g. Record Cycle, which surfaces Start / Stop / Process / Discard depending on recorder state) continue to show only the buttons that apply right now. For steps with stateful sub-actions (e.g. Assign Phase Ranges' Clear All Ranges and Save and Return) thin wrapper steps were added so the menu can dispatch them cleanly._menu_stack) tracks the path frominitdownward; clicking ← Back pops the stack and re-shows the parent. Previously the only way to leave a submenu without performing an action was the X close button in the dialog's title bar, which exited the entire options flow back to the Devices & Services page — too aggressive for users just exploring. The form-based Notifications step retains an explicit Go back without saving checkbox (because forms can't render menu buttons and the user wanted Submit to keep its save semantics); every other navigation surface now uses the same one-click Back affordance.match_confidencefield is persisted on the cycle dict at every site that assigns a profile (runtime match commit, post-cycle auto-label, and bulkauto_label_cycles). Cycles labeled before this release would otherwise show—; on integration startup, a backgroundasync_backfill_match_confidence()task re-runs the matcher once for every labeled cycle without the field and writes the result, so the table is fully populated on the next visit. The backfill is idempotent — already-backfilled cycles are skipped — and runs as a non-blockingasync_create_taskso startup is unaffected.- Cotton 60°C: 24 • ~135mthat scaled poorly once a household had a dozen profiles. The data already existed on thelist_profiles()result —last_run,avg_energy,cycle_count,avg_duration— and is now surfaced consistently.homeassistant.data_entry_flow.section: Suggested Settings, Detection & Power Thresholds, Profile Matching & Learning, Timing, Maintenance & Debug, Anti-Wrinkle Shield (Dryers), Delayed Start Detection, External Triggers, Door & Pause, and a conditional Pump Monitor for the pump device type. Suggested Settings (containing theApply Suggested Valuescheckbox and its full description of pending suggestions) and Detection & Power Thresholds are open by default; the rest collapse so the form opens compact. Submission still saves every field in one click — sections are a visual grouping only, and the handler flattens the nested user input back to a flat dict before merging into the options entry. Field labels and descriptions are now nested undersections.<name>.{data,data_description}instrings.jsonandtranslations/en.jsonso each field's help text shows up under its proper section header.learning_feedbacks_pick), Dismiss all pending feedback (jumps to the existing confirmation step), and ← Back. The pending items are previewed in a full-width table above the buttons (detected program, confidence %, reported-at). Previously the picker, the dismiss-all toggle, and the go-back checkbox were all crammed into one form; splitting them puts each action one click away. When there are no pending feedbacks, the empty state is also a menu with just ← Back instead of a form with an empty schema.🐛 Bug Fixes
clear_notification, but the dispatch was gated on_live_notification_sent_count > 0, so after a Home Assistant restart — which resets the in-memory counter to 0 while the notification continues to live on the phone — the clear was silently skipped and the stale notification never went away. (2) The HA shutdown path (async_unload_entry→async_shutdown) didn't issue a clear at all, so restarting the integration or HA left the chronometer ticking against a frozenwhentimestamp until the next cycle-end clear would have run. Fix: the clear path now fires whenever live services or actions are configured (a no-op clear for a non-existent tag is harmless on the mobile_app side), andasync_shutdownissues a best-effort clear before persisting active-cycle state. Cycle end (completed / force-stopped / interrupted) now reliably dismisses the live notification before the finish notification is dispatched, so the finish notification is the only one visible; HA restart and integration reload also dismiss it.start_threshold_w, whose UI cap of 100 W locked out anyone whose appliance drew more than that while waiting (e.g. tumble-dryer anti-damp rotations at ~240 W rejected the configuration with "Value 240 is too large"). The detector now uses a band-based model: any power held between Stop Threshold (W) and Start Threshold (W) for a configurable confirmation window is treated as the machine waiting to start its cycle. Transitioning out ofdelay_waitintoSTARTINGadditionally requires the high-power streak to span at leaststart_duration_thresholdreal seconds across two consecutive readings, so an isolated anti-damp pulse or menu-navigation peak no longer false-triggers the cycle. The three obsolete drain knobs (delay_drain_min_power,delay_drain_max_power,delay_drain_max_duration) are removed and replaced with a single Standby Confirm Time (s) field (default 60 s); the Max Wait Time (h) safety timeout is unchanged. Migration to schema 3.4 strips the deprecated keys from existing entries. The cap on Start Threshold (W) is raised from 100 W to 500 W so high-standby appliances can be configured without hitting the validator. Disabled by default — users who never use delayed-start are unaffected.spike_seen=False) but Smart Termination was still firing ~4 minutes before the real end-of-cycle pump-out, closing the cycle just early enough for the pump-out to register as a brief but still user-visiblestarting → offsequence. The dishwasher Smart Termination wait gate had a 5-minute escape hatch (past_wait_period = duration >= expected + 300 s) that — combined with state that could not be fully reproduced in synthetic tests — was letting the cycle close before the pump-out arrived. The escape hatch is now widened to 30 minutes (DISHWASHER_END_SPIKE_WAIT_SECONDS = 1800.0); within that window the cycle stays in ENDING until the real pump-out fires and arms_end_spike_seen=Truevia the existing 85% progress gate, after which Smart Termination fires normally and folds the pump-out into the original cycle. The matching deferral in_should_defer_finishuses the same widened window so the two paths cannot drift. Verified against a synthetic replay of the May 6 user-reported timeline: cycle closes at 235.1 min with the pump-out included, no ghost cycle. Trade-off: dishwashers genuinely without an end-of-cycle pump-out now sit in ENDING up to 30 min past expected (vs 5 min before) before the safety bound releases them — bounded, but slightly later than before.📖 Documentation
N/Afollowed by a one-line reason (example:N/A - typo in README, no runtime behavior involved) — and lists the kinds of reports where this is acceptable (documentation typos, translation string fixes, pure UI/config-flow layout issues with no runtime code path). The validator already acceptedN/Aas a valid response, but the previous reminder text only said "writeN/Afollowed by a clear explanation of why" without showing the format or giving examples, which led reporters to either leave the field blank or write a bareN/Aand stay flagged. Behaviour unchanged for reports that include real logs.ha_washdata_cycle_started,ha_washdata_cycle_ended, andha_washdata_pump_stuck) with the full payload schema for each, including thecycle_datasubdict shape:id,duration,max_power,energy_wh,status,termination_reason,profile_name,sampling_interval,device_type, and thesignaturefeature vector. Also documents the Fire Events toggle that gates them globally and the fact thatpower_data/debug_data/power_traceare stripped fromcycle_databefore firing to stay under Home Assistant's 32 KB event payload limit (use the diagnostics download if you need the raw samples). No code change; purely fills the gap reported by users who could observe the event in Developer Tools → Events but had nothing in the README to point aplatform: eventautomation at.🛠 Internal / Developer Experience
.github/workflows/release_references.yml) runs on every published GitHub release and scans the release notes for issue references (#<number>or full issue URLs to this repo). For each referenced open issue created before the release was published, the bot posts a comment linking to the release page, adds thedonelabel, and inserts a hidden marker (<!-- release-reference-bot -->) into the comment body.close_done_issues.ymlwas extended to recognise that marker as an "owner-equivalent" last comment, so the existing 5-day inactivity rule auto-closes the issue without the maintainer having to comment manually. Reporter replies after the bot's comment still block the auto-close (the last-comment check fails), giving anyone whose problem is not actually fixed by the release a clean way to push back. The workflow also exposes aworkflow_dispatchinput to re-scan a specific tag, and de-duplicates against its own previous comments (matching thetag:<release.tag_name>line) so re-runs are idempotent.tests/repro/test_comprehensive_stress_suite.pyalone consumed ~11 minutes, and a further dozen real-data replay tests added another ~40 seconds. For small changes (UI tweaks, config-flow edits, translation updates) this discouraged running the suite at all. Tests are now tagged with pytest markers:slow(real-data replays fromcycle_data/, stress simulations, full HA integration flow — 8 files / 144 tests) andbenchmark(pure performance characterization — 2 tests).pytest.iniskips both categories by default, so./run_tests.sh(and rawpytest tests/) now run only the 271-test fast suite in about 30 seconds (a 23× speedup). The runner also accepts--slow,--bench, and--allto opt in. No tests were deleted — the full suite still runs via./run_tests.sh --allfor releases and CI. SeeTESTING.md→ Test Categories for the marker conventions when adding new tests.This discussion was created from the release v0.4.4.2.
Beta Was this translation helpful? Give feedback.
All reactions