3dg1luk43/ha_washdata

Home Assistant integration for smart-plug appliance monitoring: detects cycles, matches programs, estimates time remaining. Supports washing machines, dryers, dishwashers and more.

Python

1,357

994 commits

updated Oct 8, 2026

See the code

README

Installs Latest Matrix

WashData

A 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.

What you get

  • Cycle detection from the power trace, with start, pause and end handled per appliance type.
  • Program recognition once you have taught it your programs, plus time remaining, progress and the current phase.
  • Energy and cost per cycle, with dynamic tariffs, and a lifetime sensor for the Energy dashboard.
  • Notifications: ready-made pushes per event, or your own automations on WashData's events.
  • Pause / Resume, door sensor support and a "laundry still inside" reminder.
  • A full-screen panel in the sidebar for status, cycles, programs, settings and a what-if Playground.
  • Local only. Everything runs inside Home Assistant. The optional Community Store is the only online feature and is off by default.

Install

HACS (recommended): WashData is in the HACS default list.

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

Click Download, then restart Home Assistant.

Manual: copy custom_components/ha_washdata from the latest release into your custom_components folder and restart.

Set up a device

Open your Home Assistant instance and start setting up a new integration.

Settings > Devices & Services > Add Integration > WashData, then fill in:

FieldWhat to enter
Namee.g. "Washing Machine"
Device Typesets the detection defaults for that kind of appliance
Power Sensorthe plug's power entity, in watts
Minimum Powerbelow 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.

Teach it your programs

WashData ships no programs, because every machine is different. Teach it your 2-3 most common ones:

  • Record: on the panel's Overview tab, use Manual Recording > Start Recording, run the program, stop the recording, then save it to a profile.
  • Or label afterwards: just use the machine. Each run is stored as an unlabelled cycle; open it in Cycles and assign it to a new profile.

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.

Entities

<name> is your device name, for example sensor.washing_machine_state.

