441 lines
13 KiB
JSON
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}"
|
|
}
|
|
}
|
|
}
|