From a24b2fbc500dffe248945d92d7a8891110d42061 Mon Sep 17 00:00:00 2001 From: Luke Bonaccorsi Date: Wed, 6 Mar 2024 12:46:56 +0000 Subject: [PATCH 01/17] feat: add better DPS handling --- custom_components/robovac/robovac.py | 160 ++------------ custom_components/robovac/tuyalocalapi.py | 9 +- custom_components/robovac/vacuum.py | 144 ++++++------ custom_components/robovac/vacuums/T1250.py | 44 ++++ custom_components/robovac/vacuums/T2103.py | 38 ++++ custom_components/robovac/vacuums/T2117.py | 38 ++++ custom_components/robovac/vacuums/T2118.py | 38 ++++ custom_components/robovac/vacuums/T2119.py | 38 ++++ custom_components/robovac/vacuums/T2120.py | 38 ++++ custom_components/robovac/vacuums/T2123.py | 38 ++++ custom_components/robovac/vacuums/T2128.py | 38 ++++ custom_components/robovac/vacuums/T2130.py | 38 ++++ custom_components/robovac/vacuums/T2132.py | 38 ++++ custom_components/robovac/vacuums/T2150.py | 43 ++++ custom_components/robovac/vacuums/T2181.py | 46 ++++ custom_components/robovac/vacuums/T2182.py | 46 ++++ custom_components/robovac/vacuums/T2190.py | 46 ++++ custom_components/robovac/vacuums/T2192.py | 45 ++++ custom_components/robovac/vacuums/T2193.py | 46 ++++ custom_components/robovac/vacuums/T2194.py | 46 ++++ custom_components/robovac/vacuums/T2250.py | 43 ++++ custom_components/robovac/vacuums/T2251.py | 43 ++++ custom_components/robovac/vacuums/T2252.py | 43 ++++ custom_components/robovac/vacuums/T2253.py | 45 ++++ custom_components/robovac/vacuums/T2254.py | 43 ++++ custom_components/robovac/vacuums/T2255.py | 43 ++++ custom_components/robovac/vacuums/T2256.py | 44 ++++ custom_components/robovac/vacuums/T2257.py | 43 ++++ custom_components/robovac/vacuums/T2258.py | 44 ++++ custom_components/robovac/vacuums/T2259.py | 43 ++++ custom_components/robovac/vacuums/T2261.py | 46 ++++ custom_components/robovac/vacuums/T2262.py | 45 ++++ custom_components/robovac/vacuums/T2270.py | 43 ++++ custom_components/robovac/vacuums/T2272.py | 43 ++++ custom_components/robovac/vacuums/T2273.py | 44 ++++ custom_components/robovac/vacuums/T2320.py | 46 ++++ custom_components/robovac/vacuums/__init__.py | 69 ++++++ custom_components/robovac/vacuums/base.py | 35 +++ generate.js | 206 ++++++++++++++++++ 39 files changed, 1823 insertions(+), 205 deletions(-) create mode 100644 custom_components/robovac/vacuums/T1250.py create mode 100644 custom_components/robovac/vacuums/T2103.py create mode 100644 custom_components/robovac/vacuums/T2117.py create mode 100644 custom_components/robovac/vacuums/T2118.py create mode 100644 custom_components/robovac/vacuums/T2119.py create mode 100644 custom_components/robovac/vacuums/T2120.py create mode 100644 custom_components/robovac/vacuums/T2123.py create mode 100644 custom_components/robovac/vacuums/T2128.py create mode 100644 custom_components/robovac/vacuums/T2130.py create mode 100644 custom_components/robovac/vacuums/T2132.py create mode 100644 custom_components/robovac/vacuums/T2150.py create mode 100644 custom_components/robovac/vacuums/T2181.py create mode 100644 custom_components/robovac/vacuums/T2182.py create mode 100644 custom_components/robovac/vacuums/T2190.py create mode 100644 custom_components/robovac/vacuums/T2192.py create mode 100644 custom_components/robovac/vacuums/T2193.py create mode 100644 custom_components/robovac/vacuums/T2194.py create mode 100644 custom_components/robovac/vacuums/T2250.py create mode 100644 custom_components/robovac/vacuums/T2251.py create mode 100644 custom_components/robovac/vacuums/T2252.py create mode 100644 custom_components/robovac/vacuums/T2253.py create mode 100644 custom_components/robovac/vacuums/T2254.py create mode 100644 custom_components/robovac/vacuums/T2255.py create mode 100644 custom_components/robovac/vacuums/T2256.py create mode 100644 custom_components/robovac/vacuums/T2257.py create mode 100644 custom_components/robovac/vacuums/T2258.py create mode 100644 custom_components/robovac/vacuums/T2259.py create mode 100644 custom_components/robovac/vacuums/T2261.py create mode 100644 custom_components/robovac/vacuums/T2262.py create mode 100644 custom_components/robovac/vacuums/T2270.py create mode 100644 custom_components/robovac/vacuums/T2272.py create mode 100644 custom_components/robovac/vacuums/T2273.py create mode 100644 custom_components/robovac/vacuums/T2320.py create mode 100644 custom_components/robovac/vacuums/__init__.py create mode 100644 custom_components/robovac/vacuums/base.py create mode 100644 generate.js diff --git a/custom_components/robovac/robovac.py b/custom_components/robovac/robovac.py index 51e0778..ba3faa1 100644 --- a/custom_components/robovac/robovac.py +++ b/custom_components/robovac/robovac.py @@ -1,107 +1,6 @@ -from enum import IntEnum -from homeassistant.components.vacuum import VacuumEntityFeature +from .vacuums.base import RobovacCommand from .tuyalocalapi import TuyaDevice - - -class RoboVacEntityFeature(IntEnum): - """Supported features of the RoboVac entity.""" - - EDGE = 1 - SMALL_ROOM = 2 - CLEANING_TIME = 4 - CLEANING_AREA = 8 - DO_NOT_DISTURB = 16 - AUTO_RETURN = 32 - CONSUMABLES = 64 - ROOM = 128 - ZONE = 256 - MAP = 512 - BOOST_IQ = 1024 - - -ROBOVAC_SERIES = { - "C": [ - "T2103", - "T2117", - "T2118", - "T2119", - "T2120", - "T2123", - "T2128", - "T2130", - "T2132", - ], - "G": [ - "T1250", - "T2250", - "T2251", - "T2252", - "T2253", - "T2254", - "T2150", - "T2255", - "T2256", - "T2257", - "T2258", - "T2259", - "T2270", - "T2272", - "T2273", - ], - "L": ["T2181", "T2182", "T2190", "T2192", "T2193", "T2194"], - "X": ["T2261", "T2262", "T2320"], -} - -HAS_MAP_FEATURE = ["T2253", *ROBOVAC_SERIES["L"], *ROBOVAC_SERIES["X"]] - -HAS_CONSUMABLES = [ - "T1250", - "T2181", - "T2182", - "T2190", - "T2193", - "T2194", - "T2253", - "T2256", - "T2258", - "T2261", - "T2273", - "T2320", -] - -ROBOVAC_SERIES_FEATURES = { - "C": RoboVacEntityFeature.EDGE | RoboVacEntityFeature.SMALL_ROOM, - "G": RoboVacEntityFeature.CLEANING_TIME - | RoboVacEntityFeature.CLEANING_AREA - | RoboVacEntityFeature.DO_NOT_DISTURB - | RoboVacEntityFeature.AUTO_RETURN, - "L": RoboVacEntityFeature.CLEANING_TIME - | RoboVacEntityFeature.CLEANING_AREA - | RoboVacEntityFeature.DO_NOT_DISTURB - | RoboVacEntityFeature.AUTO_RETURN - | RoboVacEntityFeature.ROOM - | RoboVacEntityFeature.ZONE - | RoboVacEntityFeature.BOOST_IQ, - "X": RoboVacEntityFeature.CLEANING_TIME - | RoboVacEntityFeature.CLEANING_AREA - | RoboVacEntityFeature.DO_NOT_DISTURB - | RoboVacEntityFeature.AUTO_RETURN - | RoboVacEntityFeature.ROOM - | RoboVacEntityFeature.ZONE - | RoboVacEntityFeature.BOOST_IQ, -} - -ROBOVAC_SERIES_FAN_SPEEDS = { - "C": ["No Suction", "Standard", "Boost IQ", "Max"], - "G": ["Standard", "Turbo", "Max", "Boost IQ"], - "L": ["Quiet", "Standard", "Turbo", "Max"], - "X": ["Pure", "Standard", "Turbo", "Max"], -} - - -SUPPORTED_ROBOVAC_MODELS = list( - set([item for sublist in ROBOVAC_SERIES.values() for item in sublist]) -) +from .vacuums import ROBOVAC_MODELS class ModelNotSupportedException(Exception): @@ -112,48 +11,35 @@ class RoboVac(TuyaDevice): """""" def __init__(self, model_code, *args, **kwargs): - super().__init__(*args, **kwargs) - self.model_code = model_code - - if self.model_code not in SUPPORTED_ROBOVAC_MODELS: + if model_code not in ROBOVAC_MODELS[model_code] is None: raise ModelNotSupportedException( - "Model {} is not supported".format(self.model_code) + "Model {} is not supported".format(model_code) ) - def getHomeAssistantFeatures(self): - supportedFeatures = ( - VacuumEntityFeature.BATTERY - | VacuumEntityFeature.CLEAN_SPOT - | VacuumEntityFeature.FAN_SPEED - | VacuumEntityFeature.LOCATE - | VacuumEntityFeature.PAUSE - | VacuumEntityFeature.RETURN_HOME - | VacuumEntityFeature.SEND_COMMAND - | VacuumEntityFeature.START - | VacuumEntityFeature.STATE - | VacuumEntityFeature.STOP - ) - - if self.model_code in HAS_MAP_FEATURE: - supportedFeatures |= VacuumEntityFeature.MAP + self.model_details = ROBOVAC_MODELS[model_code] + super().__init__(self.model_details, *args, **kwargs) - return supportedFeatures + def getHomeAssistantFeatures(self): + return self.model_details.homeassistant_features def getRoboVacFeatures(self): - supportedFeatures = ROBOVAC_SERIES_FEATURES[self.getRoboVacSeries()] + return self.model_details.robovac_features - if self.model_code in HAS_MAP_FEATURE: - supportedFeatures |= RoboVacEntityFeature.MAP + def getFanSpeeds(self): + return self.model_details.commands[RobovacCommand.FAN_SPEED].values - if self.model_code in HAS_CONSUMABLES: - supportedFeatures |= RoboVacEntityFeature.CONSUMABLES + def getModes(self): + return self.model_details.commands[RobovacCommand.MODE].values - return supportedFeatures + def getSupportedCommands(self): + return list(self.model_details.commands.keys()) - def getRoboVacSeries(self): - for series, models in ROBOVAC_SERIES.items(): - if self.model_code in models: - return series + def getCommandCodes(self): + command_codes = {} + for key, value in self.model_details.commands: + if isinstance(value, dict): + command_codes[key] = value.code + else: + command_codes[key] = value - def getFanSpeeds(self): - return ROBOVAC_SERIES_FAN_SPEEDS[self.getRoboVacSeries()] + return command_codes diff --git a/custom_components/robovac/tuyalocalapi.py b/custom_components/robovac/tuyalocalapi.py index 772dc53..cc13e2d 100644 --- a/custom_components/robovac/tuyalocalapi.py +++ b/custom_components/robovac/tuyalocalapi.py @@ -54,6 +54,8 @@ from cryptography.hazmat.primitives.hashes import Hash, MD5 from cryptography.hazmat.primitives.padding import PKCS7 +from .vacuums.base import RobovacCommand + INITIAL_BACKOFF = 5 INITIAL_QUEUE_TIME = 0.1 BACKOFF_MULTIPLIER = 1.70224 @@ -604,6 +606,7 @@ class TuyaDevice: def __init__( self, + model_details, device_id, host, timeout, @@ -616,6 +619,7 @@ def __init__( ): """Initialize the device.""" self._LOGGER = _LOGGER.getChild(device_id) + self.model_details = model_details self.device_id = device_id self.host = host self.port = port @@ -717,7 +721,9 @@ async def async_connect(self): try: sock.connect((self.host, self.port)) except (socket.timeout, TimeoutError) as e: - self._dps["106"] = "CONNECTION_FAILED" + self._dps[self.model_details.commands[RobovacCommand.ERROR]] = ( + "CONNECTION_FAILED" + ) raise ConnectionTimeoutException("Connection timed out") loop = asyncio.get_running_loop() loop.create_connection @@ -744,6 +750,7 @@ async def async_disconnect(self): if self.writer is not None: self.writer.close() + await self.writer.wait_closed() if self.reader is not None and not self.reader.at_eof(): self.reader.feed_eof() diff --git a/custom_components/robovac/vacuum.py b/custom_components/robovac/vacuum.py index 48ffafa..4ce1f56 100644 --- a/custom_components/robovac/vacuum.py +++ b/custom_components/robovac/vacuum.py @@ -29,7 +29,6 @@ from homeassistant.loader import bind_hass from homeassistant.components.vacuum import ( StateVacuumEntity, - VacuumEntityFeature, STATE_CLEANING, STATE_DOCKED, STATE_ERROR, @@ -55,15 +54,15 @@ STATE_UNAVAILABLE, ) +from .vacuums.base import RoboVacEntityFeature, RobovacCommand + from .tuyalocalapi import TuyaException from .const import CONF_VACS, DOMAIN, REFRESH_RATE, PING_RATE, TIMEOUT from .errors import getErrorMessage from .robovac import ( - SUPPORTED_ROBOVAC_MODELS, ModelNotSupportedException, RoboVac, - RoboVacEntityFeature, ) from homeassistant.const import ATTR_BATTERY_LEVEL @@ -88,22 +87,6 @@ UPDATE_RETRIES = 3 -class TUYA_CODES(StrEnum): - BATTERY_LEVEL = "104" - STATE = "15" - ERROR_CODE = "106" - MODE = "5" - FAN_SPEED = "102" - CLEANING_AREA = "110" - CLEANING_TIME = "109" - AUTO_RETURN = "135" - DO_NOT_DISTURB = "107" - BOOST_IQ = "118" - - -TUYA_CONSUMABLES_CODES = ["142", "116"] - - async def async_setup_entry( hass: HomeAssistant, config_entry: ConfigEntry, @@ -284,6 +267,7 @@ def __init__(self, item) -> None: self._attr_supported_features = self.vacuum.getHomeAssistantFeatures() self._attr_robovac_supported = self.vacuum.getRoboVacFeatures() self._attr_fan_speed_list = self.vacuum.getFanSpeeds() + self._tuya_command_codes = self.vacuum.getCommandCodes() self._attr_mode = None self._attr_consumables = None @@ -331,62 +315,90 @@ async def pushed_update_handler(self): def update_entity_values(self): self.tuyastatus = self.vacuum._dps - # for 15C - self._attr_battery_level = self.tuyastatus.get(TUYA_CODES.BATTERY_LEVEL) - self.tuya_state = self.tuyastatus.get(TUYA_CODES.STATE) - self.error_code = self.tuyastatus.get(TUYA_CODES.ERROR_CODE) - self._attr_mode = self.tuyastatus.get(TUYA_CODES.MODE) - self._attr_fan_speed = self.tuyastatus.get(TUYA_CODES.FAN_SPEED) - if self.fan_speed == "No_suction": - self._attr_fan_speed = "No Suction" - elif self.fan_speed == "Boost_IQ": - self._attr_fan_speed = "Boost IQ" - elif self.fan_speed == "Quiet": - self._attr_fan_speed = "Pure" - # for G30 - self._attr_cleaning_area = self.tuyastatus.get(TUYA_CODES.CLEANING_AREA) - self._attr_cleaning_time = self.tuyastatus.get(TUYA_CODES.CLEANING_TIME) - self._attr_auto_return = self.tuyastatus.get(TUYA_CODES.AUTO_RETURN) - self._attr_do_not_disturb = self.tuyastatus.get(TUYA_CODES.DO_NOT_DISTURB) - self._attr_boost_iq = self.tuyastatus.get(TUYA_CODES.BOOST_IQ) - # self.map_data = self.tuyastatus.get("121") - # self.erro_msg? = self.tuyastatus.get("124") + self._attr_battery_level = self.tuyastatus.get( + self._tuya_command_codes[RobovacCommand.BATTERY] + ) + self.tuya_state = self.tuyastatus.get( + self._tuya_command_codes[RobovacCommand.STATUS] + ) + self.error_code = self.tuyastatus.get( + self._tuya_command_codes[RobovacCommand.ERROR] + ) + self._attr_mode = self.tuyastatus.get( + self._tuya_command_codes[RobovacCommand.MODE] + ) + self._attr_fan_speed = self.tuyastatus.get( + self._tuya_command_codes[RobovacCommand.FAN_SPEED] + ) + + if self.robovac_supported & RoboVacEntityFeature.CLEANING_AREA: + self._attr_cleaning_area = self.tuyastatus.get( + self._tuya_command_codes[RobovacCommand.CLEANING_AREA] + ) + + if self.robovac_supported & RoboVacEntityFeature.CLEANING_TIME: + self._attr_cleaning_time = self.tuyastatus.get( + self._tuya_command_codes[RobovacCommand.CLEANING_TIME] + ) + + if self.robovac_supported & RoboVacEntityFeature.AUTO_RETURN: + self._attr_auto_return = self.tuyastatus.get( + self._tuya_command_codes[RobovacCommand.AUTO_RETURN] + ) + + if self.robovac_supported & RoboVacEntityFeature.DO_NOT_DISTURB: + self._attr_do_not_disturb = self.tuyastatus.get( + self._tuya_command_codes[RobovacCommand.DO_NOT_DISTURB] + ) + + if self.robovac_supported & RoboVacEntityFeature.BOOST_IQ: + self._attr_boost_iq = self.tuyastatus.get( + self._tuya_command_codes[RobovacCommand.BOOST_IQ] + ) + if self.robovac_supported & RoboVacEntityFeature.CONSUMABLES: - for CONSUMABLE_CODE in TUYA_CONSUMABLES_CODES: - if ( - CONSUMABLE_CODE in self.tuyastatus - and self.tuyastatus.get(CONSUMABLE_CODE) is not None - ): - consumables = ast.literal_eval( - base64.b64decode(self.tuyastatus.get(CONSUMABLE_CODE)).decode( - "ascii" - ) + consumables = ast.literal_eval( + base64.b64decode( + self.tuyastatus.get( + self._tuya_command_codes[RobovacCommand.CONSUMABLES] + ) + ).decode("ascii") + ) + _LOGGER.debug("Consumables decoded value is: {}".format(consumables)) + if "consumable" in consumables and "duration" in consumables["consumable"]: + _LOGGER.debug( + "Consumables encoded value is: {}".format( + consumables["consumable"]["duration"] ) - if ( - "consumable" in consumables - and "duration" in consumables["consumable"] - ): - self._attr_consumables = consumables["consumable"]["duration"] + ) + self._attr_consumables = consumables["consumable"]["duration"] async def async_locate(self, **kwargs): """Locate the vacuum cleaner.""" _LOGGER.info("Locate Pressed") - if self.tuyastatus.get("103"): - await self.vacuum.async_set({"103": False}) + code = self._tuya_command_codes[RobovacCommand.LOCATE] + if self.tuyastatus.get(code): + await self.vacuum.async_set({code: False}) else: - await self.vacuum.async_set({"103": True}) + await self.vacuum.async_set({code: True}) async def async_return_to_base(self, **kwargs): """Set the vacuum cleaner to return to the dock.""" _LOGGER.info("Return home Pressed") - await self.vacuum.async_set({"101": True}) + await self.vacuum.async_set( + {self._tuya_command_codes[RobovacCommand.RETURN_HOME]: True} + ) async def async_start(self, **kwargs): self._attr_mode = "auto" - await self.vacuum.async_set({"5": self.mode}) + await self.vacuum.async_set( + {self._tuya_command_codes[RobovacCommand.MODE]: self.mode} + ) async def async_pause(self, **kwargs): - await self.vacuum.async_set({"2": False}) + await self.vacuum.async_set( + {self._tuya_command_codes[RobovacCommand.PAUSE]: False} + ) async def async_stop(self, **kwargs): await self.async_return_to_base() @@ -394,18 +406,16 @@ async def async_stop(self, **kwargs): async def async_clean_spot(self, **kwargs): """Perform a spot clean-up.""" _LOGGER.info("Spot Clean Pressed") - await self.vacuum.async_set({"5": "Spot"}) + await self.vacuum.async_set( + {self._tuya_command_codes[RobovacCommand.MODE]: "Spot"} + ) async def async_set_fan_speed(self, fan_speed, **kwargs): """Set fan speed.""" _LOGGER.info("Fan Speed Selected") - if fan_speed == "No Suction": - fan_speed = "No_suction" - elif fan_speed == "Boost IQ": - fan_speed = "Boost_IQ" - elif fan_speed == "Pure": - fan_speed = "Quiet" - await self.vacuum.async_set({"102": fan_speed}) + await self.vacuum.async_set( + {self._tuya_command_codes[RobovacCommand.FAN_SPEED]: fan_speed} + ) async def async_send_command( self, command: str, params: dict | list | None = None, **kwargs diff --git a/custom_components/robovac/vacuums/T1250.py b/custom_components/robovac/vacuums/T1250.py new file mode 100644 index 0000000..f864041 --- /dev/null +++ b/custom_components/robovac/vacuums/T1250.py @@ -0,0 +1,44 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T1250: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.CONSUMABLES + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Standard","Turbo","Max","Boost_IQ"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + # RobovacCommand.CONSUMABLES: 0, + } diff --git a/custom_components/robovac/vacuums/T2103.py b/custom_components/robovac/vacuums/T2103.py new file mode 100644 index 0000000..5d4afb3 --- /dev/null +++ b/custom_components/robovac/vacuums/T2103.py @@ -0,0 +1,38 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2103: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + ) + robovac_features = RoboVacEntityFeature.EDGE | RoboVacEntityFeature.SMALL_ROOM + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["No_Suction","Standard","Boost_IQ","Max"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + } diff --git a/custom_components/robovac/vacuums/T2117.py b/custom_components/robovac/vacuums/T2117.py new file mode 100644 index 0000000..8e73b28 --- /dev/null +++ b/custom_components/robovac/vacuums/T2117.py @@ -0,0 +1,38 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2117: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + ) + robovac_features = RoboVacEntityFeature.EDGE | RoboVacEntityFeature.SMALL_ROOM + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["No_Suction","Standard","Boost_IQ","Max"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + } diff --git a/custom_components/robovac/vacuums/T2118.py b/custom_components/robovac/vacuums/T2118.py new file mode 100644 index 0000000..a7e7955 --- /dev/null +++ b/custom_components/robovac/vacuums/T2118.py @@ -0,0 +1,38 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2118: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + ) + robovac_features = RoboVacEntityFeature.EDGE | RoboVacEntityFeature.SMALL_ROOM + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["No_Suction","Standard","Boost_IQ","Max"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + } diff --git a/custom_components/robovac/vacuums/T2119.py b/custom_components/robovac/vacuums/T2119.py new file mode 100644 index 0000000..7c5f738 --- /dev/null +++ b/custom_components/robovac/vacuums/T2119.py @@ -0,0 +1,38 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2119: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + ) + robovac_features = RoboVacEntityFeature.EDGE | RoboVacEntityFeature.SMALL_ROOM + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["No_Suction","Standard","Boost_IQ","Max"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + } diff --git a/custom_components/robovac/vacuums/T2120.py b/custom_components/robovac/vacuums/T2120.py new file mode 100644 index 0000000..cdf0995 --- /dev/null +++ b/custom_components/robovac/vacuums/T2120.py @@ -0,0 +1,38 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2120: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + ) + robovac_features = RoboVacEntityFeature.EDGE | RoboVacEntityFeature.SMALL_ROOM + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["No_Suction","Standard","Boost_IQ","Max"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + } diff --git a/custom_components/robovac/vacuums/T2123.py b/custom_components/robovac/vacuums/T2123.py new file mode 100644 index 0000000..f0c9683 --- /dev/null +++ b/custom_components/robovac/vacuums/T2123.py @@ -0,0 +1,38 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2123: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + ) + robovac_features = RoboVacEntityFeature.EDGE | RoboVacEntityFeature.SMALL_ROOM + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["No_Suction","Standard","Boost_IQ","Max"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + } diff --git a/custom_components/robovac/vacuums/T2128.py b/custom_components/robovac/vacuums/T2128.py new file mode 100644 index 0000000..e97e406 --- /dev/null +++ b/custom_components/robovac/vacuums/T2128.py @@ -0,0 +1,38 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2128: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + ) + robovac_features = RoboVacEntityFeature.EDGE | RoboVacEntityFeature.SMALL_ROOM + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["No_Suction","Standard","Boost_IQ","Max"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + } diff --git a/custom_components/robovac/vacuums/T2130.py b/custom_components/robovac/vacuums/T2130.py new file mode 100644 index 0000000..a482f94 --- /dev/null +++ b/custom_components/robovac/vacuums/T2130.py @@ -0,0 +1,38 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2130: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + ) + robovac_features = RoboVacEntityFeature.EDGE | RoboVacEntityFeature.SMALL_ROOM + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["No_Suction","Standard","Boost_IQ","Max"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + } diff --git a/custom_components/robovac/vacuums/T2132.py b/custom_components/robovac/vacuums/T2132.py new file mode 100644 index 0000000..56ba2d2 --- /dev/null +++ b/custom_components/robovac/vacuums/T2132.py @@ -0,0 +1,38 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2132: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + ) + robovac_features = RoboVacEntityFeature.EDGE | RoboVacEntityFeature.SMALL_ROOM + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["No_Suction","Standard","Boost_IQ","Max"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + } diff --git a/custom_components/robovac/vacuums/T2150.py b/custom_components/robovac/vacuums/T2150.py new file mode 100644 index 0000000..1ac4f5e --- /dev/null +++ b/custom_components/robovac/vacuums/T2150.py @@ -0,0 +1,43 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2150: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Standard","Turbo","Max","Boost_IQ"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + } diff --git a/custom_components/robovac/vacuums/T2181.py b/custom_components/robovac/vacuums/T2181.py new file mode 100644 index 0000000..5b322cf --- /dev/null +++ b/custom_components/robovac/vacuums/T2181.py @@ -0,0 +1,46 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2181: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + | VacuumEntityFeature.MAP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.ROOM | RoboVacEntityFeature.ZONE | RoboVacEntityFeature.BOOST_IQ | RoboVacEntityFeature.MAP | RoboVacEntityFeature.CONSUMABLES + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Quiet","Standard","Turbo","Max"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + # RobovacCommand.BOOST_IQ: 0, + # RobovacCommand.CONSUMABLES: 0, + } diff --git a/custom_components/robovac/vacuums/T2182.py b/custom_components/robovac/vacuums/T2182.py new file mode 100644 index 0000000..3cde0ad --- /dev/null +++ b/custom_components/robovac/vacuums/T2182.py @@ -0,0 +1,46 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2182: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + | VacuumEntityFeature.MAP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.ROOM | RoboVacEntityFeature.ZONE | RoboVacEntityFeature.BOOST_IQ | RoboVacEntityFeature.MAP | RoboVacEntityFeature.CONSUMABLES + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Quiet","Standard","Turbo","Max"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + # RobovacCommand.BOOST_IQ: 0, + # RobovacCommand.CONSUMABLES: 0, + } diff --git a/custom_components/robovac/vacuums/T2190.py b/custom_components/robovac/vacuums/T2190.py new file mode 100644 index 0000000..8ab2496 --- /dev/null +++ b/custom_components/robovac/vacuums/T2190.py @@ -0,0 +1,46 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2190: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + | VacuumEntityFeature.MAP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.ROOM | RoboVacEntityFeature.ZONE | RoboVacEntityFeature.BOOST_IQ | RoboVacEntityFeature.MAP | RoboVacEntityFeature.CONSUMABLES + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Quiet","Standard","Turbo","Max"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + # RobovacCommand.BOOST_IQ: 0, + # RobovacCommand.CONSUMABLES: 0, + } diff --git a/custom_components/robovac/vacuums/T2192.py b/custom_components/robovac/vacuums/T2192.py new file mode 100644 index 0000000..19ae1cf --- /dev/null +++ b/custom_components/robovac/vacuums/T2192.py @@ -0,0 +1,45 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2192: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + | VacuumEntityFeature.MAP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.ROOM | RoboVacEntityFeature.ZONE | RoboVacEntityFeature.BOOST_IQ | RoboVacEntityFeature.MAP + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Quiet","Standard","Turbo","Max"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + # RobovacCommand.BOOST_IQ: 0, + } diff --git a/custom_components/robovac/vacuums/T2193.py b/custom_components/robovac/vacuums/T2193.py new file mode 100644 index 0000000..baaba5b --- /dev/null +++ b/custom_components/robovac/vacuums/T2193.py @@ -0,0 +1,46 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2193: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + | VacuumEntityFeature.MAP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.ROOM | RoboVacEntityFeature.ZONE | RoboVacEntityFeature.BOOST_IQ | RoboVacEntityFeature.MAP | RoboVacEntityFeature.CONSUMABLES + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Quiet","Standard","Turbo","Max"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + # RobovacCommand.BOOST_IQ: 0, + # RobovacCommand.CONSUMABLES: 0, + } diff --git a/custom_components/robovac/vacuums/T2194.py b/custom_components/robovac/vacuums/T2194.py new file mode 100644 index 0000000..cb0757b --- /dev/null +++ b/custom_components/robovac/vacuums/T2194.py @@ -0,0 +1,46 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2194: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + | VacuumEntityFeature.MAP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.ROOM | RoboVacEntityFeature.ZONE | RoboVacEntityFeature.BOOST_IQ | RoboVacEntityFeature.MAP | RoboVacEntityFeature.CONSUMABLES + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Quiet","Standard","Turbo","Max"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + # RobovacCommand.BOOST_IQ: 0, + # RobovacCommand.CONSUMABLES: 0, + } diff --git a/custom_components/robovac/vacuums/T2250.py b/custom_components/robovac/vacuums/T2250.py new file mode 100644 index 0000000..82adc0c --- /dev/null +++ b/custom_components/robovac/vacuums/T2250.py @@ -0,0 +1,43 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2250: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Standard","Turbo","Max","Boost_IQ"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + } diff --git a/custom_components/robovac/vacuums/T2251.py b/custom_components/robovac/vacuums/T2251.py new file mode 100644 index 0000000..e98c74d --- /dev/null +++ b/custom_components/robovac/vacuums/T2251.py @@ -0,0 +1,43 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2251: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Standard","Turbo","Max","Boost_IQ"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + } diff --git a/custom_components/robovac/vacuums/T2252.py b/custom_components/robovac/vacuums/T2252.py new file mode 100644 index 0000000..6b6abb6 --- /dev/null +++ b/custom_components/robovac/vacuums/T2252.py @@ -0,0 +1,43 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2252: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Standard","Turbo","Max","Boost_IQ"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + } diff --git a/custom_components/robovac/vacuums/T2253.py b/custom_components/robovac/vacuums/T2253.py new file mode 100644 index 0000000..8c54c4a --- /dev/null +++ b/custom_components/robovac/vacuums/T2253.py @@ -0,0 +1,45 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2253: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + | VacuumEntityFeature.MAP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.MAP | RoboVacEntityFeature.CONSUMABLES + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Standard","Turbo","Max","Boost_IQ"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + # RobovacCommand.CONSUMABLES: 0, + } diff --git a/custom_components/robovac/vacuums/T2254.py b/custom_components/robovac/vacuums/T2254.py new file mode 100644 index 0000000..25d380b --- /dev/null +++ b/custom_components/robovac/vacuums/T2254.py @@ -0,0 +1,43 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2254: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Standard","Turbo","Max","Boost_IQ"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + } diff --git a/custom_components/robovac/vacuums/T2255.py b/custom_components/robovac/vacuums/T2255.py new file mode 100644 index 0000000..11f2a1d --- /dev/null +++ b/custom_components/robovac/vacuums/T2255.py @@ -0,0 +1,43 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2255: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Standard","Turbo","Max","Boost_IQ"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + } diff --git a/custom_components/robovac/vacuums/T2256.py b/custom_components/robovac/vacuums/T2256.py new file mode 100644 index 0000000..a49792c --- /dev/null +++ b/custom_components/robovac/vacuums/T2256.py @@ -0,0 +1,44 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2256: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.CONSUMABLES + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Standard","Turbo","Max","Boost_IQ"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + # RobovacCommand.CONSUMABLES: 0, + } diff --git a/custom_components/robovac/vacuums/T2257.py b/custom_components/robovac/vacuums/T2257.py new file mode 100644 index 0000000..ec9c1ca --- /dev/null +++ b/custom_components/robovac/vacuums/T2257.py @@ -0,0 +1,43 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2257: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Standard","Turbo","Max","Boost_IQ"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + } diff --git a/custom_components/robovac/vacuums/T2258.py b/custom_components/robovac/vacuums/T2258.py new file mode 100644 index 0000000..bfaf722 --- /dev/null +++ b/custom_components/robovac/vacuums/T2258.py @@ -0,0 +1,44 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2258: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.CONSUMABLES + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Standard","Turbo","Max","Boost_IQ"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + # RobovacCommand.CONSUMABLES: 0, + } diff --git a/custom_components/robovac/vacuums/T2259.py b/custom_components/robovac/vacuums/T2259.py new file mode 100644 index 0000000..08cf881 --- /dev/null +++ b/custom_components/robovac/vacuums/T2259.py @@ -0,0 +1,43 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2259: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Standard","Turbo","Max","Boost_IQ"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + } diff --git a/custom_components/robovac/vacuums/T2261.py b/custom_components/robovac/vacuums/T2261.py new file mode 100644 index 0000000..cb41e12 --- /dev/null +++ b/custom_components/robovac/vacuums/T2261.py @@ -0,0 +1,46 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2261: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + | VacuumEntityFeature.MAP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.ROOM | RoboVacEntityFeature.ZONE | RoboVacEntityFeature.BOOST_IQ | RoboVacEntityFeature.MAP | RoboVacEntityFeature.CONSUMABLES + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Pure","Standard","Turbo","Max"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + # RobovacCommand.BOOST_IQ: 0, + # RobovacCommand.CONSUMABLES: 0, + } diff --git a/custom_components/robovac/vacuums/T2262.py b/custom_components/robovac/vacuums/T2262.py new file mode 100644 index 0000000..aecc8c5 --- /dev/null +++ b/custom_components/robovac/vacuums/T2262.py @@ -0,0 +1,45 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2262: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + | VacuumEntityFeature.MAP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.ROOM | RoboVacEntityFeature.ZONE | RoboVacEntityFeature.BOOST_IQ | RoboVacEntityFeature.MAP + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Pure","Standard","Turbo","Max"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + # RobovacCommand.BOOST_IQ: 0, + } diff --git a/custom_components/robovac/vacuums/T2270.py b/custom_components/robovac/vacuums/T2270.py new file mode 100644 index 0000000..e9dbf3d --- /dev/null +++ b/custom_components/robovac/vacuums/T2270.py @@ -0,0 +1,43 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2270: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Standard","Turbo","Max","Boost_IQ"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + } diff --git a/custom_components/robovac/vacuums/T2272.py b/custom_components/robovac/vacuums/T2272.py new file mode 100644 index 0000000..c810bfc --- /dev/null +++ b/custom_components/robovac/vacuums/T2272.py @@ -0,0 +1,43 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2272: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Standard","Turbo","Max","Boost_IQ"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + } diff --git a/custom_components/robovac/vacuums/T2273.py b/custom_components/robovac/vacuums/T2273.py new file mode 100644 index 0000000..05a1bd4 --- /dev/null +++ b/custom_components/robovac/vacuums/T2273.py @@ -0,0 +1,44 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2273: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.CONSUMABLES + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Standard","Turbo","Max","Boost_IQ"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + # RobovacCommand.CONSUMABLES: 0, + } diff --git a/custom_components/robovac/vacuums/T2320.py b/custom_components/robovac/vacuums/T2320.py new file mode 100644 index 0000000..2e7670b --- /dev/null +++ b/custom_components/robovac/vacuums/T2320.py @@ -0,0 +1,46 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2320: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + | VacuumEntityFeature.MAP + ) + robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.ROOM | RoboVacEntityFeature.ZONE | RoboVacEntityFeature.BOOST_IQ | RoboVacEntityFeature.MAP | RoboVacEntityFeature.CONSUMABLES + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ["Pure","Standard","Turbo","Max"], + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # RobovacCommand.DO_NOT_DISTURB: 0, + # RobovacCommand.BOOST_IQ: 0, + # RobovacCommand.CONSUMABLES: 0, + } diff --git a/custom_components/robovac/vacuums/__init__.py b/custom_components/robovac/vacuums/__init__.py new file mode 100644 index 0000000..ea6de56 --- /dev/null +++ b/custom_components/robovac/vacuums/__init__.py @@ -0,0 +1,69 @@ +from .T2103 import T2103 +from .T2117 import T2117 +from .T2118 import T2118 +from .T2119 import T2119 +from .T2120 import T2120 +from .T2123 import T2123 +from .T2128 import T2128 +from .T2130 import T2130 +from .T2132 import T2132 +from .T1250 import T1250 +from .T2250 import T2250 +from .T2251 import T2251 +from .T2252 import T2252 +from .T2253 import T2253 +from .T2254 import T2254 +from .T2150 import T2150 +from .T2255 import T2255 +from .T2256 import T2256 +from .T2257 import T2257 +from .T2258 import T2258 +from .T2259 import T2259 +from .T2270 import T2270 +from .T2272 import T2272 +from .T2273 import T2273 +from .T2181 import T2181 +from .T2182 import T2182 +from .T2190 import T2190 +from .T2192 import T2192 +from .T2193 import T2193 +from .T2194 import T2194 +from .T2261 import T2261 +from .T2262 import T2262 +from .T2320 import T2320 + +ROBOVAC_MODELS = { + "T2103": T2103, + "T2117": T2117, + "T2118": T2118, + "T2119": T2119, + "T2120": T2120, + "T2123": T2123, + "T2128": T2128, + "T2130": T2130, + "T2132": T2132, + "T1250": T1250, + "T2250": T2250, + "T2251": T2251, + "T2252": T2252, + "T2253": T2253, + "T2254": T2254, + "T2150": T2150, + "T2255": T2255, + "T2256": T2256, + "T2257": T2257, + "T2258": T2258, + "T2259": T2259, + "T2270": T2270, + "T2272": T2272, + "T2273": T2273, + "T2181": T2181, + "T2182": T2182, + "T2190": T2190, + "T2192": T2192, + "T2193": T2193, + "T2194": T2194, + "T2261": T2261, + "T2262": T2262, + "T2320": T2320, +} diff --git a/custom_components/robovac/vacuums/base.py b/custom_components/robovac/vacuums/base.py new file mode 100644 index 0000000..6fb012f --- /dev/null +++ b/custom_components/robovac/vacuums/base.py @@ -0,0 +1,35 @@ +from enum import IntEnum, StrEnum + + +class RoboVacEntityFeature(IntEnum): + """Supported features of the RoboVac entity.""" + + EDGE = 1 + SMALL_ROOM = 2 + CLEANING_TIME = 4 + CLEANING_AREA = 8 + DO_NOT_DISTURB = 16 + AUTO_RETURN = 32 + CONSUMABLES = 64 + ROOM = 128 + ZONE = 256 + MAP = 512 + BOOST_IQ = 1024 + + +class RobovacCommand(StrEnum): + PAUSE = "pause" + DIRECTION = "direction" + MODE = "mode" + STATUS = "status" + RETURN_HOME = "return_home" + FAN_SPEED = "fan_speed" + LOCATE = "locate" + BATTERY = "battery" + ERROR = "error" + CLEANING_AREA = "cleaning_area" + CLEANING_TIME = "cleaning_time" + AUTO_RETURN = "auto_return" + DO_NOT_DISTURB = "do_not_disturb" + BOOST_IQ = "boost_iq" + CONSUMABLES = "consumables" diff --git a/generate.js b/generate.js new file mode 100644 index 0000000..fa82b39 --- /dev/null +++ b/generate.js @@ -0,0 +1,206 @@ +const fs = require("fs/promises"); +const path = require("path"); + +const ROBOVAC_SERIES = { + C: [ + "T2103", + "T2117", + "T2118", + "T2119", + "T2120", + "T2123", + "T2128", + "T2130", + "T2132", + ], + G: [ + "T1250", + "T2250", + "T2251", + "T2252", + "T2253", + "T2254", + "T2150", + "T2255", + "T2256", + "T2257", + "T2258", + "T2259", + "T2270", + "T2272", + "T2273", + ], + L: ["T2181", "T2182", "T2190", "T2192", "T2193", "T2194"], + X: ["T2261", "T2262", "T2320"], +}; + +const HAS_MAP_FEATURE = [ + "T2253", + ...ROBOVAC_SERIES["L"], + ...ROBOVAC_SERIES["X"], +]; + +const HAS_CONSUMABLES = [ + "T1250", + "T2181", + "T2182", + "T2190", + "T2193", + "T2194", + "T2253", + "T2256", + "T2258", + "T2261", + "T2273", + "T2320", +]; + +const ROBOVAC_SERIES_FEATURES = { + C: ["RoboVacEntityFeature.EDGE", "RoboVacEntityFeature.SMALL_ROOM"], + G: [ + "RoboVacEntityFeature.CLEANING_TIME", + "RoboVacEntityFeature.CLEANING_AREA", + "RoboVacEntityFeature.DO_NOT_DISTURB", + "RoboVacEntityFeature.AUTO_RETURN", + ], + L: [ + "RoboVacEntityFeature.CLEANING_TIME", + "RoboVacEntityFeature.CLEANING_AREA", + "RoboVacEntityFeature.DO_NOT_DISTURB", + "RoboVacEntityFeature.AUTO_RETURN", + "RoboVacEntityFeature.ROOM", + "RoboVacEntityFeature.ZONE", + "RoboVacEntityFeature.BOOST_IQ", + ], + X: [ + "RoboVacEntityFeature.CLEANING_TIME", + "RoboVacEntityFeature.CLEANING_AREA", + "RoboVacEntityFeature.DO_NOT_DISTURB", + "RoboVacEntityFeature.AUTO_RETURN", + "RoboVacEntityFeature.ROOM", + "RoboVacEntityFeature.ZONE", + "RoboVacEntityFeature.BOOST_IQ", + ], +}; + +const ROBOVAC_SERIES_FAN_SPEEDS = { + C: ["No_Suction", "Standard", "Boost_IQ", "Max"], + G: ["Standard", "Turbo", "Max", "Boost_IQ"], + L: ["Quiet", "Standard", "Turbo", "Max"], + X: ["Pure", "Standard", "Turbo", "Max"], +}; + +const commands = [ + "CLEANING_AREA", + "CLEANING_TIME", + "AUTO_RETURN", + "DO_NOT_DISTURB", + "BOOST_IQ", + "CONSUMABLES", +]; + +const allModels = []; + +Object.entries(ROBOVAC_SERIES).forEach(([series, models]) => { + models.forEach((model) => { + allModels.push(model); + + const robovac_features = [...ROBOVAC_SERIES_FEATURES[series]]; + const homeassistant_features = [ + "VacuumEntityFeature.BATTERY", + "VacuumEntityFeature.CLEAN_SPOT", + "VacuumEntityFeature.FAN_SPEED", + "VacuumEntityFeature.LOCATE", + "VacuumEntityFeature.PAUSE", + "VacuumEntityFeature.RETURN_HOME", + "VacuumEntityFeature.SEND_COMMAND", + "VacuumEntityFeature.START", + "VacuumEntityFeature.STATE", + "VacuumEntityFeature.STOP", + ]; + + if (HAS_MAP_FEATURE.includes(model)) { + homeassistant_features.push("VacuumEntityFeature.MAP"); + robovac_features.push("RoboVacEntityFeature.MAP"); + } + + if (HAS_CONSUMABLES.includes(model)) { + robovac_features.push("RoboVacEntityFeature.CONSUMABLES"); + } + + const extra_commands = commands + .filter((command) => + robovac_features.includes(`RoboVacEntityFeature.${command}`) + ) + .map((command) => `# RobovacCommand.${command}: 0,`); + + if (extra_commands.length > 0) { + extra_commands.unshift("# These commands need codes adding"); + } + + const file = `from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class ${model}: + homeassistant_features = ( + ${homeassistant_features.join("\n | ")} + ) + robovac_features = ${robovac_features.join(" | ")} + commands = { + RobovacCommand.PAUSE: 2, + RobovacCommand.DIRECTION: { + "code": 3, + "values": ["forward", "back", "left", "right"], + }, + RobovacCommand.MODE: { + "code": 5, + "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 15, + RobovacCommand.RETURN_HOME: 101, + RobovacCommand.FAN_SPEED: { + "code": 102, + "values": ${JSON.stringify(ROBOVAC_SERIES_FAN_SPEEDS[series])}, + }, + RobovacCommand.LOCATE: 103, + RobovacCommand.BATTERY: 104, + RobovacCommand.ERROR: 106,${ + extra_commands.length > 0 + ? `\n ${extra_commands.join("\n ")}` + : "" + } + } +`; + fs.writeFile( + path.join( + __dirname, + "custom_components", + "robovac", + "vacuums", + `${model}.py` + ), + file + ); + }); +}); + +const initFile = `${allModels + .map((model) => `from .${model} import ${model}`) + .join("\n")} + + +ROBOVAC_MODELS = { +${allModels.map((model) => ` "${model}": ${model}`).join(",\n")} +}`; + +fs.writeFile( + path.join( + __dirname, + "custom_components", + "robovac", + "vacuums", + `__init__.py` + ), + initFile +); From 50f7443f736573062602d5cb20efabbf12cce4c6 Mon Sep 17 00:00:00 2001 From: Luke Bonaccorsi Date: Wed, 6 Mar 2024 14:46:02 +0000 Subject: [PATCH 02/17] fix: fixes after first test --- custom_components/robovac/robovac.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/custom_components/robovac/robovac.py b/custom_components/robovac/robovac.py index ba3faa1..43fdeae 100644 --- a/custom_components/robovac/robovac.py +++ b/custom_components/robovac/robovac.py @@ -11,7 +11,7 @@ class RoboVac(TuyaDevice): """""" def __init__(self, model_code, *args, **kwargs): - if model_code not in ROBOVAC_MODELS[model_code] is None: + if model_code not in ROBOVAC_MODELS: raise ModelNotSupportedException( "Model {} is not supported".format(model_code) ) @@ -26,20 +26,20 @@ def getRoboVacFeatures(self): return self.model_details.robovac_features def getFanSpeeds(self): - return self.model_details.commands[RobovacCommand.FAN_SPEED].values + return self.model_details.commands[RobovacCommand.FAN_SPEED]["values"] def getModes(self): - return self.model_details.commands[RobovacCommand.MODE].values + return self.model_details.commands[RobovacCommand.MODE]["values"] def getSupportedCommands(self): return list(self.model_details.commands.keys()) def getCommandCodes(self): command_codes = {} - for key, value in self.model_details.commands: + for key, value in self.model_details.commands.items(): if isinstance(value, dict): - command_codes[key] = value.code + command_codes[key] = str(value["code"]) else: - command_codes[key] = value + command_codes[key] = str(value) return command_codes From be42e7c155c1154a4d81e7261186395fac7c0ac6 Mon Sep 17 00:00:00 2001 From: Luke Bonaccorsi Date: Wed, 6 Mar 2024 18:42:42 +0000 Subject: [PATCH 03/17] fix: fix for slow init --- custom_components/robovac/tuyalocalapi.py | 5 +-- custom_components/robovac/vacuum.py | 54 +++++++++++++++++------ 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/custom_components/robovac/tuyalocalapi.py b/custom_components/robovac/tuyalocalapi.py index cc13e2d..e7cf854 100644 --- a/custom_components/robovac/tuyalocalapi.py +++ b/custom_components/robovac/tuyalocalapi.py @@ -761,7 +761,7 @@ async def async_get(self): message = Message(Message.GET_COMMAND, payload, encrypt=encrypt, device=self) self._queue.append(message) response = await self.async_recieve(message) - asyncio.create_task(self.async_update_state(response)) + await self.async_update_state(response) async def async_set(self, dps): t = int(time.time()) @@ -903,9 +903,6 @@ async def _async_send(self, message, retries=2): await self._async_send(message, retries=retries - 1) async def async_recieve(self, message): - if self._connected is False: - return - if message.expect_response is True: try: self._recieve_task = asyncio.create_task( diff --git a/custom_components/robovac/vacuum.py b/custom_components/robovac/vacuum.py index 4ce1f56..9ecc2e1 100644 --- a/custom_components/robovac/vacuum.py +++ b/custom_components/robovac/vacuum.py @@ -266,7 +266,15 @@ def __init__(self, item) -> None: self._attr_supported_features = self.vacuum.getHomeAssistantFeatures() self._attr_robovac_supported = self.vacuum.getRoboVacFeatures() - self._attr_fan_speed_list = self.vacuum.getFanSpeeds() + + fan_speeds = self.vacuum.getFanSpeeds() + self.fan_speed_map = {} + + for speed in fan_speeds: + self.fan_speed_map[friendly_text(speed)] = speed + + self._attr_fan_speed_list = list(self.fan_speed_map.keys()) + _LOGGER.debug(self._attr_fan_speed_list) self._tuya_command_codes = self.vacuum.getCommandCodes() self._attr_mode = None @@ -285,19 +293,14 @@ def __init__(self, item) -> None: self.tuya_state = None self.tuyastatus = None + async def async_added_to_hass(self): + await self.async_forced_update() + async def async_update(self): """Synchronise state from the vacuum.""" - if self.error_code == "UNSUPPORTED_MODEL": - return - - if self.ip_address == "": - self.error_code = "IP_ADDRESS" - return - try: - await self.vacuum.async_get() + await self.async_update_vacuum() self.update_failures = 0 - self.update_entity_values() except TuyaException as e: self.update_failures += 1 _LOGGER.warn( @@ -308,6 +311,21 @@ async def async_update(self): if self.update_failures >= UPDATE_RETRIES: self.error_code = "CONNECTION_FAILED" + async def async_update_vacuum(self): + if self.error_code == "UNSUPPORTED_MODEL": + return + + if self.ip_address == "": + self.error_code = "IP_ADDRESS" + return + + await self.vacuum.async_get() + self.update_entity_values() + + async def async_forced_update(self): + await self.async_update_vacuum() + self.async_write_ha_state() + async def pushed_update_handler(self): self.update_entity_values() self.async_write_ha_state() @@ -327,8 +345,8 @@ def update_entity_values(self): self._attr_mode = self.tuyastatus.get( self._tuya_command_codes[RobovacCommand.MODE] ) - self._attr_fan_speed = self.tuyastatus.get( - self._tuya_command_codes[RobovacCommand.FAN_SPEED] + self._attr_fan_speed = friendly_text( + self.tuyastatus.get(self._tuya_command_codes[RobovacCommand.FAN_SPEED], "") ) if self.robovac_supported & RoboVacEntityFeature.CLEANING_AREA: @@ -414,7 +432,11 @@ async def async_set_fan_speed(self, fan_speed, **kwargs): """Set fan speed.""" _LOGGER.info("Fan Speed Selected") await self.vacuum.async_set( - {self._tuya_command_codes[RobovacCommand.FAN_SPEED]: fan_speed} + { + self._tuya_command_codes[RobovacCommand.FAN_SPEED]: self.fan_speed_map[ + fan_speed + ] + } ) async def async_send_command( @@ -461,3 +483,9 @@ async def async_send_command( async def async_will_remove_from_hass(self): await self.vacuum.async_disable() + + +def friendly_text(input): + return " ".join( + word[0].upper() + word[1:] for word in input.replace("_", " ").split() + ) From 4918c9f7a62f95fdf16baecfe939f4f2a1219647 Mon Sep 17 00:00:00 2001 From: Luke Bonaccorsi Date: Thu, 7 Mar 2024 00:30:32 +0000 Subject: [PATCH 04/17] feat: force update on command, and switch to using start/pause command --- custom_components/robovac/vacuum.py | 13 ++++++++++--- custom_components/robovac/vacuums/T1250.py | 2 +- custom_components/robovac/vacuums/T2103.py | 4 ++-- custom_components/robovac/vacuums/T2117.py | 4 ++-- custom_components/robovac/vacuums/T2118.py | 4 ++-- custom_components/robovac/vacuums/T2119.py | 4 ++-- custom_components/robovac/vacuums/T2120.py | 4 ++-- custom_components/robovac/vacuums/T2123.py | 4 ++-- custom_components/robovac/vacuums/T2128.py | 4 ++-- custom_components/robovac/vacuums/T2130.py | 4 ++-- custom_components/robovac/vacuums/T2132.py | 4 ++-- custom_components/robovac/vacuums/T2150.py | 2 +- custom_components/robovac/vacuums/T2181.py | 2 +- custom_components/robovac/vacuums/T2182.py | 2 +- custom_components/robovac/vacuums/T2190.py | 2 +- custom_components/robovac/vacuums/T2192.py | 2 +- custom_components/robovac/vacuums/T2193.py | 2 +- custom_components/robovac/vacuums/T2194.py | 2 +- custom_components/robovac/vacuums/T2250.py | 2 +- custom_components/robovac/vacuums/T2251.py | 2 +- custom_components/robovac/vacuums/T2252.py | 2 +- custom_components/robovac/vacuums/T2253.py | 2 +- custom_components/robovac/vacuums/T2254.py | 2 +- custom_components/robovac/vacuums/T2255.py | 2 +- custom_components/robovac/vacuums/T2256.py | 2 +- custom_components/robovac/vacuums/T2257.py | 2 +- custom_components/robovac/vacuums/T2258.py | 2 +- custom_components/robovac/vacuums/T2259.py | 2 +- custom_components/robovac/vacuums/T2261.py | 2 +- custom_components/robovac/vacuums/T2262.py | 2 +- custom_components/robovac/vacuums/T2270.py | 2 +- custom_components/robovac/vacuums/T2272.py | 2 +- custom_components/robovac/vacuums/T2273.py | 2 +- custom_components/robovac/vacuums/T2320.py | 2 +- custom_components/robovac/vacuums/__init__.py | 5 +++-- custom_components/robovac/vacuums/base.py | 2 +- generate.js | 4 ++-- 37 files changed, 58 insertions(+), 50 deletions(-) diff --git a/custom_components/robovac/vacuum.py b/custom_components/robovac/vacuum.py index 9ecc2e1..2816976 100644 --- a/custom_components/robovac/vacuum.py +++ b/custom_components/robovac/vacuum.py @@ -399,6 +399,7 @@ async def async_locate(self, **kwargs): await self.vacuum.async_set({code: False}) else: await self.vacuum.async_set({code: True}) + asyncio.create_task(self.async_forced_update()) async def async_return_to_base(self, **kwargs): """Set the vacuum cleaner to return to the dock.""" @@ -406,20 +407,23 @@ async def async_return_to_base(self, **kwargs): await self.vacuum.async_set( {self._tuya_command_codes[RobovacCommand.RETURN_HOME]: True} ) + asyncio.create_task(self.async_forced_update()) async def async_start(self, **kwargs): - self._attr_mode = "auto" await self.vacuum.async_set( - {self._tuya_command_codes[RobovacCommand.MODE]: self.mode} + {self._tuya_command_codes[RobovacCommand.START_PAUSE]: True} ) + asyncio.create_task(self.async_forced_update()) async def async_pause(self, **kwargs): await self.vacuum.async_set( - {self._tuya_command_codes[RobovacCommand.PAUSE]: False} + {self._tuya_command_codes[RobovacCommand.START_PAUSE]: False} ) + asyncio.create_task(self.async_forced_update()) async def async_stop(self, **kwargs): await self.async_return_to_base() + asyncio.create_task(self.async_forced_update()) async def async_clean_spot(self, **kwargs): """Perform a spot clean-up.""" @@ -427,6 +431,7 @@ async def async_clean_spot(self, **kwargs): await self.vacuum.async_set( {self._tuya_command_codes[RobovacCommand.MODE]: "Spot"} ) + asyncio.create_task(self.async_forced_update()) async def async_set_fan_speed(self, fan_speed, **kwargs): """Set fan speed.""" @@ -438,6 +443,7 @@ async def async_set_fan_speed(self, fan_speed, **kwargs): ] } ) + asyncio.create_task(self.async_forced_update()) async def async_send_command( self, command: str, params: dict | list | None = None, **kwargs @@ -480,6 +486,7 @@ async def async_send_command( base64_str = base64.b64encode(json_str.encode("utf8")).decode("utf8") _LOGGER.info("roomClean call %s", json_str) await self.vacuum.async_set({"124": base64_str}) + asyncio.create_task(self.async_forced_update()) async def async_will_remove_from_hass(self): await self.vacuum.async_disable() diff --git a/custom_components/robovac/vacuums/T1250.py b/custom_components/robovac/vacuums/T1250.py index f864041..794a5b7 100644 --- a/custom_components/robovac/vacuums/T1250.py +++ b/custom_components/robovac/vacuums/T1250.py @@ -17,7 +17,7 @@ class T1250: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.CONSUMABLES commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/T2103.py b/custom_components/robovac/vacuums/T2103.py index 5d4afb3..6940438 100644 --- a/custom_components/robovac/vacuums/T2103.py +++ b/custom_components/robovac/vacuums/T2103.py @@ -17,7 +17,7 @@ class T2103: ) robovac_features = RoboVacEntityFeature.EDGE | RoboVacEntityFeature.SMALL_ROOM commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], @@ -30,7 +30,7 @@ class T2103: RobovacCommand.RETURN_HOME: 101, RobovacCommand.FAN_SPEED: { "code": 102, - "values": ["No_Suction","Standard","Boost_IQ","Max"], + "values": ["No_suction","Standard","Boost_IQ","Max"], }, RobovacCommand.LOCATE: 103, RobovacCommand.BATTERY: 104, diff --git a/custom_components/robovac/vacuums/T2117.py b/custom_components/robovac/vacuums/T2117.py index 8e73b28..aae4db6 100644 --- a/custom_components/robovac/vacuums/T2117.py +++ b/custom_components/robovac/vacuums/T2117.py @@ -17,7 +17,7 @@ class T2117: ) robovac_features = RoboVacEntityFeature.EDGE | RoboVacEntityFeature.SMALL_ROOM commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], @@ -30,7 +30,7 @@ class T2117: RobovacCommand.RETURN_HOME: 101, RobovacCommand.FAN_SPEED: { "code": 102, - "values": ["No_Suction","Standard","Boost_IQ","Max"], + "values": ["No_suction","Standard","Boost_IQ","Max"], }, RobovacCommand.LOCATE: 103, RobovacCommand.BATTERY: 104, diff --git a/custom_components/robovac/vacuums/T2118.py b/custom_components/robovac/vacuums/T2118.py index a7e7955..cc927ce 100644 --- a/custom_components/robovac/vacuums/T2118.py +++ b/custom_components/robovac/vacuums/T2118.py @@ -17,7 +17,7 @@ class T2118: ) robovac_features = RoboVacEntityFeature.EDGE | RoboVacEntityFeature.SMALL_ROOM commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], @@ -30,7 +30,7 @@ class T2118: RobovacCommand.RETURN_HOME: 101, RobovacCommand.FAN_SPEED: { "code": 102, - "values": ["No_Suction","Standard","Boost_IQ","Max"], + "values": ["No_suction","Standard","Boost_IQ","Max"], }, RobovacCommand.LOCATE: 103, RobovacCommand.BATTERY: 104, diff --git a/custom_components/robovac/vacuums/T2119.py b/custom_components/robovac/vacuums/T2119.py index 7c5f738..420a5f5 100644 --- a/custom_components/robovac/vacuums/T2119.py +++ b/custom_components/robovac/vacuums/T2119.py @@ -17,7 +17,7 @@ class T2119: ) robovac_features = RoboVacEntityFeature.EDGE | RoboVacEntityFeature.SMALL_ROOM commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], @@ -30,7 +30,7 @@ class T2119: RobovacCommand.RETURN_HOME: 101, RobovacCommand.FAN_SPEED: { "code": 102, - "values": ["No_Suction","Standard","Boost_IQ","Max"], + "values": ["No_suction","Standard","Boost_IQ","Max"], }, RobovacCommand.LOCATE: 103, RobovacCommand.BATTERY: 104, diff --git a/custom_components/robovac/vacuums/T2120.py b/custom_components/robovac/vacuums/T2120.py index cdf0995..ab28eb8 100644 --- a/custom_components/robovac/vacuums/T2120.py +++ b/custom_components/robovac/vacuums/T2120.py @@ -17,7 +17,7 @@ class T2120: ) robovac_features = RoboVacEntityFeature.EDGE | RoboVacEntityFeature.SMALL_ROOM commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], @@ -30,7 +30,7 @@ class T2120: RobovacCommand.RETURN_HOME: 101, RobovacCommand.FAN_SPEED: { "code": 102, - "values": ["No_Suction","Standard","Boost_IQ","Max"], + "values": ["No_suction","Standard","Boost_IQ","Max"], }, RobovacCommand.LOCATE: 103, RobovacCommand.BATTERY: 104, diff --git a/custom_components/robovac/vacuums/T2123.py b/custom_components/robovac/vacuums/T2123.py index f0c9683..d1817d7 100644 --- a/custom_components/robovac/vacuums/T2123.py +++ b/custom_components/robovac/vacuums/T2123.py @@ -17,7 +17,7 @@ class T2123: ) robovac_features = RoboVacEntityFeature.EDGE | RoboVacEntityFeature.SMALL_ROOM commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], @@ -30,7 +30,7 @@ class T2123: RobovacCommand.RETURN_HOME: 101, RobovacCommand.FAN_SPEED: { "code": 102, - "values": ["No_Suction","Standard","Boost_IQ","Max"], + "values": ["No_suction","Standard","Boost_IQ","Max"], }, RobovacCommand.LOCATE: 103, RobovacCommand.BATTERY: 104, diff --git a/custom_components/robovac/vacuums/T2128.py b/custom_components/robovac/vacuums/T2128.py index e97e406..8fbdef1 100644 --- a/custom_components/robovac/vacuums/T2128.py +++ b/custom_components/robovac/vacuums/T2128.py @@ -17,7 +17,7 @@ class T2128: ) robovac_features = RoboVacEntityFeature.EDGE | RoboVacEntityFeature.SMALL_ROOM commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], @@ -30,7 +30,7 @@ class T2128: RobovacCommand.RETURN_HOME: 101, RobovacCommand.FAN_SPEED: { "code": 102, - "values": ["No_Suction","Standard","Boost_IQ","Max"], + "values": ["No_suction","Standard","Boost_IQ","Max"], }, RobovacCommand.LOCATE: 103, RobovacCommand.BATTERY: 104, diff --git a/custom_components/robovac/vacuums/T2130.py b/custom_components/robovac/vacuums/T2130.py index a482f94..1446665 100644 --- a/custom_components/robovac/vacuums/T2130.py +++ b/custom_components/robovac/vacuums/T2130.py @@ -17,7 +17,7 @@ class T2130: ) robovac_features = RoboVacEntityFeature.EDGE | RoboVacEntityFeature.SMALL_ROOM commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], @@ -30,7 +30,7 @@ class T2130: RobovacCommand.RETURN_HOME: 101, RobovacCommand.FAN_SPEED: { "code": 102, - "values": ["No_Suction","Standard","Boost_IQ","Max"], + "values": ["No_suction","Standard","Boost_IQ","Max"], }, RobovacCommand.LOCATE: 103, RobovacCommand.BATTERY: 104, diff --git a/custom_components/robovac/vacuums/T2132.py b/custom_components/robovac/vacuums/T2132.py index 56ba2d2..63101d6 100644 --- a/custom_components/robovac/vacuums/T2132.py +++ b/custom_components/robovac/vacuums/T2132.py @@ -17,7 +17,7 @@ class T2132: ) robovac_features = RoboVacEntityFeature.EDGE | RoboVacEntityFeature.SMALL_ROOM commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], @@ -30,7 +30,7 @@ class T2132: RobovacCommand.RETURN_HOME: 101, RobovacCommand.FAN_SPEED: { "code": 102, - "values": ["No_Suction","Standard","Boost_IQ","Max"], + "values": ["No_suction","Standard","Boost_IQ","Max"], }, RobovacCommand.LOCATE: 103, RobovacCommand.BATTERY: 104, diff --git a/custom_components/robovac/vacuums/T2150.py b/custom_components/robovac/vacuums/T2150.py index 1ac4f5e..480a758 100644 --- a/custom_components/robovac/vacuums/T2150.py +++ b/custom_components/robovac/vacuums/T2150.py @@ -17,7 +17,7 @@ class T2150: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/T2181.py b/custom_components/robovac/vacuums/T2181.py index 5b322cf..04ce1e8 100644 --- a/custom_components/robovac/vacuums/T2181.py +++ b/custom_components/robovac/vacuums/T2181.py @@ -18,7 +18,7 @@ class T2181: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.ROOM | RoboVacEntityFeature.ZONE | RoboVacEntityFeature.BOOST_IQ | RoboVacEntityFeature.MAP | RoboVacEntityFeature.CONSUMABLES commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/T2182.py b/custom_components/robovac/vacuums/T2182.py index 3cde0ad..414ee46 100644 --- a/custom_components/robovac/vacuums/T2182.py +++ b/custom_components/robovac/vacuums/T2182.py @@ -18,7 +18,7 @@ class T2182: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.ROOM | RoboVacEntityFeature.ZONE | RoboVacEntityFeature.BOOST_IQ | RoboVacEntityFeature.MAP | RoboVacEntityFeature.CONSUMABLES commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/T2190.py b/custom_components/robovac/vacuums/T2190.py index 8ab2496..f906d2b 100644 --- a/custom_components/robovac/vacuums/T2190.py +++ b/custom_components/robovac/vacuums/T2190.py @@ -18,7 +18,7 @@ class T2190: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.ROOM | RoboVacEntityFeature.ZONE | RoboVacEntityFeature.BOOST_IQ | RoboVacEntityFeature.MAP | RoboVacEntityFeature.CONSUMABLES commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/T2192.py b/custom_components/robovac/vacuums/T2192.py index 19ae1cf..e56aee1 100644 --- a/custom_components/robovac/vacuums/T2192.py +++ b/custom_components/robovac/vacuums/T2192.py @@ -18,7 +18,7 @@ class T2192: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.ROOM | RoboVacEntityFeature.ZONE | RoboVacEntityFeature.BOOST_IQ | RoboVacEntityFeature.MAP commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/T2193.py b/custom_components/robovac/vacuums/T2193.py index baaba5b..3996f3b 100644 --- a/custom_components/robovac/vacuums/T2193.py +++ b/custom_components/robovac/vacuums/T2193.py @@ -18,7 +18,7 @@ class T2193: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.ROOM | RoboVacEntityFeature.ZONE | RoboVacEntityFeature.BOOST_IQ | RoboVacEntityFeature.MAP | RoboVacEntityFeature.CONSUMABLES commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/T2194.py b/custom_components/robovac/vacuums/T2194.py index cb0757b..362bfa4 100644 --- a/custom_components/robovac/vacuums/T2194.py +++ b/custom_components/robovac/vacuums/T2194.py @@ -18,7 +18,7 @@ class T2194: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.ROOM | RoboVacEntityFeature.ZONE | RoboVacEntityFeature.BOOST_IQ | RoboVacEntityFeature.MAP | RoboVacEntityFeature.CONSUMABLES commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/T2250.py b/custom_components/robovac/vacuums/T2250.py index 82adc0c..e551d91 100644 --- a/custom_components/robovac/vacuums/T2250.py +++ b/custom_components/robovac/vacuums/T2250.py @@ -17,7 +17,7 @@ class T2250: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/T2251.py b/custom_components/robovac/vacuums/T2251.py index e98c74d..058cfd4 100644 --- a/custom_components/robovac/vacuums/T2251.py +++ b/custom_components/robovac/vacuums/T2251.py @@ -17,7 +17,7 @@ class T2251: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/T2252.py b/custom_components/robovac/vacuums/T2252.py index 6b6abb6..86fea2a 100644 --- a/custom_components/robovac/vacuums/T2252.py +++ b/custom_components/robovac/vacuums/T2252.py @@ -17,7 +17,7 @@ class T2252: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/T2253.py b/custom_components/robovac/vacuums/T2253.py index 8c54c4a..7bc100d 100644 --- a/custom_components/robovac/vacuums/T2253.py +++ b/custom_components/robovac/vacuums/T2253.py @@ -18,7 +18,7 @@ class T2253: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.MAP | RoboVacEntityFeature.CONSUMABLES commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/T2254.py b/custom_components/robovac/vacuums/T2254.py index 25d380b..f0d5f51 100644 --- a/custom_components/robovac/vacuums/T2254.py +++ b/custom_components/robovac/vacuums/T2254.py @@ -17,7 +17,7 @@ class T2254: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/T2255.py b/custom_components/robovac/vacuums/T2255.py index 11f2a1d..b7444f8 100644 --- a/custom_components/robovac/vacuums/T2255.py +++ b/custom_components/robovac/vacuums/T2255.py @@ -17,7 +17,7 @@ class T2255: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/T2256.py b/custom_components/robovac/vacuums/T2256.py index a49792c..96a44d6 100644 --- a/custom_components/robovac/vacuums/T2256.py +++ b/custom_components/robovac/vacuums/T2256.py @@ -17,7 +17,7 @@ class T2256: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.CONSUMABLES commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/T2257.py b/custom_components/robovac/vacuums/T2257.py index ec9c1ca..f641a21 100644 --- a/custom_components/robovac/vacuums/T2257.py +++ b/custom_components/robovac/vacuums/T2257.py @@ -17,7 +17,7 @@ class T2257: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/T2258.py b/custom_components/robovac/vacuums/T2258.py index bfaf722..bb755a5 100644 --- a/custom_components/robovac/vacuums/T2258.py +++ b/custom_components/robovac/vacuums/T2258.py @@ -17,7 +17,7 @@ class T2258: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.CONSUMABLES commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/T2259.py b/custom_components/robovac/vacuums/T2259.py index 08cf881..58482ab 100644 --- a/custom_components/robovac/vacuums/T2259.py +++ b/custom_components/robovac/vacuums/T2259.py @@ -17,7 +17,7 @@ class T2259: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/T2261.py b/custom_components/robovac/vacuums/T2261.py index cb41e12..1a23743 100644 --- a/custom_components/robovac/vacuums/T2261.py +++ b/custom_components/robovac/vacuums/T2261.py @@ -18,7 +18,7 @@ class T2261: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.ROOM | RoboVacEntityFeature.ZONE | RoboVacEntityFeature.BOOST_IQ | RoboVacEntityFeature.MAP | RoboVacEntityFeature.CONSUMABLES commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/T2262.py b/custom_components/robovac/vacuums/T2262.py index aecc8c5..2b5f879 100644 --- a/custom_components/robovac/vacuums/T2262.py +++ b/custom_components/robovac/vacuums/T2262.py @@ -18,7 +18,7 @@ class T2262: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.ROOM | RoboVacEntityFeature.ZONE | RoboVacEntityFeature.BOOST_IQ | RoboVacEntityFeature.MAP commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/T2270.py b/custom_components/robovac/vacuums/T2270.py index e9dbf3d..9ed8a9c 100644 --- a/custom_components/robovac/vacuums/T2270.py +++ b/custom_components/robovac/vacuums/T2270.py @@ -17,7 +17,7 @@ class T2270: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/T2272.py b/custom_components/robovac/vacuums/T2272.py index c810bfc..09529d4 100644 --- a/custom_components/robovac/vacuums/T2272.py +++ b/custom_components/robovac/vacuums/T2272.py @@ -17,7 +17,7 @@ class T2272: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/T2273.py b/custom_components/robovac/vacuums/T2273.py index 05a1bd4..1261ff0 100644 --- a/custom_components/robovac/vacuums/T2273.py +++ b/custom_components/robovac/vacuums/T2273.py @@ -17,7 +17,7 @@ class T2273: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.CONSUMABLES commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/T2320.py b/custom_components/robovac/vacuums/T2320.py index 2e7670b..ef4b690 100644 --- a/custom_components/robovac/vacuums/T2320.py +++ b/custom_components/robovac/vacuums/T2320.py @@ -18,7 +18,7 @@ class T2320: ) robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.ROOM | RoboVacEntityFeature.ZONE | RoboVacEntityFeature.BOOST_IQ | RoboVacEntityFeature.MAP | RoboVacEntityFeature.CONSUMABLES commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], diff --git a/custom_components/robovac/vacuums/__init__.py b/custom_components/robovac/vacuums/__init__.py index ea6de56..979a5cb 100644 --- a/custom_components/robovac/vacuums/__init__.py +++ b/custom_components/robovac/vacuums/__init__.py @@ -32,6 +32,7 @@ from .T2262 import T2262 from .T2320 import T2320 + ROBOVAC_MODELS = { "T2103": T2103, "T2117": T2117, @@ -65,5 +66,5 @@ "T2194": T2194, "T2261": T2261, "T2262": T2262, - "T2320": T2320, -} + "T2320": T2320 +} \ No newline at end of file diff --git a/custom_components/robovac/vacuums/base.py b/custom_components/robovac/vacuums/base.py index 6fb012f..90f4bec 100644 --- a/custom_components/robovac/vacuums/base.py +++ b/custom_components/robovac/vacuums/base.py @@ -18,7 +18,7 @@ class RoboVacEntityFeature(IntEnum): class RobovacCommand(StrEnum): - PAUSE = "pause" + START_PAUSE = "start_pause" DIRECTION = "direction" MODE = "mode" STATUS = "status" diff --git a/generate.js b/generate.js index fa82b39..ad0ea2e 100644 --- a/generate.js +++ b/generate.js @@ -84,7 +84,7 @@ const ROBOVAC_SERIES_FEATURES = { }; const ROBOVAC_SERIES_FAN_SPEEDS = { - C: ["No_Suction", "Standard", "Boost_IQ", "Max"], + C: ["No_suction", "Standard", "Boost_IQ", "Max"], G: ["Standard", "Turbo", "Max", "Boost_IQ"], L: ["Quiet", "Standard", "Turbo", "Max"], X: ["Pure", "Standard", "Turbo", "Max"], @@ -148,7 +148,7 @@ class ${model}: ) robovac_features = ${robovac_features.join(" | ")} commands = { - RobovacCommand.PAUSE: 2, + RobovacCommand.START_PAUSE: 2, RobovacCommand.DIRECTION: { "code": 3, "values": ["forward", "back", "left", "right"], From 7381afc7ad15c652de86a18fc14d26af5c77d3a7 Mon Sep 17 00:00:00 2001 From: Luke Bonaccorsi Date: Wed, 20 Mar 2024 22:56:36 +0000 Subject: [PATCH 05/17] chore: remove generate.js [skip ci] --- generate.js | 206 ---------------------------------------------------- 1 file changed, 206 deletions(-) delete mode 100644 generate.js diff --git a/generate.js b/generate.js deleted file mode 100644 index ad0ea2e..0000000 --- a/generate.js +++ /dev/null @@ -1,206 +0,0 @@ -const fs = require("fs/promises"); -const path = require("path"); - -const ROBOVAC_SERIES = { - C: [ - "T2103", - "T2117", - "T2118", - "T2119", - "T2120", - "T2123", - "T2128", - "T2130", - "T2132", - ], - G: [ - "T1250", - "T2250", - "T2251", - "T2252", - "T2253", - "T2254", - "T2150", - "T2255", - "T2256", - "T2257", - "T2258", - "T2259", - "T2270", - "T2272", - "T2273", - ], - L: ["T2181", "T2182", "T2190", "T2192", "T2193", "T2194"], - X: ["T2261", "T2262", "T2320"], -}; - -const HAS_MAP_FEATURE = [ - "T2253", - ...ROBOVAC_SERIES["L"], - ...ROBOVAC_SERIES["X"], -]; - -const HAS_CONSUMABLES = [ - "T1250", - "T2181", - "T2182", - "T2190", - "T2193", - "T2194", - "T2253", - "T2256", - "T2258", - "T2261", - "T2273", - "T2320", -]; - -const ROBOVAC_SERIES_FEATURES = { - C: ["RoboVacEntityFeature.EDGE", "RoboVacEntityFeature.SMALL_ROOM"], - G: [ - "RoboVacEntityFeature.CLEANING_TIME", - "RoboVacEntityFeature.CLEANING_AREA", - "RoboVacEntityFeature.DO_NOT_DISTURB", - "RoboVacEntityFeature.AUTO_RETURN", - ], - L: [ - "RoboVacEntityFeature.CLEANING_TIME", - "RoboVacEntityFeature.CLEANING_AREA", - "RoboVacEntityFeature.DO_NOT_DISTURB", - "RoboVacEntityFeature.AUTO_RETURN", - "RoboVacEntityFeature.ROOM", - "RoboVacEntityFeature.ZONE", - "RoboVacEntityFeature.BOOST_IQ", - ], - X: [ - "RoboVacEntityFeature.CLEANING_TIME", - "RoboVacEntityFeature.CLEANING_AREA", - "RoboVacEntityFeature.DO_NOT_DISTURB", - "RoboVacEntityFeature.AUTO_RETURN", - "RoboVacEntityFeature.ROOM", - "RoboVacEntityFeature.ZONE", - "RoboVacEntityFeature.BOOST_IQ", - ], -}; - -const ROBOVAC_SERIES_FAN_SPEEDS = { - C: ["No_suction", "Standard", "Boost_IQ", "Max"], - G: ["Standard", "Turbo", "Max", "Boost_IQ"], - L: ["Quiet", "Standard", "Turbo", "Max"], - X: ["Pure", "Standard", "Turbo", "Max"], -}; - -const commands = [ - "CLEANING_AREA", - "CLEANING_TIME", - "AUTO_RETURN", - "DO_NOT_DISTURB", - "BOOST_IQ", - "CONSUMABLES", -]; - -const allModels = []; - -Object.entries(ROBOVAC_SERIES).forEach(([series, models]) => { - models.forEach((model) => { - allModels.push(model); - - const robovac_features = [...ROBOVAC_SERIES_FEATURES[series]]; - const homeassistant_features = [ - "VacuumEntityFeature.BATTERY", - "VacuumEntityFeature.CLEAN_SPOT", - "VacuumEntityFeature.FAN_SPEED", - "VacuumEntityFeature.LOCATE", - "VacuumEntityFeature.PAUSE", - "VacuumEntityFeature.RETURN_HOME", - "VacuumEntityFeature.SEND_COMMAND", - "VacuumEntityFeature.START", - "VacuumEntityFeature.STATE", - "VacuumEntityFeature.STOP", - ]; - - if (HAS_MAP_FEATURE.includes(model)) { - homeassistant_features.push("VacuumEntityFeature.MAP"); - robovac_features.push("RoboVacEntityFeature.MAP"); - } - - if (HAS_CONSUMABLES.includes(model)) { - robovac_features.push("RoboVacEntityFeature.CONSUMABLES"); - } - - const extra_commands = commands - .filter((command) => - robovac_features.includes(`RoboVacEntityFeature.${command}`) - ) - .map((command) => `# RobovacCommand.${command}: 0,`); - - if (extra_commands.length > 0) { - extra_commands.unshift("# These commands need codes adding"); - } - - const file = `from homeassistant.components.vacuum import VacuumEntityFeature -from .base import RoboVacEntityFeature, RobovacCommand - - -class ${model}: - homeassistant_features = ( - ${homeassistant_features.join("\n | ")} - ) - robovac_features = ${robovac_features.join(" | ")} - commands = { - RobovacCommand.START_PAUSE: 2, - RobovacCommand.DIRECTION: { - "code": 3, - "values": ["forward", "back", "left", "right"], - }, - RobovacCommand.MODE: { - "code": 5, - "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], - }, - RobovacCommand.STATUS: 15, - RobovacCommand.RETURN_HOME: 101, - RobovacCommand.FAN_SPEED: { - "code": 102, - "values": ${JSON.stringify(ROBOVAC_SERIES_FAN_SPEEDS[series])}, - }, - RobovacCommand.LOCATE: 103, - RobovacCommand.BATTERY: 104, - RobovacCommand.ERROR: 106,${ - extra_commands.length > 0 - ? `\n ${extra_commands.join("\n ")}` - : "" - } - } -`; - fs.writeFile( - path.join( - __dirname, - "custom_components", - "robovac", - "vacuums", - `${model}.py` - ), - file - ); - }); -}); - -const initFile = `${allModels - .map((model) => `from .${model} import ${model}`) - .join("\n")} - - -ROBOVAC_MODELS = { -${allModels.map((model) => ` "${model}": ${model}`).join(",\n")} -}`; - -fs.writeFile( - path.join( - __dirname, - "custom_components", - "robovac", - "vacuums", - `__init__.py` - ), - initFile -); From 67b2e505f97cfad32c08de53a6e878e573128b84 Mon Sep 17 00:00:00 2001 From: Jelle Bleyaert <9694910+jbleyaert@users.noreply.github.com> Date: Fri, 22 Mar 2024 17:14:09 +0100 Subject: [PATCH 06/17] feat: Adding L60 SES support (UNTESTED) (#67) * Adding L60 SES support * Update custom_components/robovac/vacuums/T2267.py Co-authored-by: Luke Morrigan --------- Co-authored-by: Luke Morrigan --- custom_components/robovac/vacuums/T2267.py | 56 +++++++++++++++++++ custom_components/robovac/vacuums/__init__.py | 2 + 2 files changed, 58 insertions(+) create mode 100644 custom_components/robovac/vacuums/T2267.py diff --git a/custom_components/robovac/vacuums/T2267.py b/custom_components/robovac/vacuums/T2267.py new file mode 100644 index 0000000..d3963c9 --- /dev/null +++ b/custom_components/robovac/vacuums/T2267.py @@ -0,0 +1,56 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2267: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + | VacuumEntityFeature.MAP + ) + robovac_features = ( + RoboVacEntityFeature.CLEANING_TIME + | RoboVacEntityFeature.CLEANING_AREA + | RoboVacEntityFeature.DO_NOT_DISTURB + | RoboVacEntityFeature.AUTO_RETURN + | RoboVacEntityFeature.ROOM + | RoboVacEntityFeature.ZONE + | RoboVacEntityFeature.BOOST_IQ + | RoboVacEntityFeature.MAP + | RoboVacEntityFeature.CONSUMABLES + ) + commands = { + RobovacCommand.START_PAUSE: 156, + RobovacCommand.DIRECTION: { + "code": 155, + "values": ["Brake", "Forward", "Back", "Left", "Right"], + }, + RobovacCommand.MODE: { + "code": 152, + # "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + }, + RobovacCommand.STATUS: 153, + RobovacCommand.RETURN_HOME: 173, + RobovacCommand.FAN_SPEED: { + "code": 158, + "values": ["Quiet", "Standard", "Turbo", "Max"], + }, + RobovacCommand.LOCATE: 160, + RobovacCommand.BATTERY: 163, + RobovacCommand.ERROR: 177, + RobovacCommand.DO_NOT_DISTURB: 157, + RobovacCommand.BOOST_IQ: 159, + RobovacCommand.CONSUMABLES: 168, + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + } diff --git a/custom_components/robovac/vacuums/__init__.py b/custom_components/robovac/vacuums/__init__.py index 979a5cb..880b536 100644 --- a/custom_components/robovac/vacuums/__init__.py +++ b/custom_components/robovac/vacuums/__init__.py @@ -28,6 +28,7 @@ from .T2192 import T2192 from .T2193 import T2193 from .T2194 import T2194 +from .T2267 import T2267 from .T2261 import T2261 from .T2262 import T2262 from .T2320 import T2320 @@ -64,6 +65,7 @@ "T2192": T2192, "T2193": T2193, "T2194": T2194, + "T2267": T2267, "T2261": T2261, "T2262": T2262, "T2320": T2320 From 76aafc32a699868cd22aa6f65fc9cf17624ec81d Mon Sep 17 00:00:00 2001 From: Luke Bonaccorsi Date: Fri, 22 Mar 2024 16:39:20 +0000 Subject: [PATCH 07/17] ci: add pull request to release workflow --- .github/workflows/release.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index c1fe64d..12cf503 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -2,6 +2,9 @@ on: push: branches: - main + pull_request: + branches: + - main workflow_dispatch: jobs: From f38fa9ca54dd3c058e2d806b1091dd8503e00e06 Mon Sep 17 00:00:00 2001 From: Luke Bonaccorsi Date: Fri, 29 Mar 2024 00:36:23 +0000 Subject: [PATCH 08/17] feat: use newer eufy device api --- custom_components/robovac/config_flow.py | 20 ++++++++++---------- custom_components/robovac/eufywebapi.py | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/custom_components/robovac/config_flow.py b/custom_components/robovac/config_flow.py index 0693b53..d0e7c86 100644 --- a/custom_components/robovac/config_flow.py +++ b/custom_components/robovac/config_flow.py @@ -132,29 +132,29 @@ def get_eufy_vacuums(self): phone_code=self[CONF_COUNTRY_CODE], ) - items = device_response["items"] + items = device_response["devices"] self[CONF_VACS] = {} for item in items: - if item["device"]["product"]["appliance"] == "Cleaning": + if item["product"]["appliance"] == "Cleaning": try: - device = tuya_client.get_device(item["device"]["id"]) + device = tuya_client.get_device(item["id"]) _LOGGER.debug("Robovac schema: {}".format(device["schema"])) vac_details = { - CONF_ID: item["device"]["id"], - CONF_MODEL: item["device"]["product"]["product_code"], - CONF_NAME: item["device"]["alias_name"], - CONF_DESCRIPTION: item["device"]["name"], - CONF_MAC: item["device"]["wifi"]["mac"], + CONF_ID: item["id"], + CONF_MODEL: item["product"]["product_code"], + CONF_NAME: item["alias_name"], + CONF_DESCRIPTION: item["name"], + CONF_MAC: item["wifi"]["mac"], CONF_IP_ADDRESS: "", CONF_AUTODISCOVERY: True, CONF_ACCESS_TOKEN: device["localKey"], } - self[CONF_VACS][item["device"]["id"]] = vac_details + self[CONF_VACS][item["id"]] = vac_details except: _LOGGER.debug( "Vacuum {} found on Eufy, but not on Tuya. Skipping.".format( - item["device"]["id"] + item["id"] ) ) diff --git a/custom_components/robovac/eufywebapi.py b/custom_components/robovac/eufywebapi.py index 1cbbfab..683c280 100644 --- a/custom_components/robovac/eufywebapi.py +++ b/custom_components/robovac/eufywebapi.py @@ -39,7 +39,7 @@ def get_user_settings(self, url, userid, token): return requests.request("GET", setting_url, headers=eufyheaders, timeout=1.5) def get_device_info(self, url, userid, token): - device_url = url + "/v1/device/list/devices-and-groups" + device_url = url + "/v1/device/v2" eufyheaders["token"] = token eufyheaders["id"] = userid return requests.request("GET", device_url, headers=eufyheaders) From 2bc9f6e186cbc563b0f1c8266cc4f4df108e10d3 Mon Sep 17 00:00:00 2001 From: Maxim Oei Date: Thu, 25 Jul 2024 11:40:17 +0200 Subject: [PATCH 09/17] first test --- custom_components/robovac/vacuum.py | 115 ++++++++++++++++++-- custom_components/robovac/vacuums/T2267.py | 116 +++++++++++++++----- custom_components/robovac/vacuums/T2277.py | 120 +++++++++++++++++++++ custom_components/robovac/vacuums/T2278.py | 120 +++++++++++++++++++++ 4 files changed, 434 insertions(+), 37 deletions(-) create mode 100644 custom_components/robovac/vacuums/T2277.py create mode 100644 custom_components/robovac/vacuums/T2278.py diff --git a/custom_components/robovac/vacuum.py b/custom_components/robovac/vacuum.py index 2816976..44f9e77 100644 --- a/custom_components/robovac/vacuum.py +++ b/custom_components/robovac/vacuum.py @@ -34,6 +34,7 @@ STATE_ERROR, STATE_IDLE, STATE_RETURNING, + STATE_PAUSED ) from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant @@ -82,6 +83,74 @@ ATTR_CONSUMABLES = "consumables" ATTR_MODE = "mode" +MODE_MAPPING = { #152 + "AggO": "Auto cleaning", + "BBoCCAE=": "Start auto", + "AggN": "Pause", + "AggG": "Stop / Go to charge", + "AA==": "Standby" +} + +EMPTY_MAPPING = { #173 + "BBICGAE=": "Empty dust", + "BBICIAE=": "Wash mop", + "BBICEAE=": "Dry mop" +} + +TUYA_STATUS_MAPPING = { #153 + "BgoAEAUyAA==": "AUTO", + "BgoAEAVSAA==": "POSITION", + "CAoAEAUyAggB": "PAUSE", + "CAoCCAEQBTIA": "ROOM", + "CAoCCAEQBVIA": "ROOM_POSITION", + "CgoCCAEQBTICCAE=": "ROOM_PAUSE", + "CAoCCAIQBTIA": "SPOT", + "CAoCCAIQBVIA": "SPOT_POSITION", + "CgoCCAIQBTICCAE=": "SPOT_PAUSE", + "BAoAEAY=": "START_MANUAL", + "BBAHQgA=": "GOING_TO_CHARGE", + "BBADGgA=": "CHARGING", + "BhADGgIIAQ==": "COMPLETED", + "AA==": "STANDBY", + "AhAB": "SLEEPING", +} + +STATUS_MAPPING = { + "AUTO" : "Auto cleaning", + "POSITION": "Positioning", + "PAUSE": "Cleaning paused", + "ROOM": "Cleaning room", + "ROOM_POSITION": "Positioning room", + "ROOM_PAUSE": "Cleaning room paused", + "SPOT": "Spot cleaning", + "SPOT_POSITION": "Positioning spot", + "SPOT_PAUSE": "Cleaning spot paused", + "START_MANUAL": "Manual mode", + "GOING_TO_CHARGE": "Recharge", + "CHARGING": "Charging", + "COMPLETED": "Completed", + "STANDBY": "Standby", + "SLEEPING": "Sleeping", +} + +ERROR_MAPPING = { #177 + "DAiI6suO9dXszgFSAA==": "no_error", + "FAjwudWorOPszgEaAqURUgQSAqUR": "Sidebrush stuck", + "FAj+nMu7zuPszgEaAtg2UgQSAtg2": "Robot stuck", + "DAjtzbfps+XszgFSAA==": "no_error", + "DAiom9rd6eTszgFSAA==": "no_error", + "DAia8JTV5OPszgFSAA==": "no_error", + "DAj489bWsePszgFSAA==": "no_error", + +# DAjH1er4vtbszgFSAA== +# DAi73bTN+uLszgFSAA== +# DAj489bWsePszgFSAA== +# DAia8JTV5OPszgFSAA== +# DAiom9rd6eTszgFSAA== +# DAjtzbfps+XszgFSAA== + +} + _LOGGER = logging.getLogger(__name__) SCAN_INTERVAL = timedelta(seconds=REFRESH_RATE) UPDATE_RETRIES = 3 @@ -192,11 +261,11 @@ def state(self) -> str | None: ) ) return STATE_ERROR - elif self.tuya_state == "Charging" or self.tuya_state == "completed": + elif self.tuya_state == "Charging" or self.tuya_state == "Completed": return STATE_DOCKED elif self.tuya_state == "Recharge": return STATE_RETURNING - elif self.tuya_state == "Sleeping" or self.tuya_state == "standby": + elif self.tuya_state == "Sleeping" or self.tuya_state == "Standby": return STATE_IDLE else: return STATE_CLEANING @@ -332,47 +401,68 @@ async def pushed_update_handler(self): def update_entity_values(self): self.tuyastatus = self.vacuum._dps - + _LOGGER.debug("tuyastatus %s", self.tuyastatus) + self._attr_battery_level = self.tuyastatus.get( self._tuya_command_codes[RobovacCommand.BATTERY] ) - self.tuya_state = self.tuyastatus.get( - self._tuya_command_codes[RobovacCommand.STATUS] + _LOGGER.debug("_attr_battery_level %s", self._attr_battery_level) + + self.tuya_state = STATUS_MAPPING.get( + TUYA_STATUS_MAPPING.get( + self.tuyastatus.get( + self._tuya_command_codes[RobovacCommand.STATUS] + ), None + ), None ) - self.error_code = self.tuyastatus.get( - self._tuya_command_codes[RobovacCommand.ERROR] + _LOGGER.debug("tuya_state %s", self.tuya_state) + + self.error_code = ERROR_MAPPING.get( + self.tuyastatus.get( + self._tuya_command_codes[RobovacCommand.ERROR] + ), None ) + _LOGGER.debug("error_code %s", self.error_code) + self._attr_mode = self.tuyastatus.get( self._tuya_command_codes[RobovacCommand.MODE] ) + _LOGGER.debug("_attr_mode %s", self._attr_mode) + self._attr_fan_speed = friendly_text( self.tuyastatus.get(self._tuya_command_codes[RobovacCommand.FAN_SPEED], "") ) + _LOGGER.debug("_attr_fan_speed %s", self._attr_fan_speed) if self.robovac_supported & RoboVacEntityFeature.CLEANING_AREA: self._attr_cleaning_area = self.tuyastatus.get( self._tuya_command_codes[RobovacCommand.CLEANING_AREA] ) + _LOGGER.debug("_attr_cleaning_area %s", self._attr_cleaning_area) if self.robovac_supported & RoboVacEntityFeature.CLEANING_TIME: self._attr_cleaning_time = self.tuyastatus.get( self._tuya_command_codes[RobovacCommand.CLEANING_TIME] ) + _LOGGER.debug("_attr_cleaning_time %s", self._attr_cleaning_time) if self.robovac_supported & RoboVacEntityFeature.AUTO_RETURN: self._attr_auto_return = self.tuyastatus.get( self._tuya_command_codes[RobovacCommand.AUTO_RETURN] ) + _LOGGER.debug("_attr_auto_return %s", self._attr_auto_return) if self.robovac_supported & RoboVacEntityFeature.DO_NOT_DISTURB: self._attr_do_not_disturb = self.tuyastatus.get( self._tuya_command_codes[RobovacCommand.DO_NOT_DISTURB] ) + _LOGGER.debug("_attr_do_not_disturb %s", self._attr_do_not_disturb) if self.robovac_supported & RoboVacEntityFeature.BOOST_IQ: self._attr_boost_iq = self.tuyastatus.get( self._tuya_command_codes[RobovacCommand.BOOST_IQ] ) + _LOGGER.debug("_attr_boost_iq %s", self._attr_boost_iq) if self.robovac_supported & RoboVacEntityFeature.CONSUMABLES: consumables = ast.literal_eval( @@ -390,6 +480,7 @@ def update_entity_values(self): ) ) self._attr_consumables = consumables["consumable"]["duration"] + _LOGGER.debug("_attr_consumables %s", self._attr_consumables) async def async_locate(self, **kwargs): """Locate the vacuum cleaner.""" @@ -405,19 +496,19 @@ async def async_return_to_base(self, **kwargs): """Set the vacuum cleaner to return to the dock.""" _LOGGER.info("Return home Pressed") await self.vacuum.async_set( - {self._tuya_command_codes[RobovacCommand.RETURN_HOME]: True} + {self._tuya_command_codes[RobovacCommand.MODE]: "AggG"} ) asyncio.create_task(self.async_forced_update()) async def async_start(self, **kwargs): await self.vacuum.async_set( - {self._tuya_command_codes[RobovacCommand.START_PAUSE]: True} + {self._tuya_command_codes[RobovacCommand.MODE]: "BBoCCAE="} ) asyncio.create_task(self.async_forced_update()) async def async_pause(self, **kwargs): await self.vacuum.async_set( - {self._tuya_command_codes[RobovacCommand.START_PAUSE]: False} + {self._tuya_command_codes[RobovacCommand.MODE]: "AggN"} ) asyncio.create_task(self.async_forced_update()) @@ -455,7 +546,7 @@ async def async_send_command( elif command == "smallRoomClean": await self.vacuum.async_set({"5": "SmallRoom"}) elif command == "autoClean": - await self.vacuum.async_set({"5": "auto"}) + await self.vacuum.async_set({"152": "BBoCCAE="}) elif command == "autoReturn": if self.auto_return: await self.vacuum.async_set({"135": False}) @@ -486,6 +577,8 @@ async def async_send_command( base64_str = base64.b64encode(json_str.encode("utf8")).decode("utf8") _LOGGER.info("roomClean call %s", json_str) await self.vacuum.async_set({"124": base64_str}) + else: + await self.vacuum.async_set({command: params.get("value", "")}) asyncio.create_task(self.async_forced_update()) async def async_will_remove_from_hass(self): diff --git a/custom_components/robovac/vacuums/T2267.py b/custom_components/robovac/vacuums/T2267.py index d3963c9..b9adb38 100644 --- a/custom_components/robovac/vacuums/T2267.py +++ b/custom_components/robovac/vacuums/T2267.py @@ -2,10 +2,10 @@ from .base import RoboVacEntityFeature, RobovacCommand -class T2267: +class T2277: homeassistant_features = ( VacuumEntityFeature.BATTERY - | VacuumEntityFeature.CLEAN_SPOT +# | VacuumEntityFeature.CLEAN_SPOT | VacuumEntityFeature.FAN_SPEED | VacuumEntityFeature.LOCATE | VacuumEntityFeature.PAUSE @@ -14,43 +14,107 @@ class T2267: | VacuumEntityFeature.START | VacuumEntityFeature.STATE | VacuumEntityFeature.STOP - | VacuumEntityFeature.MAP +# | VacuumEntityFeature.MAP ) robovac_features = ( - RoboVacEntityFeature.CLEANING_TIME - | RoboVacEntityFeature.CLEANING_AREA - | RoboVacEntityFeature.DO_NOT_DISTURB + # RoboVacEntityFeature.CLEANING_TIME + # | RoboVacEntityFeature.CLEANING_AREA + RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN - | RoboVacEntityFeature.ROOM - | RoboVacEntityFeature.ZONE - | RoboVacEntityFeature.BOOST_IQ - | RoboVacEntityFeature.MAP - | RoboVacEntityFeature.CONSUMABLES + # | RoboVacEntityFeature.ROOM + # | RoboVacEntityFeature.ZONE + | RoboVacEntityFeature.BOOST_IQ + # | RoboVacEntityFeature.MAP + # | RoboVacEntityFeature.CONSUMABLES ) commands = { - RobovacCommand.START_PAUSE: 156, - RobovacCommand.DIRECTION: { + RobovacCommand.MODE: { #works (Start Auto and Return dock commands tested) + "code": 152, + "values": ["AggN","AA==","AggG","BBoCCAE=","AggO"], + }, + RobovacCommand.STATUS: { #works (status only) + "code": 153, + "values": ["BgoAEAUyAA===","BgoAEAVSAA===","CAoAEAUyAggB","CAoCCAEQBTIA","CAoCCAEQBVIA","CgoCCAEQBTICCAE=","CAoCCAIQBTIA","CAoCCAIQBVIA","CgoCCAIQBTICCAE=","BAoAEAY=","BBAHQgA=","BBADGgA=","BhADGgIIAQ==","AA==","AhAB"], + }, + RobovacCommand.DIRECTION: { #untested "code": 155, "values": ["Brake", "Forward", "Back", "Left", "Right"], }, - RobovacCommand.MODE: { - "code": 152, - # "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], - }, - RobovacCommand.STATUS: 153, - RobovacCommand.RETURN_HOME: 173, - RobovacCommand.FAN_SPEED: { + RobovacCommand.START_PAUSE: 156, # True, False #works (status only) + RobovacCommand.DO_NOT_DISTURB: 157, # DgoAEgoKABICCBYaAggI #untested + RobovacCommand.FAN_SPEED: { #works (status and update) "code": 158, "values": ["Quiet", "Standard", "Turbo", "Max"], }, - RobovacCommand.LOCATE: 160, - RobovacCommand.BATTERY: 163, - RobovacCommand.ERROR: 177, - RobovacCommand.DO_NOT_DISTURB: 157, - RobovacCommand.BOOST_IQ: 159, - RobovacCommand.CONSUMABLES: 168, + RobovacCommand.BOOST_IQ: 159, # True, False #works (status and update) + RobovacCommand.LOCATE: 160, # True, False #works (status) + # Speaker volume: 161 #works, not yet implemented + RobovacCommand.BATTERY: 163, # int #works (status) + RobovacCommand.CONSUMABLES: 168, #encrypted, not usable + RobovacCommand.RETURN_HOME: 173, #encrypted, not usable + # FgoQMggKAggBEgIQAToECgIIARICCAE= + # FgoQMg4KAggBEggIARj/////DxICCAE= + # FAoQMggKAggBEgIQAToECgIIARIA + # GAoQMggKAggBEgIQAToECgIIARIECAE4AQ== + # GgoQMggKAggBEgIQAToECgIIARIGCAEYATgB + RobovacCommand.ERROR: 177, # #encrypted, few known values + # SIDEBRUSH_STUCK: "FAjwudWorOPszgEaAqURUgQSAqUR" + # ROBOT_STUCK: "FAj+nMu7zuPszgEaAtg2UgQSAtg2" + + + # IQofCgIIAhICCAIaAggCKgIIAjoCCBugAe7Pqs6M1+zOAQ== + # IQofCgIIAhICCAIaAggCKgIIAjoCCBqgAYPx0a331uzOAQ== + # IQofCgIIBBICCAQaAggEKgIIBDoCCCmgAcSfs6Lo5uzOAQ== + # These commands need codes adding # RobovacCommand.CLEANING_AREA: 0, # RobovacCommand.CLEANING_TIME: 0, # RobovacCommand.AUTO_RETURN: 0, + # Unknown: 151 (true/false) + # Unknown: 154 + # DgoKCgAaAggBIgIIARIA + # DAoICgAaAggBIgASAA== + # Unknown: 164 + # MBoAIiwKBgi4y/q0BhIECAEQARoMCAESBBgJIB4aAgg+Kg4aDBIKCgIIARIAGgAiAA== + # NAgGEAYaACIsCgYIuMv6tAYSBAgBEAEaDAgBEgQYCSAeGgIIPioOGgwSCgoCCAESABoAIgA= + # Unknown: 167 + # FAoAEgcIiEoQbhgEGgcI1EgQbBgC + # FgoCEAESBwiIShBuGAQaBwjUSBBsGAI= + # GAoECDwQARIHCIhKEG4YBBoHCNRIEGwYAg== + # GQoFCLQBEAQSBwiIShBuGAQaBwjUSBBsGAI= + # GwoFCKApEDgSCAiocxCmARgFGggI9HEQpAEYAw== + # Unknown: 171 + # AhAB + # Unknown: 176 + # MQoAGgBSCBoAIgIIASoAWDJiHwodChFBIG5ldHdvcmsgZm9yIHlvdRABGgYQ4/7/tAY= + # LwoAGgBSCBoAIgIIASoAWFZiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEPvagrUG + # LwoAGgBSCBoAIgIIASoAWCJiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEK2YgLUG + # LwoAGgBSCBoAIgIIASoAWDBiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEK2YgLUG + # Unknown: 178 + # DQjRidjfv9bszgESAR8= + # DQiMrPbd+eLszgESAVU= + # DQiW0dXL+uLszgESAR8= + # Cgiv6NbWsePszgE= + # DQjPuorb6eTszgESAR8= + # DQjayd7nsOXszgESASg= + # Unknown: 179 + # EBIOKgwIBRACGAEgwYyAtQY= + # FhIUEhIIBRABIFsowYyAtQYw74yAtQY= + # DhIMKgoIBhgCIPvagrUG + # DhIMKgoIBxgCIJLbgrUG + # EBIOKgwIBxADGAIg3eyCtQY= + # EBIOKgwIBxAEGAIgrPGCtQY= + # DhIMKgoICBgCILHxgrUG + # DhIMKgoICBADIIj6grUG + # DhIMKgoICBADIOqMg7UG + # DhIMKgoICBAEIOuMg7UG + # DBIKKggICSCljYO1Bg== + # DhIMKgoICRACIJmcg7UG + # FhIUEhIICRABIBoomZyDtQYw6pyDtQY= + # DhIMIgoICRABGO+cg7UG + # DhIMIgoICRABGLedg7UG + # IRIfCh0ICRgBMPvagrUGOMmdg7UGQKApSDhQO1gBYAdqAA== + # Unknown: 169 + # cwoSZXVmeSBDbGVhbiBMNjAgU0VTGhFDODpGRTowRjo3Nzo5NDo5QyIGMS4zLjI0KAVCKDM2NGFjOGNkNjQzZjllMDczZjg4NzlmNGFhOTdkZGE5OGUzMjg5NTRiFggBEgQIAhABGgQIAhABIgIIASoCCAE= + # s \x12eufy Clean L60 SES\x1a\x11C8:FE:0F:77:94:9C"\x061.3.24(\x05B(364ac8cd643f9e073f8879f4aa97dda98e328954b\x16\x08\x01\x12\x04\x08\x02\x10\x01\x1a\x04\x08\x02\x10\x01"\x02\x08\x01*\x02\x08\x01 } diff --git a/custom_components/robovac/vacuums/T2277.py b/custom_components/robovac/vacuums/T2277.py new file mode 100644 index 0000000..b9adb38 --- /dev/null +++ b/custom_components/robovac/vacuums/T2277.py @@ -0,0 +1,120 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2277: + homeassistant_features = ( + VacuumEntityFeature.BATTERY +# | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP +# | VacuumEntityFeature.MAP + ) + robovac_features = ( + # RoboVacEntityFeature.CLEANING_TIME + # | RoboVacEntityFeature.CLEANING_AREA + RoboVacEntityFeature.DO_NOT_DISTURB + | RoboVacEntityFeature.AUTO_RETURN + # | RoboVacEntityFeature.ROOM + # | RoboVacEntityFeature.ZONE + | RoboVacEntityFeature.BOOST_IQ + # | RoboVacEntityFeature.MAP + # | RoboVacEntityFeature.CONSUMABLES + ) + commands = { + RobovacCommand.MODE: { #works (Start Auto and Return dock commands tested) + "code": 152, + "values": ["AggN","AA==","AggG","BBoCCAE=","AggO"], + }, + RobovacCommand.STATUS: { #works (status only) + "code": 153, + "values": ["BgoAEAUyAA===","BgoAEAVSAA===","CAoAEAUyAggB","CAoCCAEQBTIA","CAoCCAEQBVIA","CgoCCAEQBTICCAE=","CAoCCAIQBTIA","CAoCCAIQBVIA","CgoCCAIQBTICCAE=","BAoAEAY=","BBAHQgA=","BBADGgA=","BhADGgIIAQ==","AA==","AhAB"], + }, + RobovacCommand.DIRECTION: { #untested + "code": 155, + "values": ["Brake", "Forward", "Back", "Left", "Right"], + }, + RobovacCommand.START_PAUSE: 156, # True, False #works (status only) + RobovacCommand.DO_NOT_DISTURB: 157, # DgoAEgoKABICCBYaAggI #untested + RobovacCommand.FAN_SPEED: { #works (status and update) + "code": 158, + "values": ["Quiet", "Standard", "Turbo", "Max"], + }, + RobovacCommand.BOOST_IQ: 159, # True, False #works (status and update) + RobovacCommand.LOCATE: 160, # True, False #works (status) + # Speaker volume: 161 #works, not yet implemented + RobovacCommand.BATTERY: 163, # int #works (status) + RobovacCommand.CONSUMABLES: 168, #encrypted, not usable + RobovacCommand.RETURN_HOME: 173, #encrypted, not usable + # FgoQMggKAggBEgIQAToECgIIARICCAE= + # FgoQMg4KAggBEggIARj/////DxICCAE= + # FAoQMggKAggBEgIQAToECgIIARIA + # GAoQMggKAggBEgIQAToECgIIARIECAE4AQ== + # GgoQMggKAggBEgIQAToECgIIARIGCAEYATgB + RobovacCommand.ERROR: 177, # #encrypted, few known values + # SIDEBRUSH_STUCK: "FAjwudWorOPszgEaAqURUgQSAqUR" + # ROBOT_STUCK: "FAj+nMu7zuPszgEaAtg2UgQSAtg2" + + + # IQofCgIIAhICCAIaAggCKgIIAjoCCBugAe7Pqs6M1+zOAQ== + # IQofCgIIAhICCAIaAggCKgIIAjoCCBqgAYPx0a331uzOAQ== + # IQofCgIIBBICCAQaAggEKgIIBDoCCCmgAcSfs6Lo5uzOAQ== + + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # Unknown: 151 (true/false) + # Unknown: 154 + # DgoKCgAaAggBIgIIARIA + # DAoICgAaAggBIgASAA== + # Unknown: 164 + # MBoAIiwKBgi4y/q0BhIECAEQARoMCAESBBgJIB4aAgg+Kg4aDBIKCgIIARIAGgAiAA== + # NAgGEAYaACIsCgYIuMv6tAYSBAgBEAEaDAgBEgQYCSAeGgIIPioOGgwSCgoCCAESABoAIgA= + # Unknown: 167 + # FAoAEgcIiEoQbhgEGgcI1EgQbBgC + # FgoCEAESBwiIShBuGAQaBwjUSBBsGAI= + # GAoECDwQARIHCIhKEG4YBBoHCNRIEGwYAg== + # GQoFCLQBEAQSBwiIShBuGAQaBwjUSBBsGAI= + # GwoFCKApEDgSCAiocxCmARgFGggI9HEQpAEYAw== + # Unknown: 171 + # AhAB + # Unknown: 176 + # MQoAGgBSCBoAIgIIASoAWDJiHwodChFBIG5ldHdvcmsgZm9yIHlvdRABGgYQ4/7/tAY= + # LwoAGgBSCBoAIgIIASoAWFZiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEPvagrUG + # LwoAGgBSCBoAIgIIASoAWCJiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEK2YgLUG + # LwoAGgBSCBoAIgIIASoAWDBiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEK2YgLUG + # Unknown: 178 + # DQjRidjfv9bszgESAR8= + # DQiMrPbd+eLszgESAVU= + # DQiW0dXL+uLszgESAR8= + # Cgiv6NbWsePszgE= + # DQjPuorb6eTszgESAR8= + # DQjayd7nsOXszgESASg= + # Unknown: 179 + # EBIOKgwIBRACGAEgwYyAtQY= + # FhIUEhIIBRABIFsowYyAtQYw74yAtQY= + # DhIMKgoIBhgCIPvagrUG + # DhIMKgoIBxgCIJLbgrUG + # EBIOKgwIBxADGAIg3eyCtQY= + # EBIOKgwIBxAEGAIgrPGCtQY= + # DhIMKgoICBgCILHxgrUG + # DhIMKgoICBADIIj6grUG + # DhIMKgoICBADIOqMg7UG + # DhIMKgoICBAEIOuMg7UG + # DBIKKggICSCljYO1Bg== + # DhIMKgoICRACIJmcg7UG + # FhIUEhIICRABIBoomZyDtQYw6pyDtQY= + # DhIMIgoICRABGO+cg7UG + # DhIMIgoICRABGLedg7UG + # IRIfCh0ICRgBMPvagrUGOMmdg7UGQKApSDhQO1gBYAdqAA== + # Unknown: 169 + # cwoSZXVmeSBDbGVhbiBMNjAgU0VTGhFDODpGRTowRjo3Nzo5NDo5QyIGMS4zLjI0KAVCKDM2NGFjOGNkNjQzZjllMDczZjg4NzlmNGFhOTdkZGE5OGUzMjg5NTRiFggBEgQIAhABGgQIAhABIgIIASoCCAE= + # s \x12eufy Clean L60 SES\x1a\x11C8:FE:0F:77:94:9C"\x061.3.24(\x05B(364ac8cd643f9e073f8879f4aa97dda98e328954b\x16\x08\x01\x12\x04\x08\x02\x10\x01\x1a\x04\x08\x02\x10\x01"\x02\x08\x01*\x02\x08\x01 + } diff --git a/custom_components/robovac/vacuums/T2278.py b/custom_components/robovac/vacuums/T2278.py new file mode 100644 index 0000000..b9adb38 --- /dev/null +++ b/custom_components/robovac/vacuums/T2278.py @@ -0,0 +1,120 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2277: + homeassistant_features = ( + VacuumEntityFeature.BATTERY +# | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP +# | VacuumEntityFeature.MAP + ) + robovac_features = ( + # RoboVacEntityFeature.CLEANING_TIME + # | RoboVacEntityFeature.CLEANING_AREA + RoboVacEntityFeature.DO_NOT_DISTURB + | RoboVacEntityFeature.AUTO_RETURN + # | RoboVacEntityFeature.ROOM + # | RoboVacEntityFeature.ZONE + | RoboVacEntityFeature.BOOST_IQ + # | RoboVacEntityFeature.MAP + # | RoboVacEntityFeature.CONSUMABLES + ) + commands = { + RobovacCommand.MODE: { #works (Start Auto and Return dock commands tested) + "code": 152, + "values": ["AggN","AA==","AggG","BBoCCAE=","AggO"], + }, + RobovacCommand.STATUS: { #works (status only) + "code": 153, + "values": ["BgoAEAUyAA===","BgoAEAVSAA===","CAoAEAUyAggB","CAoCCAEQBTIA","CAoCCAEQBVIA","CgoCCAEQBTICCAE=","CAoCCAIQBTIA","CAoCCAIQBVIA","CgoCCAIQBTICCAE=","BAoAEAY=","BBAHQgA=","BBADGgA=","BhADGgIIAQ==","AA==","AhAB"], + }, + RobovacCommand.DIRECTION: { #untested + "code": 155, + "values": ["Brake", "Forward", "Back", "Left", "Right"], + }, + RobovacCommand.START_PAUSE: 156, # True, False #works (status only) + RobovacCommand.DO_NOT_DISTURB: 157, # DgoAEgoKABICCBYaAggI #untested + RobovacCommand.FAN_SPEED: { #works (status and update) + "code": 158, + "values": ["Quiet", "Standard", "Turbo", "Max"], + }, + RobovacCommand.BOOST_IQ: 159, # True, False #works (status and update) + RobovacCommand.LOCATE: 160, # True, False #works (status) + # Speaker volume: 161 #works, not yet implemented + RobovacCommand.BATTERY: 163, # int #works (status) + RobovacCommand.CONSUMABLES: 168, #encrypted, not usable + RobovacCommand.RETURN_HOME: 173, #encrypted, not usable + # FgoQMggKAggBEgIQAToECgIIARICCAE= + # FgoQMg4KAggBEggIARj/////DxICCAE= + # FAoQMggKAggBEgIQAToECgIIARIA + # GAoQMggKAggBEgIQAToECgIIARIECAE4AQ== + # GgoQMggKAggBEgIQAToECgIIARIGCAEYATgB + RobovacCommand.ERROR: 177, # #encrypted, few known values + # SIDEBRUSH_STUCK: "FAjwudWorOPszgEaAqURUgQSAqUR" + # ROBOT_STUCK: "FAj+nMu7zuPszgEaAtg2UgQSAtg2" + + + # IQofCgIIAhICCAIaAggCKgIIAjoCCBugAe7Pqs6M1+zOAQ== + # IQofCgIIAhICCAIaAggCKgIIAjoCCBqgAYPx0a331uzOAQ== + # IQofCgIIBBICCAQaAggEKgIIBDoCCCmgAcSfs6Lo5uzOAQ== + + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # Unknown: 151 (true/false) + # Unknown: 154 + # DgoKCgAaAggBIgIIARIA + # DAoICgAaAggBIgASAA== + # Unknown: 164 + # MBoAIiwKBgi4y/q0BhIECAEQARoMCAESBBgJIB4aAgg+Kg4aDBIKCgIIARIAGgAiAA== + # NAgGEAYaACIsCgYIuMv6tAYSBAgBEAEaDAgBEgQYCSAeGgIIPioOGgwSCgoCCAESABoAIgA= + # Unknown: 167 + # FAoAEgcIiEoQbhgEGgcI1EgQbBgC + # FgoCEAESBwiIShBuGAQaBwjUSBBsGAI= + # GAoECDwQARIHCIhKEG4YBBoHCNRIEGwYAg== + # GQoFCLQBEAQSBwiIShBuGAQaBwjUSBBsGAI= + # GwoFCKApEDgSCAiocxCmARgFGggI9HEQpAEYAw== + # Unknown: 171 + # AhAB + # Unknown: 176 + # MQoAGgBSCBoAIgIIASoAWDJiHwodChFBIG5ldHdvcmsgZm9yIHlvdRABGgYQ4/7/tAY= + # LwoAGgBSCBoAIgIIASoAWFZiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEPvagrUG + # LwoAGgBSCBoAIgIIASoAWCJiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEK2YgLUG + # LwoAGgBSCBoAIgIIASoAWDBiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEK2YgLUG + # Unknown: 178 + # DQjRidjfv9bszgESAR8= + # DQiMrPbd+eLszgESAVU= + # DQiW0dXL+uLszgESAR8= + # Cgiv6NbWsePszgE= + # DQjPuorb6eTszgESAR8= + # DQjayd7nsOXszgESASg= + # Unknown: 179 + # EBIOKgwIBRACGAEgwYyAtQY= + # FhIUEhIIBRABIFsowYyAtQYw74yAtQY= + # DhIMKgoIBhgCIPvagrUG + # DhIMKgoIBxgCIJLbgrUG + # EBIOKgwIBxADGAIg3eyCtQY= + # EBIOKgwIBxAEGAIgrPGCtQY= + # DhIMKgoICBgCILHxgrUG + # DhIMKgoICBADIIj6grUG + # DhIMKgoICBADIOqMg7UG + # DhIMKgoICBAEIOuMg7UG + # DBIKKggICSCljYO1Bg== + # DhIMKgoICRACIJmcg7UG + # FhIUEhIICRABIBoomZyDtQYw6pyDtQY= + # DhIMIgoICRABGO+cg7UG + # DhIMIgoICRABGLedg7UG + # IRIfCh0ICRgBMPvagrUGOMmdg7UGQKApSDhQO1gBYAdqAA== + # Unknown: 169 + # cwoSZXVmeSBDbGVhbiBMNjAgU0VTGhFDODpGRTowRjo3Nzo5NDo5QyIGMS4zLjI0KAVCKDM2NGFjOGNkNjQzZjllMDczZjg4NzlmNGFhOTdkZGE5OGUzMjg5NTRiFggBEgQIAhABGgQIAhABIgIIASoCCAE= + # s \x12eufy Clean L60 SES\x1a\x11C8:FE:0F:77:94:9C"\x061.3.24(\x05B(364ac8cd643f9e073f8879f4aa97dda98e328954b\x16\x08\x01\x12\x04\x08\x02\x10\x01\x1a\x04\x08\x02\x10\x01"\x02\x08\x01*\x02\x08\x01 + } From 0b0fcef3ebdae00176f54c1c772a5141d47cf291 Mon Sep 17 00:00:00 2001 From: Maxim Oei Date: Thu, 25 Jul 2024 14:05:33 +0200 Subject: [PATCH 10/17] disable auto_return --- custom_components/robovac/vacuums/T2267.py | 6 +++--- custom_components/robovac/vacuums/T2277.py | 6 +++--- custom_components/robovac/vacuums/T2278.py | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/custom_components/robovac/vacuums/T2267.py b/custom_components/robovac/vacuums/T2267.py index b9adb38..f4e8fc7 100644 --- a/custom_components/robovac/vacuums/T2267.py +++ b/custom_components/robovac/vacuums/T2267.py @@ -18,14 +18,14 @@ class T2277: ) robovac_features = ( # RoboVacEntityFeature.CLEANING_TIME - # | RoboVacEntityFeature.CLEANING_AREA + # | RoboVacEntityFeature.CLEANING_AREA RoboVacEntityFeature.DO_NOT_DISTURB - | RoboVacEntityFeature.AUTO_RETURN + # | RoboVacEntityFeature.AUTO_RETURN # | RoboVacEntityFeature.ROOM # | RoboVacEntityFeature.ZONE | RoboVacEntityFeature.BOOST_IQ # | RoboVacEntityFeature.MAP - # | RoboVacEntityFeature.CONSUMABLES + # | RoboVacEntityFeature.CONSUMABLES ) commands = { RobovacCommand.MODE: { #works (Start Auto and Return dock commands tested) diff --git a/custom_components/robovac/vacuums/T2277.py b/custom_components/robovac/vacuums/T2277.py index b9adb38..f4e8fc7 100644 --- a/custom_components/robovac/vacuums/T2277.py +++ b/custom_components/robovac/vacuums/T2277.py @@ -18,14 +18,14 @@ class T2277: ) robovac_features = ( # RoboVacEntityFeature.CLEANING_TIME - # | RoboVacEntityFeature.CLEANING_AREA + # | RoboVacEntityFeature.CLEANING_AREA RoboVacEntityFeature.DO_NOT_DISTURB - | RoboVacEntityFeature.AUTO_RETURN + # | RoboVacEntityFeature.AUTO_RETURN # | RoboVacEntityFeature.ROOM # | RoboVacEntityFeature.ZONE | RoboVacEntityFeature.BOOST_IQ # | RoboVacEntityFeature.MAP - # | RoboVacEntityFeature.CONSUMABLES + # | RoboVacEntityFeature.CONSUMABLES ) commands = { RobovacCommand.MODE: { #works (Start Auto and Return dock commands tested) diff --git a/custom_components/robovac/vacuums/T2278.py b/custom_components/robovac/vacuums/T2278.py index b9adb38..f4e8fc7 100644 --- a/custom_components/robovac/vacuums/T2278.py +++ b/custom_components/robovac/vacuums/T2278.py @@ -18,14 +18,14 @@ class T2277: ) robovac_features = ( # RoboVacEntityFeature.CLEANING_TIME - # | RoboVacEntityFeature.CLEANING_AREA + # | RoboVacEntityFeature.CLEANING_AREA RoboVacEntityFeature.DO_NOT_DISTURB - | RoboVacEntityFeature.AUTO_RETURN + # | RoboVacEntityFeature.AUTO_RETURN # | RoboVacEntityFeature.ROOM # | RoboVacEntityFeature.ZONE | RoboVacEntityFeature.BOOST_IQ # | RoboVacEntityFeature.MAP - # | RoboVacEntityFeature.CONSUMABLES + # | RoboVacEntityFeature.CONSUMABLES ) commands = { RobovacCommand.MODE: { #works (Start Auto and Return dock commands tested) From fc1d0f58ca31a7481f9e99e13cb27a3ff8e510cf Mon Sep 17 00:00:00 2001 From: Maxim Oei Date: Thu, 25 Jul 2024 16:20:55 +0200 Subject: [PATCH 11/17] init and model file updates --- custom_components/robovac/vacuums/T2267.py | 2 +- custom_components/robovac/vacuums/T2278.py | 2 +- custom_components/robovac/vacuums/__init__.py | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/custom_components/robovac/vacuums/T2267.py b/custom_components/robovac/vacuums/T2267.py index f4e8fc7..1f20fe4 100644 --- a/custom_components/robovac/vacuums/T2267.py +++ b/custom_components/robovac/vacuums/T2267.py @@ -2,7 +2,7 @@ from .base import RoboVacEntityFeature, RobovacCommand -class T2277: +class T2267: homeassistant_features = ( VacuumEntityFeature.BATTERY # | VacuumEntityFeature.CLEAN_SPOT diff --git a/custom_components/robovac/vacuums/T2278.py b/custom_components/robovac/vacuums/T2278.py index f4e8fc7..c4b1ce0 100644 --- a/custom_components/robovac/vacuums/T2278.py +++ b/custom_components/robovac/vacuums/T2278.py @@ -2,7 +2,7 @@ from .base import RoboVacEntityFeature, RobovacCommand -class T2277: +class T2278: homeassistant_features = ( VacuumEntityFeature.BATTERY # | VacuumEntityFeature.CLEAN_SPOT diff --git a/custom_components/robovac/vacuums/__init__.py b/custom_components/robovac/vacuums/__init__.py index 880b536..2706f3c 100644 --- a/custom_components/robovac/vacuums/__init__.py +++ b/custom_components/robovac/vacuums/__init__.py @@ -29,6 +29,8 @@ from .T2193 import T2193 from .T2194 import T2194 from .T2267 import T2267 +from .T2277 import T2277 +from .T2278 import T2278 from .T2261 import T2261 from .T2262 import T2262 from .T2320 import T2320 @@ -66,6 +68,8 @@ "T2193": T2193, "T2194": T2194, "T2267": T2267, + "T2277": T2277, + "T2278": T2278, "T2261": T2261, "T2262": T2262, "T2320": T2320 From c701bf3024a5f97263211c27c2a0a7dd77cb66f5 Mon Sep 17 00:00:00 2001 From: Maxim Oei Date: Tue, 30 Jul 2024 10:30:37 +0200 Subject: [PATCH 12/17] Add T2351 --- custom_components/robovac/vacuums/T2351.py | 120 ++++++++++++++++++ custom_components/robovac/vacuums/__init__.py | 4 +- 2 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 custom_components/robovac/vacuums/T2351.py diff --git a/custom_components/robovac/vacuums/T2351.py b/custom_components/robovac/vacuums/T2351.py new file mode 100644 index 0000000..3c15698 --- /dev/null +++ b/custom_components/robovac/vacuums/T2351.py @@ -0,0 +1,120 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2351: + homeassistant_features = ( + VacuumEntityFeature.BATTERY +# | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP +# | VacuumEntityFeature.MAP + ) + robovac_features = ( + # RoboVacEntityFeature.CLEANING_TIME + # | RoboVacEntityFeature.CLEANING_AREA + RoboVacEntityFeature.DO_NOT_DISTURB + # | RoboVacEntityFeature.AUTO_RETURN + # | RoboVacEntityFeature.ROOM + # | RoboVacEntityFeature.ZONE + | RoboVacEntityFeature.BOOST_IQ + # | RoboVacEntityFeature.MAP + # | RoboVacEntityFeature.CONSUMABLES + ) + commands = { + RobovacCommand.MODE: { #works (Start Auto and Return dock commands tested) + "code": 152, + "values": ["AggN","AA==","AggG","BBoCCAE=","AggO"], + }, + RobovacCommand.STATUS: { #works (status only) + "code": 153, + "values": ["BgoAEAUyAA===","BgoAEAVSAA===","CAoAEAUyAggB","CAoCCAEQBTIA","CAoCCAEQBVIA","CgoCCAEQBTICCAE=","CAoCCAIQBTIA","CAoCCAIQBVIA","CgoCCAIQBTICCAE=","BAoAEAY=","BBAHQgA=","BBADGgA=","BhADGgIIAQ==","AA==","AhAB"], + }, + RobovacCommand.DIRECTION: { #untested + "code": 155, + "values": ["Brake", "Forward", "Back", "Left", "Right"], + }, + RobovacCommand.START_PAUSE: 156, # True, False #works (status only) + RobovacCommand.DO_NOT_DISTURB: 157, # DgoAEgoKABICCBYaAggI #untested + RobovacCommand.FAN_SPEED: { #works (status and update) + "code": 158, + "values": ["Quiet", "Standard", "Turbo", "Max"], + }, + RobovacCommand.BOOST_IQ: 159, # True, False #works (status and update) + RobovacCommand.LOCATE: 160, # True, False #works (status) + # Speaker volume: 161 #works, not yet implemented + RobovacCommand.BATTERY: 163, # int #works (status) + RobovacCommand.CONSUMABLES: 168, #encrypted, not usable + RobovacCommand.RETURN_HOME: 173, #encrypted, not usable + # FgoQMggKAggBEgIQAToECgIIARICCAE= + # FgoQMg4KAggBEggIARj/////DxICCAE= + # FAoQMggKAggBEgIQAToECgIIARIA + # GAoQMggKAggBEgIQAToECgIIARIECAE4AQ== + # GgoQMggKAggBEgIQAToECgIIARIGCAEYATgB + RobovacCommand.ERROR: 177, # #encrypted, few known values + # SIDEBRUSH_STUCK: "FAjwudWorOPszgEaAqURUgQSAqUR" + # ROBOT_STUCK: "FAj+nMu7zuPszgEaAtg2UgQSAtg2" + + + # IQofCgIIAhICCAIaAggCKgIIAjoCCBugAe7Pqs6M1+zOAQ== + # IQofCgIIAhICCAIaAggCKgIIAjoCCBqgAYPx0a331uzOAQ== + # IQofCgIIBBICCAQaAggEKgIIBDoCCCmgAcSfs6Lo5uzOAQ== + + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # Unknown: 151 (true/false) + # Unknown: 154 + # DgoKCgAaAggBIgIIARIA + # DAoICgAaAggBIgASAA== + # Unknown: 164 + # MBoAIiwKBgi4y/q0BhIECAEQARoMCAESBBgJIB4aAgg+Kg4aDBIKCgIIARIAGgAiAA== + # NAgGEAYaACIsCgYIuMv6tAYSBAgBEAEaDAgBEgQYCSAeGgIIPioOGgwSCgoCCAESABoAIgA= + # Unknown: 167 + # FAoAEgcIiEoQbhgEGgcI1EgQbBgC + # FgoCEAESBwiIShBuGAQaBwjUSBBsGAI= + # GAoECDwQARIHCIhKEG4YBBoHCNRIEGwYAg== + # GQoFCLQBEAQSBwiIShBuGAQaBwjUSBBsGAI= + # GwoFCKApEDgSCAiocxCmARgFGggI9HEQpAEYAw== + # Unknown: 171 + # AhAB + # Unknown: 176 + # MQoAGgBSCBoAIgIIASoAWDJiHwodChFBIG5ldHdvcmsgZm9yIHlvdRABGgYQ4/7/tAY= + # LwoAGgBSCBoAIgIIASoAWFZiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEPvagrUG + # LwoAGgBSCBoAIgIIASoAWCJiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEK2YgLUG + # LwoAGgBSCBoAIgIIASoAWDBiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEK2YgLUG + # Unknown: 178 + # DQjRidjfv9bszgESAR8= + # DQiMrPbd+eLszgESAVU= + # DQiW0dXL+uLszgESAR8= + # Cgiv6NbWsePszgE= + # DQjPuorb6eTszgESAR8= + # DQjayd7nsOXszgESASg= + # Unknown: 179 + # EBIOKgwIBRACGAEgwYyAtQY= + # FhIUEhIIBRABIFsowYyAtQYw74yAtQY= + # DhIMKgoIBhgCIPvagrUG + # DhIMKgoIBxgCIJLbgrUG + # EBIOKgwIBxADGAIg3eyCtQY= + # EBIOKgwIBxAEGAIgrPGCtQY= + # DhIMKgoICBgCILHxgrUG + # DhIMKgoICBADIIj6grUG + # DhIMKgoICBADIOqMg7UG + # DhIMKgoICBAEIOuMg7UG + # DBIKKggICSCljYO1Bg== + # DhIMKgoICRACIJmcg7UG + # FhIUEhIICRABIBoomZyDtQYw6pyDtQY= + # DhIMIgoICRABGO+cg7UG + # DhIMIgoICRABGLedg7UG + # IRIfCh0ICRgBMPvagrUGOMmdg7UGQKApSDhQO1gBYAdqAA== + # Unknown: 169 + # cwoSZXVmeSBDbGVhbiBMNjAgU0VTGhFDODpGRTowRjo3Nzo5NDo5QyIGMS4zLjI0KAVCKDM2NGFjOGNkNjQzZjllMDczZjg4NzlmNGFhOTdkZGE5OGUzMjg5NTRiFggBEgQIAhABGgQIAhABIgIIASoCCAE= + # s \x12eufy Clean L60 SES\x1a\x11C8:FE:0F:77:94:9C"\x061.3.24(\x05B(364ac8cd643f9e073f8879f4aa97dda98e328954b\x16\x08\x01\x12\x04\x08\x02\x10\x01\x1a\x04\x08\x02\x10\x01"\x02\x08\x01*\x02\x08\x01 + } diff --git a/custom_components/robovac/vacuums/__init__.py b/custom_components/robovac/vacuums/__init__.py index 2706f3c..bfc1f50 100644 --- a/custom_components/robovac/vacuums/__init__.py +++ b/custom_components/robovac/vacuums/__init__.py @@ -34,6 +34,7 @@ from .T2261 import T2261 from .T2262 import T2262 from .T2320 import T2320 +from .T2351 import T2351 ROBOVAC_MODELS = { @@ -72,5 +73,6 @@ "T2278": T2278, "T2261": T2261, "T2262": T2262, - "T2320": T2320 + "T2320": T2320, + "T2351": T2351, } \ No newline at end of file From c39afb9b450c31cc1ad0f204898f5ecabc30308b Mon Sep 17 00:00:00 2001 From: Maxim Oei Date: Tue, 30 Jul 2024 10:38:58 +0200 Subject: [PATCH 13/17] Add T2275 (L50 SES) --- custom_components/robovac/vacuums/T2275.py | 120 ++++++++++++++++++ custom_components/robovac/vacuums/__init__.py | 2 + 2 files changed, 122 insertions(+) create mode 100644 custom_components/robovac/vacuums/T2275.py diff --git a/custom_components/robovac/vacuums/T2275.py b/custom_components/robovac/vacuums/T2275.py new file mode 100644 index 0000000..f4e8fc7 --- /dev/null +++ b/custom_components/robovac/vacuums/T2275.py @@ -0,0 +1,120 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2277: + homeassistant_features = ( + VacuumEntityFeature.BATTERY +# | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP +# | VacuumEntityFeature.MAP + ) + robovac_features = ( + # RoboVacEntityFeature.CLEANING_TIME + # | RoboVacEntityFeature.CLEANING_AREA + RoboVacEntityFeature.DO_NOT_DISTURB + # | RoboVacEntityFeature.AUTO_RETURN + # | RoboVacEntityFeature.ROOM + # | RoboVacEntityFeature.ZONE + | RoboVacEntityFeature.BOOST_IQ + # | RoboVacEntityFeature.MAP + # | RoboVacEntityFeature.CONSUMABLES + ) + commands = { + RobovacCommand.MODE: { #works (Start Auto and Return dock commands tested) + "code": 152, + "values": ["AggN","AA==","AggG","BBoCCAE=","AggO"], + }, + RobovacCommand.STATUS: { #works (status only) + "code": 153, + "values": ["BgoAEAUyAA===","BgoAEAVSAA===","CAoAEAUyAggB","CAoCCAEQBTIA","CAoCCAEQBVIA","CgoCCAEQBTICCAE=","CAoCCAIQBTIA","CAoCCAIQBVIA","CgoCCAIQBTICCAE=","BAoAEAY=","BBAHQgA=","BBADGgA=","BhADGgIIAQ==","AA==","AhAB"], + }, + RobovacCommand.DIRECTION: { #untested + "code": 155, + "values": ["Brake", "Forward", "Back", "Left", "Right"], + }, + RobovacCommand.START_PAUSE: 156, # True, False #works (status only) + RobovacCommand.DO_NOT_DISTURB: 157, # DgoAEgoKABICCBYaAggI #untested + RobovacCommand.FAN_SPEED: { #works (status and update) + "code": 158, + "values": ["Quiet", "Standard", "Turbo", "Max"], + }, + RobovacCommand.BOOST_IQ: 159, # True, False #works (status and update) + RobovacCommand.LOCATE: 160, # True, False #works (status) + # Speaker volume: 161 #works, not yet implemented + RobovacCommand.BATTERY: 163, # int #works (status) + RobovacCommand.CONSUMABLES: 168, #encrypted, not usable + RobovacCommand.RETURN_HOME: 173, #encrypted, not usable + # FgoQMggKAggBEgIQAToECgIIARICCAE= + # FgoQMg4KAggBEggIARj/////DxICCAE= + # FAoQMggKAggBEgIQAToECgIIARIA + # GAoQMggKAggBEgIQAToECgIIARIECAE4AQ== + # GgoQMggKAggBEgIQAToECgIIARIGCAEYATgB + RobovacCommand.ERROR: 177, # #encrypted, few known values + # SIDEBRUSH_STUCK: "FAjwudWorOPszgEaAqURUgQSAqUR" + # ROBOT_STUCK: "FAj+nMu7zuPszgEaAtg2UgQSAtg2" + + + # IQofCgIIAhICCAIaAggCKgIIAjoCCBugAe7Pqs6M1+zOAQ== + # IQofCgIIAhICCAIaAggCKgIIAjoCCBqgAYPx0a331uzOAQ== + # IQofCgIIBBICCAQaAggEKgIIBDoCCCmgAcSfs6Lo5uzOAQ== + + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # Unknown: 151 (true/false) + # Unknown: 154 + # DgoKCgAaAggBIgIIARIA + # DAoICgAaAggBIgASAA== + # Unknown: 164 + # MBoAIiwKBgi4y/q0BhIECAEQARoMCAESBBgJIB4aAgg+Kg4aDBIKCgIIARIAGgAiAA== + # NAgGEAYaACIsCgYIuMv6tAYSBAgBEAEaDAgBEgQYCSAeGgIIPioOGgwSCgoCCAESABoAIgA= + # Unknown: 167 + # FAoAEgcIiEoQbhgEGgcI1EgQbBgC + # FgoCEAESBwiIShBuGAQaBwjUSBBsGAI= + # GAoECDwQARIHCIhKEG4YBBoHCNRIEGwYAg== + # GQoFCLQBEAQSBwiIShBuGAQaBwjUSBBsGAI= + # GwoFCKApEDgSCAiocxCmARgFGggI9HEQpAEYAw== + # Unknown: 171 + # AhAB + # Unknown: 176 + # MQoAGgBSCBoAIgIIASoAWDJiHwodChFBIG5ldHdvcmsgZm9yIHlvdRABGgYQ4/7/tAY= + # LwoAGgBSCBoAIgIIASoAWFZiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEPvagrUG + # LwoAGgBSCBoAIgIIASoAWCJiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEK2YgLUG + # LwoAGgBSCBoAIgIIASoAWDBiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEK2YgLUG + # Unknown: 178 + # DQjRidjfv9bszgESAR8= + # DQiMrPbd+eLszgESAVU= + # DQiW0dXL+uLszgESAR8= + # Cgiv6NbWsePszgE= + # DQjPuorb6eTszgESAR8= + # DQjayd7nsOXszgESASg= + # Unknown: 179 + # EBIOKgwIBRACGAEgwYyAtQY= + # FhIUEhIIBRABIFsowYyAtQYw74yAtQY= + # DhIMKgoIBhgCIPvagrUG + # DhIMKgoIBxgCIJLbgrUG + # EBIOKgwIBxADGAIg3eyCtQY= + # EBIOKgwIBxAEGAIgrPGCtQY= + # DhIMKgoICBgCILHxgrUG + # DhIMKgoICBADIIj6grUG + # DhIMKgoICBADIOqMg7UG + # DhIMKgoICBAEIOuMg7UG + # DBIKKggICSCljYO1Bg== + # DhIMKgoICRACIJmcg7UG + # FhIUEhIICRABIBoomZyDtQYw6pyDtQY= + # DhIMIgoICRABGO+cg7UG + # DhIMIgoICRABGLedg7UG + # IRIfCh0ICRgBMPvagrUGOMmdg7UGQKApSDhQO1gBYAdqAA== + # Unknown: 169 + # cwoSZXVmeSBDbGVhbiBMNjAgU0VTGhFDODpGRTowRjo3Nzo5NDo5QyIGMS4zLjI0KAVCKDM2NGFjOGNkNjQzZjllMDczZjg4NzlmNGFhOTdkZGE5OGUzMjg5NTRiFggBEgQIAhABGgQIAhABIgIIASoCCAE= + # s \x12eufy Clean L60 SES\x1a\x11C8:FE:0F:77:94:9C"\x061.3.24(\x05B(364ac8cd643f9e073f8879f4aa97dda98e328954b\x16\x08\x01\x12\x04\x08\x02\x10\x01\x1a\x04\x08\x02\x10\x01"\x02\x08\x01*\x02\x08\x01 + } diff --git a/custom_components/robovac/vacuums/__init__.py b/custom_components/robovac/vacuums/__init__.py index bfc1f50..65af05f 100644 --- a/custom_components/robovac/vacuums/__init__.py +++ b/custom_components/robovac/vacuums/__init__.py @@ -35,6 +35,7 @@ from .T2262 import T2262 from .T2320 import T2320 from .T2351 import T2351 +from .T2275 import T2275 ROBOVAC_MODELS = { @@ -75,4 +76,5 @@ "T2262": T2262, "T2320": T2320, "T2351": T2351, + "T2275": T2275, } \ No newline at end of file From 942a8cdd1fb41286b2fa53ed49e9490e3d18c540 Mon Sep 17 00:00:00 2001 From: Maxim Oei Date: Tue, 30 Jul 2024 10:40:12 +0200 Subject: [PATCH 14/17] Fix T2275 --- custom_components/robovac/vacuums/T2275.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom_components/robovac/vacuums/T2275.py b/custom_components/robovac/vacuums/T2275.py index f4e8fc7..8411453 100644 --- a/custom_components/robovac/vacuums/T2275.py +++ b/custom_components/robovac/vacuums/T2275.py @@ -2,7 +2,7 @@ from .base import RoboVacEntityFeature, RobovacCommand -class T2277: +class T2275: homeassistant_features = ( VacuumEntityFeature.BATTERY # | VacuumEntityFeature.CLEAN_SPOT From 0996283b765fdff538b898368b8ade927449b92d Mon Sep 17 00:00:00 2001 From: Maxim Oei Date: Tue, 30 Jul 2024 10:42:08 +0200 Subject: [PATCH 15/17] Add T2276 (X8 Pro SES) --- custom_components/robovac/vacuums/T2276.py | 120 ++++++++++++++++++ custom_components/robovac/vacuums/__init__.py | 2 + 2 files changed, 122 insertions(+) create mode 100644 custom_components/robovac/vacuums/T2276.py diff --git a/custom_components/robovac/vacuums/T2276.py b/custom_components/robovac/vacuums/T2276.py new file mode 100644 index 0000000..223b0da --- /dev/null +++ b/custom_components/robovac/vacuums/T2276.py @@ -0,0 +1,120 @@ +from homeassistant.components.vacuum import VacuumEntityFeature +from .base import RoboVacEntityFeature, RobovacCommand + + +class T2276: + homeassistant_features = ( + VacuumEntityFeature.BATTERY +# | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP +# | VacuumEntityFeature.MAP + ) + robovac_features = ( + # RoboVacEntityFeature.CLEANING_TIME + # | RoboVacEntityFeature.CLEANING_AREA + RoboVacEntityFeature.DO_NOT_DISTURB + # | RoboVacEntityFeature.AUTO_RETURN + # | RoboVacEntityFeature.ROOM + # | RoboVacEntityFeature.ZONE + | RoboVacEntityFeature.BOOST_IQ + # | RoboVacEntityFeature.MAP + # | RoboVacEntityFeature.CONSUMABLES + ) + commands = { + RobovacCommand.MODE: { #works (Start Auto and Return dock commands tested) + "code": 152, + "values": ["AggN","AA==","AggG","BBoCCAE=","AggO"], + }, + RobovacCommand.STATUS: { #works (status only) + "code": 153, + "values": ["BgoAEAUyAA===","BgoAEAVSAA===","CAoAEAUyAggB","CAoCCAEQBTIA","CAoCCAEQBVIA","CgoCCAEQBTICCAE=","CAoCCAIQBTIA","CAoCCAIQBVIA","CgoCCAIQBTICCAE=","BAoAEAY=","BBAHQgA=","BBADGgA=","BhADGgIIAQ==","AA==","AhAB"], + }, + RobovacCommand.DIRECTION: { #untested + "code": 155, + "values": ["Brake", "Forward", "Back", "Left", "Right"], + }, + RobovacCommand.START_PAUSE: 156, # True, False #works (status only) + RobovacCommand.DO_NOT_DISTURB: 157, # DgoAEgoKABICCBYaAggI #untested + RobovacCommand.FAN_SPEED: { #works (status and update) + "code": 158, + "values": ["Quiet", "Standard", "Turbo", "Max"], + }, + RobovacCommand.BOOST_IQ: 159, # True, False #works (status and update) + RobovacCommand.LOCATE: 160, # True, False #works (status) + # Speaker volume: 161 #works, not yet implemented + RobovacCommand.BATTERY: 163, # int #works (status) + RobovacCommand.CONSUMABLES: 168, #encrypted, not usable + RobovacCommand.RETURN_HOME: 173, #encrypted, not usable + # FgoQMggKAggBEgIQAToECgIIARICCAE= + # FgoQMg4KAggBEggIARj/////DxICCAE= + # FAoQMggKAggBEgIQAToECgIIARIA + # GAoQMggKAggBEgIQAToECgIIARIECAE4AQ== + # GgoQMggKAggBEgIQAToECgIIARIGCAEYATgB + RobovacCommand.ERROR: 177, # #encrypted, few known values + # SIDEBRUSH_STUCK: "FAjwudWorOPszgEaAqURUgQSAqUR" + # ROBOT_STUCK: "FAj+nMu7zuPszgEaAtg2UgQSAtg2" + + + # IQofCgIIAhICCAIaAggCKgIIAjoCCBugAe7Pqs6M1+zOAQ== + # IQofCgIIAhICCAIaAggCKgIIAjoCCBqgAYPx0a331uzOAQ== + # IQofCgIIBBICCAQaAggEKgIIBDoCCCmgAcSfs6Lo5uzOAQ== + + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # Unknown: 151 (true/false) + # Unknown: 154 + # DgoKCgAaAggBIgIIARIA + # DAoICgAaAggBIgASAA== + # Unknown: 164 + # MBoAIiwKBgi4y/q0BhIECAEQARoMCAESBBgJIB4aAgg+Kg4aDBIKCgIIARIAGgAiAA== + # NAgGEAYaACIsCgYIuMv6tAYSBAgBEAEaDAgBEgQYCSAeGgIIPioOGgwSCgoCCAESABoAIgA= + # Unknown: 167 + # FAoAEgcIiEoQbhgEGgcI1EgQbBgC + # FgoCEAESBwiIShBuGAQaBwjUSBBsGAI= + # GAoECDwQARIHCIhKEG4YBBoHCNRIEGwYAg== + # GQoFCLQBEAQSBwiIShBuGAQaBwjUSBBsGAI= + # GwoFCKApEDgSCAiocxCmARgFGggI9HEQpAEYAw== + # Unknown: 171 + # AhAB + # Unknown: 176 + # MQoAGgBSCBoAIgIIASoAWDJiHwodChFBIG5ldHdvcmsgZm9yIHlvdRABGgYQ4/7/tAY= + # LwoAGgBSCBoAIgIIASoAWFZiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEPvagrUG + # LwoAGgBSCBoAIgIIASoAWCJiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEK2YgLUG + # LwoAGgBSCBoAIgIIASoAWDBiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEK2YgLUG + # Unknown: 178 + # DQjRidjfv9bszgESAR8= + # DQiMrPbd+eLszgESAVU= + # DQiW0dXL+uLszgESAR8= + # Cgiv6NbWsePszgE= + # DQjPuorb6eTszgESAR8= + # DQjayd7nsOXszgESASg= + # Unknown: 179 + # EBIOKgwIBRACGAEgwYyAtQY= + # FhIUEhIIBRABIFsowYyAtQYw74yAtQY= + # DhIMKgoIBhgCIPvagrUG + # DhIMKgoIBxgCIJLbgrUG + # EBIOKgwIBxADGAIg3eyCtQY= + # EBIOKgwIBxAEGAIgrPGCtQY= + # DhIMKgoICBgCILHxgrUG + # DhIMKgoICBADIIj6grUG + # DhIMKgoICBADIOqMg7UG + # DhIMKgoICBAEIOuMg7UG + # DBIKKggICSCljYO1Bg== + # DhIMKgoICRACIJmcg7UG + # FhIUEhIICRABIBoomZyDtQYw6pyDtQY= + # DhIMIgoICRABGO+cg7UG + # DhIMIgoICRABGLedg7UG + # IRIfCh0ICRgBMPvagrUGOMmdg7UGQKApSDhQO1gBYAdqAA== + # Unknown: 169 + # cwoSZXVmeSBDbGVhbiBMNjAgU0VTGhFDODpGRTowRjo3Nzo5NDo5QyIGMS4zLjI0KAVCKDM2NGFjOGNkNjQzZjllMDczZjg4NzlmNGFhOTdkZGE5OGUzMjg5NTRiFggBEgQIAhABGgQIAhABIgIIASoCCAE= + # s \x12eufy Clean L60 SES\x1a\x11C8:FE:0F:77:94:9C"\x061.3.24(\x05B(364ac8cd643f9e073f8879f4aa97dda98e328954b\x16\x08\x01\x12\x04\x08\x02\x10\x01\x1a\x04\x08\x02\x10\x01"\x02\x08\x01*\x02\x08\x01 + } diff --git a/custom_components/robovac/vacuums/__init__.py b/custom_components/robovac/vacuums/__init__.py index 65af05f..db64709 100644 --- a/custom_components/robovac/vacuums/__init__.py +++ b/custom_components/robovac/vacuums/__init__.py @@ -36,6 +36,7 @@ from .T2320 import T2320 from .T2351 import T2351 from .T2275 import T2275 +from .T2276 import T2276 ROBOVAC_MODELS = { @@ -77,4 +78,5 @@ "T2320": T2320, "T2351": T2351, "T2275": T2275, + "T2276": T2276, } \ No newline at end of file From e0aeb0b8699e2dc03c63729b0cd04a637cf22277 Mon Sep 17 00:00:00 2001 From: Maxim Oei Date: Tue, 30 Jul 2024 13:34:52 +0200 Subject: [PATCH 16/17] Update T2320.py --- custom_components/robovac/vacuums/T2320.py | 116 +++++++++++++++++---- 1 file changed, 95 insertions(+), 21 deletions(-) diff --git a/custom_components/robovac/vacuums/T2320.py b/custom_components/robovac/vacuums/T2320.py index ef4b690..1742aaf 100644 --- a/custom_components/robovac/vacuums/T2320.py +++ b/custom_components/robovac/vacuums/T2320.py @@ -5,7 +5,7 @@ class T2320: homeassistant_features = ( VacuumEntityFeature.BATTERY - | VacuumEntityFeature.CLEAN_SPOT +# | VacuumEntityFeature.CLEAN_SPOT | VacuumEntityFeature.FAN_SPEED | VacuumEntityFeature.LOCATE | VacuumEntityFeature.PAUSE @@ -14,33 +14,107 @@ class T2320: | VacuumEntityFeature.START | VacuumEntityFeature.STATE | VacuumEntityFeature.STOP - | VacuumEntityFeature.MAP +# | VacuumEntityFeature.MAP + ) + robovac_features = ( + # RoboVacEntityFeature.CLEANING_TIME + # | RoboVacEntityFeature.CLEANING_AREA + RoboVacEntityFeature.DO_NOT_DISTURB + # | RoboVacEntityFeature.AUTO_RETURN + # | RoboVacEntityFeature.ROOM + # | RoboVacEntityFeature.ZONE + | RoboVacEntityFeature.BOOST_IQ + # | RoboVacEntityFeature.MAP + # | RoboVacEntityFeature.CONSUMABLES ) - robovac_features = RoboVacEntityFeature.CLEANING_TIME | RoboVacEntityFeature.CLEANING_AREA | RoboVacEntityFeature.DO_NOT_DISTURB | RoboVacEntityFeature.AUTO_RETURN | RoboVacEntityFeature.ROOM | RoboVacEntityFeature.ZONE | RoboVacEntityFeature.BOOST_IQ | RoboVacEntityFeature.MAP | RoboVacEntityFeature.CONSUMABLES commands = { - RobovacCommand.START_PAUSE: 2, - RobovacCommand.DIRECTION: { - "code": 3, - "values": ["forward", "back", "left", "right"], + RobovacCommand.MODE: { #works (Start Auto and Return dock commands tested) + "code": 152, + "values": ["AggN","AA==","AggG","BBoCCAE=","AggO"], }, - RobovacCommand.MODE: { - "code": 5, - "values": ["auto", "SmallRoom", "Spot", "Edge", "Nosweep"], + RobovacCommand.STATUS: { #works (status only) + "code": 153, + "values": ["BgoAEAUyAA===","BgoAEAVSAA===","CAoAEAUyAggB","CAoCCAEQBTIA","CAoCCAEQBVIA","CgoCCAEQBTICCAE=","CAoCCAIQBTIA","CAoCCAIQBVIA","CgoCCAIQBTICCAE=","BAoAEAY=","BBAHQgA=","BBADGgA=","BhADGgIIAQ==","AA==","AhAB"], + }, + RobovacCommand.DIRECTION: { #untested + "code": 155, + "values": ["Brake", "Forward", "Back", "Left", "Right"], }, - RobovacCommand.STATUS: 15, - RobovacCommand.RETURN_HOME: 101, - RobovacCommand.FAN_SPEED: { - "code": 102, - "values": ["Pure","Standard","Turbo","Max"], + RobovacCommand.START_PAUSE: 156, # True, False #works (status only) + RobovacCommand.DO_NOT_DISTURB: 157, # DgoAEgoKABICCBYaAggI #untested + RobovacCommand.FAN_SPEED: { #works (status and update) + "code": 158, + "values": ["Quiet", "Standard", "Turbo", "Max"], }, - RobovacCommand.LOCATE: 103, - RobovacCommand.BATTERY: 104, - RobovacCommand.ERROR: 106, + RobovacCommand.BOOST_IQ: 159, # True, False #works (status and update) + RobovacCommand.LOCATE: 160, # True, False #works (status) + # Speaker volume: 161 #works, not yet implemented + RobovacCommand.BATTERY: 163, # int #works (status) + RobovacCommand.CONSUMABLES: 168, #encrypted, not usable + RobovacCommand.RETURN_HOME: 173, #encrypted, not usable + # FgoQMggKAggBEgIQAToECgIIARICCAE= + # FgoQMg4KAggBEggIARj/////DxICCAE= + # FAoQMggKAggBEgIQAToECgIIARIA + # GAoQMggKAggBEgIQAToECgIIARIECAE4AQ== + # GgoQMggKAggBEgIQAToECgIIARIGCAEYATgB + RobovacCommand.ERROR: 177, # #encrypted, few known values + # SIDEBRUSH_STUCK: "FAjwudWorOPszgEaAqURUgQSAqUR" + # ROBOT_STUCK: "FAj+nMu7zuPszgEaAtg2UgQSAtg2" + + + # IQofCgIIAhICCAIaAggCKgIIAjoCCBugAe7Pqs6M1+zOAQ== + # IQofCgIIAhICCAIaAggCKgIIAjoCCBqgAYPx0a331uzOAQ== + # IQofCgIIBBICCAQaAggEKgIIBDoCCCmgAcSfs6Lo5uzOAQ== + # These commands need codes adding # RobovacCommand.CLEANING_AREA: 0, # RobovacCommand.CLEANING_TIME: 0, # RobovacCommand.AUTO_RETURN: 0, - # RobovacCommand.DO_NOT_DISTURB: 0, - # RobovacCommand.BOOST_IQ: 0, - # RobovacCommand.CONSUMABLES: 0, + # Unknown: 151 (true/false) + # Unknown: 154 + # DgoKCgAaAggBIgIIARIA + # DAoICgAaAggBIgASAA== + # Unknown: 164 + # MBoAIiwKBgi4y/q0BhIECAEQARoMCAESBBgJIB4aAgg+Kg4aDBIKCgIIARIAGgAiAA== + # NAgGEAYaACIsCgYIuMv6tAYSBAgBEAEaDAgBEgQYCSAeGgIIPioOGgwSCgoCCAESABoAIgA= + # Unknown: 167 + # FAoAEgcIiEoQbhgEGgcI1EgQbBgC + # FgoCEAESBwiIShBuGAQaBwjUSBBsGAI= + # GAoECDwQARIHCIhKEG4YBBoHCNRIEGwYAg== + # GQoFCLQBEAQSBwiIShBuGAQaBwjUSBBsGAI= + # GwoFCKApEDgSCAiocxCmARgFGggI9HEQpAEYAw== + # Unknown: 171 + # AhAB + # Unknown: 176 + # MQoAGgBSCBoAIgIIASoAWDJiHwodChFBIG5ldHdvcmsgZm9yIHlvdRABGgYQ4/7/tAY= + # LwoAGgBSCBoAIgIIASoAWFZiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEPvagrUG + # LwoAGgBSCBoAIgIIASoAWCJiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEK2YgLUG + # LwoAGgBSCBoAIgIIASoAWDBiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEK2YgLUG + # Unknown: 178 + # DQjRidjfv9bszgESAR8= + # DQiMrPbd+eLszgESAVU= + # DQiW0dXL+uLszgESAR8= + # Cgiv6NbWsePszgE= + # DQjPuorb6eTszgESAR8= + # DQjayd7nsOXszgESASg= + # Unknown: 179 + # EBIOKgwIBRACGAEgwYyAtQY= + # FhIUEhIIBRABIFsowYyAtQYw74yAtQY= + # DhIMKgoIBhgCIPvagrUG + # DhIMKgoIBxgCIJLbgrUG + # EBIOKgwIBxADGAIg3eyCtQY= + # EBIOKgwIBxAEGAIgrPGCtQY= + # DhIMKgoICBgCILHxgrUG + # DhIMKgoICBADIIj6grUG + # DhIMKgoICBADIOqMg7UG + # DhIMKgoICBAEIOuMg7UG + # DBIKKggICSCljYO1Bg== + # DhIMKgoICRACIJmcg7UG + # FhIUEhIICRABIBoomZyDtQYw6pyDtQY= + # DhIMIgoICRABGO+cg7UG + # DhIMIgoICRABGLedg7UG + # IRIfCh0ICRgBMPvagrUGOMmdg7UGQKApSDhQO1gBYAdqAA== + # Unknown: 169 + # cwoSZXVmeSBDbGVhbiBMNjAgU0VTGhFDODpGRTowRjo3Nzo5NDo5QyIGMS4zLjI0KAVCKDM2NGFjOGNkNjQzZjllMDczZjg4NzlmNGFhOTdkZGE5OGUzMjg5NTRiFggBEgQIAhABGgQIAhABIgIIASoCCAE= + # s \x12eufy Clean L60 SES\x1a\x11C8:FE:0F:77:94:9C"\x061.3.24(\x05B(364ac8cd643f9e073f8879f4aa97dda98e328954b\x16\x08\x01\x12\x04\x08\x02\x10\x01\x1a\x04\x08\x02\x10\x01"\x02\x08\x01*\x02\x08\x01 } From 92d4eb7a7140eb189cf62e836129d82534f1a1f8 Mon Sep 17 00:00:00 2001 From: Maxim Oei Date: Wed, 31 Jul 2024 16:12:52 +0200 Subject: [PATCH 17/17] add T2266 --- custom_components/robovac/vacuums/T2266.py | 134 ++++++++++++++++++ custom_components/robovac/vacuums/__init__.py | 31 ++-- 2 files changed, 150 insertions(+), 15 deletions(-) create mode 100644 custom_components/robovac/vacuums/T2266.py diff --git a/custom_components/robovac/vacuums/T2266.py b/custom_components/robovac/vacuums/T2266.py new file mode 100644 index 0000000..1f996a2 --- /dev/null +++ b/custom_components/robovac/vacuums/T2266.py @@ -0,0 +1,134 @@ +from homeassistant.components.vacuum import VacuumEntityFeature + +from .base import RobovacCommand, RoboVacEntityFeature + + +class T2266: + homeassistant_features = ( + VacuumEntityFeature.BATTERY + # | VacuumEntityFeature.CLEAN_SPOT + | VacuumEntityFeature.FAN_SPEED + | VacuumEntityFeature.LOCATE + | VacuumEntityFeature.PAUSE + | VacuumEntityFeature.RETURN_HOME + | VacuumEntityFeature.SEND_COMMAND + | VacuumEntityFeature.START + | VacuumEntityFeature.STATE + | VacuumEntityFeature.STOP + # | VacuumEntityFeature.MAP + ) + robovac_features = ( + # RoboVacEntityFeature.CLEANING_TIME + # | RoboVacEntityFeature.CLEANING_AREA + RoboVacEntityFeature.DO_NOT_DISTURB + # | RoboVacEntityFeature.AUTO_RETURN + # | RoboVacEntityFeature.ROOM + # | RoboVacEntityFeature.ZONE + | RoboVacEntityFeature.BOOST_IQ + # | RoboVacEntityFeature.MAP + # | RoboVacEntityFeature.CONSUMABLES + ) + commands = { + RobovacCommand.MODE: { # works (Start Auto and Return dock commands tested) + "code": 152, + "values": ["AggN", "AA==", "AggG", "BBoCCAE=", "AggO"], + }, + RobovacCommand.STATUS: { # works (status only) + "code": 153, + "values": [ + "BgoAEAUyAA===", + "BgoAEAVSAA===", + "CAoAEAUyAggB", + "CAoCCAEQBTIA", + "CAoCCAEQBVIA", + "CgoCCAEQBTICCAE=", + "CAoCCAIQBTIA", + "CAoCCAIQBVIA", + "CgoCCAIQBTICCAE=", + "BAoAEAY=", + "BBAHQgA=", + "BBADGgA=", + "BhADGgIIAQ==", + "AA==", + "AhAB", + ], + }, + RobovacCommand.DIRECTION: { # untested + "code": 155, + "values": ["Brake", "Forward", "Back", "Left", "Right"], + }, + RobovacCommand.START_PAUSE: 156, # True, False #works (status only) + RobovacCommand.DO_NOT_DISTURB: 157, # DgoAEgoKABICCBYaAggI #untested + RobovacCommand.FAN_SPEED: { # works (status and update) + "code": 158, + "values": ["Quiet", "Standard", "Turbo", "Max"], + }, + RobovacCommand.BOOST_IQ: 159, # True, False #works (status and update) + RobovacCommand.LOCATE: 160, # True, False #works (status) + # Speaker volume: 161 #works, not yet implemented + RobovacCommand.BATTERY: 163, # int #works (status) + RobovacCommand.CONSUMABLES: 168, # encrypted, not usable + RobovacCommand.RETURN_HOME: 173, # encrypted, not usable + # FgoQMggKAggBEgIQAToECgIIARICCAE= + # FgoQMg4KAggBEggIARj/////DxICCAE= + # FAoQMggKAggBEgIQAToECgIIARIA + # GAoQMggKAggBEgIQAToECgIIARIECAE4AQ== + # GgoQMggKAggBEgIQAToECgIIARIGCAEYATgB + RobovacCommand.ERROR: 177, # #encrypted, few known values + # SIDEBRUSH_STUCK: "FAjwudWorOPszgEaAqURUgQSAqUR" + # ROBOT_STUCK: "FAj+nMu7zuPszgEaAtg2UgQSAtg2" + # IQofCgIIAhICCAIaAggCKgIIAjoCCBugAe7Pqs6M1+zOAQ== + # IQofCgIIAhICCAIaAggCKgIIAjoCCBqgAYPx0a331uzOAQ== + # IQofCgIIBBICCAQaAggEKgIIBDoCCCmgAcSfs6Lo5uzOAQ== + # These commands need codes adding + # RobovacCommand.CLEANING_AREA: 0, + # RobovacCommand.CLEANING_TIME: 0, + # RobovacCommand.AUTO_RETURN: 0, + # Unknown: 151 (true/false) + # Unknown: 154 + # DgoKCgAaAggBIgIIARIA + # DAoICgAaAggBIgASAA== + # Unknown: 164 + # MBoAIiwKBgi4y/q0BhIECAEQARoMCAESBBgJIB4aAgg+Kg4aDBIKCgIIARIAGgAiAA== + # NAgGEAYaACIsCgYIuMv6tAYSBAgBEAEaDAgBEgQYCSAeGgIIPioOGgwSCgoCCAESABoAIgA= + # Unknown: 167 + # FAoAEgcIiEoQbhgEGgcI1EgQbBgC + # FgoCEAESBwiIShBuGAQaBwjUSBBsGAI= + # GAoECDwQARIHCIhKEG4YBBoHCNRIEGwYAg== + # GQoFCLQBEAQSBwiIShBuGAQaBwjUSBBsGAI= + # GwoFCKApEDgSCAiocxCmARgFGggI9HEQpAEYAw== + # Unknown: 171 + # AhAB + # Unknown: 176 + # MQoAGgBSCBoAIgIIASoAWDJiHwodChFBIG5ldHdvcmsgZm9yIHlvdRABGgYQ4/7/tAY= + # LwoAGgBSCBoAIgIIASoAWFZiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEPvagrUG + # LwoAGgBSCBoAIgIIASoAWCJiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEK2YgLUG + # LwoAGgBSCBoAIgIIASoAWDBiHQobChFBIG5ldHdvcmsgZm9yIHlvdRoGEK2YgLUG + # Unknown: 178 + # DQjRidjfv9bszgESAR8= + # DQiMrPbd+eLszgESAVU= + # DQiW0dXL+uLszgESAR8= + # Cgiv6NbWsePszgE= + # DQjPuorb6eTszgESAR8= + # DQjayd7nsOXszgESASg= + # Unknown: 179 + # EBIOKgwIBRACGAEgwYyAtQY= + # FhIUEhIIBRABIFsowYyAtQYw74yAtQY= + # DhIMKgoIBhgCIPvagrUG + # DhIMKgoIBxgCIJLbgrUG + # EBIOKgwIBxADGAIg3eyCtQY= + # EBIOKgwIBxAEGAIgrPGCtQY= + # DhIMKgoICBgCILHxgrUG + # DhIMKgoICBADIIj6grUG + # DhIMKgoICBADIOqMg7UG + # DhIMKgoICBAEIOuMg7UG + # DBIKKggICSCljYO1Bg== + # DhIMKgoICRACIJmcg7UG + # FhIUEhIICRABIBoomZyDtQYw6pyDtQY= + # DhIMIgoICRABGO+cg7UG + # DhIMIgoICRABGLedg7UG + # IRIfCh0ICRgBMPvagrUGOMmdg7UGQKApSDhQO1gBYAdqAA== + # Unknown: 169 + # cwoSZXVmeSBDbGVhbiBMNjAgU0VTGhFDODpGRTowRjo3Nzo5NDo5QyIGMS4zLjI0KAVCKDM2NGFjOGNkNjQzZjllMDczZjg4NzlmNGFhOTdkZGE5OGUzMjg5NTRiFggBEgQIAhABGgQIAhABIgIIASoCCAE= + # s \x12eufy Clean L60 SES\x1a\x11C8:FE:0F:77:94:9C"\x061.3.24(\x05B(364ac8cd643f9e073f8879f4aa97dda98e328954b\x16\x08\x01\x12\x04\x08\x02\x10\x01\x1a\x04\x08\x02\x10\x01"\x02\x08\x01*\x02\x08\x01 + } diff --git a/custom_components/robovac/vacuums/__init__.py b/custom_components/robovac/vacuums/__init__.py index db64709..bbfd56f 100644 --- a/custom_components/robovac/vacuums/__init__.py +++ b/custom_components/robovac/vacuums/__init__.py @@ -1,3 +1,4 @@ +from .T1250 import T1250 from .T2103 import T2103 from .T2117 import T2117 from .T2118 import T2118 @@ -7,37 +8,36 @@ from .T2128 import T2128 from .T2130 import T2130 from .T2132 import T2132 -from .T1250 import T1250 +from .T2150 import T2150 +from .T2181 import T2181 +from .T2182 import T2182 +from .T2190 import T2190 +from .T2192 import T2192 +from .T2193 import T2193 +from .T2194 import T2194 from .T2250 import T2250 from .T2251 import T2251 from .T2252 import T2252 from .T2253 import T2253 from .T2254 import T2254 -from .T2150 import T2150 from .T2255 import T2255 from .T2256 import T2256 from .T2257 import T2257 from .T2258 import T2258 from .T2259 import T2259 +from .T2261 import T2261 +from .T2262 import T2262 +from .T2266 import T2266 +from .T2267 import T2267 from .T2270 import T2270 from .T2272 import T2272 from .T2273 import T2273 -from .T2181 import T2181 -from .T2182 import T2182 -from .T2190 import T2190 -from .T2192 import T2192 -from .T2193 import T2193 -from .T2194 import T2194 -from .T2267 import T2267 +from .T2275 import T2275 +from .T2276 import T2276 from .T2277 import T2277 from .T2278 import T2278 -from .T2261 import T2261 -from .T2262 import T2262 from .T2320 import T2320 from .T2351 import T2351 -from .T2275 import T2275 -from .T2276 import T2276 - ROBOVAC_MODELS = { "T2103": T2103, @@ -75,8 +75,9 @@ "T2278": T2278, "T2261": T2261, "T2262": T2262, + "T2266": T2266, "T2320": T2320, "T2351": T2351, "T2275": T2275, "T2276": T2276, -} \ No newline at end of file +}