143 lines
4.2 KiB
Python
143 lines
4.2 KiB
Python
"""
|
|
Einfache MQTT-Hilfsfunktion für Client-Gruppenzuordnungen
|
|
"""
|
|
import os
|
|
import json
|
|
import logging
|
|
import paho.mqtt.client as mqtt
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def publish_client_group(client_uuid: str, group_id: int) -> bool:
|
|
"""
|
|
Publiziert die Gruppenzuordnung eines Clients als retained message
|
|
|
|
Args:
|
|
client_uuid: UUID des Clients
|
|
group_id: ID der Gruppe
|
|
|
|
Returns:
|
|
bool: True bei Erfolg, False bei Fehler
|
|
"""
|
|
try:
|
|
# MQTT-Konfiguration aus .env
|
|
broker_host = os.getenv("MQTT_BROKER_HOST", "mqtt")
|
|
broker_port = int(os.getenv("MQTT_BROKER_PORT", 1883))
|
|
username = os.getenv("MQTT_USER")
|
|
password = os.getenv("MQTT_PASSWORD")
|
|
|
|
# Topic und Payload
|
|
topic = f"infoscreen/{client_uuid}/group_id"
|
|
payload = json.dumps({
|
|
"group_id": group_id,
|
|
"client_uuid": client_uuid
|
|
})
|
|
|
|
# MQTT-Client erstellen und verbinden
|
|
client = mqtt.Client()
|
|
if username and password:
|
|
client.username_pw_set(username, password)
|
|
|
|
client.connect(broker_host, broker_port, 60)
|
|
|
|
# Retained message publizieren
|
|
result = client.publish(topic, payload, qos=1, retain=True)
|
|
result.wait_for_publish(timeout=5.0)
|
|
|
|
client.disconnect()
|
|
|
|
logger.info(
|
|
f"Group assignment published for client {client_uuid}: group_id={group_id}")
|
|
return True
|
|
|
|
except Exception as e:
|
|
logger.error(
|
|
f"Error publishing group assignment for client {client_uuid}: {e}")
|
|
return False
|
|
|
|
|
|
def publish_multiple_client_groups(client_group_mappings: dict) -> tuple[int, int]:
|
|
"""
|
|
Publiziert Gruppenzuordnungen für mehrere Clients in einer Verbindung
|
|
|
|
Args:
|
|
client_group_mappings: Dict mit {client_uuid: group_id}
|
|
|
|
Returns:
|
|
tuple: (success_count, failed_count)
|
|
"""
|
|
try:
|
|
broker_host = os.getenv("MQTT_BROKER_HOST", "mqtt")
|
|
broker_port = int(os.getenv("MQTT_BROKER_PORT", 1883))
|
|
username = os.getenv("MQTT_USER")
|
|
password = os.getenv("MQTT_PASSWORD")
|
|
|
|
client = mqtt.Client()
|
|
if username and password:
|
|
client.username_pw_set(username, password)
|
|
|
|
client.connect(broker_host, broker_port, 60)
|
|
|
|
success_count = 0
|
|
failed_count = 0
|
|
|
|
for client_uuid, group_id in client_group_mappings.items():
|
|
try:
|
|
topic = f"infoscreen/{client_uuid}/group_id"
|
|
payload = json.dumps({
|
|
"group_id": group_id,
|
|
"client_uuid": client_uuid
|
|
})
|
|
|
|
result = client.publish(topic, payload, qos=1, retain=True)
|
|
result.wait_for_publish(timeout=5.0)
|
|
success_count += 1
|
|
|
|
except Exception as e:
|
|
logger.error(f"Failed to publish for {client_uuid}: {e}")
|
|
failed_count += 1
|
|
|
|
client.disconnect()
|
|
|
|
logger.info(
|
|
f"Bulk publish completed: {success_count} success, {failed_count} failed")
|
|
return success_count, failed_count
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error in bulk publish: {e}")
|
|
return 0, len(client_group_mappings)
|
|
|
|
|
|
def delete_client_group_message(client_uuid: str) -> bool:
|
|
"""
|
|
Löscht die retained message für einen Client (bei Client-Löschung)
|
|
"""
|
|
try:
|
|
broker_host = os.getenv("MQTT_BROKER_HOST", "mqtt")
|
|
broker_port = int(os.getenv("MQTT_BROKER_PORT", 1883))
|
|
username = os.getenv("MQTT_USER")
|
|
password = os.getenv("MQTT_PASSWORD")
|
|
|
|
topic = f"infoscreen/{client_uuid}/group_id"
|
|
|
|
client = mqtt.Client()
|
|
if username and password:
|
|
client.username_pw_set(username, password)
|
|
|
|
client.connect(broker_host, broker_port, 60)
|
|
|
|
# Leere retained message löscht die vorherige
|
|
result = client.publish(topic, "", qos=1, retain=True)
|
|
result.wait_for_publish(timeout=5.0)
|
|
|
|
client.disconnect()
|
|
|
|
logger.info(f"Deleted retained group message for client {client_uuid}")
|
|
return True
|
|
|
|
except Exception as e:
|
|
logger.error(
|
|
f"Error deleting group message for client {client_uuid}: {e}")
|
|
return False
|