diff --git a/custom_components/localtuya/__init__.py b/custom_components/localtuya/__init__.py index 9a996c31f..78a944307 100644 --- a/custom_components/localtuya/__init__.py +++ b/custom_components/localtuya/__init__.py @@ -167,7 +167,7 @@ async def _async_reconnect(now): _handle_reload, ) - hass.helpers.service.async_register_admin_service( + hass.services.async_register( DOMAIN, SERVICE_SET_DP, _handle_set_dp, schema=SERVICE_SET_DP_SCHEMA ) @@ -255,8 +255,9 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): res = await tuya_api.async_get_access_token() if res != "ok": _LOGGER.error("Cloud API connection failed: %s", res) - _LOGGER.info("Cloud API connection succeeded.") - res = await tuya_api.async_get_devices_list() + else: + _LOGGER.info("Cloud API connection succeeded.") + res = await tuya_api.async_get_devices_list() hass.data[DOMAIN][DATA_CLOUD] = tuya_api async def setup_entities(device_ids): diff --git a/custom_components/localtuya/cloud_api.py b/custom_components/localtuya/cloud_api.py index 680217187..a0c512850 100644 --- a/custom_components/localtuya/cloud_api.py +++ b/custom_components/localtuya/cloud_api.py @@ -101,7 +101,10 @@ async def async_make_request(self, method, url, body=None, headers={}): async def async_get_access_token(self): """Obtain a valid access token.""" - resp = await self.async_make_request("GET", "/v1.0/token?grant_type=1") + try: + resp = await self.async_make_request("GET", "/v1.0/token?grant_type=1") + except requests.exceptions.ConnectionError: + return "Request failed, status ConnectionError" if not resp.ok: return "Request failed, status " + str(resp.status) diff --git a/custom_components/localtuya/discovery.py b/custom_components/localtuya/discovery.py index d18e376f2..0c93ab798 100644 --- a/custom_components/localtuya/discovery.py +++ b/custom_components/localtuya/discovery.py @@ -43,10 +43,10 @@ async def start(self): """Start discovery by listening to broadcasts.""" loop = asyncio.get_running_loop() listener = loop.create_datagram_endpoint( - lambda: self, local_addr=("0.0.0.0", 6666) + lambda: self, local_addr=("0.0.0.0", 6666), reuse_port=True ) encrypted_listener = loop.create_datagram_endpoint( - lambda: self, local_addr=("0.0.0.0", 6667) + lambda: self, local_addr=("0.0.0.0", 6667), reuse_port=True ) self._listeners = await asyncio.gather(listener, encrypted_listener) diff --git a/custom_components/localtuya/pytuya/__init__.py b/custom_components/localtuya/pytuya/__init__.py index bcc8bbed5..67aabb246 100644 --- a/custom_components/localtuya/pytuya/__init__.py +++ b/custom_components/localtuya/pytuya/__init__.py @@ -817,7 +817,7 @@ async def update_dps(self, dps=None): Args: dps([int]): list of dps to update, default=detected&whitelisted """ - if self.version in [3.2, 3.3]: # 3.2 behaves like 3.3 with type_0d + if self.version in [3.2, 3.3, 3.4]: # 3.2 behaves like 3.3 with type_0d if dps is None: if not self.dps_cache: await self.detect_available_dps() diff --git a/custom_components/localtuya/strings.json b/custom_components/localtuya/strings.json index 25d09fe6b..32f604002 100644 --- a/custom_components/localtuya/strings.json +++ b/custom_components/localtuya/strings.json @@ -23,7 +23,7 @@ }, "power_outlet": { "title": "Add subswitch", - "description": "You are about to add subswitch number `{number}`. If you want to add another, tick `Add another switch` before continuing.", + "description": "You are about to add subswitch number `{number}`. If you want to add another, tick `Add another switch` before continuing.", "data": { "id": "ID", "name": "Name", @@ -101,10 +101,10 @@ "fan_speed_min": "minimum fan speed integer", "fan_speed_max": "maximum fan speed integer", "fan_speed_ordered_list": "Fan speed modes list (overrides speed min/max)", - "fan_direction":"fan direction dps", + "fan_direction": "fan direction dps", "fan_direction_forward": "forward dps string", "fan_direction_reverse": "reverse dps string", - "fan_dps_type": "DP value type", + "fan_dps_type": "DP value type", "current_temperature_dp": "Current Temperature", "target_temperature_dp": "Target Temperature", "temperature_step": "Temperature Step (optional)", @@ -136,4 +136,4 @@ } }, "title": "LocalTuya" -} +} \ No newline at end of file diff --git a/custom_components/localtuya/translations/en.json b/custom_components/localtuya/translations/en.json index b9beee47f..cc289eea2 100644 --- a/custom_components/localtuya/translations/en.json +++ b/custom_components/localtuya/translations/en.json @@ -167,7 +167,7 @@ "fan_speed_min": "minimum fan speed integer", "fan_speed_max": "maximum fan speed integer", "fan_speed_ordered_list": "Fan speed modes list (overrides speed min/max)", - "fan_direction":"fan direction dps", + "fan_direction": "fan direction dps", "fan_direction_forward": "forward dps string", "fan_direction_reverse": "reverse dps string", "fan_dps_type": "DP value type", @@ -198,5 +198,29 @@ } } }, + "services": { + "reload": { + "name": "Reload", + "description": "Reload localtuya and reconnect to all devices." + }, + "set_dp": { + "name": "Set datapoint", + "description": "Change the value of a datapoint (DP)", + "fields": { + "device_id": { + "name": "Device ID", + "description": "Device ID of device to change datapoint value for" + }, + "dp": { + "name": "DP", + "description": "Datapoint index" + }, + "value": { + "name": "Value", + "description": "New value to set" + } + } + } + }, "title": "LocalTuya" -} +} \ No newline at end of file diff --git a/custom_components/localtuya/translations/it.json b/custom_components/localtuya/translations/it.json index 9b05309e2..264bb97fe 100644 --- a/custom_components/localtuya/translations/it.json +++ b/custom_components/localtuya/translations/it.json @@ -188,5 +188,29 @@ } } }, + "services": { + "reload": { + "name": "Reload", + "description": "Reload localtuya and reconnect to all devices." + }, + "set_dp": { + "name": "Set datapoint", + "description": "Change the value of a datapoint (DP)", + "fields": { + "device_id": { + "name": "Device ID", + "description": "Device ID of device to change datapoint value for" + }, + "dp": { + "name": "DP", + "description": "Datapoint index" + }, + "value": { + "name": "Value", + "description": "New value to set" + } + } + } + }, "title": "LocalTuya" } diff --git a/custom_components/localtuya/translations/pt-BR.json b/custom_components/localtuya/translations/pt-BR.json index ca5629c13..74884ee6f 100644 --- a/custom_components/localtuya/translations/pt-BR.json +++ b/custom_components/localtuya/translations/pt-BR.json @@ -188,5 +188,29 @@ } } }, + "services": { + "reload": { + "name": "Reload", + "description": "Reload localtuya and reconnect to all devices." + }, + "set_dp": { + "name": "Set datapoint", + "description": "Change the value of a datapoint (DP)", + "fields": { + "device_id": { + "name": "Device ID", + "description": "Device ID of device to change datapoint value for" + }, + "dp": { + "name": "DP", + "description": "Datapoint index" + }, + "value": { + "name": "Value", + "description": "New value to set" + } + } + } + }, "title": "LocalTuya" } diff --git a/pyproject.toml b/pyproject.toml index cf08c0176..ed410fb0f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [tool.black] -target-version = ["py38", "py39"] +target-version = ["py311"] include = 'custom_components/localtuya/.*\.py' # pylint config stolen from Home Assistant diff --git a/setup.cfg b/setup.cfg index c4dd99f36..43cf7f1d0 100644 --- a/setup.cfg +++ b/setup.cfg @@ -4,7 +4,7 @@ max-line-length = 120 ignore = E203, W503 [mypy] -python_version = 3.9 +python_version = 3.11 ignore_errors = true follow_imports = silent ignore_missing_imports = true diff --git a/tox.ini b/tox.ini index a0b7eacf7..ca71c2671 100644 --- a/tox.ini +++ b/tox.ini @@ -1,12 +1,12 @@ [tox] skipsdist = true -envlist = py{38,39}, lint, typing +envlist = py{311}, lint, typing skip_missing_interpreters = True cs_exclude_words = hass,unvalid [gh-actions] python = - 3.9: clean, py39, lint, typing + 3.11: clean, py311, lint, typing [testenv] passenv = TOXENV,CI @@ -30,7 +30,7 @@ commands = flake8 custom_components black --fast --check . pydocstyle -v custom_components - pylint custom_components/localtuya --rcfile=pylint.rc +# pylint custom_components/localtuya --rcfile=pylint.rc [testenv:typing] commands =