import asyncdispatch, json, tables, os, posix import types, modbus, mqtt, influx, vars, utils, options import frontend import devices/[modbusPowermeter, modbusRelayboard, lacrosseSensors, zigbee2mqttLamp, zigbee2mqttRelay, zigbee2mqttRemote, zigbee2mqttMotionSensor] proc CtrlCHook() {.noconv.} = echo "Ctrl+C fired! \nStopping Server now!" closeOpenConnections() quit() proc main() {.async.} = setControlCHook(CtrlCHook) onSignal(SIGTERM): echo "Got SIGTERM! \nStopping Server now!" closeOpenConnections() quit() var configFile = "./config.json" if getEnv("CONFIG_PATH") != "": configFile = getEnv("CONFIG_PATH") if not fileExists(configFile): echo "Config file not found" quit() try: server = Server(config: parseFile(configFile).to(Config)) except: let e = getCurrentException() echo "Error while parsing config: " & e.msg quit() if getEnv("ACCESS_TOKEN") != "": server.config.serverConfig.accessToken = getEnv("ACCESS_TOKEN") initUtil() if server.config.serverConfig.influx.isSome(): initInflux() if server.config.serverConfig.modbus.isSome(): initModbus() initModbusPowermeters() initModbusRelayboards() if server.config.serverConfig.lacrosse.isSome(): initLacrosseSensors() if server.config.serverConfig.mqtt.isSome(): asyncCheck initMqtt() asyncCheck initZigbee2MqttLamps() asyncCheck initZigbee2MqttRelays() asyncCheck initZigbee2MqttRemotes() asyncCheck initZigbee2MqttMotionSensors() asyncCheck serveFrontend() runForever() waitFor main()