M1 Macでスマートホームの新標準「Matter」のビルド環境を構築してみた (※2023年1月21日更新)

# はじめに

スマートホームの新標準「Matter」のサンプルを動かしてみるために、M1 Macでビルド環境を構築してみました。(Ubuntu 20.04環境の事例が多いです)

https://github.com/project-chip/connectedhomeip

あとで分かったことですが、M5Stackで「Matter」のサンプルを動かすだけなら、ESP Web Toolsを使用してブラウザ(ChromeのWeb Serial)経由でインストールできます。

https://esphome.github.io/esp-web-tools/

https://kitazaki.github.io/matter-example-apps/

![chrome_web_serial_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/0c6eb4da-3076-d884-64c8-534fa948a15f.jpeg)

![chrome_web_serial_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/38d9ddc0-e63e-0f49-46b1-215d00ee7774.jpeg)

また、Espressifのホームページにもサンプルをダウンロード・インストールできるページがあることを教えていただきました。

https://docs.espressif.com/projects/esp-matter/en/main/esp32/

https://espressif.github.io/esp-launchpad/

![esp_launchpad.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/82763675-6925-590a-b503-e43ecb0fca70.jpeg)

# 環境準備

- MacBook Air (M1, 2020)
- macOS Monterey (12.6.1)
- ESP-IDF 4.4.3

ストレージ領域を25GBくらい消費します。

# 手順

## 1.ESP-IDFをインストールする

こちらはModdable SDKのビルド環境の構築でインストール済みでした。

https://qiita.com/kitazaki/items/15cba2f4622bf3682083

## 2. Matterのビルド環境を構築する

HOMEディレクトリにインストールする前提で説明します。
基本的には公式の手順とおりですが、出力されるエラーに対応する必要があります。

https://github.com/project-chip/connectedhomeip/blob/master/docs/guides/BUILDING.md

※ 2023年1月21日追記
ZAPツールをインストールする手順を追加しました。

```bash
$ cd
$ git clone --recurse-submodules https://github.com/project-chip/connectedhomeip.git
```

内容を更新する場合は以下のコマンドを実行します。

```bash
$ cd connectedhomeip
$ git submodule update --init
```

opensslとpkg-configをインストールします。

```bash
$ brew install openssl pkg-config
$ export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:"/opt/homebrew/opt/openssl@3/lib/pkgconfig"
```

環境変数PKG_CONFIG_PATHは、ターミナルを開く度に毎回実行するのが面倒なため、設定ファイルに追加します。
(zshの場合) ~/.zshrc、または、~/.zprofile

次にZAPツールをインストールします。
リリースページからバイナリファイル(zipファイル)をダウンロードし、任意のディレクトリに展開します。
環境変数ZAP_INSTALL_PATHで展開したディレクトリを指定します。

https://github.com/project-chip/zap/releases

例. v2023.01.19-nightlyビルド版をダウンロードする場合

```bash
$ cd
$ mkdir zap-mac && cd zap-mac
$ wget https://github.com/project-chip/zap/releases/download/v2023.01.19-nightly/zap-mac.zip
$ unzip zap-mac.zip
$ export ZAP_INSTALL_PATH="$HOME/zap-mac"
```

source ./scripts/bootstrap.shを実行します。
(20GBくらいのデータをダウンロードするため、かなり時間が掛かります)

```bash
$ cd
$ cd connectedhomeip
$ source ./scripts/bootstrap.sh
```

問題なく完了すれば、次回以降はsource ./scripts/activate.shを実行します。

```bash
$ source ./scripts/activate.sh

  WELCOME TO...

         █
         █
     ▄   █   ▄                                █     █
     ▀▀█████▀▀      ▄▀▀▀▄ ▄▀▀▀▄    ▄▀▀▀▀▄█  ▀▀█▀▀▀▀▀█▀▀   ▄▀▀▀▀▄    ▄▀▀
   ▀█▄       ▄█▀   █     █     █  █      █    █     █    █▄▄▄▄▄▄█  █   
     ▀█▄   ▄█▀     █     █     █  █      █    █     █    █         █   
  ▄██▀▀█   █▀▀██▄  █     █     █   ▀▄▄▄▄▀█    ▀▄▄   ▀▄▄   ▀▄▄▄▄▀   █   
 ▀▀    █   █    ▀▀

  ACTIVATOR! This sets your shell environment variables.

Activating environment (setting environment variables):

  Setting environment variables for CIPD package manager...done
  Setting environment variables for Python environment.....done
  Setting environment variables for pw packages............skipped
  Setting environment variables for Host tools.............done

Checking the environment:

20221128 00:33:26 WRN Current uname (21.6.0 Darwin Kernel Version 21.6.0: Thu Sep 29 20:13:46 PDT 2022; root:xnu-8020.240.7~1/RELEASE_ARM64_T8101 arm64) does not match Bootstrap uname (21.6.0 Darwin Kernel Version 21.6.0: Thu Sep 29 20:13:46 PDT 2022; root:xnu-8020.240.7~1/RELEASE_ARM64_T8101 arm64), you may need to rerun bootstrap on this system
20221128 00:33:26 INF Environment passes all checks!

Environment looks good, you are ready to go!

To reactivate this environment in the future, run this in your 
terminal:

  source ./activate.sh

To deactivate this environment, run this:

  deactivate

$
```

