ブログ

Armadillo-IoT G4 で Matter デバイスの制御をしてみた

at_takumi.mizutani
2023年2月27日 10時37分

Matterは、Connectivity Standards Alliance(CSA)が策定したスマートホームの為の標準規格です。 本ブログでは、Armadillo-IoT G4 で、仮想的に構築した Matter デバイスを制御します。

本ブログの構成は以下のとおりです。

デモ構成

本ブログ記載のデモ構成は下図の通りです。

Matter で利用する通信方式としては Ethernet、Wi-Fi、Threadが対応していますが、今回はWi-Fi を利用しました。 最初の Matter デバイス検出、接続のステップでは BLE が利用され、その後の Matter デバイス制御のステップで Wi-Fi を利用します。

必要なもの

本ブログでは以下のものを使用します。

機器 説明
Armadillo-IoT G4(LTE+WLANモデル / WLANモデル) 一式 Matter 対応デバイスを制御するデバイス。Armadillo-IoT G4 本体、AC アダプタ、USB ケーブル、無線 LAN/BT 用外付けアンテナが必要です。
ESP32-DevKitC-32E 仮想的な Matter 対応照明デバイス として動作させるデバイス。ESP32-DevKitC-32E本体、USB ケーブルが必要です。
PC ESP32 上で動作させるアプリケーションをビルドに使用します。
LED 等 ESP32 から制御する照明として使用するLED。ブレッドボード、ジャンパケーブル、LED、抵抗が必要です。
無線 LAN ネットワーク環境 Armadillo-IoT G4 と ESP32 がネットワーク通信できるようにして下さい。
ソフトウェア バージョン情報等
G4 Linux カーネル v5.10.161-r0
debian コンテナ 11.6
connectedhomeip commit e64736c9c
ZAP v2023.02.25-nightly

ESP32 のビルドには Linux環境を使用しております。お使いのPCがWindowsの場合はATDE等を使用して下さい。 ATDEのセットアップ方法については、Armadillo-IoT ゲートウェイ G4 製品マニュアル「4.2.1. ATDEのセットアップ」をご確認下さい。

接続方法

ESP32-DevKitC と LED の接続方法は下図の通りです。 ここでは、GPIO5 に LED を接続しています。

ESP32 側の手順

ここでは、ESP32 を仮想的に "Matter 対応照明デバイス" として動作させるアプリケーションのビルドを行います。

  1. 必要パッケージを追加する
[PC ~]$ sudo apt update && sudo apt upgrade
[PC ~]$ sudo apt install git wget flex bison gperf python3 python3-pip python3-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0 generate-ninja
  1. ESP-IDF のリポジトリをクローンする
[PC ~]$ git clone https://github.com/espressif/esp-idf.git
  1. ESP-IDF をセットアップする
[PC ~]$ ./install.sh
[PC ~]$ source export.sh
  1. Matter のリポジトリをクローンする
[PC ~]$ git clone https://github.com/project-chip/connectedhomeip.git
[PC ~]$ cd connectedhomeip/
  1. Matter 環境をアクティブにする
[PC ~/connectedhomeip]$ source scripts/bootstrap.sh
[PC ~/connectedhomeip]$ source scripts/activate.sh
  1. デバイス構成の設定を行う
[PC ~/connectedhomeip]$ cd examples/lighting-app/esp32/
[PC ~/connectedhomeip/examples/lighting-app/esp32]$ idf.py set-target esp32
[PC ~/connectedhomeip/examples/lighting-app/esp32]$ idf.py menuconfig

menuconfigでは以下の設定を適用して下さい。

設定 説明
Demo ---> LED GPIO number 「接続方法」で LED を接続した GPIO 番号を設定します。
Demo ---> Eendezvous Mode Wi-Fi を選択します。
Component config ---> CHIP Device Layer ---> WiFi Station Options ---> Default WiFi SSID 接続する WiFi ネットワークの SSID を設定します。
Component config ---> CHIP Device Layer ---> WiFi Station Options ---> Default WiFi Password 接続する WiFi ネットワークのパスワードを設定します。
  1. サンプルアプリケーションをビルドする
[PC ~/connectedhomeip/examples/lighting-app/esp32]$ idf.py build
  1. サンプルアプリケーションを ESP32 に書き込む
[PC ~/connectedhomeip/examples/lighting-app/esp32]$ idf.py -p /dev/ttyUSB0 erase-flash
[PC ~/connectedhomeip/examples/lighting-app/esp32]$ idf.py -p /dev/ttyUSB0 flash monitor

Armadillo-IoT G4 側の手順

1. 環境構築

ここでは、Matter デバイスとの接続、制御を行うツール CHIP Tool のビルドを行います。

  1. 無線 LAN アクセスポイントに接続する
[armadillo ~]# nmcli device wifi connect [SSID] password [PASSWORD]
  1. コンテナを作成する
