Howto

Matter over Thread 対応家電を Armadillo-640 + BT/TH オプションモジュールで操作する

BT/TH オプションモジュールを装着した Armadillo-640 を、Thread 対応 Matter コントローラーとして使用する手順を説明します。

  • 2023-11-20: 「Matter 用 Thread ファームウェアを BT/TH オプションモジュールに書き込む」で使用する、Matter 用 Thread ファームウェア書込み用のコンテナイメージの内容に間違いがありましたので、更新しました。

はじめに

この Howto では、Thread 対応の BT/TH オプションモジュールを Armadillo-640 に装着して、Matter over Thread 対応家電を操作できるようにするまでの手順を説明します。 2023年9月12日に、Apple 社が iPhone15 の上位機種で Thread 対応を発表しました。 また、北米でのみ販売されていた Nanoleaf 社の Matter over Thread 対応のスマート電球が、その少し前に日本国内でも販売開始されました。 Matter over Thread 対応家電製品が、これから増えていきそうです。

この Howto は、Linux の CUI シェル操作に慣れた方を対象読者として想定しており、マニュアルの ログイン までの手順は、迷わずにできるものと前提しています。

目次

Matter over Thread でできること

Matter は、Connectivity Standards Alliance(CSA)が策定したスマートホームのための標準規格です。 その規格に適合することで、USB のように、異なるメーカーの製品同士を相互に接続でき、メーカーを問わない相互運用性が保証されます。 Matter は、従来からあるスマホアプリ型のスマートホーム用のサービスと違い、クラウドサービスに依存せず、宅内のネットワークだけで接続を完結できること、および、デバイス間の通信のセキュリティが確保されていることから、スマートホームのための規格として期待されています。

Matter の接続に用いる無線通信では、Thread の他に WiFi がサポートされています。WiFi 接続の Matter 対応デバイスが先に製品化され、2023年9月時点では、WiFi 接続の製品の方が多く販売されているようです。当社のブログでも、Matter over WiFi デバイスを Armadillo から操作する内容を、2023年2月に公開しています:

Matter over Thread

Thread は、2015年に 1.0 版の規格が発表された低消費電力型のメッシュネットワーク技術で、IoT 製品を意識して設計された無線通信プロトコルです。 Matter が使用しているのは、Thread の 1.3 版です。 Thread 通信するデバイスは、デバイス同士がメッシュネットワークを自己形成しますので、電波が互いに直接届かない場所のデバイス同士も通信できるという利点があります。

Matter over Thread に対応した Matter コントローラー製品を、Apple、Google、Amazon 各社が既に販売しています。 Apple の HomeKit、Google の Google Home、Amazon の Alexa Smart Home など、各社のスマートホームシステムが、それぞれ Matter 対応しています。 Matter 対応製品は、どれか一つだけのスマートホームシステムに縛り付けられることなく、複数のスマートホームシステムで同時に利用できるのが特徴です。 Armadillo-640 で Matter コントローラー機能を動作させる場合も、それらのスマートホームシステムと同時に利用できる、というわけです。

この Howto のシステム構成

システム構成を示す図です:

図に示したシステム構成要素を、以下に説明します。

  • Thread ボーダールーター (otbr)

    Thread ネットワークを作成して Thread 対応デバイスと接続し、接続した Thread デバイスと、有線 LAN や無線 LAN 上との間での IPv6 通信を仲介します。 Thread のオープンソース実装である OpenThread の一部としてリリースされている、OpenThread Border Router を Armadillo-640 上のコンテナで動作させます。

    OpenThread Border Router は、Thread プロトコルの MAC 層より上位の実装を内包しており、MAC 層の実装を持つ Thread 通信モジュールを使用して Thread 通信を行います。 ここで、現在 BT/TH オプションモジュール用に提供している Thread ファームウェアは、Thread プロトコルの実装を全て内包した NCP (Network Co-Processor)型であり、OpenThread Border Router と互換性がありません。 実装している Thread プロトコルのバージョンも、Matter が必要とする 1.3 よりも古い版です。 そのため、この Howto で提供する、RCP (Radio Co-Processor)型の Thread ファームウェアを、 BT/TH オプションモジュールに書き込んで使います。

  • Matter コントローラー (chip-tool)

    Matter デバイスを、スマートホームシステムのネットワーク(Matter の用語では Fabric)に登録・参加させる役割と、Matter デバイスを操作する役割を担います。 Matter SDK に収録されている CHIP Tool (chip-tool) を、これも Armadillo-640 上のコンテナで動作させます。

    Matter コントローラーが、Matter デバイスを Fabric に登録・参加させる動作(これを Commissioning(コミッショニング) と呼びます)では、BLE (Bluetooth Low Energy) 通信を使います。 このことは、Matter の無線通信に WiFi を使うデバイスでも Thread を使うデバイスでも同じです。 Comissioning 動作のために BLE 通信モジュールが必要ですので、BT/TH オプションモジュールの WLAN コンボ対応を装着する場合は、WLAN コンボチップの BT 機能を使用します。 WLAN コンボ無しの BT/TH オプションモジュールを使用する場合は、別途、BLE 対応の Bluetooth ドングルが必要です。

  • Matter over Thread 対応デバイス (Matter Device)

    この Howto を作成する際に、Matter over Thread 対応デバイスとして動作確認に使用したのは、Nanoleaf 社のスマート電球です。 Howto 作成時点で入手可能だった Matter over Thread 対応家電が、他に見当たらなかったのが選定理由ですが、今後登場するであろう他社のスマート電球やスマート照明であっても、Matter デバイスとして同じ振る舞いをするはずです。 したがって、Matter コントローラーの操作手順は、製品を違えても変わりません。

