From 0403ea715e2f40b8579bf1be60359acb7c1e3d86 Mon Sep 17 00:00:00 2001
From: "J. Nick Koston" <nick@koston.org>
Date: Sat, 21 Aug 2021 14:56:49 -0500
Subject: [PATCH] Add known devices to USB Vendor / Product IDs (#54986)

Co-authored-by: kpine <keith.pine@gmail.com>
---
 homeassistant/components/zha/manifest.json      |  8 ++++----
 homeassistant/components/zwave_js/manifest.json |  6 +++---
 homeassistant/loader.py                         |  7 ++++++-
 script/hassfest/manifest.py                     |  1 +
 script/hassfest/usb.py                          |  7 ++++++-
 tests/test_loader.py                            | 16 ++++++++++++----
 6 files changed, 32 insertions(+), 13 deletions(-)

diff --git a/homeassistant/components/zha/manifest.json b/homeassistant/components/zha/manifest.json
index 5df8cddc167..93d9816d339 100644
--- a/homeassistant/components/zha/manifest.json
+++ b/homeassistant/components/zha/manifest.json
@@ -16,10 +16,10 @@
     "zigpy-znp==0.5.3"
   ],
   "usb": [
-   {"vid":"10C4","pid":"EA60"},
-   {"vid":"1CF1","pid":"0030"},
-   {"vid":"1A86","pid":"7523"},
-   {"vid":"10C4","pid":"8A2A"}
+   {"vid":"10C4","pid":"EA60","known_devices":["slae.sh cc2652rb stick"]},
+   {"vid":"1CF1","pid":"0030","known_devices":["Conbee II"]},
+   {"vid":"1A86","pid":"7523","known_devices":["Electrolama zig-a-zig-ah"]},
+   {"vid":"10C4","pid":"8A2A","known_devices":["Nortek HUSBZB-1"]}
   ],
   "codeowners": ["@dmulcahey", "@adminiuga"],
   "zeroconf": [
diff --git a/homeassistant/components/zwave_js/manifest.json b/homeassistant/components/zwave_js/manifest.json
index 5c2d1f0db81..23a1546a421 100644
--- a/homeassistant/components/zwave_js/manifest.json
+++ b/homeassistant/components/zwave_js/manifest.json
@@ -8,8 +8,8 @@
   "dependencies": ["usb", "http", "websocket_api"],
   "iot_class": "local_push",
   "usb": [
-   {"vid":"0658","pid":"0200"},
-   {"vid":"10C4","pid":"8A2A"},
-   {"vid":"10C4","pid":"EA60"}
+   {"vid":"0658","pid":"0200","known_devices":["Aeotec Z-Stick Gen5+", "Z-WaveMe UZB"]},
+   {"vid":"10C4","pid":"8A2A","known_devices":["Nortek HUSBZB-1"]},
+   {"vid":"10C4","pid":"EA60","known_devices":["Aeotec Z-Stick 7", "Silicon Labs UZB-7", "Zooz ZST10 700"]}
   ]
 }
diff --git a/homeassistant/loader.py b/homeassistant/loader.py
index 57244d9ec7b..e186c5d24ba 100644
--- a/homeassistant/loader.py
+++ b/homeassistant/loader.py
@@ -230,7 +230,12 @@ async def async_get_usb(hass: HomeAssistant) -> list[dict[str, str]]:
         if not integration.usb:
             continue
         for entry in integration.usb:
-            usb.append({"domain": integration.domain, **entry})
+            usb.append(
+                {
+                    "domain": integration.domain,
+                    **{k: v for k, v in entry.items() if k != "known_devices"},
+                }
+            )
 
     return usb
 
diff --git a/script/hassfest/manifest.py b/script/hassfest/manifest.py
index acb2a999fe3..8c9776ed7c9 100644
--- a/script/hassfest/manifest.py
+++ b/script/hassfest/manifest.py
@@ -210,6 +210,7 @@ MANIFEST_SCHEMA = vol.Schema(
                 {
                     vol.Optional("vid"): vol.All(str, verify_uppercase),
                     vol.Optional("pid"): vol.All(str, verify_uppercase),
+                    vol.Optional("known_devices"): [str],
                 }
             )
         ],
diff --git a/script/hassfest/usb.py b/script/hassfest/usb.py
index 49da04ee03f..6377fdcb8af 100644
--- a/script/hassfest/usb.py
+++ b/script/hassfest/usb.py
@@ -33,7 +33,12 @@ def generate_and_validate(integrations: list[dict[str, str]]) -> str:
             continue
 
         for entry in match_types:
-            match_list.append({"domain": domain, **entry})
+            match_list.append(
+                {
+                    "domain": domain,
+                    **{k: v for k, v in entry.items() if k != "known_devices"},
+                }
+            )
 
     return BASE.format(json.dumps(match_list, indent=4))
 
diff --git a/tests/test_loader.py b/tests/test_loader.py
index 2c5eb91d0fb..9786c9fdcfb 100644
--- a/tests/test_loader.py
+++ b/tests/test_loader.py
@@ -369,10 +369,18 @@ def _get_test_integration_with_usb_matcher(hass, name, config_flow):
             "dependencies": [],
             "requirements": [],
             "usb": [
-                {"vid": "10C4", "pid": "EA60"},
-                {"vid": "1CF1", "pid": "0030"},
-                {"vid": "1A86", "pid": "7523"},
-                {"vid": "10C4", "pid": "8A2A"},
+                {
+                    "vid": "10C4",
+                    "pid": "EA60",
+                    "known_devices": ["slae.sh cc2652rb stick"],
+                },
+                {"vid": "1CF1", "pid": "0030", "known_devices": ["Conbee II"]},
+                {
+                    "vid": "1A86",
+                    "pid": "7523",
+                    "known_devices": ["Electrolama zig-a-zig-ah"],
+                },
+                {"vid": "10C4", "pid": "8A2A", "known_devices": ["Nortek HUSBZB-1"]},
             ],
         },
     )
-- 
GitLab