[armadillo ~]# vi /etc/atmark/containers/matter-ctrl.conf
set_image docker.io/debian:11.6
add_volumes /run:/run/dbus
set_network host
add_args --cap-add=NET_ADMIN
set_command sleep infinity
[armadillo ~]# abos-ctrl podman-storage --disk
[armadillo ~]# podman pull docker.io/debian:11.6
[armadillo ~]# podman_start matter-ctrl
[armadillo ~]# podman exec -ti matter-ctrl bash
  1. 必要パッケージを追加する
[container ~]# curl -sL https://deb.nodesource.com/setup_16.x | sudo bash -
[container ~]# apt update && apt upgrade
[container ~]# apt install bluez dbus git gcc g++ pkg-config libssl-dev libdbus-1-dev libglib2.0-dev libavahi-client-dev ninja-build python3-venv python3-dev python3-pip unzip libgirepository1.0-dev libcairo2-dev libreadline-dev wget nodejs
[container ~]# pip3 install click coloredlogs
  1. bluetoothd を起動する
[container ~]# dbus-daemon --system
[container ~]# bluetoothd &
  1. ZAPをインストールする
[container ~]# wget https://github.com/project-chip/zap/archive/refs/tags/v2023.02.25-nightly.tar.gz
[container ~]# tar xf v2023.02.25-nightly.tar.gz
[container ~]# cd zap-2023.02.25-nightly/
[container ~/zap-2023.02.25-nightly]# npm install
[container ~/zap-2023.02.25-nightly]# npm audit fix
[container ~/zap-2023.02.25-nightly]# export ZAP_DEVELOPMENT_PATH="~/zap-2023.02.25-nightly/"
  1. Matter のリポジトリをクローンする
[container ~/zap-2023.02.25-nightly]# cd ../
[container ~]# git clone https://github.com/project-chip/connectedhomeip.git
[container ~]# cd connectedhomeip/
[container ~/connectedhomeip]# git submodule update --init examples/common/QRCode/repo third_party/editline/repo third_party/jsoncpp/repo third_party/libwebsockets/repo third_party/nlassert/repo third_party/nlio/repo third_party/nlunit-test/repo third_party/pigweed/repo
  1. Matter 環境をアクティブにする
[container ~/connectedhomeip]# source scripts/bootstrap.sh
[container ~/connectedhomeip]# source scripts/activate.sh
  1. CHIP Tool のビルドを行う
[container ~/connectedhomeip]# ./scripts/build/build_examples.py --target linux-arm64-chip-tool-clang build
  1. コンテナの変更を保存する
[container ~/connectedhomeip]# exit
[armadillo ~]# podman commit matter-ctrl matter-ctrl:latest
[armadillo ~]# vi /etc/atmark/containers/matter-ctrl.conf
set_image matter-ctrl:latest    ★ ここを変更
add_volumes /run:/run/dbus
set_network host
add_args --cap-add=NET_ADMIN
set_command sleep infinity
[armadillo ~]# podman_start matter-ctrl
[armadillo ~]# podman exec -ti matter-ctrl bash

2. Matter デバイスと接続する

[container ~/connectedhomeip]# cd out/linux-arm64-chip-tool-clang/
[container ~/connectedhomeip/out/linux-arm64-chip-tool-clang]# ./chip-tool pairing ble-wifi <node_id> <ssid> <password> <pin_code> <discriminator>

各引数には以下の値を入れます。

引数名
node_id 任意の番号(例:1234)
ssid ESP32 の設定時と同様の SSID
password ESP32 の設定時と同様のパスワード
pin_code デフォルト値 :20202021
discriminator デフォルト値:3840

以下のメッセージが表示されれば接続成功です。

CHIP:TOO: Device commissioning completed with success

3. Matter デバイスを制御する

以下のコマンドを使用すると、照明の ON/OFF が切り替えられます。

[container ~/connectedhomeip/out/linux-arm64-chip-tool-clang]$ ./chip-tool onoff toggle <node_id> 1

照明の ON/OFF の切り替えに成功すると lighting-app 側に以下のようなログが出力されます。

I (236002) chip[ZCL]: Toggle ep1 on/off from state 0 to 1

また、切り替えた状態に応じて ESP32 に接続した LED の ON/OFF も切り替わります。

以下のコマンドを使用すると、照明の明るさを変更することが出来ます。

[container ~/connectedhomeip/out/linux-arm64-chip-tool-clang]$ ./chip-tool levelcontrol move-to-level <level> <transition_time> <option_mask> <option_override> <node_id> 1

各引数の説明は以下の通りです。

引数名 説明
level 照明の明るさ。0〜254で指定できます
transition_time 遷移時間
option_mask オプションマスク、0を指定
option_override オプションオーバーライド、0を指定
node_id 「2. Matter デバイスと接続する」で設定した値

照明の明るさの変更に成功すると lighting-app 側に以下のようなログが出力されます。

I (377792) chip[ZCL]: RX level-control: MOVE_TO_LEVEL 80  0 0 0
︙
I (377862) chip[ZCL]: Event: move from 1
I (377862) chip[ZCL]:  to 128
I (377862) chip[ZCL]: (diff +1)

また、設定した値に応じて ESP32 に接続した LED の明るさも変わります。