IoT ve Yapay Zekâ

Frigate MQTT Olayları: Topic'ler, Payload'lar ve Uzaktan Uyarılar

Frigate NVR'ın MQTT üzerinden neler yayınladığını, frigate/events payload'unun nasıl okunacağını ve uzaktan bildirimler için yalnızca önemli tespitlerin bulut broker'a nasıl iletileceğini öğrenin.

Güvenlik kameraları, bir insanı algılayan NVR ve bulut MQTT broker'a giden bir olay mesajını gösteren Frigate MQTT diyagramı
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

Frigate MQTT entegrasyonu, Frigate NVR'ın sisteminizin geri kalanına bir insan, araba veya köpek gördüğünü bildirme yoludur ve yerel nesne algılamanın üzerine uyarılar ve otomasyonlar kurmanın en temiz yöntemidir. Bu rehberde Frigate'in yayınladığı her topic'i, olay payload'unun gerçekte neler içerdiğini ve her yerden alabilmeniz için yalnızca önemli tespitleri yerel ağınızdan bir bulut broker'a nasıl ileteceğinizi öğreneceksiniz.

Frigate MQTT'yi Nasıl Kullanır

Frigate, kamera akışlarınız üzerinde nesne algılamayı yerel olarak, genellikle bir Coral, Hailo, OpenVINO veya GPU algılayıcısıyla çalıştırır. Kayıt ve klip incelemesi web arayüzünde yapılır, ancak olay odaklı her şey MQTT üzerinden dışarı çıkar. Frigate bir MQTT istemcisidir: belirttiğiniz bir broker'a bağlanır, durum ve olayları yayınlar ve algılama, kayıt veya anlık görüntüleri uzaktan açıp kapatabilmeniz için birkaç komut topic'ine abone olur.

Bu tasarım, Frigate'in verileri kimin tükettiğiyle ilgilenmediği anlamına gelir. Home Assistant, Node-RED, bir Python betiği veya bir telefon MQTT uygulaması aynı topic'lere aynı anda abone olabilir. Yayınla/abone ol (pub/sub) modelinde yeniyseniz, parçaları birbirine bağlamadan önce bir MQTT broker'ın ne yaptığını anlamak faydalı olur.

Frigate'te MQTT Bölümünü Yapılandırma

Frigate'in config.yml dosyasındaki mqtt bloğu onu bir broker'a yönlendirir. Çoğu kurulum, Frigate'in yanında yerel bir Mosquitto container'ı çalıştırır:

mqtt:
  enabled: true
  host: mosquitto        # yerel broker'ın container adı veya IP'si
  port: 1883
  topic_prefix: frigate  # her topic bununla başlar
  client_id: frigate     # broker üzerinde benzersiz olmalı
  user: frigate
  password: "{FRIGATE_MQTT_PASSWORD}"
  stats_interval: 60     # frigate/stats mesajları arasındaki saniye

cameras:
  driveway:
    mqtt:
      enabled: true      # bu kamera için anlık görüntüleri yayınla
      timestamp: false
      bounding_box: true
      crop: true
      height: 270
      quality: 70

Destek konularının çoğuna iki ayar neden olur. Birincisi, client_id benzersiz olmalıdır: iki Frigate örneği aynı broker üzerinde varsayılan frigate kimliğini paylaşırsa, bir döngü içinde birbirlerini bağlantıdan atarlar. İkincisi, topic_prefix değerini değiştirirseniz frigate/... dinleyen her otomasyonun da değişmesi gerekir.

Frigate MQTT Topic Başvurusu

Varsayılan frigate önekini varsayarsak, en sık kullanacağınız topic'ler şunlardır:

Topic Payload Kullanım amacı
frigate/available online / offline NVR sağlığı; Frigate bunu Last Will mesajı olarak ayarlar
frigate/events type, before, after içeren JSON İzlenen nesne yaşam döngüsü: new, update, end
frigate/reviews JSON inceleme öğesi Gruplanmış uyarılar ve tespitler (yeni sürümler)
frigate/<camera>/<object> Tam sayı O nesneden şu anda görüş alanında kaç tane olduğu
frigate/<camera>/<object>/snapshot JPEG baytları Mevcut nesnenin en iyi anlık görüntüsü
frigate/<camera>/motion ON / OFF Ham hareket durumu
frigate/<camera>/detect/set ON / OFF Komut: algılamayı etkinleştir veya devre dışı bırak
frigate/<camera>/detect/state ON / OFF Mevcut algılama durumu
frigate/stats JSON Algılayıcı çıkarım hızı, CPU, kamera FPS

