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

もみあげあしめ

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

【ネタ】自動おかえりシステムの不具合

BLE IoT Raspberry Pi ネタ

自動おかえりシステムの試験運用中に2件の不具合を検出した。

f:id:shima_nigoro:20160619220529p:plain:w300

以下に修正案を示す。

不具合1

概要

自宅を出て10分ほどで帰宅したのに、おかえりと言われた。

期待する動作

部屋から出て15分経っていなければ、おかえりと言わない。

実際の動作

部屋から出て15分経っていないのにおかえりと言う

再現性

1回のみ

原因

アルゴリズムの誤り

対応

アルゴリズムの修正

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

Set scan parameters failed: Input/output error

不具合2

概要

帰宅したのに「おかえり」と言わない

期待する動作

帰宅して1分以内に「おかえり」と言わない

実際の動作

帰宅して2分経っても「おかえり」と言わない

再現性

2/5回

原因

「hcitool lescan」コマンド実行時に「Set scan parameters failed: Input/output error」が発生している。

対応

とりあえず、エラーが出たらリセットしてみる。
#ついでにエラーログを残す。

修正版スクリプト

#!/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