MQTT per MQTT_ENABLED ein-/ausschaltbar (einsteigerfreundlich)
- MQTT_ENABLED=false -> App startet ohne Broker, keine Events/LWT - publish_crossing wird zum No-Op, kein Reconnect-Rauschen - README: optional gekennzeichnet, Env-Tabelle + .env-Beispiel ergaenzt Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
42
app.py
42
app.py
@@ -66,6 +66,10 @@ YOLO_HALF = os.environ.get("YOLO_HALF", "1" if _CUDA else "0") == "1"
|
||||
VEHICLE_CLASS_IDS = [2, 3, 5, 7]
|
||||
|
||||
# --- MQTT: ein Event pro Linienueberquerung (fuer n8n -> NocoDB) -----------
|
||||
# Komplett abschaltbar: MQTT_ENABLED=false -> App laeuft ohne Broker/Events.
|
||||
MQTT_ENABLED = os.environ.get("MQTT_ENABLED", "true").strip().lower() in (
|
||||
"1", "true", "yes", "on",
|
||||
)
|
||||
MQTT_HOST = os.environ.get("MQTT_HOST", "127.0.0.1")
|
||||
MQTT_PORT = int(os.environ.get("MQTT_PORT", "1883"))
|
||||
MQTT_USER = os.environ.get("MQTT_USER")
|
||||
@@ -87,26 +91,32 @@ def _on_mqtt_connect(client, userdata, flags, *args):
|
||||
print(f"[mqtt] connected -> {STATUS_TOPIC} online", flush=True)
|
||||
|
||||
|
||||
# paho-mqtt 2.x verlangt die CallbackAPIVersion, 1.x kennt sie nicht.
|
||||
try:
|
||||
_mqtt = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
|
||||
except AttributeError:
|
||||
_mqtt = mqtt.Client()
|
||||
if MQTT_USER:
|
||||
_mqtt.username_pw_set(MQTT_USER, MQTT_PASS)
|
||||
_mqtt.on_connect = _on_mqtt_connect
|
||||
# Last Will: Broker publiziert das, sobald die Verbindung unsauber abbricht.
|
||||
_mqtt.will_set(STATUS_TOPIC, "offline", qos=1, retain=True)
|
||||
try:
|
||||
# async + loop_start -> blockiert den App-Start nicht, wenn der Broker weg ist
|
||||
_mqtt.connect_async(MQTT_HOST, MQTT_PORT, keepalive=60)
|
||||
_mqtt.loop_start()
|
||||
except Exception as exc:
|
||||
print(f"[mqtt] init failed: {exc}", flush=True)
|
||||
_mqtt = None
|
||||
if not MQTT_ENABLED:
|
||||
print("[mqtt] deaktiviert (MQTT_ENABLED=false) - keine Events", flush=True)
|
||||
else:
|
||||
# paho-mqtt 2.x verlangt die CallbackAPIVersion, 1.x kennt sie nicht.
|
||||
try:
|
||||
_mqtt = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
|
||||
except AttributeError:
|
||||
_mqtt = mqtt.Client()
|
||||
if MQTT_USER:
|
||||
_mqtt.username_pw_set(MQTT_USER, MQTT_PASS)
|
||||
_mqtt.on_connect = _on_mqtt_connect
|
||||
# Last Will: Broker publiziert das, sobald die Verbindung unsauber abbricht.
|
||||
_mqtt.will_set(STATUS_TOPIC, "offline", qos=1, retain=True)
|
||||
try:
|
||||
# async + loop_start -> blockiert den App-Start nicht, wenn der Broker weg ist
|
||||
_mqtt.connect_async(MQTT_HOST, MQTT_PORT, keepalive=60)
|
||||
_mqtt.loop_start()
|
||||
except Exception as exc:
|
||||
print(f"[mqtt] init failed: {exc}", flush=True)
|
||||
|
||||
|
||||
def publish_crossing(vehicle_type, track_id, source):
|
||||
"""Crossing-Event auf {MQTT_TOPIC}/crossing (QoS 1, nicht retained)."""
|
||||
if _mqtt is None:
|
||||
return
|
||||
payload = {
|
||||
"event": "crossing",
|
||||
"camera": CAMERA_ID,
|
||||
|
||||
Reference in New Issue
Block a user