Kayıtlar, anlık görüntüler ve hareket algılama için de benzer set/state çiftleri vardır. Sürümünüze ait resmi Frigate MQTT belgelerini kontrol edin; çünkü yeni sürümler inceleme öğeleri ve izlenen nesne güncellemeleri gibi topic'ler ekler.

frigate/events Payload'unu Okumak

İzlenen her nesne frigate/events üzerinde bir mesaj dizisi üretir: bir new, nesne hareket ettikçe veya skor iyileştikçe birkaç update mesajı ve nesne ayrıldığında bir end. Her mesaj, değişiklikten önceki ve sonraki tam nesne durumunu taşır. Kısaltılmış bir örnek:

{
  "type": "new",
  "before": { "id": "1729076512.48-ab12cd", "label": "person", "top_score": 0.0 },
  "after": {
    "id": "1729076512.48-ab12cd",
    "camera": "driveway",
    "label": "person",
    "score": 0.82,
    "top_score": 0.84,
    "false_positive": false,
    "start_time": 1729076512.48,
    "end_time": null,
    "current_zones": ["front_path"],
    "entered_zones": ["front_path"],
    "has_snapshot": true,
    "has_clip": false
  }
}

Uyarı için önemli alanlar:

  1. after.id nesnenin ömrü boyunca sabittir; yinelenenleri ayıklamak için kullanın.
  2. after.top_score şimdiye kadar görülen en iyi güven değeridir ve anlık score değerinden daha güvenilirdir.
  3. after.false_positive, Frigate nesnenin gerçek olduğundan emin olduğunda false olur. Bu noktadan önce uyarı vermek gürültü üretir.
  4. after.entered_zones, yalnızca biri gerçekten yola adım attığında uyarı vermenizi sağlar; sokaktan geçtiğinde değil.
  5. end_time ayarlanmış type: end olayı kapatır ve klibi Frigate'in HTTP API'si üzerinden almak için doğru andır.

Yaygın bir hata, her update mesajında tetiklemektir. Kareden geçen bir kişi çok sayıda güncelleme üretebilir; bu yüzden basit bir otomasyon tek bir ziyaret için art arda bildirimler gönderir.

Frigate Olaylarını Neden Bir Bulut Broker'a İletmelisiniz

Yerel broker ev veya tesis içinde mükemmeldir, ancak port açmadan mobil verideki telefonunuzdan erişilemez ve Mosquitto'yu internete açmak bir güvenlik sorunudur. Daha güvenli desen yalnızca giden bağlantıdır: aynı ağdaki küçük bir iletici yerel broker'a abone olur, olayları filtreler ve kompakt JSON'u bir bulut MQTT broker'a yayınlar. Telefonunuz, uzak bir gösterge paneli veya ikinci bir tesis oraya abone olur. Ev yönlendiricinizde hiçbir şey dinlemez.

İletme, payload'u sadeleştirmenize de olanak tanır. Anlık görüntüler onlarca kilobayt olabilir ve herkese açık test alanı mesaj başına en fazla 64 KB kabul eder; bu yüzden iletici yalnızca meta verileri gönderir ve görüntüleri yerel Frigate sunucusunda bırakır.

Frigate'i host ve port değerlerini değiştirip client_id değerini kimlik bilgilerinizle verilen client ID olarak ayarlayarak doğrudan uzak bir broker'a da yönlendirebilirsiniz, çünkü ConnectMQ client ID'leri kimlik bilgilerine bağlar. Pratikte araya bir filtre koymak daha iyidir: internet kesilirse Home Assistant yerel olarak çalışmaya devam eder ve ağdan yalnızca anlamlı olaylar çıkar.

Python İletici: Yerel Frigate'ten ConnectMQ'ya

Aşağıdaki betik paho-mqtt 2.x kullanır. Yerel broker'a abone olur, bir insan veya araba güvenilir bir tespite dönüştüğünde bir mesaj ve tespit sona erdiğinde bir mesaj iletir, Frigate'in erişilebilirlik durumunu yansıtır ve uzaktan gelen bir algılama aç/kapat komutunu Frigate'e geri aktarır.

pip install "paho-mqtt>=2.0"
import json
import os
import uuid

import paho.mqtt.client as mqtt

LOCAL_HOST = os.getenv("LOCAL_HOST", "localhost")
LOCAL_USER = os.getenv("LOCAL_USER")
LOCAL_PASS = os.getenv("LOCAL_PASS")