ターミナルを開く度に毎回実行するのが面倒な場合は、設定ファイルに追加します。
(zshの場合) ~/.zshrc、または、~/.zprofile

## 3.サンプルアプリケーションをビルドする

```bash
$ cd examples/all-clusters-minimal-app/esp32
```

デフォルトではESP32-DevKitCがターゲットになっているので、M5Stackへ切り替えますが、エラーが表示されます。

```bash
$ idf.py menuconfig
The following Python requirements are not satisfied:
idf-component-manager~=1.0
gdbgui==0.13.2.0
pygdbmi<=0.9.0.2
python-socketio<5
itsdangerous<2.1
kconfiglib==13.7.1
reedsolo>=1.5.3,<=1.5.4
bitstring>=3.1.6
construct==2.10.54
To install the missing packages, please run "/Users/kitazaki/esp32/esp-idf/install.sh"
Diagnostic information:
    IDF_PYTHON_ENV_PATH: /Users/kitazaki/.espressif/python_env/idf4.4_py3.9_env
    Python interpreter used: /Users/kitazaki/tmp/20221127/connectedhomeip/.environment/pigweed-venv/bin/python
    Warning: python interpreter not running from IDF_PYTHON_ENV_PATH
    PATH: /Users/kitazaki/tmp/20221127/connectedhomeip/third_party/pigweed/repo/out/host/host_tools:/Users/kitazaki/tmp/20221127/connectedhomeip/.environment/pigweed-venv/bin:/Users/kitazaki/tmp/20221127/connectedhomeip/.environment/cipd/packages/pigweed/bin:/Users/kitazaki/tmp/20221127/connectedhomeip/.environment/cipd/packages/pigweed:/Users/kitazaki/tmp/20221127/connectedhomeip/.environment/cipd:/Users/kitazaki/esp32/esp-idf/components/esptool_py/esptool:/Users/kitazaki/esp32/esp-idf/components/espcoredump:/Users/kitazaki/esp32/esp-idf/components/partition_table:/Users/kitazaki/esp32/esp-idf/components/app_update:/Users/kitazaki/.espressif/tools/xtensa-esp32-elf/esp-2021r2-patch5-8.4.0/xtensa-esp32-elf/bin:/Users/kitazaki/.espressif/tools/xtensa-esp32s2-elf/esp-2021r2-patch5-8.4.0/xtensa-esp32s2-elf/bin:/Users/kitazaki/.espressif/tools/xtensa-esp32s3-elf/esp-2021r2-patch5-8.4.0/xtensa-esp32s3-elf/bin:/Users/kitazaki/.espressif/tools/riscv32-esp-elf/esp-2021r2-patch5-8.4.0/riscv32-esp-elf/bin:/Users/kitazaki/.espressif/tools/esp32ulp-elf/2.35_20220830/esp32ulp-elf/bin:/Users/kitazaki/.espressif/tools/openocd-esp32/v0.11.0-esp32-20220706/openocd-esp32/bin:/Users/kitazaki/.espressif/python_env/idf4.4_py3.9_env/bin:/Users/kitazaki/esp32/esp-idf/tools:/opt/homebrew/Caskroom/miniconda/base/bin:/opt/homebrew/Caskroom/miniconda/base/condabin:/Users/kitazaki/.nodebrew/current/bin:/Users/kitazaki/.rbenv/shims:/Users/kitazaki/.rbenv/bin:/opt/homebrew/bin:/Users/kitazaki/.nvm/versions/node/v14.15.4/bin:/Users/kitazaki/moddable/build/bin/mac/release:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin:/usr/local/share/dotnet:~/.dotnet/tools:/Library/Apple/usr/bin:/Library/Frameworks/Mono.framework/Versions/Current/Commands

ESP-IDF v4.4.3-dirty
$
```

