Просмотр исходного кода

Revert removal of "auto" protocol version.

Subdevice commit removed the possibity to set "auto" as protocol
version.  This is not friendly to end users, who should not be
expected to know the internal details of their device, or to do the
trial and error to find the correct protocol themselves.

Likely a change is needed to set the correct protocol on parent
devices when the protocol is changed, and that is the change that
should be made to fix the issue, not removal of the feature like this.

Partial revert of PR #651
Jason Rumney 2 лет назад
Родитель
Сommit
195c197a73

+ 3 - 3
custom_components/tuya_local/config_flow.py

@@ -67,7 +67,7 @@ class ConfigFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
                     vol.Required(
                         CONF_PROTOCOL_VERSION,
                         **proto_opts,
-                    ): vol.In(API_PROTOCOL_VERSIONS),
+                    ): vol.In(["auto"] + API_PROTOCOL_VERSIONS),
                     vol.Required(CONF_POLL_ONLY, **polling_opts): bool,
                     vol.Optional(CONF_DEVICE_CID, **devcid_opts): str,
                 }
@@ -169,8 +169,8 @@ class OptionsFlowHandler(config_entries.OptionsFlow):
             vol.Required(CONF_HOST, default=config.get(CONF_HOST, "")): str,
             vol.Required(
                 CONF_PROTOCOL_VERSION,
-                default=config.get(CONF_PROTOCOL_VERSION, 3.3),
-            ): vol.In(API_PROTOCOL_VERSIONS),
+                default=config.get(CONF_PROTOCOL_VERSION, "auto"),
+            ): vol.In(["auto"] + API_PROTOCOL_VERSIONS),
             vol.Required(
                 CONF_POLL_ONLY, default=config.get(CONF_POLL_ONLY, False)
             ): bool,

+ 4 - 8
custom_components/tuya_local/device.py

@@ -71,14 +71,10 @@ class TuyaLocalDevice(object):
                 self._api = tinytuya.Device(
                     dev_id,
                     cid=dev_cid,
-                    parent=tinytuya.Device(
-                        dev_id, address, local_key, version=protocol_version
-                    ),
+                    parent=tinytuya.Device(dev_id, address, local_key),
                 )
             else:
-                self._api = tinytuya.Device(
-                    dev_id, address, local_key, version=protocol_version
-                )
+                self._api = tinytuya.Device(dev_id, address, local_key)
             self.dev_cid = dev_cid
         except Exception as e:
             _LOGGER.error(
@@ -121,7 +117,7 @@ class TuyaLocalDevice(object):
     @property
     def unique_id(self):
         """Return the unique id for this device (the dev_id or dev_cid)."""
-        return self.dev_cid if self.dev_cid is not None else self._api.id
+        return self.dev_cid or self._api.id
 
     @property
     def device_info(self):
@@ -594,7 +590,7 @@ def setup_device(hass: HomeAssistant, config: dict):
         config[CONF_HOST],
         config[CONF_LOCAL_KEY],
         config[CONF_PROTOCOL_VERSION],
-        config[CONF_DEVICE_CID] if CONF_DEVICE_CID in config else None,
+        config.get(CONF_DEVICE_CID),
         hass,
         config[CONF_POLL_ONLY],
     )

+ 2 - 2
custom_components/tuya_local/translations/en.json

@@ -9,7 +9,7 @@
                     "host": "IP address or hostname",
                     "device_id": "Device ID (uuid)",
                     "local_key": "Local key",
-                    "protocol_version": "Protocol version",
+                    "protocol_version": "Protocol version (try auto if not known)",
                     "poll_only": "Poll only (try this if your device does not work fully)",
                     "device_cid": "Sub device ID (for devices connected via gateway)"
                 }
@@ -45,7 +45,7 @@
                 "data": {
                     "host": "IP address or hostname",
                     "local_key": "Local key",
-                    "protocol_version": "Protocol version",
+                    "protocol_version": "Protocol version (try auto if not known)",
                     "poll_only": "Poll only (try this if your device does not work fully)",
                     "device_cid": "Sub device ID (for devices connected via gateway)"
                 }

+ 10 - 10
tests/test_config_flow.py

@@ -58,7 +58,7 @@ async def test_init_entry(hass):
             CONF_HOST: "hostname",
             CONF_LOCAL_KEY: "localkey",
             CONF_POLL_ONLY: False,
-            CONF_PROTOCOL_VERSION: 3.3,
+            CONF_PROTOCOL_VERSION: "auto",
             CONF_TYPE: "kogan_kahtp_heater",
             CONF_DEVICE_CID: None,
         },
