Frigate + Home Assistant 駐車場侵入通知 構築記録
概要
自宅駐車場の監視カメラ映像を Frigate で AI 検知し、Home Assistant へ MQTT でイベントを渡して、条件に合致したときだけ画像付きメール通知を送る仕組みを構築した。
最終的には、
- 駐車場に入った車だけを通知
- 停車中の連続通知を抑制
- entry の外を走るだけの車をできるだけ除外
- 夜間の誤検知と取りこぼしをゾーン設計で調整
という形に落ち着いた。
全体構成
IPカメラ
↓ RTSP
go2rtc
↓
Frigate 0.17
↓ MQTT (frigate/events)
Home Assistant
↓
スナップショット取得
↓
SMTPメール通知
実装環境
Frigate
- Version: 0.17-0
- Detector: Coral PCIe
- デコード補助: NVIDIA T400
- MQTT: Home Assistant 側の Mosquitto Broker に接続
Home Assistant
- Home Assistant OS
- Core 2026.7.0
- Supervisor 2026.06.2
- Operating System 18.0
- Frontend 20260624.3
監視カメラ
bee01: 駐車場監視bee02: 蜜蜂監視
Frigate の基本設定
MQTT
mqtt:
host: HAサーバーIP
port: 1883
user: mqtt-user
password: <MQTT_PASSWORD>
Detector
detectors:
coral:
type: edgetpu
device: pci
デコード補助
ffmpeg:
hwaccel_args: preset-nvidia-h264
go2rtc
go2rtc:
listen: :8554
streams:
bee01:
- rtsp://<USER_ID>:<CAM_PASSWORD>@カメラIP:554/Streaming/Channels/101
bee02:
- rtsp://<USER_ID>:<CAM_PASSWORD>@カメラIP/onvif-media/media.amp?profile=<プロファイル名>
bee02_youtube:
- rtsp://<USER_ID>:<CAM_PASSWORD>@カメラIP/axis-media/media.amp?streamprofile=<プロファイル名>
bee01 の設定
カメラ定義
cameras:
bee01:
ffmpeg:
inputs:
- path: rtsp://127.0.0.1:8554/bee01
roles:
- detect
- record
detect:
enabled: true
width: 1920
height: 1080
record:
enabled: true
continuous:
days: 30
motion
motion:
threshold: 30
contour_area: 24
improve_contrast: true
objects
objects:
track:
- person
- car
- motorcycle
- dog
ゾーン設定
parking
zones:
parking:
coordinates:
0.201,0.236,0.066,0.216,0,0.267,0.001,0.514,0,0.863,0.148,1,1,1,1,0.544,0.72,0.389,0.658,0.267,0.588,0.441,0.252,0.463
loitering_time: 0
objects:
- person
- dog
filters:
person:
threshold: 0.72
min_score: 0.62
car:
min_score: 0.60
inertia: 3
entry
entry:
coordinates:
0.21,0.165,0.233,0.28,0.262,0.44,0.579,0.417,0.634,0.28,0.629,0.148,0.492,0.079,0.376,0.13
inertia: 3
loitering_time: 0
objects:
- car
- motorcycle
- dog
何を試して、どうなったか
1. type == 'new' で判定
最初は new イベントだけを通知対象にした。
{{ trigger.payload_json['type'] == 'new' }}
結果
- 外から入る車は通知されることがあった
- 駐車場から出ていく車は
update扱いになり、通知されないことがあった
判定
- 没
- 出庫を取りこぼす
2. クールダウン方式
同じ車が続けて通知されるのを防ぐために、数時間の抑止を考えた。
結果
- 停車中の連投は抑えられる
- しかし別の車が短時間で来たときも抑止してしまう
判定
- 没
- 実運用に向かない
3. Object ID 比較
Frigate の after.id を使って、同じ車なら通知しない案も試した。
結果
- Frigate 0.17 では追跡中に ID が揺れるケースがあり、安定しない
- 別人判定や別車判定にも影響する
判定
- 没
- 追跡IDを通知制御の中心にするのは不安定
4. current_zones で判定
entry に入っている瞬間だけ通知するために、current_zones を使う方針に変更した。
結果
- かなり改善した
- ただしゾーン境界や夜間映像で揺れがあり、誤検知や取りこぼしが残った
判定
- 一部有効
- しかし
current_zones単独ではまだ不安定
5. entered_zones を参照
entered_zones に entry があるかを見た。
結果
- 一度 entry に入った履歴が残るため、update のたびに真になりやすい
- 停車中の連続通知の原因になりやすい
判定
- 単独利用は危険
- 履歴としては有用だが、通知条件にはそのままでは使いにくい
最大のハマりポイント:メールが止まらない
最初の大きな問題は、車が1台いるだけでメールが延々と届いたことだった。
Frigate は同じオブジェクトに対して update を繰り返し送るため、Home Assistant がそのたびに通知すると、
- 1分で数通
- 1時間で数十通
という状態になった。
何を疑ったか
- Home Assistant の automation の書き方
type == 'new'- Cooldown
- Object ID
current_zonesentered_zones
結果
どれも一部は効くが、完全解決にはならなかった。
最終的に効いたもの
entry ゾーンの形状変更が最も効いた。
entry ゾーンの再設計
最初の問題
entry を広く取りすぎると、
- 道路を走るだけの車
- 遠くの車
- 画面外を走る車
まで entry と判定されることがあった。
対策
entry を細長い帯状にした。
効果
- 車が実際に出入り口を横切る瞬間だけ反応しやすくなった
- 通知が一気に実用的になった
- 停車中の連続通知が激減した
夜間に漏れる問題
夜間は、
- 白黒映像
- ヘッドライトの直射
- 反射
- 車体の見え方の変化
で Frigate が entry 侵入を取りこぼすことがあった。
対策
- entry を少しだけ幅広に調整
- それでも道路側へ広げすぎないようにした
判定
- 実運用では許容範囲まで改善
実際の MQTT イベント確認
Home Assistant のトレース画面で frigate/events の payload_json を確認し、before / after を見比べた。
よく見た項目
type
before.current_zones
after.current_zones
before.entered_zones
after.entered_zones
after.active
ここで分かったこと
current_zonesは状態なので揺れやすいentered_zonesは履歴として残るtypeはnew / update / endがあり、判定を誤ると取りこぼす- Frigate の画面表示と MQTT のイベントは、見ているタイミングがずれることがある
Home Assistant の最終オートメーション
最終版
alias: 駐車場侵入 車両検知通知
triggers:
- topic: frigate/events
trigger: mqtt
conditions:
- condition: template
value_template: |
{{ trigger.payload_json.after.camera == 'bee01' }}
- condition: template
value_template: |
{{ trigger.payload_json.after.label in ['car','motorcycle'] }}
- condition: template
value_template: |
{{
'entry' in trigger.payload_json.before.get('entered_zones', [])
and 'entry' in trigger.payload_json.after.get('current_zones', [])
}}
- condition: template
value_template: |
{{
trigger.payload_json.after.active
}}
actions:
- data:
url: http://<サーバーIP:ポート>/api/bee01/latest.jpg?h=entry&bbox=1
filename: snapshot_entry.jpg
overwrite: true
action: downloader.download_file
- delay: "00:00:01"
- data:
title: 【通知】入口で車両を検知
message: entryゾーンで車両を検知しました。
data:
images:
- /config/downloads/snapshot_entry.jpg
action: notify.my_mail_alert
mode: single
trace:
stored_traces: 500
この設定の意図
bee01だけを見るcarとmotorcycleだけを見るentryを横切ったイベントを狙う- まだ追跡中のオブジェクトだけ通知する
- 画像は Frigate API から取得して添付する
スナップショット取得
通知メールには、Frigate の最新画像を添付している。
取得 URL
http://<サーバーIP:ポート>/api/bee01/latest.jpg?h=entry&bbox=1
保存先
/config/downloads/snapshot_entry.jpg
注意点
latest.jpg なので、通知の瞬間そのものではなく、少し後の画像になることがある。
5. メール通知(SMTP)の設定
Home Assistantからメールを送信できるようにするため、configuration.yaml にSMTPサーバーの設定を追記する。ここで定義した name が、自動化で呼び出すサービス名(例:notify.my_mail_alert)となる。
【configuration.yaml の記述例】
notify:
- name: my_mail_alert # 自動化から呼び出す名前(notify.my_mail_alert になる)
platform: smtp
server: "smtp.example.com" # 例: smtp.gmail.com
port: 587
timeout: 15
sender: "[email protected]"
encryption: starttls
username: "[email protected]"
password: !secret mail_password # secrets.yamlから呼び出し
recipient:
- "[email protected]" # 通知を受け取るアドレス
sender_name: "Home Assistant"
SMTP の注意点
Home Assistant 2026.7 系では SMTP 関連に変更の案内が出ることがあったが、実運用では YAML の SMTP 通知を使い続けている。
そのため、この構築記録では GUI 管理ではなく YAML 管理の SMTP を前提にしている。
パスワード・機密情報の別ファイル管理(セキュリティ対策)
設定ファイル内にパスワード等の機密情報を直書きしないよう、別ファイルに切り分けて管理する設計を採用した。
Home Assistant側(secrets.yaml)
HAの configuration.yaml と同じ階層にある secrets.yaml にパスワードを記載し、各設定ファイルからは !secret コマンドで呼び出す。
【secrets.yaml の記述例】
mqtt_user: "your_mqtt_username"
mqtt_password: "your_mqtt_password"
mail_password: "your_email_password" # SMTPメール制送信用パスワード(アプリパスワード等)
Frigate側(環境変数 / secrets)
Frigate側でも同様に、MQTTのパスワードなどを直接 config.yml に書かず、環境変数(Proxmox上のDockerなら .env ファイルなど)から読み込むよう構成する。
# Frigateのconfig.yml内での呼び出し例
mqtt:
host: 192.168.xxx.xxx
user: "{FRIGATE_MQTT_USER}"
password: "{FRIGATE_MQTT_PASSWORD}"
確認に使ったコマンド / 操作
MQTT を直接見る
mosquitto_sub -h <HAサーバーIP> -t frigate/events -v
Frigate コンテナログを見る
docker logs -f frigate
または compose なら
docker compose logs -f frigate
スナップショット取得を手元で試す
curl -o snapshot_entry.jpg "http://<サーバーIP:ポート>/api/bee01/latest.jpg?h=entry&bbox=1"
Home Assistant のトレース確認
- 設定 → 自動化とシーン → 対象オートメーション → トレース
変更された変数を確認payload_jsonのbefore / afterを比較
試行錯誤の変遷
1. まず通知を出す
- 成功
2. 通知が止まらない
- 失敗
3. type == 'new'
- 出庫を取りこぼす
- 失敗
4. Cooldown
- 別の車も抑止してしまう
- 失敗
5. ID ベース制御
- ID が揺れて不安定
- 失敗
6. current_zones
- 一番改善したが、まだ揺れる
- 部分的成功
7. entered_zones
- 履歴としては有用
- 通知条件としてはそのままだと弱い
8. entry ゾーン細長化
- 一番効いた
- ここで実用レベルに到達
9. 夜間微調整
- 少し幅を戻して取りこぼしを軽減
- 実用上十分なバランスへ
学んだこと
今回の構築で一番重要だったのは、Home Assistant の条件式より Frigate のゾーン設計の方が本質的だったこと。
最初は
new / update / endcurrent_zonesentered_zonesID- cooldown
を何度も見直したが、最終的に効いたのはentry ゾーンを「横切るライン」に作り直すことだった。
つまり、
通知ロジックを複雑にするより、入力されるイベントを正しくする方が重要
ということがよく分かった。
現在の評価
- 誤通知:大幅減少
- 連続通知:ほぼ解消
- 取りこぼし:夜間や角度によって少し残るが許容範囲
- 実用性:高い
補足
この記録は、単なる設定メモではなく、
試行錯誤の結果と同じ失敗をたどらない為 に残す。
同じ Frigate / Home Assistant 構成を組むときの、かなり実践的な参考資料になる。
最後にもう一度。判定ゾーンを狭く確実に通る部分に線のように作ることで通知を最小限に抑える。
問題はその狭い範囲に車が駐車したとき。通知が無限に来てしまうってこと。改良の余地はある。