From 5920efa2b2fedaa68fcc0ddf686900c1ab46452c Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 19 Sep 2024 09:34:03 +0200 Subject: [PATCH] Add preferred thread credentials to matter external commission (#22022) --- src/data/matter.ts | 26 +++++++++++++++++-- src/external_app/external_messaging.ts | 7 ++++- .../thread/thread-config-panel.ts | 16 +++++------- 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/data/matter.ts b/src/data/matter.ts index d6c4de87a0..3872d81c51 100644 --- a/src/data/matter.ts +++ b/src/data/matter.ts @@ -2,6 +2,8 @@ import { UnsubscribeFunc } from "home-assistant-js-websocket"; import { navigate } from "../common/navigate"; import { HomeAssistant } from "../types"; import { subscribeDeviceRegistry } from "./device_registry"; +import { isComponentLoaded } from "../common/config/is_component_loaded"; +import { getThreadDataSetTLV, listThreadDataSets } from "./thread"; export enum NetworkType { THREAD = "thread", @@ -51,10 +53,30 @@ export interface MatterCommissioningParameters { export const canCommissionMatterExternal = (hass: HomeAssistant) => hass.auth.external?.config.canCommissionMatter; -export const startExternalCommissioning = (hass: HomeAssistant) => - hass.auth.external!.fireMessage({ +export const startExternalCommissioning = async (hass: HomeAssistant) => { + if (isComponentLoaded(hass, "thread")) { + const datasets = await listThreadDataSets(hass); + const preferredDataset = datasets.datasets.find( + (dataset) => dataset.preferred + ); + if (preferredDataset) { + return hass.auth.external!.fireMessage({ + type: "matter/commission", + payload: { + active_operational_dataset: ( + await getThreadDataSetTLV(hass, preferredDataset.dataset_id) + ).tlv, + border_agent_id: preferredDataset.preferred_border_agent_id, + mac_extended_address: preferredDataset.preferred_extended_address, + }, + }); + } + } + + return hass.auth.external!.fireMessage({ type: "matter/commission", }); +}; export const redirectOnNewMatterDevice = ( hass: HomeAssistant, diff --git a/src/external_app/external_messaging.ts b/src/external_app/external_messaging.ts index 13a0663221..5e18414583 100644 --- a/src/external_app/external_messaging.ts +++ b/src/external_app/external_messaging.ts @@ -57,6 +57,11 @@ interface EMOutgoingMessageBarCodeNotify extends EMMessage { interface EMOutgoingMessageMatterCommission extends EMMessage { type: "matter/commission"; + payload?: { + mac_extended_address: string | null; + border_agent_id: string | null; + active_operational_dataset: string | null; + }; } interface EMOutgoingMessageImportThreadCredentials extends EMMessage { @@ -136,7 +141,7 @@ interface EMOutgoingMessageThreadStoreInPlatformKeychain extends EMMessage { type: "thread/store_in_platform_keychain"; payload: { mac_extended_address: string; - border_agent_id: string | null; + border_agent_id: string; active_operational_dataset: string; }; } diff --git a/src/panels/config/integrations/integration-panels/thread/thread-config-panel.ts b/src/panels/config/integrations/integration-panels/thread/thread-config-panel.ts index aa4a98a867..23dfce2198 100644 --- a/src/panels/config/integrations/integration-panels/thread/thread-config-panel.ts +++ b/src/panels/config/integrations/integration-panels/thread/thread-config-panel.ts @@ -106,13 +106,11 @@ export class ThreadConfigPanel extends SubscribeMixin(LitElement) { "ui.panel.config.thread.add_dataset_from_tlv" )} - ${!this._otbrInfo - ? html`${this.hass.localize( - "ui.panel.config.thread.add_open_thread_border_router" - )}` - : ""} + ${this.hass.localize( + "ui.panel.config.thread.add_open_thread_border_router" + )}

${this.hass.localize("ui.panel.config.thread.my_network")}

@@ -342,8 +340,8 @@ export class ThreadConfigPanel extends SubscribeMixin(LitElement) { type: "thread/store_in_platform_keychain", payload: { mac_extended_address: otbr.extended_address, - border_agent_id: otbr.border_agent_id ?? "", - active_operational_dataset: otbr.active_dataset_tlvs ?? "", + border_agent_id: otbr.border_agent_id, + active_operational_dataset: otbr.active_dataset_tlvs, }, }); }