Skip to content

Support for DEEBOT X8 PRO OMNI #832

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
4 tasks done
ytorres opened this issue Feb 23, 2025 · 10 comments
Open
4 tasks done

Support for DEEBOT X8 PRO OMNI #832

ytorres opened this issue Feb 23, 2025 · 10 comments
Labels
enhancement New feature or request

Comments

@ytorres
Copy link

ytorres commented Feb 23, 2025

Checks

  • I have searched the existing issues and no issue is describing my issue
  • I have checked the FAQ
  • I have checked the documentation
  • I have installed the latest version

The problem

Device "DEEBOT X8 PRO OMNI" not supported. More information at #612: {'did': 'f56f062e-8100-44b8-a027-1166cfa6482f', 'name': 'E0C235557F1FPNV20270', 'class': 'n0vyif', 'resource': '4oLeIYS8', 'company': 'eco-ng', 'bindTs': 1739616918621, 'service': {'jmq': 'jmq-ngiot-eu.dc.ww.ecouser.net', 'mqs': 'api-ngiot.dc-eu.ww.ecouser.net'}, 'deviceName': 'DEEBOT X8 PRO OMNI', 'icon': 'https://portal-ww.ecouser.net/api/pim/file/get/66e3ac63a2928902a25d83a0', 'ota': True, 'UILogicId': 'keplerh_ww_h_keplerh5', 'materialNo': '110-2417-0402', 'pid': '66daaa789dd37cf146cb1d2e', 'product_category': 'DEEBOT', 'model': 'KEPLER_BLACK_AI_INT', 'updateInfo': {'needUpdate': False, 'changeLog': ''}, 'nick': 'Mon pote', 'homeId': '631a26505466082f01388b04', 'homeSort': 1, 'status': 1, 'btName': 'ECOVACS-n0vyif-0270', 'btMac': '28:F5:2B:6C:56:05', 'otaUpgrade': {}}

On which deebot device (vacuum) you have the issue?

DEEBOT X8 PRO OMNI

Which version of the deebot-client are you using?

HA 2025.2.5

Country

Fr

Continent

eu

Anything in the logs that might be useful for us?

Additional information

No response

@ytorres ytorres added the bug Something isn't working label Feb 23, 2025
@edenhaus edenhaus added enhancement New feature or request and removed bug Something isn't working labels Feb 26, 2025
@LeoDevop
Copy link

Any testing we can do or more logs we can provide to get this vacuum supported?

@MattiaCarli
Copy link

Hello, I have the same vacuum robot and I am experiencing the same issue in Italy (not supported). Let me know if I can help in any way.

@galmi77
Copy link

galmi77 commented Apr 2, 2025

Same issue for me with the Ecovacs Deebot X8 Pro in Germany. Would be great if the flagship model would be supported.
If I can help, feel free to contact me.

@edenhaus
Copy link
Member

edenhaus commented Apr 3, 2025

As I don't have the model, I cannot test and ensure it works correctly. Sometimes, Ecovacs changes the API from one model to the other one, and therefore, we cannot make assumptions.

You can search for a similar model in the code base and then try to determine whether that one works, but you may need to modify it slightly.
Please be aware that Ecovacs it not sharing anything with this project and so it takes some time until new models are supported. Any contribution is welcome

@STRHOME
Copy link

STRHOME commented Apr 9, 2025

My model is DEEBOT X8 PRO PLUS AI(In China). Is it similar to X5 Pro Omini (lr4qcs. py). If they are similar, may I ask how to create a symbolic link between the model and similar models, and how to operate it specifically? Please guide me, thank you!

@LeoDevop
Copy link

LeoDevop commented Apr 9, 2025

@STRHOME i managed to link X5, X2 and many others to see in my dev box. While a lot of the sensors and functions worked the "Start Cleaning" button and start always threw up this error in the logs.

`Logger: deebot_client.commands.json.common
Source: components/ecovacs/vacuum.py:341
First occurred: April 4, 2025 at 9:04:19 PM (2 occurrences)
Last logged: April 4, 2025 at 9:04:21 PM

Command "clean" was not successfully. body={'code': 20003, 'msg': 'rcp not support'}`

@STRHOME
Copy link

STRHOME commented Apr 9, 2025

@LeoDevop May I ask how you linked and do you have detailed steps? thank you!

@slflowfoon
Copy link

slflowfoon commented Apr 16, 2025

Writing a python script using CleanV2 instructs the robovac to start cleaning but first copy p1jij8.py and rename as n0vyif.py within deebot_client/hardware/deebot/:

cp p1jij8.py n0vyif.py
import aiohttp
import asyncio
import logging
import time

from deebot_client.api_client import ApiClient
from deebot_client.authentication import Authenticator, create_rest_config
from deebot_client.commands.json.clean import CleanAction, CleanV2
from deebot_client.events import BatteryEvent
from deebot_client.mqtt_client import MqttClient, create_mqtt_config
from deebot_client.util import md5
from deebot_client.device import Device

