ホーム » コンピュータ » Linux » monit による外出/帰宅検出

monit による外出/帰宅検出

HomeAssistant による外出/帰宅検出を試しているけど、オートメーションではなかなか面倒な雰囲気。

gemini に簡単な ping 監視を提案してもらったら、monit を紹介してくれた。

monit インストール

pre-script で install コマンドでの -Z オプションが原因でインストールに失敗してたけど、pre-install のスクリプトを強制的に直してインストール。

monit で外出/帰宅検出

((( /etc/monit/conf.d/iphone.conf )))
# count 10 = 5min # /etc/monit/monitrc set daemon 30
check host iphone with address iphone
        if failed ping count 10 then exec "/etc/monit/script.d/iphone17.sh off"
        else if succeeded then exec "/etc/monit/script.d/iphone.sh on"

((( /etc/monit/script.d/iphone.sh )))
MONIT_SUMMARY="/usr/bin/monit -B summary"
case "$1" in
    on )
        /usr/local/bin/google-home-player.sh "帰宅しました"
        /usr/bin/touch /var/lib/monit/status/iphone
        ;;
    off )
        /usr/local/bin/google-home-player.sh "外出しました"
        /usr/bin/rm -f /var/lib/monit/status/iphone
        ;;
    * )
        ;;
esac

google-home-player が動かない

目的の処理は呼び出されているが、google-home-player.sh が動かない。普通にコマンドラインであればきちんと発声してくれるのに、monit の script で動かすときだけ発声しない。

色々実験すると、google-home-player.sh の中でパイプを処理する際の標準入力の所有権のトラブルが想定される。そこで、Gemini が提案してくれた、cat を挟む方式を試す。…. 効果なし

((( google-home-player.sh の末尾 )))
  if [ $# -gt 0 ]; then
      # コマンドライン引数を google home で喋らせる。
-     echo "$@" | exec $GHP_TALKJS $GHP_ARGS
+     echo "$@" | /usr/bin/cat | exec $GHP_TALKJS $GHP_ARGS
  else
      # 標準入力を google home で喋らせる。
-     exec $GHP_TALKJS $GHP_ARGS
+     /usr/bin/cat | exec $GHP_TALKJS $GHP_ARGS
  fi

コマンド実行のプロセス環境の問題なので、最後の手段、発声処理を batch コマンドで実行させてみる。…効果なし

google-home-player.sh にて、nodejs を呼び出す際に、exec を付けているが、これが原因なのか?

AI系に色々と確認させたけど、Copilot が google-home-player を呼び出す際の js スクリプトに 発声終了の確認せずにプロセスが終わって、発生が止まっている可能性を指摘してきた。提案してくれたスクリプトの修正をして、試す。