@@ -260,7 +260,7 @@ async def test_async_test_connection_valid(mock_device, hass):
             CONF_DEVICE_ID: "deviceid",
             CONF_LOCAL_KEY: "localkey",
             CONF_HOST: "hostname",
-            CONF_PROTOCOL_VERSION: 3.3,
+            CONF_PROTOCOL_VERSION: "auto",
         },
         hass,
     )
@@ -281,7 +281,7 @@ async def test_async_test_connection_invalid(mock_device, hass):
             CONF_DEVICE_ID: "deviceid",
             CONF_LOCAL_KEY: "localkey",
             CONF_HOST: "hostname",
-            CONF_PROTOCOL_VERSION: 3.3,
+            CONF_PROTOCOL_VERSION: "auto",
         },
         hass,
     )
@@ -300,7 +300,7 @@ async def test_flow_user_init_invalid_config(mock_test, hass):
             CONF_DEVICE_ID: "deviceid",
             CONF_HOST: "hostname",
             CONF_LOCAL_KEY: "badkey",
-            CONF_PROTOCOL_VERSION: 3.3,
+            CONF_PROTOCOL_VERSION: "auto",
             CONF_POLL_ONLY: False,
         },
     )
@@ -446,7 +446,7 @@ async def test_flow_choose_entities_creates_config_entry(hass, bypass_setup):
             CONF_LOCAL_KEY: "localkey",
             CONF_HOST: "hostname",
             CONF_POLL_ONLY: False,
-            CONF_PROTOCOL_VERSION: 3.5,
+            CONF_PROTOCOL_VERSION: "auto",
             CONF_TYPE: "kogan_kahtp_heater",
             CONF_DEVICE_CID: None,
         },
@@ -476,7 +476,7 @@ async def test_flow_choose_entities_creates_config_entry(hass, bypass_setup):
                 CONF_HOST: "hostname",
                 CONF_LOCAL_KEY: "localkey",
                 CONF_POLL_ONLY: False,
-                CONF_PROTOCOL_VERSION: 3.5,
+                CONF_PROTOCOL_VERSION: "auto",
                 CONF_TYPE: "kogan_kahtp_heater",
                 CONF_DEVICE_CID: None,
             },
@@ -497,7 +497,7 @@ async def test_options_flow_init(hass):
             CONF_LOCAL_KEY: "localkey",
             CONF_NAME: "test",
             CONF_POLL_ONLY: False,
-            CONF_PROTOCOL_VERSION: 3.4,
+            CONF_PROTOCOL_VERSION: "auto",
             CONF_TYPE: "smartplugv1",
             CONF_DEVICE_CID: "",
         },
@@ -536,7 +536,7 @@ async def test_options_flow_modifies_config(mock_test, hass):
             CONF_LOCAL_KEY: "localkey",
             CONF_NAME: "test",
             CONF_POLL_ONLY: False,
-            CONF_PROTOCOL_VERSION: 3.3,
+            CONF_PROTOCOL_VERSION: "auto",
             CONF_TYPE: "kogan_kahtp_heater",
             CONF_DEVICE_CID: "subdeviceid",
         },
@@ -586,7 +586,7 @@ async def test_options_flow_fails_when_connection_fails(mock_test, hass):
             CONF_LOCAL_KEY: "localkey",
             CONF_NAME: "test",
             CONF_POLL_ONLY: False,
-            CONF_PROTOCOL_VERSION: 3.5,
+            CONF_PROTOCOL_VERSION: "auto",
             CONF_TYPE: "smartplugv1",
             CONF_DEVICE_CID: "",
         },
@@ -626,7 +626,7 @@ async def test_options_flow_fails_when_config_is_missing(mock_test, hass):
             CONF_LOCAL_KEY: "localkey",
             CONF_NAME: "test",
             CONF_POLL_ONLY: False,
-            CONF_PROTOCOL_VERSION: 3.4,
+            CONF_PROTOCOL_VERSION: "auto",
             CONF_TYPE: "non_existing",
         },
     )

+ 2 - 2
tests/test_device.py

@@ -48,7 +48,7 @@ class TestDevice(IsolatedAsyncioTestCase):
             "some_dev_id",
             "some.ip.address",
             "some_local_key",
-            3.5,
+            "auto",
             None,
             self.hass(),
         )
@@ -59,7 +59,7 @@ class TestDevice(IsolatedAsyncioTestCase):
 
     def test_configures_tinytuya_correctly(self):
         self.mock_api.assert_called_once_with(
-            "some_dev_id", "some.ip.address", "some_local_key", version=3.5
+            "some_dev_id", "some.ip.address", "some_local_key"
         )
         self.assertIs(self.subject._api, self.mock_api())