毎日の点検が楽になるLINE Botを作ってみた

こんにちは、仕事で食品検査を担当しています
入社してまもなく半年、デジタルに関する知識はほぼ０ですが、家の遠い私が定時で帰宅するために業務の効率化ができないか模索しはじめました（笑）
今回デジタルで解決できそうなプチ課題があったので、取り組んだ過程を紹介したいと思います




# 1. 取り組み背景
検査室には多数の冷蔵庫、冷凍庫があります
検査の信頼性を保つためにも、きちんと設定温度通り動いているか、毎日作業前と作業後に点検をする必要があります
しかし、この点検方法が、各機械の前に行って[おんどとり](https://www.tandd.co.jp/product/ondotori/)（データが記録できる小型の温度計）の数値を確認し、紙の点検表に記載するというアナログのものでした
＜おんどとり子機の写真＞
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/6ddbcc74-f663-12d6-fbda-91c7f322dacd.png" width=10%>
検査室で使用するおんどとりには、無線で温度データを確認できるという機能がついています([おんどとり Web Storage](https://ondotori.webstorage.jp/))
ボタン一つで点検作業ができたら楽で時間削減になると思い、プログラミングの知識がなくてもそれっぽいものができるMakeとLINEを使って、**自動点検LINE Bot**を作成してみました

# 2. 使用ツール
Make
LINE
[おんどとりAPI](https://ondotori.webstorage.jp/docs/api/)
Google スプレッドシート（記録用）

# 3. 実施内容
## 3.1. ベース作成
まずおんどとり１台分の現在の温度を返信するBotを作ります
<img width="80%" alt="![スクリーンショット 2022-09-07 22.39.36.png]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/3e8cd930-452b-13e1-abe1-48ccb685e8be.png">


Botの作成方法やMakeとの接続方法については省略します
HTTPモジュールに、[おんどとりAPIホームページ](https://ondotori.webstorage.jp/docs/api/)に記載されている項目をいれていきます
Request contentに、アカウント情報や動かしたいおんどとりの情報、やってほしいことをJSON形式で入力します
API KEYが必要になりますが、こちらのやり方はホームページに書かれています
まずはこの状態で返信用LINEモジュールとつなぎ、`Data`が返ってくるようにします
![スクリーンショット 2022-09-07 22.51.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/dd4b4fd9-643f-dba5-3cb2-db461e7c538e.png)
＜Request content内容例＞
![スクリーンショット 2022-09-07 22.52.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/3496e83c-63f1-301f-8d81-6fac4fbd4bee.png)

返信メッセージは下のような訳のわからない英数字の羅列に見えますが、Parse JSONというモジュールを使ってこの羅列を読み取ると、本来の意味にわかりやすく変換してくれます
{"devices":[
{"num":"6","serial":"528237D8","model":"RTR502B","name":"50-EB326(2\u2103~8\u2103)","battery":"5","rssi":"3","time_diff":"540","std_bias":"0","dst_bias":"0","unixtime":"1662409159","channel":[{"num":"1","name":"","value":"4.3","unit":"C"}],"baseunit":{"serial":"58580787","model":"RTR500BW","name":"RTR500BW_58580787"},"group":{"num":"1","name":"Group1"}}
]}
あとは返信メッセージに、確認したい温度`value`をいれれば完成です

![スクリーンショット 2022-09-07 22.54.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/fcc1896c-d125-dde9-d0c8-fba435636ba0.png)
![RPReplay_Final1662559418_MP4_AdobeExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/8a463b7a-9735-5286-a3d0-07c1787aee16.gif)

これだけのことですが、希望の返事がきたときは、初心者の私にはかなり嬉しい出来事でした

## 3.2. ちょっと応用
次にこれをちょっと発展させます
LINEのメッセージでデータを確認するのもいいですが、記録は保管する必要があり、従業員全員が閲覧できる形で残さなければなりません
このままでは返ってきた温度データを点検表に転記するという手作業が発生します
そこでGoogle Sheetsモジュールを使用して、記録も自動でやってしまおうと考えました
本モジュールは複数の種類があり、目的に合わせて選択します
ここでは行を追加するというものでやってみました
使用するGoogle Sheetsを選択し、どこの列に何をいれるか指示します
私には、できあがった表をファイル形式や画像形式で送る術はなかったので、LINEの返信は「点検完了しました」というシンプルなテキストにしました
動画、写真は後ほどでてくるものと同様なので割愛します


## 3.3. 実戦
では本命の検査室の冷蔵冷凍庫（15台）のデータを一度に表にするという作業に挑戦します

複数台のデータを得る方法として、ホームページでも紹介されていた、シリアル番号をカンマで区切って欲しい分だけ並べてリクエストする方法、
おんどとりごとにHTTPモジュールを作る方法があります
前者がシンプルで簡単だと思ったので、試してみました
![スクリーンショット 2022-09-07 23.15.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/63d3496d-dd51-a626-d390-73f54f1f1f72.png)

ん？同じ温度？
念のため、おんどとりWeb Storageでデータを確認するも明らかに異なる温度を表示しています
原因はわからないけど、返信メッセージをわけてみたらうまくいくかなと思い試すも今度はエラー発生
LINE Botのリプライトークンは一度しか使えないのだそうです（そんな多分基本的なことも知らないレベルです汗）
仕方ない、見栄えは美しくなくても動けばいい、力技でつなげるべし！とひたすら単純作業を繰り返しました

いけー
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">がんばって動いてくれているが失敗作…<br>APIの制限をきちんと理解せず使った結果、利用回数の上限超えてました😭<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a><a href="https://twitter.com/hashtag/%E5%8A%9B%E6%8A%80?src=hash&amp;ref_src=twsrc%5Etfw">#力技</a><a href="https://twitter.com/hashtag/%E3%81%8D%E3%81%A3%E3%81%A8%E7%84%A1%E9%A7%84%E3%81%98%E3%82%83%E3%81%AA%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#きっと無駄じゃない</a><a href="https://twitter.com/hashtag/Make%E3%81%AE%E3%82%AA%E3%83%9A%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%9B%9E%E6%95%B0%E3%82%82%E3%81%97%E3%81%A3%E3%81%8B%E3%82%8A%E7%A8%BC%E3%81%84%E3%81%A0?src=hash&amp;ref_src=twsrc%5Etfw">#Makeのオペレーション回数もしっかり稼いだ</a> <a href="https://t.co/53rW49TYzr">pic.twitter.com/53rW49TYzr</a></p>&mdash; hosaka (@Rhosaka21) <a href="https://twitter.com/Rhosaka21/status/1568777948932743168?ref_src=twsrc%5Etfw">September 11, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


けなげに一つづつ動いていのがかわいいです
無事返信もきました
恐る恐るシートを開くと、、、

おお！できてる！
がんばったかいがあったなと、シートを横にスクロールしたところ
ん？シートが途中までしか埋まっていない
なんで10個しかデータ出てないの？という緊急事態に
Makeに戻ってエラーコードを確認してみると、
「**APIの利用上限を超過しています**」
・・・
**あ！**

## 3.4. 思わぬ落とし穴
そういえばホームページにこんなこと書いてあったけど、何言ってるかわからずスルーしていました
![スクリーンショット 2022-09-07 23.29.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/1c6d2eac-1afb-21f3-4d1a-83b763b73b70.png)

つまり青色のモジュールは、このAPIの場合２分間で10回までしか使えないということです
あんなにがんばってつなげたのに
と悲しみ、困っていたところ、ともにデジタルに関する勉強をする方から「**引数**」というワードを教えてもらいました
これはプログラムに渡す追加の注文のようなものだそうです
つまり、引数を指定すれば、先のカンマ区切り方式でもおんどとりごとのデータをもらえるかも？ということで
レッツ引数チャレンジ！
JSONの右上の１を押してどのおんどとりにどの引数が割り当てられているか確認、
Google Sheetsモジュールの希望列のところに`value`を選択し、`devices[`と`]: channel[`の間に引数をいれます
![スクリーンショット 2022-09-11 11.10.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/19c5e609-d473-4c82-f8cd-b7e302325a93.png)

＜引数を入れた様子＞
![スクリーンショット 2022-09-07 23.26.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/f510528c-2075-9789-7ea5-fdf9140d8daa.png)
これで準備完了です

## 3.5. 完成品
最終結果がこちら
![saisyuu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/54199ee6-a3f2-5ea1-ab45-0a8f5aca79ae.png)
先ほどのものに比べてかなりシンプルになりました

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">メッセージを送ると、おんどとりの現在値を確認し、温度が管理基準内か判定してくれて、同時にスプレッドシートに記録してくれるLINE Bot<br>注：表が動くのは一瞬です<br> <a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://twitter.com/hashtag/%E3%81%8A%E3%82%93%E3%81%A9%E3%81%A8%E3%82%8A?src=hash&amp;ref_src=twsrc%5Etfw">#おんどとり</a> <a href="https://t.co/YD1J0WCzuq">pic.twitter.com/YD1J0WCzuq</a></p>&mdash; hosaka (@Rhosaka21) <a href="https://twitter.com/Rhosaka21/status/1567643864269484032?ref_src=twsrc%5Etfw">September 7, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
点検表は、温度が基準内にあるか判定をしてくれるシートと、記録用に保存するシートを作りました

プログラミング言語や仕組みがなにもわからない私でも、それっぽいものを作ることができました！！

# 4. 今後の課題
完成翌日、気分ルンルンで上司に報告したところ、
データで温度を確認するからには一時点のみの記録でなく、前回の点検時からの動態をみるべきだよね、あと冷蔵冷凍庫だけじゃなくてインキュベーターにも使いたいよね
というフィードバックをいただきました
うう
でもおっしゃる通り、それにこのAPIには指定した一定期間のデータを得るという機能もついています
![スクリーンショット 2022-09-07 23.37.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/6989e1f9-d8dc-f303-6bd2-d7a63a937182.png)

時間を指定するのに必要な“unixtime”への自動変換など、まだわからないところもありますが、今後の課題としてチャレンジしてみようと思います

以上日々の点検業務をちょっと楽にするかもしれないアイデアでした
読んでいただきありがとうございました

# 5. 追記　**New!**
上司からのフィードバックをうけて、さらなるチャレンジ
グラフデータで動態を確認しない代わりに、一定期間のデータを取得し、その最大値、最小値、平均値を記録してくれるようなシートを作成することにしました

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おんどとりAPIにて、一定期間のデータ取得→最大値、最小値、平均値をGoogle Sheetsに記録<br>ができるLINE Bot<br> <a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://twitter.com/hashtag/%E3%81%8A%E3%82%93%E3%81%A9%E3%81%A8%E3%82%8A?src=hash&amp;ref_src=twsrc%5Etfw">#おんどとり</a> <a href="https://twitter.com/hashtag/LINEBot?src=hash&amp;ref_src=twsrc%5Etfw">#LINEBot</a> <a href="https://t.co/14myQ7ep3F">pic.twitter.com/14myQ7ep3F</a></p>&mdash; hosaka (@Rhosaka21) <a href="https://twitter.com/Rhosaka21/status/1569066040323354624?ref_src=twsrc%5Etfw">September 11, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

＜最終形態＞
![スクリーンショット 2022-09-11 22.41.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/e1045a60-e5dd-5a70-be07-6a2554a4887d.png)
＜作成したシートたち＞
unixtimeは写真にある計算で、見慣れた形式の時間に変更できました！
![スクリーンショット 2022-09-11 22.56.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/d08482c0-3a29-c322-c4f9-e30ece5bef0c.png)
＜HTTPモジュール中身＞
![スクリーンショット 2022-09-11 23.03.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/55131eca-209e-647d-56f5-688abb45ac8c.png)
＜Google Sheetsモジュールたちの中身＞
![スクリーンショット 2022-09-11 23.39.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/18d05b1a-b15f-0407-93a8-23978d297f5c.png)

技術的にはやっていることはほとんど変わりません
HTTPモジュールの中身を[指定期間・件数によるデータの取得](https://ondotori.webstorage.jp/docs/api/reference/devices_data_rtr500.html)に変更して、16:30~翌日8:30の間の点検を想定し、64個分（16時間分：15分に１度の取得に設定してあるため）の直近データを得るようにRequestしました
64個引数をいれるのはきつかったので、1時間に1つ分Getするものになっています
Google Sheetsで関数計算したものを別のシートに転記するのにいい方法がわからず、Search Rowsを3つつなげる不恰好な流れになってしまいました
何か方法があれば教えていただきたいです

また、この[指定期間のデータ取得](https://ondotori.webstorage.jp/docs/api/reference/devices_data_rtr500.html)は、複数の子機の指定ができないため、再び力技をしなければいけない気がして（このAPIは20回/60秒の上限なのでできるっちゃできる？）、今回はあきらめました
(欲しいのはおんどとり15台分なので、1時間おきにしても240回引数入れる必要が…、むしろそれを自動化したい…)

とりあえずここまでが今の私ができる限界です
他のツールと組み合わせたら、実際に使えそうなものができるかもしれません
挑戦はまだまだ続きます
最後までお付き合いいただき、ありがとうございました！