Skip to content

Commit 46a6e81

Browse files
authored
Add support for X9 Pro Omni (ilt3k8) (#1102)
1 parent 1afa0df commit 46a6e81

File tree

2 files changed

+240
-0
lines changed

2 files changed

+240
-0
lines changed

deebot_client/events/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ class LifeSpan(StrEnumWithXml):
148148
HAND_FILTER = "handFilter", "HandFilter"
149149
DUST_CASE_HEAP = "dustCaseHeap", "DustCaseHeap"
150150
STATION_FILTER = "spHeap", "SpHeap"
151+
WATER_SINK = "waterSink", "WaterSink"
151152

152153

153154
@dataclass(frozen=True)
Lines changed: 239 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,239 @@
1+
"""DEEBOT X9 PRO OMNI Capabilities."""
2+
3+
from __future__ import annotations
4+
5+
from deebot_client.capabilities import (
6+
Capabilities,
7+
CapabilityClean,
8+
CapabilityCleanAction,
9+
CapabilityCustomCommand,
10+
CapabilityEvent,
11+
CapabilityExecute,
12+
CapabilityExecuteTypes,
13+
CapabilityLifeSpan,
14+
CapabilitySet,
15+
CapabilitySetEnable,
16+
CapabilitySettings,
17+
CapabilitySetTypes,
18+
CapabilityStation,
19+
CapabilityStats,
20+
DeviceType,
21+
)
22+
from deebot_client.commands import StationAction
23+
from deebot_client.commands.json import (
24+
station_action,
25+
)
26+
from deebot_client.commands.json.advanced_mode import GetAdvancedMode, SetAdvancedMode
27+
from deebot_client.commands.json.auto_empty import GetAutoEmpty, SetAutoEmpty
28+
from deebot_client.commands.json.battery import GetBattery
29+
from deebot_client.commands.json.carpet import (
30+
GetCarpetAutoFanBoost,
31+
SetCarpetAutoFanBoost,
32+
)
33+
from deebot_client.commands.json.charge import Charge
34+
from deebot_client.commands.json.charge_state import GetChargeState
35+
from deebot_client.commands.json.child_lock import GetChildLock, SetChildLock
36+
from deebot_client.commands.json.clean import (
37+
CleanArea,
38+
CleanV2,
39+
GetCleanInfoV2,
40+
)
41+
from deebot_client.commands.json.clean_count import GetCleanCount, SetCleanCount
42+
from deebot_client.commands.json.clean_logs import GetCleanLogs
43+
from deebot_client.commands.json.continuous_cleaning import (
44+
GetContinuousCleaning,
45+
SetContinuousCleaning,
46+
)
47+
from deebot_client.commands.json.custom import CustomCommand
48+
from deebot_client.commands.json.efficiency import GetEfficiencyMode, SetEfficiencyMode
49+
from deebot_client.commands.json.error import GetError
50+
from deebot_client.commands.json.fan_speed import GetFanSpeed, SetFanSpeed
51+
from deebot_client.commands.json.life_span import GetLifeSpan, ResetLifeSpan
52+
from deebot_client.commands.json.network import GetNetInfo
53+
from deebot_client.commands.json.ota import GetOta, SetOta
54+
from deebot_client.commands.json.play_sound import PlaySound
55+
from deebot_client.commands.json.station_state import GetStationState
56+
from deebot_client.commands.json.stats import GetStats, GetTotalStats
57+
from deebot_client.commands.json.sweep_mode import GetSweepMode, SetSweepMode
58+
from deebot_client.commands.json.voice_assistant_state import (
59+
GetVoiceAssistantState,
60+
SetVoiceAssistantState,
61+
)
62+
from deebot_client.commands.json.volume import GetVolume, SetVolume
63+
from deebot_client.commands.json.work_mode import GetWorkMode, SetWorkMode
64+
from deebot_client.const import DataType
65+
from deebot_client.events import (
66+
AdvancedModeEvent,
67+
AvailabilityEvent,
68+
BatteryEvent,
69+
CarpetAutoFanBoostEvent,
70+
ChildLockEvent,
71+
CleanCountEvent,
72+
CleanLogEvent,
73+
ContinuousCleaningEvent,
74+
CustomCommandEvent,
75+
EfficiencyModeEvent,
76+
ErrorEvent,
77+
FanSpeedEvent,
78+
FanSpeedLevel,
79+
LifeSpan,
80+
LifeSpanEvent,
81+
NetworkInfoEvent,
82+
OtaEvent,
83+
ReportStatsEvent,
84+
StateEvent,
85+
StationEvent,
86+
StatsEvent,
87+
SweepModeEvent,
88+
TotalStatsEvent,
89+
VoiceAssistantStateEvent,
90+
VolumeEvent,
91+
WorkMode,
92+
WorkModeEvent,
93+
auto_empty,
94+
)
95+
from deebot_client.events.auto_empty import AutoEmptyEvent
96+
from deebot_client.events.efficiency_mode import EfficiencyMode
97+
from deebot_client.models import StaticDeviceInfo
98+
from deebot_client.util import short_name
99+
100+
from . import DEVICES
101+
102+
DEVICES[short_name(__name__)] = StaticDeviceInfo(
103+
DataType.JSON,
104+
Capabilities(
105+
device_type=DeviceType.VACUUM,
106+
availability=CapabilityEvent(
107+
AvailabilityEvent, [GetBattery(is_available_check=True)]
108+
),
109+
battery=CapabilityEvent(BatteryEvent, [GetBattery()]),
110+
charge=CapabilityExecute(Charge),
111+
clean=CapabilityClean(
112+
action=CapabilityCleanAction(command=CleanV2, area=CleanArea),
113+
continuous=CapabilitySetEnable(
114+
ContinuousCleaningEvent,
115+
[GetContinuousCleaning()],
116+
SetContinuousCleaning,
117+
),
118+
count=CapabilitySet(CleanCountEvent, [GetCleanCount()], SetCleanCount),
119+
log=CapabilityEvent(CleanLogEvent, [GetCleanLogs()]),
120+
work_mode=CapabilitySetTypes(
121+
event=WorkModeEvent,
122+
get=[GetWorkMode()],
123+
set=SetWorkMode,
124+
types=(
125+
WorkMode.MOP_AFTER_VACUUM,
126+
WorkMode.VACUUM,
127+
WorkMode.VACUUM_AND_MOP,
128+
),
129+
),
130+
),
131+
custom=CapabilityCustomCommand(
132+
event=CustomCommandEvent, get=[], set=CustomCommand
133+
),
134+
error=CapabilityEvent(ErrorEvent, [GetError()]),
135+
fan_speed=CapabilitySetTypes(
136+
event=FanSpeedEvent,
137+
get=[GetFanSpeed()],
138+
set=SetFanSpeed,
139+
types=(
140+
FanSpeedLevel.QUIET,
141+
FanSpeedLevel.NORMAL,
142+
FanSpeedLevel.MAX,
143+
FanSpeedLevel.MAX_PLUS,
144+
),
145+
),
146+
life_span=CapabilityLifeSpan(
147+
types=(
148+
LifeSpan.BRUSH,
149+
LifeSpan.CLEANING_SOLUTION,
150+
LifeSpan.DUST_BAG,
151+
LifeSpan.HAND_FILTER,
152+
LifeSpan.FILTER, # heap
153+
LifeSpan.ROUND_MOP,
154+
LifeSpan.SEWAGE_BOX,
155+
LifeSpan.SIDE_BRUSH,
156+
LifeSpan.STRAINER,
157+
LifeSpan.UNIT_CARE,
158+
LifeSpan.WATER_SINK,
159+
),
160+
event=LifeSpanEvent,
161+
get=[
162+
GetLifeSpan(
163+
[
164+
LifeSpan.BRUSH,
165+
LifeSpan.CLEANING_SOLUTION,
166+
LifeSpan.DUST_BAG,
167+
LifeSpan.HAND_FILTER,
168+
LifeSpan.FILTER, # heap
169+
LifeSpan.ROUND_MOP,
170+
LifeSpan.SEWAGE_BOX,
171+
LifeSpan.SIDE_BRUSH,
172+
LifeSpan.STRAINER,
173+
LifeSpan.UNIT_CARE,
174+
LifeSpan.WATER_SINK,
175+
]
176+
)
177+
],
178+
reset=ResetLifeSpan,
179+
),
180+
# TODO: add map once we get a working implementation
181+
network=CapabilityEvent(NetworkInfoEvent, [GetNetInfo()]),
182+
play_sound=CapabilityExecute(PlaySound),
183+
settings=CapabilitySettings(
184+
advanced_mode=CapabilitySetEnable(
185+
AdvancedModeEvent, [GetAdvancedMode()], SetAdvancedMode
186+
),
187+
carpet_auto_fan_boost=CapabilitySetEnable(
188+
CarpetAutoFanBoostEvent,
189+
[GetCarpetAutoFanBoost()],
190+
SetCarpetAutoFanBoost,
191+
),
192+
child_lock=CapabilitySetEnable(
193+
ChildLockEvent, [GetChildLock()], SetChildLock
194+
),
195+
efficiency_mode=CapabilitySetTypes(
196+
event=EfficiencyModeEvent,
197+
get=[GetEfficiencyMode()],
198+
set=SetEfficiencyMode,
199+
types=(
200+
EfficiencyMode.ENERGY_EFFICIENT_MODE,
201+
EfficiencyMode.STANDARD_MODE,
202+
),
203+
),
204+
ota=CapabilitySetEnable(OtaEvent, [GetOta()], SetOta),
205+
sweep_mode=CapabilitySetEnable(
206+
SweepModeEvent, [GetSweepMode()], SetSweepMode
207+
),
208+
voice_assistant=CapabilitySetEnable(
209+
VoiceAssistantStateEvent,
210+
[GetVoiceAssistantState()],
211+
SetVoiceAssistantState,
212+
),
213+
volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume),
214+
# TODO: add true detect once the implementation supports the 'level' attribute
215+
),
216+
state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfoV2()]),
217+
station=CapabilityStation(
218+
action=CapabilityExecuteTypes(
219+
station_action.StationAction, types=(StationAction.EMPTY_DUSTBIN,)
220+
),
221+
auto_empty=CapabilitySetTypes(
222+
event=AutoEmptyEvent,
223+
get=[GetAutoEmpty()],
224+
set=SetAutoEmpty,
225+
types=(
226+
auto_empty.Frequency.AUTO,
227+
auto_empty.Frequency.SMART,
228+
),
229+
),
230+
state=CapabilityEvent(StationEvent, [GetStationState()]),
231+
),
232+
stats=CapabilityStats(
233+
clean=CapabilityEvent(StatsEvent, [GetStats()]),
234+
report=CapabilityEvent(ReportStatsEvent, []),
235+
total=CapabilityEvent(TotalStatsEvent, [GetTotalStats()]),
236+
),
237+
# TODO add water once https://github.com/DeebotUniverse/client.py/pull/1100 is merged
238+
),
239+
)

0 commit comments

Comments
 (0)