93 lines
2.1 KiB
Python
93 lines
2.1 KiB
Python
from MqttPublish import MqttPublish
|
|
from OpcUaRequester import OpcUaRequester
|
|
from Statistics import StatisticsCollector
|
|
|
|
from loguru import logger
|
|
import argparse
|
|
import json
|
|
import threading
|
|
import queue
|
|
import signal
|
|
|
|
|
|
deathBell = threading.Event()
|
|
|
|
def exceptHook(args):
|
|
global deathBell
|
|
logger.error("Exception in thread caught: {}".format(args))
|
|
deathBell.set()
|
|
logger.error("rang the death bell")
|
|
|
|
def terminateHook(sig, frame):
|
|
global deathBell
|
|
logger.error("SIGINT received")
|
|
deathBell.set()
|
|
logger.error("rang the death bell")
|
|
|
|
|
|
logger.info("opcua2mqtt bridge starting")
|
|
|
|
parser = argparse.ArgumentParser(description="opcua2mqtt")
|
|
parser.add_argument('--config', '-f',
|
|
help='Config file, default is $pwd/config.json',
|
|
required=False,
|
|
default='./config.json')
|
|
args = parser.parse_args()
|
|
|
|
with open(args.config) as f:
|
|
config = json.load(f)
|
|
|
|
|
|
queue = queue.Queue()
|
|
|
|
statsThread = StatisticsCollector(config, queue)
|
|
statsThread.start()
|
|
logger.info("StatisticsCollector started")
|
|
|
|
publishThread = MqttPublish(config, statsThread, queue)
|
|
publishThread.start()
|
|
logger.info("MqttPublish started")
|
|
|
|
opcuaThreads = []
|
|
for o in config['opcua']:
|
|
if o['enabled'] != 'true':
|
|
continue
|
|
ot = OpcUaRequester(o, statsThread, queue)
|
|
ot.start()
|
|
logger.info(f"OpcUaRequester thread for {o['name']} started")
|
|
opcuaThreads.append(ot)
|
|
|
|
threading.excepthook = exceptHook
|
|
logger.info("Threading excepthook set")
|
|
|
|
signal.signal(signal.SIGINT, terminateHook)
|
|
logger.info("SIGINT handler set")
|
|
|
|
logger.info("opcua2mqtt bridge is running")
|
|
|
|
|
|
deathBell.wait()
|
|
logger.error("opcua2mqtt bridge is dying")
|
|
|
|
publishThread.stop()
|
|
logger.error("publishThread stopped")
|
|
|
|
statsThread.stop()
|
|
logger.error("statsThread stopped")
|
|
|
|
for ot in opcuaThreads:
|
|
ot.stop()
|
|
logger.error(f"opcua thread {ot.name} stopped")
|
|
|
|
publishThread.join()
|
|
logger.error("publishThread joined")
|
|
|
|
statsThread.join()
|
|
logger.error("statsThread joined")
|
|
|
|
for ot in opcuaThreads:
|
|
ot.join()
|
|
logger.error(f"opcua thread {ot.name} joined")
|
|
|
|
logger.error("opcua2mqtt bridge is terminated")
|