Skip to content

[Feature/Bug] Zeo Washing Machine (M1S Ultra): Deep Sleep Wakeup Failure & Missing DP Mappings #833

@Kindred-The-Eternal-Hunters

Description

Device Information

  • Device Model: Roborock M1S Ultra Washing Machine (Zeo / A01 protocol)
  • Integration Version: Latest HA core roborock integration

Overview

After extensive local reverse-engineering and testing on the M1S Ultra, I have identified main issues preventing full automation of this device via HA. I am providing the detailed findings and verified DP codes below to help improve both this integration and the underlying python-roborock library.

Please note on priority: Issue 1 is the core blocker that urgently breaks the local-control experience and requires investigation. Issue 3 is low priority (a historical summary of verified DP mappings) and can be addressed gradually in future updates whenever time permits.


Issue 1: Deep Sleep Wakeup Failure & "Remote Control Authorization" Lock

Description:
When the washing machine is in a "Deep Sleep" state (completely powered off / black screen), the integration cannot send any commands.

  • Sending the standard start command (set_value(203, 4)) does nothing.
  • I injected a custom physical power-on command (set_value(200, 1)) via the ZeoApi. While this successfully turns on the machine if it is already awake or just recently turned off, it completely fails to wake the machine from Deep Sleep.

CRITICAL HARDWARE CONTEXT:
The M1S Ultra has a physical safety feature on its touch panel: it requires the user to manually authorize/enable "Remote Control".
If the machine enters deep sleep or loses network connection, it seems to automatically drop this local authorization. Once dropped, all local MQTT/LAN commands are completely ignored by the machine's firewall.

However, the official Roborock App CAN still wake it up from this locked state. This strongly suggests the official app uses a specific "Cloud Magic Packet" to bypass the hardware lock and re-enable the Wi-Fi module before sending actual DPs.

Request: Could we investigate the cloud wake-up packet for Zeo devices? This is the core priority. Without it, automations are broken because the local network drops the connection due to the physical authorization lock.


Issue 2: Missing "Power On" Button Entity in HA

Description:
In homeassistant/components/roborock/button.py, the ZEO_BUTTON_DESCRIPTIONS array defines start, pause, and shutdown, but it completely lacks a power_on entity.

Request:
Please add a power_on button entity for RoborockButtonDescriptionA01 that sends DP 200: 1. Even though local deep-sleep wakeup is currently blocked (as mentioned in Issue 1), having a dedicated Power On button in the HA UI is still crucial for waking the machine from lighter standby states without triggering a wash cycle immediately.


Issue 3: Missing / Conflicting DP Mappings for M1S Ultra

Description:
This is a low-priority enhancement. The current underlying zeo_code_mappings.py uses legacy codes that conflict with the M1S Ultra. For instance, DP 205 12 is mapped to down_clean, but on M1S Ultra, 12 is tub_clean.
Through historical packet capture on my machine, I have successfully verified the following missing DPs and modes:

1. Detergent & Softener Types (DP 213 & 214):
On M1S Ultra, 3 is Auto. It also supports precise milliliter selections. (Note: ZeoSoftenerType shares the exact same mapping).

2. Additional Programs (DP 205):
Verified missing modes include Standard (39), Tub Clean (12), Urine (61), Oxygen Bubble (63), and New Clothes (17).

3. Temperatures (DP 207):
Verified missing temperatures include 6 for absolute 20°C, and 7 for extreme high temp (90/95°C).(solved in the latest version)

4. Hidden DPs (DP 233 & 267):
Successfully mapped DP 233 for Soak Time control and DP 267 for Blue Oxygen / Hydrolysis switch.

(Codes merged below)

class RoborockZeoProtocol(RoborockEnum):
    # ... existing ...
    SOAK_TIME = 233          # Soak time control
    BLUEOX_SETTING = 267     # Blue Oxygen / Hydrolysis switch

class ZeoDetergentType(RoborockEnum):
    empty = 0
    low = 1
    medium = 2
    auto = 3        # Auto intelligent mode (Overrides legacy 'high')
    ml_100 = 4      # 100ml
    ml_70 = 5       # 70ml
    ml_40 = 6       # 40ml
    off = 7         # Disabled
    ml_150 = 9      # 150ml

class ZeoProgram(RoborockEnum):
    tub_clean = 12           # Overrides legacy 'down_clean'
    new_clothes = 17         # New Clothes wash
    intensive = 22
    standard = 39            # Overrides legacy '1'
    urine = 61               # Urine stain removal (New)
    oxygen_bubble_wash = 63  # Oxygen Bubble wash (New)
    silk = 9

class ZeoTemperature(RoborockEnum):
    auto = 1
    low = 2
    medium = 3
    high = 4
    max = 5
    twenty_c = 6             # Verified: 20°C
    extreme = 7              # Verified: 90/95°C (solved in the latest version)

Request:
Please consider merging these missing DPs in a future update so the HA frontend can correctly display and select these modes without throwing errors.

Thank you to the contributors for the amazing work on this integration! Let me know if you need any packet captures or further testing on the M1S Ultra.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions