AI・開発、電子工作、クルマ。実際にやってみたことを残すブログ

Eufy の防犯カメラと SwitchBot ボットで玄関の照明を自動で点けるようにした

Anker の防犯カメラ eufyCam S4 が人を検知したら、Home Assistant が SwitchBot ボットに壁のスイッチを押させて、玄関の照明を点けるようにしました。使っている機器とつなぎ方、設定、つまずいたことをまとめます。

石積み風の外壁の雨どいに金具で取り付けた eufyCam S4。上にソーラーパネル、本体の上の段に広角のカメラ、下の段に回転するカメラが付いている
雨どいに取り付けた eufyCam S4
目次
  1. 作ったきっかけ
  2. 使っている機器
  3. つなぎ方
  4. ボットへは BLE プロキシを通す
  5. HA の設定
  6. オートメーション
  7. ボットの状態の表示
  8. HA を止めるときの待ち時間
  9. BLE プロキシのスキャンの設定
  10. つまずいたこと
  11. 知らせが 1 回で止まった
  12. 機器が 0 件になった
  13. 点くまでの時間

玄関の前に人が来たら、玄関の照明が自動で点くようにしました。Anker の防犯カメラ(Eufy の eufyCam S4)が人を検知すると、Home Assistant(以下 HA)が SwitchBot ボットに指示して、ボットが壁のスイッチを物理的に押します。10 分たったら消します。

この記事では、使っている機器とつなぎ方、HA の設定、作っていてつまずいたことを書きます。

壁のスイッチプレート。「玄関」「ポーチ」「階段」の 3 つのスイッチが縦に並び、白い SwitchBot ボットがプレートの右側に貼られ、アームを「ポーチ」のスイッチに向けている。「ポーチ」の表示灯は緑
SwitchBot ボットを貼った壁のスイッチ。ボットが「ポーチ」のスイッチを押す

作ったきっかけ

不便に感じていたことがあったわけではありません。防犯カメラを買って使い始めたら、カメラの前を通るたびにカメラのライトが点きます。それなら、これをきっかけに玄関の照明も点けたら便利なのでは、と思ったのが始まりです。

もう一つは防犯です。そもそも防犯カメラを買ったのは、防犯の対策を強めたかったからでした。人を検知したときに玄関の照明まで自動で点けば、防犯の効果も上がると考えました。

3 つの場面のイラスト。左は夜の暗い玄関の前を歩く人を、壁の防犯カメラが四角い枠で検知している場面で「人を検知」。真ん中は時計のアイコンと右向きの矢印で「数秒後」。右は玄関の照明が点いて、玄関の前と人が温かい光で照らされている場面で「玄関の照明が点灯」
人を検知すると、数秒後に玄関の照明が点く(イメージ。Hermes Agent 経由で GPT Image が生成)

使っている機器

  • eufyCam S4(T8172): Anker の Eufy の防犯カメラ。バッテリーとソーラーで動き、普段はスリープしています
  • HomeBase 3(T8030): カメラの親機
  • SwitchBot ボット: 壁のスイッチを物理的に押す小さな機械
  • XIAO ESP32C3: ESPHome で BLE(Bluetooth Low Energy)のプロキシにして、HA からボットへの BLE を中継します。基板にアンテナが無いので、外付けのアンテナを U.FL の端子につないでいます
  • Home Assistant: 手元の PC の Docker で動かしています
  • eufy-security-ws: Eufy の知らせを受けて HA に渡す中継のサーバー。HA と同じ docker compose で動かし、HA 側は fuatakgun/eufy_security のカスタム統合で受けます

つなぎ方

玄関照明の経路図。eufyCam S4 から HomeBase 3、Eufy のクラウドのプッシュ通知を経て、手元の PC の Docker で動く eufy-security-ws と Home Assistant に届く。HA から ESPHome の BLE プロキシ(XIAO ESP32C3)を経て、SwitchBot ボットが玄関照明の壁スイッチを押す
人を検知してから照明が点くまでの流れ

カメラが人を検知すると、知らせは「カメラ → HomeBase 3 → Eufy のクラウド → eufy-security-ws → HA」と、いったんクラウドのプッシュ通知を通って届きます。HA からボットまでは LAN の中だけで、BLE プロキシを通してボットに押させます。

