Jetson nanoに(まだまだ未熟な)AIをのけて、赤ちゃんの状態を検知できるようになったので
とりあえずシンプルなところから
状態を検知して、LINEにメッセージを送ってくれるようにしたいと思います。
Line Developerのフリープランは1000通/月のメッセージの制約があるので、
下記の条件でメッセージを送る予定です。
- 8,12,18時:定期的なメッセージを送信
- 泣いた時等:特定の状態を検知するたびにメッセージ
定期的なところは、時間くればメッセージ送るだけなので、
今回は、特定の状態を検知した時のメッセージ送信をします。
目次
完成時のLINE受け取りメッセージ
こんな感じで、泣いてたら、LINEのメッセージがくる
システム構成
システム構成案を最初検討した時、PUSHメッセージ使えないと思っていたので、
当初と構成案と違って、Jetson nanoから、LINEへメッセージを送る線が追加されます。
黒塗りの部分は今回は関係ありません
- Jetson nanoのAIで状態(泣いている)を検知
- 状態に応じて、xserverにFTPで画像を保存
- LINE Message APIでLINEにメッセージ送付
「1. Jetson nanoのAIで状態(泣いている)を検知」は下記で作った、AIの結果を使います。
XSERVERにデータ保存
LINEで画像を送るために、xserverにJetson nanoから画像をFTPで転送します
FTP転送のpythonコード
from ftplib import FTP
ftp = FTP(
host = "",
user = "",
passwd=""
)
with open("転送するfile path", "rb") as f:
ftp.storbinary("STOR サーバー側のfile path", f)
LINEにメッセージ送付
Jetson nanoからLINEにメッセージを送る場合、LINE Message APIのPUSH Messageという
機能を使います。
ちょっと前は、フリーアカウントでは使えなかったようですが、最近変更されて使えるようになったようです。
PUSH Messageの詳細は下記参照ください。
コード
ライブラリ関係
from linebot import LineBotApi
from linebot.models import TextSendMessage,FlexSendMessage
import json
import random
メッセージ送信
cry.jsonファイルでテンプレートを読み込んで、xserverに送付した画像URLに乱数をつけます。
乱数つけない場合は、ファイル名が都度変更すれば良いと思います。
乱数つけていないと、キャッシュが残ったように、画像が更新されません。
*追記
乱数追加せず、都度ファイル名を変更した方が良さそうです。
過去のメッセージも、同じファイルを参照しているので、過去のメッセージが新しいものに置き換わってしまいます。
f = open('cry.json')
messages = f.read().replace('%rnd%','%d' % random.randint(1,1000))
messages = json.loads(messages)
messages = FlexSendMessage(alt_text="泣いてるよ。゚(つД`)゚。", contents=messages)
LINE_CHANNEL_ACCESS_TOKEN = "channel access token"
line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)
user_id = "user id"
line_bot_api.push_message(user_id, messages=messages)
cry.json
flex messageのテンプレート。flex message simulatorとかを参照にして、作ります。
{
"type": "bubble",
"hero": {
"type": "image",
"url": "https://***/latest_cry.jpg?=%rnd%",
"size": "full",
"aspectRatio": "7:5",
"aspectMode": "cover"
},
"body": {
"type": "box",
"layout": "vertical",
"spacing": "md",
"contents": [
{
"type": "text",
"text": "**泣いてるよ",
"wrap": true,
"weight": "bold",
"size": "xl"
}
]
}
}
最後に
なんとなく、AIが赤ちゃんを見守ってくれている雰囲気になってきたのではないでしょうか?
作りながら、赤ちゃんの見守りにJetson nanoである必要性はないなと思ってきましたが、
エッジAIの活躍の場はいろんなところにあると思いますので、それらも想定して、Jetson nanoを
使っていくのは良いのかなと思っています。
泣いている状態のメッセージが来たら、次は、遠隔で赤ちゃんに何かしてあげたいということで、
LINEでメッセージを送ることで、音楽を鳴らすなどを実装してみたいと思います。