この Howto の前提事項/制限

  • コミッショニングする Matter over Thread デバイスは、他のスマートホームネットワークに登録されていない状態でなければいけません。
  • Thread ボーダールーターが作成した Thread ネットワークに Matter over Thread デバイスを参加させる動作は、デバイス販売元が提供しているスマホアプリの Matter コントローラーなど、chip-tool 以外の Matter コントローラーで行うことは、できません。

この後の説明の流れ

以上が、Howto の手順を始めるにあたっての説明です。 この後は、セットアップに必要なハードウェアとソフトウェアが何かを示し、Thread ボーダールーターと Matter コントローラーの構築手順を述べます。 そして、Matter over Thread を BLE 経由でコミッショニングして操作する手順を述べます。

Armadillo-640 のセットアップに必要なもの

ハードウェア

Armadillo-640 本体
Thread ボーダールーターと Matter コントローラー(chip-tool)を動作させます。
BT/TH オプションモジュール
Thread ボーダールーターが使用する通信モジュールを搭載しています。 WLAN コンボ対応の BT/TH オプションモジュールであれば、Matter コントローラーが Matter デバイスをコミッショニングする際の BLE 通信にも利用できます。 この Howto では扱いませんが、WLAN コンボ対応の BT/TH オプションモジュールは、冒頭で紹介したブログと同様、WiFi 接続の Matter デバイスと接続して操作する際にも利用可能です。
BLE 対応 Bluetooth ドングル(BT/TH オプションモジュールが WLAN コンボ無しの場合)
WLAN コンボ無しの BT/TH オプションモジュールを Armadillo-640 に装着して使う場合は、Matter デバイスをコミッショニングするための BLE 通信モジュールを別途用意しなければいけません。
作業用 PC
Armadillo にログインして CUI シェル操作を行なったり、Thread ボーダールーターの Web UI 画面をブラウザで表示して操作するのに使用します。 Armadillo と作業用 PC の接続は、マニュアルのArmadilloと開発用PCを接続を参照してください。
シリアルクロスケーブルと USB-RS232C 変換ケーブル
Armadillo-640 に BT/TH オプションモジュールを装着すると、Armadillo-640 ベーシックモデル 開発セットに付属するUSBシリアル変換アダプタを接続することができません。 そのため、Armadillo-640 の CON3 にシリアルクロスケーブルを接続してシリアルコンソールを利用します。 詳細は、マニュアルのシリアルコンソールの使用方法の「CON3をシリアルコンソールとして使用する場合の接続例」をごらんください。 シリアルクロスケーブルに USB-RS232C 変換ケーブルを接続して、作業用 PC の USB ポートに接続してください。
スマートフォン
Matter 対応デバイスの QR コードを読み取るのに使います。スマートフォンのカメラで読み取った QR コードの内容("MT:" で始まる文字列です)を、chip-tool で解析すると、そのデバイスをコミッショニングするための Setup Pin Code と discriminator を取り出せます。

ソフトウェア

Armadillo Base OS
Thread ボーダールーターのコンテナと Matter コントローラー(chip-tool)のコンテナを動かすのに必要な、Armadillo の標準 OS です。 2023年9月時点では、出荷時に Armadillo-640 が搭載している標準ソフトウェアは、Linux 4.14 + Debian GNU/Linux 10 (buster) です。 Armadillo Base OS へ切り替えるために、後述する手順で、Armadillo Base OS のインストールディスクかブートディスクを作成してください。
Matter 用 Thread ファームウェア
この Howto のシステム構成で述べた、RCP 型の Thread ファームウェアです。 RCP 型の Thread ファームウェアを書き込むためのコンテナイメージを、この Howto 用に作成しました。
OpenThread Border Router (otbr) コンテナ
otbr は、OpenThread の一部としてリリースされている、Threaad ボーダールーターのオープンソース実装です。 otbr を格納したコンテナイメージが提供されていますので、それをダウンロードして使用します。
Matter chip-tool + bluez コンテナ
Matter コントローラー(chip-tool)と、Matter デバイスのコミッショニングで使用する BLE 通信用の bluez パッケージを格納したコンテナです。 以下で述べる手順では、この Howto 用に作成したコンテナイメージをダウンロードして使用します。

セットアップ手順

Armadillo-640 と BT/TH オプションモジュール

Armadillo Base OS をインストールする