REMOTE_HOST = os.getenv("REMOTE_HOST", "broker.connectmq.com")
REMOTE_PORT = int(os.getenv("REMOTE_PORT", "1883"))
REMOTE_USER = os.getenv("REMOTE_USER")          # herkese açık test alanı için boş bırakın
REMOTE_PASS = os.getenv("REMOTE_PASS")
REMOTE_CLIENT_ID = os.getenv("REMOTE_CLIENT_ID", f"frigate-fwd-{uuid.uuid4().hex[:8]}")
PREFIX = os.getenv("REMOTE_PREFIX", f"connectmq/demo/{uuid.uuid4().hex[:8]}/frigate")

LABELS = {"person", "car"}
MIN_SCORE = float(os.getenv("MIN_SCORE", "0.75"))
forwarded = set()   # zaten duyurulmuş olay kimlikleri

# ---------- uzak (bulut) istemci ----------
remote = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=REMOTE_CLIENT_ID)
if REMOTE_USER:
    remote.username_pw_set(REMOTE_USER, REMOTE_PASS)
if REMOTE_PORT == 8883:
    remote.tls_set()
remote.will_set(f"{PREFIX}/forwarder/status", "offline", qos=1, retain=True)


def on_remote_connect(client, userdata, flags, reason_code, properties):
    print("remote connected:", reason_code)
    client.publish(f"{PREFIX}/forwarder/status", "online", qos=1, retain=True)
    client.subscribe(f"{PREFIX}/cmd/+/detect", qos=1)


def on_remote_message(client, userdata, msg):
    camera = msg.topic.split("/")[-2]
    value = msg.payload.decode().upper()
    if value in ("ON", "OFF"):
        local.publish(f"frigate/{camera}/detect/set", value)
        print(f"relayed detect {value} to {camera}")


remote.on_connect = on_remote_connect
remote.on_message = on_remote_message

# ---------- yerel (Frigate) istemci ----------
local = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=f"frigate-fwd-local-{uuid.uuid4().hex[:6]}")
if LOCAL_USER:
    local.username_pw_set(LOCAL_USER, LOCAL_PASS)


def on_local_connect(client, userdata, flags, reason_code, properties):
    print("local connected:", reason_code)
    client.subscribe([("frigate/events", 0), ("frigate/available", 0)])


def on_local_message(client, userdata, msg):
    if msg.topic == "frigate/available":
        remote.publish(f"{PREFIX}/nvr/status", msg.payload, qos=1, retain=True)
        return

    event = json.loads(msg.payload)
    after = event["after"]
    if after["label"] not in LABELS or after.get("false_positive", True):
        return

    event_id = after["id"]
    if event["type"] in ("new", "update"):
        if event_id in forwarded or after["top_score"] < MIN_SCORE:
            return
        forwarded.add(event_id)
        state = "started"
    elif event["type"] == "end":
        if event_id not in forwarded:
            return
        forwarded.discard(event_id)
        state = "ended"
    else:
        return

    summary = {
        "id": event_id,
        "camera": after["camera"],
        "label": after["label"],
        "score": round(after["top_score"], 2),
        "zones": after.get("entered_zones", []),
        "state": state,
        "start": after["start_time"],
        "end": after.get("end_time"),
    }
    topic = f"{PREFIX}/{after['camera']}/{after['label']}/event"
    remote.publish(topic, json.dumps(summary), qos=1)
    print("forwarded", topic, summary["state"], summary["score"])


local.on_connect = on_local_connect
local.on_message = on_local_message

remote.connect(REMOTE_HOST, REMOTE_PORT, keepalive=60)
remote.loop_start()
local.connect(LOCAL_HOST, 1883, keepalive=60)
print("forwarding to", PREFIX)
local.loop_forever()

Betiği Frigate sunucusunda çalıştırın, ardından uzak tarafı herhangi bir makineden izleyin. Betiğin yazdırdığı öneki kullanın:

mosquitto_sub -h broker.connectmq.com -p 1883 -i watcher-7f3a2c \
  -t 'connectmq/demo/<your-id>/frigate/#' -v

Bir kameranın önünden geçin; ziyaret başına tam olarak iki mesaj görmelisiniz: started ve ended. Komut yolunu test etmek için connectmq/demo/<your-id>/frigate/cmd/driveway/detect topic'ine OFF yayınlayın.

