なんちゃって主夫のありあわせ食材でチャチャっとスマートホーム
https://gyazo.com/659aa144929e1ca87b6fd913d7675e9c
2019/12/16公開
これから参加する人に参考になればと思い、公開しました。
お楽しみください。
応募内容の概要
オムロン環境センサと家に既にあった機器を使って、お金と手間をかけずに、なんちゃってスマートホームを作る。
前菜(はじめに)
私は、なんちゃって主夫です。家の中で家事などの作業をやり、空き時間には趣味のなんちゃってプログラマなどをしています。家中心の生活なので、どうしても運動不足気味になってしまうので、いつもなんとかしたいなと考えています。
今回、みんなのラズパイコンテスト2018でオムロン環境センサ2JCIE-BL01(以下、環境センサ)を無償提供していただけたので、ラズパイと環境センサなどを使って、主夫生活が楽しくなるように、ありあわせ素材でチャチャっと簡単ななんちゃってスマートホームシステムを作ってみました。
ただ、主夫なのであまり自由になるお金がないことと、家事以外の空き時間もそれ程多くないため、以下を目標にコース(システム)を作成しました。
ありあわせ(節約): できるだけ手元にある食材(ハードウエア)だけを使って出費を抑えます。
チャチャっと(時短): 色々なところで公開されている、先人のレシピをできる限り使わせてもらい、手早くコース(システム)を作ります。
既にあるレシピ(ソフトウエア)を使うため開発言語などがまちまちになりますが、言語と言語の間はUNIXのshellやcronなどをつなぎにして使います。
では、私のコース(システム)をお楽しみください。
コース(システム)
今回作成したコース(システム)は、図の通りです。
https://gyazo.com/659aa144929e1ca87b6fd913d7675e9c
以下、はじめに作ったメニュー(機能)について、次に食材(ハードウエア)、レシピ(ソフトウエア)と順番に説明していきます。
作ったメニュー(機能)
今回作ったメニュー(機能)は、以下のとおりです。
環境センサやmicro:bitから、センサデータの収集をします(Bluetoothの近海データ集め:データ収集部)。
熱中症度が高い時に、音声で警告をします(あんじょうしいや:警告部)。
歩数が少ない時に、音声で警告し、エクササイズの動画を流します(あんじょうしいや:警告部)。
音声で照明を制御します(もっと光を:照明部)。
自動で照明を制御します(もっと光を:照明部)。
Bluetoothの近海データ集め:データ収集部
データ収集部は、環境センサとmicro:bitをBluetooth経由でラズパイにつなぎ、ローカルのCSVと、クラウドのAmbientに記録するようになっています。
環境センサでは、取得可能な全てのデータを集め、記録します。
micro:bitでは、加速度計データを取得し、歩数に変換したのち記録します。
https://gyazo.com/605c92365d737585689dd6d171e833ea
センサからのデータ取得には、Bluetoothでの接続性が必要なため、センサはラズパイから近い場所、つまり、家の中で利用することになります。
以下に、Ambientに記録したデータをグラフ化したものを示します。左がmicro:bit歩数計による歩数データで、右が環境センサで測定したデータです。
データの収集のみの目的以外で、スマートホームのメニュー(機能)を実現するために利用しているデータは、歩数と明るさ、熱中症度です。
https://gyazo.com/5c55796fa579b028a8cfb241f7678c64
あんじょうしいや:警告部
警告部では、歩数と熱中症度によって、Google Homeを使った音声警告を定期的に行います。歩数が目標より少ない時には、ランダムなエクササイズ映像が、Chromecast経由でTVに自動再生されます。
https://gyazo.com/bbdb81d90a77658f4a984cce7948edff
電気の勝手に声かけ風味:照明部
照明部は、二つのメニュー(機能)を組み合わせたものになっています。
Google Homeの音声コマンドで、ラズパイに接続された赤外線リモコン経由で、照明の点灯・消灯の操作ができます。
ラズパイが環境センサの明るさを使って、自動で照明の点灯・消灯の操作を行います。
https://gyazo.com/c41443e9ea6e5d0c2f80445aff20cfa3
食材(ハードウエア)
今回、コース(システム)を作るために利用した食材(ハードウエア)は、以下の通りです。いずれの食材も、環境センサの無償提供が決まった時点で既に持っていたありあわせのもので、追加の出費はありませんでした。
https://gyazo.com/75bcf6d8f664eefe6e1a4aebee74033e
赤外線リモコン部
ラズパイにGPIO接続した赤外線リモコン部の回路図は以下のとおりです。手元にあったありあわせ素材(部品)で作りました。利用した部品一覧は、表の通りです。
https://gyazo.com/3b126e73290408f9d33d0dba4e3fed28
https://gyazo.com/226dbd855b780bd1a4c28806fec8dfc3
盛り合わせ(機器配置)
盛り合わせ(機器配置)は、写真のようにしました。
ラズパイ: 赤外線リモコンによる照明の操作と、HDMI CECを使ったTV電源の操作のために、TV横に設置しました。
環境センサ: 照明の明るさをはっきりと取れるように、照明に近い掛け時計の振り子部分に設置しました。
micro:bit: 加速度計を使って歩数が取れるように、電池をつけて、ズボンのポケットに入れました。\
https://gyazo.com/c57c91db6628dc0718b696691b326e29
レシピ(ソフトウエア)
色々な所で公開されているオリジナルレシピ(ソフトウエアライブラリや記事)を利用して、コース(システム)を作りました。「レシピ」で利用できる部分は再利用して、システム構築に必要な部分だけ「もう一味」としてプログラミングを行ないました。
また、うまく組み合わせ切れず問題が生じた場合は、サービスの再起動などの力技で解決したところもあります。
Bluetoothの近海データ集め:データ収集部
環境センサの環境データと、歩数計のためのmicro:bitからの加速度計のデータは、Bluetooth経由でラズパイに集められます。データは、IoTデータ可視化サービスのAmbientと、ローカルにCSVとして保存します。
オムロン環境センサのデータ収集のためには、以下のようなレシピを使いました。
環境センサからのデータを5分毎に取得し、Ambientに記録します (env2ambientCS.py)。
もう一味: データをCSVとしてローカルにも記録します。
micro:bit歩数計データの収集のためには、以下のような二つのレシピを使いました。
レシピでは、それぞれ、加速度計のデータを取得し, ボタンが押された時に処理を行い, LEDに文字列を表示します。
加速度センサの値から、歩数に変換します。
もう一味
Aボタンが押された時に、歩数をmicro:bitのLEDに表示します。
micro:bitの加速度データを80ms毎に取得し、歩数を計算、出力は5分毎にCSVに記録します(my_pedometer.js)。
5分毎に、別シェルスクリプト(pedo_ambient.js)でAmbientに記録します。
二つのBluetoothデータ収集系(env2ambientCS.py, my_pedometer.js)は別スクリプトとして実装されており、まれに停止する時があるため、5分毎に監視し、10分以上停止していた場合Bluetooth関連を再起動するようにしています(reboot_bluetooth.sh)。
あんじょうしいや:警告部
警告部では、ラズパイから記録されたデータの値にもとづいて、Google Homeで音声による警告を行います。
環境センサの熱中症度を使って、値が大きい時にGoogle Homeから警告を送ります。
micro:bitから集めた歩数データが小さい時には、運動をするように警告し、Chromecastを使って自動でエクササイズビデオをTVに流し、ビデオが終わった頃にHDMI CECを使ってTVの電源を切ります。
Google Homeから警告音声を出すために、以下のレシピを使いました。
ラズパイなどからGoogle Homeをしゃべらせます。
もう一味: 熱中症度や歩数に応じて、音声による警告を行います。
音声による熱中症度(環境センサ)警告(alert.js)
音声による運動不足(歩数計)警告(pedo.js)
ChromecastでYouTubeの動画を再生するためには、以下の三つのレシピを使いました。
Chromecastを使って、Youtubeなどの動画を再生します。
もう一味: 歩数に応じて、ランダムに選んだエクササイズ動画を再生します。
YouTube Data APIを使って、ビデオの再生回数を取得します。
もう一味: TVの電源を動画再生後に切るために、ビデオの再生時間を取得するようにしました。
HDMI CEC(cec-client)を使ってTVの電源を操作します。
もう一味
TVを観ている時(もともと電源が入っている時)には、エクササイズ動画は再生しません。
エクササイズ動画が終わったあとに、TVの電源を切ります。
電気の勝手に声かけ風味:照明部
照明の操作は、音声での操作と、環境センサの明るさによる自動操作の、二つの方法で行います。照明は赤外線リモコン付属のものを利用し、ラズパイのGPIOにつないだ赤外線LEDから操作します。
Google Homeからの音声命令は、IFTTTで受け取り、Web RequestでBeebotteを経由して、MQTTでラズパイに送られ、最終的にラズパイで赤外線リモコンをirsendで操作して、照明をオン/オフします。
ラズパイに繋いだ赤外線LEDを使った赤外線リモコン操作のためには、以下のレシピを使いました。
もう一味: 環境センサの明るさに応じて自動で照明を操作する (light_simple_once.sh)
Google Homeへの音声コマンドから、ラズパイで任意の命令を実行するためには、以下のレシピを使いました。
音声による照明の点灯、消灯(light_mqtt.py)を行います。
もう一味: 汎用的な赤外線リモコン用ライブラリlircを使って赤外線リモコンで操作するようにしました。
定期実行部
cronを利用した定期実行では、以下のようなスクリプトを動作させています。
家族がいる土日や朝夕夜には、自動照明調整や音声警告やエクササイズビデオ上映が行われないように調整しています。
自動照明スイッチ: 現在の明るさによって、しきい値判定して照明をオン/オフ
*/5 6-20 * * * pi /home/pi/bin/light_simple_once.sh
Ambientへのデータ記録: ローカルCSVデータをAmbientに記録
*/5 * * * * pi /home/pi/ambient/pedo_ambient.js
*/5 * * * * pi /home/pi/bin/raspi_stat.js
Google Homeへの警告メッセージとエクササイズビデオ上映
30 8-15 * * 1-5 pi /home/pi/myhome/alert.js
0 12-15 * * 1-5 pi /home/pi/myhome/pedo.js
Bluetoothデータ収集部の再起動: Bluetooth部不調の時に再起動
*/5 * * * * root /home/pi/bin/reboot_bluetooth.sh
*/5 * * * * root /home/pi/bin/reboot_pedo.sh
お味はいかが?(まとめ)
今回、オムロン環境センサを無償提供していただけたことで、思いもよらずみんなのラズパイコンテストに応募することになりました。
無償提供が決まってから作ったシステムなので、つぎはぎだらけのものになりましたが、楽しんで作ることができました。
以下、このコース(システム)についてのいくつかのエピソードを書きたいと思います。
手間がかかったところ
照明の点灯状態がラズパイ側から取得できないため、自動点灯機能の実装に苦労したが、単純な閾値を使うだけでそれなりのものができました。
2つのBluetooth(環境センサ、歩数計)の干渉かなにかで、Bluetooth経由のデータ収集がたまに止まることがあるので、再起動するようにしました。
美味しくないところ(問題点)
環境センサと歩数計は、ラズパイからBLEが繋がる範囲でしか利用できないので、現実的には家の中でしか使えません。
赤外線リモコンが届くところで、TVにHDMI接続できる必要があるので、ラズパイの設置場所が限られます。
新たなレシピに向けて(今後の作業)
今後、以下のような機能をシステムに追加していきたいです。
環境センサやmicro:bit歩数計をラズパイとBluetooth接続できていない時でも利用できるように改良したいです。場合によっては、ラズパイ0Wなどのロガーを使う構成も考えてみたいです。
赤外線リモコンで操作できる家電に、クーラーやTVなども追加したいです。
おわりに
自分の知識などが足りなく、あまり面白いものができませんでしたが、意外と便利で、これからも改良して使っていこうかなと思っています。
欲を言えば、外でのデータ収集のために、以下のような腕時計型の「オムロン人間センサ」が欲しいなと思いました。
基本的な生体関係データ: 心電計, 脈拍計, 体温計, 酸素飽和度など
その他のデータ: 歩数計, GPSログ
オムロン環境センサのデータ: できれば全てのデータが欲しいが、明るさ, UV, 気温, 熱中症度などは色々使えそう
アピールポイントなど、審査員へのメッセージ
応募のきっかけは、とにかく、オムロン環境センサを使ってみたくて、無償提供してもらえるなら頑張って応募しようと思いました。どうせなら、既に家にあったスマートスピーカーなどの素材(機材)をなんとかお金をかけずに連携させて、スマートホームを作ってみたくなりました。
このコース(システム)は、お金も時間も無かったので、既にあるレシピ(ソフトウエア)や素材(機材)を組み合わせて、足と頭を酷使して作ってみました。ありものレシピを使ったので、利用言語がPython, Node.js, シェルスクリプト(sh, bash)と色々になったので、頭の中でごっちゃになって戸惑うこともありました。つぎはぎだらけのコースでも、作ってみれば愛着も湧くし、それなりに便利なので良かったです。
一番困ったのは、Bluetooth接続のセンサ入力が不定期に不安定になることで、動作を監視して、データ収集で問題が起こらない程度の間隔で再起動するという力技で解決しました。食材(機器)配置には、環境センサは照明の明るさが取りやすい場所が必要で、ラズパイ本体は赤外線リモコンが届いてさらにHDMI CECが使える場所が必要と制約が多く、赤外線リモコンの出力調整で苦労をしました。
受賞
https://gyazo.com/48d106249b1aa3a928d4ca29f4d0dcfd
参考文献
更新履歴
2019/12/24 図中、「IrDA」と間違っていたところを「赤外線リモコン」に変更