weatherstation/main.py

100 lines
2.7 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os.path
import os
import time
import logging
from Logger import Logger
from Setup import ConnectionSetup
import settings
def setupLogger():
log = logging.getLogger("weatherstation")
log.setLevel(logging.INFO)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
#formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
formatter = logging.Formatter('%(asctime)s:[%(levelname)s] - %(message)s')
ch.setFormatter(formatter)
log.addHandler(ch)
fh = logging.FileHandler(os.path.join(settings.logs, settings.logname))
fh.setFormatter(formatter)
log.addHandler(fh)
return log
logi = setupLogger()
def check_dirs_and_files():
# log
if not os.path.exists(settings.logs):
os.mkdir(settings.logs, 0o000755)
if not os.path.exists(settings.exceptionlog):
file=open(settings.exceptionlog, 'w')
file.write("<exceptions></exceptions>")
file.close()
# lock
if not os.path.exists(settings.locks):
os.mkdir(settings.locks, 0o000755)
# records
if not os.path.exists(settings.records):
os.mkdir(settings.records, 0o000755)
def obtainLock(lockfile = settings.lockname):
#TODO: path
if not os.path.exists(lockfile):
lock = open(lockfile, 'w')
lock.write( str(time.time()) )
lock.close()
return True
return False
def freeLock(lockfile = settings.lockname):
#TODO: path
if os.path.exists(lockfile):
os.remove(lockfile)
def formatHost(host):
return "%s:%d" % (host['name'], host['port'])
if __name__ == "__main__":
try:
input = raw_input
except NameError:
pass
check_dirs_and_files()
try:
logi.info("setting up all sensors")
while True:
if obtainLock():
logger = Logger(logi)
connections = []
connectedSensors = []
for con in settings.SENSORS:
try:
logi.info("connecting to host '"+str(con)+"'")
con = settings.SENSORS[con]
conSetup = ConnectionSetup(logi)
connection, sensors = conSetup.setupConnectionAndSensors(con['host'], con['sensors'], settings.TIMES, logger.cb_generic)
connections.append(connection)
connectedSensors.append(sensors)
logi.info("started logging at " + formatHost(con['host']))
except Exception as inst:
#connection failed, log and exit
#TODO: logger.printException(inst)
logi.error("connection failed: "+str(inst))
input("Press key to restart\n")
logi.info("stop logging... @" + time.ctime() + "\n")
conSetup.disconnectAny(connections)
freeLock()
else:
logi.critical("lock collision: lock 'all' active")
logi.info("wait for retry (" + str(settings.waitDelay) + ")")
time.sleep(settings.waitDelay)
except KeyboardInterrupt:
logi.info("keyboard-interrupt happened, cleaning up")
conSetup.disconnectAny(connections)
freeLock()