こんにちは。 セーフィー株式会社 バックエンドエンジニアの河津です。
先日ご縁あって、Node-REDをテーマにしたミートアップで簡単なLT(ライトニングトーク)をさせていただく機会がありました。
Node-REDというのはフローベースのビジュアルプログラミングツールでして、ノーコード/ローコードなアプリケーションの開発を行うことができるツールです。(詳しくは後述します。)
どのような登壇内容にするか迷っていたのですが、当社で提供しているサービス「Safie API」とNode-REDが、ノーコード/ローコード開発の観点から相性いいのではなかろうかと思い立ち、これらを連携して会議室の空き状況を確認するシステムのプロトタイプを作りました。
今回はその内容に触れつつ、Safie APIとNode-REDの連携活用例について紹介させていただきます。
ちなみに、こちらの記事はenebular Advent Calendar 2021に、24日目の記事として参加させていただいています。
また、こちらの内容は上述のミートアップコミュニティにてアーカイブされています。詳細な部分など口頭での説明もありますので、良ければ合わせてご覧ください。
今回作るもの
Slackで「会議室の空き状況を教えて」などのようにコメントすると、現在の混雑状況を教えてくれるBotを作成したいと思います。
上記のコメントをSlackのWebhookで受け取った際に、Safie APIにて現在会議室にどれだけ人がいるかの情報を取得し、その情報をベースに「現在〇〇人が会議室を使っています」といった情報をSlack Botが答えてくれる、というようなシステムを作ってみることを目指します。
SlackのWebhook先を設定するには、本来何かしらAPIを実装してそれを設定する必要があるのと、APIを動作させるためのサーバも構築しなければなりませんが、この中継地点となるサーバおよびエンドポイントの役割を、今回はNode-REDに担ってもらいます。
下記のようなシーケンスで作成していきます。
Safie APIとは?
Safie APIは、セーフィーのカメラから得られる情報を取得・更新することができるAPIです。 セーフィーではSafieViewerという、カメラに映った映像などの情報を見ることができるアプリケーションを提供しているのですが、アプリケーションとしてだけではなく、ユーザーが普段使っている業務システムにも組み込めるように、SafieViewerで提供している各機能をAPIとして提供しています。
例えば、ストリーミング映像データを取得することができたり、静止画の取得、動画のダウンロードなどを行うことができます。
テックブログ内に、「Safie APIの始め方と動作方法の紹介」というSafie APIについて解説された記事がありますので、こちらも合わせて読んでいただければと思います!
Node-REDとは?
Node-REDは元々IBMにて開発されたIoT向けのフローベースドプログラミングツールです。 現在はOSSとして寄贈されているため、インストールすれば誰でも使うことができます。 インストールの手順などは公式のこちらのページなどが参考になります。
ちなみに今回僕はenebularというサービスを使い、クラウド上のNode-RED環境を使いました。
Node-REDは、「ノード」という機能単位の箱(例えば、Webhookを受け取る、外部APIと通信する、Slackにメッセージを送る、など)を、「フロー」という線で組み合わせることで、いわゆるビジュアルプログラミングのような形でシステムを組むことができます。
また、細かな処理を追加したい場合はその部分だけコードを書くことができるので、ノーコード・ローコードで作りたい機能を実現することができます。
Node-REDはIoTアプリケーション開発に使われるケースが多いですが、サーバサイドの処理を任せる使い方もできます。 このNode-REDを利用して、会議室の空き状況を教えてくれるBotの作成をしていきます。
Safie APIの使用準備
前述した「Safie APIの始め方と動作方法の紹介」の記事内にて、Safie APIを使用するための手順が記載されていますので、良ければこちらをご覧ください。 ※2021/12/17現在、Safie APIは一部のユーザーにのみ利用を開放しており、申し込みいただいても全員が使用できるわけでないためご注意ください。
記事内の手順からアクセストークンを取得して、準備完了です。
Node-REDでのシステム構築
繰り返しですが、今回は「Slackで会議室の空き状況を聞くと、空き状況を答えてくれる」機能を作成します。そのために、Saife APIの「人物検出結果一覧API」を使用します。
今回使用するカメラにはこのような会議室が映っています。
「人物検出結果一覧API」は、このカメラに映った映像から人物を検出し、「一定期間の間に映った人の数」をカウントすることができます。
この「人物検出結果一覧API」を使用することで、直近1分間に会議室を使っていた人の数(のべ人数)を出しつつ、それをSlackで返答するようにします。
Node-REDのフローを、こんな風に組んでみました。
処理の流れとして、
- Slackへのメッセージ送信検知(Slack inノード)
- 特定のワードのみ反応するようにする(「振り分け」という名前のSwitchノード)
- Safie APIにリクエストするためのパラメータ作成(「Safie人物検知API送信準備」という名前のfunctionノード)
- Safie APIへのリクエスト(「Safie人物検知API疎通」という名前のhttp requestノード)
- レスポンス内容を整形して現在会議室にいる人を算出(「返信文」という名前のfunctionノード)
- Slackにメッセージを送る(Slack outノード)
という流れになります。 一つ一つ、どのような処理になっているかを解説します。
1.Slack in ノード
Slackにメッセージが送られたことをhookしてくれる機能です。 Slack Bot作成の際に作られるAPI Tokenと、投稿されたら発火するチャンネル名を設定することができます。
2.Switch ノード
「会議室の利用状況を教えて」などの、特殊なメッセージにのみ反応してほしいため、このSwitchノードで処理の分岐を行っています。 メッセージの内容が「会議室の利用状況を教えて」だった場合に、次のノード処理に移ります。
3.functionノード
Safie APIで人物検出結果を取得するためのリクエストパラメータを作成します。 functionノードではNode.jsでコードを書くことができ、今回は、会議室を映すカメラ固有のID「device_id」を設定しつつ、直近1分間に映った人の数をカウントするようにパラメータを作成します。
4.http requestノード
Safie APIへのリクエストを行います。 このノードにAPIのエンドポイントやアクセストークンを設定して、認証を通るようにします。
5.functionノード
Safie APIからのレスポンスをこのノードで整形します。 データには1分間に映った人数データが入っているので、それを集計しのべ人数としています。 当然この中には同じ人がカウントされているデータもまとめて集計しているのですが、今回はプロトタイプということで許容しています。 またこの処理の中で、次のノードであるSlackに送るメッセージを組み立てます。
6.Slack outノード
Slackにメッセージを送るノードです。 こちらにもSlack inノードと同様、BotのAPI Tokenと、通知するチャンネルを設定することで、下記のようなメッセージを飛ばすことができます。
やってみた感想
ここまでご紹介したようにNode-REDを使うことで、少しコードを書くだけでここまでの仕組みを構築することができました。 本来はSlackとの連携や、Safie APIとの連携を行うためには中継の役割となるサーバが必要になりますが、Node-REDがそこを代替しているためかなり作成工数は抑えられています。
一方で、Node-REDにはアクセストークンをベタ書きにしており、そこをどう自動で更新していくかという点や、APIから取得したデータのうまい使い方を模索する必要があるなと感じました。 ノーコード・ローコードの仕組みは開発箇所を絞れて工数を抑えられる反面、ツールを使う上で出てくる仕様上の縛りとうまく向き合う必要があります。 クオリティ向上のためにコードを書いて追加開発を行うにも限界があるため、ノーコード・ローコードのままいかに機能を組み合わせ拡充していくかという考え方・工夫が必要になってきそうだなと感じました。