ctucx.git: smartied

[nimlang] smarthome server

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()