2025-03-05 10:27:47 +08:00
|
|
|
|
科沃斯ID:ECJ3FLME
|
2025-02-06 20:28:43 +08:00
|
|
|
|
|
2025-03-05 10:27:47 +08:00
|
|
|
|
# fix HA不出现实体的问题
|
|
|
|
|
- https://bbs.hassbian.com/thread-27784-1-1.html
|
|
|
|
|
- https://bbs.hassbian.com/thread-28408-1-1.html
|
|
|
|
|
|
|
|
|
|
1. 进入容器的CMD
|
|
|
|
|
2. cd /usr/local/lib/python3.13/site-packages/deebot_client/hardware/deebot
|
|
|
|
|
3. ln -svfT lr4qcs.py 3sp2in.py
|
|
|
|
|
|
2025-03-05 11:43:13 +08:00
|
|
|
|
删除 rm -rf 3sp2in.py
|
|
|
|
|
|
|
|
|
|
- https://mitmproxy.org/
|
|
|
|
|
- 【mitmproxy抓包工具!!! 从安装到简单使用】 https://www.bilibili.com/video/BV1UC4y1t7EL/?share_source=copy_web&vd_source=fe8142e8e12816535feaeabd6f6cdc8e
|
|
|
|
|
- IOS使用MitmProxy
|
|
|
|
|
- https://www.jianshu.com/p/498073a8971f
|
|
|
|
|
- https://hachibye.medium.com/%E4%BB%A5mitmproxy%E7%8D%B2%E5%8F%96%E6%89%8B%E6%A9%9F%E6%95%B8%E6%93%9A%E5%B0%81%E5%8C%85-9870f6507b63
|
|
|
|
|
|
2025-03-06 17:20:40 +08:00
|
|
|
|
https://github.com/DeebotUniverse/client.py/issues/492
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
<redacted>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
# In HA my X5 Pro did'nt accept cleaning commands (rcp not support error)
|
|
|
|
|
# Command Json
|
|
|
|
|
Start
|
|
|
|
|
https://api-ngiot.dc-cn.cn.ecouser.net/api/iot/endpoint/control?si=6btMpMAS6PhZrX3D&ct=q&eid=9b7f3e00-3bea-4354-9ba8-b0dc9ceb6e0e&et=3sp2in&er=96uOLWSM&apn=clean_V2&fmt=j
|
|
|
|
|
{"body":{"data":{"act":"start","content":{"type":"auto"}}},"header":{"channel":"iOS","reqid":"RIzVHS","ts":"1741248430546","ver":"0.0.50","m":"request","pri":1,"tzm":480,"tzc":"Asia\/Shanghai"}}
|
|
|
|
|
|
|
|
|
|
Pause
|
|
|
|
|
https://api-ngiot.dc-cn.cn.ecouser.net/api/iot/endpoint/control?si=EKptJpQmzpbr4rKF&ct=q&eid=9b7f3e00-3bea-4354-9ba8-b0dc9ceb6e0e&et=3sp2in&er=96uOLWSM&apn=clean_V2&fmt=j
|
|
|
|
|
{"body":{"data":{"act":"pause"}},"header":{"channel":"iOS","reqid":"yepkRW","ts":"1741248436662","ver":"0.0.50","m":"request","pri":1,"tzm":480,"tzc":"Asia\/Shanghai"}}
|
|
|
|
|
|
|
|
|
|
Resume
|
|
|
|
|
https://api-ngiot.dc-cn.cn.ecouser.net/api/iot/endpoint/control?si=6hYStayiak272hKX&ct=q&eid=9b7f3e00-3bea-4354-9ba8-b0dc9ceb6e0e&et=3sp2in&er=96uOLWSM&apn=clean_V2&fmt=j
|
|
|
|
|
{"body":{"data":{"act":"resume"}},"header":{"channel":"iOS","reqid":"nYtIgx","ts":"1741248438194","ver":"0.0.50","m":"request","pri":1,"tzm":480,"tzc":"Asia\/Shanghai"}}
|
|
|
|
|
|
|
|
|
|
Stop
|
|
|
|
|
https://api-ngiot.dc-cn.cn.ecouser.net/api/iot/endpoint/control?si=kSFXbynehrfkNWEK&ct=q&eid=9b7f3e00-3bea-4354-9ba8-b0dc9ceb6e0e&et=3sp2in&er=96uOLWSM&apn=clean_V2&fmt=j
|
|
|
|
|
{"body":{"data":{"act":"stop"}},"header":{"channel":"iOS","reqid":"EiLUjr","ts":"1741248516782","ver":"0.0.50","m":"request","pri":1,"tzm":480,"tzc":"Asia\/Shanghai"}}
|
|
|
|
|
|
|
|
|
|
AI Clean Start
|
|
|
|
|
https://api-ngiot.dc-cn.cn.ecouser.net/api/iot/endpoint/control?si=trfmKfcdAKwWaRim&ct=q&eid=9b7f3e00-3bea-4354-9ba8-b0dc9ceb6e0e&et=3sp2in&er=96uOLWSM&apn=clean_V2&fmt=j
|
|
|
|
|
{"body":{"data":{"act":"start","content":{"type":"entrust"}}},"header":{"channel":"iOS","reqid":"pSKuSb","ts":"1741249424264","ver":"0.0.50","m":"request","pri":1,"tzm":480,"tzc":"Asia\/Shanghai"}}
|
|
|
|
|
|
|
|
|
|
Charge
|
|
|
|
|
https://api-ngiot.dc-cn.cn.ecouser.net/api/iot/endpoint/control?si=JC4G5mYJnMHaA6mR&ct=q&eid=9b7f3e00-3bea-4354-9ba8-b0dc9ceb6e0e&et=3sp2in&er=96uOLWSM&apn=charge&fmt=j
|
|
|
|
|
{"body":{"data":{"act":"go"}},"header":{"channel":"iOS","reqid":"GDJHxj","ts":"1741249495751","ver":"0.0.50","m":"request","pri":1,"tzm":480,"tzc":"Asia\/Shanghai"}}
|
|
|
|
|
|
|
|
|
|
This is a single room vacuum only:
|
|
|
|
|
https://api-ngiot.dc-cn.cn.ecouser.net/api/iot/endpoint/control?si=NM7kXnJYG2mszmwY&ct=q&eid=9b7f3e00-3bea-4354-9ba8-b0dc9ceb6e0e&et=3sp2in&er=96uOLWSM&apn=clean_V2&fmt=j
|
2025-05-03 18:44:51 +08:00
|
|
|
|
{"body":{"data":{"act":"start","content":{"type":"freeClean","value":"1,0"}}},"header":{"channel":"iOS","reqid":"MMTIad","ts":"1741249568936","ver":"0.0.50","m":"request","pri":1,"tzm":480,"tzc":"Asia\/Shanghai"}}
|
|
|
|
|
|
|
|
|
|
|
2025-05-03 19:18:20 +08:00
|
|
|
|
# Add Deebot X5 Pro Omni 提交
|
2025-05-03 18:44:51 +08:00
|
|
|
|
相关的Git提交:
|
|
|
|
|
https://github.com/DeebotUniverse/client.py/pull/659/commits/da52c671ce544c21b6753b380148f93f8dadc6e5#diff-a5514fb587b325f41e547af3e94ae3470a2366bef25dd8b5ae5842fc25328bc0
|
|
|
|
|
|
2025-05-03 19:18:20 +08:00
|
|
|
|
- lr4qcs.py:p1jij8.py
|
|
|
|
|
- p1jij8.py
|
|
|
|
|
## p1jij8.py
|
|
|
|
|
```c++
|
|
|
|
|
"""Deebot T20 Omni Capabilities."""
|
|
|
|
|
|
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
from deebot_client.capabilities import (
|
|
|
|
|
Capabilities,
|
|
|
|
|
CapabilityClean,
|
|
|
|
|
CapabilityCleanAction,
|
|
|
|
|
CapabilityCustomCommand,
|
|
|
|
|
CapabilityEvent,
|
|
|
|
|
CapabilityExecute,
|
|
|
|
|
CapabilityLifeSpan,
|
|
|
|
|
CapabilityMap,
|
|
|
|
|
CapabilitySet,
|
|
|
|
|
CapabilitySetEnable,
|
|
|
|
|
CapabilitySettings,
|
|
|
|
|
CapabilitySetTypes,
|
|
|
|
|
CapabilityStats,
|
|
|
|
|
CapabilityWater,
|
|
|
|
|
DeviceType,
|
|
|
|
|
)
|
|
|
|
|
from deebot_client.commands.json.advanced_mode import GetAdvancedMode, SetAdvancedMode
|
|
|
|
|
from deebot_client.commands.json.battery import GetBattery
|
|
|
|
|
from deebot_client.commands.json.carpet import (
|
|
|
|
|
GetCarpetAutoFanBoost,
|
|
|
|
|
SetCarpetAutoFanBoost,
|
|
|
|
|
)
|
|
|
|
|
from deebot_client.commands.json.charge import Charge
|
|
|
|
|
from deebot_client.commands.json.charge_state import GetChargeState
|
|
|
|
|
from deebot_client.commands.json.clean import Clean, CleanArea, GetCleanInfo
|
|
|
|
|
from deebot_client.commands.json.clean_count import GetCleanCount, SetCleanCount
|
|
|
|
|
from deebot_client.commands.json.clean_logs import GetCleanLogs
|
|
|
|
|
from deebot_client.commands.json.clean_preference import (
|
|
|
|
|
GetCleanPreference,
|
|
|
|
|
SetCleanPreference,
|
|
|
|
|
)
|
|
|
|
|
from deebot_client.commands.json.continuous_cleaning import (
|
|
|
|
|
GetContinuousCleaning,
|
|
|
|
|
SetContinuousCleaning,
|
|
|
|
|
)
|
|
|
|
|
from deebot_client.commands.json.custom import CustomCommand
|
|
|
|
|
from deebot_client.commands.json.error import GetError
|
|
|
|
|
from deebot_client.commands.json.fan_speed import GetFanSpeed, SetFanSpeed
|
|
|
|
|
from deebot_client.commands.json.life_span import GetLifeSpan, ResetLifeSpan
|
|
|
|
|
from deebot_client.commands.json.map import (
|
|
|
|
|
GetCachedMapInfo,
|
|
|
|
|
GetMajorMap,
|
|
|
|
|
GetMapTrace,
|
|
|
|
|
GetMinorMap,
|
|
|
|
|
)
|
|
|
|
|
from deebot_client.commands.json.multimap_state import (
|
|
|
|
|
GetMultimapState,
|
|
|
|
|
SetMultimapState,
|
|
|
|
|
)
|
|
|
|
|
from deebot_client.commands.json.network import GetNetInfo
|
|
|
|
|
from deebot_client.commands.json.play_sound import PlaySound
|
|
|
|
|
from deebot_client.commands.json.pos import GetPos
|
|
|
|
|
from deebot_client.commands.json.relocation import SetRelocationState
|
|
|
|
|
from deebot_client.commands.json.stats import GetStats, GetTotalStats
|
|
|
|
|
from deebot_client.commands.json.true_detect import GetTrueDetect, SetTrueDetect
|
|
|
|
|
from deebot_client.commands.json.volume import GetVolume, SetVolume
|
|
|
|
|
from deebot_client.commands.json.water_info import GetWaterInfo, SetWaterInfo
|
|
|
|
|
from deebot_client.commands.json.work_mode import GetWorkMode, SetWorkMode
|
|
|
|
|
from deebot_client.const import DataType
|
|
|
|
|
from deebot_client.events import (
|
|
|
|
|
AdvancedModeEvent,
|
|
|
|
|
AvailabilityEvent,
|
|
|
|
|
BatteryEvent,
|
|
|
|
|
CachedMapInfoEvent,
|
|
|
|
|
CarpetAutoFanBoostEvent,
|
|
|
|
|
CleanCountEvent,
|
|
|
|
|
CleanLogEvent,
|
|
|
|
|
CleanPreferenceEvent,
|
|
|
|
|
ContinuousCleaningEvent,
|
|
|
|
|
CustomCommandEvent,
|
|
|
|
|
ErrorEvent,
|
|
|
|
|
FanSpeedEvent,
|
|
|
|
|
FanSpeedLevel,
|
|
|
|
|
LifeSpan,
|
|
|
|
|
LifeSpanEvent,
|
|
|
|
|
MajorMapEvent,
|
|
|
|
|
MapChangedEvent,
|
|
|
|
|
MapTraceEvent,
|
|
|
|
|
MultimapStateEvent,
|
|
|
|
|
NetworkInfoEvent,
|
|
|
|
|
PositionsEvent,
|
|
|
|
|
ReportStatsEvent,
|
|
|
|
|
RoomsEvent,
|
|
|
|
|
StateEvent,
|
|
|
|
|
StatsEvent,
|
|
|
|
|
TotalStatsEvent,
|
|
|
|
|
TrueDetectEvent,
|
|
|
|
|
VolumeEvent,
|
|
|
|
|
WorkMode,
|
|
|
|
|
WorkModeEvent,
|
|
|
|
|
water_info,
|
|
|
|
|
)
|
|
|
|
|
from deebot_client.models import StaticDeviceInfo
|
|
|
|
|
from deebot_client.util import short_name
|
|
|
|
|
|
|
|
|
|
from . import DEVICES
|
|
|
|
|
|
|
|
|
|
DEVICES[short_name(__name__)] = StaticDeviceInfo(
|
|
|
|
|
DataType.JSON,
|
|
|
|
|
Capabilities(
|
|
|
|
|
device_type=DeviceType.VACUUM,
|
|
|
|
|
availability=CapabilityEvent(
|
|
|
|
|
AvailabilityEvent, [GetBattery(is_available_check=True)]
|
|
|
|
|
),
|
|
|
|
|
battery=CapabilityEvent(BatteryEvent, [GetBattery()]),
|
|
|
|
|
charge=CapabilityExecute(Charge),
|
|
|
|
|
clean=CapabilityClean(
|
|
|
|
|
action=CapabilityCleanAction(command=Clean, area=CleanArea),
|
|
|
|
|
continuous=CapabilitySetEnable(
|
|
|
|
|
ContinuousCleaningEvent,
|
|
|
|
|
[GetContinuousCleaning()],
|
|
|
|
|
SetContinuousCleaning,
|
|
|
|
|
),
|
|
|
|
|
count=CapabilitySet(CleanCountEvent, [GetCleanCount()], SetCleanCount),
|
|
|
|
|
log=CapabilityEvent(CleanLogEvent, [GetCleanLogs()]),
|
|
|
|
|
preference=CapabilitySetEnable(
|
|
|
|
|
CleanPreferenceEvent, [GetCleanPreference()], SetCleanPreference
|
|
|
|
|
),
|
|
|
|
|
work_mode=CapabilitySetTypes(
|
|
|
|
|
event=WorkModeEvent,
|
|
|
|
|
get=[GetWorkMode()],
|
|
|
|
|
set=SetWorkMode,
|
|
|
|
|
types=(
|
|
|
|
|
WorkMode.MOP,
|
|
|
|
|
WorkMode.MOP_AFTER_VACUUM,
|
|
|
|
|
WorkMode.VACUUM,
|
|
|
|
|
WorkMode.VACUUM_AND_MOP,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
custom=CapabilityCustomCommand(
|
|
|
|
|
event=CustomCommandEvent, get=[], set=CustomCommand
|
|
|
|
|
),
|
|
|
|
|
error=CapabilityEvent(ErrorEvent, [GetError()]),
|
|
|
|
|
fan_speed=CapabilitySetTypes(
|
|
|
|
|
event=FanSpeedEvent,
|
|
|
|
|
get=[GetFanSpeed()],
|
|
|
|
|
set=SetFanSpeed,
|
|
|
|
|
types=(
|
|
|
|
|
FanSpeedLevel.QUIET,
|
|
|
|
|
FanSpeedLevel.NORMAL,
|
|
|
|
|
FanSpeedLevel.MAX,
|
|
|
|
|
FanSpeedLevel.MAX_PLUS,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
life_span=CapabilityLifeSpan(
|
|
|
|
|
types=(LifeSpan.BRUSH, LifeSpan.FILTER, LifeSpan.SIDE_BRUSH),
|
|
|
|
|
event=LifeSpanEvent,
|
|
|
|
|
get=[GetLifeSpan([LifeSpan.BRUSH, LifeSpan.FILTER, LifeSpan.SIDE_BRUSH])],
|
|
|
|
|
reset=ResetLifeSpan,
|
|
|
|
|
),
|
|
|
|
|
map=CapabilityMap(
|
|
|
|
|
cached_info=CapabilityEvent(CachedMapInfoEvent, [GetCachedMapInfo()]),
|
|
|
|
|
changed=CapabilityEvent(MapChangedEvent, []),
|
|
|
|
|
major=CapabilityEvent(MajorMapEvent, [GetMajorMap()]),
|
|
|
|
|
minor=CapabilityExecute(GetMinorMap),
|
|
|
|
|
multi_state=CapabilitySetEnable(
|
|
|
|
|
MultimapStateEvent, [GetMultimapState()], SetMultimapState
|
|
|
|
|
),
|
|
|
|
|
position=CapabilityEvent(PositionsEvent, [GetPos()]),
|
|
|
|
|
relocation=CapabilityExecute(SetRelocationState),
|
|
|
|
|
rooms=CapabilityEvent(RoomsEvent, [GetCachedMapInfo()]),
|
|
|
|
|
trace=CapabilityEvent(MapTraceEvent, [GetMapTrace()]),
|
|
|
|
|
),
|
|
|
|
|
network=CapabilityEvent(NetworkInfoEvent, [GetNetInfo()]),
|
|
|
|
|
play_sound=CapabilityExecute(PlaySound),
|
|
|
|
|
settings=CapabilitySettings(
|
|
|
|
|
advanced_mode=CapabilitySetEnable(
|
|
|
|
|
AdvancedModeEvent, [GetAdvancedMode()], SetAdvancedMode
|
|
|
|
|
),
|
|
|
|
|
carpet_auto_fan_boost=CapabilitySetEnable(
|
|
|
|
|
CarpetAutoFanBoostEvent,
|
|
|
|
|
[GetCarpetAutoFanBoost()],
|
|
|
|
|
SetCarpetAutoFanBoost,
|
|
|
|
|
),
|
|
|
|
|
true_detect=CapabilitySetEnable(
|
|
|
|
|
TrueDetectEvent, [GetTrueDetect()], SetTrueDetect
|
|
|
|
|
),
|
|
|
|
|
volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume),
|
|
|
|
|
),
|
|
|
|
|
state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfo()]),
|
|
|
|
|
stats=CapabilityStats(
|
|
|
|
|
clean=CapabilityEvent(StatsEvent, [GetStats()]),
|
|
|
|
|
report=CapabilityEvent(ReportStatsEvent, []),
|
|
|
|
|
total=CapabilityEvent(TotalStatsEvent, [GetTotalStats()]),
|
|
|
|
|
),
|
|
|
|
|
water=CapabilityWater(
|
|
|
|
|
amount=CapabilitySetTypes(
|
|
|
|
|
event=water_info.WaterAmountEvent,
|
|
|
|
|
get=[GetWaterInfo()],
|
|
|
|
|
set=SetWaterInfo,
|
|
|
|
|
types=(
|
|
|
|
|
water_info.WaterAmount.LOW,
|
|
|
|
|
water_info.WaterAmount.MEDIUM,
|
|
|
|
|
water_info.WaterAmount.HIGH,
|
|
|
|
|
water_info.WaterAmount.ULTRAHIGH,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
mop_attached=CapabilityEvent(water_info.MopAttachedEvent, [GetWaterInfo()]),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
```
|