Frigate + Home Assistant 駐車場侵入通知 構築記録

Frigate + Home Assistant 駐車場侵入通知 構築記録

2026-07-26

← トップへ戻る
IoT

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_zonesentry があるかを見た。

結果

  • 一度 entry に入った履歴が残るため、update のたびに真になりやすい
  • 停車中の連続通知の原因になりやすい

判定

  • 単独利用は危険
  • 履歴としては有用だが、通知条件にはそのままでは使いにくい

最大のハマりポイント:メールが止まらない

最初の大きな問題は、車が1台いるだけでメールが延々と届いたことだった。

Frigate は同じオブジェクトに対して update を繰り返し送るため、Home Assistant がそのたびに通知すると、

  • 1分で数通
  • 1時間で数十通

という状態になった。

何を疑ったか

  • Home Assistant の automation の書き方
  • type == 'new'
  • Cooldown
  • Object ID
  • current_zones
  • entered_zones

結果

どれも一部は効くが、完全解決にはならなかった。

最終的に効いたもの

entry ゾーンの形状変更が最も効いた。


entry ゾーンの再設計

最初の問題

entry を広く取りすぎると、

  • 道路を走るだけの車
  • 遠くの車
  • 画面外を走る車

まで entry と判定されることがあった。

対策

entry を細長い帯状にした。

効果

  • 車が実際に出入り口を横切る瞬間だけ反応しやすくなった
  • 通知が一気に実用的になった
  • 停車中の連続通知が激減した

夜間に漏れる問題

夜間は、

  • 白黒映像
  • ヘッドライトの直射
  • 反射
  • 車体の見え方の変化

で Frigate が entry 侵入を取りこぼすことがあった。

対策

  • entry を少しだけ幅広に調整
  • それでも道路側へ広げすぎないようにした

判定

  • 実運用では許容範囲まで改善

実際の MQTT イベント確認

Home Assistant のトレース画面で frigate/eventspayload_json を確認し、before / after を見比べた。

よく見た項目

type
before.current_zones
after.current_zones
before.entered_zones
after.entered_zones
after.active

ここで分かったこと

  • current_zones は状態なので揺れやすい
  • entered_zones は履歴として残る
  • typenew / 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 だけを見る
  • carmotorcycle だけを見る
  • 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_jsonbefore / 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 / end
  • current_zones
  • entered_zones
  • ID
  • cooldown

を何度も見直したが、最終的に効いたのはentry ゾーンを「横切るライン」に作り直すことだった。

つまり、

通知ロジックを複雑にするより、入力されるイベントを正しくする方が重要

ということがよく分かった。


現在の評価

  • 誤通知:大幅減少
  • 連続通知:ほぼ解消
  • 取りこぼし:夜間や角度によって少し残るが許容範囲
  • 実用性:高い

補足

この記録は、単なる設定メモではなく、
試行錯誤の結果と同じ失敗をたどらない為 に残す。

同じ Frigate / Home Assistant 構成を組むときの、かなり実践的な参考資料になる。
最後にもう一度。判定ゾーンを狭く確実に通る部分に線のように作ることで通知を最小限に抑える。
問題はその狭い範囲に車が駐車したとき。通知が無限に来てしまうってこと。改良の余地はある。