重要な Android アプリを作成する

1. ようこそ

IoT 標準の統一を目標に開発された Matter は、Google Home、Zigbee、Bluetooth メッシュ、Z-Wave などのさまざまなエコシステムにわたってスマートホーム デバイスを接続します。

モバイル デバイスは、スマートホーム デバイスの中心となるインタラクション ポイントです。Matter デバイスに対応した独自の Android アプリを作成したいとお考えの場合は、Google が開発をお手伝いいたします。

Matter 向けの Google Home サンプルアプリ(Matter 向け GHSA)では、デバイスのコミッショニングと共有に使用できる Home Mobile SDK API を紹介しています。サンプルアプリは、Matter の主なコンセプトを理解するための学習ツールとして、また Matter デバイスとのやり取りのデバッグやトラブルシューティングを行うツールとしても使用できます。

演習内容

この Codelab では、サンプルアプリのソースコードをダウンロードし、Home Mobile SDK を使用してデバイスをコミッショニングして共有する方法について学習します。また、Matter リポジトリ(connectedhomeipから、コミッショニングとクラスタ ライブラリの使用方法についても学習します。

サンプルアプリをダウンロードしたら、Android Studio のソースコードを確認し、以下の Home Mobile SDK API を実装します。

また、試運転のコンセプト、Matter ファブリック、Matter デバイスの操作方法についても説明します。

必要なもの

始める前に、次のことを確認してください。

サンプルアプリを使用してデバイスを試したり操作したりするのに、Google Nest Hub(第 2 世代)などのハブは必要ありません。

2. セットアップする

Codelab スターター アプリは codelab ブランチにあります。Codelab のソースコードの利用を開始するには、ZIP ファイルをダウンロードします。

この codelab ZIP ファイルを使用して、作業サンプルを作成します。

Codelab のバージョン

codelab ブランチには、サンプルアプリの 2.0.0 リリースのタグが付けられています。各ステップを進める際に更新内容を比較するには、このリリースの完全なソースコードをダウンロードします。

GitHub リポジトリのクローンを作成する場合は、サンプルアプリの README の手順に沿ってください。

依存関係

ここではデバイスの共有とコミッショニングに必要なソースコードについて説明しますが、始める前に以下の依存関係を認識しておくことをおすすめします。これらの依存関係は libs.versions.toml ファイルで宣言され、その使用方法は build.gradle.kts ファイルで指定されることに注意してください。

ソースコード

ユーザー インターフェースとほとんどの機能はあらかじめ用意されています。

この Codelab では、次のファイルに Matter 機能を追加します。

  • java/com/google/homesampleapp/commissioning/AppCommissioningService: デバイスを開発ファブリックに委託できます。
  • java/com/google/homesampleapp/screens/home/HomeScreenjava/com/google/homesampleapp/screens/home/HomeViewModel.kt: Home Mobile SDK のコミッショニング機能が含まれています
  • java/com/google/homesampleapp/screens/device/DeviceScreenjava/com/google/homesampleapp/screens/device/DeviceViewModel: Share Device API 呼び出しを含む

各ファイルには、変更するコードブロックがコメントとして付加されます。次に例を示します。

// CODELAB: add commissioningFunction()

これにより、Codelab の対応するセクションをすばやく見つけることができます。

3. Google へのコミッション

デバイスを操作して同じファブリック内で相互に通信できるようにするには、コミッショナー(この場合はこのサンプル アプリケーションである Matter 用の Google Home サンプルアプリ)にデバイスを委託する必要があります。

Matter のコミッショニングに関する次のコンセプトを理解することが重要です。

  • ファブリックを使用すると、デバイスが相互に通信できるようになります。
  • ファブリックは、一意の認証情報の共有セットを維持します。
  • エコシステムは、信頼できるルート証明書の発行、ファブリック ID の割り当て、一意のノード ID の割り当てを行います。エコシステムとは、コミッショナーのバックエンド サービスです。たとえば、Google Home エコシステムのホームグラフなどです。
  • デバイスを複数のファブリックに委託できます(マルチ管理者機能)。

デバイスをコミッショニングするには、CommissioningClient API を使用する必要があります。.commissionDevice() を呼び出すと IntentSender が返され、これにより Google Play 開発者サービスで適切なアクティビティが起動されます。

interface CommissioningClient {
  Task<IntentSender> commissionDevice(CommissioningRequest request);
}

次のセクションでは、デバイスを Google ファブリックにコミッショニングするために必要な最小限のコードについて説明します。

ステップ 1: アクティビティ ランチャー

CommissioningClient から IntentSender を処理するには、ActivityResultLauncher を使用します。

val commissioningLauncher = registerForActivityResult(
    StartIntentSenderForResult()
) { result: ActivityResult ->
    if (result.resultCode == RESULT_OK) {
        Timber.d(TAG, "Commissioning succeeded.")
    } else {
        Timber.d(TAG, "Commissioning failed. " + result.resultCode)
    }
}

ステップ 2: コミッショニング機能

CommissioningClient API を使用してデバイスを Google ファブリックにコミッショニングする基本的な例を次に示します。

  1. コミッショニング プロセスは commissionDevice() 関数で開始します。まず、CommissioningRequest を定義します。このデフォルト設定では、デバイスはローカル Android ファブリックに対してのみコミッショニングされます。
  2. Matter は、Home Mobile SDK のエントリ ポイントです。次の呼び出しで、.getCommissioningClientthis(アクティビティ)によって CommissioningClient を取得します。
  3. .commissionDevice()CommissioningRequest を受け入れます。
  4. 最後に、CommissioningResult を処理し、Google Play 開発者サービス(GPS)の Commission Device アクティビティを開始するために、.addOnSuccessListener が呼び出されます。
private fun commissionDevice() {
    val request: CommissioningRequest = CommissioningRequest.builder().build()
    Matter.getCommissioningClient(this)
        .commissionDevice(request)
        .addOnSuccessListener { result ->
            commissioningLauncher.launch(IntentSenderRequest.Builder(result).build())
        }
}

Android の設定を介してローカル Android ファブリックを利用して、デバイスを他のファブリックにコミッショニングするプロセスを簡素化できます。

次に、デバイスを開発ファブリックにコミッショニングする方法について説明します。

コミッショニング プロセス中のユーザー インターフェースの概要については、Matter 用 Google Home サンプルアプリのガイドを参照してください。

4. 開発ファブリックへの委託

デバイスは複数のファブリックをコミッショニングできます。信頼できるペア設定を管理するために、デバイスはさまざまな FabricInfo メンバーを含む FabricTable を保存します。次に例を示します。

  • ファブリックの識別
  • ファブリックによってデバイスに割り当てられるノード ID
  • ベンダー ID
  • ファブリック ID
  • デバイスの動作認証情報

管理ドメイン マネージャー(ADM)は、ファブリック認証情報を定義します。上記のシナリオでは、Google Play 開発者サービスが、信頼できるルート認証局(CA)として機能するエコシステムです。ローカル Android ファブリックにデバイスを委託すると、すべてのデバイスに同じファブリック認証情報セットと CA セットが同じになります。

カスタム コミッショニング サービス

ローカル Android ファブリックをコミッションするために、デフォルトのパラメータを使用して CommissioningClient API で CommissioningRequest をビルドしました。

val request: CommissioningRequest = CommissioningRequest.builder().build()

アプリから新しいデバイスを制御、管理するには、ローカルの開発ファブリックを作成し、デバイスをコミッショニングするための動作認証情報を取得する必要があります。このシナリオでは、アプリは独自の独立したエコシステムとなり、デバイスに適切なノード認証情報を割り当てます。

カスタム サービスを CommissioningRequest に渡すと、独自のファブリックにデバイスをコミッショニングすることを Home Mobile SDK に指示できます。

class CommissioningRequest {
  static CommissioningRequest.Builder builder();

  class Builder {
    Builder setCommissioningService(@Nullable ComponentName commissioningService);

    CommissioningRequest build();
  }
}

次のステップでは、カスタム サービスを使用するように commissionDevice() 関数を変更します。また、ホーム フラグメントにアクティビティ ランチャーを追加し、LiveData オブジェクトを使用して API フローを管理します。

ステップ 1: GPS アクティビティ ランチャーを作成する

まず、 CommissioningClient API からの IntentSender を処理するアクティビティ ランチャーを作成します。

  1. java/com/google/homesampleapp/screens/home/ フォルダの HomeScreen を開きます。
  2. // CODELAB: commissionDeviceLauncher definition コメントを次のコードに置き換えて、コミッショニング アクティビティの結果を登録して処理します。
    val commissionDeviceLauncher =
      rememberLauncherForActivityResult(
        contract = ActivityResultContracts.StartIntentSenderForResult()
      ) { result ->
        // Commission Device Step 5.
        // The Commission Device activity in GPS (step 4) has completed.
        val resultCode = result.resultCode
        if (resultCode == Activity.RESULT_OK) {
          Timber.d("CommissionDevice: Success")
          // We let the ViewModel know that GPS commissioning has completed successfully.
          // The ViewModel knows that we still need to capture the device name and will\
          // update UI state to trigger the NewDeviceAlertDialog.
          homeViewModel.gpsCommissioningDeviceSucceeded(result)
        } else {
          homeViewModel.commissionDeviceFailed(resultCode)
        }
      }
    

ステップ 2: デバイスのコミッション アクションをトリガーする

このステップでは、ユーザーが「Commission Device」をトリガーします。[+]をクリックしてボタンをタップします。その後、commissionDevice() が呼び出されます。

val onCommissionDevice = {
  ...
  commissionDevice(activity!!.applicationContext, commissionDeviceLauncher)
}

ステップ 3: API を呼び出す

  1. java/com/google/homesampleapp/screens/home フォルダの HomeScreen.kt に残っています。
  2. // CODELAB: commissionDevice コメントを次の commissionDeviceRequest に置き換えます。setCommissioningService は、コールバック関数で返される CommissioningService インスタンスに AppCommissioningService をバインドします。カスタム サービスを渡すと、Home Mobile SDK はまず Android ローカル ファブリックにデバイスをコミッショニングし、次にオンボーディング ペイロードを AppCommissioningService に送り返します。
    val commissionDeviceRequest =
        CommissioningRequest.builder()
            .setCommissioningService(ComponentName(
                context, AppCommissioningService::class.java))
            .build()
    
  3. .getCommissioningClient() を呼び出した後、.commissionDevice() を呼び出します。
Matter.getCommissioningClient(context)
    .commissionDevice(commissionDeviceRequest)

commissionDevice 関数を完成させるには、addOnSuccessListeneraddOnFailureListener を追加します。

    .addOnSuccessListener { result ->
      commissionDeviceLauncher.launch(IntentSenderRequest.Builder(result).build())
    }
    .addOnFailureListener { error ->
      Timber.e(error)
    }

5. コミッショニング サービスを作成する

commissionDevice() 関数で、CommissioningClient API から CommissioningService の取得をリクエストしました。このフローでは、CommissioningClient API は、まずデバイスをローカル Android ファブリックに委託してから、CommissioningRequestMetadata オブジェクトを含むコールバックを返します。

public interface CommissioningService {
interface Callback {
    void onCommissioningRequested(CommissioningRequestMetadata metadata);
  }
}

次は、 CommissioningService.Callback を継承して、サンプルアプリにデバイスをコミッショニングするために必要な機能を提供する必要があります。基本的な CommissioningService の実装例を次に示します。

class MatterCommissioningService : Service(), CommissioningService.Callback {
   private val commissioningServiceDelegate =
     CommissioningService.Builder(this)
       .setCallback(this)
       .build()

   override fun onBind(intent: Intent) = commissioningServiceDelegate.asBinder()

   override fun onCommissioningRequested(metadata: CommissioningRequestMetadata) {
     // perform commissioning

     commissioningServiceDelegate
       .sendCommissioningComplete(CommissioningCompleteMetadata.builder().build())
   }
 }

ステップ 1: カスタム AppCommissioningService を調べる

簡単に開始できるように、カスタム CommissioningService の基本的なクラス構造はすでに定義されています。サービスの機能の概要を簡単に説明します。フォローするには、java/commissioningAppCommissioningService を開いてください。

Home Mobile SDK API 用に次のインポートを追加しました。

import com.google.android.gms.home.matter.commissioning.CommissioningCompleteMetadata
import com.google.android.gms.home.matter.commissioning.CommissioningRequestMetadata
import com.google.android.gms.home.matter.commissioning.CommissioningService

AppCommissioningService には、Matter リポジトリ(connectedhomeipのライブラリも含まれます。

import com.google.homesampleapp.chip.ChipClient

最後に、このサービスには、HiltKotlin コルーチンをサポートするインポートが含まれています。

次に、コンストラクタを作成して、いくつかの設定を行います。これには、コミッショニングが完了したことを Google Play 開発者サービスに通知するために使用する commissioningServiceDelegate が含まれます。

private lateinit var commissioningServiceDelegate: CommissioningService
...
commissioningServiceDelegate = CommissioningService.Builder(this).setCallback(this).build()

ここで、コミッショニング関数を追加します。

ステップ 2: onCommissioningRequested をオーバーライドする

アプリの開発ファブリックに対してデバイスをコミッショニングする手順は次のとおりです。

  1. java/commissioningAppCommissioningServiceを開きます。
  2. onCommissioningRequested() 関数を見つけます。CommissioningRequestMetadata を出力するログ メッセージを用意しました。// CODELAB: onCommissioningRequested() コメントを置き換えて serviceScope コルーチンを開始し、deviceId を取得します。
    // Perform commissioning on custom fabric for the sample app.
    serviceScope.launch {
      val deviceId = devicesRepository.incrementAndReturnLastDeviceId()
    
  3. 試運転を実施する。このステップでは、CommissioningRequestMetadata オブジェクトで返されたデバイス情報を渡すことができます。ChipClient はこのメタデータ情報を使用して、Matter 用 GHSA アプリとデバイスの間に安全なチャンネルを作成します。
    try {
      Timber.d(
          "Commissioning: App fabric -> ChipClient.establishPaseConnection(): deviceId [${deviceId}]")
      chipClient.awaitEstablishPaseConnection(
          deviceId,
          metadata.networkLocation.ipAddress.hostAddress!!,
          metadata.networkLocation.port,
          metadata.passcode)
      Timber.d(
          "Commissioning: App fabric -> ChipClient.commissionDevice(): deviceId [${deviceId}]")
      chipClient.awaitCommissionDevice(deviceId, null)
    } catch (e: Exception) {
      Timber.e(e, "onCommissioningRequested() failed")
      // No way to determine whether this was ATTESTATION_FAILED or DEVICE_UNREACHABLE.
      commissioningServiceDelegate
          .sendCommissioningError(CommissioningError.OTHER)
          .addOnSuccessListener {
            Timber.d(
                "Commissioning: commissioningServiceDelegate.sendCommissioningError() succeeded")
          }
          .addOnFailureListener { e2 ->
            Timber.e(e2, "Commissioning: commissioningServiceDelegate.sendCommissioningError() failed")
          }
      return@launch
    }
    
  4. commissioningServiceDelegate を使用して、コミッショニングが完了したことを Google Play 開発者サービスに通知します。.sendCommissioningComplete() で、CommissioningCompleteMetadata を渡します。
    commissioningServiceDelegate
        .sendCommissioningComplete(
            CommissioningCompleteMetadata.builder().setToken(deviceId.toString()).build())
        .addOnSuccessListener {
          Timber.d("Commissioning: commissioningServiceDelegate.sendCommissioningComplete() succeeded")
        }
        .addOnFailureListener { e ->
          Timber.e(e, "Commissioning: commissioningServiceDelegate.sendCommissioningComplete() failed")
        }
    }
    

アプリを実行する

ローカル ファブリックへのコミッションに必要なコードがすべて揃ったので、次はテストを行います。Android デバイスを選択してアプリを実行します。ホーム画面で [デバイスを追加] をタップし、デバイスをコミッショニングする手順を完了します。

コミッショニングが完了すると、デバイスはローカル Android ファブリックとローカル開発ファブリックの 2 つのファブリックに参加します。各ファブリックには、固有の認証情報セットと一意の 64 ビット ファブリック ID があります。

6. デバイスの操作

開発ファブリックにコミッショニングすると、Matter リポジトリ(connectedhomeipのライブラリを使用して、サンプルアプリからデバイスを制御できます。

簡単にデバイス クラスタにアクセスしてコマンドを送信できるようにするために、いくつかのヘルパークラスを作成しました。詳しくは、java/clustersClustersHelper を開いてください。このシングルトン ヘルパーは、次のライブラリをインポートしてデバイス情報にアクセスします。

import chip.devicecontroller.ChipClusters
import chip.devicecontroller.ChipStructs

このクラスを使用してデバイスのオン/オフ クラスタを取得し、.toggle を呼び出すことができます。

suspend fun toggleDeviceStateOnOffCluster(deviceId: Long, endpoint: Int) {
  Timber.d("toggleDeviceStateOnOffCluster())")
  val connectedDevicePtr =
      try {
        chipClient.getConnectedDevicePointer(deviceId)
      } catch (e: IllegalStateException) {
        Timber.e("Can't get connectedDevicePointer.")
        return
      }
  return suspendCoroutine { continuation ->
    getOnOffClusterForDevice(connectedDevicePtr, endpoint)
        .toggle(
            object : ChipClusters.DefaultClusterCallback {
              override fun onSuccess() {
                continuation.resume(Unit)
              }
              override fun onError(ex: Exception) {
                Timber.e("readOnOffAttribute command failure: $ex")
                continuation.resumeWithException(ex)
              }
            })
  }
}

デバイスを切り替える

デバイスをコミッショニングすると、CommissioningResult で返されたペイロードが DataStore に追加されます。これにより、アプリはコマンドの送信に使用できるデバイス情報にアクセスできるようになります。

Matter アプリはイベント ドリブンです。Matter スタックが初期化されると、クラスタ サービスが受信メッセージをリッスンします。デバイスをコミッショニングすると、Matter クライアントは、デバイスのコミッショニング時に確立された安全な運用チャネルを介してコマンドを送信します。

デバイス上で、パケットは検証、復号され、コールバックでディスパッチされます。コールバック関数には、attributePath からアクセスできる EndpointId、ClusterId、AttributeId が含まれます。たとえば、次のコードは Matter デバイスに実装できます。

void MatterPostAttributeChangeCallback(const chip::app::ConcreteAttributePath & attributePath, uint8_t mask, uint8_t type,
                                       uint16_t size, uint8_t * value)
{
    // handle callback
    ClusterId clusterId     = attributePath.mClusterId;
    AttributeId attributeId = attributePath.mAttributeId;
}

次の手順では、Matter SDK と ClustersHelper を使用してデバイスを切り替えます。

  1. java/screens/deviceDeviceViewModelに移動します。
  2. updateDeviceStateOn 関数を見つけます。
  3. // CODELAB: toggle コメントを clustersHelper を呼び出すコードに置き換えてから、デバイス リポジトリを更新します。
    Timber.d("Handling real device")
        try {
          clustersHelper.setOnOffDeviceStateOnOffCluster(deviceUiModel.device.deviceId, isOn, 1)
          devicesStateRepository.updateDeviceState(deviceUiModel.device.deviceId, true, isOn)
        } catch (e: Throwable) {
          Timber.e("Failed setting on/off state")
        }
    

この関数は DeviceScreen から呼び出されます。

// On/Off Switch click.
val onOnOffClick: (value: Boolean) -> Unit = { value ->
  deviceViewModel.updateDeviceStateOn(deviceUiModel!!, value)
}

アプリを実行する

アプリを実行して更新を再読み込みします。ホーム画面でデバイスのオンとオフを切り替えます。

7. デバイスを他のエコシステムと共有する

デバイスの共有は、Matter の仕様ではマルチ管理者フローと呼ばれます。

これまでのステップで、Home Mobile SDK によって、デバイスをローカル Android ファブリックとサンプルアプリの開発ファブリックにコミッショニングできることを学びました。これはマルチ管理者フローの例です。このフローでは、デバイスを複数のファブリックに委託できます。

今後は、さらに多くのファブリックとデバイスを共有できます。特に、アプリケーションとプラットフォームに関してユーザーが自分の好みを持っている家庭の場合は特にそうです。

Home Mobile SDK の ShareDeviceRequest API にこの機能があり、次のことが可能になります。

  1. デバイスの一時的なコミッショニング ウィンドウを開きます。
  2. デバイスの状態を変更して、別のファブリックに委託できるようにします。
  3. 他のアプリやエコシステムからデバイスを操作できます。

次のステップでは、Home Mobile SDK を使用してデバイスを共有します。

ステップ 1: GPS アクティビティ ランチャーを作成する

開発ファブリックの依頼時に作成したコミッショニング アクティビティ ランチャーと同様に、CommissioningClient API からの IntentSender を処理する共有デバイス アクティビティ ランチャーを作成しました。

  1. java/com/google/homesampleapp/screens/device/ フォルダの DeviceScreen を開きます。
  2. // CODELAB: shareDeviceLauncher definition コメントを次のコードに置き換えて、.shareDevice() アクティビティの結果を登録して処理します。
    val shareDeviceLauncher = rememberLauncherForActivityResult(
      contract = ActivityResultContracts.StartIntentSenderForResult()
    ) { result ->
      // Commission Device Step 5.
      // The Share Device activity in GPS (step 4) has completed.
      val resultCode = result.resultCode
      if (resultCode == Activity.RESULT_OK) {
        deviceViewModel.shareDeviceSucceeded()
      } else {
        deviceViewModel.shareDeviceFailed(resultCode)
      }
    }
    

ステップ 2: デバイスの共有アクションをトリガーする

このステップでは、ユーザーが [デバイスを共有] をトリガーします。[共有] をクリックしてボタンをタップします。次に、deviceViewModel が呼び出され、デバイス共有用のペア設定ウィンドウが開きます。

// Share Device button click.
val onShareDevice: () -> Unit = remember {
 {
   deviceViewModel.openPairingWindow(deviceUiModel!!.device.deviceId)
 }
}

ペア設定ウィンドウが正常に開くと、deviceViewModel はそのことを UI に伝えます。ViewModel と UI の間の通信は、StateFlow オブジェクトを介して行います。

// Communicate to the UI that the pairing window is open.
// UI can then launch the GPS activity for device sharing.
_pairingWindowOpenForDeviceSharing.value = true

StateFlow オブジェクトの変更を確認すると、DeviceScreen は次の呼び出しを行います。

shareDevice(activity!!.applicationContext, shareDeviceLauncher, deviceViewModel)

ステップ 3: API を呼び出す

次に、デバイス共有タスクを開始します。

  1. java/com/google/homesampleapp/screens/device/ フォルダの DeviceScreen.kt を開きます。
  2. shareDevice() 関数を見つけます。// CODELAB: shareDevice コメントを ShareDeviceRequest に置き換えます。DeviceDescriptor は、ベンダー ID、製品 ID、deviceType など、デバイスに関する特定の情報を提供します。この例では、値をハードコードします。
    val shareDeviceRequest =
      ShareDeviceRequest.builder()
        .setDeviceDescriptor(DeviceDescriptor.builder().build())
        .setDeviceName("GHSAFM temp device name")
    
  3. CommissioningWindowパラメータを設定します。
        .setCommissioningWindow(
            CommissioningWindow.builder()
                .setDiscriminator(Discriminator.forLongValue(DISCRIMINATOR))
                .setPasscode(SETUP_PIN_CODE)
                .setWindowOpenMillis(SystemClock.elapsedRealtime())
                .setDurationSeconds(OPEN_COMMISSIONING_WINDOW_DURATION_SECONDS.toLong())
                .build())
        .build()
    
  4. .getCommissioningClient() を呼び出しますが、今回は .shareDevice() API を使用します。
    Matter.getCommissioningClient(context)
        .shareDevice(shareDeviceRequest)
    

commissioningClient.shareDevice() API の成功コールバックにより、Google Play 開発者サービスでデバイス共有アクティビティを起動するための IntentSender が提供されます。

  1. shareDevice 関数を完成させるために、addOnSuccessListeneraddOnFailureListener を追加します。成功すると、デバイス共有用の GPS アクティビティを起動するために、shareDeviceLauncherlaunch が呼び出されます。
        .addOnSuccessListener { result ->
          Timber.d("ShareDevice: Success getting the IntentSender: result [${result}]")
          shareDeviceLauncher.launch(IntentSenderRequest.Builder(result).build())
        }
        .addOnFailureListener { error ->
          Timber.e(error)
          deviceViewModel.showMsgDialog("Share device failed", error.toString())
        }
    

アプリを実行する

Matter デバイスを他のエコシステムと共有するには、Android デバイスに別のプラットフォームをインストールする必要があります。ターゲット コミッショナーとして使用できるサンプルアプリの別のインスタンスを作成しました。

Android デバイスにターゲット コミッショナーをインストールしたら、Matter デバイスを共有できることを確認します。ターゲット コミッショナー アプリには GHSAFM-TC というラベルが付きます。

デバイスは、次の 3 つのファブリックに参加できるようになりました。

  1. ローカル Android ファブリック。
  2. 開発ファブリック(このアプリ)。
  3. デバイスを共有した 3 つ目のファブリックです。

8. 次のステップ

完了

これで、この Codelab は終了です。Home Mobile SDK を使用してデバイスをコミッショニングして共有する方法を学習しました。

サンプルアプリに問題がある場合は、環境を確認する手順を実行してみてください。

サンプルアプリの使用方法について不明な点がある場合や、コードのバグを発見した場合は、GitHub リポジトリの Issue Tracker に問題を送信できます。

技術的な質問に関する Google の公式ガイダンスを入手するには、スマートホーム デベロッパー フォーラムをご利用ください。

コミュニティからテクニカル サポートを受けるには、Stack Overflow で google-smart-home タグを使用します。