moved setup of sensors to dedicated class

master
agp8x 2014-10-23 18:43:17 +02:00
parent 375315d0f4
commit 37934b0b85
4 changed files with 144 additions and 65 deletions

View File

@ -12,21 +12,21 @@ import settings
class Logger(object): class Logger(object):
def __init__(self, log): def __init__(self, log):
self.names = settings.NAMES
self.temp_sensors = settings.tempSensors self.temp_sensors = settings.tempSensors
self.temp_prev_default=settings.prev_temps_default self.temp_prev_default = settings.prev_temps_default
self.prev_temps =[] self.prev_temps = []
for i in range(self.temp_sensors): for i in range(self.temp_sensors):
self.prev_temps.append(self.temp_prev_default) self.prev_temps.append(self.temp_prev_default)
self.temp_max_diff = settings.tempmaxdiff self.temp_max_diff = settings.tempmaxdiff
self.log = log self.log = log
self.records = settings.records self.records = settings.records
self.units = settings.SENSOR_UNITS
def temp_rise(self,old,new,sensor): def temp_rise(self,old,new,sensor):
if(old==self.temp_prev_default): if(old==self.temp_prev_default):
return True return True
if((old-new)>self.temp_max_diff or (new-old)>self.temp_max_diff): if((old-new)>self.temp_max_diff or (new-old)>self.temp_max_diff):
self.log.write('error checking '+self.names[sensor]+';prev('+str(old)+');cur('+str(new)+'); ... @'+time.ctime()+"\n") self.log.write('error checking '+sensor+';prev('+str(old)+');cur('+str(new)+'); ... @'+time.ctime()+"\n")
self.log.flush() self.log.flush()
return False return False
else: else:
@ -37,7 +37,7 @@ class Logger(object):
########################################## ##########################################
def write_value(self,value,sensor): def write_value(self,value,sensor):
# TODO: catch IOError # TODO: catch IOError
valuename=self.records+"/"+self.names[sensor]+"_"+preptime() valuename=self.records+"/"+sensor+"_"+preptime()
valuelog=open(valuename,'a') valuelog=open(valuename,'a')
valuelog.write(str(value) + ';' + str(int(time.time())) +"\n") valuelog.write(str(value) + ';' + str(int(time.time())) +"\n")
valuelog.close() valuelog.close()
@ -45,17 +45,19 @@ class Logger(object):
########################################## ##########################################
# generic callback # # generic callback #
########################################## ##########################################
def cb_generic(self,value, sensor, type): def cb_generic(self,value, sensor, type, supress = False):
if(type == SensorType.temp): if(type == SensorType.temp):
if(self.temp_rise(self.prev_temps[sensor],value,sensor)): i = int(sensor[-1])-1 #sensor contains name, followed by int
if(self.temp_rise(self.prev_temps[i],value,sensor)):
self.write_value(value,sensor) self.write_value(value,sensor)
self.prev_temps[sensor]=value self.prev_temps[i]=value
elif (type == SensorType.none): elif (type == SensorType.none):
return return
else: else:
self.write_value(value,sensor) self.write_value(value,sensor)
unit=settings.SENSOR_VALUES[type] unit=self.units[type]
print(self.names[sensor] +': ' + str(value/unit[0]) + ' '+unit[1]+', ' + str(time.ctime())) if not supress:
print(sensor +': ' + str(value/unit[0]) + ' '+unit[1]+', ' + str(time.ctime()))
########################################### ###########################################
# exception logging # # exception logging #

91
Setup.py Normal file
View File

