Node-REDでマイコンと、SNSやメールを連携させる(ヒーローズリーグ ハイブリット・ハッカソンにて)
はじめに
ヒーローズリーグのハッカソンにて二日間製作していたのですが、今回はその技術的なまとめです。短い期間でしたが、Node-RED経由でLINE、Slack、Discord、Gmailを扱えるようにしてみました。
▼こちらのイベントに参加していました。
▼ProtoPediaに作品を投稿しています。
https://protopedia.net/prototype/4716
今回はパソコンで起動したNode-REDから送受信を行うのではなく、マイコンでメッセージのやり取りをできるようにしています。
▼システムの構成はこんな感じ。Node-REDを経由しています。
▼Raspberry Pi 400を使っています。
Moddable Twoについて
今回はメッセージの送受信を行う端末として、Moddable Twoを使いました。
▼こちらがModdable Two。薄型のタッチディスプレイが搭載されています。文字の入力も可能です。
ESP32が搭載されているので、WiFiやBluetoothを使うことができます。
プログラムはNode-RED MCUを使って、Node-REDで作成したフローを書き込んでいます。つまりマイコンへの書き込みと、サーバーとのやり取りをNode-RED上で完結させているということです。Moddable Twoの詳細は別の記事にまとめようと思います。
なお、今回はRaspberry Pi 400にNode-RED MCUの環境構築を行っています。久々に使ってみたらエラーが出たのですが、再度xs-devのコマンドを入力すれば解決しました。
▼Node-RED MCUの環境構築についてはこちら。最大の関門は環境構築です...
各種メッセージサービスと連携させる
ネット上で見つけた記事を参考に、どんどん追加していきました。どのサービスにも共通して、チャンネルのIDやAPIのキーが必要でした。
LINE
LINE Notify
LINE Notifyは非常に簡単に使えます。メッセージを送るだけでいいなら一番おすすめです。
▼LINE Notifyとの連携に関する記事
https://zenn.dev/dsl_gunma/articles/78218c47efa9d8
▼フローはこんな感じ。mqtt inノードで受信したデータを、LINE Notifyに送信します。
▼実際の画面はこんな感じ。
LINE Messaging API
▼LINE Messagint APIとの連携に関する記事
https://qiita.com/youtoy/items/287a0782fdd185fc2004
▼Node-REDのページに、利用イメージがあります。
https://flows.nodered.org/node/node-red-contrib-line-messaging-api
以前、LINE Messaging APIをNode-REDで使おうとしたことがあったのですが、APIを使うにはhttps通信である必要があるということで諦めたことがあります。ネットワーク系は専門外なので知らないだけかもしれませんが、ローカルで起動しているNode-REDでは気軽に使えないかもしれません。
今回はenebularという外部サービスを経由して、APIを使えるようにしています。無料枠だと起動時間に制限があり、再起動するとURLも再生成されるので、LINE側のAPIのURLを毎回再設定する必要があります。Node-REDをhttps通信で公開サーバーとして使うことができれば便利なのですが...
▼enebularのページはこちら
完全な送受信まではできていないのですが、データを処理すればできるような気がしています。今回はオウム返しだけできました。
▼フローはこんな感じ。Webhookに含まれるデータは分割する必要があるのかな?
▼Webhookに含まれるデータについては、こちらに記載がありました。
https://developers.line.biz/ja/docs/messaging-api/getting-user-ids/
▼実際の画面はこんな感じ。
Slack
▼Slackとの連携に関する記事
https://zenn.dev/dsl_gunma/articles/9fc4e58783d7da
▼メンションされたメッセージの取得に関する記事
Node-REDでSlackの特定の投稿に反応して返答する (zenn.dev)
ひとつ気になっているのは、“ノードの停止に失敗しました”というエラーがデバッグノードに出ることです。そのせいか、毎回デプロイするのに時間がかかるようになりました。
▼フローはこんな感じ。Slack Listenで受信したデータを、一部JavaScriptで変換しています。
▼実際の画面はこんな感じ。
Discord
Discordについては、日本語の情報が少ないように感じました。ノード自体はシンプルなので、簡単に使えます。
Discord関連のノードにはnode-red-contrib-discordというものがあるのですが、もうメンテナンスされていなくて非推奨だそうです。今回はnode-red-contrib-discord-advancedを使いました。
▼こちらに書かれていました。
https://flows.nodered.org/node/node-red-contrib-discord
▼チャンネルのIDを取得するには、開発者モードにする必要があります。
https://note.com/bardbot/n/na70832cb70a3#7d216f1f-9988-4772-aa20-dfdfbf97c6eb
▼使い方については、こちらの動画が参考になりました。
動画の途中までを参考にして実行してみると、 Error Used Disallowed Intents というエラーが出ました。
▼こちらの記事で解決しました。初期状態ではボットに制限が掛かっているようです。
https://zenn.dev/disneyresidents/articles/discordintents
▼フローはこんな感じ。すごくシンプルです。
▼実際の画面はこんな感じ。
Gmail
Gmailはマイコンからの送信だけできるようにしました。こちらはenebularのNode-REDで実行しています。受信用のノードもあります。
▼Gmailとの連携に関する記事
▼フローはこんな感じ。これもシンプルですね。
▼実際の画面はこんな感じ。
Moddable Twoにプログラムを書き込む
▼Node-REDで作成したフローはこちら。mqttノードでサーバーとのやり取りを行っています。
Node-REDのダッシュボード画面がModdable Twoに表示されます。ボタン入力、スイッチ入力だけでなく、キーボードを表示して文字の入力も可能です。
▼実際の画面はこんな感じ。タブも切り替えることができます。
▼ハッカソンでの発表動画はこちら。ちょっと音が聞きづらいですね...
最後に
二日間という短い期間のハッカソンでしたが、Node-REDのようなローコードツールを使うと、ある程度形になりますね。細かいところはJavaScriptで書けばいいですし。
マイコンのUIをローコードで済ませることができたので、サービスとの連携に注力できました。その連携についても、ありがたいことに先人の方々が情報を公開してくれていたのですぐに使えました。
Node-REDとネットワーク関係については、詳しく勉強したいなと思っています。一応機械系の学生なのですが、どんどん離れている気がしてなりません...