Hey everyone ![]()
I’m excited to share something that I’ve been working on (with a lot of help from ChatGPT
):
a native ESPHome component for Midea-based dehumidifiers — no cloud, no MQTT, just pure local control through ESPHome and Home Assistant!
Please follow the project in github to get all the latest changes
Background
This project is a port and evolution of the amazing open-source work by @Hypfer and his esp8266-midea-dehumidifier project.
His firmware originally ran on ESP8266 with MQTT and made it possible to “free” Midea-made dehumidifiers from their cloud dongles by communicating directly with the unit’s UART interface.
My ESPHome port builds on that foundation and brings full native Home Assistant integration — no MQTT, no setup complexity.
What It Does
This ESPHome component talks directly to your dehumidifier’s internal UART port (where the original WiFi dongle used to connect).
Once flashed, it appears in Home Assistant automatically with all entities ready to use.
Supported Entities:
climate→ controls power, mode, fan speed, and humidity setpointbinary_sensor→ “Bucket Full” indicatorswitch→ optional Ionizer, Swing, Beep, Sleep, Pump togglesensor→ optional Error Code outputtext→ optional Device Capabilities info
Hardware
You can reuse the existing Midea WiFi dongle port!
Typical connections for ESP32 or ESP8266 are:
| Dongle Pin | Function | ESP Pin |
|---|---|---|
| 1 | 5V | VIN |
| 2 | TX | GPIO17 |
| 3 | RX | GPIO16 |
| 4 | GND | GND |
That’s all it takes — no cloud, no encryption, just UART.
Example YAML
esphome:
name: midea-dehumidifier
esp32:
board: esp32dev
framework:
type: esp-idf
external_components:
- source:
type: git
url: https://github.com/Chreece/ESPHome-Dehumidifier
ref: main
components: [midea_dehum]
refresh: 0min
uart:
id: uart_midea
tx_pin: GPIO16
rx_pin: GPIO17
baud_rate: 9600
midea_dehum:
id: midea_dehum_comp
uart_id: uart_midea
status_poll_interval: 30000 # Optional, how often should ESP ask the device for a status update in ms (1000ms=1sec). Default: 30000ms
# 🆕 Optional: Rename display modes to match your device’s front panel.
# For example, your unit may label these as “Cont”, “Dry”, or “Smart”.
# These names only affect how the presets appear in Home Assistant —
# the internal logic and protocol remain the same.
# 💡 Tip:
# If any of the modes below are set to "UNUSED" (case-insensitive),
# that preset will NOT appear in the Home Assistant UI.
# Use this if your device doesn’t support or respond to a specific mode.
# For instance, if pressing “SMART”, your unit doesn't change any mode,
# set display_mode_smart: "UNUSED" to hide it from the UI.
display_mode_setpoint: 'UNUSED' # Hidden in Home Assistant (disabled)
display_mode_continuous: 'Cont' # Shown as "Cont"
display_mode_smart: 'Smart' # Shown as "Smart"
display_mode_clothes_drying: 'Dry' # Shown as "Dry"
climate:
- platform: midea_dehum
midea_dehum_id: midea_dehum_comp
name: "Inventor Dehumidifier"
binary_sensor:
- platform: midea_dehum
midea_dehum_id: midea_dehum_comp
bucket_full:
name: "Bucket Full"
# Optional error sensor remove this block if not needed
sensor:
- platform: midea_dehum
midea_dehum_id: midea_dehum_comp
error:
name: "Error Code"
switch:
- platform: midea_dehum
midea_dehum_id: midea_dehum_comp
# Optional ionizer control, add this block only if your device has Ionizer
ionizer:
name: "Ionizer"
# Optional swing control (if supported)
swing:
name: "Swing"
# Optional control the device pump (if supported)
pump:
name: 'Defrost pump'
# Optional sleep mode toggle (not all models support this)
# Enables or disables “Sleep” mode if available on your device (not tested!).
sleep:
name: "Sleep Mode"
# Optional beep control
# When enabled, the device will emit a beep sound when it receives
# commands (e.g. from Home Assistant or OTA updates).
beep:
name: "Beep on Command"
# Optional timer number entity for the internal device timer
# When device off -> timer to turn on
# When device on -> timer to turn off
# Toggling the device on/off resets the timer
# 0.5h increments, max: 24h
number:
- platform: midea_dehum
midea_dehum_id: midea_dehum_comp
timer:
name: "Internal Device Timer"
# Optional text sensor to show discovered device capabilities
# Useful for diagnostics — helps confirm which features your model supports.
# (Note: Not all capabilities are necessarily showed.)
text_sensor:
- platform: midea_dehum
midea_dehum_id: midea_dehum_comp
capabilities:
name: "Device Capabilities"
Supported Models
Should work with all Midea-based dehumidifiers, including:
- Midea MAD22S1WWT
- Comfee MDDF-16DEN7-WF / MDDF-20DEN7-WF
- Inventor Eva II PRO Wi-Fi / EVA ION PRO Wi-Fi 20L
- Midea Cube 20 / 35 / 50
And likely many other rebadged variants.
About the Port
I’m not a professional developer — just a Home Assistant enthusiast who wanted full ESPHome control.
This project was developed collaboratively with AI help (ChatGPT) and a lot of trial and error.
It’s open source here:
GitHub – Chreece/ESPHome-Dehumidifier
Disclaimer
This project interacts directly with hardware inside a mains-powered appliance that may use R290 (propane) refrigerant.
Modifying or opening such devices can be dangerous and may cause electric shock, fire, or injury if not done safely.
By using this project, you agree that:
- You perform all modifications at your own risk
- The author(s) and contributors are not responsible for any damage or injury
- Always disconnect power before working on the device
- Never operate the unit open or modified near flammable materials
If you’re not confident working with electrical components, please don’t attempt this modification.
Credits
Massive thanks to:
- Hypfer — original project and protocol logic
- Mac Zhou
- NeoAcheron
- Rene Klootwijk
- CDank for Native humidity support + Swing switch sensor
Without their work, none of this would exist.
Final Thoughts
If you’re using Home Assistant and have one of these Midea-based dehumidifiers, this ESPHome version keeps everything 100 % local and integrates seamlessly.
It’s been rock solid in my setup — and finally, the bucket full light just works! ![]()
Feedback, bug reports, and ideas are all welcome!
— Chreece