@ -0,0 +1,91 @@
#!/usr/bin/python3
# -*- coding: utf-8 -*-
try:
from tinkerforge.ip_connection import IPConnection
from tinkerforge.bricklet_temperature import Temperature
from tinkerforge.bricklet_humidity import Humidity
from tinkerforge.bricklet_ambient_light import AmbientLight
from tinkerforge.bricklet_barometer import Barometer
except ImportError:
print("package 'tinkerforge' not installed, canceling")
raise
from functools import partial
import traceback
from settings import SensorType
from Logger import Logger
class Setup(object):
def __init__(self, connection, sensors, cbtimes, cb_generic):
self.connection = connection
self.sensors = sensors
self.cbtimes = cbtimes
self.cb_generic = cb_generic
def parametrizedCallback(self, name, type):
return partial(self.cb_generic, sensor=name, type=type)
def setupTemp(self, callback, id, cbtime):
obj = Temperature(id, self.connection)
obj.set_temperature_callback_period(cbtime)
callback(obj.get_temperature())
obj.register_callback(obj.CALLBACK_TEMPERATURE, callback)
return obj
def setupHumi(self, callback, id, cbtime):
obj = Humidity(id, self.connection)
obj.set_humidity_callback_period(cbtime)
callback(obj.get_humidity())
obj.register_callback(obj.CALLBACK_HUMIDITY, callback)
return obj
def setupAmbi(self, callback, id, cbtime):
obj = AmbientLight(id, self.connection)
obj.set_illuminance_callback_period(cbtime)
callback(obj.get_illuminance())
obj.register_callback(obj.CALLBACK_ILLUMINANCE, callback)
return obj
def setupBaro(self, callback, id, cbtime):
obj = Barometer(id, self.connection)
callback(obj.get_air_pressure())
obj.set_air_pressure_callback_period(cbtime)
obj.register_callback(obj.CALLBACK_AIR_PRESSURE,callback)
return obj
def setupNone(self, callback, id, cbtime):
obj = "None " + str(id)
return obj
def genericSensorSetup(self, name, sensor):
status = "setup device "+ sensor[0] +" ("+ name +"): "
callback = self.parametrizedCallback(name, type=sensor[1])
cbtime = self.cbtimes[sensor[1]]
try:
if sensor[1] is SensorType.temp:
obj = self.setupTemp(callback, sensor[0], cbtime)
elif sensor[1] is SensorType.humi:
obj = self.setupHumi(callback, sensor[0], cbtime)
elif sensor[1] is SensorType.ambi:
obj = self.setupAmbi(callback, sensor[0], cbtime)
elif sensor[1] is SensorType.baro:
obj = self.setupBaro(callback, sensor[0], cbtime)
status += "OK"
except Exception as e:
status += "FAIL"
#print(e)
#print(traceback.format_exc())
print(status)
obj = self.setupNone(callback, sensor[0] + name, cbtime)
return obj
def setupSensors(self):
connected=[]
for name in self.sensors:
sensor = self.sensors[name]
obj = self.genericSensorSetup(name, sensor)
connected.append(obj)
return connected

69
all.py
View File