ボットへは BLE プロキシを通す

HA の SwitchBot の統合は、ボットを BLE で直接操作します。そのため、HA の PC からボットまで BLE の電波が届く必要があります。

最初は、HA の PC に挿した USB の BLE ドングル(TP-Link UB500)でもボットに届いていました。ただ、電波は強くありませんでした(-76dBm)。同じ日に、別の目的(SwitchBot の CO2 センサーの値を受けるため)で XIAO ESP32C3 を ESPHome の BLE プロキシにして置いたところ、その位置からはボットに -65dBm で届き、ボットの操作はプロキシを通るようになりました。そのあと USB ドングルをなくしてからは、プロキシがボットへの唯一の経路です。

カメラは人と車だけを検知する設定にしていて、それ以外の動きの検知は切っています。

HA の設定

オートメーション

  • 人物検知のセンサーが off から on になったら
  • ボットが off のときだけ(照明がすでに点いているときは何もしない)
  • ボットを on にし、10 分待って off にする
  • 10 分の間に人物検知がもう一度起きても無視する(mode: single)

ボットの状態の表示

押すモードのボットは、照明が実際に点いているかを返しません。HA が覚えている状態をトグルで表示させています(customize で assumed_state: false)。

HA を止めるときの待ち時間

HA の正常な終了には時間がかかり、docker の既定の 10 秒では強制終了されます。そうすると、ボットのように HA が覚えているだけの状態が失われます。stop_grace_period を 60 秒にしています。

BLE プロキシのスキャンの設定

プロキシは最初、常に受信する設定(スキャンの interval と window が同じ値)にしていましたが、それではボットへ接続しに行く無線の空き時間が無く、押すのが遅くなりました。スキャンの間隔 320ms のうち受信を 100ms にして、接続の余地を残しています。

つまずいたこと

知らせが 1 回で止まった

HA に Eufy をつないだ最初の日、最初の人物検知だけ HA に届いて、そのあとまったく届かなくなりました。

カメラ側は録画していて、Eufy のアプリの履歴にも残っていました。つまりカメラは検知していて、止まっていたのは知らせの経路です。

原因は自分の操作でした。eufy-security-ws には、メインのアカウントから機器を共有したサブアカウントを使っています(共有の招待は自動で承認する設定)。このサブアカウントで、サブのスマホの Eufy アプリにログインして操作していました。後からログインした側が、プッシュ通知の届け先を奪うようで、サブアカウントからログアウトしたら、すぐに届くようになりました。

それからは、eufy-security-ws が使うアカウントではアプリにログインせず、アプリで映像や履歴を見るときはメインのアカウントを使っています。人物検知が届かなくなったら、まずアプリの録画の履歴を見ます。残っていれば、カメラではなく知らせの経路の問題です。戻すときは eufy-security-ws のコンテナを再起動して、プッシュの登録をやり直します。

機器が 0 件になった

コンテナを作り直して再ログインが走ったところ、Eufy のクラウドが家・ステーション・デバイスをすべて 0 件で返すようになりました(No houses found / No stations found / No devices found)。

調べると、eufy-security-ws の中で使われている eufy-security-client の issue #953 と、症状もバージョンも一致しました。4.1.0 で新しい方式(v6、Mega)のログインが優先になり、従来の側がブロックされると一覧が空になる、というものです。機器の一覧は従来の API にしか無いので、4.1.0 のままでは回避できません。

そこで、eufy-security-ws を 3.0.1(eufy-security-client 4.0.0。従来のログインが優先)に固定して回避しました。

eufy-security-ws:
image: bropat/eufy-security-ws:3.0.1

ただ、eufy-security-client は開発の終了が宣言されています(#965。Eufy が従来の API を止めるため)。Eufy が従来の API を止めた時点で、この固定も効かなくなります。今の経路は、いつか使えなくなる前提です。

点くまでの時間

人が来てから照明が点くまで、体感で 5〜10 秒かかります。最初はボットが遅いのだと思っていましたが、HA の記録で人物検知からボットが押し終わるまでを測ると、51 回の中央値で 1.01 秒(最小 0.53 秒、最大 3.37 秒)でした。残りの 4〜9 秒(測った値ではなく、体感からの差し引き)は、カメラが反応してから知らせが HA に届くまで、つまりクラウドを通る区間です。