LoginSignup
8
5

More than 1 year has passed since last update.

Teachable MachineとLINE Botで消耗品の棚卸をちょっと楽に。IT初心者が在庫記録システムに挑戦した記録。

Last updated at Posted at 2022-06-05

新しい技術は使わないともったいない!

こんにちは、私は食品検査会社で働く会社員です。
デジタルもITもよくわからぬままにアラフォーになってしまいましたが、
近頃、頑張ってデジタル技術を勉強しています。

今回、簡単に機械学習を行える「 Teachable Machine 」を知り、触ってみることにしました。

モノと情報を簡単に紐づけられるこの技術、どうやって使ったらいいんだ~? と頭をひねった結果、消耗品の在庫記録システム があったら便利かもと思いました。
isogashii_hakui_woman縮小.png

課題

弊社では3か月ごとに検査で使う消耗品の棚卸をしています。 消耗品ごとに個数と単価、購買先を調べて記録しないといけない ので、若干面倒です。また、検査担当ではないメンバーが棚卸を実施すると、そもそも 物品を見ても名前がわからない
この課題を解消したいと思いました。

使用したツール

作りたかった流れ

Webカメラで消耗品の画像を撮影 → Node-REDにつないだTeachable Machineで判別 → 結果をMakeへ送る → スプレッドシートの単価・購買先リストと照合 → 消耗品の名前、単価、購買先をスプレッドシートに追記&LINEへ送信 → LINEにメッセージが来たら消耗品の個数を入力してLINE Botへ送る → Makeで受信して個数をスプレッドシートに追記 → LINE Botから完了しましたのメッセージが届く

なお、今回は残念ながら、取り消し線の部分の実装はできませんでしたので、こうやったらできなかったよの試行錯誤の記録としてお読みください。

2022.6.7追記 赤文字部分の実装にこぎつけました!

完成品の動画

Node-REDの様子

LINEの様子

Teachable Machine

消耗品3種類のデータセットを作りました。
(Teachable Machineの詳しい使い方は下記の参考資料を参照ください。)

teachable machine.png

Node-RED

全体像
nodered.png

各ノードの設定を表示(折りたたみ)

nodered tmノード.png

Urlには自分がアップロードしたTeachable MachineのデータセットのURLを入れてください。

nodered tempノード.png

プロパティのpayloadの後ろには後述のMakeで作ったカスタムWebhookの変数名として設定したものを書いてください。
(例:payload.bihin)

nodered http reqノード.png

メソッドは「GET」、URLはMakeで作ったカスタムWebhookのURLを入れてください

そのほか、「debugノード」「http responseノード」に変更はありません。

Make

うまくいかなかったときの試行錯誤の記録(折りたたみ)

全体像①(Node-REDからTeachable Machineの結果を受信してスプレッドシートとLINEへ送る)
make.png

各モジュールの設定を表示(折りたたみ)

make cwh.png

このWebhookのアドレスをコピーしてブラウザに貼り付け、「WebhookのURL?変数名=テキスト」を入力してエンターを押すとAcceptedと出るのを確認する(この手順はWebhookに型を教えている?教えてもらった手順ですが、正直何が起こっているのか理解していません)。
(例:WebhookのURL?bihin=キムワイプ)

gs sr.png

別途用意したスプレッドシートの中身をSeach Rowsのモジュールで照合します。A列(備品名)とWebhookの変数「bihin」が同じ行を見つけます。エクセルのvlookupみたいなもの?

gs ar.png

書き込み用のシートにAdd a rowモジュールで入力します。

line.png

LINEにも結果を送ります。ユーザーIDはLINE Developerで確認したユーザーIDを入力してください。

全体像②(①が終わった後で、ユーザーが消耗品の個数を入力すると個数をスプレッドシートに追記する)
make2.png