@ -15,9 +15,9 @@ except ImportError:
import os.path import os.path
import os import os
import time import time
from functools import partial
from Logger import Logger from Logger import Logger
from Setup import Setup
from settings import SensorType from settings import SensorType
import settings import settings
@ -38,66 +38,51 @@ def check_dirs_and_files():
if not os.path.exists(settings.records): if not os.path.exists(settings.records):
os.mkdir(settings.records, 0000755) os.mkdir(settings.records, 0000755)
def obtainLock(lockfile = settings.lockname):
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):
if os.path.exists(lockfile):
os.remove(lockfile)
def disconnect(connection):
if not connection.get_connection_state() is IPConnection.CONNECTION_STATE_DISCONNECTED:
connection.disconnect()
if __name__ == "__main__": if __name__ == "__main__":
check_dirs_and_files() check_dirs_and_files()
log=open(settings.logname,'a') log=open(settings.logname,'a')
try: try:
while True: while True:
if not os.path.exists(settings.lockname): if obtainLock():
lock=open(settings.lockname,'w') logger=Logger(log, )
lock.write(str(time.time()))
lock.close()
# lock obtained
logger=Logger(log)
try: try:
ipcon = IPConnection() ipcon = IPConnection()
# connect # connect
ipcon.connect(settings.HOST, settings.PORT) ipcon.connect(settings.HOST, settings.PORT)
log.write('start logging "all" ... @'+time.ctime()+"\n") log.write('start logging "all" ... @'+time.ctime()+"\n")
log.flush() log.flush()
connected=[] setup = Setup(ipcon, settings.SENSORS, settings.TIMES, logger.cb_generic)
for i,sensor in enumerate(settings.SENSORS): connected = setup.setupSensors()
print("setup device "+sensor[0]+" ("+str(i)+")") raw_input('Press key to restart\n')
callback=partial(logger.cb_generic, sensor=i, type=sensor[2]) disconnect(ipcon)
cbtime=settings.TIMES[sensor[2]]
if(sensor[2] == SensorType.temp):
obj = Temperature(sensor[1], ipcon)
obj.set_temperature_callback_period(cbtime)
callback(obj.get_temperature())
obj.register_callback(obj.CALLBACK_TEMPERATURE, callback)
elif (sensor[2] == SensorType.humi):
obj = Humidity(sensor[1], ipcon)
obj.set_humidity_callback_period(cbtime)
callback(obj.get_humidity())
obj.register_callback(obj.CALLBACK_HUMIDITY, callback)
elif(sensor[2] == SensorType.ambi):
obj = AmbientLight(sensor[1], ipcon)
obj.set_illuminance_callback_period(cbtime)
callback(obj.get_illuminance())
obj.register_callback(obj.CALLBACK_ILLUMINANCE, callback)
elif (sensor[2] == SensorType.baro):
obj = Barometer(sensor[1], ipcon)
callback(obj.get_air_pressure())
obj.set_air_pressure_callback_period(cbtime)
obj.register_callback(obj.CALLBACK_AIR_PRESSURE,callback)
else:
continue
connected.append(obj)
raw_input('Press key to exit\n')
ipcon.disconnect()
log.write('stop logging... @'+time.ctime()+"\n") log.write('stop logging... @'+time.ctime()+"\n")
except Exception as inst: except Exception as inst:
#connection failed, log and exit #connection failed, log and exit
logger.printException(inst) logger.printException(inst)
os.remove(settings.lockname) print(inst)
freeLock()
else: else:
print('lock file active!!') print('lock file active!!')
log.write('lock collision: lock "all" active @ '+time.ctime()+"\n") log.write('lock collision: lock "all" active @ '+time.ctime()+"\n")
print("something failed, wait for retry ("+settings.waitDelay+")") print("wait for retry ("+str(settings.waitDelay)+")")
time.sleep(settings.waitDelay) time.sleep(settings.waitDelay)
except KeyboardInterrupt: except KeyboardInterrupt:
print("Interrupted") print("Interrupted, cleaning up")
disconnect(ipcon)
log.write("keyboard-interrupt happened @"+time.ctime()+"\n") log.write("keyboard-interrupt happened @"+time.ctime()+"\n")
os.remove(settings.lockname) freeLock()
ipcon.disconnect()

View File

@ -12,17 +12,19 @@ class SensorType:
#HOST = "localhost" #HOST = "localhost"
HOST = "192.168.2.34" #HOST = "192.168.2.34"
HOST = "192.168.2.60"
PORT = 4223 PORT = 4223
SENSORS=[ SENSORS={
["temp1", "7B5", SensorType.temp], "temp1": ["7B5", SensorType.temp],
["temp2", "8js", SensorType.temp], "temp2": ["8js", SensorType.temp],
["humi1", "7RY", SensorType.humi], "humi1": ["7RY", SensorType.humi],
["ambi1", "8Fw", SensorType.ambi], "ambi1": ["8Fw", SensorType.ambi],
["ambi2", "8DJ", SensorType.ambi], "ambi2": ["8DJ", SensorType.ambi],
["baro1", "bB7", SensorType.baro], "baro1": ["bB7", SensorType.baro],
] "temp3": ["8ms", SensorType.temp],
}
TIMES={ TIMES={
SensorType.temp: 30000, SensorType.temp: 30000,
@ -48,7 +50,7 @@ waitDelay = 10
# only change when new sensor is added # # only change when new sensor is added #
######################################## ########################################
SENSOR_VALUES=[ SENSOR_UNITS=[
(0,''), (0,''),
(100.0, '°C'), (100.0, '°C'),
(10.0, '%RH'), (10.0, '%RH'),
@ -61,6 +63,5 @@ SENSOR_VALUES=[
# no manual change needed # # no manual change needed #
########################### ###########################
tempSensors=len(list(filter(lambda a: True if a[2]==SensorType.temp else False,SENSORS))) tempSensors=len(list(filter(lambda a: True if SENSORS[a][1]==SensorType.temp else False, SENSORS)))
NAMES=list(map(lambda a:a[0], SENSORS))