Skip to content

Commit f6fbd9d

Browse files
Qmo37claude
andauthored
Add support for Yeedi Floor 3 Station (kd0una) (#1472)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: Qmo37 <Qmo37@users.noreply.github.com>
1 parent 1632562 commit f6fbd9d

1 file changed

Lines changed: 243 additions & 0 deletions

File tree

deebot_client/hardware/kd0una.py

Lines changed: 243 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
1+
"""Yeedi Floor 3 Station Capabilities."""
2+
3+
from __future__ import annotations
4+
5+
from deebot_client import commands
6+
from deebot_client.capabilities import (
7+
Capabilities,
8+
CapabilityClean,
9+
CapabilityCleanAction,
10+
CapabilityCustomCommand,
11+
CapabilityEvent,
12+
CapabilityExecute,
13+
CapabilityExecuteTypes,
14+
CapabilityLifeSpan,
15+
CapabilityMap,
16+
CapabilityNumber,
17+
CapabilitySet,
18+
CapabilitySetEnable,
19+
CapabilitySettings,
20+
CapabilitySetTypes,
21+
CapabilityStation,
22+
CapabilityStats,
23+
CapabilityWater,
24+
DeviceType,
25+
)
26+
from deebot_client.commands.json import station_action
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 Clean, CleanArea, GetCleanInfo
37+
from deebot_client.commands.json.clean_count import GetCleanCount, SetCleanCount
38+
from deebot_client.commands.json.clean_preference import (
39+
GetCleanPreference,
40+
SetCleanPreference,
41+
)
42+
from deebot_client.commands.json.continuous_cleaning import (
43+
GetContinuousCleaning,
44+
SetContinuousCleaning,
45+
)
46+
from deebot_client.commands.json.custom import CustomCommand
47+
from deebot_client.commands.json.error import GetError
48+
from deebot_client.commands.json.fan_speed import GetFanSpeed, SetFanSpeed
49+
from deebot_client.commands.json.life_span import GetLifeSpan, ResetLifeSpan
50+
from deebot_client.commands.json.map import (
51+
GetCachedMapInfo,
52+
GetMajorMap,
53+
GetMapSet,
54+
GetMapTrace,
55+
GetMinorMap,
56+
SetMajorMap,
57+
)
58+
from deebot_client.commands.json.mop_auto_wash_frequency import (
59+
GetMopAutoWashFrequency,
60+
SetMopAutoWashFrequency,
61+
)
62+
from deebot_client.commands.json.multimap_state import (
63+
GetMultimapState,
64+
SetMultimapState,
65+
)
66+
from deebot_client.commands.json.network import GetNetInfo
67+
from deebot_client.commands.json.play_sound import PlaySound
68+
from deebot_client.commands.json.pos import GetPos
69+
from deebot_client.commands.json.relocation import SetRelocationState
70+
from deebot_client.commands.json.station_state import GetStationState
71+
from deebot_client.commands.json.stats import GetStats, GetTotalStats
72+
from deebot_client.commands.json.true_detect import GetTrueDetect, SetTrueDetect
73+
from deebot_client.commands.json.volume import GetVolume, SetVolume
74+
from deebot_client.commands.json.water_info import GetWaterInfo, SetWaterInfo
75+
from deebot_client.const import DataType
76+
from deebot_client.events import (
77+
AutoEmptyEvent,
78+
AvailabilityEvent,
79+
BatteryEvent,
80+
CachedMapInfoEvent,
81+
CarpetAutoFanBoostEvent,
82+
ChildLockEvent,
83+
CleanCountEvent,
84+
CleanPreferenceEvent,
85+
ContinuousCleaningEvent,
86+
CustomCommandEvent,
87+
ErrorEvent,
88+
FanSpeedEvent,
89+
FanSpeedLevel,
90+
LifeSpan,
91+
LifeSpanEvent,
92+
MajorMapEvent,
93+
MapChangedEvent,
94+
MapTraceEvent,
95+
MultimapStateEvent,
96+
NetworkInfoEvent,
97+
PositionsEvent,
98+
ReportStatsEvent,
99+
RoomsEvent,
100+
StateEvent,
101+
StationEvent,
102+
StatsEvent,
103+
TotalStatsEvent,
104+
TrueDetectEvent,
105+
VolumeEvent,
106+
auto_empty,
107+
water_info,
108+
)
109+
from deebot_client.events.mop_auto_wash_frequency import MopAutoWashFrequencyEvent
110+
from deebot_client.models import StaticDeviceInfo
111+
112+
113+
def get_device_info() -> StaticDeviceInfo:
114+
"""Get device info for Yeedi Floor 3 Station (kd0una)."""
115+
return StaticDeviceInfo(
116+
DataType.JSON,
117+
Capabilities(
118+
device_type=DeviceType.VACUUM,
119+
availability=CapabilityEvent(
120+
AvailabilityEvent, [GetBattery(is_available_check=True)]
121+
),
122+
battery=CapabilityEvent(BatteryEvent, [GetBattery()]),
123+
charge=CapabilityExecute(Charge),
124+
clean=CapabilityClean(
125+
action=CapabilityCleanAction(command=Clean, area=CleanArea),
126+
continuous=CapabilitySetEnable(
127+
ContinuousCleaningEvent,
128+
[GetContinuousCleaning()],
129+
SetContinuousCleaning,
130+
),
131+
count=CapabilitySet(CleanCountEvent, [GetCleanCount()], SetCleanCount),
132+
preference=CapabilitySetEnable(
133+
CleanPreferenceEvent, [GetCleanPreference()], SetCleanPreference
134+
),
135+
),
136+
custom=CapabilityCustomCommand(
137+
event=CustomCommandEvent, get=[], set=CustomCommand
138+
),
139+
error=CapabilityEvent(ErrorEvent, [GetError()]),
140+
fan_speed=CapabilitySetTypes(
141+
event=FanSpeedEvent,
142+
get=[GetFanSpeed()],
143+
set=SetFanSpeed,
144+
types=(
145+
FanSpeedLevel.QUIET,
146+
FanSpeedLevel.NORMAL,
147+
FanSpeedLevel.MAX,
148+
FanSpeedLevel.MAX_PLUS,
149+
),
150+
),
151+
life_span=CapabilityLifeSpan(
152+
types=(LifeSpan.BRUSH, LifeSpan.FILTER, LifeSpan.SIDE_BRUSH),
153+
event=LifeSpanEvent,
154+
get=[
155+
GetLifeSpan([LifeSpan.BRUSH, LifeSpan.FILTER, LifeSpan.SIDE_BRUSH])
156+
],
157+
reset=ResetLifeSpan,
158+
),
159+
map=CapabilityMap(
160+
cached_info=CapabilityEvent(CachedMapInfoEvent, [GetCachedMapInfo()]),
161+
changed=CapabilityEvent(MapChangedEvent, []),
162+
major=CapabilitySet(MajorMapEvent, [GetMajorMap()], SetMajorMap),
163+
minor=CapabilityExecute(GetMinorMap),
164+
multi_state=CapabilitySetEnable(
165+
MultimapStateEvent, [GetMultimapState()], SetMultimapState
166+
),
167+
position=CapabilityEvent(PositionsEvent, [GetPos()]),
168+
relocation=CapabilityExecute(SetRelocationState),
169+
rooms=CapabilityEvent(RoomsEvent, [GetCachedMapInfo()]),
170+
set=CapabilityExecute(GetMapSet),
171+
trace=CapabilityEvent(MapTraceEvent, [GetMapTrace()]),
172+
),
173+
network=CapabilityEvent(NetworkInfoEvent, [GetNetInfo()]),
174+
play_sound=CapabilityExecute(PlaySound),
175+
settings=CapabilitySettings(
176+
carpet_auto_fan_boost=CapabilitySetEnable(
177+
CarpetAutoFanBoostEvent,
178+
[GetCarpetAutoFanBoost()],
179+
SetCarpetAutoFanBoost,
180+
),
181+
child_lock=CapabilitySetEnable(
182+
ChildLockEvent, [GetChildLock()], SetChildLock
183+
),
184+
mop_auto_wash_frequency=CapabilityNumber(
185+
event=MopAutoWashFrequencyEvent,
186+
get=[GetMopAutoWashFrequency()],
187+
set=SetMopAutoWashFrequency,
188+
min=0,
189+
max=60,
190+
),
191+
true_detect=CapabilitySetEnable(
192+
TrueDetectEvent, [GetTrueDetect()], SetTrueDetect
193+
),
194+
volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume),
195+
),
196+
state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfo()]),
197+
station=CapabilityStation(
198+
action=CapabilityExecuteTypes(
199+
station_action.StationAction,
200+
types=(
201+
commands.StationAction.EMPTY_DUSTBIN,
202+
commands.StationAction.DRY_MOP,
203+
commands.StationAction.CLEAN_BASE,
204+
commands.StationAction.WASH_MOP,
205+
),
206+
),
207+
auto_empty=CapabilitySetTypes(
208+
event=AutoEmptyEvent,
209+
get=[GetAutoEmpty()],
210+
set=SetAutoEmpty,
211+
types=(
212+
auto_empty.Frequency.AUTO,
213+
auto_empty.Frequency.SMART,
214+
auto_empty.Frequency.MIN_10,
215+
auto_empty.Frequency.MIN_15,
216+
auto_empty.Frequency.MIN_25,
217+
),
218+
),
219+
state=CapabilityEvent(StationEvent, [GetStationState()]),
220+
),
221+
stats=CapabilityStats(
222+
clean=CapabilityEvent(StatsEvent, [GetStats()]),
223+
report=CapabilityEvent(ReportStatsEvent, []),
224+
total=CapabilityEvent(TotalStatsEvent, [GetTotalStats()]),
225+
),
226+
water=CapabilityWater(
227+
amount=CapabilitySetTypes(
228+
event=water_info.WaterAmountEvent,
229+
get=[GetWaterInfo()],
230+
set=SetWaterInfo,
231+
types=(
232+
water_info.WaterAmount.LOW,
233+
water_info.WaterAmount.MEDIUM,
234+
water_info.WaterAmount.HIGH,
235+
water_info.WaterAmount.ULTRAHIGH,
236+
),
237+
),
238+
mop_attached=CapabilityEvent(
239+
water_info.MopAttachedEvent, [GetWaterInfo()]
240+
),
241+
),
242+
),
243+
)

0 commit comments

Comments
 (0)