1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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()