Skip to main content

midea-dishwasher-api

CI PyPI

Sponsor

Python client for Midea dishwashers (device_type 0xE1, plugin v5).

Implements the AA … E1 application protocol and the LAN V3 transport (8370 handshake + AES-128-CBC + SHA-256, with the inner V2 5A5A framing).

Installation

pip install midea-dishwasher-api

Quick start

from midea_dishwasher_api import BrightLevel, Client, Mode, V3Transport

with V3Transport(
    host="192.168.5.100",
    device_id=151732606394621,
    token=bytes.fromhex("..."),  # 64 bytes
    key=bytes.fromhex("..."),    # 32 bytes
) as transport:
    client = Client(send=transport)

    status = client.query_status()
    print(status.machine_state)   # MachineState.POWER_ON / POWER_OFF
    print(status.cycle_state)     # CycleState.IDLE / WORK / ORDER / ...
    print(status.left_time)       # minutes remaining (only while WORK)
    print(status.door_closed)
    print(status.bright_lack)     # is the rinse aid empty?

    client.power_on()
    client.start_to_work(mode=Mode.ECO, extra_drying=True)
    client.set_bright(BrightLevel.L3)
    client.cancel_work()
    client.power_off()

Control methods return nothing: the machine takes a few seconds to reflect a change. Call query_status() whenever fresh state is needed.

API

Client

Method Effect
query_status() -> DishwasherStatus Read the current state
power_on() Power the machine on
power_off() Power it off
cancel_work() Cancel the cycle / return to idle
start_to_work(mode, extra_drying=False) Start a cycle
set_bright(level: BrightLevel) Set the rinse-aid level (1–5)

extra_drying is keyword-only.

DishwasherStatus

Fields decoded from a response:

  • machine_state: MachineState | None — POWER_ON / POWER_OFF
  • cycle_state: CycleState | None — idle, order, work, error, ...
  • mode: Mode | int | None — the running program; None when there is none (0x00), int for program bytes not yet catalogued in the enum
  • extra_drying: bool — "extra drying" flag of the current program
  • wash_stage: WashStage | int | None — IDLE, PRE_WASH, MAIN_WASH, RINSE, DRY, FINISH
  • error_code: ErrorCode | int — NONE, WATER_SUPPLY, HEATING, OVERFLOW, WATER_VALVE
  • left_time: int | None — minutes remaining (only set when cycle_state == WORK)
  • door_closed: bool
  • bright_lack: bool — the rinse aid ran out
  • bright: BrightLevel | int | None — current rinse-aid level (1–5)
  • softwater_lack: bool — the salt for water softening ran out
  • temperature: int | None — tub water temperature in °C

Available programs (Mode)

AUTO, INTENSIVE, NORMAL, ECO, GLASS, NINETY_MIN, ONE_HOUR, RAPID, SOAK, THREE_IN_ONE, HYGIENE, QUIET, PARTY, FRUIT.

Custom transport

Client accepts any Callable[[bytes], bytes] as send. Useful for tests with a mock transport, for a cloud integration, or for a pipeline of your own:

from midea_dishwasher_api.protocol import assemble_frame

def fake_send(frame: bytes) -> bytes:
    return assemble_frame(b"...", 0x02)

client = Client(send=fake_send)

The low-level codec (assemble_frame, parse_frame, build_query, build_control, make_sum) and the status decoder (decode_response) live in midea_dishwasher_api.protocol and midea_dishwasher_api.state respectively — outside the public __init__.py.

Obtaining token and key

They are per-device credentials issued by the Midea cloud. Use one of the existing tools (midea-msmart, midea-beautiful-air, midea-discover) to extract them from your app account.

Support

This SDK is built and maintained on personal time, on hardware bought for the purpose. If it is useful to you, consider sponsoring the work — it keeps the devices, the testing and the releases coming.

License

MIT — see LICENSE.

Metadata

Release files for midea-dishwasher-api 2.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for midea-dishwasher-api 2.0.0
File Size Uploaded
midea_dishwasher_api-2.0.0.tar.gz 23.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for midea-dishwasher-api 2.0.0
File Interpreter ABI Platform
midea_dishwasher_api-2.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 46.7 kB

Release files / midea_dishwasher_api-2.0.0.tar.gz

Download URL midea_dishwasher_api-2.0.0.tar.gz
Size 23.1 kB
Tags Source
SHA-256 checksum
How to use checksums
73185a79db7369b6b8a2102baba5a659e2e866cdfe5d19fc6f99f9ed4fb04a63
BLAKE2b-256 checksum
How to use checksums
978fe979816b7c6329741656bd749c4ca45e0e480219f12572a8d52ff1955d48
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / midea_dishwasher_api-2.0.0-py3-none-any.whl

Download URL midea_dishwasher_api-2.0.0-py3-none-any.whl
Size 23.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2c83966e52696ea95b74cf451c8e5de303299a82e6639bceb81487d4b810476d
BLAKE2b-256 checksum
How to use checksums
150986104aee8346af8c622689f04122c7f4446a7890444f6337c078998ac072
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

This release

2.0.0 This release

2 release files

1.3.6

2 release files

1.3.5

2 release files

1.3.4

2 release files

1.3.3

2 release files

1.3.2

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page