mirror of
https://github.com/joBr99/nspanel-lovelace-ui.git
synced 2026-02-18 10:57:01 +01:00
move each panel to it's own thread (#1066)
This commit is contained in:
@@ -15,40 +15,43 @@ from watchdog.events import FileSystemEventHandler
|
|||||||
from watchdog.observers import Observer
|
from watchdog.observers import Observer
|
||||||
import signal
|
import signal
|
||||||
import sys
|
import sys
|
||||||
|
from queue import Queue
|
||||||
|
|
||||||
logging.getLogger("watchdog").propagate = False
|
logging.getLogger("watchdog").propagate = False
|
||||||
|
|
||||||
settings = {}
|
settings = {}
|
||||||
panels = {}
|
panels = {}
|
||||||
|
panel_queues = {}
|
||||||
last_settings_file_mtime = 0
|
last_settings_file_mtime = 0
|
||||||
mqtt_connect_time = 0
|
mqtt_connect_time = 0
|
||||||
has_sent_reload_command = False
|
has_sent_reload_command = False
|
||||||
mqtt_client_name = "NSPanelLovelaceManager_" + str(get_mac())
|
mqtt_client_name = "NSPanelLovelaceManager_" + str(get_mac())
|
||||||
client = mqtt.Client(mqtt_client_name)
|
client = mqtt.Client(mqtt_client_name)
|
||||||
logging.basicConfig(level=logging.DEBUG)
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
panel_mqtt_recv_topics = {}
|
|
||||||
|
|
||||||
def on_connect(client, userdata, flags, rc):
|
def on_connect(client, userdata, flags, rc):
|
||||||
global panels, panel_mqtt_recv_topics
|
global settings
|
||||||
logging.info("Connected to MQTT Server")
|
logging.info("Connected to MQTT Server")
|
||||||
for name, panel in panels.items():
|
# subscribe to panelRecvTopic of each panel
|
||||||
panel_mqtt_recv_topics[panel.recvTopic] = panel
|
for settings_panel in settings["nspanels"].values():
|
||||||
client.subscribe(panel.recvTopic)
|
client.subscribe(settings_panel["panelRecvTopic"])
|
||||||
|
|
||||||
def on_ha_update(entity_id):
|
def on_ha_update(entity_id):
|
||||||
for panel in panels.values():
|
global panel_queues
|
||||||
panel.ha_event_callback(entity_id)
|
for queue in panel_queues.values():
|
||||||
|
queue.put(("HA:", entity_id))
|
||||||
|
|
||||||
def on_message(client, userdata, msg):
|
def on_message(client, userdata, msg):
|
||||||
global panels, panel_mqtt_recv_topics
|
global panel_queues
|
||||||
try:
|
try:
|
||||||
if msg.payload.decode() == "":
|
if msg.payload.decode() == "":
|
||||||
return
|
return
|
||||||
parts = msg.topic.split('/')
|
parts = msg.topic.split('/')
|
||||||
if msg.topic in panel_mqtt_recv_topics.keys():
|
if msg.topic in panel_queues.keys():
|
||||||
data = json.loads(msg.payload.decode('utf-8'))
|
data = json.loads(msg.payload.decode('utf-8'))
|
||||||
if "CustomRecv" in data:
|
if "CustomRecv" in data:
|
||||||
panel = panel_mqtt_recv_topics[msg.topic]
|
queue = panel_queues[msg.topic]
|
||||||
panel.customrecv_event_callback(data["CustomRecv"])
|
queue.put(("MQTT:", data["CustomRecv"]))
|
||||||
else:
|
else:
|
||||||
logging.debug("Received unhandled message on topic: %s", msg.topic)
|
logging.debug("Received unhandled message on topic: %s", msg.topic)
|
||||||
|
|
||||||
@@ -144,7 +147,7 @@ def loop():
|
|||||||
client.loop_forever()
|
client.loop_forever()
|
||||||
|
|
||||||
def setup_panels():
|
def setup_panels():
|
||||||
global settings, panels
|
global settings, panel_queues
|
||||||
# Create NsPanel object
|
# Create NsPanel object
|
||||||
for name, settings_panel in settings["nspanels"].items():
|
for name, settings_panel in settings["nspanels"].items():
|
||||||
if "timeZone" not in settings_panel:
|
if "timeZone" not in settings_panel:
|
||||||
@@ -154,9 +157,30 @@ def setup_panels():
|
|||||||
if "hiddenCards" not in settings_panel:
|
if "hiddenCards" not in settings_panel:
|
||||||
settings_panel["hiddenCards"] = settings.get("hiddenCards", [])
|
settings_panel["hiddenCards"] = settings.get("hiddenCards", [])
|
||||||
|
|
||||||
panels[name] = LovelaceUIPanel(name, settings_panel)
|
#panels[name] = LovelaceUIPanel(name, settings_panel)
|
||||||
libs.panel_cmd.page_type(
|
|
||||||
settings_panel["panelSendTopic"], "pageStartup")
|
mqtt_queue = Queue(maxsize=20)
|
||||||
|
panel_queues[settings_panel["panelRecvTopic"]] = mqtt_queue
|
||||||
|
panel_thread = threading.Thread(target=panel_thread_target, args=(mqtt_queue, name, settings_panel))
|
||||||
|
panel_thread.daemon = True
|
||||||
|
|
||||||
|
panel_thread.start()
|
||||||
|
|
||||||
|
def panel_thread_target(queue, name, settings_panel):
|
||||||
|
panel = LovelaceUIPanel(name, settings_panel)
|
||||||
|
while True:
|
||||||
|
msg = queue.get()
|
||||||
|
#print(msg)
|
||||||
|
if msg[0] == "MQTT:":
|
||||||
|
panel.customrecv_event_callback(msg[1])
|
||||||
|
elif msg[0] == "HA:":
|
||||||
|
panel.ha_event_callback(msg[1])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def config_watch():
|
def config_watch():
|
||||||
class ConfigChangeEventHandler(FileSystemEventHandler):
|
class ConfigChangeEventHandler(FileSystemEventHandler):
|
||||||
|
|||||||
Reference in New Issue
Block a user