ここで問題発生!
Makeの「Update a row」モジュールでユーザーが入力した数値をスプレッドシートの個数の列に入力したかったのですが、
Makeでスプレッドシートの最終行の取得ってどうやるの??
エクセルのVBAでも次の空の行に入力したいけど現在何行目かが固定でない場合は、最終行を取得してプラス1するっていう流れをよく書きます。

line画面.png

表.png

教えてもらったところによると、同一のシナリオだったら「Add a Row」モジュールが現在何行目かの情報をもっているとのこと。「Add a row」モジュールを追加してためしに「Row number -1」のような設定が可能か見てみましたが、エラーが出てだめでした。
agaki.png

また、さらに教えてもらったところによると、現在、2つのフローは別々のシナリオ上にありますが、2つのフローを同一のシナリオ内で動かすことができるそうです。同一のシナリオの中で「set variable」などの変数の受け渡しができるモジュールに「Add a Row」のRow number情報を設定すればいけるかも!
しかし! 残念ながら、単純に2つのフローを1つのシナリオに持ってきただけでは動きませんでした。
やはり、ルーターのような高度なテクニックを使わないとだめ?

agaki2.png

2022.6.7追記 前回試行錯誤したところから、助言をもらって完成に持っていけましたので情報共有いたします!

【改】全体像①(Node-REDからTeachable Machineの結果を受信してスプレッドシートとLINEへ送る)
完成品①.png

【改】全体像②(①が終わった後で、ユーザーが消耗品の個数を入力すると個数をスプレッドシートに追記する)
完成品②.png

ポイントは Data store です!!
2つの独立したシナリオにおいて、それぞれのシナリオの変数の値を受け渡したい場合はData storeが使えます。
ここでは①のシナリオの「Add a Row」が持っている現在の行数「Row number」の値をData storeへ渡して、②のシナリオを動かすときにData storeから値を引っ張り出してきています。
data store.png
data store設定.png
(行数の値は数値なので、型はNumberです)

シナリオ①②の各モジュールの設定

data store設定2入れるほう.png
①のシナリオのData storeモジュール(Update a record)で「Row number」を記録します。

data store設定2出すほう.png
②のシナリオのData storeモジュール(Get a record)では行数の値をもらってきます。

data store設定2gsの設定.png
さらに②のシナリオの「Update a row」の「Row number」にData storeの行数の値をセットしてあげれば完成!

ちなみにData storeの中はこんな感じ

data storeの中.png

消耗品の個数が入力できるようになった完成品

LINE完成3.png
わ~!!完成!!嬉しい!!

まとめ

機械学習というと遠い世界のお話のように感じられましたが、今回やってみて意外と簡単に自分のPCでもできちゃうんだなぁと驚きました。また、Makeでのスプレッドシートの最終行の取得が意外と難しいというのは盲点だったので、引き続きどうしたらよいか調べていきたいと思います。VBAやGASだったらできるのにくやしい!ローコードツールは便利だけど、ついていない機能についてはどうしようもないので、自分でコードが書ける力を身に着けたいと強く思いました。

2022.6.7追記
おかげさまで完成に持っていくことができました。
この記事がMakeのシナリオ間での値の受け渡しに困っている誰かに届いてくれると嬉しいです。

おまけ

Teachable Machineから出力されたJavaScriptのコードを使って、CodePenで動かすのもやってみました。本当はCodePenから情報をNode-REDあるいはMakeへ送れたらよかったのですが、できませんでした。ついでにJavaScriptの本に書いてあったHTMLの文字を書き換えるという処理をボタンを押して実行できるようにしました。これはTeachable MachineのWebカメラの下に表示されている文字がちらちら切り替わるので、ボタンを押すと、(ボタンを押したタイミングで表示されていた文字が)上部の「ここを書き換える」欄に表示されるというのに挑戦したものです。初JavaScript動いて嬉しい!初心者には大きな一歩!

以上、御覧いただきまして誠にありがとうございました。

参考にした資料

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5