はじめに
IoTという言葉が一般的でなかった2001年から続いているIoTサービスがある。象印マホービンのみまもりほっとラインだ。
年老いた親が使う電気ポットの利用状況を遠く離れた地に住む子供が確認できるというもの。日常生活に紐付いていて監視しているイメージを持たせない、実に素晴らしいサービスだ。
さすが象印、ヒントでピントの昔から時代の最先端を行っているな。
とはいえサービス開始から20年、この手の技術はより身近になっている。先駆者に敬意を抱きながら素人の私が同等のものを作ってみた。
今回は技術的なポイントを列挙していく。具体的な内容は今後記事にしていく。
構成
ポットでなく冷蔵庫を監視する。実家の冷蔵庫にリードスイッチ(開閉センサ)を取り付け、その状態をラズパイからGoogleスプレッドシートに送る。息子である私はLINEでその内容を確認する、といった具合だ。
Wi-Fi環境さえあれば月額使用料は無料。
技術トピック
GPIO
LEDを光らせるのの逆でリードスイッチのオンオフの状態を取得しているだけ。チャタリングを考慮して開時間0.1秒以下はノーカンとした。
LEDは必須ではないが、プログラムが生きていることを示すために付けている。当初は自動起動を確認するため「閉時点灯/開時消灯」としていたが、使われていない暗い台所でLEDだけが光っているのは気持ちよくないので「開時点灯/閉時消灯」とした。
Googleスプレッドシート
データベース
ラズパイからはgspread
を使ってGoogleスプレッドシートにデータを書き込んでいる。
gspread
にはappend_row()
という最終行の次の行にデータを追記してくれる便利な関数があるのだが、我が環境では挙動が怪しかったので1行追加して最終行の次の行のセルにこつこつとデータを入力する処理をしている。
グラフ
構成の中では省略したが、グラフを作って(LINEではなく)我がホームページ上で見えるようにしている。
Googleスプレッドシートのquery関数にはjoinが無いが、無ければ無いでどうにかなってしまうのが面白いところ。
GAS
LINEとのやりとりを含むメイン頭脳がGASだ。
上のグラフも地味にGASを使っている。Excelならグラフタイトルにセル参照を使うことができるが、Googleスプレッドシートではできない。そこでトリガー(タイマー)を設定し、毎日0時にグラフタイトルを変更するスクリプトを発動させるようにした。
LINE
LINE Messaging API
LINEのメッセージ送信方法は2種類ある。応答メッセージとプッシュメッセージだ。
https://developers.line.biz/ja/docs/messaging-api/sending-messages/
- 応答メッセージはユーザーからのアクションに答えるもの。「最近」と聞かれれば直近の利用時刻を、「今日」と聞かれれば今日1日の概要を、「今週」と聞かれれば過去8日間の概要を返してくれる。
- プッシュメッセージは任意のタイミングで発信するもの。我がアプリでは、毎日23時過ぎに今日一日の概要を報告してくれる。
LINEリッチメニュー
企業アカウントによくある、画面下部にあるグラフィカルなメニュー。ウェブ上にはフリープランでは使えないという記事もあるが、2019年4月以降はすべてのプランで使えるようになっている。
https://www.linebiz.com/jp/column/technique/20180731-01/
前述の「最近」「今日」といったコマンドは都度入力するのではなくボタンで発信されるようになっている。
ただ一つ問題があって、それは私に絵心がないことだ。
自動起動
Raspberry Piでプログラムを自動起動する5種類の方法を比較・解説を参考にsystemd
による自動起動を設定した。
ここで失敗があった。開発環境では問題なく動くのだが、冷蔵庫にセットすると自動起動に失敗してしまうのだ。台所にWi-Fiが届いていないわけではないし、開発環境と本番環境の違いはモニターやマウスの有無くらいなもの。それが自動起動の成否に影響するなんてそんなオカルトあり得るのだろうか!
これについてteratailに質問を投げたところ、速攻で回答をいただくことができた。何でも、SSL処理をするには十分な乱数が必要なのだが、キーやマウスの入力がないと乱数が作れないらしいのだ。オカルトではなかったが原因はまさにそこだったわけだな。
停止と再開
これでいったん完成とし、実家に取り付けた。しばらくは正しく動いてくれたが数か月後に動きが止まってしまった。もちろん親が死んで冷蔵庫を開ける人がいなくなったわけではなく、ラズパイが信号を送らなくなっていたのだ。
そこでsubprocess
でサブプロセスを監視し、終了したら再起動するようにした。
さらに、毎日深夜3時にラズパイをリブートするようにした。
さらにさらに、1時間に1回、ラズパイが生存報告するようにした。
さらにさらにさらに、起動時に起動日時や直前のエラーメッセージをGoogleスプレッドシートに送るようにした。
これらにより、冷蔵庫開閉データだけでなくラズパイの起動状況もGoogleスプレッドシートで確認できるようになった。
ラズパイのイメージ化
運用中のSDカードがダメになったときのため、また実家で運用しつつ自宅で改良を進めるため、ここまで作りこんだSDカードをイメージ化して保存するのも重要だ。
ボツにした仕様
- ひとつ前のリクエスト日時とその時点での最新データを覚えておき、次に問い合わせたときデータ更新がなかったら「前回と変わりありませんよ。せっかちですね」と利用者をからかったり、24時間以上利用がなかったら「心配ですね。一報入れてみたらいかがでしょうか」と提案してきたりという機能を思いついたのだが、どうせ使うのは自分だけなのでボツにした。
- ラズパイの生存確認はLINEで問いかけるとラズパイが返事をするという仕様にしたかったのだが私には難しすぎた。Pythonの無限ループの中にスプレッドシートを確認する処理を入れたところ、
gspread
をはじめとするGoogle Sheets APIには使用制限があるのであっという間にパンクしてしまったこともあった。 - グラフをLINEに送るのは成功しているが機能としては除外した。情報量がそこそこ多いので、グラフを読み解くのを強いるよりも概要を示してやるほうが利用者にとって優しいと考えたのだ。利用者といっても私一人だけど。
終わりに
…という活動をこつこつと進めていた(teratailに質問したのは2月)のだが、完成させる前に同等の機能を内蔵している製品が登場していた。**スマホとつながる日立のコネクテッド家電・冷蔵庫対応「ご家族見守りサービス」**だ。
後付けのサービスが存在することは知っていたが、とうとう製品に織り込まれたか。
イマドキの冷蔵庫はUSBポートが付いたりといろいろ変わっているのだな。冷蔵庫の中をスマホで確認できるようになる日ももうすぐだ。