ちぎっては投げるブログ

Programming, Android, RaspberryPi, Digital Devices, Kinkuma Hamster...

自分が帰宅しているかをRaspberryPiで検知する簡単な方法

I’m home

いつかのブログにも書いたかもしれないが、RaspberryPiで色々センサーをいじれるように遊んでいると、「自分が家にいるときだけ」という処理をしたくなる。

しかし、近接センサーは近くしか見ないし、照度センサーは窓の近くだと結構変わるし、わざわざそのためにBLEを使うのも……。

という場合に、簡単な方法として、自分のスマホのIPへpingを打って返り値を確認するという方法がある。

家に無線LANの環境があり、スマホだけ自宅にあるという状態がないのが前提である。

せっかくRaspberryPiなのにセンサー使わないのかよ!というのはあるが、手段よりも目的重視で……。

f:id:mczh:20170220221353p:plain Photo by geralt | Pixabay / CC BY 0

スマホの準備

まず、自分のスマホを固定IPにしておく。DHCPで他のマシンに取られないように、ちょっと外れた番号にしておくと良い。たとえば192.168.1.20など。

Linuxのpingは止めるまで打ち続ける仕様

Windowsのコマンドプロンプトから打つと数回で勝手に止まるが、Linuxから打つと無限に打ち続けるようだ。いつも無意識に止めていたから気が付かなかった。

しかし、無限に打ち続けられてしまうと返り値が取得できない。

どうせなら失敗したら返ってくるとか、成功するまでは打ち続けるとか、そのようなオプションがあれば楽だったが、見当たらない。

しかたがないので、指定した回数だけpingを打って、一旦その結果を取得して、その結果によって更にループさせたりbreakさせたりする必要がある。

指定した回数だけpingを飛ばす

指定した回数だけ実行させるには、-cのオプションをつける。

ping -c 回数 192.168.1.20

今回の目的では、1回pingを実行してスリープさせて、またpingを実行して、のループがいいだろう。

サンプルコード

#!/bin/sh
PING_TARGET="192.168.1.20"

MAX_SECOND=108000
SLEEP_SEC=5

#loop until ping success
count=$MAX_SECOND
success_count=0
THRESHOLD=5
while [ $count -ge 0 ] ; do
    ping ${PING_TARGET} -c 1 >> /dev/null
    rc=$?
    if [ $rc -eq 0 ] ; then
        if [ $success_count -eq $THRESHOLD ] ; then
            break
        fi
        success_count=`expr $success_count + 1`
    else
        success_count=0 #reset
    fi
    sleep $SLEEP_SEC
    count=`expr $count - $SLEEP_SEC`
done

if [ $rc -eq 0 ] ; then
   # 処理
fi

変数は適当に変える。 このサンプルは、5秒に一度pingを打ち、5回連続で成功すればbreakして、処理を実行する。 最大待ち時間は、約108000秒(6時間)にしてある。

このコードは、自宅に帰ったら勝手に照明をつけるためにRaspberryPiに仕込んでいるコードの抜粋である。

このスクリプトを、仕事の定時にcrontabで自動実行するようにしている。 すると、定時~6時間以内に家に着けば、勝手に電気がついてくれる。

ちなみに、シェルスクリプトのデバッグで困ったときは、

#!/bin/sh

の部分を、

#!/bin/sh -x

に変更すると、行ごとの処理をすべて表示してくれるのでわかりやすい。

問題点

問題点は、自宅にいながらスマホの電源が切れたりwifiが切れたりした場合である。

そのあたりは反応性の良さとのトレードオフなので、しきい値やチェック間隔を調整していい感じにしよう。

LINE Payの出金を自動で家計簿アプリZaimに登録させる計画だったもの

最近、還元率2+1%(たまに4+1%)のLINE Payカードを買い物利用のメインに切り替えた。

還元率はいいのだが、家計簿アプリのZaimへの自動登録機能がないため、毎回自分で登録することになり、家計簿をつけるのがかなり面倒になってしまった。

Zaim側が対応してくれればよいが、まだ対応予定にすら載っていないので、とうぶんは期待できない。

