Improve bridge routing logs and stabilize control portal MQTT reconnect
Some checks failed
Build and Push EVS Bridge Image / docker (push) Has been cancelled
Some checks failed
Build and Push EVS Bridge Image / docker (push) Has been cancelled
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
from typing import Any, Dict
|
||||
|
||||
@@ -13,13 +14,37 @@ MQTT_PASSWORD = os.getenv("MQTT_PASSWORD", "")
|
||||
MQTT_BASE_TOPIC = os.getenv("MQTT_BASE_TOPIC", "evs")
|
||||
PORTAL_BIND_HOST = os.getenv("PORTAL_BIND_HOST", "0.0.0.0")
|
||||
PORTAL_BIND_PORT = int(os.getenv("PORTAL_BIND_PORT", "8088"))
|
||||
LOG_LEVEL = os.getenv("LOG_LEVEL", "INFO")
|
||||
|
||||
|
||||
logging.basicConfig(level=LOG_LEVEL, format="%(asctime)s %(levelname)s %(message)s")
|
||||
log = logging.getLogger("evs-control-portal")
|
||||
|
||||
app = Flask(__name__)
|
||||
mqtt_connected = False
|
||||
mqtt_client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="evs-control-portal")
|
||||
if MQTT_USER:
|
||||
mqtt_client.username_pw_set(MQTT_USER, MQTT_PASSWORD)
|
||||
mqtt_client.connect(MQTT_HOST, MQTT_PORT, keepalive=30)
|
||||
|
||||
|
||||
def _on_connect(_client, _userdata, _flags, reason_code, _properties=None):
|
||||
global mqtt_connected
|
||||
mqtt_connected = reason_code == 0
|
||||
if mqtt_connected:
|
||||
log.info("mqtt connected: %s:%s", MQTT_HOST, MQTT_PORT)
|
||||
else:
|
||||
log.error("mqtt connect failed: reason_code=%s", reason_code)
|
||||
|
||||
|
||||
def _on_disconnect(_client, _userdata, reason_code, _properties=None):
|
||||
global mqtt_connected
|
||||
mqtt_connected = False
|
||||
log.warning("mqtt disconnected: reason_code=%s", reason_code)
|
||||
|
||||
|
||||
mqtt_client.on_connect = _on_connect
|
||||
mqtt_client.on_disconnect = _on_disconnect
|
||||
mqtt_client.connect_async(MQTT_HOST, MQTT_PORT, keepalive=30)
|
||||
mqtt_client.loop_start()
|
||||
|
||||
|
||||
@@ -28,6 +53,12 @@ def _topic_for_device(device_id: str) -> str:
|
||||
|
||||
|
||||
def _publish(device_id: str, payload: Dict[str, Any]) -> Dict[str, Any]:
|
||||
if not mqtt_connected:
|
||||
return {
|
||||
"ok": False,
|
||||
"error": f"mqtt not connected to {MQTT_HOST}:{MQTT_PORT}",
|
||||
"mqtt_connected": False,
|
||||
}
|
||||
topic = _topic_for_device(device_id)
|
||||
encoded = json.dumps(payload, separators=(",", ":"))
|
||||
info = mqtt_client.publish(topic, encoded, qos=0, retain=False)
|
||||
@@ -36,6 +67,7 @@ def _publish(device_id: str, payload: Dict[str, Any]) -> Dict[str, Any]:
|
||||
"topic": topic,
|
||||
"payload": payload,
|
||||
"mqtt_rc": info.rc,
|
||||
"mqtt_connected": mqtt_connected,
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user