From e08f691510fd6b7eda1049d95ab1343465c794d1 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 22 Aug 2021 12:14:14 -0500 Subject: [PATCH] Trigger a scan of USB devices when loading integrations (#9860) --- src/data/usb.ts | 4 ++++ src/onboarding/onboarding-integrations.ts | 10 ++++++++++ .../config/integrations/ha-config-integrations.ts | 10 ++++++++++ 3 files changed, 24 insertions(+) create mode 100644 src/data/usb.ts diff --git a/src/data/usb.ts b/src/data/usb.ts new file mode 100644 index 0000000000..03246a2dad --- /dev/null +++ b/src/data/usb.ts @@ -0,0 +1,4 @@ +import { HomeAssistant } from "../types"; + +export const scanUSBDevices = (hass: HomeAssistant) => + hass.callWS({ type: "usb/scan" }); diff --git a/src/onboarding/onboarding-integrations.ts b/src/onboarding/onboarding-integrations.ts index 1aca3c976a..acafb6e191 100644 --- a/src/onboarding/onboarding-integrations.ts +++ b/src/onboarding/onboarding-integrations.ts @@ -10,6 +10,7 @@ import { import { customElement, property, state } from "lit/decorators"; import { fireEvent } from "../common/dom/fire_event"; import { compare } from "../common/string/compare"; +import { isComponentLoaded } from "../common/config/is_component_loaded"; import { LocalizeFunc } from "../common/translations/localize"; import { ConfigEntry, getConfigEntries } from "../data/config_entries"; import { @@ -19,6 +20,7 @@ import { } from "../data/config_flow"; import { DataEntryFlowProgress } from "../data/data_entry_flow"; import { domainToName } from "../data/integration"; +import { scanUSBDevices } from "../data/usb"; import { loadConfigFlowDialog, showConfigFlowDialog, @@ -134,6 +136,7 @@ class OnboardingIntegrations extends LitElement { protected firstUpdated(changedProps: PropertyValues) { super.firstUpdated(changedProps); + this._scanUSBDevices(); loadConfigFlowDialog(); this._loadConfigEntries(); /* polyfill for paper-dropdown */ @@ -159,6 +162,13 @@ class OnboardingIntegrations extends LitElement { }); } + private async _scanUSBDevices() { + if (!isComponentLoaded(this.hass, "usb")) { + return; + } + await scanUSBDevices(this.hass); + } + private async _loadConfigEntries() { const entries = await getConfigEntries(this.hass!); // We filter out the config entry for the local weather and rpi_power. diff --git a/src/panels/config/integrations/ha-config-integrations.ts b/src/panels/config/integrations/ha-config-integrations.ts index e584ae152a..f3d0275728 100644 --- a/src/panels/config/integrations/ha-config-integrations.ts +++ b/src/panels/config/integrations/ha-config-integrations.ts @@ -26,6 +26,7 @@ import "../../../components/ha-button-menu"; import "../../../components/ha-checkbox"; import "../../../components/ha-fab"; import "../../../components/ha-svg-icon"; +import { isComponentLoaded } from "../../../common/config/is_component_loaded"; import { ConfigEntry, getConfigEntries } from "../../../data/config_entries"; import { getConfigFlowInProgressCollection, @@ -47,6 +48,7 @@ import { fetchIntegrationManifests, IntegrationManifest, } from "../../../data/integration"; +import { scanUSBDevices } from "../../../data/usb"; import { showConfigFlowDialog } from "../../../dialogs/config-flow/show-dialog-config-flow"; import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box"; import "../../../layouts/hass-loading-screen"; @@ -249,6 +251,7 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) { if (this.route.path === "/add") { this._handleAdd(localizePromise); } + this._scanUSBDevices(); } protected updated(changed: PropertyValues) { @@ -500,6 +503,13 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) { }); } + private async _scanUSBDevices() { + if (!isComponentLoaded(this.hass, "usb")) { + return; + } + await scanUSBDevices(this.hass); + } + private async _fetchManifests() { const fetched = await fetchIntegrationManifests(this.hass); // Make a copy so we can keep track of previously loaded manifests