import asyncdispatch, asyncnet, tables, json, times, options import ../types, ../vars, ../utils, ../influx proc lacrosseHandleLoop (sock: AsyncSocket) {.async.} = while true: try: let line = await sock.recvLine() if line == "": break let msg = parseJson(line).to(LacrosseMessage) for key, device in server.config.devices.pairs(): if device.type != LacrosseTempSensor: continue if device.id != msg.id: continue let currentTimestamp = toUnix(getTime()) if server.state[key].lastUpdated.isSome: if (currentTimestamp - server.state[key].lastUpdated.get) < 50: break if msg.hum == 106: server.state[key].humidity = -1 else: server.state[key].humidity = msg.hum server.state[key].temperature = msg.temp.isaRound(2) server.state[key].weakBattery = bool(msg.weakBatt) server.state[key].lastUpdated = some(currentTimestamp) if server.config.serverConfig.influx.isSome: let config = server.config.serverConfig.influx.get if config.sensorsDatabase.isSome: var tags, fields = initTable[string, string]() tags["device"] = key if msg.hum != 106: fields["humidity"] = $msg.hum fields["temperature"] = $msg.temp.isaRound(2) discard await config.insertDatabase(config.sensorsDatabase.get, key, tags, fields, currentTimestamp * 1000000000) broadcastServerState() except: echo "Error[lacrosseHandleLoop]:\n", getCurrentExceptionMsg() proc lacrosseConnectLoop () {.async.} = while true: try: let config = server.config.serverConfig.lacrosse.get lacrosseSocket = await asyncnet.dial(config.host, Port(config.port)) await lacrosseHandleLoop(lacrosseSocket) except: lacrosseSocket.close() echo "Error[lacrosseConnectLoop]:\n", getCurrentExceptionMsg() await sleepAsync(1000) proc initLacrosseSensors* () = for key, device in server.config.devices.pairs(): if device.type != LacrosseTempSensor: continue server.state[key] = DeviceState(type: LacrosseTempSensor) asyncCheck lacrosseConnectLoop()