これをなんとか解決したいと考えて、以下ならできそうじゃない?と考えた計画をメモしておく。

f:id:mczh:20170117211843p:plain

なお今のところうまくいっていない。

計画

LINE Payは、使用するとLINEに金額の通知が来る。

この通知から日時と金額の情報をとって、Zaimに投げれば自動化できるのではないか。

LINEメッセージをどうやって読むか?

LINE Messagging APIという、Botを作るときに用いるAPIがLINEにあるので、これを使ってBotを作る。

Botを作って、そのBotをLINE Payの通知会話に登録させれば情報が拾えるのでは!?

ZaimもAPIを公開しているので、そちらは心配ない。

Botを作ってみる

herokuで動かすのが楽そうだったので、herokuのアカウントを作ってとりあえず固定文字列を返すbotを作成した。

特に大きくつまずく点もなく、資料もそろっていた。

落とし穴

さて、いざ出来たBotをLINE Payの会話に招待してみたところ、今まであった会話に加わるのではなく、新たなグループ会話が出来上がってしまった…。

f:id:mczh:20170117231916j:plain

これではLINE Payからの通知は取得できない。

さっそく暗礁に乗り上げてしまい、やる気を失いつつある。

もうひとつのアイデア

Androidだと通知領域のテキストを拾う的なことができた気がする。とすれば、LINE Payの通知から金額を拾えないだろうか? まだ調べていないが、通知されるテキストの長さによるだろうか。

ただ、これだとAndroidアプリとして作らないといけないので、ちょっと面倒だなという気持ちがある…

なにか良い方法はないだろうか。

denpa-shinbun.com

RaspberryPiでハムスター監視システムを作ろう 完成編

denpa-shinbun.com

構成

f:id:mczh:20170103192200p:plain

なるべくインスタントな作りにしようとしたため、Dropboxを使う。

機材は、 赤外線LED 1,280円と、LED用電源ケーブル 990円と、

赤外線WEBカメラ 1,398円と、

元から持っていたRaspberryPi(5,780円)である。

元から持っていたRaspberry Piを除けば、4600円ぐらいで監視システムが構成できた。

Raspberry Piを加えれば、おおよそ10000円ぐらい。 RaspberryPiは他にも汎用的に使えることが多々あるので便利である。たとえば温度や湿度の管理もやろうとすれば同じRaspberryPiで構築できる。

motion

ストリーミングと動画ファイルの作成にはmotionを使う。 Raspberry Piにmotionをyumでインストールし、daemonの有効化と、ストリーミング設定と、動きがあったときに動画ファイルを保存する設定を有効にする。 設定ファイルは、 /etc/motion/motion.conf にある。

Dropboxへのアップロード

GitHub - andreafabrizi/Dropbox-Uploader: Dropbox Uploader is a BASH script which can be used to upload, download, list or delete files from Dropbox, an online file sharing, synchronization and backup service.

のスクリプトをcloneしてくる。

Dropboxのアプリケーション設定をブラウザであらかじめしておき、トークンやらなにやらを取得しておく。

Raspberry PiでDropboxにファイルをアップロードしてみた: Raspberry Piでやってみたのアクティベーションを参照する。

セットアップの注意点としては、motionユーザで設定する必要がある点である。 sudo -u motion ./dropbox_uploader.sh で、motionユーザのセットアップをしておく。

motionからアップロードする

アップロード用のスクリプトを作る

#!/bin/sh

FN=$1
AVI=${FN%.*}".avi"
TARGET=`date "+%Y%m%d-%H%M%S"`.avi
/home/pi/Dropbox-Uploader/dropbox_uploader.sh upload $AVI $TARGET
rm $AVI

このファイルのフルパスを、motion.confのon_movie_endに指定する。

まとめ

以上で、リアルタイム監視と、ハムスターに動きがあった場合にDropboxにアップロードする仕組みが完成した。 夜中の何時に起きて何時に寝ているのか、回し車はちゃんと回しているか、など健康チェックが出来るので非常に助かっている。

時間が出来たら、実際の動画ファイルをこの記事に載せておこう。

これは動画ではなく、携帯で撮ったどアップな写真 f:id:mczh:20170103193455j:plain