Raspberry Pi zero Wとcronとワンライナーでホームハックしたかった話
こんにちは.当ブログを開設して早2年.ラズパイの記事を更新しつつ,中国製無線モジュールをミニ四駆に積んで遊ぶ記事を用意していたのですが,内容が膨大になってしまったので,別件で進めていたこちらを.
〇開発の経緯
僕はとてもずぼらな人間で,たまーに部屋の電灯やエアコンをつけっぱなしにして家族に怒られます.ひどいときは父からのLINEが「エアコン消し忘れてたぞ」で埋まってしまうこともあります.
一人暮らしであれば自分の懐にダメージが入るだけですが,実家暮らしの今は下手を打てば家族総スカンを食らい追い出されかねません.そこで,科学の力に頼って解決することにしたのです.
(ずぼらな人間故,忘れないように努力するという発想はありません)
〇コンセプト
・先行研究
某ぐーぐるのアプリをつかって音声認識対応・Twitterから操作可能という例です.
・今回作るシステムのコンセプト
ここまでは必要ないのと、Linuxの勉強がてらcronを使ったシステムにします.
また、cronは決めた時刻にシェルのコマンドを実行するサービスです.
編集画面に収まるコマンドで色々賢い処理ができたら便利だなあ……と思ったのでcronから極力ワンライナー(1行に収まるシェルスクリプト)で動かすこととします。
ついでにボイスロイドの声とか出せたら素敵ですよね.
〇レシピ
今回使う主なお道具です。
・Raspberry Pi zero W
https://www.switch-science.com/catalog/3201/
ネット環境が使えるので,時間の扱いが楽です。
Linuxのシステムが活用できるのも強い。
・赤外線送受信モジュール
https://www.switch-science.com/catalog/3321/
・気温センサ(外付け用)
https://www.switch-science.com/catalog/3374/
・Bluetoothスピーカー
外付けセンサについて.ホントはモジュールに外付けタイプが付属している商品があるのですが,買い忘れて後から同じチップの商品を買って繋げました.(ボード直付けのものは発熱で当てにならない)
〇システム外観
〇センサの取り扱い関連
全て製品ページにあります.便利.
http://indoor.lolipop.jp/IndoorCorgiElec/RPZ-IR-Sensor.php
ただしlircdがなぜか動かず.ラズパイ起動の都度lircdを再起動したら何故かちゃんと動きました.どこでこけてたんだ……
〇Bluetoothスピーカーの取り扱い
ペアリングなど処理のためにBluetoothctlを導入しました.
https://mononichi.com/2017/09/raspberrypi3_bluetooth/
↑このへん参照.
スピーカーの仕様にもよりますが,音を出さないでいるとスリープしたり電源が切れてしまうようです.対策は以下.
一定時間ごとに無音のwavを再生するだけですが,効果は絶大.24時間安定して動作可能になりました.
〇音声関連
VOICEROID2 結月ゆかりさんのお声をwavファイルで導入します.
〇cron
いよいよ本番,cron部分の記述を行います.
PATH=/usr/local/bin:/usr/bin:/bin# m h dom mon dow command
*/10 * * * * sudo paplay ~/devel/nosound_one_millisecond.wav ; python ~/devel/rpz-lux.py >> ~/devel/luxlog ; python ~/devel/rpz-temp-o.py >> ~/devel/templog2
00 7 * * * bash "/home/pi/shs/airconoff-temp"
00 9,14-17 * * * irsend SEND_ONCE aircond off
00 10,14-17 * * * irsend SEND_ONCE lampd off
・ "PATH=/usr/local/bin:/usr/bin:/bin"
パイプ等のbashのコマンドが使えるように設定したつもりが,上手く動かず.ホントはワンライナーで動かしたかったのですが,今回複雑な動作はスクリプトにしています(中身は一行).
・” */10 * * * * sudo paplay ~/devel/nosound_one_millisecond.wav ; python ~/devel/rpz-lux.py >> ~/devel/luxlog ; python ~/devel/rpz-temp-o.py >> ~/devel/templog2 ”
3つのコマンドをまとめています.
1,無音の音声ファイルを再生してスピーカーのスリープを防ぐコマンド
2,照度のログを取るコマンド
3,温度のログを取るコマンド
これらが10分ごとに実行されます.
ログ取り用のPythonスクリプトはサンプルを出力部だけ適宜変更したものです.
・" 00 7 * * * bash "/home/pi/shs/airconoff-temp" "
7時きっかりに下記のスクリプトを実行します.
python ~/devel/rpz-temp-o.py | cutfew | lessthan 18 && sudo paplay ~/devel/AIRCON-ON.wav && irsend SEND_ONCE aircond on
まずrpz-temp-o.pyを実行すると,現在気温が少数第1位までで出力されます.
cutfewは少数部を切り捨てるスクリプト,lessthanは標準入力で受け取った数字が引数より小さければ正常終了するスクリプトです(新規で作成).これにより,18度より気温が低いときのみエアコンが起動,ゆかりさんの声(AIRCON-ON.wav)を再生する寸法です.
一部スクリプトは自作する羽目になっていますが,1行にまとまっています.(結局cronにそのまま載せられていないのですが……)
最後の2つは昼以降にしつこく電灯・エアコンのOFF信号を送っています.
さて,これでエアコンの自動起動・自動終了が可能になりました.
ラズパイゼロはちょいパワー低めですが,そこまで開発に困ることもなく,また毎日堅実に動いてくれています(軽いシステムではありますが).
それと,うちのエアコンはタイマー機能を使うとLEDが点灯してしまい,寝るとき目障りだったのですが,こちらはラズパイのLED光さえ隠しておけば気になりません.
思わぬ副産物も得つつ,ラズパイとゆかりさんが見守る快適な新生活が始まりました.
ですが,現実はそう上手くいきませんでした.
エアコンの自動化ができるようになって数日後.
今度は水道の蛇口を締め忘れました.
しかも温水で.
むろん夜にはボイラーのお湯が空.LINEが荒れたのは言うまでもございません.
……結局人間の方もソフト修正が要りそうです.
以上.
おまけ.
エアコンの赤外線のコードを記録する最,数字のコピペが要ります.エアコンのコードとなると作業が長く面倒なため,rubyで楽にするコードを先達
が公開していましたが,僕もシェルで作ってみました.
mode2 -d /dev/lirc0 > rec.txt
↓
cat rec.txt | awk 'NR>=3{print $2}' | datamash transpose > rec2.txt
ご参考に.
----19/10/07追記----------
夏に役に立つかと思った前述システムですが、親から(エアコンと電灯を勝手に操作する得体の知れない)PCをつけっぱにして出かけることを咎められホームハック禁止令を食らうという,くそ面白くもない結末になって机上に放置中です.
さらに先月、 今度は風呂のシャワーを出しっぱにしてボイラーを故障させてしまいました.センサ交換で修理代1万ナリ.いや良心的金額だけど.
誰か蛇口ハックする技と変なもの作っても怒らない親をください……
冗談はさておき,最近はM5stackでタミヤのロボットキットを改造してラジコン化し,小学生弟をビビらせようと計画,開発していました.
が,些末なミスで乾電池を破裂させてしまい自分がビビり散らかすことになってしまいました.机の上がヤバそうな液体でつゆだくになりました.しょーもない内容なのでブログには載せなさそうです.
ドライバまわりの開発情報は別件の仕事に流用できたのでよしとします.
------------------------------