Files
Home-Assistant/custom_components/ha_washdata/translations/en.json
T
2026-06-14 02:01:49 -04:00

1342 lines
70 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"config": {
"step": {
"user": {
"title": "WashData Setup",
"description": "Configure your washing machine or other appliance.\n\nPower sensor is required.\n\n**Next, you will be asked if you want to create your first profile.**",
"data": {
"name": "Device Name",
"device_type": "Device Type",
"power_sensor": "Power Sensor",
"min_power": "Minimum Power Threshold (W)"
},
"data_description": {
"name": "A friendly name for this device (e.g., 'Washing Machine', 'Dishwasher').",
"device_type": "What type of appliance is this? Helps tailor detection and labeling.",
"power_sensor": "The sensor entity that reports real-time power consumption (in watts) from your smart plug.",
"min_power": "Power readings above this threshold (in watts) indicate the appliance is running. Start with 2W for most devices."
}
},
"first_profile": {
"title": "Create First Profile",
"description": "A **Cycle** is a complete run of your appliance (e.g., a load of laundry). A **Profile** groups these cycles by type (e.g., 'Cotton', 'Quick Wash'). Creating a profile now helps the integration estimate duration immediately.\n\nYou can manually select this profile in the device controls if it's not detected automatically.\n\n**Leave 'Profile Name' empty to skip this step.**",
"data": {
"profile_name": "Profile Name (Optional)",
"manual_duration": "Estimated Duration (minutes)"
}
}
},
"error": {
"cannot_connect": "Failed to connect",
"invalid_auth": "Invalid authentication",
"unknown": "Unexpected error"
},
"abort": {
"already_configured": "Device is already configured"
}
},
"options": {
"step": {
"init": {
"menu_options": {
"learning_feedbacks": "Review Learning Feedbacks",
"settings": "Settings",
"notifications": "Notifications",
"manage_cycles": "Manage Cycles",
"manage_profiles": "Manage Profiles",
"manage_phase_catalog": "Manage Phase Catalog",
"record_cycle": "Record Cycle (Manual)",
"diagnostics": "Diagnostics & Maintenance"
}
},
"apply_suggestions": {
"title": "Copy Suggested Values",
"description": "This will copy the current suggested values into your saved Settings. This is a one-time action and does not enable auto-overwrites.\n\nSuggested values to copy:\n{suggested}",
"data": {
"confirm": "Confirm copy action"
}
},
"apply_suggestions_confirm": {
"title": "Review Suggested Changes",
"description": "WashData found **{pending_count}** suggested value(s) to apply.\n\nChanges:\n{changes}\n\n✅ Check the box below and click **Submit** to apply and save these changes immediately.\n❌ Leave it unchecked and click **Submit** to cancel and go back.",
"data": {
"confirm_apply_suggestions": "Apply and save these changes"
}
},
"settings": {
"title": "Settings",
"description": "{deprecation_warning}Tune detection thresholds, learning, and advanced behavior. Defaults work well for most setups.\n\nSuggested Settings currently available: {suggestions_count}.\nIf this is above 0, open Advanced Settings and use Apply Suggested Values to review recommendations.",
"data": {
"apply_suggestions": "Apply Suggested Values",
"device_type": "Device Type",
"power_sensor": "Power Sensor Entity",
"min_power": "Minimum Power (W)",
"off_delay": "Cycle End Delay (s)",
"notify_actions": "Notification Actions",
"notify_people": "Delay Delivery Until These People Are Home",
"notify_only_when_home": "Delay Notifications Until Selected Person Is Home",
"notify_fire_events": "Fire Automation Events",
"notify_start_services": "Cycle Start - Notification Targets",
"notify_finish_services": "Cycle Finish - Notification Targets",
"notify_live_services": "Live Progress - Notification Targets",
"notify_before_end_minutes": "Pre-completion Notification (minutes before end)",
"notify_title": "Notification Title",
"notify_icon": "Notification Icon",
"notify_start_message": "Start Message Format",
"notify_finish_message": "Finish Message Format",
"notify_pre_complete_message": "Live Update Message Format",
"show_advanced": "Edit Advanced Settings (Next Step)"
},
"data_description": {
"apply_suggestions": "Check this box to copy values suggested by the learning algorithm into the form. Review before saving.\n\nSuggested (from learning):\n- min_power: {suggested_min_power} W\n- off_delay: {suggested_off_delay} s\n- watchdog_interval: {suggested_watchdog_interval} s\n- no_update_active_timeout: {suggested_no_update_active_timeout} s\n- profile_match_interval: {suggested_profile_match_interval} s\n- auto_label_confidence: {suggested_auto_label_confidence}\n- duration_tolerance: {suggested_duration_tolerance}\n- profile_duration_tolerance: {suggested_profile_duration_tolerance}\n- profile_match_min_duration_ratio: {suggested_profile_match_min_duration_ratio}\n- profile_match_max_duration_ratio: {suggested_profile_match_max_duration_ratio}\n- start_threshold_w: {suggested_start_threshold_w} W\n- stop_threshold_w: {suggested_stop_threshold_w} W\n- end_energy_threshold: {suggested_end_energy_threshold} Wh\n- running_dead_zone: {suggested_running_dead_zone} s\n{suggested_reason}",
"device_type": "Select the type of appliance (Washing Machine, Dryer, Dishwasher, Coffee Machine, EV, Bread Maker, Pump). This tag is stored with each cycle for better organization.",
"power_sensor": "The sensor entity reporting real-time power (in watts). You can change this anytime without losing historical data — useful if you replace a smart plug.",
"min_power": "Power readings above this threshold (in watts) indicate the appliance is running. Start with 2W for most devices.",
"off_delay": "Seconds the smoothed power must stay below the stop threshold to mark completion. Default: 120s.",
"notify_actions": "Optional Home Assistant action sequence to run for notifications (scripts, notify, TTS, etc.). If set, actions run before per-event service targets.",
"notify_people": "People entities used for presence gating. When enabled, notification delivery is delayed until at least one selected person is home.",
"notify_only_when_home": "If enabled, delay notifications until at least one selected person is home.",
"notify_fire_events": "If enabled, fire Home Assistant events for cycle start and end (ha_washdata_cycle_started and ha_washdata_cycle_ended) to drive automations.",
"notify_start_services": "One or more notify services to alert when a cycle begins. Leave empty to skip start notifications.",
"notify_finish_services": "One or more notify services to alert when a cycle finishes or nears completion. Leave empty to skip finish notifications.",
"notify_live_services": "One or more notify services to receive live progress updates while the cycle runs (mobile companion app only). Leave empty to skip live updates.",
"notify_before_end_minutes": "Minutes before the estimated end of the cycle to trigger a notification. Set to 0 to disable. Default: 0.",
"notify_title": "Custom title for notifications. Supports {device} placeholder.",
"notify_icon": "Icon to use for notifications (e.g. mdi:washing-machine). Leave empty to send no icon.",
"notify_start_message": "Message sent when a cycle starts. Supports {device} placeholder.",
"notify_finish_message": "Message sent when a cycle finishes. Supports {device}, {duration}, {program}, {energy_kwh}, {cost} placeholders.",
"notify_pre_complete_message": "Text of the recurring live progress updates while the cycle runs. Supports {device}, {minutes}, {program} placeholders."
}
},
"notifications": {
"title": "Notifications",
"description": "Configure notification targets per event type and optional live mobile progress updates. Each event type can be sent to a different set of recipients.",
"data": {
"notify_actions": "Notification Actions",
"notify_people": "Delay Delivery Until These People Are Home",
"notify_only_when_home": "Delay Notifications Until Selected Person Is Home",
"notify_fire_events": "Fire Automation Events",
"notify_start_services": "Cycle Start - Notification Targets",
"notify_finish_services": "Cycle Finish - Notification Targets",
"notify_live_services": "Live Progress - Notification Targets",
"notify_before_end_minutes": "Pre-completion Notification (minutes before end)",
"notify_live_interval_seconds": "Live Update Interval (seconds)",
"notify_live_overrun_percent": "Live Update Overrun Allowance (%)",
"notify_live_chronometer": "Chronometer Countdown Timer",
"notify_title": "Notification Title",
"notify_icon": "Notification Icon",
"notify_start_message": "Start Message Format",
"notify_finish_message": "Finish Message Format",
"notify_pre_complete_message": "Live Update Message Format",
"notify_reminder_message": "Reminder Message Format",
"notify_timeout_seconds": "Auto-dismiss After (seconds)",
"notify_channel": "Notification Channel (status/live/reminder)",
"notify_finish_channel": "Finished Notification Channel",
"energy_price_entity": "Energy Price - Entity (optional)",
"energy_price_static": "Energy Price - Static value (optional)",
"go_back": "Go back without saving"
},
"data_description": {
"go_back": "Tick this and click Submit to discard any changes above and return to the main menu.",
"notify_actions": "Optional Home Assistant action sequence to run for every notification event (scripts, notify, TTS, etc.). Actions fire before the per-event service targets.",
"notify_people": "People entities used for presence gating. When enabled, notification delivery is delayed until at least one selected person is home.",
"notify_only_when_home": "If enabled, delay notifications until at least one selected person is home.",
"notify_fire_events": "If enabled, fire Home Assistant events for cycle start and end (ha_washdata_cycle_started and ha_washdata_cycle_ended) to drive automations.",
"notify_start_services": "One or more notify services to alert when a cycle begins (e.g. notify.mobile_app_my_phone). Leave empty to skip start notifications.",
"notify_finish_services": "One or more notify services to alert when a cycle finishes or nears completion. Leave empty to skip finish notifications.",
"notify_live_services": "One or more notify services to receive live progress updates while the cycle runs (mobile companion app only). Leave empty to skip live updates.",
"notify_before_end_minutes": "Minutes before the estimated end of the cycle to trigger a notification. Set to 0 to disable. Default: 0.",
"notify_live_interval_seconds": "How often progress updates are sent while running. Lower values are more responsive but consume more notifications. A minimum of 30 seconds is enforced - values below 30 s are automatically rounded up to 30 s.",
"notify_live_overrun_percent": "Safety margin above the estimated update count for long/overrunning cycles (for example 20% allows 1.2x estimated updates).",
"notify_live_chronometer": "When enabled, each live update includes a chronometer countdown to the estimated finish time. The notification timer ticks down automatically on the device between updates (Android companion app only).",
"notify_title": "Custom title for notifications. Supports {device} placeholder.",
"notify_icon": "Icon to use for notifications (e.g. mdi:washing-machine). Leave empty to send no icon.",
"notify_start_message": "Message sent when a cycle starts. Supports {device} placeholder.",
"notify_finish_message": "Message sent when a cycle finishes. Supports {device}, {duration}, {program}, {energy_kwh}, {cost} placeholders.",
"notify_pre_complete_message": "Text of the recurring live progress updates while the cycle runs. Supports {device}, {minutes}, {program} placeholders.",
"notify_reminder_message": "Text of the one-time reminder sent the configured number of minutes before the estimated end. Distinct from the recurring live updates above. Supports {device}, {minutes}, {program} placeholders.",
"notify_timeout_seconds": "Automatically dismiss notifications after this many seconds (forwarded as the companion app 'timeout'). Set to 0 to keep them until dismissed. Default: 0.",
"notify_channel": "Android companion app notification channel for status, live progress, and reminder notifications. The sound and importance of a channel are configured in the companion app the first time the channel name is used - WashData only sets the channel name. Leave empty for the app default.",
"notify_finish_channel": "Separate Android channel for the finished alert (also used by the reminder and the laundry-waiting nag) so it can have its own sound. Leave empty to reuse the channel above.",
"energy_price_entity": "Select a numeric entity that holds the current electricity price (e.g. sensor.electricity_price, input_number.energy_rate). When set, enables the {cost} placeholder. Takes precedence over the static value if both are configured.",
"energy_price_static": "Fixed electricity price per kWh. When set, enables the {cost} placeholder. Ignored if an entity is configured above. Add your currency symbol in the message template, e.g. {cost} €."
}
},
"advanced_settings": {
"title": "Advanced Settings",
"description": "Tune detection thresholds, learning, and advanced behavior. Defaults work well for most setups.",
"sections": {
"suggestions_section": {
"name": "Suggested Settings",
"description": "{suggestions_count} learned suggestions available. Tick Apply Suggested Values to review proposed changes before saving.",
"data": {
"apply_suggestions": "Apply Suggested Values"
},
"data_description": {
"apply_suggestions": "Check this box to open a review step for suggested values from the learning algorithm. Nothing is saved automatically.\n\nSuggested (from learning):\n- min_power: {suggested_min_power} W\n- off_delay: {suggested_off_delay} s\n- watchdog_interval: {suggested_watchdog_interval} s\n- no_update_active_timeout: {suggested_no_update_active_timeout} s\n- profile_match_interval: {suggested_profile_match_interval} s\n- auto_label_confidence: {suggested_auto_label_confidence}\n- duration_tolerance: {suggested_duration_tolerance}\n- profile_duration_tolerance: {suggested_profile_duration_tolerance}\n- profile_match_min_duration_ratio: {suggested_profile_match_min_duration_ratio}\n- profile_match_max_duration_ratio: {suggested_profile_match_max_duration_ratio}\n- start_threshold_w: {suggested_start_threshold_w} W\n- stop_threshold_w: {suggested_stop_threshold_w} W\n- end_energy_threshold: {suggested_end_energy_threshold} Wh\n- running_dead_zone: {suggested_running_dead_zone} s\n{suggested_reason}"
}
},
"detection_section": {
"name": "Detection & Power Thresholds",
"description": "When the appliance is considered ON or OFF, energy gates, and timing for state transitions.",
"data": {
"start_duration_threshold": "Start Debounce Duration (s)",
"start_energy_threshold": "Start Energy Gate (Wh)",
"completion_min_seconds": "Completion Minimum Runtime (seconds)",
"start_threshold_w": "Start Threshold (W)",
"stop_threshold_w": "Stop Threshold (W)",
"end_energy_threshold": "End Energy Gate (Wh)",
"running_dead_zone": "Running Dead Zone (seconds)",
"end_repeat_count": "End Repeat Count",
"min_off_gap": "Min Gap Between Cycles (s)",
"sampling_interval": "Sampling Interval (s)"
},
"data_description": {
"start_duration_threshold": "Ignore brief power spikes shorter than this duration (seconds). Filters out boot spikes (e.g., 60W for 2s) before real cycle starts. Default: 5s.",
"start_energy_threshold": "Cycle must accumulate at least this much energy (Wh) during the START phase to be confirmed. Default: 0.2 Wh.",
"completion_min_seconds": "Cycles shorter than this will be marked as 'interrupted' even if they finish naturally. Default: 600s.",
"start_threshold_w": "Power must rise ABOVE this threshold to START a cycle. Set higher than your standby power. Default: min_power + 1 W.",
"stop_threshold_w": "Power must fall BELOW this threshold to END a cycle. Set just above zero to avoid noise triggering false ends. Default: 0.6 * min_power.",
"end_energy_threshold": "Cycle ends only if energy in the last Off-Delay window is below this value (Wh). Prevents false ends if power fluctuates near zero. Default: 0.05 Wh.",
"running_dead_zone": "After cycle starts, ignore power dips for this many seconds to prevent false end detection during initial spin-up phase. Set to 0 to disable. Default: 3s.",
"end_repeat_count": "Number of times the end condition (power below threshold for off_delay) must be met consecutively before ending the cycle. Higher values prevent false ends during pauses. Default: 1.",
"min_off_gap": "If a cycle starts within this many seconds of the previous one ending, they will be MERGED into a single cycle.",
"sampling_interval": "Minimum sampling interval in seconds. Updates faster than this rate will be ignored. Default: 30s (2s for washing machines, washer-dryers, and dishwashers)."
}
},
"matching_section": {
"name": "Profile Matching & Learning",
"description": "How aggressively WashData matches running cycles against learned profiles and when to ask for feedback.",
"data": {
"profile_match_min_duration_ratio": "Profile Match Min Duration Ratio (0.1-1.0)",
"profile_match_interval": "Profile Match Interval (seconds)",
"profile_match_threshold": "Profile Match Threshold",
"profile_unmatch_threshold": "Profile Unmatch Threshold",
"auto_label_confidence": "Auto-Label Confidence (0-1)",
"learning_confidence": "Feedback Request Confidence (0-1)",
"suppress_feedback_notifications": "Suppress Feedback Notifications",
"duration_tolerance": "Duration Tolerance (0-0.5)",
"smoothing_window": "Smoothing Window (samples)",
"profile_duration_tolerance": "Profile Match Duration Tolerance (0-0.5)"
},
"data_description": {
"profile_match_min_duration_ratio": "Minimum duration ratio for profile matching. Running cycle must be at least this fraction of profile duration to match. Lower = earlier matching. Default: 0.10 (10%).",
"profile_match_interval": "How often (in seconds) to attempt profile matching during a cycle. Lower values provide faster detection but use more CPU. Default: 300s (5 minutes).",
"profile_match_threshold": "Minimum DTW similarity score (0.01.0) required to consider a profile as a match. Higher = stricter matching, fewer false positives. Default: 0.4.",
"profile_unmatch_threshold": "DTW similarity score (0.01.0) below which a previously matched profile is rejected. Should be lower than match threshold to prevent flickering. Default: 0.35.",
"auto_label_confidence": "Automatically label cycles at or above this confidence on completion (0.01.0).",
"learning_confidence": "Minimum confidence to request user verification via an event (0.01.0).",
"suppress_feedback_notifications": "When enabled, WashData will still track and request feedback internally but will not show persistent notifications asking you to confirm cycles. Useful when cycles are always detected correctly and you find the prompts distracting.",
"duration_tolerance": "Tolerance for time-remaining estimates during a run (0.00.5 corresponds to 050%).",
"smoothing_window": "Number of recent power readings used for moving-average smoothing.",
"profile_duration_tolerance": "Tolerance used by profile matching for total duration variance (0.00.5). Default behavior: ±25%."
}
},
"timing_section": {
"name": "Timing, Maintenance & Debug",
"description": "Watchdog, progress reset, auto-maintenance, and debug entity exposure.",
"data": {
"watchdog_interval": "Watchdog Interval (seconds)",
"no_update_active_timeout": "No-Update Timeout (s)",
"progress_reset_delay": "Progress Reset Delay (seconds)",
"auto_maintenance": "Enable Auto-Maintenance",
"expose_debug_entities": "Expose Debug Entities",
"save_debug_traces": "Save Debug Traces"
},
"data_description": {
"watchdog_interval": "Seconds between watchdog checks while running. Default: 30s. WARNING: Ensure this is HIGHER than your sensor's update interval to avoid false stops.",
"no_update_active_timeout": "For publish-on-change sensors: only force-end an ACTIVE cycle if no updates arrive for this many seconds. Low-power completion still uses the Off Delay.",
"progress_reset_delay": "After a cycle completes (100%), wait this many seconds of idle before resetting progress to 0%. Default: 1800s.",
"auto_maintenance": "Enable auto-maintenance (repair samples and perform routine cleanup).",
"expose_debug_entities": "Show advanced sensors (Confidence, Phase, Ambiguity) for debugging.",
"save_debug_traces": "Store detailed ranking and power trace data in history (Increases storage usage)."
}
},
"anti_wrinkle_section": {
"name": "Anti-Wrinkle Shield (Dryers)",
"description": "Ignore post-cycle drum rotations to prevent ghost cycles. Dryer / washer-dryer only.",
"data": {
"anti_wrinkle_enabled": "Anti-Wrinkle Shield (Dryer/Washer-Dryer Only)",
"anti_wrinkle_max_power": "Anti-Wrinkle Max Power (W)",
"anti_wrinkle_max_duration": "Anti-Wrinkle Max Duration (s)",
"anti_wrinkle_exit_power": "Anti-Wrinkle Exit Power (W)"
},
"data_description": {
"anti_wrinkle_enabled": "Ignore short low-power drum rotations after a cycle ends to prevent ghost cycles (dryer/washer-dryer only).",
"anti_wrinkle_max_power": "Bursts at or below this power are treated as anti-wrinkle rotations instead of new cycles. Only applies when Anti-Wrinkle Shield is enabled.",
"anti_wrinkle_max_duration": "Maximum burst length to treat as anti-wrinkle rotation. Only applies when Anti-Wrinkle Shield is enabled.",
"anti_wrinkle_exit_power": "If power drops below this level, exit anti-wrinkle immediately (true off). Only applies when Anti-Wrinkle Shield is enabled."
}
},
"delay_start_section": {
"name": "Delayed Start Detection",
"description": "Treat sustained low-power standby as 'Waiting to Start' until the cycle actually begins.",
"data": {
"delay_start_detect_enabled": "Enable Delayed Start Detection",
"delay_confirm_seconds": "Delayed Start: Standby Confirm Time (s)",
"delay_timeout_hours": "Delayed Start: Max Wait Time (h)"
},
"data_description": {
"delay_start_detect_enabled": "When enabled, sustained low power between Stop Threshold and Start Threshold (W) is treated as a delayed start. The state sensor shows 'Waiting to Start' until power crosses Start Threshold (W) for long enough to count as a real cycle. Tune Start Threshold (W) above any background tumble/anti-damp power your appliance draws while waiting.",
"delay_confirm_seconds": "Power must stay between Stop Threshold (W) and Start Threshold (W) for this many seconds before WashData enters 'Waiting to Start'. Filters out brief menu-navigation peaks. Default: 60 s.",
"delay_timeout_hours": "Safety timeout: if the machine is still in 'Waiting to Start' after this many hours, WashData resets to Off. Default: 8 h."
}
},
"external_triggers_section": {
"name": "External Triggers, Door & Pause",
"description": "Optional external end-trigger sensor, door sensor for pause/clean detection, and pause-power-cut switch.",
"data": {
"external_end_trigger_enabled": "Enable External Cycle End Trigger",
"external_end_trigger": "External Cycle End Sensor",
"external_end_trigger_inverted": "Invert Trigger Logic (Trigger on OFF)",
"door_sensor_entity": "Door Sensor",
"pause_cuts_power": "Cut Power When Pausing",
"switch_entity": "Switch Entity (for Pause Power Cut)",
"notify_unload_delay_minutes": "Laundry Waiting Notification Delay (min)"
},
"data_description": {
"external_end_trigger_enabled": "Enable monitoring of an external binary sensor to trigger cycle completion.",
"external_end_trigger": "Select a binary sensor entity. When this sensor triggers, the current cycle will end with status 'completed'.",
"external_end_trigger_inverted": "By default, the trigger fires when the sensor turns ON. Check this box to fire when the sensor turns OFF instead.",
"door_sensor_entity": "Optional binary sensor for the machine door (on = open, off = closed). When the door opens during an active cycle, WashData will confirm the cycle as intentionally paused. After the cycle ends, if the door is still closed, the state changes to 'Clean' until the door is opened. Note: closing the door does NOT auto-resume a paused cycle - resume must be triggered manually via the Resume Cycle button or service.",
"pause_cuts_power": "When pausing via the Pause Cycle button or service, also turn off the configured switch entity. Only takes effect if a switch entity is configured for this device.",
"switch_entity": "The switch entity to toggle when pausing or resuming. Required when 'Cut Power When Pausing' is enabled.",
"notify_unload_delay_minutes": "Send a notification via the finish notification channel after the cycle ends and the door has not been opened for this many minutes (requires Door Sensor). Set to 0 to disable. Default: 60 min."
}
},
"device_link_section": {
"name": "Device Link",
"description": "Optionally link this WashData device to an existing Home Assistant device (for example the smart plug or the appliance itself). The WashData device is then shown as \"Connected via\" that device. Leave empty to keep WashData as a standalone device.",
"data": {
"linked_device": "Linked Device"
},
"data_description": {
"linked_device": "Select the device to connect WashData to. This adds a 'Connected via' reference in the device registry; WashData keeps its own device card and entities. Clear the selection to remove the link."
}
},
"pump_section": {
"name": "Pump Monitor",
"description": "Pump device type only. Fires an event if a pump cycle runs past this duration.",
"data": {
"pump_stuck_duration": "Pump Stuck Alert Threshold (s) (Pump Only)"
},
"data_description": {
"pump_stuck_duration": "If a pump cycle is still running after this many seconds, a ha_washdata_pump_stuck event is fired once. Use this to detect a jammed motor (typical sump pump run is under 60 s). Default: 1800 s (30 min). Pump device type only."
}
}
}
},
"diagnostics": {
"title": "Diagnostics & Maintenance",
"description": "Run maintenance actions like merging fragmented cycles or migrating stored data.\n\n**Storage Usage**\n\n- File Size: {file_size_kb} KB\n- Cycles: {cycle_count}\n- Profiles: {profile_count}\n- Debug Traces: {debug_count}",
"menu_options": {
"reprocess_history": "Maintenance: Reprocess & Optimize Data",
"clear_debug_data": "Clear Debug Data (Free up space)",
"wipe_history": "Wipe ALL data for this device (irreversible)",
"export_import": "Export/Import JSON with settings (copy/paste)",
"menu_back": "← Back"
}
},
"clear_debug_data": {
"title": "Clear Debug Data",
"description": "Are you sure you want to delete all stored debug traces? This will free up space but remove detailed ranking info from past cycles."
},
"manage_cycles": {
"title": "Manage Cycles",
"description": "### Recent cycles\n\n{recent_cycles}",
"menu_options": {
"auto_label_cycles": "Auto-Label Old Cycles",
"select_cycle_to_label": "Label Specific Cycle",
"select_cycle_to_delete": "Delete Cycle",
"interactive_editor": "Merge/Split Interactive Editor",
"trim_cycle_select": "Trim Cycle Data",
"menu_back": "← Back"
}
},
"manage_cycles_empty": {
"title": "Manage Cycles",
"description": "No cycles recorded yet.",
"menu_options": {
"auto_label_cycles": "Auto-Label Old Cycles",
"menu_back": "← Back"
}
},
"manage_profiles": {
"title": "Manage Profiles",
"description": "Profile Summary:\n{profile_summary}",
"menu_options": {
"create_profile": "Create New Profile",
"edit_profile": "Edit/Rename Profile",
"delete_profile_select": "Delete Profile",
"profile_stats": "Profile Statistics",
"cleanup_profile": "Clean Up History - Graph & Delete",
"assign_profile_phases_select": "Assign Phase Ranges",
"menu_back": "← Back"
}
},
"manage_profiles_empty": {
"title": "Manage Profiles",
"description": "No profiles created yet.",
"menu_options": {
"create_profile": "Create New Profile",
"menu_back": "← Back"
}
},
"manage_phase_catalog": {
"title": "Manage Phase Catalog",
"description": "Phase catalog (defaults for this device + custom phases):\n{phase_summary}",
"menu_options": {
"phase_catalog_create": "Create New Phase",
"phase_catalog_edit_select": "Edit Phase",
"phase_catalog_delete": "Delete Phase",
"menu_back": "← Back"
}
},
"phase_catalog_create": {
"title": "Create Custom Phase",
"description": "Create a custom phase name and description, and choose which device type it applies to.",
"data": {
"target_device_type": "Target Device Type",
"phase_name": "Phase Name",
"phase_description": "Phase Description"
}
},
"phase_catalog_edit_select": {
"title": "Edit Custom Phase",
"description": "Select a custom phase to edit.",
"data": {
"phase_name": "Custom Phase"
}
},
"phase_catalog_edit": {
"title": "Edit Custom Phase",
"description": "Editing phase: {phase_name}",
"data": {
"phase_name": "Phase Name",
"phase_description": "Phase Description"
}
},
"phase_catalog_delete": {
"title": "Delete Custom Phase",
"description": "Select a custom phase to delete. Any assigned ranges using this phase will be removed.",
"data": {
"phase_name": "Custom Phase"
}
},
"assign_profile_phases": {
"title": "Assign Phase Ranges",
"description": "Phase preview for profile: **{profile_name}**\n\n{timeline_svg}\n\n**Current ranges:**\n{current_ranges}\n\nUse actions below to add, edit, delete, or save ranges.",
"menu_options": {
"assign_profile_phases_add": "Add Phase Range",
"assign_profile_phases_edit_select": "Edit Phase Range",
"assign_profile_phases_delete": "Delete Phase Range",
"phase_ranges_clear": "Clear All Ranges",
"assign_profile_phases_auto_detect": "Auto-detect Phases",
"phase_ranges_save": "Save and Return",
"menu_back": "← Back"
}
},
"assign_profile_phases_add": {
"title": "Add Phase Range",
"description": "Add one phase range to the current draft.",
"data": {
"phase_name": "Phase",
"start_min": "Start Minute",
"end_min": "End Minute"
}
},
"assign_profile_phases_edit_select": {
"title": "Edit Phase Range",
"description": "Select a range to edit.",
"data": {
"range_index": "Phase Range"
}
},
"assign_profile_phases_edit": {
"title": "Edit Phase Range",
"description": "Update the selected phase range.",
"data": {
"phase_name": "Phase",
"start_min": "Start Minute",
"end_min": "End Minute"
}
},
"assign_profile_phases_delete": {
"title": "Delete Phase Range",
"description": "Select a range to remove from the draft.",
"data": {
"range_index": "Phase Range"
}
},
"assign_profile_phases_auto_detect": {
"title": "Auto-detected Phases",
"description": "Profile: **{profile_name}**\n\n{timeline_svg}\n\n**{detected_count} phase(s) detected automatically.** Choose an action below.",
"data": {
"action": "Action"
}
},
"assign_profile_phases_auto_detect_name": {
"title": "Name Detected Phases",
"description": "Profile: **{profile_name}**\n\n**{detected_count} phase(s) detected:**\n{ranges_summary}\n\nAssign a name to each phase."
},
"assign_profile_phases_select": {
"title": "Assign Phase Ranges",
"description": "Select a profile to configure phase ranges.",
"data": {
"profile": "Profile"
}
},
"profile_stats": {
"title": "Profile Statistics",
"description": "{stats_table}"
},
"create_profile": {
"title": "Create New Profile",
"description": "Create a new profile manually or from a past cycle.\n\nProfile name examples: 'Cotton 40°C', 'Eco', 'Quick Wash', 'Cotton + Cupboard Dry'.\n\n**What the matcher uses:** power-consumption shape, total cycle duration, and total energy. It does not read temperature or spin settings directly.\n\n**Profiles that will be reliably auto-detected:** programs with clearly different durations or power patterns - e.g. a 20-minute Quick Wash vs a 3-hour Cotton cycle, or a wash-only cycle vs a wash+dry combo (which typically runs 2-3× longer).\n\n**Profiles that may need manual selection:** variants of the same program that differ only in temperature or spin speed (e.g. Cotton 40°C vs Cotton 60°C) often produce similar power shapes. The system will still attempt to distinguish them and learn from your corrections over time, but expect to confirm matches manually at first.\n\n**Washer-dryer tip:** create separate profiles for wash-only and wash+dry runs - the duration and energy difference is large enough for reliable auto-detection.",
"data": {
"profile_name": "Profile Name",
"reference_cycle": "Reference Cycle (optional)",
"manual_duration": "Manual Duration (minutes)"
}
},
"edit_profile": {
"title": "Edit Profile",
"description": "Select a profile to rename",
"data": {
"profile": "Profile"
}
},
"rename_profile": {
"title": "Edit Profile Details",
"description": "Current profile: {current_name}",
"data": {
"new_name": "Profile Name",
"manual_duration": "Manual Duration (minutes)"
}
},
"delete_profile_select": {
"title": "Delete Profile",
"description": "Select a profile to delete",
"data": {
"profile": "Profile"
}
},
"delete_profile_confirm": {
"title": "Confirm Delete Profile",
"description": "⚠️ This will permanently delete profile: {profile_name}",
"data": {
"unlabel_cycles": "Remove label from cycles using this profile"
}
},
"auto_label_cycles": {
"title": "Auto-Label Old Cycles",
"description": "Found {total_count} total cycles. Profiles: {profiles}",
"data": {
"confidence_threshold": "Minimum Confidence (0.50-0.95)"
}
},
"select_cycle_to_label": {
"title": "Select Cycle to Label",
"description": "✓ = completed, ⚠ = resumed, ✗ = interrupted",
"data": {
"cycle_id": "Cycle"
}
},
"select_cycle_to_delete": {
"title": "Delete Cycle",
"description": "⚠️ This will permanently delete the selected cycle",
"data": {
"cycle_id": "Cycle to Delete"
}
},
"label_cycle": {
"title": "Label Cycle",
"description": "{cycle_info}",
"data": {
"profile_name": "Profile",
"new_profile_name": "New Profile Name (if creating)"
}
},
"post_process": {
"title": "Process History (Merge/Split)",
"description": "Clean up cycle history by merging fragmented runs and splitting incorrectly merged cycles within a time window. Enter number of hours to look back (use 999999 for all).",
"data": {
"time_range": "Lookback Window (hours)",
"gap_seconds": "Merge/Split Gap (seconds)"
},
"data_description": {
"time_range": "Number of hours to scan for fragmented cycles to merge. Use 999999 to process all historical data.",
"gap_seconds": "Threshold to decide split vs merge. Gaps SHORTER than this are merged. Gaps LONGER than this are split. Lower this to force a split on a cycle that was merged incorrectly."
}
},
"cleanup_profile": {
"title": "Clean Up History - Select Profile",
"description": "Select a profile to visualize. This will generate a graph showing all past cycles for this profile to help identify outliers.",
"data": {
"profile": "Profile"
}
},
"cleanup_select": {
"title": "Clean Up History - Graph & Delete",
"description": "![Graph]({graph_url})\n\n**Visualizing {profile_name}**\n\nThe graph shows individual cycles as colored lines. Identify outliers (lines far from the group) and matching their color in the list below to delete them.\n\n**Select cycles to PERMANENTLY delete:**",
"data": {
"cycles_to_delete": "Cycles to Delete (check matching colors)"
}
},
"interactive_editor": {
"title": "Merge/Split Interactive Editor",
"description": "Select a manual action to perform on your cycle history.",
"menu_options": {
"editor_split": "Split a Cycle (Find gaps)",
"editor_merge": "Merge Cycles (Join fragments)",
"editor_delete": "Delete Cycle(s)",
"menu_back": "← Back"
}
},
"editor_select": {
"title": "Select Cycles",
"description": "Select the cycle(s) to process.\n\n{info_text}",
"data": {
"selected_cycles": "Cycles"
}
},
"editor_configure": {
"title": "Configure & Apply",
"description": "{preview_md}",
"data": {
"confirm_action": "Action",
"merged_profile": "Resulting Profile",
"new_profile_name": "New Profile Name",
"confirm_commit": "Yes, I confirm this action",
"segment_0_profile": "Segment 1 Profile",
"segment_1_profile": "Segment 2 Profile",
"segment_2_profile": "Segment 3 Profile",
"segment_3_profile": "Segment 4 Profile",
"segment_4_profile": "Segment 5 Profile",
"segment_5_profile": "Segment 6 Profile",
"segment_6_profile": "Segment 7 Profile",
"segment_7_profile": "Segment 8 Profile",
"segment_8_profile": "Segment 9 Profile",
"segment_9_profile": "Segment 10 Profile"
}
},
"editor_split_params": {
"title": "Split Method",
"description": "Choose how to split this cycle. **Auto-detect** finds idle gaps in the power data; **Manual timestamp** lets you set explicit split points (useful when one cycle ran straight into the next with no idle gap between them).",
"data": {
"split_mode": "Split Method"
}
},
"editor_split_auto_params": {
"title": "Auto-Split Configuration",
"description": "Adjust the sensitivity for splitting this cycle. Any idle gap longer than this will cause a split.",
"data": {
"min_gap_seconds": "Split Gap Threshold (seconds)"
}
},
"editor_split_manual_params": {
"title": "Manual Split Timestamps",
"description": "{preview_md}Cycle window: **{cycle_start_wallclock} → {cycle_end_wallclock}** on {cycle_date}.\n\nEnter one or more split timestamps (`HH:MM` or `HH:MM:SS`), one per line. The cycle will be cut at each timestamp — N timestamps produce N+1 segments.",
"data": {
"split_timestamps": "Split Timestamps"
}
},
"reprocess_history": {
"title": "Maintenance: Reprocess & Optimize Data",
"description": "Performs deep cleaning of historical data:\n1. Trims zero-power readings (silence).\n2. Fixes cycle timing/duration.\n3. Recalculates all statistical models (envelopes).\n\n**Run this to fix data issues or apply new algorithms.**"
},
"wipe_history": {
"title": "Wipe History (Testing Only)",
"description": "⚠️ This will permanently delete ALL stored cycles and profiles for this device. This cannot be undone!"
},
"export_import": {
"title": "Export/Import JSON",
"description": "Copy/paste cycles, profiles, AND settings for this device. Export below or paste JSON to import.",
"data": {
"mode": "Action",
"json_payload": "Complete Configuration JSON"
},
"data_description": {
"mode": "Choose Export to copy current data and settings, or Import to paste exported data from another WashData device.",
"json_payload": "For Export: copy this JSON (includes cycles, profiles, and all fine-tuned settings). For Import: paste JSON exported from WashData."
}
},
"record_cycle": {
"title": "Record Cycle",
"description": "Manually record a cycle to create a clean profile without interference.\n\nStatus: **{status}**\nDuration: {duration}s\nSamples: {samples}",
"menu_options": {
"record_refresh": "Refresh Status",
"record_stop": "Stop Recording (Save & Process)",
"record_start": "Start New Recording",
"record_process": "Process Last Recording (Trim & Save)",
"record_discard": "Discard Last Recording",
"menu_back": "← Back"
}
},
"record_process": {
"title": "Process Recording",
"description": "![Graph]({graph_url})\n\n**Graph shows raw recording.** Blue = Keep, Red = Proposed Trim.\n*Graph is static and does not update with form changes.*\n\nRecording stopped. Trims are aligned to the detected sampling rate (~{sampling_rate}s).\n\nRaw Duration: {duration}s\nSamples: {samples}",
"data": {
"head_trim": "Trim Start (seconds)",
"tail_trim": "Trim End (seconds)",
"save_mode": "Save Destination",
"profile_name": "Profile Name"
}
},
"learning_feedbacks": {
"title": "Learning Feedbacks",
"description": "{count} pending review request(s).\n\n{pending_table}",
"menu_options": {
"learning_feedbacks_pick": "Review a pending feedback",
"learning_feedbacks_dismiss_all": "Dismiss all pending feedback",
"menu_back": "← Back"
}
},
"learning_feedbacks_pick": {
"title": "Pick Feedback to Review",
"description": "Select a cycle review request to open.",
"data": {
"selected_feedback": "Select Cycle to Review"
}
},
"learning_feedbacks_empty": {
"title": "Learning Feedbacks",
"description": "No pending feedback requests found.",
"menu_options": {
"menu_back": "← Back"
}
},
"learning_feedbacks_dismiss_all": {
"title": "Dismiss All Pending Feedbacks",
"description": "You are about to dismiss **{count}** pending feedback request(s). Dismissed cycles remain in your history but will not contribute new learning signal. This cannot be undone.\n\n✅ Check the box below and click **Submit** to dismiss all.\n❌ Leave it unchecked and click **Submit** to cancel and go back.",
"data": {
"confirm_dismiss_all": "Confirm: dismiss all pending feedback requests"
}
},
"resolve_feedback": {
"title": "Resolve Feedback",
"description": "{comparison_img}{candidates_table}\n**Detected Profile**: {detected_profile} ({confidence_pct}%)\n**Estimated Duration**: {est_duration_min} min\n**Actual Duration**: {act_duration_min} min\n\n__Choose an action below:__",
"data": {
"action": "What would you like to do?",
"corrected_profile": "Correct Program (if correcting)",
"corrected_duration": "Correct Duration in minutes (if correcting)"
}
},
"trim_cycle_select": {
"title": "Trim Cycle - Select Cycle",
"description": "Select a cycle to trim. ✓ = completed, ⚠ = resumed, ✗ = interrupted",
"data": {
"cycle_id": "Cycle"
}
},
"trim_cycle": {
"title": "Trim Cycle",
"description": "Current window: {trim_summary}\n\n{trim_svg}",
"data": {
"action": "Action"
}
},
"trim_cycle_start": {
"title": "Set Trim Start",
"description": "Cycle window: {cycle_start_wallclock} → {cycle_end_wallclock}\n\nCurrent start: **{current_wallclock}** (+{current_offset_min} min from cycle start)\n\nPick a new start time using the clock picker below.",
"data": {
"trim_start_time": "New start time",
"trim_start_min": "New start (minutes from cycle start)"
}
},
"trim_cycle_end": {
"title": "Set Trim End",
"description": "Cycle window: {cycle_start_wallclock} → {cycle_end_wallclock}\n\nCurrent end: **{current_wallclock}** (+{current_offset_min} min from cycle start)\n\nPick a new end time using the clock picker below.",
"data": {
"trim_end_time": "New end time",
"trim_end_min": "New end (minutes from cycle start)"
}
}
},
"error": {
"import_failed": "Import failed. Please paste a valid WashData export JSON.",
"select_exactly_one": "Select exactly one cycle for this action.",
"select_at_least_one": "Select at least one cycle for this action.",
"select_at_least_two": "Select at least two cycles for this action.",
"profile_exists": "A profile with this name already exists",
"rename_failed": "Failed to rename profile. Profile may not exist or new name is already taken.",
"assignment_failed": "Failed to assign profile to cycle",
"duplicate_phase": "A phase with this name already exists.",
"phase_not_found": "Selected phase was not found.",
"invalid_phase_name": "Phase name cannot be empty.",
"phase_name_too_long": "Phase name is too long.",
"invalid_phase_range": "Phase range is invalid. End must be greater than start.",
"invalid_phase_timestamp": "Timestamp is invalid. Use YYYY-MM-DD HH:MM or HH:MM format.",
"overlapping_phase_ranges": "Phase ranges overlap. Adjust the ranges and try again.",
"incomplete_phase_row": "Each phase row must include a phase plus complete start/end values for the selected mode.",
"timestamp_mode_cycle_required": "Please select a source cycle when using timestamp mode.",
"no_phase_ranges": "No phase ranges are available for that action yet.",
"feedback_notification_title": "WashData: Verify Cycle ({device})",
"feedback_notification_message": "**Device**: {device}\n**Program**: {program} ({confidence}% confidence)\n**Time**: {time}\n\nWashData needs your help to verify this detected cycle.\n\nPlease go to **Settings > Devices & Services > WashData > Configure > Learning Feedbacks** to confirm or correct this result.",
"suggestions_ready_notification_title": "WashData: Suggested Settings Ready ({device})",
"suggestions_ready_notification_message": "The **Suggested Settings** sensor now reports **{count}** actionable recommendations.\n\nTo review and apply them: **Settings > Devices & Services > WashData > Configure > Advanced Settings > Apply Suggested Values**.\n\nSuggestions are optional and shown for review before you save.",
"trim_range_invalid": "Start must be before end. Please adjust your trim points.",
"trim_failed": "Trim failed. The cycle may no longer exist or the window is empty.",
"invalid_split_timestamp": "Timestamp is invalid or outside the cycle window. Use HH:MM or HH:MM:SS within the cycle's window.",
"no_split_segments_found": "No valid segments could be produced from these timestamps. Make sure each timestamp is inside the cycle window and segments are at least 1 minute long.",
"auto_tune_suggestion": "{device_type} {device_title} detected ghost cycles. Suggested min_power change: {current_min}W -> {new_min}W (not applied automatically).",
"auto_tune_title": "WashData Auto-Tune",
"auto_tune_fallback": "{device_type} {device_title} detected ghost cycles. Suggested min_power change: {current_min}W -> {new_min}W (not applied automatically)."
},
"abort": {
"no_cycles_found": "No cycles found",
"no_split_segments_found": "No splittable segments were found in the selected cycle.",
"cycle_not_found": "The selected cycle could not be loaded.",
"no_power_data": "No power trace data available for the selected cycle.",
"no_profiles_found": "No profiles found. Create a profile first.",
"no_profiles_for_matching": "No profiles available for matching. Create profiles first.",
"no_unlabeled_cycles": "All cycles are already labeled",
"no_suggestions": "No suggested values available yet. Run a few cycles and try again.",
"no_predictions": "No predictions",
"no_custom_phases": "No custom phases found.",
"reprocess_success": "Successfully reprocessed {count} cycles.",
"debug_data_cleared": "Successfully cleared debug data from {count} cycles."
}
},
"selector": {
"notify_events_option": {
"options": {
"cycle_start": "Cycle Start",
"cycle_finish": "Cycle Finish",
"cycle_live": "Live Progress"
}
},
"device_type": {
"options": {
"washing_machine": "Washing Machine",
"dryer": "Dryer",
"washer_dryer": "Washer-Dryer Combo",
"dishwasher": "Dishwasher",
"coffee_machine": "Coffee Machine (deprecated)",
"ev": "Electric Vehicle (deprecated)",
"air_fryer": "Air Fryer",
"heat_pump": "Heat Pump (deprecated)",
"bread_maker": "Bread Maker",
"pump": "Pump / Sump Pump",
"oven": "Oven (deprecated)",
"other": "Other (Advanced)"
}
},
"common_text": {
"options": {
"unlabeled": "(Unlabeled)",
"create_new_profile": "Create New Profile",
"remove_label": "Remove Label",
"no_reference_cycle": "(No reference cycle)",
"all_device_types": "All Device Types",
"current_suffix": "(current)",
"phase_builtin_suffix": "(Built-in)",
"phase_none_available": "No phases available.",
"phase_other_device_types": "Other device types:",
"settings_deprecation_warning": "⚠️ **Deprecated device type:** {device_type} is scheduled for removal in a future release. WashData's matching pipeline does not produce reliable results for this appliance class. Your integration keeps working through the deprecation period; to silence this warning, switch **Device Type** below to one of the supported types (Washing Machine, Dryer, Washer-Dryer Combo, Dishwasher, Air Fryer, Bread Maker, or Pump), or to **Other (Advanced)** if your appliance does not match any of the supported types. **Other (Advanced)** ships intentionally generic defaults that are not tuned for any specific appliance, so you will need to configure thresholds, timeouts, and matching parameters yourself; all your existing settings are preserved when you switch.",
"editor_select_info": "Select 1 cycle to split, or 2+ cycles to merge.",
"editor_select_info_split": "Select 1 cycle to split.",
"editor_select_info_merge": "Select 2+ cycles to merge.",
"editor_select_info_delete": "Select 1+ cycle(s) to delete.",
"no_cycles_recorded": "No cycles recorded yet.",
"profile_summary_line": "- **{name}**: {count} cycles, {avg}m avg",
"no_profiles_created": "No profiles created yet.",
"phase_preview": "Phase Preview",
"phase_preview_no_curve": "Average profile curve is not available yet. Run/label more cycles for this profile.",
"average_power_curve": "Average Power Curve",
"unit_min": "min",
"profile_option_fmt": "{name} ({count} cycles, ~{duration}m avg)",
"profile_option_short_fmt": "{name} ({count} cycles, ~{duration}m)",
"deleted_cycles_from_profile": "Deleted {count} cycles from {profile}.",
"not_enough_data_graph": "Not enough data to generate graph.",
"no_profiles_found": "No profiles found.",
"cycle_info_fmt": "Cycle: {start}, {duration}m, Current: {label}",
"top_candidates_header": "### Top Candidates",
"tbl_profile": "Profile",
"tbl_confidence": "Confidence",
"tbl_correlation": "Correlation",
"tbl_duration_match": "Duration Match",
"detected_profile": "Detected Profile",
"estimated_duration": "Estimated Duration",
"actual_duration": "Actual Duration",
"choose_action": "__Choose an action below:__",
"tbl_count": "Count",
"tbl_avg": "Avg",
"tbl_min": "Min",
"tbl_max": "Max",
"tbl_energy_avg": "Energy (Avg)",
"tbl_energy_total": "Energy (Total)",
"tbl_consistency": "Consist.",
"tbl_last_run": "Last Run",
"graph_legend_title": "Graph Legend",
"graph_legend_body": "The blue band represents the minimum and maximum power draw range observed. The line shows the average power curve.",
"recording_preview": "Recording Preview",
"trim_start": "Trim Start",
"trim_end": "Trim End",
"split_preview_title": "Split Preview",
"split_preview_found_fmt": "Found {count} segments.",
"split_preview_confirm_fmt": "Click Confirm to split this cycle into {count} separate cycles.",
"merge_preview_title": "Merge Preview",
"merge_preview_joining_fmt": "Joining {count} cycles. Gaps will be filled with 0W readings.",
"editor_delete_preview_title": "Delete Preview",
"editor_delete_preview_intro": "The selected cycles will be permanently deleted:",
"editor_delete_preview_confirm": "Click Confirm to permanently delete these cycle records.",
"no_power_preview": "*No power data available for preview.*",
"profile_comparison": "Profile Comparison",
"actual_cycle_label": "This cycle (actual)",
"storage_usage_header": "Storage Usage",
"storage_file_size": "File Size",
"storage_cycles": "Cycles",
"storage_profiles": "Profiles",
"storage_debug_traces": "Debug Traces",
"overview_suffix": "Overview",
"phase_preview_for_profile": "Phase preview for profile",
"current_ranges_header": "Current ranges",
"assign_phases_help": "Use actions below to add, edit, delete, or save ranges.",
"profile_summary_header": "Profile Summary",
"recent_cycles_header": "Recent cycles",
"trim_cycle_preview_title": "Cycle Trim Preview",
"trim_cycle_preview_no_data": "No power data available for this cycle.",
"trim_cycle_preview_kept_suffix": "kept",
"table_program": "Program",
"table_when": "When",
"table_length": "Length",
"table_match": "Match",
"table_profile": "Profile",
"table_cycles": "Cycles",
"table_avg_length": "Avg Length",
"table_last_run": "Last Run",
"table_avg_energy": "Avg Energy",
"table_detected_program": "Detected Program",
"table_confidence": "Confidence",
"table_reported": "Reported"
}
},
"interactive_editor_action": {
"options": {
"split": "Split a Cycle (Find gaps)",
"merge": "Merge Cycles (Join fragments)",
"delete": "Delete Cycle(s)"
}
},
"split_mode": {
"options": {
"auto": "Auto-detect idle gaps",
"manual": "Manual timestamp(s)"
}
},
"diagnostics_action": {
"options": {
"reprocess_history": "Maintenance: Reprocess & Optimize Data",
"clear_debug_data": "Clear Debug Data (Free up space)",
"wipe_history": "Wipe ALL data for this device (irreversible)",
"export_import": "Export/Import JSON with settings (copy/paste)"
}
},
"export_import_mode": {
"options": {
"export": "Export All Data",
"import": "Import/Merge Data"
}
},
"manage_cycles_action": {
"options": {
"auto_label_cycles": "Auto-Label Old Cycles",
"select_cycle_to_label": "Label Specific Cycle",
"select_cycle_to_delete": "Delete Cycle",
"interactive_editor": "Merge/Split Interactive Editor",
"trim_cycle": "Trim Cycle Data"
}
},
"manage_profiles_action": {
"options": {
"create_profile": "Create New Profile",
"edit_profile": "Edit/Rename Profile",
"delete_profile": "Delete Profile",
"profile_stats": "Profile Statistics",
"cleanup_profile": "Clean Up History - Graph & Delete",
"assign_phases": "Assign Phase Ranges"
}
},
"manage_phase_catalog_action": {
"options": {
"create_custom_phase": "Create New Phase",
"edit_custom_phase": "Edit Phase",
"delete_custom_phase": "Delete Phase"
}
},
"assign_profile_phases_auto_detect_action": {
"options": {
"name_phases": "Name & apply phases",
"cancel": "Go back without changes"
}
},
"assign_profile_phases_action": {
"options": {
"add_range": "Add Phase Range",
"edit_range": "Edit Phase Range",
"delete_range": "Delete Phase Range",
"clear_ranges": "Clear All Ranges",
"auto_detect_ranges": "Auto-detect Phases",
"save_ranges": "Save and Return"
}
},
"record_cycle_action": {
"options": {
"refresh_status": "Refresh Status",
"stop_recording": "Stop Recording (Save & Process)",
"start_recording": "Start New Recording",
"process_recording": "Process Last Recording (Trim & Save)",
"discard_recording": "Discard Last Recording"
}
},
"record_process_save_mode": {
"options": {
"new_profile": "Create New Profile",
"existing_profile": "Add to Existing Profile",
"discard": "Discard Recording"
}
},
"resolve_feedback_action": {
"options": {
"confirm": "Confirm - Correct Detection",
"correct": "Correct - Choose Program/Duration",
"ignore": "Ignore - False Positive/Noisy Cycle",
"delete": "Delete - Remove from History"
}
},
"trim_cycle_action": {
"options": {
"set_start": "Set Start Point",
"set_end": "Set End Point",
"reset": "Reset to Full Duration",
"apply": "Apply Trim",
"cancel": "Cancel"
}
}
},
"services": {
"label_cycle": {
"name": "Label Cycle",
"description": "Assign an existing profile to a past cycle, or remove the label.",
"fields": {
"device_id": {
"name": "Device",
"description": "The WashData device to label."
},
"cycle_id": {
"name": "Cycle ID",
"description": "The ID of the cycle to label."
},
"profile_name": {
"name": "Profile Name",
"description": "The name of an existing profile (create profiles in Manage Profiles menu). Leave blank to remove label."
}
}
},
"create_profile": {
"name": "Create Profile",
"description": "Create a new profile (standalone or based on a reference cycle).",
"fields": {
"device_id": {
"name": "Device",
"description": "The WashData device."
},
"profile_name": {
"name": "Profile Name",
"description": "Name for the new profile (e.g. 'Heavy Duty', 'Delicates')."
},
"reference_cycle_id": {
"name": "Reference Cycle ID",
"description": "Optional cycle ID to base this profile on."
}
}
},
"delete_profile": {
"name": "Delete Profile",
"description": "Delete a profile and optionally unlabel cycles using it.",
"fields": {
"device_id": {
"name": "Device",
"description": "The WashData device."
},
"profile_name": {
"name": "Profile Name",
"description": "The profile to delete."
},
"unlabel_cycles": {
"name": "Unlabel Cycles",
"description": "Remove profile label from cycles using this profile."
}
}
},
"auto_label_cycles": {
"name": "Auto-Label Old Cycles",
"description": "Retroactively label unlabeled cycles using profile matching.",
"fields": {
"device_id": {
"name": "Device",
"description": "The WashData device."
},
"confidence_threshold": {
"name": "Confidence Threshold",
"description": "Minimum match confidence (0.50-0.95) to apply labels."
}
}
},
"export_config": {
"name": "Export Config",
"description": "Export this device's profiles, cycles, and settings to a JSON file (per device).",
"fields": {
"device_id": {
"name": "Device",
"description": "The WashData device to export."
},
"path": {
"name": "Path",
"description": "Optional absolute file path to write (defaults to /config/ha_washdata_export_{entry}.json)."
}
}
},
"import_config": {
"name": "Import Config",
"description": "Import profiles, cycles, and settings for this device from a JSON export file (settings may be overwritten).",
"fields": {
"device_id": {
"name": "Device",
"description": "The WashData device to import into."
},
"path": {
"name": "Path",
"description": "Absolute path to the export JSON file to import."
}
}
},
"submit_cycle_feedback": {
"name": "Submit Cycle Feedback",
"description": "Confirm or correct an auto-detected program after a completed cycle. Provide either `entry_id` (advanced) or `device_id` (recommended).",
"fields": {
"device_id": {
"name": "Device",
"description": "The WashData device (recommended instead of entry_id)."
},
"entry_id": {
"name": "Entry ID",
"description": "The config entry id for the device (alternative to device_id)."
},
"cycle_id": {
"name": "Cycle ID",
"description": "The cycle id shown in the feedback notification / logs."
},
"user_confirmed": {
"name": "Confirm Detected Program",
"description": "Set true if the detected program is correct."
},
"corrected_profile": {
"name": "Corrected Profile",
"description": "If not confirmed, provide the correct profile/program name."
},
"corrected_duration": {
"name": "Corrected Duration (seconds)",
"description": "Optional corrected duration in seconds."
},
"notes": {
"name": "Notes",
"description": "Optional notes about this cycle."
}
}
},
"record_start": {
"name": "Record Cycle Start",
"description": "Start manually recording a clean cycle (bypasses all matching logic).",
"fields": {
"device_id": {
"name": "Device",
"description": "The WashData device to record."
}
}
},
"record_stop": {
"name": "Record Cycle Stop",
"description": "Stop manual recording.",
"fields": {
"device_id": {
"name": "Device",
"description": "The WashData device to stop recording."
}
}
},
"trim_cycle": {
"name": "Trim Cycle",
"description": "Trim the power data of a past cycle to a specific time window.",
"fields": {
"device_id": {
"name": "Device",
"description": "The WashData device."
},
"cycle_id": {
"name": "Cycle ID",
"description": "The ID of the cycle to trim."
},
"trim_start_s": {
"name": "Trim Start (seconds)",
"description": "Keep data from this offset in seconds. Default 0."
},
"trim_end_s": {
"name": "Trim End (seconds)",
"description": "Keep data up to this offset in seconds. Default = full duration."
}
}
},
"pause_cycle": {
"name": "Pause Cycle",
"description": "Pause the active cycle for a WashData device.",
"fields": {
"device_id": {
"name": "Device",
"description": "The WashData device to pause."
}
}
},
"resume_cycle": {
"name": "Resume Cycle",
"description": "Resume a paused cycle for a WashData device.",
"fields": {
"device_id": {
"name": "Device",
"description": "The WashData device to resume."
}
}
}
},
"entity": {
"binary_sensor": {
"running": {
"name": "Running"
},
"match_ambiguity": {
"name": "Match Ambiguity"
}
},
"sensor": {
"washer_state": {
"name": "State",
"state": {
"off": "Off",
"idle": "Idle",
"starting": "Starting",
"running": "Running",
"paused": "Paused",
"user_paused": "Paused by user",
"ending": "Ending",
"finished": "Finished",
"anti_wrinkle": "Anti-Wrinkle",
"interrupted": "Interrupted",
"force_stopped": "Force Stopped",
"rinse": "Rinse",
"unknown": "Unknown",
"clean": "Clean",
"delay_wait": "Delay Start"
}
},
"washer_program": {
"name": "Program"
},
"time_remaining": {
"name": "Time Remaining"
},
"total_duration": {
"name": "Total Duration"
},
"cycle_progress": {
"name": "Progress"
},
"current_power": {
"name": "Current Power"
},
"elapsed_time": {
"name": "Elapsed Time"
},
"debug_info": {
"name": "Debug Info"
},
"match_confidence": {
"name": "Match Confidence"
},
"top_candidates": {
"name": "Top Candidates",
"state": {
"none": "None"
}
},
"current_phase": {
"name": "Current Phase"
},
"wash_phase": {
"name": "Phase"
},
"profile_cycle_count": {
"name": "Profile {profile_name} Count",
"unit_of_measurement": "cycles"
},
"suggestions": {
"name": "Suggested Settings Available"
},
"pump_runs_today": {
"name": "Pump Runs (Last 24 h)"
},
"cycle_count": {
"name": "Cycle Count"
}
},
"select": {
"program_select": {
"name": "Cycle Program",
"state": {
"auto_detect": "Auto-Detect"
}
}
},
"button": {
"force_end_cycle": {
"name": "Force End Cycle"
},
"pause_cycle": {
"name": "Pause Cycle"
},
"resume_cycle": {
"name": "Resume Cycle"
}
}
},
"exceptions": {
"device_id_required": {
"message": "A valid device_id is required."
},
"cycle_id_required": {
"message": "A valid cycle_id is required."
},
"profile_name_required": {
"message": "A valid profile_name is required."
},
"device_not_found": {
"message": "Device not found."
},
"no_config_entry": {
"message": "No config entry found for device."
},
"integration_not_loaded": {
"message": "Integration not loaded for this device."
},
"cycle_not_found_or_no_power": {
"message": "Cycle not found or has no power data."
},
"trim_failed_empty_window": {
"message": "Trim failed - cycle not found, no power data, or resulting window is empty."
},
"trim_invalid_range": {
"message": "trim_end_s must be greater than trim_start_s."
}
}
}