Parcourir la source

cloud: use older device specification API call

Since the QueryThingsDataModel API is not working with the QR auth,
try the GetDeviceSpecificationAndAttribute API call instead.

This gives the most important info, but sometimes does not match
the local protocol where enum values differ between cloud and local
representation, and is often missing some diagnostic dps.

Issue #2419
Jason Rumney il y a 1 an
Parent
commit
23487ecc0e

+ 2 - 1
custom_components/tuya_local/cloud.py

@@ -181,7 +181,8 @@ class Cloud:
         )
         response = await self.__hass.async_add_executor_job(
             manager.customer_api.get,
-            f"/v2.0/cloud/thing/{device_id}/model",
+            # f"/v2.0/cloud/things/{device_id}/model",
+            f"/v1.0/iot-03/devices/{device_id}/specification",
         )
         return response
 

+ 13 - 8
custom_components/tuya_local/config_flow.py

@@ -376,15 +376,20 @@ class ConfigFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
                 self.__cloud_device["product_name"],
                 self.__cloud_device["product_id"],
             )
-            self.init_cloud()
-            response = await self.cloud.async_get_datamodel(self.__cloud_device["id"])
-            if response and response["result"] and response["result"]["model"]:
-                model = json.loads(response["result"]["model"])
-
-                _LOGGER.warning(
-                    "QueryThingsDataModel result:\n%s",
-                    json.dumps(model, indent=4),
+            try:
+                self.init_cloud()
+                response = await self.cloud.async_get_datamodel(
+                    self.__cloud_device["id"]
                 )
+                if response and response["result"]:
+                    model = response["result"]
+
+                    _LOGGER.warning(
+                        "Device specficication:\n%s",
+                        json.dumps(model, indent=4),
+                    )
+            except Exception as e:
+                _LOGGER.warning("Unable to fetch data model from cloud: %s", e)
         _LOGGER.warning(
             "Device matches %s with quality of %d%%. DPS: %s",
             best_matching_type,