IoTの新規格Matterについて～Node-REDでの実装例を添えて～

## はじめに

この記事は [KDDIテクノロジー Advent Calendar 2024](https://qiita.com/advent-calendar/2024/kddi-technology) の19日目の記事です。
今回は[昨年の記事](https://qiita.com/koji-kojima/items/96c689f812d638377653)とは打って変わって、IoT機器を相互に接続するための共通規格**Matter**の利点について、Node-REDとの連携方法を通して解説します。

※あくまで個人的な見解によるものも含まれますので、その点ご留意ください。


## What is Matter ?
まずMatterについてですが、このように説明されたりします。
> Matterは、Connectivity Standards Alliance（CSA）が策定している、スマートホームやIoTデバイス向けに設計された標準規格です。
> さまざまなデバイスやソフトウェアの**互換性を確保**し**相互運用性の向上**させることを目的としています。

ちょっと難しいので簡単に説明します。
例えばですが、IoTと聞いて皆さんは何を思い浮かべますか？

プラットフォームであれば、Amazon AlexaやGoogle Home、AppleのHomeKitだったりするかもしれません。

またデバイスなら、SwitchBotの監視カメラやPhilips Hueの電球などスマート○○と呼ばれるようなものかもしれません。

IoTデバイスを使ったことがある方であれば分かるかもしれませんが、これらのセットアップを行うときにAlexaなどのアプリの中で**専用のプラグインの有効化**や**専用のアプリのインストール**が必要だったりと、設定にかなりの手間がかかってしまうという問題点がありました。

```mermaid
graph LR
    A[Amazon Alexa] -->A1[デバイス専用プラグイン]
    B[Google Home] -->B1[デバイス専用プラグイン]
    C[Apple HomeKit] -->C1[デバイス専用プラグイン]

    A1 --> E[IoTデバイス]
    B1 --> E[IoTデバイス]
    C1 --> E[IoTデバイス]
    D[専用アプリ] --> E[IoTデバイス]
```

そこで登場したのがMatterになります。Matter対応デバイスであれば、どのプラットフォームからでもQRコードを読み取るだけでセットアップができるなど、設定を行う上での利便性がかなり向上しました。

さらに複数のプラットフォームでのセットアップをMatter経由のものに一元化できることで、ユーザーはプラットフォームやデバイスの互換性を気にすることなく使うことができ、デバイスごとの設定方法などを簡略化できるようになりました。

```mermaid
graph LR
    A[Amazon Alexa] -->|Matter経由で連携|D[Matter]
    B[Google Home] -->|Matter経由で連携|D[Matter]
    C[Apple HomeKit] -->|Matter経由で連携|D[Matter]
    D -->E[Matter対応IoTデバイス] 
```

## Node-REDを使用した連携方法
ここからは、Node-REDを使用してIoTプラットフォームと連携する方法がMatter登場前後でどう変わったのかについて説明していきます。

今回は、電気のON/OFFを切り替えるという設定でTrue/Falseのフラグ情報を送信するような設定をします。

:::note warn
便宜上、Amazon AlexaとGoogle Homeをご利用のiPhoneユーザー向けの内容となっておりますのでご容赦ください。

お持ちでなくても、Node-REDでの設定の手間などが伝わりましたら幸いです…
:::

### 環境構築
今回はWindowsにNode-REDをインストールして使用しました。下記に手順を書いておきます。
#### 1. Node.jsのインストール
下記のリンクからNode.jsをダウンロードしてインストールしてください。

https://nodejs.org/en/download/package-manager

#### 2. Node-REDのインストール
コマンドプロンプト上で下記のコマンドを入力してNode-REDをインストールしてください。
```
npm install -g --unsafe-perm node-red
```
インストール後、下記のコマンドでNode-REDが起動します。
```
node-red
```
起動後は、http://127.0.0.1:1880, http://localhost:1880 などでコンソールにアクセスできます。
下記のような画面が表示されればOKです。
![スクリーンショット 2024-12-18 225623.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/213eb87e-230a-8146-1abd-ead210cbc0b1.png)

#### 3. Node-RED to Amazon Alexa

Node-REDとAmazon Alexaを連携するには、「Node-RED Alexa Home Skill Bridge」を使用します。
下記のページにアクセスしてアカウントを作成してください。

https://alexa-node-red.bm.hardill.me.uk/

ログインすると、どのような処理をさせたいのか設定することができる画面に遷移するので、「Add Device」から下記のようにライトのON/OFF切り替えができるような設定をします。

![スクリーンショット 2024-12-17 201143.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/b785b79b-c473-23ec-8641-fe15cd4b4124.png)

次にスマホでAlexaアプリを起動して「その他」→「スキル・ゲーム」→「🔍Alexaスキルを検索」から「Node-RED」を検索して、スキルを有効化してください。その際、先ほど作成したアカウントへのログインを求められるので、ログインしてください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/7f00d356-b7eb-23b3-8f99-e1fd8690926e.png" width="300px">

ここからはNode-RED側の設定ですが、Node-REDのコンソール右上の三本線から「バレットの管理」→「ノードを追加」→「🔍ノードを検索」から「node-red-contrib-alexa-home-skill」を検索して追加してください。

左端のノード一覧にノードが表示されるようになっていればOKです。

![スクリーンショット 2024-12-18 235314.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/591592da-f1db-b1c2-825e-8ff430d8f16b.png)

「alexa-home」ノードを配置するとAccountを入力するところがあるので、＋マークから先ほど作成したアカウントのUsernameとPasswordを入力します。

![スクリーンショット 2024-12-19 000113.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/f8a06bfd-d900-5c87-cbf7-41713a102b10.png)

ログインが完了すると、Deviceのところで先ほど設定した「電気」が選択できるようになっているので選択します。デプロイできればこれで設定はOKです。

#### 4. Node-RED to Google Home
Node-REDとGoogle Homeを連携するには、Node-RED Google Assistant Bridgeを使用します。
下記のページにアクセスしてアカウントを作成してください。

https://googlehome.hardill.me.uk/

ログインすると、どのような処理をさせたいのか設定することができる画面に遷移するので、「Add Device」から下記のようにライトのON/OFF切り替えができるような設定をします。

![スクリーンショット 2024-12-17 201038.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/d3ac603a-98bc-ac7d-4ce6-c9db5eae2068.png)

次にスマホでGoogle Homeアプリを起動して「デバイス」→「追加」→「Works with Google Home」→「デバイスの追加🔍」から「NR-GAB」を検索して、デバイスを追加してください。その際、先ほど作成したアカウントへのログインを求められるので、ログインしてください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/5b98a364-5baa-5a95-d3e3-a70efe42a844.png" width="300px">

ここからはNode-RED側の設定ですが、Node-REDのコンソール右上の三本線から「バレットの管理」→「ノードを追加」→「🔍ノードを検索」から「node-red-contrib-googlehome」を検索して追加してください。

左端のノード一覧にノードが表示されるようになっていればOKです。

![スクリーンショット 2024-12-18 235346.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/0dde3dd1-c823-b3b1-e6da-f4f57baa1451.png)

「google-home」ノードを配置するとAccountを入力するところがあるので、＋マークから先ほど作成したアカウントのUsernameとPasswordを入力します。

![スクリーンショット 2024-12-19 000148.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/c2ee4e16-b329-ba04-d1a6-66d2ad513ac0.png)

ログインが完了すると、Deviceのところで先ほど設定した「電気」が選択できるようになっているので選択します。デプロイできればこれで設定はOKです。

#### 5. Node-RED to Matter
Node-REDとMatterを連携するには、node-red-matterを使用します。
今回、アカウント作成等は**必要ありません**。

https://github.com/FezVrasta/node-red-matter

Node-RED側の設定で、Node-REDのコンソール右上の三本線から「バレットの管理」→「ノードを追加」→「🔍ノードを検索」から「@node-red-matter/node-red-matter」を検索して追加してください。

左端のノード一覧にMatterノードが表示されるようになっていればOKです。

![スクリーンショット 2024-12-18 235400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/2c4eece4-2a96-266f-1d25-6a2a80452fe9.png)

次に「Matter Device Status」ノードを配置します。設定の＋ボタンから新規でMatterデバイスとして追加します。Alexa経由の場合、UDPポートを「5540」に設定するよう、Wikiに記載があったので下記のように設定しました（それ以外のポートで設定した場合、Alexaが認識してくれませんでした）。

![スクリーンショット 2024-12-19 001338.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/c0466500-def3-1826-77bd-5a38ca41550e.png)

デバイスへの追加方法ですが、デプロイ後に先ほどの編集画面をスクロールすると、QRコードとペアリングコードが表示されているので、それをAlexaやGoogle Home、HomeKitのアプリから読み取ることで設定することができます（念のため、一部黒塗りにしています）。

QRコードは横に間延びしてしまっていますが、メモ帳などにコピペすることで読み取りができるようになります。

![スクリーンショット 2024-12-18 122327.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/8faf3856-af72-f494-0cef-cccee3ed8137.png)

![スクリーンショット 2024-12-18 122435.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/e48dd81e-cdcc-9a45-7af8-ac6950aa6644.png)

Alexaアプリからの追加方法ですが、「デバイス」から右上の＋ボタンで「デバイスを追加」を選択後、セットアップ画面で「Matter」を選択してください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/9e0312a3-8984-286e-4fc3-f9b1d9f7d14f.png" width="300px">

いくつかページが表示されるので、「はい」を選択していくと、QRコードかコード番号の入力を求められるので、先ほどのQRコードをスキャンするか、コード番号を入力してください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/9d8f54b1-bce9-a030-f4ae-e77d7b7e04cc.png" width="300px">

:::note warn
このとき、Node-REDを起動しているPCとスマホが接続されているWi-Fiなどのネットワークが同一ネットワーク上になるように気を付けてください。
:::

設定が完了すると、このようにAlexaアプリ上で１つのデバイスとして認識されるようになりました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/e6388a2b-1661-f8eb-3d3c-a41d13a7a785.png" width="300px">

他プラットフォームとの連携なのですが、１つのプラットフォームを連携すると、下記のように「既にペアリング済みなので一旦解除してからペアリングしてください」と表示されました。

![スクリーンショット 2024-12-19 005038.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/9b7cf848-abc0-0bf2-4182-37f0b3159ae8.png)

大人しく、一旦解除してからHomeKitで登録できるかテストしてみることにしました。

※本当はGoogle Homeから連携してみたかったのですが、Google Nest等のデバイスが必要とのことで泣く泣く断念…

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/6574c6f2-5dac-23aa-2afd-e4cfb872c1cc.png" width="300px">

HomeKitのアプリから「アクセサリを追加」を押すと、いきなりカメラが起動して読み込みができるようになったので、先ほどのQRコードを読み込みをして名称などを設定すると、HomeKitからでも無事に設定することができました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/eb75471f-8d66-9c69-c5cf-93e89a9a0802.png" width="300px">

## 従来方式との比較
では、ここからは従来（前項の３と４）とMatterを使用した方式（５）との違いについて書いていきます。

まず設定の方法についてですが、都度アカウントの作成が必要だったりする従来方式はMatter方式よりも設定が複雑であることは分かっていただけたかなと思います。

次に実際にNode-REDに送られてくるデータはどうなのかという観点で見てみることにします。
下記のように先ほど設定した３種類のノードにdebugノードを連結し、それぞれで「電気をつける」を実行してその出力を比較します。

![スクリーンショット 2024-12-19 011517.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/7254981a-6e9d-e8d0-7b76-77897cbcc2b6.png)

### Alexaから送られてきたデータ
まずAlexaからのデータですが、このようになりました。
ON/OFFがTrue/Falseのフラグ情報だけでとてもシンプルに見えます。

![スクリーンショット 2024-12-18 175850.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/54ccd35d-1b88-496f-9ec8-979bed86074e.png)

### Google Homeからのデータ
次にGoogleHomeからのデータですが、このようになりました。
階層化されたデータのパラメータ情報としてTrue/Falseのフラグ情報があるようです。

![スクリーンショット 2024-12-18 175926.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/e1b47962-3869-377b-3e25-9192f879f74b.png)

#### 従来方式同士での比較
上記２種類を比較すると、この時点で内部データ構造が異なっていて、互換性が担保されていないように見受けられますね。

例えばですが、Node-REDのSwitchノードを使用して、True/Falseで実行する処理の場合分けをしたいときなどにはプラットフォームごとに都度、データを参照するプロパティ設定などを見直す必要があり、実装する側からすればやや面倒に感じてしまうかもしれません。

![スクリーンショット 2024-12-19 021221.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/f7042f32-0c5c-d711-3946-7aa5554fe325.png)

![スクリーンショット 2024-12-19 021319.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/d4288c7c-2100-bd7f-1391-4ad2c9bfeed0.png)


### Matterからのデータ
最後にMatter（Alexa or HomeKit）からのデータですが、このようになりました。
先ほどと同様、階層化されたデータのパラメータ情報としてTrue/Falseのフラグ情報があるようです。

![スクリーンショット 2024-12-18 115513.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/2cbd692e-6db8-519a-b44d-8021293c7a51.png)

#### 従来方式とMatterまとめ
冒頭でも述べたように、これまでのIoTでは明確なデータ構造の標準が存在せず、通信仕様やデータ形式がプラットフォームごとに異なるため、標準化の必要性が指摘されていました。

そこで登場したMatterは、「スマートホームデバイス間の通信や操作を、統一されたプロトコルとデータ構造で標準化する」ことを目指した規格です。

異なるIoTプラットフォーム（今回だとAlexaとHomeKit）からMatterノードを使用してNode-REDへ送られてくるデータについて、

「Matter対応デバイスやプラットフォームを通じて送信されるデータなので統一されたフォーマットでやり取りされます!!」

と言えるのであれば、Matterからのデータを標準として、複数の設定を組まなくても下記のようなSwitchノードの設定に一本化しても問題なさそうです。

![スクリーンショット 2024-12-19 012905.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592194/cb1c8567-83c9-836b-c471-dc0e1a466ede.png)

複数のフォーマットが使用されていた従来と比べても、処理がシンプルでとても便利ですね！

## おわりに
以上、MatterとNode-REDでの実装についての解説でした。
私自身もまだまだ理解不足なところがあり、稚拙な文章になっているところもあるかと思いますが、Matterについての概要とNode-REDでの実装方法などが少しでも伝わったのであれば幸いです。

## 参考リンク
- https://home.google.com/intl/ja_jp/get-inspired/matter-and-thread/
- https://qiita.com/HiguchiTakahiro/items/3c024c79e5f463936ecc
- https://qiita.com/loach/items/782dec67962e4085e387
- https://qiita.com/kitazaki/items/7ab70b4e54cf25da050a