{ "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)" } }, "reconfigure": { "title": "Reconfigure WashData", "description": "Update the device name, appliance type, or power sensor.", "data": { "name": "Device Name", "device_type": "Device Type", "power_sensor": "Power Sensor", "min_power": "Minimum Power Threshold (W)" } } }, "error": { "cannot_connect": "Failed to connect", "invalid_auth": "Invalid authentication", "unknown": "Unexpected error", "invalid_power": "Power threshold must be greater than 0" }, "abort": { "already_configured": "Device is already configured", "reconfigure_successful": "Reconfiguration was successful" } }, "options": { "step": { "init": { "title": "WashData Settings", "description": "Rename the device or change its core hardware settings. All detection, matching and notification settings are in the WashData panel.", "data": { "name": "Device Name", "device_type": "Device Type", "power_sensor": "Power Sensor", "min_power": "Minimum Power Threshold (W)" } } }, "error": { "invalid_power": "Power threshold must be greater than 0", "timer_default_message": "{device}: {minutes} min timer", "timer_pause_action_title": "Resume Cycle", "timer_pause_body_suffix": "The cycle is paused. Open the WashData panel to resume.", "vs_typical_longer": "{pct}% longer than usual", "vs_typical_shorter": "{pct}% shorter than usual", "notify_live_waiting_message": "{device}: No profile matched yet." } }, "selector": { "device_type": { "options": { "washing_machine": "Washing Machine", "dryer": "Dryer", "washer_dryer": "Washer-Dryer Combo", "dishwasher": "Dishwasher", "air_fryer": "Air Fryer", "bread_maker": "Bread Maker", "pump": "Pump / Sump Pump", "generic": "Other (Advanced)", "other": "Threshold Device" } } }, "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." } } }, "trigger_ml_training": { "name": "Trigger ML Training", "description": "Manually retrain the on-device ML models from this device's own labelled cycles (experimental).", "fields": { "device_id": { "name": "Device", "description": "The WashData device to retrain models for." } } } }, "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" } }, "ambiguity": { "name": "Ambiguity Score" }, "current_phase": { "name": "Current 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" }, "energy_total": { "name": "Energy Total" } }, "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" }, "record_start": { "name": "Record Cycle Start" }, "record_stop": { "name": "Record Cycle Stop" } } }, "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." }, "no_active_cycle": { "message": "No active cycle to pause or resume." }, "path_not_allowed": { "message": "Path is not allowed: {path}. Add its directory to 'allowlist_external_dirs' in configuration.yaml." }, "export_path_exists": { "message": "Export target already exists: {path}. Choose a different path or remove the existing file first." }, "export_write_failed": { "message": "Could not write export to {path}: {error}" }, "create_profile_failed": { "message": "Could not create profile: {error}" }, "assign_profile_failed": { "message": "Could not assign profile: {error}" } } }