Herkese açık test alanı, topic'i tahmin eden herkes tarafından okunabilir; bu yüzden onu yalnızca bir deneme alanı olarak görün. Gerçek bir ev veya tesis için özel bir broker oluşturun, REMOTE_PORT=8883 ayarlayın ve portaldan REMOTE_USER, REMOTE_PASS ve REMOTE_CLIENT_ID değerlerini girin. Komut aktarımını herkese açık bir topic üzerinde çalıştırmayın.

Uyarıları Telefonunuzda Almak

Bulut broker düz MQTT konuştuğu için abone olabilen her şey sizi uyarabilir: telefonunuzdaki bir MQTT istemci uygulaması, seçtiğiniz bir bildirim hizmeti üzerinden anlık bildirim gönderen bir Node-RED akışı veya uzak bir Home Assistant örneği. Bir tarayıcı gösterge paneli oluşturursanız, /mqtt yoluyla 8084 portu üzerinden güvenli WebSocket ile bağlanın. ConnectMQ portalında canlı topic gezgini iletilen olayların gelişini gösterir; bu, MIN_SCORE ve bölgeleri ayarlarken oldukça kullanışlıdır.

Frigate MQTT Sorun Giderme

  1. Frigate "Unable to connect to MQTT server" kaydı yazıyor. host değerinin Frigate container'ı içinde çözümlendiğini kontrol edin; orada localhost ana makine değil, container'ın kendisidir.
  2. Bağlantı birkaç saniyede bir kopuyor. İki istemci aynı client ID'yi kullanıyor. Frigate'e ve her ileticiye ayrı bir kimlik verin.
  3. Olay yok ama arayüz tespitleri gösteriyor. Nesne kameranın objects.track listesinde olmayabilir veya bir required_zones ayarı onu filtreliyor olabilir.
  4. Çok fazla uyarı. top_score ve entered_zones üzerinden uyarı verin, ilk iletimden sonraki update mesajlarını yok sayın ve gerekirse kamera başına bekleme süreleri ekleyin.
  5. Anlık görüntüler uzak broker'da reddediliyor. Mesaj boyutu sınırını aşıyorlar; görüntüleri yerelde tutun ve bağlantı veya meta veri gönderin.

Daha derin algılama işlem hatları için MQTT üzerinden YOLO nesne algılamanın nasıl çalıştığına veya ESP32-CAM üzerinde insan tespitinin nasıl kurulduğuna, büyük resim için de yapay zeka ve IoT rehberine göz atın.

ConnectMQ ile Uzaktan Frigate Uyarıları Alın

Özel bir bulut broker, yerel bir NVR ile evden uzaktayken güvenebileceğiniz uyarılar arasındaki eksik parçadır. ConnectMQ, 8883 portunda TLS, oluşturulan kimlik bilgileri ve hata ayıklama için bir topic gezgini sunan tam yönetilen bir MQTT hizmetidir. app.connectmq.com adresinde ücretsiz Serverless planıyla kredi kartı gerektirmeden başlayın, ardından ileticiyi yeni broker'ınıza yönlendirin.

Sık Sorulan Sorular

Frigate'in bir MQTT broker'a ihtiyacı var mı?

Kayıt ve web arayüzü için MQTT isteğe bağlıdır, ancak Home Assistant entegrasyonu ve olay odaklı tüm otomasyonlar ona bağlıdır. Çoğu kullanıcı Mosquitto'yu aynı sunucuda çalıştırır.

frigate/events ile frigate/reviews arasındaki fark nedir?

frigate/events tek tek izlenen nesneleri yaşam döngüleri boyunca tanımlar. İnceleme öğeleri ise etkinliği, inceleme arayüzünde gördüklerinizle eşleşen uyarılar ve tespitler halinde gruplar; bu da bildirimler için çoğu zaman daha iyidir.

Frigate anlık görüntülerini bir bulut broker'a gönderebilir miyim?

Yalnızca broker'ın mesaj boyutu sınırına sığarlarsa; bu sınır herkese açık test alanında 64 KB'tır. Meta veri gönderip görüntüleri gerektiğinde Frigate'in API'sinden almak genellikle daha temiz ve daha ucuzdur.

Bunun yerine yerel Mosquitto broker'ımı dışarı açmak güvenli mi?

Önerilmez. Kimlik doğrulamalı bir TLS broker'a giden bağlantı kuran bir iletici, yönlendiricinizde port açmayı önler ve yerel broker'ı özel tutar.

İlgili yazılar

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.