Armadillo-640 に Armadillo Base OS をインストールするには、インストールディスクイメージをダウンロードして、インストールディスクを作成します。 ただし、以下で述べるように、シリアルコンソールのシリアルポートを UART3 に切り替える必要があるため、「Armadillo Base OS インストールディスクイメージ(UART3コンソール)」をダウンロードしてお使いください。 インストールディスクの作成手順は、マニュアルの初期化インストールディスクの作成をご覧ください。 作成したインストールディスクを使って、Armadillo-640 の eMMC を初期化する手順は、マニュアルのインストールディスクを使用するに記載しています。

Armadillo-640 の eMMC を初期化せず、内容を残したい場合は、microSD カードで Armadillo Base OS のブートディスクを作成して、SD ブートしてください。 ブートディスクの作成手順と SD ブートの手順は、マニュアルのブートディスクの作成SDブートの実行に記載しています。

シリアルポートを切り替える

BT/TH オプションモジュールを取り付ける前に、コンソールを CON9 (ttymxc0; UART1) から CON3 (ttymxc2; UART3) に移動します。 この手順は、マニュアルのBT を使用する準備をご覧ください。 コンソールを CON3 に移動したら、作業用 PC との接続を、USBシリアル変換アダプタからシリアルクロスケーブルと USB-RS232C 変換ケーブルに切り替えて下さい。

BT/TH オプションモジュールを取り付ける

マニュアルのオプションボードの組み立てを参考にして、BT/TH オプションモジュールを Armadillo-640 の CON9 に取り付けてください。

Matter 用 Thread ファームウェアを BT/TH オプションモジュールに書き込む

Matter 用 Thread ファームウェアを書き込む手順は、マニュアルの使用方法に記載しているものと同様です。 使用するコンテナイメージが違いますので、マニュアルに記載しているコマンドの並びのうち、curl でダウンロードする URL を https://download.atmark-techno.com/sample/a640-matter-howto/firmware-at-thread-rcp-writer.tar に変えてください。さらに、コンテナの名前を localhost/firmware-at-thread-rcp-writer に変えてください。 それ以外は同じです。

OpenThread Border Router (otbr) コンテナを作成する

otbr のコンテナイメージをロードする

otbr のコンテナイメージは、Docker Hub で公開されている nrfconnect/otbr を使用します。 Armadillo にログインした後、以下のコマンドを実行すると、otrb のコンテナイメージがロードされます。

[armadillo ~]# abos-ctrl podman-storage --disk
[armadillo ~]# podman pull docker.io/nrfconnect/otbr:9185bda
[armadillo ~]# abos-ctrl podman-storage --tmpfs

otbr のコンテナを作成する

ロードした otbr コンテナのイメージからコンテナを作成して起動するには、次のコマンドを実行してください。 この手順は、Nordic Semiconductor 社の nRF Connect SDK オンラインドキュメントの、Running OTBR using Dockerを参考にしています。 OpenThread のサイトにある、オリジナルの otbr のドキュメントは、こちらです。

以下のコマンドで、参考にしたドキュメントと違うのは、avahi-daemon サービスの停止と、IPv6 の accept_ra に関する設定です。 avahi-daemon サービスを停止するのは、otbr コンテナ内でも avahi-daemon が動作するため、それとの競合を避けるためです。 Armadillo Base OS で直接動作している方の avahi-daemon を停止してください。 コミッショニング時に、Matter デバイスが Thread ボーダールーターに関する DNS-SD のクエリを Thread ネットワークに送出しますが、そのクエリに応答できるよう、otbr コンテナ内で動く方の avahi-daemon を活かす必要があるのです。

[armadillo ~]# rc-service avahi-daemon stop
[armadillo ~]# modprobe ip6table_filter
[armadillo ~]# sysctl net.ipv6.conf.eth0.accept_ra=2
[armadillo ~]# sysctl net.ipv6.conf.eth0.accept_ra_rt_info_max_plen=128
[armadillo ~]# podman network create --ipv6 --subnet fd11:db8:1::/64 -o com.docker.network.bridge.name=otbr0 otbr
[armadillo ~]# podman run -d --privileged --name otbr --net otbr -p 8080:80 \
--sysctl=net.ipv6.conf.all.disable_ipv6=0 --sysctl=net.ipv4.conf.all.forwarding=1 --sysctl=net.ipv6.conf.all.forwarding=1 \
--volume /dev/ttyACM0:/dev/radio nrfconnect/otbr:9185bda --radio-url spinel+hdlc+uart:///dev/radio?uart-baudrate=1000000

上の手順では、IPv6 のサブネットを指定してコンテナのネットワークデバイスを作成し、それをネットワークインタフェースに割り当てたコンテナを作成します。 /dev/ttyACM0 は、BT/TH オプションモジュールに搭載されている EYSKBNZWB に対応するデバイス名です。 otbr のドキュメントに記載されている例と違い、podman run コマンドに --rm オプションを指定していません。 そのため、コンテナを終了してもコンテナが使用したストレージ領域が残り、コンテナが消えずに Exit 状態で残ります。 ただし、Armadillo Base OS の場合は、起動し直すとコンテナが消えます。これは、コンテナのストレージ領域が tmpfs 上にあるからです。 詳細は、マニュアルのイメージを eMMC に保存するに記載している「abos-ctrl podman-storage」の説明をご覧になってみてください。 Armadillo を起動した時に、このコンテナを自動的に作成して起動するには、マニュアルのコンテナ起動設定ファイルを作成するを参考にしてください。 起動した otbr コンテナを終了するには、podman stop otbr を実行してください。

