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):
def __init__(self, log):
self.names = settings.NAMES
self.temp_sensors = settings.tempSensors
self.temp_prev_default=settings.prev_temps_default
self.prev_temps =[]
self.temp_prev_default = settings.prev_temps_default
self.prev_temps = []
for i in range(self.temp_sensors):
self.prev_temps.append(self.temp_prev_default)
self.temp_max_diff = settings.tempmaxdiff
self.log = log
self.records = settings.records
self.units = settings.SENSOR_UNITS
def temp_rise(self,old,new,sensor):
if(old==self.temp_prev_default):
return True
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()
return False
else:
@ -37,7 +37,7 @@ class Logger(object):
##########################################
def write_value(self,value,sensor):
# TODO: catch IOError
valuename=self.records+"/"+self.names[sensor]+"_"+preptime()
valuename=self.records+"/"+sensor+"_"+preptime()
valuelog=open(valuename,'a')
valuelog.write(str(value) + ';' + str(int(time.time())) +"\n")
valuelog.close()
@ -45,17 +45,19 @@ class Logger(object):
##########################################
# generic callback #
##########################################
def cb_generic(self,value, sensor, type):
def cb_generic(self,value, sensor, type, supress = False):
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.prev_temps[sensor]=value
self.prev_temps[i]=value
elif (type == SensorType.none):
return
else:
self.write_value(value,sensor)
unit=settings.SENSOR_VALUES[type]
print(self.names[sensor] +': ' + str(value/unit[0]) + ' '+unit[1]+', ' + str(time.ctime()))
unit=self.units[type]
if not supress:
print(sensor +': ' + str(value/unit[0]) + ' '+unit[1]+', ' + str(time.ctime()))
###########################################
# 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
import time
from functools import partial
from Logger import Logger
from Setup import Setup
from settings import SensorType
import settings
@ -38,66 +38,51 @@ def check_dirs_and_files():
if not os.path.exists(settings.records):
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__":
check_dirs_and_files()
log=open(settings.logname,'a')
try:
while True:
if not os.path.exists(settings.lockname):
lock=open(settings.lockname,'w')
lock.write(str(time.time()))
lock.close()
# lock obtained
logger=Logger(log)
if obtainLock():
logger=Logger(log, )
try:
ipcon = IPConnection()
# connect
ipcon.connect(settings.HOST, settings.PORT)
log.write('start logging "all" ... @'+time.ctime()+"\n")
log.flush()
connected=[]
for i,sensor in enumerate(settings.SENSORS):
print("setup device "+sensor[0]+" ("+str(i)+")")
callback=partial(logger.cb_generic, sensor=i, type=sensor[2])
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()
setup = Setup(ipcon, settings.SENSORS, settings.TIMES, logger.cb_generic)
connected = setup.setupSensors()
raw_input('Press key to restart\n')
disconnect(ipcon)
log.write('stop logging... @'+time.ctime()+"\n")
except Exception as inst:
#connection failed, log and exit
logger.printException(inst)
os.remove(settings.lockname)
print(inst)
freeLock()
else:
print('lock file active!!')
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)
except KeyboardInterrupt:
print("Interrupted")
print("Interrupted, cleaning up")
disconnect(ipcon)
log.write("keyboard-interrupt happened @"+time.ctime()+"\n")
os.remove(settings.lockname)
ipcon.disconnect()
freeLock()

View File

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