From 835184594a2469c209c0a933df05185d74c76e4a Mon Sep 17 00:00:00 2001 From: David Roe Date: Wed, 1 Jan 2025 23:35:55 -0800 Subject: [PATCH] Add T30S Combo support (#730) --- deebot_client/hardware/deebot/4bdkrs.py | 273 ++++++++++++++++++++++++ 1 file changed, 273 insertions(+) create mode 100644 deebot_client/hardware/deebot/4bdkrs.py diff --git a/deebot_client/hardware/deebot/4bdkrs.py b/deebot_client/hardware/deebot/4bdkrs.py new file mode 100644 index 00000000..1e75fb77 --- /dev/null +++ b/deebot_client/hardware/deebot/4bdkrs.py @@ -0,0 +1,273 @@ +"""Deebot DEEBOT T30S COMBO Capabilities.""" + +from __future__ import annotations + +from deebot_client.capabilities import ( + Capabilities, + CapabilityClean, + CapabilityCleanAction, + CapabilityCustomCommand, + CapabilityEvent, + CapabilityExecute, + CapabilityExecuteTypes, + CapabilityLifeSpan, + CapabilityMap, + CapabilitySet, + CapabilitySetEnable, + CapabilitySettings, + CapabilitySetTypes, + CapabilityStation, + CapabilityStats, + DeviceType, +) +from deebot_client.commands import StationAction +from deebot_client.commands.json import station_action +from deebot_client.commands.json.advanced_mode import GetAdvancedMode, SetAdvancedMode +from deebot_client.commands.json.auto_empty import GetAutoEmpty, SetAutoEmpty +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.child_lock import GetChildLock, SetChildLock +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.efficiency import GetEfficiencyMode, SetEfficiencyMode +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 +from deebot_client.commands.json.multimap_state import ( + GetMultimapState, + SetMultimapState, +) +from deebot_client.commands.json.network import GetNetInfo +from deebot_client.commands.json.ota import GetOta, SetOta +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.station_state import GetStationState +from deebot_client.commands.json.stats import GetStats, GetTotalStats +from deebot_client.commands.json.sweep_mode import GetSweepMode, SetSweepMode +from deebot_client.commands.json.true_detect import GetTrueDetect, SetTrueDetect +from deebot_client.commands.json.voice_assistant_state import ( + GetVoiceAssistantState, + SetVoiceAssistantState, +) +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, + ChildLockEvent, + CleanCountEvent, + CleanLogEvent, + CleanPreferenceEvent, + ContinuousCleaningEvent, + CustomCommandEvent, + EfficiencyModeEvent, + ErrorEvent, + FanSpeedEvent, + FanSpeedLevel, + LifeSpan, + LifeSpanEvent, + MajorMapEvent, + MapChangedEvent, + MapTraceEvent, + MultimapStateEvent, + NetworkInfoEvent, + OtaEvent, + PositionsEvent, + ReportStatsEvent, + RoomsEvent, + StateEvent, + StationEvent, + StatsEvent, + SweepModeEvent, + TotalStatsEvent, + TrueDetectEvent, + VoiceAssistantStateEvent, + VolumeEvent, + WaterAmount, + WaterInfoEvent, + WorkMode, + WorkModeEvent, + auto_empty, +) +from deebot_client.events.auto_empty import AutoEmptyEvent +from deebot_client.events.efficiency_mode import EfficiencyMode +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.HAND_FILTER, + LifeSpan.SIDE_BRUSH, + LifeSpan.UNIT_CARE, + ), + event=LifeSpanEvent, + get=[ + GetLifeSpan( + [ + LifeSpan.BRUSH, + LifeSpan.FILTER, + LifeSpan.HAND_FILTER, + LifeSpan.SIDE_BRUSH, + LifeSpan.UNIT_CARE, + ] + ) + ], + reset=ResetLifeSpan, + ), + map=CapabilityMap( + cached_info=CapabilityEvent(CachedMapInfoEvent, [GetCachedMapInfo()]), + changed=CapabilityEvent(MapChangedEvent, []), + major=CapabilityEvent(MajorMapEvent, [GetMajorMap()]), + 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, + ), + child_lock=CapabilitySetEnable( + ChildLockEvent, [GetChildLock()], SetChildLock + ), + efficiency_mode=CapabilitySetTypes( + event=EfficiencyModeEvent, + get=[GetEfficiencyMode()], + set=SetEfficiencyMode, + types=( + EfficiencyMode.ENERGY_EFFICIENT_MODE, + EfficiencyMode.STANDARD_MODE, + ), + ), + ota=CapabilitySetEnable(OtaEvent, [GetOta()], SetOta), + sweep_mode=CapabilitySetEnable( + SweepModeEvent, [GetSweepMode()], SetSweepMode + ), + true_detect=CapabilitySetEnable( + TrueDetectEvent, [GetTrueDetect()], SetTrueDetect + ), + voice_assistant=CapabilitySetEnable( + VoiceAssistantStateEvent, + [GetVoiceAssistantState()], + SetVoiceAssistantState, + ), + volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume), + ), + state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfo()]), + station=CapabilityStation( + action=CapabilityExecuteTypes( + station_action.StationAction, types=(StationAction.EMPTY_DUSTBIN,) + ), + auto_empty=CapabilitySetTypes( + event=AutoEmptyEvent, + get=[GetAutoEmpty()], + set=SetAutoEmpty, + types=( + auto_empty.Frequency.AUTO, + auto_empty.Frequency.SMART, + ), + ), + state=CapabilityEvent(StationEvent, [GetStationState()]), + ), + stats=CapabilityStats( + clean=CapabilityEvent(StatsEvent, [GetStats()]), + report=CapabilityEvent(ReportStatsEvent, []), + total=CapabilityEvent(TotalStatsEvent, [GetTotalStats()]), + ), + water=CapabilitySetTypes( + event=WaterInfoEvent, + get=[GetWaterInfo()], + set=SetWaterInfo, + types=( + WaterAmount.LOW, + WaterAmount.MEDIUM, + WaterAmount.HIGH, + WaterAmount.ULTRAHIGH, + ), + ), + ), +)