EntityWhat it shows
sensor.<name>_stateoff, idle, starting, running, paused, user_paused, ending, finished, anti_wrinkle, interrupted, force_stopped, clean, delay_wait, unknown
binary_sensor.<name>_runningOn for the whole cycle, through soaks, pauses and the end wait. Use this for "is it done" automations.
sensor.<name>_programThe recognised program
sensor.<name>_time_remainingMinutes left
sensor.<name>_total_durationElapsed + remaining (good for timer-bar-card)
sensor.<name>_progress0-100 %, with projected energy and cost
sensor.<name>_current_phaseThe phase you defined for the program at this point ("Rinse", "Spin"), else unknown
sensor.<name>_cycle_countLifetime runs, for maintenance by count
sensor.<name>_energy_totalLifetime kWh, for the Energy dashboard
sensor.<name>_suggested_settings_availableNumber of tuning suggestions waiting in Settings
binary_sensor.<name>_maintenance_dueOn when a maintenance reminder is due
select.<name>_cycle_programPick the program by hand
button.<name>_pause_cycle / _resume_cyclePause and resume a cycle (Pause can also cut the plug's power)
button.<name>_force_end_cycleEnd a stuck cycle
button.<name>_mark_unloadedConfirm the load is out (available in clean)
sensor.<name>_pump_runs_todayPump 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.

Services

ServiceUse
ha_washdata.pause_cycle / resume_cyclee.g. pause during a peak tariff
ha_washdata.record_start / record_stoprecord a program from a button
ha_washdata.label_cycle, auto_label_cycleslabel stored cycles
ha_washdata.mark_unloadedconfirm the load is out (NFC tag, button)
ha_washdata.export_config / import_configback 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.

When something is off

ProblemTry
Cycles start on standby blipsRaise Start Energy (e.g. 2 Wh).
A cycle ends during a soak or pauseRaise 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 cyclesRaise 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 endSet 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.

Documentation

PageContents
Smart plugsChoosing and configuring the plug
FAQShort answers to common questions
Panel walkthroughTour of every tab
Settings guideWhat each setting does, with graphs
Notifications and eventsPush options, automations, event payloads
Community StoreAdopt or share a setup for your model
Export and importBackup, transfer, undo an import
Community projectsProjects that work with WashData
How it worksDetection, matching and learning internals
WebSocket APIPanel API reference
ChangelogVersion history

Questions? Join the Matrix / Element chat or open an issue. Contributing: CONTRIBUTING.md.

Languages

🇦🇱 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.

License

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.

appliance-monitoring
automation
custom-components
dishwasher
dryer
energy-monitoring
hacs
home-assistant
iot
numpy
power-profile
smart-plug
time-remaining
washing-machine

3dg1luk43/ha_washdata

Home Assistant integration for smart-plug appliance monitoring: detects cycles, matches programs, estimates time remaining. Supports washing machines, dryers, dishwashers and more.

Python

1,357

994 commits

updated Oct 8, 2026

See the code

README

Installs Latest Matrix

WashData

A 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.

What you get

  • Cycle detection from the power trace, with start, pause and end handled per appliance type.
  • Program recognition once you have taught it your programs, plus time remaining, progress and the current phase.
  • Energy and cost per cycle, with dynamic tariffs, and a lifetime sensor for the Energy dashboard.
  • Notifications: ready-made pushes per event, or your own automations on WashData's events.
  • Pause / Resume, door sensor support and a "laundry still inside" reminder.
  • A full-screen panel in the sidebar for status, cycles, programs, settings and a what-if Playground.
  • Local only. Everything runs inside Home Assistant. The optional Community Store is the only online feature and is off by default.

Install

HACS (recommended): WashData is in the HACS default list.

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

Click Download, then restart Home Assistant.

Manual: copy custom_components/ha_washdata from the latest release into your custom_components folder and restart.

Set up a device

Open your Home Assistant instance and start setting up a new integration.

Settings > Devices & Services > Add Integration > WashData, then fill in:

FieldWhat to enter
Namee.g. "Washing Machine"
Device Typesets the detection defaults for that kind of appliance
Power Sensorthe plug's power entity, in watts
Minimum Powerbelow 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.

Teach it your programs

WashData ships no programs, because every machine is different. Teach it your 2-3 most common ones:

  • Record: on the panel's Overview tab, use Manual Recording > Start Recording, run the program, stop the recording, then save it to a profile.
  • Or label afterwards: just use the machine. Each run is stored as an unlabelled cycle; open it in Cycles and assign it to a new profile.

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.

Entities

<name> is your device name, for example sensor.washing_machine_state.

EntityWhat it shows
sensor.<name>_stateoff, idle, starting, running, paused, user_paused, ending, finished, anti_wrinkle, interrupted, force_stopped, clean, delay_wait, unknown
binary_sensor.<name>_runningOn for the whole cycle, through soaks, pauses and the end wait. Use this for "is it done" automations.
sensor.<name>_programThe recognised program
sensor.<name>_time_remainingMinutes left
sensor.<name>_total_durationElapsed + remaining (good for timer-bar-card)
sensor.<name>_progress0-100 %, with projected energy and cost
sensor.<name>_current_phaseThe phase you defined for the program at this point ("Rinse", "Spin"), else unknown
sensor.<name>_cycle_countLifetime runs, for maintenance by count
sensor.<name>_energy_totalLifetime kWh, for the Energy dashboard
sensor.<name>_suggested_settings_availableNumber of tuning suggestions waiting in Settings
binary_sensor.<name>_maintenance_dueOn when a maintenance reminder is due
select.<name>_cycle_programPick the program by hand
button.<name>_pause_cycle / _resume_cyclePause and resume a cycle (Pause can also cut the plug's power)
button.<name>_force_end_cycleEnd a stuck cycle
button.<name>_mark_unloadedConfirm the load is out (available in clean)
sensor.<name>_pump_runs_todayPump 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.

Services

ServiceUse
ha_washdata.pause_cycle / resume_cyclee.g. pause during a peak tariff
ha_washdata.record_start / record_stoprecord a program from a button
ha_washdata.label_cycle, auto_label_cycleslabel stored cycles
ha_washdata.mark_unloadedconfirm the load is out (NFC tag, button)
ha_washdata.export_config / import_configback 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.

When something is off

ProblemTry
Cycles start on standby blipsRaise Start Energy (e.g. 2 Wh).
A cycle ends during a soak or pauseRaise 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 cyclesRaise 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 endSet 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.

Documentation

PageContents
Smart plugsChoosing and configuring the plug
FAQShort answers to common questions
Panel walkthroughTour of every tab
Settings guideWhat each setting does, with graphs
Notifications and eventsPush options, automations, event payloads
Community StoreAdopt or share a setup for your model
Export and importBackup, transfer, undo an import
Community projectsProjects that work with WashData
How it worksDetection, matching and learning internals
WebSocket APIPanel API reference
ChangelogVersion history

Questions? Join the Matrix / Element chat or open an issue. Contributing: CONTRIBUTING.md.

Languages

🇦🇱 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.

License

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.

appliance-monitoring
automation
custom-components
dishwasher
dryer
energy-monitoring
hacs
home-assistant
iot
numpy
power-profile
smart-plug
time-remaining
washing-machine

Significant stargazers

Ingvar Stepanyan

1,854 followers · starred Oct 2026

Óscar Fernández Díaz

9 followers · starred Mar 2026

Matt Travi

255 followers · starred Dec 2025

Nico Schlömer

2,505 followers · starred Sep 2026