読者です 読者をやめる 読者になる 読者になる

もみあげあしめ

組み込みとかIoTとか、いろいろ

【ネタ】自動おかえりシステムを作る

Raspberry Pi BLE Fitbit IoT ネタ シェルスクリプト BlueZ

孤独をこじらせてしまい、ついに現実逃避を始めてしまう私です。

f:id:shima_nigoro:20160430224712p:plain:w300

要件定義

家に帰ったときに「おかえり」と言ってもらう。

ハードウェア構成

  • Raspberry Pi 2 Model B
  • BT4.0対応USBドングル(LBT-UAN04C2BK)
  • BLEデバイス(Fitbit Charge HR)

ソフトウェア構成

要求分析と仕様化

  • 出かけてから帰ったときに、「おかえり」と音声を流す
  • 家に帰って1分以内に「おかえり」と言う
  • 家を出て15分以上経過した場合は出かけたと判断する
  • 「いってらっしゃい」は言わない
  • 家にいる間は「おかえり」と言わない

実現方式

  • 家にいるかの判定は BLE デバイスが出す Advertising Packet を検出することで行う
  • 検出アルゴリズム
    • cron を使って1分に1回下記の処理を行う
      • 10秒間 BLE デバイスのスキャンを行う
        • 特定の BLE デバイスの Advertising Packet を5回以上検出したか?
          • YES
            • 不在検出回数が15以上か?
              • YES: 「おかえりなさい」と音声を流す
              • NO: 何もしない
            • 不在検出回数を0に設定する。
          • NO : 不在検出回数を1増やす。

cron の設定とスクリプト

cron 設定

* * * * * sh /home/pi/welcome_back.sh

検出用スクリプト

#!/bin/sh

DEVICE_MACADDR="XX:XX:XX:XX:XX:XX"
WELCOME_BACK="おかえり"
WAIT_TIME=10
DETECT_THRESH=5
NO_HOME_THRESH=15
JTALK_SCRIPT=/home/hoge/jtalk.sh

DETECT_COUNT=\
`sudo timeout --signal=SIGINT ${WAIT_TIME} \
 hcitool lescan | grep -c ${DEVICE_MACADDR}`

if [ $? -ne 0 ]; then
  echo "reset bluetooth : " >> error_date.log
  date >> error_date.log
  sudo hciconfig hci0 down && sudo hciconfig hci0 up
fi

if [ ${DETECT_COUNT} -ge ${DETECT_THRESH} ]; then
  if [ `cat not_detect` -ge  ${NO_HOME_THRESH} ]; then
    echo ${WELCOME_BACK} | sh ${JTALK_SCRIPT}
  fi
  echo "0" > not_detect
else
  expr `cat not_detect` + 1 > not_detect
fi

音声再生用スクリプト

#!/bin/bash
HV=/usr/share/hts-voice/mei/mei_happy.htsvoice

tempfile=`tempfile`
option="-m $HV \
  -s 19200 \
  -p 100 \
  -a 0.03 \
  -b 0.5 \
  -fm 0.6 \
  -r 0.8 \
  -u 0.0 \
  -jm 1.0 \
  -jf 1.0 \
  -x /var/lib/mecab/dic/open-jtalk/naist-jdic \
  -ow $tempfile"

if [ -z "$1" ] ; then
  open_jtalk $option
else
  if [ -f "$1" ] ; then
    open_jtalk $option $1
  else
    echo "$1" | open_jtalk $option
  fi
fi

aplay -q $tempfile
rm $tempfile

※ mei_happy.htsvoice はこちらのものを利用させていただいています。

おわりに

色々と試してみたので、勉強にはなったのではないだろうか。
しかし、何か大切なものを失った気がする。