必要なPythonモジュールが不足しているので、バージョンを指定してインストールします。

```bash
$ pip3 install idf-component-manager==1.0
$ pip3 install gdbgui==0.13.2.0
$ pip3 install pygdbmi==0.9.0.2
$ pip3 install python-socketio==4.6.1
$ pip3 install itsdangerous==2.0.1
$ pip3 install kconfiglib==13.7.1
$ pip3 install reedsolo==1.5.4
$ pip3 install bitstring
$ pip3 install construct==2.10.54
```

もう一度、idf.py menuconfigを実行します。

「Demo」→「Device Type」→「M5Stack」を選択(「Enter」を入力)して保存(「S」を入力)します。
保存したら、「Q」を入力して終了します。

![menuconfig_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/883fe018-bc79-0a2c-6be7-9f81b6664de5.jpeg)

![menuconfig_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/d9377679-967a-5aa8-0990-3f91cccd3ada.jpeg)

ビルドを実行します。

```bash
$ idf.py build
```

## 4.サンプルアプリケーションをインストールする

PCへ接続したM5Stack(Basic、または、M5Stack Gray)へインストールします。
M5Stackを接続する前と後で以下のコマンドを実行して、M5Stackが認識されたシリアルポート番号を確認します。

```bash
$ ls /dev/cu.*
```

/dev/cu.usbserial-015F99BB
として認識された場合、以下のコマンドでM5Stackへインストールします。

```bash
$ idf.py -p /dev/cu.usbserial-015F99BB flash
```

![m5stack.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/962e4666-2936-1e1a-03bc-c2046e8110c4.jpeg)

ホームアプリからLEDを操作している例です。

https://youtube.com/shorts/hODlbTZ2f0U?feature=share

# M5Stack Basic/Gray/Fireの画面の色味を変える

M5Stack Basic、Gray、Fireとで画面に表示される色味が異なる場合、
connectedhomeip/examples/common/screen-framework/include/Display.h
の35行目を修正する。

```c++:Display.h
// for some reason this is backwards (turns out this is because of a 2019 update to the m5stack hw)
#define INVERT_DISPLAY INVERT_ON
↓
#define INVERT_DISPLAY INVERT_OFF
```

![gray.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/6ab10808-0c5a-6163-af89-4fd0bbd642fb.jpeg)

# M5Atom LiteのLEDの色を変化させる

M5Atom Liteへlighting-appをインストールします。

```bash
$ cd examples/lighting-app/esp32
```

idf.py menuconfigを実行します。

```bash
$ idf.py menuconfig
```

「Demo」→「LED type」→「RMT - Addressable LED」を選択(「Enter」を入力)します。
「Demo」→「LED GPIO number」→「27」を入力します。
保存(「S」を入力)します。
保存したら、「Q」を入力して終了します。

```bash
$ idf.py build
```

M5Atom Liteへ書き込みます。

```bash
$ idf.py -p /dev/cu.usbserial-9152796993 flash
```

もし、書き込みに失敗する場合は、書き込みスピードを遅く(115200に変更)します。

```bash
$ idf.py -p /dev/cu.usbserial-9152796993 -b 115200 flash
```

M5Atom Liteは画面がないため、コミッショニングに必要なQRコードを表示させることができません。
シリアルコンソールへアクセスし、以下のコマンドを実行してQRコードを表示するURLの情報を取得します。

```bash
$ matter onboardingcodes ble
```

Arduino IDEでシリアルコンソールへアクセスしている例です。

![スクリーンショット 2023-01-21 18.47.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/9f4b53f1-8492-fca3-688f-cbb6900ecb04.png)

ESP Web Toolsからシリアルコンソールへアクセスしている例です。

![スクリーンショット 2023-01-21 21.13.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/213990e0-1832-36f9-6181-297912b98f1f.png)

![スクリーンショット 2023-01-21 21.16.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/dee0aeac-c78d-74ed-9695-90e5a816bc1c.png)

ブラウザからQRCodeUrlへアクセスします。

![スクリーンショット 2023-01-21 18.54.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/f85dd8bb-1aa7-4413-d2e8-21cbc509984b.png)

ホームアプリからLEDの色を操作している例です。

https://youtu.be/jRWIS8Tf0_s

### 参考

https://engineering.nature.global/entry/try-matter-sample


https://qiita.com/KenNagami/items/ba4bf7db29afcbdb81f1