Home Assistant integration for smart-plug appliance monitoring: detects cycles, matches programs, estimates time remaining. Supports washing machines, dryers, dishwashers and more.
See the codeA Home Assistant integration that watches an appliance through its smart plug. It detects each cycle, recognises which program ran from the power curve, and tells you how long is left.
Works with washing machines, dryers, washer-dryers, dishwashers, air fryers, bread makers and pumps. Two catch-all types cover the rest: Other (Advanced) (full program matching) and Threshold Device (on/off detection only).
[!CAUTION] Electrical safety. A plug on a washer, dryer or dishwasher carries the full heating load for hours. It must be rated in watts at your mains voltage for the appliance's peak power, often over 2500 W (16 A is 3680 W at 230 V, but 15 A at 120 V is only 1800 W), or use a hardwired module. Cheap or under-rated plugs can overheat and catch fire. Use at your own risk and check the plug regularly. More in Smart plugs.
HACS (recommended): WashData is in the HACS default list.
Click Download, then restart Home Assistant.
Manual: copy custom_components/ha_washdata from the
latest release into your custom_components
folder and restart.
Settings > Devices & Services > Add Integration > WashData, then fill in:
| Field | What to enter |
|---|---|
| Name | e.g. "Washing Machine" |
| Device Type | sets the detection defaults for that kind of appliance |
| Power Sensor | the plug's power entity, in watts |
| Minimum Power | below this the appliance counts as off (default 2 W) |
Everything else is in the WashData panel in the sidebar. Before you start, check your plug reports often enough: see Smart plugs.
WashData ships no programs, because every machine is different. Teach it your 2-3 most common ones:
After that, matching is automatic. When WashData is not sure, it puts the cycle in the review queue in Cycles (Overview links to it), where you confirm or correct it.
How many profiles? One per program you can tell apart by length or power curve (Quick vs Cotton, wash only vs wash + dry). Programs that differ only in temperature or spin look alike; WashData may mix them up at first and learns from 3-5 corrections. For a washer-dryer, make one profile per wash + dry combination.
<name> is your device name, for example sensor.washing_machine_state.
| Entity | What it shows |
|---|---|
sensor.<name>_state | off, idle, starting, running, paused, user_paused, ending, finished, anti_wrinkle, interrupted, force_stopped, clean, delay_wait, unknown |
binary_sensor.<name>_running | On for the whole cycle, through soaks, pauses and the end wait. Use this for "is it done" automations. |
sensor.<name>_program | The recognised program |
sensor.<name>_time_remaining | Minutes left |
sensor.<name>_total_duration | Elapsed + remaining (good for timer-bar-card) |
sensor.<name>_progress | 0-100 %, with projected energy and cost |
sensor.<name>_current_phase | The phase you defined for the program at this point ("Rinse", "Spin"), else unknown |
sensor.<name>_cycle_count | Lifetime runs, for maintenance by count |
sensor.<name>_energy_total | Lifetime kWh, for the Energy dashboard |
sensor.<name>_suggested_settings_available | Number of tuning suggestions waiting in Settings |
binary_sensor.<name>_maintenance_due | On when a maintenance reminder is due |
select.<name>_cycle_program | Pick the program by hand |
button.<name>_pause_cycle / _resume_cycle | Pause and resume a cycle (Pause can also cut the plug's power) |
button.<name>_force_end_cycle | End a stuck cycle |
button.<name>_mark_unloaded | Confirm the load is out (available in clean) |
sensor.<name>_pump_runs_today | Pump devices only: runs in the last 24 h |
State meanings: idle means the display is on between cycles; paused covers quiet spells and a
cycle halted on standby power (sub-state Stalled); user_paused is your own pause; ending is the
wait before WashData calls the end; clean means finished with the load still inside.
| Service | Use |
|---|---|
ha_washdata.pause_cycle / resume_cycle | e.g. pause during a peak tariff |
ha_washdata.record_start / record_stop | record a program from a button |
ha_washdata.label_cycle, auto_label_cycles | label stored cycles |
ha_washdata.mark_unloaded | confirm the load is out (NFC tag, button) |
ha_washdata.export_config / import_config | back up or restore one device (administrators) |
action: ha_washdata.record_start
data:
device_id: "washer_device_id"
Assist: ask "Is my washer done?". Copy
docs/custom_sentences/en/ha_washdata.yaml to
<config>/custom_sentences/en/ and restart so Assist knows the phrases.
| Problem | Try |
|---|---|
| Cycles start on standby blips | Raise Start Energy (e.g. 2 Wh). |
| A cycle ends during a soak or pause | Raise Off Delay or Min Off Gap above the longest quiet spell in the program. For a soak you start yourself, press Pause. |
| One run is split into two cycles | Raise Min Off Gap above the quiet gap before the tail. |
| Program shows "unknown" | Label a few runs of that program; group near-identical profiles. |
| You want a warning before the end | Set Pre-End Alert. |
Settings show suggestions from your own history, applied only when you click Use or Apply all. What each setting does: Settings guide. Quick answers: FAQ.
| Page | Contents |
|---|---|
| Smart plugs | Choosing and configuring the plug |
| FAQ | Short answers to common questions |
| Panel walkthrough | Tour of every tab |
| Settings guide | What each setting does, with graphs |
| Notifications and events | Push options, automations, event payloads |
| Community Store | Adopt or share a setup for your model |
| Export and import | Backup, transfer, undo an import |
| Community projects | Projects that work with WashData |
| How it works | Detection, matching and learning internals |
| WebSocket API | Panel API reference |
| Changelog | Version history |
Questions? Join the Matrix / Element chat or open an issue. Contributing: CONTRIBUTING.md.
🇦🇱 Shqip • 🇧🇦 Bosanski • 🇧🇬 Български • 🇭🇷 Hrvatski • 🇨🇿 Čeština • 🇩🇰 Dansk • 🇳🇱 Nederlands • 🇬🇧 English • 🇪🇪 Eesti • 🇫🇮 Suomi • 🇫🇷 Français • 🇩🇪 Deutsch • 🇬🇷 Ελληνικά • 🇭🇺 Magyar • 🇮🇸 Íslenska • 🇮🇹 Italiano • 🇯🇵 日本語 • 🇰🇷 한국어 • 🇱🇻 Latviešu • 🇱🇹 Lietuvių • 🇲🇰 Македонски • 🇳🇴 Norsk • 🇵🇱 Polski • 🇵🇹 Português • 🇧🇷 Português (BR) • 🇷🇴 Română • 🇷🇺 Русский • 🇷🇸 Srpski • 🇸🇰 Slovenčina • 🇸🇮 Slovenščina • 🇪🇸 Español • 🇸🇪 Svenska • 🇹🇷 Türkçe • 🇺🇦 Українська • 🇨🇳 简体中文
Translations are community-maintained on GitLocalize.
AGPL-3.0-or-later. Free to use, study, modify and share; if others use a modified version over a network, you must offer them its source under the same licence.
1,854 followers · starred Oct 2026
9 followers · starred Mar 2026
255 followers · starred Dec 2025
2,505 followers · starred Sep 2026
Home Assistant integration for smart-plug appliance monitoring: detects cycles, matches programs, estimates time remaining. Supports washing machines, dryers, dishwashers and more.
See the codeA Home Assistant integration that watches an appliance through its smart plug. It detects each cycle, recognises which program ran from the power curve, and tells you how long is left.
Works with washing machines, dryers, washer-dryers, dishwashers, air fryers, bread makers and pumps. Two catch-all types cover the rest: Other (Advanced) (full program matching) and Threshold Device (on/off detection only).
[!CAUTION] Electrical safety. A plug on a washer, dryer or dishwasher carries the full heating load for hours. It must be rated in watts at your mains voltage for the appliance's peak power, often over 2500 W (16 A is 3680 W at 230 V, but 15 A at 120 V is only 1800 W), or use a hardwired module. Cheap or under-rated plugs can overheat and catch fire. Use at your own risk and check the plug regularly. More in Smart plugs.
HACS (recommended): WashData is in the HACS default list.
Click Download, then restart Home Assistant.
Manual: copy custom_components/ha_washdata from the
latest release into your custom_components
folder and restart.
Settings > Devices & Services > Add Integration > WashData, then fill in:
| Field | What to enter |
|---|---|
| Name | e.g. "Washing Machine" |
| Device Type | sets the detection defaults for that kind of appliance |
| Power Sensor | the plug's power entity, in watts |
| Minimum Power | below this the appliance counts as off (default 2 W) |
Everything else is in the WashData panel in the sidebar. Before you start, check your plug reports often enough: see Smart plugs.
WashData ships no programs, because every machine is different. Teach it your 2-3 most common ones:
After that, matching is automatic. When WashData is not sure, it puts the cycle in the review queue in Cycles (Overview links to it), where you confirm or correct it.
How many profiles? One per program you can tell apart by length or power curve (Quick vs Cotton, wash only vs wash + dry). Programs that differ only in temperature or spin look alike; WashData may mix them up at first and learns from 3-5 corrections. For a washer-dryer, make one profile per wash + dry combination.
<name> is your device name, for example sensor.washing_machine_state.
| Entity | What it shows |
|---|---|
sensor.<name>_state | off, idle, starting, running, paused, user_paused, ending, finished, anti_wrinkle, interrupted, force_stopped, clean, delay_wait, unknown |
binary_sensor.<name>_running | On for the whole cycle, through soaks, pauses and the end wait. Use this for "is it done" automations. |
sensor.<name>_program | The recognised program |
sensor.<name>_time_remaining | Minutes left |
sensor.<name>_total_duration | Elapsed + remaining (good for timer-bar-card) |
sensor.<name>_progress | 0-100 %, with projected energy and cost |
sensor.<name>_current_phase | The phase you defined for the program at this point ("Rinse", "Spin"), else unknown |
sensor.<name>_cycle_count | Lifetime runs, for maintenance by count |
sensor.<name>_energy_total | Lifetime kWh, for the Energy dashboard |
sensor.<name>_suggested_settings_available | Number of tuning suggestions waiting in Settings |
binary_sensor.<name>_maintenance_due | On when a maintenance reminder is due |
select.<name>_cycle_program | Pick the program by hand |
button.<name>_pause_cycle / _resume_cycle | Pause and resume a cycle (Pause can also cut the plug's power) |
button.<name>_force_end_cycle | End a stuck cycle |
button.<name>_mark_unloaded | Confirm the load is out (available in clean) |
sensor.<name>_pump_runs_today | Pump devices only: runs in the last 24 h |
State meanings: idle means the display is on between cycles; paused covers quiet spells and a
cycle halted on standby power (sub-state Stalled); user_paused is your own pause; ending is the
wait before WashData calls the end; clean means finished with the load still inside.
| Service | Use |
|---|---|
ha_washdata.pause_cycle / resume_cycle | e.g. pause during a peak tariff |
ha_washdata.record_start / record_stop | record a program from a button |
ha_washdata.label_cycle, auto_label_cycles | label stored cycles |
ha_washdata.mark_unloaded | confirm the load is out (NFC tag, button) |
ha_washdata.export_config / import_config | back up or restore one device (administrators) |
action: ha_washdata.record_start
data:
device_id: "washer_device_id"
Assist: ask "Is my washer done?". Copy
docs/custom_sentences/en/ha_washdata.yaml to
<config>/custom_sentences/en/ and restart so Assist knows the phrases.
| Problem | Try |
|---|---|
| Cycles start on standby blips | Raise Start Energy (e.g. 2 Wh). |
| A cycle ends during a soak or pause | Raise Off Delay or Min Off Gap above the longest quiet spell in the program. For a soak you start yourself, press Pause. |
| One run is split into two cycles | Raise Min Off Gap above the quiet gap before the tail. |
| Program shows "unknown" | Label a few runs of that program; group near-identical profiles. |
| You want a warning before the end | Set Pre-End Alert. |
Settings show suggestions from your own history, applied only when you click Use or Apply all. What each setting does: Settings guide. Quick answers: FAQ.
| Page | Contents |
|---|---|
| Smart plugs | Choosing and configuring the plug |
| FAQ | Short answers to common questions |
| Panel walkthrough | Tour of every tab |
| Settings guide | What each setting does, with graphs |
| Notifications and events | Push options, automations, event payloads |
| Community Store | Adopt or share a setup for your model |
| Export and import | Backup, transfer, undo an import |
| Community projects | Projects that work with WashData |
| How it works | Detection, matching and learning internals |
| WebSocket API | Panel API reference |
| Changelog | Version history |
Questions? Join the Matrix / Element chat or open an issue. Contributing: CONTRIBUTING.md.
🇦🇱 Shqip • 🇧🇦 Bosanski • 🇧🇬 Български • 🇭🇷 Hrvatski • 🇨🇿 Čeština • 🇩🇰 Dansk • 🇳🇱 Nederlands • 🇬🇧 English • 🇪🇪 Eesti • 🇫🇮 Suomi • 🇫🇷 Français • 🇩🇪 Deutsch • 🇬🇷 Ελληνικά • 🇭🇺 Magyar • 🇮🇸 Íslenska • 🇮🇹 Italiano • 🇯🇵 日本語 • 🇰🇷 한국어 • 🇱🇻 Latviešu • 🇱🇹 Lietuvių • 🇲🇰 Македонски • 🇳🇴 Norsk • 🇵🇱 Polski • 🇵🇹 Português • 🇧🇷 Português (BR) • 🇷🇴 Română • 🇷🇺 Русский • 🇷🇸 Srpski • 🇸🇰 Slovenčina • 🇸🇮 Slovenščina • 🇪🇸 Español • 🇸🇪 Svenska • 🇹🇷 Türkçe • 🇺🇦 Українська • 🇨🇳 简体中文
Translations are community-maintained on GitLocalize.
AGPL-3.0-or-later. Free to use, study, modify and share; if others use a modified version over a network, you must offer them its source under the same licence.
1,854 followers · starred Oct 2026
9 followers · starred Mar 2026
255 followers · starred Dec 2025
2,505 followers · starred Sep 2026