Matter chip-tool + bluez コンテナを作成する

chip-tool + bluez コンテナイメージをロードする

ビルド済みの chip-tool と bluez パッケージをインストール済みのコンテナイメージを、https://download.atmark-techno.com/sample/a640-matter-howto/debian_bluez_1.0.1.tar からダウンロードしてお使いください。 以下のコマンドを実行すると、chip-tool + bluez コンテナのイメージがロードされます。

[armadillo ~]# cd /var/app/volumes
[armadillo /var/app/volumes]# wget https://download.atmark-techno.com/sample/a640-matter-howto/debian_bluez_1.0.1.tar
[armadillo /var/app/volumes]# abos-ctrl podman-storage --disk
[armadillo /var/app/volumes]# podman load -i debian_bluez_1.0.1.tar
[armadillo /var/app/volumes]# rm debian_bluez_1.0.1.tar
[armadillo /var/app/volumes]# abos-ctrl podman-storage --tmpfs

このコンテナイメージに格納している chip-tool は、この Howto を作成した時点の最新ソースをビルドしたものです。 今後、chip-tool のソースが更新されても、それに合わせてコンテナイメージを更新することはありません。 ご自分で chip-tool をビルドしたい方は、付録のchip-tool のビルド手順に記した手順を参考にしてください。

chip-tool + bluez コンテナを作成する

ロードした chip-tool + bluez コンテナのイメージからコンテナを作成して起動するには、次のコマンドを実行してください。

[armadillo ~]# podman run --name debian \
--net host --cap-add=NET_ADMIN \
-d debian_bluez:1.0.1

起動したコンテナを終了するには、podman stop debian を実行してください。 この後で説明する、コミッショニングや Matter デバイスの操作手順では、コンテナ上で CUI シェル(bash)を起動して、 CUI シェルで chip-tool を実行します。

Matter over Thread デバイスをコミッショニングする

作成済みのコンテナを使って、Matter over Thread 対応デバイスをコミッショニングするまでの手順を述べます。 大まかな手順は、次の通りです:

  1. Thread ボーダールーターで Thread ネットワークを作成して、Thread ネットワークの識別情報(dataset)を取得する。
  2. Matter デバイス(Matter over Threaad 対応デバイス)の本体や、本体に同梱された紙に印刷された QR コードを読み取る。
  3. QR コードを読み取った内容を chip-tool で解析して、Matter デバイスの BLE 接続情報を取り出す。
  4. Thread ネットワークの識別情報と Matter デバイスの BLE 接続情報を引数にして、chip-tool のペアリングコマンドを実行する。

以下に、これらの手順の詳細を示します。

OpenThread Border Router (otbr) コンテナを起動する

起動前に必要な設定を行う(コンテナ作成後に再起動した場合)
この前までの、コンテナ作成までの手順を行った後、Armadillo Base OS を reboot コマンドで再起動したり、shutdown コマンドでシャットダウンして電源を入れなおしたりしていなければ、この設定は不要です。
otbr コンテナを起動する前に、次のコマンドを実行してください。otbr のコンテナを作成するで、podman run の前に実行したのと同じコマンドです。
[armadillo ~]# rc-service avahi-daemon stop
[armadillo ~]# modprobe ip6table_filter
[armadillo ~]# sysctl net.ipv6.conf.eth0.accept_ra=2
[armadillo ~]# sysctl net.ipv6.conf.eth0.accept_ra_rt_info_max_plen=128
[armadillo ~]# podman network create --ipv6 --subnet fd11:db8:1::/64 -o com.docker.network.bridge.name=otbr0 otbr

otbr コンテナ用のコンテナ起動設定ファイルを作成して、これらのコマンドをコンテナ起動設定ファイルに記載していれば、コンテナの自動起動時に、これらのコマンドも自動的に実行されます。

コンテナを起動する(コンテナ作成後に再起動した場合)
次のコマンドを実行して、otbr コンテナを作成・起動してください。
[armadillo ~]# podman run -d --privileged --name otbr --net otbr -p 8080:80 \
--sysctl=net.ipv6.conf.all.disable_ipv6=0 --sysctl=net.ipv4.conf.all.forwarding=1 --sysctl=net.ipv6.conf.all.forwarding=1 \
--volume /dev/ttyACM0:/dev/radio nrfconnect/otbr:9185bda --radio-url spinel+hdlc+uart:///dev/radio?uart-baudrate=1000000

コンテナ作成後に Armadillo Base OS を起動し直しておらず、さらに、otbr のコンテナを作成するで述べた手順で、podman stop otbr を実行していなけければ、otbr は既に動作中です。podman stop otbr を実行した場合は、podman start otbr を実行して otbr コンテナを起動してください。 otbr コンテナが起動したら、次のコマンドを実行して、Thread ボーダールーターの動作が開始していることを確認してください。

