Files
2026-07-20 22:52:35 -04:00

441 lines
13 KiB
JSON

{
"config": {
"step": {
"user": {
"title": "WashData Setup",
"description": "Configure your washing machine or other appliance.\n\nPower sensor is required.",
"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."
}
},
"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}"
}
}
}