ソースを参照

add zeroconf discovery

Blake Blackshear 4 年 前
コミット
f78b2c48a7
3 ファイル変更61 行追加0 行削除
  1. 1 0
      docker/Dockerfile.base
  2. 2 0
      frigate/app.py
  3. 58 0
      frigate/zeroconf.py

+ 1 - 0
docker/Dockerfile.base

@@ -30,6 +30,7 @@ RUN apt-get -qq update \
 
 RUN pip3 install \
     peewee \
+    zeroconf \
     voluptuous
 
 COPY nginx/nginx.conf /etc/nginx/nginx.conf

+ 2 - 0
frigate/app.py

@@ -20,6 +20,7 @@ from frigate.object_processing import TrackedObjectProcessor
 from frigate.record import RecordingMaintainer
 from frigate.video import capture_camera, track_camera
 from frigate.watchdog import FrigateWatchdog
+from frigate.zeroconf import broadcast_zeroconf
 
 logger = logging.getLogger(__name__)
 
@@ -152,6 +153,7 @@ class FrigateApp():
         self.start_event_cleanup()
         self.start_recording_maintainer()
         self.start_watchdog()
+        self.zeroconf = broadcast_zeroconf(self.config.mqtt.client_id)
         self.flask_app.run(host='127.0.0.1', port=5001, debug=False)
         self.stop()
     

+ 58 - 0
frigate/zeroconf.py

@@ -0,0 +1,58 @@
+import logging
+import socket
+
+from zeroconf import (
+    ServiceInfo,
+    NonUniqueNameException,
+    InterfaceChoice,
+    IPVersion,
+    Zeroconf,
+)
+
+logger = logging.getLogger(__name__)
+
+ZEROCONF_TYPE = "_frigate._tcp.local."
+
+# Taken from: http://stackoverflow.com/a/11735897
+def get_local_ip() -> str:
+    """Try to determine the local IP address of the machine."""
+    try:
+        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+
+        # Use Google Public DNS server to determine own IP
+        sock.connect(("8.8.8.8", 80))
+
+        return sock.getsockname()[0]  # type: ignore
+    except OSError:
+        try:
+            return socket.gethostbyname(socket.gethostname())
+        except socket.gaierror:
+            return "127.0.0.1"
+    finally:
+        sock.close()
+
+def broadcast_zeroconf(frigate_id):
+    zeroconf = Zeroconf(interfaces=InterfaceChoice.Default, ip_version=IPVersion.V4Only)
+
+    host_ip = get_local_ip()
+
+    try:
+        host_ip_pton = socket.inet_pton(socket.AF_INET, host_ip)
+    except OSError:
+        host_ip_pton = socket.inet_pton(socket.AF_INET6, host_ip)
+
+    info = ServiceInfo(
+        ZEROCONF_TYPE,
+        name=f"{frigate_id}.{ZEROCONF_TYPE}",
+        addresses=[host_ip_pton],
+        port=5000,
+    )
+
+    logger.info("Starting Zeroconf broadcast")
+    try:
+        zeroconf.register_service(info)
+    except NonUniqueNameException:
+        logger.error(
+            "Frigate instance with identical name present in the local network"
+        )
+    return zeroconf