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

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

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)
}