From bab68a1d3845a3f77e4e3c55a473d50e1b0c76ba Mon Sep 17 00:00:00 2001 From: rikman122 Date: Fri, 11 Jun 2021 16:10:47 +0200 Subject: [PATCH 01/14] first approach --- custom_components/localtuya/const.py | 14 +- .../localtuya/translations/en.json | 20 ++ custom_components/localtuya/vacuum.py | 218 ++++++++++++++++++ 3 files changed, 251 insertions(+), 1 deletion(-) create mode 100644 custom_components/localtuya/vacuum.py diff --git a/custom_components/localtuya/const.py b/custom_components/localtuya/const.py index bd8a5d3ab..ff21ff986 100644 --- a/custom_components/localtuya/const.py +++ b/custom_components/localtuya/const.py @@ -41,11 +41,23 @@ # sensor CONF_SCALING = "scaling" +# vacuum +CONF_IDLE_STATUS_VALUE = "idle_status_value" +CONF_RETURNING_STATUS_VALUE = "returning_status_value" +CONF_DOCKED_STATUS_VALUE = "docked_status_value" +CONF_BATTERY_DP = "battery_dp" +CONF_MODE_DP = "mode_dp" +CONF_MODES = "modes" +CONF_FAN_SPEED_DP = "fan_speed_dp" +CONF_FAN_SPEEDS = "fan_speeds" +CONF_CLEAN_TIME_DP = "clean_time_dp" +CONF_CLEAN_AREA_DP = "clean_area_dp" + DATA_DISCOVERY = "discovery" DOMAIN = "localtuya" # Platforms in this list must support config flows -PLATFORMS = ["binary_sensor", "cover", "fan", "light", "sensor", "switch"] +PLATFORMS = ["binary_sensor", "cover", "fan", "light", "sensor", "switch", "vacuum"] TUYA_DEVICE = "tuya_device" diff --git a/custom_components/localtuya/translations/en.json b/custom_components/localtuya/translations/en.json index 6ce233a41..027d8be34 100644 --- a/custom_components/localtuya/translations/en.json +++ b/custom_components/localtuya/translations/en.json @@ -60,6 +60,16 @@ "scaling": "Scaling Factor", "state_on": "On Value", "state_off": "Off Value", + "idle_status_value": "Idle Status (comma-separated)", + "returning_status_value": "Returning Status", + "docked_status_value": "Docked Status (comma-separated)", + "battery_dp": "Battery status DP (Usually 14)", + "mode_dp": "Mode DP (Usually 27)", + "modes": "Modes list [start,pause/stop,return home,others...]", + "fan_speed_dp": "Fan speeds DP (Usually 30)", + "fan_speeds": "Fan speeds list (comma-separated)", + "clean_time_dp": "Clean Time DP (Usually 33)", + "clean_area_dp": "Clean Area DP (Usually 32)", "brightness": "Brightness (only for white color)", "brightness_lower": "Brightness Lower Value", "brightness_upper": "Brightness Upper Value", @@ -112,6 +122,16 @@ "scaling": "Scaling Factor", "state_on": "On Value", "state_off": "Off Value", + "idle_status_value": "Idle Status (comma-separated)", + "returning_status_value": "Returning Status", + "docked_status_value": "Docked Status (comma-separated)", + "battery_dp": "Battery status DP (Usually 14)", + "mode_dp": "Mode DP (Usually 27)", + "modes": "Modes list [start,pause/stop,return home,others...]", + "fan_speed_dp": "Fan speeds DP (Usually 30)", + "fan_speeds": "Fan speeds list (comma-separated)", + "clean_time_dp": "Clean Time DP (Usually 33)", + "clean_area_dp": "Clean Area DP (Usually 32)", "brightness": "Brightness (only for white color)", "brightness_lower": "Brightness Lower Value", "brightness_upper": "Brightness Upper Value", diff --git a/custom_components/localtuya/vacuum.py b/custom_components/localtuya/vacuum.py new file mode 100644 index 000000000..4a5c9b5c0 --- /dev/null +++ b/custom_components/localtuya/vacuum.py @@ -0,0 +1,218 @@ +"""Platform to locally control Tuya-based vacuum devices.""" +import logging +from functools import partial + +import voluptuous as vol +from homeassistant.components.vacuum import ( + DOMAIN, + STATE_CLEANING, + STATE_DOCKED, + STATE_IDLE, + STATE_RETURNING, + SUPPORT_BATTERY, + SUPPORT_FAN_SPEED, + SUPPORT_PAUSE, + SUPPORT_RETURN_HOME, + SUPPORT_START, + SUPPORT_STATE, + SUPPORT_STATUS, + SUPPORT_STOP, + StateVacuumEntity, +) + +from .common import LocalTuyaEntity, async_setup_entry + +from .const import ( + CONF_IDLE_STATUS_VALUE, + CONF_RETURNING_STATUS_VALUE, + CONF_DOCKED_STATUS_VALUE, + CONF_BATTERY_DP, + CONF_MODE_DP, + CONF_MODES, + CONF_FAN_SPEED_DP, + CONF_FAN_SPEEDS, + CONF_CLEAN_TIME_DP, + CONF_CLEAN_AREA_DP +) + +_LOGGER = logging.getLogger(__name__) + +CLEAN_TIME = "clean_time" +CLEAN_AREA = "clean_area" +MODES_LIST = "cleaning_mode_list" +MODE = "cleaning_mode" + +DEFAULT_IDLE_STATUS = "standby,sleep" +DEFAULT_RETURNING_STATUS = "docking" +DEFAULT_DOCKED_STATUS = "charging,chargecompleted" +DEFAULT_MODES = "smart,standby,chargego,wall_follow,spiral,single" +DEFAULT_FAN_SPEEDS = "low,normal,high" + +def flow_schema(dps): + """Return schema used in config flow.""" + return { + vol.Required(CONF_IDLE_STATUS_VALUE, default=DEFAULT_IDLE_STATUS): str, + vol.Required(CONF_DOCKED_STATUS_VALUE, default=DEFAULT_DOCKED_STATUS): str, + vol.Optional(CONF_RETURNING_STATUS_VALUE, default=DEFAULT_RETURNING_STATUS): str, + vol.Optional(CONF_BATTERY_DP): vol.In(dps), + vol.Optional(CONF_MODE_DP): vol.In(dps), + vol.Optional(CONF_MODES, default=DEFAULT_MODES): str, + vol.Optional(CONF_FAN_SPEED_DP): vol.In(dps), + vol.Optional(CONF_FAN_SPEEDS, default=DEFAULT_FAN_SPEEDS): str, + vol.Optional(CONF_CLEAN_TIME_DP): vol.In(dps), + vol.Optional(CONF_CLEAN_AREA_DP): vol.In(dps), + } + + +class LocaltuyaVacuum(LocalTuyaEntity, StateVacuumEntity): + """Tuya vacuum device.""" + + def __init__(self, device, config_entry, switchid, **kwargs): + """Initialize a new LocaltuyaVacuum.""" + super().__init__(device, config_entry, switchid ,_LOGGER, **kwargs) + self._state = None + self._battery_level = None + self._attrs = {} + + self._idle_status_list = [] + if self.has_config(CONF_IDLE_STATUS_VALUE): + self._idle_status_list = self._config[CONF_IDLE_STATUS_VALUE].split(",") + + self._modes_list = [] + if self.has_config(CONF_MODES): + self._modes_list = self._config[CONF_MODES].split(",") + self._attrs[MODES_LIST] = self._modes_list + if len(self._modes_list) >= 3: + self._start_mode = self._modes_list[0] + self._pause_mode = self._modes_list[1] + self._return_mode = self._modes_list[2] + + self._docked_status_list = [] + if self.has_config(CONF_DOCKED_STATUS_VALUE): + self._docked_status_list = self._config[CONF_DOCKED_STATUS_VALUE].split(",") + + self._fan_speed_list = [] + if self.has_config(CONF_FAN_SPEEDS): + self._fan_speed_list = self._config[CONF_FAN_SPEEDS].split(",") + + self._fan_speed = "" + self._cleaning_mode = "" + + print("Initialized vacuum [{}]".format(self.name)) + + @property + def supported_features(self): + """Flag supported features.""" + supported_features = SUPPORT_START | SUPPORT_PAUSE | SUPPORT_STOP | SUPPORT_STATUS | SUPPORT_STATE + + if self.has_config(CONF_RETURNING_STATUS_VALUE): + supported_features = supported_features | SUPPORT_RETURN_HOME + if self.has_config(CONF_FAN_SPEED_DP): + supported_features = supported_features | SUPPORT_FAN_SPEED + if self.has_config(CONF_BATTERY_DP): + supported_features = supported_features | SUPPORT_BATTERY + + return supported_features + + @property + def state(self): + """Return the vacuum state.""" + return self._state + + @property + def battery_level(self): + """Return the current battery level.""" + return self._battery_level + + @property + def device_state_attributes(self): + """Return the specific state attributes of this vacuum cleaner.""" + return self._attrs + + @property + def fan_speed(self): + """Return the current fan speed.""" + return self._fan_speed + + @property + def fan_speed_list(self) -> list: + """Return the list of available fan speeds.""" + return self._fan_speed_list + + @property + def error(self): + """Return error message.""" + return "" + + async def async_start(self, **kwargs): + """Turn the vacuum on and start cleaning.""" + await self._device.set_dp(self._start_mode, self._config[CONF_MODE_DP]) + + async def async_pause(self, **kwargs): + """Stop the vacuum cleaner, do not return to base.""" + if self._pause_mode: + await self._device.set_dp(self._pause_mode, self._config[CONF_MODE_DP]) + else: + _LOGGER.error("Missing command for pause in commands set.") + + async def async_return_to_base(self, **kwargs): + """Set the vacuum cleaner to return to the dock.""" + if self._return_mode: + await self._device.set_dp(self._return_mode, self._config[CONF_MODE_DP]) + else: + _LOGGER.error("Missing command for pause in commands set.") + + async def async_stop(self, **kwargs): + """Turn the vacuum off stopping the cleaning and returning home.""" + self.async_pause() + + async def async_clean_spot(self, **kwargs): + """Perform a spot clean-up.""" + return None + + async def async_locate(self, **kwargs): + """Locate the vacuum cleaner.""" + return None + + async def async_set_fan_speed(self, **kwargs): + """Set the fan speed.""" + fan_speed = kwargs["fan_speed"] + await self._device.set_dp(fan_speed, self._config[CONF_FAN_SPEED_DP]) + + async def async_send_command(self, command, params=None, **kwargs): + """Send a command to a vacuum cleaner.""" + if command == "set_mode" and 'mode' in params: + mode = params['mode'] + await self._device.set_dp(mode, self._config[CONF_MODE_DP]) + + def status_updated(self): + """Device status was updated.""" + state_value = str(self.dps(self._dp_id)) + if state_value in self._idle_status_list: + self._state = STATE_IDLE + elif state_value in self._docked_status_list: + self._state = STATE_DOCKED + elif state_value == self._config[CONF_RETURNING_STATUS_VALUE]: + self._state = STATE_RETURNING + else: + self._state = STATE_CLEANING + + if self.has_config(CONF_BATTERY_DP): + self._battery_level = self.dps_conf(CONF_BATTERY_DP) + + self._cleaning_mode = "" + if self.has_config(CONF_MODES): + self._cleaning_mode = self.dps_conf(CONF_MODE_DP) + self._attrs[MODE] = self._cleaning_mode + + self._fan_speed = "" + if self.has_config(CONF_FAN_SPEEDS): + self._fan_speed = self.dps_conf(CONF_FAN_SPEED_DP) + + if self.has_config(CONF_CLEAN_TIME_DP): + self._attrs[CLEAN_TIME] = self.dps_conf(CONF_CLEAN_TIME_DP) + + if self.has_config(CONF_CLEAN_AREA_DP): + self._attrs[CLEAN_AREA] = self.dps_conf(CONF_CLEAN_AREA_DP) + +async_setup_entry = partial(async_setup_entry, DOMAIN, LocaltuyaVacuum, flow_schema) \ No newline at end of file From 1f98b6533b264bfcb0628209b3da6ab0f4545e3b Mon Sep 17 00:00:00 2001 From: rikman122 Date: Fri, 11 Jun 2021 16:20:03 +0200 Subject: [PATCH 02/14] added sample YAML --- custom_components/localtuya/__init__.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/custom_components/localtuya/__init__.py b/custom_components/localtuya/__init__.py index 0b762f2af..c1d77ed1a 100644 --- a/custom_components/localtuya/__init__.py +++ b/custom_components/localtuya/__init__.py @@ -53,6 +53,20 @@ current: 18 # Optional current_consumption: 19 # Optional voltage: 20 # Optional + + - platform: vacuum + friendly_name: Vacuum + id: 28 + idle_status_value: "standby,sleep" + returning_status_value: "docking" + docked_status_value: "charging,chargecompleted" + battery_dp: 14 + mode_dp: 27 + modes: "smart,standby,chargego,wall_follow,spiral,single" + fan_speed_dp: 30 + fan_speeds: "low,normal,high" + clean_time_dp: 33 + clean_area_dp: 32 """ import asyncio import logging From 3e78b0b9ba10a3c478d9b1f6f8e70b0faef919fb Mon Sep 17 00:00:00 2001 From: rikman122 Date: Sat, 12 Jun 2021 12:55:24 +0200 Subject: [PATCH 03/14] added Power control DP --- custom_components/localtuya/const.py | 1 + .../localtuya/translations/en.json | 6 +++-- custom_components/localtuya/vacuum.py | 25 +++++++++---------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/custom_components/localtuya/const.py b/custom_components/localtuya/const.py index ff21ff986..f8446091d 100644 --- a/custom_components/localtuya/const.py +++ b/custom_components/localtuya/const.py @@ -42,6 +42,7 @@ CONF_SCALING = "scaling" # vacuum +CONF_POWERGO_DP = "powergo_dp" CONF_IDLE_STATUS_VALUE = "idle_status_value" CONF_RETURNING_STATUS_VALUE = "returning_status_value" CONF_DOCKED_STATUS_VALUE = "docked_status_value" diff --git a/custom_components/localtuya/translations/en.json b/custom_components/localtuya/translations/en.json index 027d8be34..d1f9b24a2 100644 --- a/custom_components/localtuya/translations/en.json +++ b/custom_components/localtuya/translations/en.json @@ -60,12 +60,13 @@ "scaling": "Scaling Factor", "state_on": "On Value", "state_off": "Off Value", + "powergo_dp": "Power DP (Usually 25 or 2)", "idle_status_value": "Idle Status (comma-separated)", "returning_status_value": "Returning Status", "docked_status_value": "Docked Status (comma-separated)", "battery_dp": "Battery status DP (Usually 14)", "mode_dp": "Mode DP (Usually 27)", - "modes": "Modes list [start,pause/stop,return home,others...]", + "modes": "Modes list in this order: return home,others...", "fan_speed_dp": "Fan speeds DP (Usually 30)", "fan_speeds": "Fan speeds list (comma-separated)", "clean_time_dp": "Clean Time DP (Usually 33)", @@ -122,12 +123,13 @@ "scaling": "Scaling Factor", "state_on": "On Value", "state_off": "Off Value", + "powergo_dp": "Power DP (Usually 25 or 2)", "idle_status_value": "Idle Status (comma-separated)", "returning_status_value": "Returning Status", "docked_status_value": "Docked Status (comma-separated)", "battery_dp": "Battery status DP (Usually 14)", "mode_dp": "Mode DP (Usually 27)", - "modes": "Modes list [start,pause/stop,return home,others...]", + "modes": "Modes list in this order: return home,others...", "fan_speed_dp": "Fan speeds DP (Usually 30)", "fan_speeds": "Fan speeds list (comma-separated)", "clean_time_dp": "Clean Time DP (Usually 33)", diff --git a/custom_components/localtuya/vacuum.py b/custom_components/localtuya/vacuum.py index 4a5c9b5c0..94021c04c 100644 --- a/custom_components/localtuya/vacuum.py +++ b/custom_components/localtuya/vacuum.py @@ -23,6 +23,7 @@ from .common import LocalTuyaEntity, async_setup_entry from .const import ( + CONF_POWERGO_DP, CONF_IDLE_STATUS_VALUE, CONF_RETURNING_STATUS_VALUE, CONF_DOCKED_STATUS_VALUE, @@ -42,16 +43,17 @@ MODES_LIST = "cleaning_mode_list" MODE = "cleaning_mode" -DEFAULT_IDLE_STATUS = "standby,sleep" +DEFAULT_IDLE_STATUS = "standby,sleep,pause" DEFAULT_RETURNING_STATUS = "docking" DEFAULT_DOCKED_STATUS = "charging,chargecompleted" -DEFAULT_MODES = "smart,standby,chargego,wall_follow,spiral,single" +DEFAULT_MODES = "chargego,smart,standby,wall_follow,spiral,single" DEFAULT_FAN_SPEEDS = "low,normal,high" def flow_schema(dps): """Return schema used in config flow.""" return { vol.Required(CONF_IDLE_STATUS_VALUE, default=DEFAULT_IDLE_STATUS): str, + vol.Required(CONF_POWERGO_DP): vol.In(dps), vol.Required(CONF_DOCKED_STATUS_VALUE, default=DEFAULT_DOCKED_STATUS): str, vol.Optional(CONF_RETURNING_STATUS_VALUE, default=DEFAULT_RETURNING_STATUS): str, vol.Optional(CONF_BATTERY_DP): vol.In(dps), @@ -82,10 +84,7 @@ def __init__(self, device, config_entry, switchid, **kwargs): if self.has_config(CONF_MODES): self._modes_list = self._config[CONF_MODES].split(",") self._attrs[MODES_LIST] = self._modes_list - if len(self._modes_list) >= 3: - self._start_mode = self._modes_list[0] - self._pause_mode = self._modes_list[1] - self._return_mode = self._modes_list[2] + self._return_mode = self._modes_list[0] self._docked_status_list = [] if self.has_config(CONF_DOCKED_STATUS_VALUE): @@ -146,25 +145,25 @@ def error(self): async def async_start(self, **kwargs): """Turn the vacuum on and start cleaning.""" - await self._device.set_dp(self._start_mode, self._config[CONF_MODE_DP]) + await self._device.set_dp(True, self._config[CONF_POWERGO_DP]) async def async_pause(self, **kwargs): """Stop the vacuum cleaner, do not return to base.""" - if self._pause_mode: - await self._device.set_dp(self._pause_mode, self._config[CONF_MODE_DP]) - else: - _LOGGER.error("Missing command for pause in commands set.") + await self._device.set_dp(False, self._config[CONF_POWERGO_DP]) async def async_return_to_base(self, **kwargs): """Set the vacuum cleaner to return to the dock.""" if self._return_mode: await self._device.set_dp(self._return_mode, self._config[CONF_MODE_DP]) else: - _LOGGER.error("Missing command for pause in commands set.") + _LOGGER.error("Missing command for return home in commands set.") async def async_stop(self, **kwargs): """Turn the vacuum off stopping the cleaning and returning home.""" - self.async_pause() + if self._return_mode: + await self._device.set_dp(self._return_mode, self._config[CONF_MODE_DP]) + else: + _LOGGER.error("Missing command for return home in commands set.") async def async_clean_spot(self, **kwargs): """Perform a spot clean-up.""" From f374dd4f4aedca94a0243d625c4a0055d6dda6b7 Mon Sep 17 00:00:00 2001 From: Taras Nychko Date: Mon, 14 Jun 2021 23:25:21 +0100 Subject: [PATCH 04/14] Add support for paused state --- custom_components/localtuya/const.py | 1 + custom_components/localtuya/translations/en.json | 2 ++ custom_components/localtuya/vacuum.py | 9 ++++++++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/custom_components/localtuya/const.py b/custom_components/localtuya/const.py index f8446091d..76739dc86 100644 --- a/custom_components/localtuya/const.py +++ b/custom_components/localtuya/const.py @@ -53,6 +53,7 @@ CONF_FAN_SPEEDS = "fan_speeds" CONF_CLEAN_TIME_DP = "clean_time_dp" CONF_CLEAN_AREA_DP = "clean_area_dp" +CONF_PAUSED_STATE = "paused_state" DATA_DISCOVERY = "discovery" diff --git a/custom_components/localtuya/translations/en.json b/custom_components/localtuya/translations/en.json index d1f9b24a2..724c2c481 100644 --- a/custom_components/localtuya/translations/en.json +++ b/custom_components/localtuya/translations/en.json @@ -71,6 +71,7 @@ "fan_speeds": "Fan speeds list (comma-separated)", "clean_time_dp": "Clean Time DP (Usually 33)", "clean_area_dp": "Clean Area DP (Usually 32)", + "paused_state": "Pause state (pause, paused, etc)", "brightness": "Brightness (only for white color)", "brightness_lower": "Brightness Lower Value", "brightness_upper": "Brightness Upper Value", @@ -134,6 +135,7 @@ "fan_speeds": "Fan speeds list (comma-separated)", "clean_time_dp": "Clean Time DP (Usually 33)", "clean_area_dp": "Clean Area DP (Usually 32)", + "paused_state": "Pause state (pause, paused, etc)", "brightness": "Brightness (only for white color)", "brightness_lower": "Brightness Lower Value", "brightness_upper": "Brightness Upper Value", diff --git a/custom_components/localtuya/vacuum.py b/custom_components/localtuya/vacuum.py index 94021c04c..de91d1457 100644 --- a/custom_components/localtuya/vacuum.py +++ b/custom_components/localtuya/vacuum.py @@ -9,6 +9,7 @@ STATE_DOCKED, STATE_IDLE, STATE_RETURNING, + STATE_PAUSED, SUPPORT_BATTERY, SUPPORT_FAN_SPEED, SUPPORT_PAUSE, @@ -17,6 +18,7 @@ SUPPORT_STATE, SUPPORT_STATUS, SUPPORT_STOP, + SUPPORT_PAUSE, StateVacuumEntity, ) @@ -33,7 +35,8 @@ CONF_FAN_SPEED_DP, CONF_FAN_SPEEDS, CONF_CLEAN_TIME_DP, - CONF_CLEAN_AREA_DP + CONF_CLEAN_AREA_DP, + CONF_PAUSED_STATE, ) _LOGGER = logging.getLogger(__name__) @@ -48,6 +51,7 @@ DEFAULT_DOCKED_STATUS = "charging,chargecompleted" DEFAULT_MODES = "chargego,smart,standby,wall_follow,spiral,single" DEFAULT_FAN_SPEEDS = "low,normal,high" +DEFAULT_PAUSED_STATE = "paused" def flow_schema(dps): """Return schema used in config flow.""" @@ -63,6 +67,7 @@ def flow_schema(dps): vol.Optional(CONF_FAN_SPEEDS, default=DEFAULT_FAN_SPEEDS): str, vol.Optional(CONF_CLEAN_TIME_DP): vol.In(dps), vol.Optional(CONF_CLEAN_AREA_DP): vol.In(dps), + vol.Optional(CONF_PAUSED_STATE, default=DEFAULT_PAUSED_STATE): str, } @@ -193,6 +198,8 @@ def status_updated(self): self._state = STATE_DOCKED elif state_value == self._config[CONF_RETURNING_STATUS_VALUE]: self._state = STATE_RETURNING + elif state_value == self._config[CONF_PAUSED_STATE]: + self._state = STATE_PAUSED else: self._state = STATE_CLEANING From 77380992cbc09a3ca15b1b732f299e4e4165d631 Mon Sep 17 00:00:00 2001 From: rikman122 Date: Thu, 17 Jun 2021 09:45:29 +0200 Subject: [PATCH 05/14] separate real modes from status modes --- custom_components/localtuya/const.py | 1 + .../localtuya/translations/en.json | 6 ++++-- custom_components/localtuya/vacuum.py | 18 ++++++++++-------- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/custom_components/localtuya/const.py b/custom_components/localtuya/const.py index 76739dc86..c803baa8e 100644 --- a/custom_components/localtuya/const.py +++ b/custom_components/localtuya/const.py @@ -54,6 +54,7 @@ CONF_CLEAN_TIME_DP = "clean_time_dp" CONF_CLEAN_AREA_DP = "clean_area_dp" CONF_PAUSED_STATE = "paused_state" +CONF_RETURN_MODE = "return_mode" DATA_DISCOVERY = "discovery" diff --git a/custom_components/localtuya/translations/en.json b/custom_components/localtuya/translations/en.json index 724c2c481..439280360 100644 --- a/custom_components/localtuya/translations/en.json +++ b/custom_components/localtuya/translations/en.json @@ -66,7 +66,8 @@ "docked_status_value": "Docked Status (comma-separated)", "battery_dp": "Battery status DP (Usually 14)", "mode_dp": "Mode DP (Usually 27)", - "modes": "Modes list in this order: return home,others...", + "modes": "Modes list", + "return_mode": "Return home mode", "fan_speed_dp": "Fan speeds DP (Usually 30)", "fan_speeds": "Fan speeds list (comma-separated)", "clean_time_dp": "Clean Time DP (Usually 33)", @@ -130,7 +131,8 @@ "docked_status_value": "Docked Status (comma-separated)", "battery_dp": "Battery status DP (Usually 14)", "mode_dp": "Mode DP (Usually 27)", - "modes": "Modes list in this order: return home,others...", + "modes": "Modes list", + "return_mode": "Return home mode", "fan_speed_dp": "Fan speeds DP (Usually 30)", "fan_speeds": "Fan speeds list (comma-separated)", "clean_time_dp": "Clean Time DP (Usually 33)", diff --git a/custom_components/localtuya/vacuum.py b/custom_components/localtuya/vacuum.py index de91d1457..094e0f5e2 100644 --- a/custom_components/localtuya/vacuum.py +++ b/custom_components/localtuya/vacuum.py @@ -37,6 +37,7 @@ CONF_CLEAN_TIME_DP, CONF_CLEAN_AREA_DP, CONF_PAUSED_STATE, + CONF_RETURN_MODE, ) _LOGGER = logging.getLogger(__name__) @@ -46,12 +47,13 @@ MODES_LIST = "cleaning_mode_list" MODE = "cleaning_mode" -DEFAULT_IDLE_STATUS = "standby,sleep,pause" +DEFAULT_IDLE_STATUS = "standby,sleep" DEFAULT_RETURNING_STATUS = "docking" DEFAULT_DOCKED_STATUS = "charging,chargecompleted" -DEFAULT_MODES = "chargego,smart,standby,wall_follow,spiral,single" +DEFAULT_MODES = "smart,wall_follow,spiral,single" DEFAULT_FAN_SPEEDS = "low,normal,high" DEFAULT_PAUSED_STATE = "paused" +DEFAULT_RETURN_MODE = "chargego" def flow_schema(dps): """Return schema used in config flow.""" @@ -63,6 +65,7 @@ def flow_schema(dps): vol.Optional(CONF_BATTERY_DP): vol.In(dps), vol.Optional(CONF_MODE_DP): vol.In(dps), vol.Optional(CONF_MODES, default=DEFAULT_MODES): str, + vol.Optional(CONF_RETURN_MODE, default=DEFAULT_RETURN_MODE): str, vol.Optional(CONF_FAN_SPEED_DP): vol.In(dps), vol.Optional(CONF_FAN_SPEEDS, default=DEFAULT_FAN_SPEEDS): str, vol.Optional(CONF_CLEAN_TIME_DP): vol.In(dps), @@ -89,7 +92,6 @@ def __init__(self, device, config_entry, switchid, **kwargs): if self.has_config(CONF_MODES): self._modes_list = self._config[CONF_MODES].split(",") self._attrs[MODES_LIST] = self._modes_list - self._return_mode = self._modes_list[0] self._docked_status_list = [] if self.has_config(CONF_DOCKED_STATUS_VALUE): @@ -109,7 +111,7 @@ def supported_features(self): """Flag supported features.""" supported_features = SUPPORT_START | SUPPORT_PAUSE | SUPPORT_STOP | SUPPORT_STATUS | SUPPORT_STATE - if self.has_config(CONF_RETURNING_STATUS_VALUE): + if self.has_config(CONF_RETURN_MODE): supported_features = supported_features | SUPPORT_RETURN_HOME if self.has_config(CONF_FAN_SPEED_DP): supported_features = supported_features | SUPPORT_FAN_SPEED @@ -158,15 +160,15 @@ async def async_pause(self, **kwargs): async def async_return_to_base(self, **kwargs): """Set the vacuum cleaner to return to the dock.""" - if self._return_mode: - await self._device.set_dp(self._return_mode, self._config[CONF_MODE_DP]) + if self.has_config(CONF_RETURN_MODE): + await self._device.set_dp(self._config[CONF_RETURN_MODE], self._config[CONF_MODE_DP]) else: _LOGGER.error("Missing command for return home in commands set.") async def async_stop(self, **kwargs): """Turn the vacuum off stopping the cleaning and returning home.""" - if self._return_mode: - await self._device.set_dp(self._return_mode, self._config[CONF_MODE_DP]) + if self.has_config(CONF_RETURN_MODE): + await self._device.set_dp(self._config[CONF_RETURN_MODE], self._config[CONF_MODE_DP]) else: _LOGGER.error("Missing command for return home in commands set.") From 0f3ad66849b58f30e29aaa4e378c6732d16d36eb Mon Sep 17 00:00:00 2001 From: rikman122 Date: Thu, 17 Jun 2021 11:46:07 +0200 Subject: [PATCH 06/14] add stop and locate commands --- custom_components/localtuya/const.py | 2 ++ .../localtuya/translations/en.json | 4 ++++ custom_components/localtuya/vacuum.py | 19 ++++++++++++++----- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/custom_components/localtuya/const.py b/custom_components/localtuya/const.py index c803baa8e..80dc4d625 100644 --- a/custom_components/localtuya/const.py +++ b/custom_components/localtuya/const.py @@ -53,8 +53,10 @@ CONF_FAN_SPEEDS = "fan_speeds" CONF_CLEAN_TIME_DP = "clean_time_dp" CONF_CLEAN_AREA_DP = "clean_area_dp" +CONF_LOCATE_DP = "locate_dp" CONF_PAUSED_STATE = "paused_state" CONF_RETURN_MODE = "return_mode" +CONF_STOP_STATUS = "stop_status" DATA_DISCOVERY = "discovery" diff --git a/custom_components/localtuya/translations/en.json b/custom_components/localtuya/translations/en.json index 439280360..e268d4d34 100644 --- a/custom_components/localtuya/translations/en.json +++ b/custom_components/localtuya/translations/en.json @@ -72,7 +72,9 @@ "fan_speeds": "Fan speeds list (comma-separated)", "clean_time_dp": "Clean Time DP (Usually 33)", "clean_area_dp": "Clean Area DP (Usually 32)", + "locate_dp": "Locate DP (Usually 31)", "paused_state": "Pause state (pause, paused, etc)", + "stop_status": "Stop status", "brightness": "Brightness (only for white color)", "brightness_lower": "Brightness Lower Value", "brightness_upper": "Brightness Upper Value", @@ -137,7 +139,9 @@ "fan_speeds": "Fan speeds list (comma-separated)", "clean_time_dp": "Clean Time DP (Usually 33)", "clean_area_dp": "Clean Area DP (Usually 32)", + "locate_dp": "Locate DP (Usually 31)", "paused_state": "Pause state (pause, paused, etc)", + "stop_status": "Stop status", "brightness": "Brightness (only for white color)", "brightness_lower": "Brightness Lower Value", "brightness_upper": "Brightness Upper Value", diff --git a/custom_components/localtuya/vacuum.py b/custom_components/localtuya/vacuum.py index 094e0f5e2..7e11f8d02 100644 --- a/custom_components/localtuya/vacuum.py +++ b/custom_components/localtuya/vacuum.py @@ -19,6 +19,7 @@ SUPPORT_STATUS, SUPPORT_STOP, SUPPORT_PAUSE, + SUPPORT_LOCATE, StateVacuumEntity, ) @@ -36,8 +37,10 @@ CONF_FAN_SPEEDS, CONF_CLEAN_TIME_DP, CONF_CLEAN_AREA_DP, + CONF_LOCATE_DP, CONF_PAUSED_STATE, CONF_RETURN_MODE, + CONF_STOP_STATUS, ) _LOGGER = logging.getLogger(__name__) @@ -54,6 +57,7 @@ DEFAULT_FAN_SPEEDS = "low,normal,high" DEFAULT_PAUSED_STATE = "paused" DEFAULT_RETURN_MODE = "chargego" +DEFAULT_STOP_STATUS = "standby" def flow_schema(dps): """Return schema used in config flow.""" @@ -70,7 +74,9 @@ def flow_schema(dps): vol.Optional(CONF_FAN_SPEEDS, default=DEFAULT_FAN_SPEEDS): str, vol.Optional(CONF_CLEAN_TIME_DP): vol.In(dps), vol.Optional(CONF_CLEAN_AREA_DP): vol.In(dps), + vol.Optional(CONF_LOCATE_DP): vol.In(dps), vol.Optional(CONF_PAUSED_STATE, default=DEFAULT_PAUSED_STATE): str, + vol.Optional(CONF_STOP_STATUS, default=DEFAULT_STOP_STATUS): str, } @@ -117,6 +123,8 @@ def supported_features(self): supported_features = supported_features | SUPPORT_FAN_SPEED if self.has_config(CONF_BATTERY_DP): supported_features = supported_features | SUPPORT_BATTERY + if self.has_config(CONF_LOCATE_DP): + supported_features = supported_features | SUPPORT_LOCATE return supported_features @@ -166,11 +174,11 @@ async def async_return_to_base(self, **kwargs): _LOGGER.error("Missing command for return home in commands set.") async def async_stop(self, **kwargs): - """Turn the vacuum off stopping the cleaning and returning home.""" - if self.has_config(CONF_RETURN_MODE): - await self._device.set_dp(self._config[CONF_RETURN_MODE], self._config[CONF_MODE_DP]) + """Turn the vacuum off stopping the cleaning""" + if self.has_config(CONF_STOP_STATUS): + await self._device.set_dp(self._config[CONF_STOP_STATUS], self._config[CONF_MODE_DP]) else: - _LOGGER.error("Missing command for return home in commands set.") + _LOGGER.error("Missing command for stop in commands set.") async def async_clean_spot(self, **kwargs): """Perform a spot clean-up.""" @@ -178,7 +186,8 @@ async def async_clean_spot(self, **kwargs): async def async_locate(self, **kwargs): """Locate the vacuum cleaner.""" - return None + if self.has_config(CONF_LOCATE_DP): + await self._device.set_dp('', self._config[CONF_LOCATE_DP]) async def async_set_fan_speed(self, **kwargs): """Set the fan speed.""" From ca0183306113696bd302c7360e5ea4dd6f04e3ee Mon Sep 17 00:00:00 2001 From: rikman122 Date: Mon, 8 Nov 2021 20:35:46 +0100 Subject: [PATCH 07/14] lint test fixes --- custom_components/localtuya/__init__.py | 2 +- custom_components/localtuya/vacuum.py | 49 ++++++++++++------------- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/custom_components/localtuya/__init__.py b/custom_components/localtuya/__init__.py index c1d77ed1a..ad879b0fb 100644 --- a/custom_components/localtuya/__init__.py +++ b/custom_components/localtuya/__init__.py @@ -53,7 +53,7 @@ current: 18 # Optional current_consumption: 19 # Optional voltage: 20 # Optional - + - platform: vacuum friendly_name: Vacuum id: 28 diff --git a/custom_components/localtuya/vacuum.py b/custom_components/localtuya/vacuum.py index 7e11f8d02..5b365a607 100644 --- a/custom_components/localtuya/vacuum.py +++ b/custom_components/localtuya/vacuum.py @@ -18,7 +18,6 @@ SUPPORT_STATE, SUPPORT_STATUS, SUPPORT_STOP, - SUPPORT_PAUSE, SUPPORT_LOCATE, StateVacuumEntity, ) @@ -45,10 +44,10 @@ _LOGGER = logging.getLogger(__name__) -CLEAN_TIME = "clean_time" -CLEAN_AREA = "clean_area" -MODES_LIST = "cleaning_mode_list" -MODE = "cleaning_mode" +CLEAN_TIME = "clean_time" +CLEAN_AREA = "clean_area" +MODES_LIST = "cleaning_mode_list" +MODE = "cleaning_mode" DEFAULT_IDLE_STATUS = "standby,sleep" DEFAULT_RETURNING_STATUS = "docking" @@ -59,13 +58,15 @@ DEFAULT_RETURN_MODE = "chargego" DEFAULT_STOP_STATUS = "standby" + def flow_schema(dps): """Return schema used in config flow.""" return { vol.Required(CONF_IDLE_STATUS_VALUE, default=DEFAULT_IDLE_STATUS): str, vol.Required(CONF_POWERGO_DP): vol.In(dps), vol.Required(CONF_DOCKED_STATUS_VALUE, default=DEFAULT_DOCKED_STATUS): str, - vol.Optional(CONF_RETURNING_STATUS_VALUE, default=DEFAULT_RETURNING_STATUS): str, + vol.Optional(CONF_RETURNING_STATUS_VALUE, + default=DEFAULT_RETURNING_STATUS): str, vol.Optional(CONF_BATTERY_DP): vol.In(dps), vol.Optional(CONF_MODE_DP): vol.In(dps), vol.Optional(CONF_MODES, default=DEFAULT_MODES): str, @@ -85,7 +86,7 @@ class LocaltuyaVacuum(LocalTuyaEntity, StateVacuumEntity): def __init__(self, device, config_entry, switchid, **kwargs): """Initialize a new LocaltuyaVacuum.""" - super().__init__(device, config_entry, switchid ,_LOGGER, **kwargs) + super().__init__(device, config_entry, switchid , _LOGGER, **kwargs) self._state = None self._battery_level = None self._attrs = {} @@ -98,7 +99,7 @@ def __init__(self, device, config_entry, switchid, **kwargs): if self.has_config(CONF_MODES): self._modes_list = self._config[CONF_MODES].split(",") self._attrs[MODES_LIST] = self._modes_list - + self._docked_status_list = [] if self.has_config(CONF_DOCKED_STATUS_VALUE): self._docked_status_list = self._config[CONF_DOCKED_STATUS_VALUE].split(",") @@ -115,7 +116,8 @@ def __init__(self, device, config_entry, switchid, **kwargs): @property def supported_features(self): """Flag supported features.""" - supported_features = SUPPORT_START | SUPPORT_PAUSE | SUPPORT_STOP | SUPPORT_STATUS | SUPPORT_STATE + supported_features = (SUPPORT_START | SUPPORT_PAUSE + | SUPPORT_STOP | SUPPORT_STATUS | SUPPORT_STATE) if self.has_config(CONF_RETURN_MODE): supported_features = supported_features | SUPPORT_RETURN_HOME @@ -153,11 +155,6 @@ def fan_speed_list(self) -> list: """Return the list of available fan speeds.""" return self._fan_speed_list - @property - def error(self): - """Return error message.""" - return "" - async def async_start(self, **kwargs): """Turn the vacuum on and start cleaning.""" await self._device.set_dp(True, self._config[CONF_POWERGO_DP]) @@ -169,14 +166,16 @@ async def async_pause(self, **kwargs): async def async_return_to_base(self, **kwargs): """Set the vacuum cleaner to return to the dock.""" if self.has_config(CONF_RETURN_MODE): - await self._device.set_dp(self._config[CONF_RETURN_MODE], self._config[CONF_MODE_DP]) + await self._device.set_dp(self._config[CONF_RETURN_MODE], + self._config[CONF_MODE_DP]) else: _LOGGER.error("Missing command for return home in commands set.") async def async_stop(self, **kwargs): - """Turn the vacuum off stopping the cleaning""" + """Turn the vacuum off stopping the cleaning.""" if self.has_config(CONF_STOP_STATUS): - await self._device.set_dp(self._config[CONF_STOP_STATUS], self._config[CONF_MODE_DP]) + await self._device.set_dp(self._config[CONF_STOP_STATUS], + self._config[CONF_MODE_DP]) else: _LOGGER.error("Missing command for stop in commands set.") @@ -189,9 +188,8 @@ async def async_locate(self, **kwargs): if self.has_config(CONF_LOCATE_DP): await self._device.set_dp('', self._config[CONF_LOCATE_DP]) - async def async_set_fan_speed(self, **kwargs): + async def async_set_fan_speed(self, fan_speed, **kwargs): """Set the fan speed.""" - fan_speed = kwargs["fan_speed"] await self._device.set_dp(fan_speed, self._config[CONF_FAN_SPEED_DP]) async def async_send_command(self, command, params=None, **kwargs): @@ -216,20 +214,21 @@ def status_updated(self): if self.has_config(CONF_BATTERY_DP): self._battery_level = self.dps_conf(CONF_BATTERY_DP) - + self._cleaning_mode = "" if self.has_config(CONF_MODES): self._cleaning_mode = self.dps_conf(CONF_MODE_DP) self._attrs[MODE] = self._cleaning_mode - + self._fan_speed = "" if self.has_config(CONF_FAN_SPEEDS): self._fan_speed = self.dps_conf(CONF_FAN_SPEED_DP) - + if self.has_config(CONF_CLEAN_TIME_DP): self._attrs[CLEAN_TIME] = self.dps_conf(CONF_CLEAN_TIME_DP) - + if self.has_config(CONF_CLEAN_AREA_DP): self._attrs[CLEAN_AREA] = self.dps_conf(CONF_CLEAN_AREA_DP) - -async_setup_entry = partial(async_setup_entry, DOMAIN, LocaltuyaVacuum, flow_schema) \ No newline at end of file + + +async_setup_entry = partial(async_setup_entry, DOMAIN, LocaltuyaVacuum, flow_schema) From 3d9316b14a2a0eb80e1bf625176d42f648bd0886 Mon Sep 17 00:00:00 2001 From: rikman122 Date: Tue, 23 Nov 2021 16:50:19 +0100 Subject: [PATCH 08/14] style fixes --- custom_components/localtuya/vacuum.py | 32 +++++++++++++++++---------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/custom_components/localtuya/vacuum.py b/custom_components/localtuya/vacuum.py index 5b365a607..cc97e25c2 100644 --- a/custom_components/localtuya/vacuum.py +++ b/custom_components/localtuya/vacuum.py @@ -65,8 +65,9 @@ def flow_schema(dps): vol.Required(CONF_IDLE_STATUS_VALUE, default=DEFAULT_IDLE_STATUS): str, vol.Required(CONF_POWERGO_DP): vol.In(dps), vol.Required(CONF_DOCKED_STATUS_VALUE, default=DEFAULT_DOCKED_STATUS): str, - vol.Optional(CONF_RETURNING_STATUS_VALUE, - default=DEFAULT_RETURNING_STATUS): str, + vol.Optional( + CONF_RETURNING_STATUS_VALUE, default=DEFAULT_RETURNING_STATUS + ): str, vol.Optional(CONF_BATTERY_DP): vol.In(dps), vol.Optional(CONF_MODE_DP): vol.In(dps), vol.Optional(CONF_MODES, default=DEFAULT_MODES): str, @@ -86,7 +87,7 @@ class LocaltuyaVacuum(LocalTuyaEntity, StateVacuumEntity): def __init__(self, device, config_entry, switchid, **kwargs): """Initialize a new LocaltuyaVacuum.""" - super().__init__(device, config_entry, switchid , _LOGGER, **kwargs) + super().__init__(device, config_entry, switchid, _LOGGER, **kwargs) self._state = None self._battery_level = None self._attrs = {} @@ -116,8 +117,13 @@ def __init__(self, device, config_entry, switchid, **kwargs): @property def supported_features(self): """Flag supported features.""" - supported_features = (SUPPORT_START | SUPPORT_PAUSE - | SUPPORT_STOP | SUPPORT_STATUS | SUPPORT_STATE) + supported_features = ( + SUPPORT_START + | SUPPORT_PAUSE + | SUPPORT_STOP + | SUPPORT_STATUS + | SUPPORT_STATE + ) if self.has_config(CONF_RETURN_MODE): supported_features = supported_features | SUPPORT_RETURN_HOME @@ -166,16 +172,18 @@ async def async_pause(self, **kwargs): async def async_return_to_base(self, **kwargs): """Set the vacuum cleaner to return to the dock.""" if self.has_config(CONF_RETURN_MODE): - await self._device.set_dp(self._config[CONF_RETURN_MODE], - self._config[CONF_MODE_DP]) + await self._device.set_dp( + self._config[CONF_RETURN_MODE], self._config[CONF_MODE_DP] + ) else: _LOGGER.error("Missing command for return home in commands set.") async def async_stop(self, **kwargs): """Turn the vacuum off stopping the cleaning.""" if self.has_config(CONF_STOP_STATUS): - await self._device.set_dp(self._config[CONF_STOP_STATUS], - self._config[CONF_MODE_DP]) + await self._device.set_dp( + self._config[CONF_STOP_STATUS], self._config[CONF_MODE_DP] + ) else: _LOGGER.error("Missing command for stop in commands set.") @@ -186,7 +194,7 @@ async def async_clean_spot(self, **kwargs): async def async_locate(self, **kwargs): """Locate the vacuum cleaner.""" if self.has_config(CONF_LOCATE_DP): - await self._device.set_dp('', self._config[CONF_LOCATE_DP]) + await self._device.set_dp("", self._config[CONF_LOCATE_DP]) async def async_set_fan_speed(self, fan_speed, **kwargs): """Set the fan speed.""" @@ -194,8 +202,8 @@ async def async_set_fan_speed(self, fan_speed, **kwargs): async def async_send_command(self, command, params=None, **kwargs): """Send a command to a vacuum cleaner.""" - if command == "set_mode" and 'mode' in params: - mode = params['mode'] + if command == "set_mode" and "mode" in params: + mode = params["mode"] await self._device.set_dp(mode, self._config[CONF_MODE_DP]) def status_updated(self): From 678bf816df2d2bae451d64652d3f72e662e0a8b6 Mon Sep 17 00:00:00 2001 From: Thales Silva Date: Tue, 7 Dec 2021 02:34:07 -0300 Subject: [PATCH 09/14] Update vacuum.py --- custom_components/localtuya/vacuum.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/custom_components/localtuya/vacuum.py b/custom_components/localtuya/vacuum.py index cc97e25c2..b1de91d87 100644 --- a/custom_components/localtuya/vacuum.py +++ b/custom_components/localtuya/vacuum.py @@ -209,6 +209,9 @@ async def async_send_command(self, command, params=None, **kwargs): def status_updated(self): """Device status was updated.""" state_value = str(self.dps(self._dp_id)) + + _LOGGER.info(f"Device {state_value}") + if state_value in self._idle_status_list: self._state = STATE_IDLE elif state_value in self._docked_status_list: From 1a75c2f242e38ebdbe378044fe46e9c3693eded2 Mon Sep 17 00:00:00 2001 From: Thales Silva Date: Wed, 8 Dec 2021 15:00:02 -0300 Subject: [PATCH 10/14] Report fault and fault code. Report cleaning record. --- custom_components/localtuya/vacuum.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/custom_components/localtuya/vacuum.py b/custom_components/localtuya/vacuum.py index b1de91d87..15a1d6b1f 100644 --- a/custom_components/localtuya/vacuum.py +++ b/custom_components/localtuya/vacuum.py @@ -10,6 +10,7 @@ STATE_IDLE, STATE_RETURNING, STATE_PAUSED, + STATE_ERROR, SUPPORT_BATTERY, SUPPORT_FAN_SPEED, SUPPORT_PAUSE, @@ -36,7 +37,9 @@ CONF_FAN_SPEEDS, CONF_CLEAN_TIME_DP, CONF_CLEAN_AREA_DP, + CONF_CLEAN_RECORD_DP, CONF_LOCATE_DP, + CONF_FAULT_DP, CONF_PAUSED_STATE, CONF_RETURN_MODE, CONF_STOP_STATUS, @@ -46,8 +49,10 @@ CLEAN_TIME = "clean_time" CLEAN_AREA = "clean_area" +CLEAN_RECORD = "clean_record" MODES_LIST = "cleaning_mode_list" MODE = "cleaning_mode" +FAULT = "fault" DEFAULT_IDLE_STATUS = "standby,sleep" DEFAULT_RETURNING_STATUS = "docking" @@ -76,7 +81,9 @@ def flow_schema(dps): vol.Optional(CONF_FAN_SPEEDS, default=DEFAULT_FAN_SPEEDS): str, vol.Optional(CONF_CLEAN_TIME_DP): vol.In(dps), vol.Optional(CONF_CLEAN_AREA_DP): vol.In(dps), + vol.Optional(CONF_CLEAN_RECORD_DP): vol.In(dps), vol.Optional(CONF_LOCATE_DP): vol.In(dps), + vol.Optional(CONF_FAULT_DP): vol.In(dps), vol.Optional(CONF_PAUSED_STATE, default=DEFAULT_PAUSED_STATE): str, vol.Optional(CONF_STOP_STATUS, default=DEFAULT_STOP_STATUS): str, } @@ -209,9 +216,7 @@ async def async_send_command(self, command, params=None, **kwargs): def status_updated(self): """Device status was updated.""" state_value = str(self.dps(self._dp_id)) - - _LOGGER.info(f"Device {state_value}") - + if state_value in self._idle_status_list: self._state = STATE_IDLE elif state_value in self._docked_status_list: @@ -241,5 +246,13 @@ def status_updated(self): if self.has_config(CONF_CLEAN_AREA_DP): self._attrs[CLEAN_AREA] = self.dps_conf(CONF_CLEAN_AREA_DP) + if self.has_config(CONF_CLEAN_RECORD_DP): + self._attrs[CLEAN_RECORD] = self.dps_conf(CONF_CLEAN_RECORD_DP) + + if self.has_config(CONF_FAULT_DP): + self._attrs[FAULT] = self.dps_conf(CONF_FAULT_DP) + if self._attrs[FAULT] != 0: + self._state = STATE_ERROR + async_setup_entry = partial(async_setup_entry, DOMAIN, LocaltuyaVacuum, flow_schema) From 52eafcf38345fecf51613843ea0396a9f696cf4e Mon Sep 17 00:00:00 2001 From: Thales Silva Date: Wed, 8 Dec 2021 15:00:35 -0300 Subject: [PATCH 11/14] Report fault and fault code. Cleaning Record. --- custom_components/localtuya/translations/en.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/custom_components/localtuya/translations/en.json b/custom_components/localtuya/translations/en.json index e268d4d34..051327678 100644 --- a/custom_components/localtuya/translations/en.json +++ b/custom_components/localtuya/translations/en.json @@ -64,6 +64,7 @@ "idle_status_value": "Idle Status (comma-separated)", "returning_status_value": "Returning Status", "docked_status_value": "Docked Status (comma-separated)", + "fault_dp": "Fault DP (Usually 11)", "battery_dp": "Battery status DP (Usually 14)", "mode_dp": "Mode DP (Usually 27)", "modes": "Modes list", @@ -72,6 +73,7 @@ "fan_speeds": "Fan speeds list (comma-separated)", "clean_time_dp": "Clean Time DP (Usually 33)", "clean_area_dp": "Clean Area DP (Usually 32)", + "clean_record_dp": "Clean Record DP (Usually 34)", "locate_dp": "Locate DP (Usually 31)", "paused_state": "Pause state (pause, paused, etc)", "stop_status": "Stop status", @@ -131,6 +133,7 @@ "idle_status_value": "Idle Status (comma-separated)", "returning_status_value": "Returning Status", "docked_status_value": "Docked Status (comma-separated)", + "fault_dp": "Fault DP (Usually 11)", "battery_dp": "Battery status DP (Usually 14)", "mode_dp": "Mode DP (Usually 27)", "modes": "Modes list", @@ -139,6 +142,7 @@ "fan_speeds": "Fan speeds list (comma-separated)", "clean_time_dp": "Clean Time DP (Usually 33)", "clean_area_dp": "Clean Area DP (Usually 32)", + "clean_record_dp": "Clean Record DP (Usually 34)", "locate_dp": "Locate DP (Usually 31)", "paused_state": "Pause state (pause, paused, etc)", "stop_status": "Stop status", From a6b3d49853ee1e1851b2945c192776841e18d99a Mon Sep 17 00:00:00 2001 From: Thales Silva Date: Wed, 8 Dec 2021 15:01:03 -0300 Subject: [PATCH 12/14] Report fault and fault code. Cleaning record. --- custom_components/localtuya/const.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/custom_components/localtuya/const.py b/custom_components/localtuya/const.py index 80dc4d625..faf6f3554 100644 --- a/custom_components/localtuya/const.py +++ b/custom_components/localtuya/const.py @@ -53,7 +53,9 @@ CONF_FAN_SPEEDS = "fan_speeds" CONF_CLEAN_TIME_DP = "clean_time_dp" CONF_CLEAN_AREA_DP = "clean_area_dp" +CONF_CLEAN_RECORD_DP = "clean_record_dp" CONF_LOCATE_DP = "locate_dp" +CONF_FAULT_DP = "fault_dp" CONF_PAUSED_STATE = "paused_state" CONF_RETURN_MODE = "return_mode" CONF_STOP_STATUS = "stop_status" From c43240513cc3017ec5525413ffc4a65bfc523786 Mon Sep 17 00:00:00 2001 From: rikman122 Date: Tue, 14 Dec 2021 13:04:55 +0100 Subject: [PATCH 13/14] fix extra_state_attributes warning --- custom_components/localtuya/vacuum.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom_components/localtuya/vacuum.py b/custom_components/localtuya/vacuum.py index 15a1d6b1f..9a1439935 100644 --- a/custom_components/localtuya/vacuum.py +++ b/custom_components/localtuya/vacuum.py @@ -154,7 +154,7 @@ def battery_level(self): return self._battery_level @property - def device_state_attributes(self): + def extra_state_attributes(self): """Return the specific state attributes of this vacuum cleaner.""" return self._attrs From 12bea161a8632dd6d04d32eda33d5f719c9fe7ac Mon Sep 17 00:00:00 2001 From: rikman122 Date: Mon, 24 Jan 2022 10:44:38 +0100 Subject: [PATCH 14/14] lint code style fix --- custom_components/localtuya/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom_components/localtuya/const.py b/custom_components/localtuya/const.py index a1f6c6093..4148771c5 100644 --- a/custom_components/localtuya/const.py +++ b/custom_components/localtuya/const.py @@ -97,7 +97,7 @@ "select", "sensor", "switch", - "vacuum" + "vacuum", ] TUYA_DEVICE = "tuya_device"