mirror of
https://github.com/csd4ni3l/frigate-mqtt-notifier.git
synced 2026-01-01 04:13:42 +01:00
Update README, change defaults
This commit is contained in:
24
README.md
24
README.md
@@ -1 +1,23 @@
|
|||||||
Frigate MQTT Notifier
|
A docker container/Python app that watches for MQTT Frigate events and sends them to an Ntfy server.
|
||||||
|
|
||||||
|
To deploy it, you can use the official image:
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
frigate-mqtt-notifier:
|
||||||
|
image: csd4ni3lofficial/frigate-mqtt-notifier:latest
|
||||||
|
container_name: frigate-mqtt-notifier
|
||||||
|
environment:
|
||||||
|
- LOG_LEVEL=INFO
|
||||||
|
- MQTT_BROKER_IP=eclipse-mosquitto
|
||||||
|
- MQTT_BROKER_PORT=1883
|
||||||
|
- MQTT_CLIENT_ID=frigate-mqtt-notifier
|
||||||
|
- MQTT_BROKER_USERNAME=
|
||||||
|
- MQTT_BROKER_PASSWORD=
|
||||||
|
- MESSAGE_TIMEOUT=5
|
||||||
|
- FRIGATE_BASE_URL=http://frigate:5000
|
||||||
|
- NTFY_SERVER_URL=https://ntfy.sh
|
||||||
|
- NTFY_TOPIC=frigate-events
|
||||||
|
- NTFY_USERNAME=
|
||||||
|
- NTFY_PASSWORD=
|
||||||
|
restart: unless-stopped
|
||||||
|
```
|
||||||
|
|||||||
30
app.py
30
app.py
@@ -4,9 +4,9 @@ from copy import deepcopy
|
|||||||
from paho.mqtt import client as mqtt_client
|
from paho.mqtt import client as mqtt_client
|
||||||
from ntfpy import NTFYServer, NTFYClient, NTFYPushMessage, NTFYUrlAttachment
|
from ntfpy import NTFYServer, NTFYClient, NTFYPushMessage, NTFYUrlAttachment
|
||||||
|
|
||||||
MQTT_BROKER_IP = os.getenv("MQTT_BROKER_IP", "localhost")
|
MQTT_BROKER_IP = os.getenv("MQTT_BROKER_IP", "eclipse-mosquitto")
|
||||||
MQTT_BROKER_PORT = int(os.getenv("MQTT_BROKER_PORT", 1883))
|
MQTT_BROKER_PORT = int(os.getenv("MQTT_BROKER_PORT", 1883))
|
||||||
MQTT_CLIENT_ID = os.getenv("MQTT_CLIENT_ID", "frigate-notifier")
|
MQTT_CLIENT_ID = os.getenv("MQTT_CLIENT_ID", "frigate-mqtt-notifier")
|
||||||
MQTT_BROKER_USERNAME = os.getenv("MQTT_BROKER_USERNAME")
|
MQTT_BROKER_USERNAME = os.getenv("MQTT_BROKER_USERNAME")
|
||||||
MQTT_BROKER_PASSWORD = os.getenv("MQTT_BROKER_PASSWORD")
|
MQTT_BROKER_PASSWORD = os.getenv("MQTT_BROKER_PASSWORD")
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ NTFY_USERNAME = os.getenv("NTFY_USERNAME")
|
|||||||
NTFY_PASSWORD = os.getenv("NTFY_PASSWORD")
|
NTFY_PASSWORD = os.getenv("NTFY_PASSWORD")
|
||||||
|
|
||||||
MESSAGE_TIMEOUT = float(os.getenv("MESSAGE_TIMEOUT", 1.0))
|
MESSAGE_TIMEOUT = float(os.getenv("MESSAGE_TIMEOUT", 1.0))
|
||||||
FRIGATE_BASE_URL = os.getenv("FRIGATE_BASE_URL", "http://localhost:5000")
|
FRIGATE_BASE_URL = os.getenv("FRIGATE_BASE_URL", "http://frigate:5000")
|
||||||
|
|
||||||
_last_msg_time = 0.0
|
_last_msg_time = 0.0
|
||||||
_seen_new = {}
|
_seen_new = {}
|
||||||
@@ -69,22 +69,22 @@ def on_connect(client, userdata, flags, rc):
|
|||||||
|
|
||||||
def get_zone_changes(event_id, current):
|
def get_zone_changes(event_id, current):
|
||||||
prev = _entered_zones.setdefault(event_id, [])
|
prev = _entered_zones.setdefault(event_id, [])
|
||||||
|
|
||||||
logging.debug(f"Event {event_id} previous zones: {', '.join(prev)}")
|
logging.debug(f"Event {event_id} previous zones: {', '.join(prev)}")
|
||||||
logging.debug(f"Event {event_id} current zones: {', '.join(current)}")
|
logging.debug(f"Event {event_id} current zones: {', '.join(current)}")
|
||||||
|
|
||||||
entered = [z for z in current if z not in prev]
|
entered = [z for z in current if z not in prev]
|
||||||
|
|
||||||
_entered_zones[event_id] = current.copy()
|
_entered_zones[event_id] = current.copy()
|
||||||
|
|
||||||
logging.debug(f"Event {event_id} entered zones: {', '.join(entered)}")
|
logging.debug(f"Event {event_id} entered zones: {', '.join(entered)}")
|
||||||
|
|
||||||
return entered
|
return entered
|
||||||
|
|
||||||
def on_message(client, userdata, mqtt_msg):
|
def on_message(client, userdata, mqtt_msg):
|
||||||
global _last_msg_time
|
global _last_msg_time
|
||||||
now = time.time()
|
now = time.time()
|
||||||
|
|
||||||
if now - _last_msg_time < MESSAGE_TIMEOUT: # Throttle messages
|
if now - _last_msg_time < MESSAGE_TIMEOUT: # Throttle messages
|
||||||
logging.debug("Event message throttled")
|
logging.debug("Event message throttled")
|
||||||
return
|
return
|
||||||
@@ -120,7 +120,7 @@ def on_message(client, userdata, mqtt_msg):
|
|||||||
_entered_zones[eid] = deepcopy(zones)
|
_entered_zones[eid] = deepcopy(zones)
|
||||||
|
|
||||||
logging.debug(f"New {label} event detected in {', '.join(zones)}")
|
logging.debug(f"New {label} event detected in {', '.join(zones)}")
|
||||||
|
|
||||||
body = f"New {label} Detected with {score:.1f}% certainty in {', '.join(zones)}"
|
body = f"New {label} Detected with {score:.1f}% certainty in {', '.join(zones)}"
|
||||||
|
|
||||||
msg = NTFYPushMessage(body, title=f"{label} Detected")
|
msg = NTFYPushMessage(body, title=f"{label} Detected")
|
||||||
@@ -129,12 +129,12 @@ def on_message(client, userdata, mqtt_msg):
|
|||||||
msg.attachment = NTFYUrlAttachment(clip_url)
|
msg.attachment = NTFYUrlAttachment(clip_url)
|
||||||
|
|
||||||
logging.debug(f"Found Event clip URL: {clip_url}")
|
logging.debug(f"Found Event clip URL: {clip_url}")
|
||||||
|
|
||||||
elif snap_url:
|
elif snap_url:
|
||||||
msg.attachment = NTFYUrlAttachment(snap_url)
|
msg.attachment = NTFYUrlAttachment(snap_url)
|
||||||
|
|
||||||
logging.debug(f"Found Event snapshot URL: {snap_url}")
|
logging.debug(f"Found Event snapshot URL: {snap_url}")
|
||||||
|
|
||||||
ntfy_client.send_message(msg)
|
ntfy_client.send_message(msg)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
@@ -148,7 +148,7 @@ def on_message(client, userdata, mqtt_msg):
|
|||||||
if not new_z:
|
if not new_z:
|
||||||
logging.debug(f"No new zones detected for event {eid}")
|
logging.debug(f"No new zones detected for event {eid}")
|
||||||
return
|
return
|
||||||
|
|
||||||
body = f"{label} entered zones: {', '.join(new_z)}"
|
body = f"{label} entered zones: {', '.join(new_z)}"
|
||||||
msg = NTFYPushMessage(body, title=f"{label} Zone Entry")
|
msg = NTFYPushMessage(body, title=f"{label} Zone Entry")
|
||||||
|
|
||||||
@@ -156,7 +156,7 @@ def on_message(client, userdata, mqtt_msg):
|
|||||||
msg.attachment = NTFYUrlAttachment(snap_url)
|
msg.attachment = NTFYUrlAttachment(snap_url)
|
||||||
|
|
||||||
logging.debug(f"Found Event snapshot URL: {snap_url}")
|
logging.debug(f"Found Event snapshot URL: {snap_url}")
|
||||||
|
|
||||||
ntfy_client.send_message(msg)
|
ntfy_client.send_message(msg)
|
||||||
|
|
||||||
elif event_type == "end":
|
elif event_type == "end":
|
||||||
@@ -170,12 +170,12 @@ def on_message(client, userdata, mqtt_msg):
|
|||||||
msg.attachment = NTFYUrlAttachment(clip_url)
|
msg.attachment = NTFYUrlAttachment(clip_url)
|
||||||
|
|
||||||
logging.debug(f"Found Event clip URL: {clip_url}")
|
logging.debug(f"Found Event clip URL: {clip_url}")
|
||||||
|
|
||||||
elif snap_url:
|
elif snap_url:
|
||||||
msg.attachment = NTFYUrlAttachment(snap_url)
|
msg.attachment = NTFYUrlAttachment(snap_url)
|
||||||
|
|
||||||
logging.debug(f"Found Event snapshot URL: {snap_url}")
|
logging.debug(f"Found Event snapshot URL: {snap_url}")
|
||||||
|
|
||||||
ntfy_client.send_message(msg)
|
ntfy_client.send_message(msg)
|
||||||
|
|
||||||
client = mqtt_client.Client(mqtt_client.CallbackAPIVersion.VERSION2, MQTT_CLIENT_ID)
|
client = mqtt_client.Client(mqtt_client.CallbackAPIVersion.VERSION2, MQTT_CLIENT_ID)
|
||||||
@@ -202,4 +202,4 @@ try:
|
|||||||
client.loop_forever()
|
client.loop_forever()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error(f"Failed to start MQTT client: {e}")
|
logging.error(f"Failed to start MQTT client: {e}")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
services:
|
|
||||||
frigate-mqtt-notifier:
|
|
||||||
image: frigate-mqtt-notifier
|
|
||||||
container_name: frigate-mqtt-notifier
|
|
||||||
environment:
|
|
||||||
- LOG_LEVEL=INFO
|
|
||||||
- MQTT_BROKER_IP=localhost
|
|
||||||
- MQTT_BROKER_PORT=1883
|
|
||||||
- MQTT_CLIENT_ID=frigate-mqtt-notifier
|
|
||||||
- MQTT_BROKER_USERNAME=
|
|
||||||
- MQTT_BROKER_PASSWORD=
|
|
||||||
- MESSAGE_TIMEOUT=5
|
|
||||||
- FRIGATE_BASE_URL=http://localhost:5000
|
|
||||||
- NTFY_SERVER_URL=https://ntfy.sh
|
|
||||||
- NTFY_TOPIC=frigate-events
|
|
||||||
- NTFY_USERNAME=
|
|
||||||
- NTFY_PASSWORD=
|
|
||||||
restart: unless-stopped
|
|
||||||
Reference in New Issue
Block a user