カメラのオンボーディング後の特性

デバイスのコミッショニング後に使用できるトレイトは次のとおりです。

OtaSoftwareUpdateRequestorTrait

このトレイトは、カメラデバイスでの OTA ソフトウェア アップデートをモニタリングするためのインターフェースを提供します。コミッショニングが完了すると、カメラがアップデートを開始し、その状態をアプリに報告します。アプリがソフトウェア アップデートの完了ステータスを受け取ると、カメラはライブ配信を開始できます。

次のサンプルコードと説明は、このトレイトの使用方法を示しています。

device.types.subscribe(OtaRequestorDeviceType.self)
  .receive(on: DispatchQueue.main)
  .compactMap { $0.traits[Matter.OtaSoftwareUpdateRequestorTrait.self] }
  .removeDuplicates()
  .timeout(.seconds(30), scheduler: DispatchQueue.main)
  .sink { [weak self] completion in
    guard let self else { return }
    Logger.debug("OTA trait subscription completed unexpectedly: \(completion).")
    if case .otaDownload = self.step {
      Logger.debug("Advancing to settings step due to OTA trait subscription completion")
      self.step = .settings
    }
  } receiveValue: { [weak self] otaTrait in
    Logger.debug(
      "OTA update is in progress, state: \(otaTrait.attributes.updateState), progress: \(otaTrait.attributes.updateStateProgress ?? 0)"
    )

    self.step = .otaDownload(
      state: otaTrait.attributes.updateState ?? .querying,
      progress: Double(otaTrait.attributes.updateStateProgress ?? 0) / 100.0)
    }
  }
  .store(in: &cancellables)
  • デバイスのトレイトのサブスクライブ: デバイスのトレイトをサブスクライブし、特に OtaSoftwareUpdateRequestorTrait を探して OTA アップデート情報をリッスンします。

  • タイムアウトの設定: 30 秒のタイムアウトを設定します。この時間内にトレイトからアップデートが届かない場合、サブスクリプションは終了します。

  • OTA ステータス アップデートの処理(receiveValue): OtaSoftwareUpdateRequestorTrait が新しいステータスを提供すると、このブロックが実行されます。現在の状態と OTA アップデートの進行状況が記録されます。次に、この新しい情報を反映するように、アプリの内部状態(step)が更新されます。

  • 完了の処理(sink): サブスクリプションが終了すると、このブロックが実行され、完了が記録されます。プロセスがダウンロード状態の場合、アプリの状態は次のステップ(.settings)に進みます。

  • サブスクリプションのライフサイクルの管理: .store(in: &cancellables) 行 により、サブスクリプションが適切に管理され、サブスクリプションを所有するオブジェクトが割り当て解除されたときにキャンセルされます。

詳細については、 OtaSoftwareUpdateRequestorTrait トレイトのリファレンスをご覧ください

ConfigurationDoneTrait

このトレイトはカメラの有効化には必要ありませんが、AppConfigurationComplete 属性を true に設定することで、デバイスが完全にセットアップされ、使用可能になったタイミングをアプリで追跡できます。 このトレイトは、OtaSoftwareUpdateRequestorTrait の後に使用する必要があります。

let configDoneTrait = try await device.types.get(OtaRequestorDeviceType.self)?.traits[Google.ConfigurationDoneTrait.self]
_ = try await configDoneTrait?.update {
  $0.setAppConfigurationComplete(true)
}