iOS 向け Chime デバイスガイド

基本的なチャイム デバイスタイプは、標準の Matter ベースの Matter.ChimeTrait または Google 独自のカスタム バージョンのトレイト を使用して実装できます。 は、Matter 標準で指定された機能に加えて、外部チャイムもサポートします。Google.ChimeTraitチャイム デバイスは、Matter.IdentifyTrait を実装することもできます。これにより、チャイム デバイスを視覚または音声で識別する手段が提供されます。

機能を使用したり、属性の更新を試みたりする前に、必ずデバイスの属性とコマンドのサポートを確認してください。詳しくは、iOSでデバイスを操作するをご覧ください。

Home API のデバイスタイプ トレイト Swift サンプルアプリ ユースケース

チャイム

ChimeDeviceType

home.matter.0000.types.0146

プリインストールされたさまざまな音を再生できるデバイスで、通常はドアホン、音声ドアホン、ビデオドアホンで使用されます。

必須のトレイト
     matter ChimeTrait

省略可能な特性
     matter IdentifyTrait
ドアホン

デバイスに関する基本情報を取得する

   iOS 向けサンプルアプリに実装   

BasicInformation トレイトには、ベンダー名、ベンダー ID、プロダクト ID、プロダクト名(モデル情報を含む)、デバイスのソフトウェア バージョンなどの情報が含まれます。

let vendorName = basicInfoTrait.attributes.vendorName!
let vendorID = basicInfoTrait.attributes.vendorID!
let productID = basicInfoTrait.attributes.productID!
let productName = basicInfoTrait.attributes.productName!
let softwareVersion = basicInfoTrait.attributes.softwareVersion!

マルチパートのサポート

チャイムは、チャイムやスピーカー(オプション)など、複数のデバイスタイプで構成できます。また、一部のチャイムには Thread Border Router (TBR) が組み込まれています。幅広いサポートを確保するため、チャイムを制御する Home API アプリは、マルチパート チャイム デバイスに対応するように記述する必要があります。詳しくは、マルチパート デバイスをご覧ください。

マルチパート チャイム デバイスは、アプリ内で 1 つのタイルで表される必要があります。Chime デバイスはプライマリ デバイスで、子スピーカーは Chime の一部である必要があります。

スピーカーの音量は、チャイム デバイスのメイン設定として表示されます。

OnOff マッピング

Chime と Speaker の両方のデバイスタイプを持つチャイムの場合、制御アプリの OnOff ボタンは Chime の Enabled 属性にマッピングする必要があります。

Matter デバイス ライブラリの仕様に準拠して、チャイム トレイトの Enabled 属性を False に設定すると、チャイムが無効になるだけでなく、すべての音声と視覚のインジケーターを抑制するグローバル ミュート スイッチのように動作する場合があります。

自動化のサポート

前述のように、ChimeDeviceType には複数のパーツが含まれる可能性があるため、デベロッパーはすべてのチャイムをマルチパート デバイスとして扱うことが推奨されます。チャイムを使用する自動化の場合も同様です。

チャイムは、自動化の開始条件とアクションで使用できます。

自動化で使用される親チャイム デバイスのコンポーネント デバイスは、AutomationPartPath を使用して参照する必要があります。

次の自動化は、Chime トレイトとスピーカーを実装するマルチパート チャイムで自動化を作成する方法を示しています。玄関のドアが開くと、自動化がトリガーされます。

import GoogleHomeSDK
import GoogleHomeTypes

typealias ChimeTrait = Matter.ChimeTrait
typealias OpenCloseTrait = Google.OpenCloseTrait

// Fetch devices using the multipart device model.
let multipartDevices = try await home.devices(enableMultipartDevices: true).list()

guard let chimeParentDevice = multipartDevices.first(where: {
  $0.types.contains(ChimeDeviceType.self)
}) else { return }

guard let doorDevice = multipartDevices.first(where: {
  $0.types.contains(GoogleDoorDeviceType.self)
}) else { return }

// Extract the AutomationPartPath for the specific Chime part
guard let chimeType = await chimeParentDevice.types.get(ChimeDeviceType.self),
  let chimePartPath = chimeParentDevice.automationPart(chimeType) else {
  return
}

let starterNode = starter(doorDevice, GoogleDoorDeviceType.self, OpenCloseTrait.self)

let doorOpenClose = stateReader(doorDevice, GoogleDoorDeviceType.self, OpenCloseTrait.self)

// Build the automation
let chimeAutomation = automation(
  name: "Multipart Chime Demo",
  description: "Activate the chime when the door is opened"
) {
starterNode
condition {
  starterNode.openPercent.unwrapOptional().greaterThan(0)
}
  // Action: Play a chime sound
  action(chimePartPath) {
    ChimeTrait.playChimeSound()
  }
}

マルチパート デバイスを使用した自動化について詳しくは、マルチパート デバイスの自動化をご覧ください。

デバイスの接続を確認する

一部のデバイスは複数のデバイスタイプをサポートしているため、デバイスの接続は実際にはデバイスタイプ レベルでチェックされます。返される状態は、そのデバイスのすべてのトレイトの接続状態の組み合わせです。

let lightConnectivity =
  dimmableLightDeviceType.metadata.sourceConnectivity
  .connectivityState

インターネットに接続されていない場合、デバイスの種類が混在していると partiallyOnline の状態になることがあります。Matter 標準特性はローカル ルーティングによりオンラインのままになる可能性がありますが、クラウドベースの特性はオフラインになります。

デバイスの IP アドレスを取得する

デバイスの IP アドレスを確認するには、GeneralDiagnosticsTrait の networkInterfaces 属性を使用します。アドレスは Data オブジェクトとして返されます。Network フレームワークを使用して、標準の IPv4 または IPv6 文字列にフォーマットできます。

func getIpAddresses(trait: Matter.GeneralDiagnosticsTrait) -> [String] {
  let interfaces = trait.attributes.networkInterfaces ?? []
  var ipAddresses: [String] = []

  for interface in interfaces {
    for data in interface.iPv4Addresses {
      if let ipv4 = IPv4Address(data) {
        ipAddresses.append(String(describing: ipv4))
      }
    }
    for data in interface.iPv6Addresses {
      if let ipv6 = IPv6Address(data) {
        ipAddresses.append(String(describing: ipv6))
      }
    }
  }

  return ipAddresses
}