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でタミヤのロボットキットを改造してラジコン化し,小学生弟をビビらせようと計画,開発していました.
が,些末なミスで乾電池を破裂させてしまい自分がビビり散らかすことになってしまいました.机の上がヤバそうな液体でつゆだくになりました.しょーもない内容なのでブログには載せなさそうです.
ドライバまわりの開発情報は別件の仕事に流用できたのでよしとします.
------------------------------
Rasberry Pi 3 Model B 設定覚書
最終更新:20200703
はじめまして,カッキーといいます.
このブログは趣味関連の記述他,技術(機械設計,電子工作,PC,DIYその他)系の覚書に使っていこうと思っています.
では早速……アレコレきちんと設定されたRaspberry Pi 3 Model B を仕立て上げる仕事を今やっているので,それ関係のことを実践しながらまとめて(引用して)おきます.
※(PC系は特に)トーシロなので試行錯誤します.
※後輩向けのマニュアルを兼ねているので,長く書いてます.
※20180824追記
何でか3B+を設定する記事タイトルになってたので修正しました.当時売ってなかっただろなんで間違えた.
※20180919追記
最近3B+をやたら設定した結果,同様の手順でいけることがわかりました.なんかあればまた更新します.
※20200703
もういい加減内容が古いです.のち,気が向いたら更新します.
内容.
①ユーザー設定とセキュリティ設定
②↑に伴うプロキシ設定
③日本語化,日本語入力設定
④シンボリックリンクの設定【追記】
⑤ネットワーク設定【追記】
Win32 Disc Imagerで,以前適当に作ったディスクイメージを焼いたmicroSD(16GB)を用意.それを本体にぶっこんでスタート.
※20180919追記
SDXC規格のSDを使う場合,ひと手間いります.
以下リンク参照.主な問題はファイルシステムのフォーマット.
上記で紹介されるguiformatは一度フォーマット(このときはexFATのままでよい)したSDカードでないとエラーを吐く(SDが使用中だと言われる).何故だ.
===※重要 20200703 ================
Raspberry Pi Imagerというやっべえ便利ツールが登場し,上記SD準備の手順が全てひっくり返りました.このツールでSDのフォーマットから最新パッケージのダウンロードまで全部終わります.Rasberry Pi 4でも同じ.
バックアップも,前はSDからイメージを丸コピーしていたけど,今はSD Card Copierできれいにコピーできます.(SDの容量個体差も吸収してくれるのでより安定)時代の進歩と自分の老いを感じるこの頃.
動かしてるだけでSDカードを破壊してた昔のラズパイはもういないんだ.
=================================
①ファームウェア・ユーザー設定・セキュリティ系
ここが詳しかったので,参照すると早そう.
ただし,このブログを見るような人間は学校とか会社で設定やらないといけない,つまりプロキシ越しに設定しなきゃいけない人も多そう(というか,僕がそうなんですけど).そこでこちらも.
②apt-get のプロキシ設定
この「Raspberry Pi で学ぶ電子工作」,僕も買いましたが面白い本です.ちゃんと電子工作の基本に関してフォローされてるのがいいですね.プルアップ・プルダウンに関してとか,Arduinoの教本(オライリーのやつ)には載ってなかったし.
ただ,バージョンの違いなのかディレクトリがちょっと違うので補足.
apt-getのプロキシ設定ファイルは/etc/apt/apt.confではなく,/etc/apt/apt.conf.d/02proxy 内です.記述自体は上述リンクのままで良し.
さて,基本の設定がほぼ完了.
あと役に立ちそうな設定……日本語化と日本語入力設定かな.いらん気もするけど,あって困るでもなし.むしろ,いざって時無いと地味に困る.
③日本語化,日本語入力設定
とりあえず日本語入力設定はやることに.日本語化もできればついでに.
ubuntu 14.04だとfcitx-mozcを使う方法が早かった記憶があったので,mozcでサクサク検索.
うむ,googleは偉大.
……と思ったのもつかの間.全然日本語が出ない.ibusの設定で全角半角キーで切り替わるよう設定.しかし無駄.何かおかしい.忘れてる気がする.
……そうだ,肝心のフォントを入れていない.上述リンクの方は他の方法を試す途中で入ったのでは.
……
正しい方法を求めて奔走.怒涛のリブート連発.SDはブート早くて助かる.
※20180919追記
ロケールの設定は初起動時に済んでいればよい.
これかな……やってみたところ日本語化には成功.
むむむ.
この2つを削除.
sudo apt-get autoremove uim uim-mozc
かなり頭悪いことしてるな……と思いつつ.開き直る.
sudo apt-get install fcitx-mozc
慣れ親しんだfcitxに頼る.インストール後再起動.ついに日本語入力できた.
(狙ったキーで切り替えを行うのにguiでの設定は必要だった)
===5/21追記===
キーボードレイアウトの設定もfcitx側でやるようだ.
==========
どうやら,
①ロケールの変更
②フォントのインストール
③入力メソッドの変更と設定
が肝のようだ.メモメモ.
しかしiBusは悪い話しか聞かない.僕の運が悪いのだろうか……
=20180919追記====
20180627リリースのRaspbian-STRETCHの設定をしていたところ,日本語ロケールの
設定をした後大抵行う「デスクトップ等home/内ディレクトリの名前をDesktop等英語に変更する作業」にて問題発生.(3Bも3B+も同じ症状が出た……当たり前か.)
LANG=C xdg-user-dirs-gtk-update
で今まではうまくいってたのだけど,失敗.xdg系パッケージののインストールでもうまく行かなかったので,以下リンクの情報にて解決した.
要約すると,~/.config/user-dirs.dirs に設定が書いてあるからそこをいじるといいよとのこと.これはうまくいった.
=追記ここまで=========
とりあえず今回はここまでです.まとめ.
・ユーザー設定とセキュリティ設定
・↑に伴うプロキシ設定
・日本語化,日本語入力設定
まあ日本語化に関しては設定済みイメージが出回ってるから,簡単に済ませたいひとはそっちでいいかも.でも自分でやるのもそれっぽくていいじゃない.
気が向いたらまた追記をします.それでは.
===追記===
④シンボリックリンクの設定
ロボット屋かIoTやりたいMakerでもなければ要らないと思うのだけど,必要な人にはかなり必要なので追記.
udev の設定をカスタマイズする - いますぐ実践! Linuxシステム管理 / Vol.115
↑参考サイト.rulesを書き込むディレクトリ名もそのまんま使えた.
ArduinoはPC接続時にシリアルポートとして認識され,/dev/内にttyACM*(UNOの場合)だとかttyUSB*(NANOの場合)といった名前でバッファとなるファイル(リンク)ができます.
で,このファイル名が他のUSBデバイス(ロボ屋的にはUSBシリアル変換モジュールとかLIDARとかDACSボードとか……)と被る,また差す度番号が変わってしまうので,USBを差した時点でArduinoを認識し,別の名前をつけてしまう.この新しい名前のファイルがシンボリックリンク.
ついでに権限を書き換えることで,管理者権限無しでユーザーが利用できるようにしたり.
USBデバイスがきちんと認識されていれば(認識がこける場合は扱わないこととする,モジュールのインストールとか必要.),lsusbというコマンドでベンダーID等が見られる.これをキーにして識別する.
とりあえず答えを書く.やたら#がつくのは.rules内に丸コピすることを想定しているため.
##for Arduino
KERNEL=="ttyACM*", OWNER="mekakky", GROUP="mekakky", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0043", MODE=="0666", SYMLINK+="Arduino"
##上部の文を/etc/udev/rules.d/ に10-myrules.rulesといった感じのタイトル(数字は優先順位,ほかの部分は適当)で入れればOK.
##説明##
## KERNEL=="ttyACM*" 対象デバイスの名前(頭の部分)
## 0WNER="mekakky" 権限をもつユーザー(デフォルトではroot. これをhomeユーザーにすることでsudoなしでUSBデバイスが使える.)
## GROUP="mekakky" 所属グループ(デフォルトではroot)
## ATTRS{idVendor}=="2341" ID(対象のデバイスを接続したときlsusbで出てくるものを打ち込んで指定)
## ATTRS{idProduct}=="0043" 同上
## MODE=="0666" モード(読み書き可能なモード)
## SYMLINK+="Arduino" シンボリックリンクの名前(好きに命名できる)ショートカットのようなもの.
## 上部の文の意味をざっくり説明すると,「名前の頭に"ttyACM"を含み」「ベンダーIDが2341で」「プロダクトIDが0043の」デバイスを,「権限者をmekakky」「所属グループをmekakkyに」に指定し,「モードを0666」とし,「シンボリックリンク"Arduino"を作成する」といった感じ.
##他にもいろいろ設定をつけられるので,調べるとよい.
こんなところか.前に身内向けに書いたマニュアルそのまま書いた.
じつは,IDが被る場合も存在する.そして,その場合はまた違った設定が要る.
が,まだよく理解していない.今回はここまでで.
===追記2===
⑤ネットワーク設定
これまた重要なやつを忘れていた.DHCPで事足りていたのだ.
リモート操作したい時は必要になるからね.
では今回の参考サイト.
これの前半がそのまま使えた.
/etc/dhcpcd.conf を編集する.
一番末尾に,
interface eth0
static ip_address=X.X.X.X/24
static routers=X.X.X.1
static domain_name_servers=X.X.X.1
適宜入力.順に,使用しているアダプタ(無線LANならwlan0だ),IPアドレス,ゲートウェイ,DNS.……多分これであってる.接続はできた.