device_id = md5(str(time.time()))
account_id = "your email or phonenumber (cn)"
password_hash = md5("yourPassword")
country = "DE"


async def main():
  async with aiohttp.ClientSession() as session:
    logging.basicConfig(level=logging.DEBUG)
    rest_config = create_rest_config(session, device_id=device_id, alpha_2_country=country)

    authenticator = Authenticator(rest_config, account_id, password_hash)
    api_client = ApiClient(authenticator)

    devices_ = await api_client.get_devices()

    bot = Device(devices_.mqtt[0], authenticator)

    mqtt_config = create_mqtt_config(device_id=device_id, country=country)
    mqtt = MqttClient(mqtt_config, authenticator)
    await bot.initialize(mqtt)

    # Execute commands
    await bot.execute_command(CleanV2(CleanAction.START))

if __name__ == '__main__':
  loop = asyncio.get_event_loop()
  loop.create_task(main())
  loop.run_forever()

So far, I've been able to find that the following commands work:
Cleaning Mode:

await bot.execute_command(SetWorkMode(WorkMode.MOP_AFTER_VACUUM))

[<WorkMode.VACUUM_AND_MOP: 0>, <WorkMode.VACUUM: 1>, <WorkMode.MOP: 2>, <WorkMode.MOP_AFTER_VACUUM: 3>]

Suction Power:

await bot.execute_command(SetFanSpeed(FanSpeedLevel.MAX_PLUS))

[<FanSpeedLevel.QUIET: 1000>, <FanSpeedLevel.NORMAL: 0>, <FanSpeedLevel.MAX: 1>, <FanSpeedLevel.MAX_PLUS: 2>]

Cleaning Passes:

await bot.execute_command(SetCleanCount(1))

[<1>, <2>]

Start Cleaning:

await bot.execute_command(CleanV2(CleanAction.START))

Maybe someone with a big more Python knowledge can implement these:
Water Flow Rate: customAmount appears to be the set value

Topic: iot/atr/onWaterInfo/<did>/n0vyif/N77sTJy1/j
Payload:
{"body":{"data":{"customAmount":10,"enable":1,"mopCount":2,"sideMop":0,"sweepType":1,"type":1}},"header":{"fwVer":"1.101.0","hwVer":"0.1.1","pri":1,"ts":"1744734574192","tzm":480,"ver":"0.0.1","wkVer":"0.1.54"}}

Cleaning Speed:

Topic: iot/atr/onCustomAreaMode/<did>/n0vyif/N77sTJy1/j
Payload:
{"body":{"data":{"sweepMode":1}},"header":{"fwVer":"1.101.0","hwVer":"0.1.1","pri":1,"ts":"1744734272721","tzm":480,"ver":"0.0.1","wkVer":"0.1.54"}}

I've been able to implement room clean and scenario clean by adding the following to models.py under CleanMode (L83):

    FREE_CLEAN = "freeClean"
    SCENARIO_CLEAN = "qcClean"
    await bot.execute_command(CleanAreaV2(CleanMode.FREE_CLEAN, "1,0"))
    await bot.execute_command(CleanAreaV2(CleanMode.SCENARIO_CLEAN, "5638"))

If you add the below to mqtt_client.py under line 248, then when you make a request from your app. you can see the value for each room or scenario:

        _LOGGER.info("FULL MQTT MESSAGE:\nTopic: %s\nPayload:\n%s", message.topic, message.payload.decode("utf-8", errors="replace"))
        self._last_message_received_at = datetime.now()

For example, freeClean, 1.3 is to clean my Living Room:

{"body":{"data":{"act":"start","content":{"type":"freeClean","value":"1,3"}}},"header":{"channel":"Android","m":"request","pri":2,"reqid":"FhY7rH","ts":"1744735616838","tzc":"Europe/London","tzm":60,"ver":"0.0.22"}}

qcClean, 5395 is to start a scenario:

{"body":{"data":{"content":{"type":"qcClean","value":"5395"},"act":"start"}},"header":{"channel":"Android","m":"request","pri":2,"reqid":"8XEXbC","ts":"1744822549783","tzc":"Europe/London","tzm":60,"ver":"0.0.22"}}

Also added the below to models.py below line 73 to stop and return the robovac to the station:

    STOP_AND_RETURN = "stop_and_return"

Will continue to update this as I discover more.

Note: I'm no expert in this - just crashing my way through!

@brstgt
Copy link

brstgt commented May 20, 2025

Are there any news on this? I also cant wait for this model to be supported 👼

@socke-ber
Copy link

Hi,
I have the Deebot X80 Omni (without PRO)
I presume the integration might be quite similar to the pro model, so I don't think a separate ticket needed for this.
I am looking really forward for this integration.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

9 participants