From a24b2fbc500dffe248945d92d7a8891110d42061 Mon Sep 17 00:00:00 2001 From: Luke Bonaccorsi Date: Wed, 6 Mar 2024 12:46:56 +0000 Subject: [PATCH] feat: add better DPS handling --- custom_components/robovac/robovac.py | 166 +++----------- 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, 1826 insertions(+), 208 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) ) + self.model_details = ROBOVAC_MODELS[model_code] + super().__init__(self.model_details, *args, **kwargs) + 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 - - return supportedFeatures + return self.model_details.homeassistant_features def getRoboVacFeatures(self): - supportedFeatures = ROBOVAC_SERIES_FEATURES[self.getRoboVacSeries()] - - if self.model_code in HAS_MAP_FEATURE: - supportedFeatures |= RoboVacEntityFeature.MAP - - if self.model_code in HAS_CONSUMABLES: - supportedFeatures |= RoboVacEntityFeature.CONSUMABLES - - return supportedFeatures - - def getRoboVacSeries(self): - for series, models in ROBOVAC_SERIES.items(): - if self.model_code in models: - return series + return self.model_details.robovac_features def getFanSpeeds(self): - return ROBOVAC_SERIES_FAN_SPEEDS[self.getRoboVacSeries()] + return self.model_details.commands[RobovacCommand.FAN_SPEED].values + + def getModes(self): + 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: + if isinstance(value, dict): + command_codes[key] = value.code + else: + command_codes[key] = value + + 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.ciphers import Cipher, algorithms, modes 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 @@ class TuyaDevice: ): """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 @@ class TuyaDevice: 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 @@ class TuyaDevice: 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 enum import IntEnum, StrEnum from homeassistant.loader import bind_hass from homeassistant.components.vacuum import ( StateVacuumEntity, - VacuumEntityFeature, STATE_CLEANING, STATE_DOCKED, STATE_ERROR, @@ -55,15 +54,15 @@ from homeassistant.const import ( 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 @@ SCAN_INTERVAL = timedelta(seconds=REFRESH_RATE) 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 @@ class RoboVacEntity(StateVacuumEntity): 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 @@ class RoboVacEntity(StateVacuumEntity): 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] ) - if ( - "consumable" in consumables - and "duration" in consumables["consumable"] - ): - self._attr_consumables = consumables["consumable"]["duration"] + ).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"] + ) + ) + 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 @@ class RoboVacEntity(StateVacuumEntity): 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 +);