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 
import asyncdispatch, tables, options
import ../types, ../vars, ../utils, ../modbus

proc setModbusRelayState* (relayboard: string, relay: uint8, value: bool) {.async.} =
  let config = server.config.devices[relayboard]
  
  server.state[relayboard].relays[relay] = value
  await mb.asyncWriteBit(config.address.get, config.firstRegister + relay, server.state[relayboard].relays[relay])

proc toggleModbusRelayState* (relayboard: string, relay: uint8) {.async.} =  
  let config = server.config.devices[relayboard]

  server.state[relayboard].relays[relay] = not server.state[relayboard].relays[relay]
  await mb.asyncWriteBit(config.address.get, config.firstRegister + relay, server.state[relayboard].relays[relay])

proc updateRelayboards () {.async.} =
  echo "Get relayboard state"
  for key, device in server.config.devices.pairs():
    if device.type != RelayBoard:
      continue

    try:
      let data = await mb.asyncReadBits(device.address.get, device.firstRegister, device.count)
      server.state[key] = DeviceState(type: RelayBoard, relays: data)
    except:
      echo "Error[updateRelayboards]:\n", getCurrentExceptionMsg()
  
  broadcastServerState()

proc initModbusRelayboards* () =
  for key, device in server.config.devices.pairs():
    if device.type != RelayBoard:
      continue

    server.state[key] = DeviceState(type: RelayBoard)

  asyncCheck updateRelayboards()