v0.4.3 #174
Closed
3dg1luk43
announced in
Announcements
v0.4.3
#174
Replies: 1 comment 3 replies
-
|
Can you force English? The Swedish translation is not good, direct machine translation with no context(?) so it's using the wrong words. Some parts is hard to understand. |
Beta Was this translation helpful? Give feedback.
3 replies
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.3 - 2026-03-16
✨ Features
mdi:pot-steam,mdi:heat-pump).Spinning Icon,Show State,Show Program, andShow Details.translate.pyto automatically update the frontend card'sTRANSLATIONSobject from language files, providing out-of-the-box localization for all 27+ supported languages.cycle_live) with per-cycle throttling, overrun protection caps, mobile-only payload routing, and automatic clear on cycle completion.🛠️ Improvements
WashDataManager,ProfileStore,CycleDetector,LearningManager,CycleRecorder) now include the device name as a[Device Name]prefix. When running two or more devices simultaneously, every log line is immediately attributable to its source without cross-referencing entry IDs.SelectSelectordropdowns in the configuration flow now useSelectOptionDictwith explicit human-readable labels (e.g. "Split a Cycle (Find gaps)", "Export All Data", "Confirm - Correct Detection"). Previously, raw internal values such as"split"or"auto_label_cycles"were displayed directly in the UI.strings.jsonanden.jsonthat were no longer backed by selectors in the config flow (assign_mode, export/import mode, cycle history editor actions, and several management menu entries). Reduces translator noise and prevents spurious untranslated keys in other languages.manage_phase_catalogaction labels and descriptions to Swedish, Tamil, Telugu, and Simplified Chinese.enumdevice class ([BUG] State and Program only lists and no diagram #157).SelectSelector, enabling natively localized menu options across all supported languages.notify_fire_eventsoption to control emission of cycle start/end events.DEFAULT_MAX_DEFERRAL_SECONDSto 4 hours to prevent long silent Eco drying phases from being cut off.NO_UPDATE_ACTIVE_TIMEOUTto 4 hours.MIN_OFF_GAPto 1 hour to prevent fragmentation when no profile is matched.SuggestionEngineis now aware of the configured device type and uses device-specific safety floors foroff_delayrecommendations, preventing it from suggesting dangerously short timeouts for dishwashers.sensor.<device>_current_phase) so active phase is visible in normal entity views without enabling diagnostics.consistency_minfield (standard deviation of recorded cycle durations, in minutes), allowing users to diagnose variability in learned profiles directly from the entity state.update_matchnow validates confidence and expected-duration values withmath.isfinite(), falling back to0.0with a debug log entry instead of propagating NaN or infinity into downstream sensors.TypeError/ValueErrorguards when parsing profile data in theSuggestionEngine, preventing crashes when stored profile fields contain unexpected types.notify_live_interval_secondsacross all supported languages, guiding users away from excessively short polling intervals.notify_service,notify_people,notify_actions,power_sensor,external_end_trigger) before the report is generated.services.yamldescriptions to consistently refer to "WashData" instead of "washing machine", accurately reflecting multi-device support.needs-more-infolabel — keeping the issue queue actionable without manual triage. Supports adry_runinput for safe testing without posting comments or modifying labels.doneafter 5 days of inactivity, provided the last comment is from the maintainer. Posts a closing comment with reopen instructions before closing.🐛 Bug Fixes
en.jsonwithstrings.jsonto ensure a canonical source of truth for translations.start_energy_thresholdandend_energy_thresholdwere incorrectly defaulting to 0.0W in the detector configuration, which could lead to premature cycle ends in noisy environments. They now correctly respect device-specific constant defaults.SelectSelectorentry with aNonevalue would cause aKeyErrorduring form processing. Such entries are now silently skipped.async_rebuild_envelopeincorrectly computingmin_durationandmax_durationfrom the outlier-filtered duration set.min/maxnow reflect the true observed range of all cycles; onlyavg_durationuses the IQR-filtered set for robustness. This means deleting an outlier cycle now correctly recalculates the profile's duration range.{comparison_data}) to prevent missing-value translation errors during feedback review.device_type) so similarly named phases remain deterministic.Contexttoscript.async_run, resolving runtime errors like "Running script requires passing in a context".STATE_ENDING(not onlyRUNNING/PAUSED) until cycle completion.wash_phaseregistry entry to prevent misleading duplicate/legacy phase sensors.profile_count_*entries left behind by profile renames) without manual per-device cleanup.ENDINGstate (e.g. the final pump-out on a dishwasher) could incorrectly transition the device back torunning, delaying the reported cycle end by several minutes. Thelong_ending_tailguard (ignore any spike after 120 s inENDING) now applies to all device types, not only dishwashers._time_in_stateReset After Config Reload: Fixed a bug where reloading the integration configuration reset the in-state timer to zero. On the next power spike the guard checked0 s >= 120 sand failed, causing a falseending → runningtransition. The timer is now recomputed from the persistedstate_enter_timeon restore so the guard works correctly across reloads.TypeError: argument must be strcrash inanalyze_split_synccaused by a dead-codedt_util.parse_datetime(cycle["start_time"])call that failed whenstart_timeis adatetimeobject rather than an ISO string. The parsed value was never used; the line has been removed._rebuild_envelope_syncnow uses the shared_decompress_power_data()helper instead of raw iteration withfloat()conversion. The raw conversion silently discarded every data point for cycles stored in the legacy ISO-timestamp format, producing an empty envelope and a blank graph.create_profile_standalonenow labels the reference cycle with the new profile name (when it is currently unlabeled) and immediately rebuilds the envelope, so statistics are populated as soon as the profile is created — without requiring a separate feedback-correction step.-29555478m). Two root causes were addressed:+01:00vs+02:00). Sorting now uses the parsed UTC timestamp.last_t_abs: the end timestamp was taken from the last element of the power-data list, which could be a corrupted or out-of-order entry near Unix epoch. The merge now takes the maximum absolute timestamp across all collected data points, and falls back to the cycle's storedend_timefield when no power data is available at all.manual_durationPersisting After Merge: The merged cycle no longer inherits the source cycle'smanual_durationoverride, ensuring the freshly computed duration is always displayed.&,<, or>no longer produce malformed SVG output.no_power_previewstring, and corrected the Traditional Chineseno_power_previewvalue which was incorrectly using Simplified Chinese characters (没有/预览/数据→沒有/預覽/數據).🧪 Tests
MagicMock-based hass objects with realHomeAssistantinstances frompytest_homeassistant_custom_componentacross all new test modules. OnlyProfileStoreandCycleDetectorare patched as true external I/O boundaries.test_manager_event_payload_and_ghosts.py): CoversEVENT_CYCLE_ENDEDpayload field exclusion (power_data,debug_data,power_trace) and ghost-cycle energy threshold detection using real HA event bus listeners.test_migration_harness.py): Validatesasync_migrate_entryfield movement (data → options), idempotency on re-run, and no-op behaviour when already at the latest schema version.test_manager_precompletion_harness.py): Pins the ambiguity gate — notifications are suppressed when_last_match_ambiguous=True, sent exactly once when unambiguous, and not re-sent on subsequent calls.test_manager_matching_harness.py): Covers the full persistence-counter state machine inside_async_do_perform_matching: single-call accumulation, below-threshold staying atdetecting..., threshold commit, profile-change counter reset, high-confidence override bypassing persistence, and ambiguous-result gating.test_manager_live_notifications.py): Added focused coverage for mobile-only routing, payload keys, overrun cap enforcement, away-mode deferred live coalescing, clear-on-end behavior,STATE_ENDINGsupport, one-time pre-match waiting message, and post-match periodic update activation.test_issue_166_phase_catalog.py): Validates that phase renames and deletions behave atomically with unique-ID resolution, preventing unintended collisions or cascading updates across scopes.test_profile_sensor_attributes.py): Covers the exposure of new sensor attributes includingconsistency_minon profile sensors.test_diagnostic_entity_cleanup.py): Validates automatic removal of orphaned diagnostic entities on startup, covering stale profile count sensors, legacywash_phaseentries, and debug entity visibility toggling based onexpose_debug_entities.New Contributors
Full Changelog: v0.4.2.1...v0.4.3
This discussion was created from the release v0.4.3.
Beta Was this translation helpful? Give feedback.
All reactions