LINEで手軽にIoT！　opniz × LINE Notifyを試してみる

# はじめに

こんにちは。田中みそです。
[opniz](https://github.com/miso-develop/opniz)という[obniz](https://obniz.com/ja/how_obniz_works)っぽいことができるオープンソースIoTフレームワークを作って公開しています。
「[【2021年】はじめてのLINE Notify、IoTデバイスから通知を送ってみる with obniz](https://qiita.com/mochan_tk/items/e1f390cc88046f92eec6)」という記事を拝見いたしまして、opnizでも同じことができるかも…！と思い試してみたのが本記事となります。

https://qiita.com/mochan_tk/items/e1f390cc88046f92eec6/

結論としてはこんな感じにできました。
![image](https://user-images.githubusercontent.com/22117028/146578728-1a32bd4c-55d1-45e5-b611-06335aeb6f16.gif)



# opnizとは

![image](https://user-images.githubusercontent.com/22117028/145335374-e809e1ec-b614-44a5-9d21-b45bd01f5b72.png)

マイコンデバイスの実装は一般的にCやC++でプログラムを書きますが、JavaScript/TypeScriptで無理やり制御しちゃおうというIoTフレームワークがopnizです。

マイコンデバイスとプログラムはWebSocketで通信され、JSON形式のRPC（Remote Procedure Call）でマイコンデバイスを制御します。
（このあたりの具体処理はフレームワークが隠蔽しているので実装時に意識する必要はありません）



# 使用するマイコンデバイス

opnizはESP32というWi-FiとBluetoothを内蔵する低コスト、低消費電力なマイコンに対応しています。
ESP32はIoTを試すには鉄板のマイコンでして、これをベースにLEDやディスプレイ、ボタンにUSB端子などいろんなパーツを一体化したさまざまなボードが販売されています。
（冒頭の記事で使用されている[obniz Board](https://obniz.com/ja/products/obnizboard)もESP32を使用しています）

https://obniz.com/ja/products/obnizboard

今回はM5Stackという大人気のESP32ベースのボードシリーズより、最小限の構成で抜群のコスパを誇る[M5ATOM Lite](https://www.switch-science.com/catalog/6262/)というマイコンデバイスを使用してみます。
特徴としてはESP32に加え、ボタン、LED、赤外線LED、USB端子、小型ケースと9つのI/Oピン、Grove端子を備え、大きさは2.4 x 2.4 x 1.0 cmと超小型です。
そして1,287円で買えてしまうという超絶コスパです。

https://www.switch-science.com/catalog/6262/

ちなみに同じM5ATOMシリーズとして「[M5ATOM Matrix](https://www.switch-science.com/catalog/6260/)」というマイコンデバイスもあり、こちらでも本記事の内容をお試しいただけます。

https://www.switch-science.com/catalog/6260/



# opnizでM5ATOM Liteのボタンを押してLINE Notifyで通知してみる

それでは実際にopnizからLINE Notifyを試してみます。

構成は以下のイメージとなります。
![image](https://user-images.githubusercontent.com/22117028/146490734-8c7fef0f-d466-4557-a43f-897e04e111ee.png)

手順としては、

* [M5ATOM Liteへのopnizスケッチ書き込み](#m5atom-liteへのopnizスケッチ書き込み)
* [LINE Notifyアクセストークンの発行](#line-notifyアクセストークンの発行)
* [opniz Node.js SDKプログラムの作成](#opniz-nodejs-sdkプログラムの作成)

という流れで進めます。



## M5ATOM Liteへのopnizスケッチ書き込み

一般的にはArduino IDEを使ってスケッチと呼ばれるソースコードを作り込んでGUIからマイコンデバイスへの書き込みを行いますが、opnizではデバイス側のコードを作り込む必要はなくただ用意されたスケッチを書き込むだけで十分です。
こういったケースではArduino CLIというArduino公式のCLIを使うと便利で、インストールからマイコンデバイスへの書き込みまでコマンドのみで完結します。

### Arduino CLIのインストール

macOS / Linuxはbrewより、WindowsはScoopからインストールできます。

```sh:macOS&nbsp;/&nbsp;Linux
$ brew update
$ brew install arduino-cli
```

```sh:Scoop（Windows）
$ scoop update
$ scoop search arduino-cli
$ scoop install arduino-cli
```

またインストール用のshスクリプトも用意されており、curlコマンドからインストールできます。
※WindowsではGit Bash等、shを実行できる環境からインストールできます

```sh:shスクリプトからインストール
curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh
```

### Arduino CLIの環境構築

環境構築といっても以下のコマンドを実行するだけです。

```sh
arduino-cli config init # 設定初期化
arduino-cli config add board_manager.additional_urls https://dl.espressif.com/dl/package_esp32_index.json # ESP32用ボードマネージャ追加
arduino-cli core update-index # ボードパッケージのローカルキャッシュ更新
arduino-cli core install esp32:esp32 # ESP32ボードパッケージインストール
arduino-cli lib update-index # ライブラリのローカルキャッシュ更新
arduino-cli lib install M5Atom@0.0.3 FastLED ArduinoJson WebSockets # 依存ライブラリインストール
arduino-cli config set library.enable_unsafe_install true # GitHubからのライブラリインストール有効化
arduino-cli lib install --git-url https://github.com/miso-develop/opniz-arduino-m5atom # opniz Arduinoライブラリインストール
```

### スケッチ生成

続いて書き込むソース（スケッチ）を生成します。
このとき環境によって指定すべきパラメータが3つあります。
M5ATOM Liteが接続するWi-Fiの「SSID」「パスワード」、そして制御プログラムを実行するPCの「IPアドレス」です。

以下のコマンドはopnizのサンプルコードを取得し「SSID」「パスワード」「IPアドレス」を引数の値に書き換えるコマンドです。
コマンドの最後の方にある「`<SSID>`」「`<PASSWORD>`」「`<ADDRESS>`」をそれぞれご利用の環境の値に書き換え実行してください。

```sh
mkdir Opniz
curl -fsSL https://gist.githubusercontent.com/miso-develop/5be6ebaaa0347fc61301d43b028ea6f5/raw/setup-opniz-m5atom.sh | sh -s <SSID> <PASSWORD> <ADDRESS> > Opniz/Opniz.ino
```

curlで呼び出しているスクリプトは以下のGistになります。

https://gist.github.com/miso-develop/5be6ebaaa0347fc61301d43b028ea6f5

### M5ATOM Liteへの書き込み

最後にM5ATOM Liteへの書き込みです。
まずはM5ATOM LiteをPCへUSB接続しシリアルポート情報を取得します。

以下はWindows環境でのコマンド実行例ですが、一番左の`Port`の値をこのあと使用します。
複数のポート情報が出力される場合は、M5ATOM LiteをPCへUSB接続する前後でコマンド実行し、差分からポートを割り当ててみてください。

```sh
$ arduino-cli board list
Port Protocol Type    Board Name FQBN Core
COM1 serial   Unknown
COM6 serial   Unknown
```

ポート情報がわかったらM5ATOM Liteへの書き込みコマンドを実行します。
以下のコマンドの「`<PORT>`」の部分を上記のコマンドで割り当てたポート情報に差し替えて実行してください。

```sh
arduino-cli compile --fqbn esp32:esp32:m5stack-atom --upload --port <PORT> Opniz
```

以上でM5ATOM Liteへのopnizイメージ書き込みは完了です。

文量自体はそこそこありましたがCLIで完結していますので、そんなに時間もかからず書き込みまで進められたのではないでしょうか。



## LINE Notifyアクセストークンの発行

ここはもう冒頭の記事の「[LINE Notifyの使い方](https://qiita.com/mochan_tk/items/e1f390cc88046f92eec6#line-notify%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9)」の章を参考に実施するのが一番でしょう。

https://qiita.com/mochan_tk/items/e1f390cc88046f92eec6/#line-notify%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9

私も過去の記事で[LINE Notifyの導入方法](https://qiita.com/miso_develop/items/12d605a4cb043097a0b6#line-notify%E3%81%AE%E6%9C%89%E5%8A%B9%E5%8C%96)を書いていますので参考までに紹介します。

https://qiita.com/miso_develop/items/12d605a4cb043097a0b6#line-notify%E3%81%AE%E6%9C%89%E5%8A%B9%E5%8C%96

冒頭記事の説明と見比べてみると内容にほとんど差がないことが分かると思います。
LINE Notifyはそれだけシンプルであり、手軽に使い始めることができます。

https://notify-bot.line.me/ja/



## opniz Node.js SDKプログラムの作成

以下の`index.js`の「`<ACCESS_TOKEN>`」を取得したLINE Notifyのアクセストークンに差し替えます。

このプログラムでやっていることを簡単に説明しますと、

* opnizインスタンスを生成
* onbuttonイベントにLINE Notify通知関数をバインド
* opnizデバイス（M5ATOM Lite）と接続

の3点です。

```js:index.js
const { Opniz } = require("opniz")
const fetch = require("node-fetch")

const TOKEN = "<ACCESS_TOKEN>" // ここを差し替える

const notifyLine = () => { // LINE NotifyのエンドポイントにメッセージをHTTP POSTする関数
	fetch("https://notify-api.line.me/api/notify", {
		method: "POST",
		headers: { Authorization: `Bearer ${TOKEN}` },
		body: new URLSearchParams({
			message: "opnizのボタンが押されたやで！",
			stickerPackageId: 11537,
			stickerId: 52002735
		}),
	})
}

const opniz = new Opniz.M5Atom({ port: 3000 }) // 1. opnizインスタンス生成
opniz.onbutton = () => notifyLine() // 2. M5ATOMのボタンが押されたらLINE Notify通知

const connect = async () => {
	while (!(await opniz.connect())) console.log("connect...") // 3. opniz（M5ATOM）接続
	console.log("connected!")
}
connect()
```



## 試してみる

それでは動作を試してみましょう。
まずは関連npmパッケージをインストールします。

```sh:npmパッケージインストール
$ npm i opniz node-fetch@2
```

そしてプログラム実行します。
`connected!`と表示されればM5ATOM Liteと正常に接続できている状態です。

```sh
$ node index.js
connected!
```

この状態でM5ATOM Liteのボタンを押してみます。
![image](https://user-images.githubusercontent.com/22117028/146578728-1a32bd4c-55d1-45e5-b611-06335aeb6f16.gif)

LINEにメッセージとスタンプが飛んでくれば成功です！



# おわりに

冒頭の目的通りobnizと同様にopnizでも簡単にLINE Notifyで通知を送ることができました。
M5ATOM Liteにイメージを書き込む手順が結構嵩んでしまいましたが、CLIで完結するため実際の作業負荷はそこまで高くないはずです。

このように手軽にJavaScriptだけでIoTを試せる環境が整ってきました。
またobnizはもちろん、opnizもクラウド環境で動作させることも可能です。

今回試したLINE NotifyだけでなくLINE BotやLIFFからも連携可能ですので、ぜひみなさまもLINE x IoTをお試しいただけますと幸いです。