Merge branch 'master' into master
This commit is contained in:
@@ -255,8 +255,9 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry):
|
|||||||
res = await tuya_api.async_get_access_token()
|
res = await tuya_api.async_get_access_token()
|
||||||
if res != "ok":
|
if res != "ok":
|
||||||
_LOGGER.error("Cloud API connection failed: %s", res)
|
_LOGGER.error("Cloud API connection failed: %s", res)
|
||||||
_LOGGER.info("Cloud API connection succeeded.")
|
else:
|
||||||
res = await tuya_api.async_get_devices_list()
|
_LOGGER.info("Cloud API connection succeeded.")
|
||||||
|
res = await tuya_api.async_get_devices_list()
|
||||||
hass.data[DOMAIN][DATA_CLOUD] = tuya_api
|
hass.data[DOMAIN][DATA_CLOUD] = tuya_api
|
||||||
|
|
||||||
async def setup_entities(device_ids):
|
async def setup_entities(device_ids):
|
||||||
|
@@ -101,7 +101,10 @@ class TuyaCloudApi:
|
|||||||
|
|
||||||
async def async_get_access_token(self):
|
async def async_get_access_token(self):
|
||||||
"""Obtain a valid access token."""
|
"""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:
|
if not resp.ok:
|
||||||
return "Request failed, status " + str(resp.status)
|
return "Request failed, status " + str(resp.status)
|
||||||
|
@@ -43,10 +43,10 @@ class TuyaDiscovery(asyncio.DatagramProtocol):
|
|||||||
"""Start discovery by listening to broadcasts."""
|
"""Start discovery by listening to broadcasts."""
|
||||||
loop = asyncio.get_running_loop()
|
loop = asyncio.get_running_loop()
|
||||||
listener = loop.create_datagram_endpoint(
|
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(
|
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)
|
self._listeners = await asyncio.gather(listener, encrypted_listener)
|
||||||
|
@@ -817,7 +817,7 @@ class TuyaProtocol(asyncio.Protocol, ContextualLogger):
|
|||||||
Args:
|
Args:
|
||||||
dps([int]): list of dps to update, default=detected&whitelisted
|
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 dps is None:
|
||||||
if not self.dps_cache:
|
if not self.dps_cache:
|
||||||
await self.detect_available_dps()
|
await self.detect_available_dps()
|
||||||
|
@@ -23,7 +23,7 @@
|
|||||||
},
|
},
|
||||||
"power_outlet": {
|
"power_outlet": {
|
||||||
"title": "Add subswitch",
|
"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": {
|
"data": {
|
||||||
"id": "ID",
|
"id": "ID",
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
@@ -101,10 +101,10 @@
|
|||||||
"fan_speed_min": "minimum fan speed integer",
|
"fan_speed_min": "minimum fan speed integer",
|
||||||
"fan_speed_max": "maximum fan speed integer",
|
"fan_speed_max": "maximum fan speed integer",
|
||||||
"fan_speed_ordered_list": "Fan speed modes list (overrides speed min/max)",
|
"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_forward": "forward dps string",
|
||||||
"fan_direction_reverse": "reverse 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",
|
"current_temperature_dp": "Current Temperature",
|
||||||
"target_temperature_dp": "Target Temperature",
|
"target_temperature_dp": "Target Temperature",
|
||||||
"temperature_step": "Temperature Step (optional)",
|
"temperature_step": "Temperature Step (optional)",
|
||||||
|
@@ -167,7 +167,7 @@
|
|||||||
"fan_speed_min": "minimum fan speed integer",
|
"fan_speed_min": "minimum fan speed integer",
|
||||||
"fan_speed_max": "maximum fan speed integer",
|
"fan_speed_max": "maximum fan speed integer",
|
||||||
"fan_speed_ordered_list": "Fan speed modes list (overrides speed min/max)",
|
"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_forward": "forward dps string",
|
||||||
"fan_direction_reverse": "reverse dps string",
|
"fan_direction_reverse": "reverse dps string",
|
||||||
"fan_dps_type": "DP value type",
|
"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"
|
"title": "LocalTuya"
|
||||||
}
|
}
|
@@ -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"
|
"title": "LocalTuya"
|
||||||
}
|
}
|
||||||
|
@@ -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"
|
"title": "LocalTuya"
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
[tool.black]
|
[tool.black]
|
||||||
target-version = ["py38", "py39"]
|
target-version = ["py311"]
|
||||||
include = 'custom_components/localtuya/.*\.py'
|
include = 'custom_components/localtuya/.*\.py'
|
||||||
|
|
||||||
# pylint config stolen from Home Assistant
|
# pylint config stolen from Home Assistant
|
||||||
|
@@ -4,7 +4,7 @@ max-line-length = 120
|
|||||||
ignore = E203, W503
|
ignore = E203, W503
|
||||||
|
|
||||||
[mypy]
|
[mypy]
|
||||||
python_version = 3.9
|
python_version = 3.11
|
||||||
ignore_errors = true
|
ignore_errors = true
|
||||||
follow_imports = silent
|
follow_imports = silent
|
||||||
ignore_missing_imports = true
|
ignore_missing_imports = true
|
||||||
|
6
tox.ini
6
tox.ini
@@ -1,12 +1,12 @@
|
|||||||
[tox]
|
[tox]
|
||||||
skipsdist = true
|
skipsdist = true
|
||||||
envlist = py{38,39}, lint, typing
|
envlist = py{311}, lint, typing
|
||||||
skip_missing_interpreters = True
|
skip_missing_interpreters = True
|
||||||
cs_exclude_words = hass,unvalid
|
cs_exclude_words = hass,unvalid
|
||||||
|
|
||||||
[gh-actions]
|
[gh-actions]
|
||||||
python =
|
python =
|
||||||
3.9: clean, py39, lint, typing
|
3.11: clean, py311, lint, typing
|
||||||
|
|
||||||
[testenv]
|
[testenv]
|
||||||
passenv = TOXENV,CI
|
passenv = TOXENV,CI
|
||||||
@@ -30,7 +30,7 @@ commands =
|
|||||||
flake8 custom_components
|
flake8 custom_components
|
||||||
black --fast --check .
|
black --fast --check .
|
||||||
pydocstyle -v custom_components
|
pydocstyle -v custom_components
|
||||||
pylint custom_components/localtuya --rcfile=pylint.rc
|
# pylint custom_components/localtuya --rcfile=pylint.rc
|
||||||
|
|
||||||
[testenv:typing]
|
[testenv:typing]
|
||||||
commands =
|
commands =
|
||||||
|
Reference in New Issue
Block a user