こんにちは、セーフィー株式会社 サーバサイドエンジニアの河津です。
この記事はSafie Engineers' Blog! Advent Calendar 6日目の記事、またenebular Advent Calendar 23日目の記事です。
約1年前に、弊社から提供しているSafie APIとNode-REDを連携して、ローコードな仕組みで会議室の空き状況を見る試みを記事にさせていただきました。
今回はその続編ということで、この1年でSafie APIに追加された機能を用いて、部屋に入退室された方の時間と体温を把握するような試みをしてみようと思います。特に体温を取得できるというのは、ご時世的にもかなり需要があるのではないでしょうか。
Safie APIやNode-REDについての説明も上記記事内でさせていただいています。この記事内では説明を省略しますが、もし良ければ上記記事を読んでいただけると、この記事もわかりやすくなるかもしれません!
今回作るもの
その日に部屋に入退室があったログを取得し、ログに含まれる入退室時間と体温情報を定期的にSlackに送るようなものを作ってみます。
入退室のログを確認するには、弊社から提供しているサービス「Safie Entrance2」を使用します。
Safie Entrance2とは
Safie Entrance2は、顔認証端末を用いて自動解錠を行うことができる、クラウド型入退室管理サービスです。
顔認証なのでICカードなどと違い紛失やなりすましのリスクがないのと、データはクラウド管理されるためどこでも入退室履歴を確認することができます。
入退室者の情報は、顔認証端末で解錠を行う際にサーバに溜まっていきます。溜まっていくデータは主に入退室した「日時」と、顔画像から画像処理にて割り出した「体温」が保存されます。
この情報を、Safie APIを用いて取得することができるようになりました。下記の「入退場一覧取得API」を使用します。
それでは、情報の取得ができるようNode-REDのフローを作っていこうと思います。
フローの解説
Node-REDで下記のようなフローを作ってみました。前回と同じように、今回もクラウドのNode-RED環境であるenebularというサービスを使いました。
それぞれのノードの役割について解説していきます。
injectノード
injectノードは手動でノードを始動させたり、一定間隔で実行させることができるノードです。
「inject実行」というボタンでフローを開始できるほか、実行間隔や繰り返しのあり・なしも設定することができます。
ノード同士で値を受け渡しする際は、msg.payload
というJavaScriptオブジェクトの中に値を作ってやりとりをしますが、今回はこのinjectノードから次のノードに値を受け渡すようなことはしないので、msg.payload
はデフォルト設定であるタイムスタンプを送るようになっています。
functionノード(Safie APIへ送るリクエストパラメータ作成)
functionノードはノード間で受け渡しを行うmsg.payload
を加工することができるノードで、JavaScriptを用いて内部処理を記載することができます。
入退場取得APIはいくつかの条件で検索をかけることができますが、今回は特定の端末に紐づく入退場データを取得するために、terminal_id
を指定してデータを取得することにします。
http requestノード
その名の通りHTTP Requestを行えるノードです。ここでは実際に入退場一覧取得APIが実行できるように、エンドポイントやアクセストークン情報などを入力していきます。
※アクセストークンの取得方法については、こちらの記事に記載があります。
functionノード(Safie APIからレスポンスパラメータを受け取り加工する)
入退場取得一覧APIからは下記のようなレスポンスが返ってきます。
{ total: 617, offset: 0, count: 20, has_next: true, list:[ { detection_id: xxx, timestamp: "2022-11-17T11:28:28+00:00", terminal: {}, // 割愛 result: false, person: null, temperature: 36.1 } ] }
timestamp
が入退場の日時であり、temperature
が体温の値です。
このレスポンス情報をSlackに送信するために加工を行います。
var list = msg.payload.list var response = "" list.forEach(function(obj, index) { var timestamp = obj.timestamp var temperature = obj.temperature response += "入退場時間:" + String(timestamp) + " 体温:" + String(temperature) + "\n" }) msg.payload = response return msg;
やってることとしては、入退場日時と体温情報をメッセージとともに1行の文字列にして、取得できるオブジェクト分改行しているだけです。
slackノード
Slackに送信を行うことができるノードです。
SlackのWebhook URLと投稿したいチャンネル名を指定するだけで、msg.payload
の内容をSlack投稿してくれる便利ノードです。
Webhook URLの取得方法はこちらの記事を参考にさせていただきました。
フロー実行
作成したフローを実行してみます。injectノードの「inject実行」をクリックすると・・・
このようにSlack送信できました!
あとはinjectノードを一定間隔で実行するような形で設定すれば、「定期的に入退場データをSlackに送信してくれる仕組み」の完成です!
まとめ
前回の記事を書く際にも感じていましたが、ローコードにシステムを作れるNode-REDとSafie APIは、かなり相性良いなと感じています。
この記事を書くためにNode-REDを色々と動かしていましたが、フローの組み始めからSlack投稿が完了するまで大体1時間かからないくらいで作成できました。(前回記事の知見を多数流用できたというのも大きいですが)
プロトタイプ的に物作りをする上では便利ですね。
Safie APIは継続的に機能追加が行われていくため、しばらくしたらまた試してみたいなと思います!ここまでお読みいただきありがとうございました!