[armadillo ~]# podman exec -it otbr sh -c "ot-ctl state"

ot-ctl がエラーする場合は、数秒待ってから再度実行してみてください。

IPv6 ルーティング設定を追加する
otbr コンテナを起動したら、次のコマンドを実行して、Thread ネットワークからの IPv6 パケットを otbr コンテナへ渡すためのルーティング設定を行ってください。
[armadillo ~]# ip -6 route add fd11:22::/64 dev otbr0 via fd11:db8:1::2

ここで、fd11:22:: は、Thread ボーダールーターが Thread ネットワークを作成する時に割り当てる、デフォルトのアドレスプレフィクスです。

Thread ネットワークを作成する
otbr の Web GUI を使って、Thread ネットワークを作成してください。Armadillo の IPv4 アドレスを ip address コマンドで確認して、そのアドレスのポート 8080 を Web ブラウザで開いてください(例: http://192.168.1.3:8080)。 otbr の Web GUI 画面を Web ブラウザで開いたら、表示された画面のサイドバーから "Form" を選んで Form 画面に変え、その画面の "Form" ボタンをクリックすると、デフォルトの設定値で Thread ネットワークが作成されます。 詳細は、OpenThread の otbr ガイドの Web GUI にある、Form a Thread network をご覧ください。 Web GUI を使わずに、ot-ctl を使って CLI で設定する手順は、otbr についての Codelab の Form a Thread network に記載されています。
Thread ネットワークの dataset を取得する
次のコマンドを実行して、作成した Thread ネットワークの dataset を取得してください。 この dataset は、コミッショニングで使用します。
[armadillo ~]# podman exec -it otbr sh -c "ot-ctl dataset active -x"

出力された dataset の内容を、テキストエディタなどにコピーしておいてください。 なお、この dataset の値は、Thread ネットワークの名前などのパラメータを同じにしても、作成するたびに違う値になります。

Matter chip-tool + bluez コンテナを起動する

コンテナを起動する(コンテナ作成後に再起動した場合)
次のコマンドを実行して、chip-tool コンテナを作成・起動してください。
[armadillo ~]# podman run --name debian \
--net host --cap-add=NET_ADMIN \
-d debian_bluez:1.0.1 /bin/bash

chip-tool コンテナが起動すると、コンテナ内で bluetoothd が自動起動します。 そのため、bluez の bluetoothctl コマンドを使った Bluetooth デバイスの制御ができますし、chip-tool がコミッショニング時に使用する BLE 通信も可能となっています。

コンテナ内でシェルを起動する
chip-tool を対話的に実行するために、コンテナ内でシェルを起動します。次のコマンドを実行してください。
[armadillo ~]# podman exec -it debian /bin/bash

Matter over Thread デバイスの QR コードから接続情報を取り出す

QR コードを読み取る
Matter デバイス(Matter over Threaad 対応デバイス)の本体や、本体に同梱された紙に印刷された QR コードを、スマートフォンで読み取ってください。 読み取った内容("MT:" で始まる文字列です)を、スマートフォンから作業用 PC にメール送信するなどして渡してください。
chip-tool を使って接続情報を取り出す
chip-tool コンテナ内で起動したシェルで、chip-tool の payload parse-setup-payload コマンドを実行します。このコマンドの引数に、スマートフォンで読み取った QR コードの内容を渡すと、それをデコードして得られた情報を chip-tool が出力します。
[container ~]# cd /matter
[container /matter]# ./chip-tool payload parse-setup-payload <QR コード内容の文字列>

たとえば、Matter SDK の Matter デバイスサンプルアプリケーションが出力するテスト用の QR コード内容(MT:6FCJ142C00KA0648G00)の場合、次のような出力になります:

[container /matter]# ./chip-tool payload parse-setup-payload MT:6FCJ142C00KA0648G00
[1695633025.627722][5010:5010] CHIP:SPL: Parsing base38Representation: MT:6FCJ142C00KA0648G00
[1695633025.637556][5010:5010] CHIP:SPL: Version:             0
[1695633025.637613][5010:5010] CHIP:SPL: VendorID:            65521
[1695633025.637625][5010:5010] CHIP:SPL: ProductID:           32773
[1695633025.637635][5010:5010] CHIP:SPL: Custom flow:         0    (STANDARD)
[1695633025.637647][5010:5010] CHIP:SPL: Discovery Bitmask:   0x02 (BLE)
[1695633025.637687][5010:5010] CHIP:SPL: Long discriminator:  3840   (0xf00)
[1695633025.637698][5010:5010] CHIP:SPL: Passcode:            20202021

chip-tool が出力した内容のうち、'Passcode' と 'Long discriminator' の内容を、コミッショニングで使用します。それぞれ、chip-tool の pairing ble-thread コマンドに渡す pin_code と discriminator です。

コミッショニングを実行する

Matter over Thread デバイスの電源を入れ、BLE アドバタイズを開始するのを待つ
Matter over Thread デバイスの電源を入れると、電源が入ってから15分間、コミッショニング用の BLE アドバタイズを行います。このアドバタイズを受信できていることを、コミッショニングする前に bluetoothctl のスキャン機能で確認してみて下さい。
[container ~]# bluetoothctl
> menu scan
> transport le
> back
> exit
[container ~]# bluetoothctl scan on
...
Ctrl-C

bluetoothctl scan on でスキャンを実施すると、受信した BLE アドバタイズパケットの概要が表示されます。'Matter xx' というような名前のアドバタイズパケットが見えたら、Matter デバイスから受信できてます。 Matter デバイスの BLE アドバタイズパケットを受信確認できたら、Ctr-C でスキャン動作を停止してください。

Matter chip-tool を使ってコミッショニングする
chip-tool を使って Matter over Thread 対応デバイスをコミッショニングをするには、chip-tool の pairing ble-thread コマンドを使います。 次のコマンドを実行してください:
[container /matter]# ./chip-tool pairing ble-thread <node_id_> hex:<Thread ネットワークの dataset> <pin_code> <discriminator> --paa-trust-store-path /matter/paa-root-certs

ここで、'node_id' は、Matter デバイスに割り当てる ID で、任意の数値です(例: 1, 100, 123)。

このコマンドがエラーなく実行完了すると、コミッショニング成功です。この後に述べる手順で、Thread ネットワーク経由で Matter デバイスを操作できます。 Matter デバイスは、コミッショニングした内容、つまり、自身を登録した Matter の Fabric 情報を記録しており、電源を切っても保持します。 Matter デバイスの電源を切り、再び入れた後も、同じように chip-tool で操作できるのです。

さて、上のコマンドで、--paa-trust-store-path オプション引数で指定しているのは、Matter デバイスの CA 証明書群を配置したディレクトリのパスです。 認証された Matter デバイスは、自身の正当性を証明するための証明書を内蔵しており、それを、コミッショニングの際に Matter コントローラーからの要求に応じて渡します。 Matter コントローラーは、コミッショニング相手の Matter デバイスが提示した証明書が参照する CA(Certificate Authority; 認証局) が、認定済み Matter デバイスのベンダーが取得している CA 証明書群のどれかに対応するのかどうかをチェックして、対応するものが存在しない場合は、不正なデバイスと判定します。 Matter コントローラーは、不正なデバイスと判定されるデバイスをコミッショニングしません。 この仕組みにより、スマートホームネットワークに不正なデバイスが侵入することを防ぐのです。 Matter デバイスの CA 証明書群を取得する手順は、付録に記載しています。

Matter over Thread デバイスを Armadillo で操作する

以下に、スマート電球の三種類の操作例を示します。

スマート電球のオン/オフを切り替える
次のコマンドを実行すると、実行するたびに、スマート電球の点灯・消灯状態が入れ替わります。
[container /matter]# ./chip-tool onoff toggle <node_id> 1
スマート電球を調光する
levelcontrol move-to-level コマンドを実行すると、スマート電球の照度が変わります。 照度の最大値は 254、最小値は 0 です。
[container /matter]# ./chip-tool levelcontrol move-to-level <level> <transition_time> 0 0 <node_id> 1

たとえば、照度を 10 に変える動作を2秒かけて行わせる場合は、次のコマンドを実行して下さい。

[container /matter]# ./chip-tool levelcontrol move-to-level 10 2 0 0 <node_id> 1
スマート電球を調色する
colorcontrol move-to-color コマンドを実行すると、スマート電球の発光色が変わります。色を指定するのは <ColorX> と <ColorY> です。
[container /home/atmark/work/matter]# ./chip-tool colorcontrol move-to-color <ColorX> <ColorY> <TransitionTime> <OptionsMask> <OptionsOverride> <node_id> <endpoint-id-ignored-for-group-command>

たとえば、次のコマンドを実行すると、スマート電球の照明が赤っぽい色に変わります:

[container /matter]# ./chip-tool colorcontrol move-to-color 0x5000 0x4000 0 0 0 <node_id> 1

Matter over Thread デバイスのペアリングを解除する

Matter デバイスをコミッショニングして Matter コントローラーにペアリングした後、ペアリングを解除するには、chip-tool の pairing unpair コマンドを使います。

[container /matter]# ./chip-tool pairing unpair <node_id>

以上で、この Howto のテーマである、Armadillo-640 を Thread 対応 Matter コントローラーとして使用する手順の説明を終わります。

chip-tool を、Armadillo にログインして直接操作するのではなく、chip-tool と連携する Web GUI を実装して宅内から遠隔操作できるようにすれば、便利に使えるかも知れません。 また、湿度センサーや温度センサーの計測値に連動して Matter デバイスを制御することも、chip-tool と連携するソフトウェアを実装することで可能になるでしょう。 Armadillo を、Matter 対応家電で構成されたスマートホームシステムのコントローラーとして利用することは、不可能ではありません。 ただし、留意しなければならないことがありますので、次に説明します。

Matter ロゴと認定製品について

この Howto では、Matter SDK に収録された chip-tool を Matter コントローラーとして使用しました。 Matter SDK は Apache 2.0 ライセンスで公開されており、そのライセンスのもとで利用できます。 しかし、Matter SDK を使用して実装したソフトウェアやデバイスで Matter のロゴを利用できるわけでは、ありません。 Matter のロゴを使用するためには、CSA に加入したうえで Matter の認証を得なければいけません。詳細は、Matter SDK の NOTICE をご覧ください。

付録

Matter chip-tool のドキュメント

https://project-chip.github.io/connectedhomeip-doc/guides/chip_tool_guide.html

chip-tool の Android アプリケーションのビルド手順

https://project-chip.github.io/connectedhomeip-doc/guides/android_building.html

Matter 仕様書のダウンロードページ

https://csa-iot.org/developer-resource/specifications-download-request/

chip-tool のビルド手順

Armadillo の開発環境である ATDE を使って、chip-tool を Armadillo-640 用にクロスビルドする手順を以下に述べます。 ここでは、ATDE のバージョン 9 を使う前提です。 以下の手順で示すコマンドは、ATDE にログインして行ってください。

ATDE の仮想ディスクの容量を拡張する
ATDE の仮想ディスクの空き容量が不足するため、仮想ディスクのサイズを 25GB 以上増加させてください。 初期化直後の状態であれば、60GB に増やせば十分です。
必要なパッケージをインストールする
以下のコマンドを実行して、必要なパッケージをインストールしてください。
[ATDE ~]$ sudo dpkg --add-architecture armhf
[ATDE ~]$ sudo apt-get install --no-install-recommends -y gnupg2
[ATDE ~]$ sudo apt-get update
[ATDE ~]$ sudo apt-get install --no-install-recommends -y ninja-build git-lfs ruby ruby-dev gdb-multiarch nlohmann-json3-dev \
    libdbus-glib-1-dev libgirepository1.0-dev
[ATDE ~]$ sudo apt-get install --no-install-recommends -y libavahi-client-dev:armhf libssl-dev:armhf libsystemd-dev:armhf \
    libwrap0-dev:armhf uthash-dev:armhf libsqlite3-dev:armhf libedit-dev:armhf libyaml-cpp0.6:armhf libmosquitto-dev:armhf \
    libreadline-dev:armhf libncurses5-dev:armhf libncursesw5-dev:armhf libyaml-cpp-dev:armhf libboost-atomic-dev:armhf \
    libboost-chrono-dev:armhf libboost-filesystem-dev:armhf libboost-regex-dev:armhf libboost-program-options-dev:armhf \
    libboost-serialization-dev:armhf libboost-system-dev:armhf libboost-thread-dev:armhf libboost-log-dev:armhf \
    procps:armhf libmbedtls-dev:armhf libglib2.0-dev:armhf crossbuild-essential-armhf

[ATDE ~]$ sudo apt update && sudo apt upgrade
[ATDE ~]$ sudo apt autoremove

必要なパッケージをインストールしたら、reboot コマンドで ATDE を再起動してください。

[ATDE ~]$ sudo reboot
追加で必要なツールをインストールする
apt ではインストールできないツールを、次の手順でインストールしてください。
[ATDE ~]$ curl -L https://repo.anaconda.com/miniconda/Miniconda3-py39_4.12.0-Linux-x86_64.sh --output /tmp/Miniconda.sh
[ATDE ~]$ echo 78f39f9bae971ec1ae7969f0516017f2413f17796670f7040725dd83fcff5689 /tmp/Miniconda.sh > /tmp/Miniconda.sh.sha256
[ATDE ~]$ sha256sum -c /tmp/Miniconda.sh.sha256
[ATDE ~]$ sudo  bash /tmp/Miniconda.sh -b -p /usr/local/miniconda
[ATDE ~]$ sudo /usr/local/miniconda/condabin/conda init bash
[ATDE ~]$ exit
※ ATDE で新しい端末を開いて、以下のコマンドを実行してください。
[ATDE ~]$ sudo ln -sf /usr/local/miniconda/bin/python3.9 /usr/bin/python3
[ATDE ~]$ sudo ln -sf /usr/local/miniconda/bin/pip3 /usr/bin/pip3

[ATDE ~]$ export RUST_VERSION=1.67.0
[ATDE ~]$ export RUSTUP_HOME=/opt/rustup-home
[ATDE ~]$ export CARGO_HOME=/opt/cargo-home
[ATDE ~]$ export RUST_TRIPLES="$RUST_TRIPLES armv7-unknown-linux-gnueabihf"
[ATDE ~]$ su
※ここから先は、ATDE の root ユーザーのパスワードを入力して root ユーザーになり、root 権限で実行してください。
# curl https://sh.rustup.rs -sSf --output /tmp/sh.rustup.rs
# cd /tmp && chmod +x sh.rustup.rs
# ./sh.rustup.rs -y --profile minimal --target ${RUST_TRIPLES} --default-toolchain ${RUST_VERSION}
# rm /tmp/sh.rustup.rs
# /opt/cargo-home/bin/cargo install cargo2junit --locked
# /opt/cargo-home/bin/cargo install cargo-deb --git https://github.com/kornelski/cargo-deb.git --branch main
# chmod -R a+rw ${RUSTUP_HOME} ${CARGO_HOME}
# find ${RUSTUP_HOME} ${CARGO_HOME} -type d -exec chmod a+x {} \;
# exit
※この後は、再び一般ユーザー(atmark)で実行してください。
[ATDE ~]$ export  PATH="${CARGO_HOME}/bin:${PATH}"

[ATDE ~]$ curl -L https://github.com/Kitware/CMake/releases/download/v3.19.2/cmake-3.19.2-Linux-x86_64.sh --output /tmp/cmake-3.19.2-Linux-x86_64.sh
[ATDE ~]$ echo 2fc84c1bd5a5fa8850426905a76147fbf897cf67ef324b009bcdb7eceafa9662 /tmp/cmake-3.19.2-Linux-x86_64.sh > /tmp/cmake-3.19.2-Linux-x86_64.sh.sha256
[ATDE ~]$ sha256sum -c /tmp/cmake-3.19.2-Linux-x86_64.sh.sha256
[ATDE ~]$ chmod +x /tmp/cmake*.sh
[ATDE ~]$ sudo /tmp/cmake*.sh --prefix=/usr/local --skip-license
[ATDE ~]$ rm /tmp/cmake*
chip-tool のクロスビルドに必要なライブラリ群をクロスビルドする
次のコマンドを実行してください。
[ATDE ~]$ cd && mkdir -p work/matter
[ATDE ~]$ cd work/matter
[ATDE ~/work/matter]$ git clone --depth 1 --branch external/matter-bridge-unstable https://github.com/SiliconLabs/UnifySDK.git --recursive ../uic-matter
[ATDE ~/work/matter]$ cd ../uic-matter
[ATDE ~/work/uic-matter]$ cmake -DCMAKE_INSTALL_PREFIX=$PWD/stage -GNinja -DCMAKE_TOOLCHAIN_FILE=../cmake/armhf_debian.cmake  -B build_unify_armhf/ -S components
[ATDE ~/work/uic-matter]$ cmake --build build_unify_armhf
[ATDE ~/work/uic-matter]$ cmake --install build_unify_armhf --prefix $PWD/stage
※クロスビルドしてできた armhf 用のライブラリやインクルードファイルを参照するための環境変数を設定します。
[ATDE ~/work/uic-matter]$ export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$PWD/stage/share/pkgconfig
[ATDE ~/work/uic-matter]$ export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/arm-linux-gnueabihf/pkgconfig
Matter SDK のリポジトリを取得して、SDK のビルド環境を構築する
次のコマンドを実行してください。
[ATDE ~/work/uic-matter]$ cd ../matter
[ATDE ~/work/matter]$ sudo apt-get install -y libavahi-client-dev python3-venv libcairo2-dev libreadline-dev
[ATDE ~/work/matter]$ git clone https://github.com/project-chip/connectedhomeip.git
※リポジトリを取得したら、Matter SDK のディレクトリに移動して、SDK 付属のスクリプトで環境構築します。
[ATDE ~/work/matter]$ cd connectedhomeip
[ATDE ~/work/matter/connectedhomeip]$ source scripts/activate.sh
※このスクリプトの実行には、数10分、場合によっては1時間以上かかります。

activate.sh を実行すると、Matter SDK のディレクトリ配下にツールチェーンが配置され、SDK のビルド用の仮想環境が構築されます。

chip-tool をクロスビルドする
次のコマンドを実行してください。
[ATDE ~/work/matter/connectedhomeip]$ cd examples/chip-tool
[ATDE ~/work/matter/connectedhomeip/examples/chip-tool]$ gn gen out/armhf --args='target_cpu="arm"'
[ATDE ~/work/matter/connectedhomeip/examples/chip-tool]$ ninja -C out/armhf

ビルドが終わると、out/armhf ディレクトリに chip-tool の実行ファイルが出現します。 USB メモリや scp を使って Armadillo にコピーしてください。 chip-tool の実行ファイルは、サイズが 100MB 程度と巨大ですので、コピーする時は、ルートファイルシステムではなく、Armadillo Base OS の /var/app/volumes 配下にコピーしてください。

Matter デバイスの CA 証明書群の取得手順

Matter SDK のディレクトリ(connectedhomeip)の直下にある credentials ディレクトリに収録されている fetch-paa-certs-from-dcl.py を使います。 以下のコマンドを実行してみてください:

[ATDE ~/work/matter]$ cd connectedhomeip
[ATDE ~/work/matter/connectedhomeip]$ python credentials/fetch-paa-certs-from-dcl.py --use-main-net-http

実行すると、connectedhomeip/paa-root-certs ディレクトリに証明書群がダウンロードされます。 これらを Armadillo にコピーして、コピーしたディレクトリのパスを chip-tool の pairing ble-thread コマンドの --paa-trust-store-path オプションで指定すればよいのです。 この手順については、こちらの Blog を参考にしました。有難うございます:

Remo nano で Matter をはじめよう!: https://engineering.nature.global/entry/blog-fes-2023-get-started-matter-with-nano