using logging in move.py, too
parent
8543c3c3f0
commit
cb287b21a4
|
|
@ -29,7 +29,7 @@ class Logger(object):
|
||||||
def setup_data_log(self):
|
def setup_data_log(self):
|
||||||
log = logging.getLogger("weatherstation.datalog")
|
log = logging.getLogger("weatherstation.datalog")
|
||||||
log.setLevel(logging.INFO)
|
log.setLevel(logging.INFO)
|
||||||
fh = logging.FileHandler(os.path.join(settings.records, "records.log"))
|
fh = logging.FileHandler(os.path.join(settings.records, settings.recordlog))
|
||||||
fformat = logging.Formatter()
|
fformat = logging.Formatter()
|
||||||
fh.setFormatter(fformat)
|
fh.setFormatter(fformat)
|
||||||
log.addHandler(fh)
|
log.addHandler(fh)
|
||||||
|
|
@ -87,6 +87,7 @@ class Logger(object):
|
||||||
# exception logging #
|
# exception logging #
|
||||||
###########################################
|
###########################################
|
||||||
def printException(self, inst):
|
def printException(self, inst):
|
||||||
|
#TODO: LOG
|
||||||
tree = ET.parse(settings.exceptionlog)
|
tree = ET.parse(settings.exceptionlog)
|
||||||
root = tree.getroot()
|
root = tree.getroot()
|
||||||
new = ET.Element('exception', {'class':str( type(inst) ).split("'")[1], 'date':str( time.ctime() ), 'time':str( int(time.time()) ), 'type':str(inst)})
|
new = ET.Element('exception', {'class':str( type(inst) ).split("'")[1], 'date':str( time.ctime() ), 'time':str( int(time.time()) ), 'type':str(inst)})
|
||||||
|
|
|
||||||
|
|
@ -13,12 +13,11 @@ Python2, Bash, Tinkerforge
|
||||||
* SensorTyp
|
* SensorTyp
|
||||||
3. Gewünschte Callback-zeiten in *TIMES* anpassen
|
3. Gewünschte Callback-zeiten in *TIMES* anpassen
|
||||||
3. Tinkerforge-python-bindings installieren
|
3. Tinkerforge-python-bindings installieren
|
||||||
4. `all.py` starten, um Aufzeichnung zu starten
|
4. `main.py` starten, um Aufzeichnung zu starten
|
||||||
* Aufzeichnung des aktuellen Tages werden in `records` gespeichert
|
* Aufzeichnung des aktuellen Tages werden in `records` gespeichert
|
||||||
* (ftp.sh bzw move.py) Nach dem Upload und dem Tagesende werden die Aufzeichnungen nach `arch` verschoben
|
* (ftp.sh bzw move.py) Nach dem Upload und dem Tagesende werden die Aufzeichnungen nach `arch` verschoben
|
||||||
5. Cronjob für Upload mit ftp.sh einrichten
|
5. Cronjob für Upload mit ftp.sh einrichten
|
||||||
|
|
||||||
# TODOS
|
# TODOS
|
||||||
* Logging auf loghandler umstellen [https://docs.python.org/2/library/logging.html#handler-objects](https://docs.python.org/2/library/logging.html#handler-objects)
|
|
||||||
* auf python3 umstellen
|
* auf python3 umstellen
|
||||||
* settings aus python auslagern
|
* settings aus python auslagern
|
||||||
|
|
|
||||||
23
Setup.py
23
Setup.py
|
|
@ -46,6 +46,7 @@ class SensorSetup(object):
|
||||||
self.cbtimes = cbtimes
|
self.cbtimes = cbtimes
|
||||||
self.cb_generic = cb_generic
|
self.cb_generic = cb_generic
|
||||||
self.log = log
|
self.log = log
|
||||||
|
self._previous_sensors={}
|
||||||
|
|
||||||
def parametrizedCallback(self, name, type):
|
def parametrizedCallback(self, name, type):
|
||||||
return partial(self.cb_generic, sensor=name, type=type)
|
return partial(self.cb_generic, sensor=name, type=type)
|
||||||
|
|
@ -100,14 +101,21 @@ class SensorSetup(object):
|
||||||
# return obj, setcb, get, cb
|
# return obj, setcb, get, cb
|
||||||
|
|
||||||
def __setupSensor__(self, callback, id, cbtime, var):
|
def __setupSensor__(self, callback, id, cbtime, var):
|
||||||
|
obj = None
|
||||||
|
if id in self._previous_sensors:
|
||||||
|
self.log.debug("reusing instance for %s", id)
|
||||||
|
obj = self._previous_sensors[id] # restore instance for another callback
|
||||||
|
else:
|
||||||
|
self.log.debug("new instance for %s", id)
|
||||||
obj = var[0](id, self.connection) # construct instance
|
obj = var[0](id, self.connection) # construct instance
|
||||||
|
self._previous_sensors[id] = obj # save instance for multiple callbacks
|
||||||
var[1](obj, cbtime) # set callback period
|
var[1](obj, cbtime) # set callback period
|
||||||
callback(var[2](obj ), supress=True) # execute callback with raw getter as value
|
callback(var[2](obj ), supress=True) # execute callback with raw getter as value
|
||||||
obj.register_callback(var[3], callback) # register callback
|
obj.register_callback(var[3], callback) # register callback
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
def genericSensorSetup(self, name, sensor):
|
def genericSensorSetup(self, name, sensor):
|
||||||
status = "setup device "+ sensor[0] +" ("+ name +"): "
|
status = "setup device "+ sensor[0] +" ("+ name +"):"
|
||||||
callback = self.parametrizedCallback(name, type=sensor[1])
|
callback = self.parametrizedCallback(name, type=sensor[1])
|
||||||
cbtime = self.cbtimes[sensor[1]]
|
cbtime = self.cbtimes[sensor[1]]
|
||||||
obj = None
|
obj = None
|
||||||
|
|
@ -119,22 +127,21 @@ class SensorSetup(object):
|
||||||
var = self.getAmbi()
|
var = self.getAmbi()
|
||||||
elif sensor[1] is SensorType.baro:
|
elif sensor[1] is SensorType.baro:
|
||||||
var = self.getBaro()
|
var = self.getBaro()
|
||||||
|
elif sensor[1] is SensorType.rain:
|
||||||
|
self.log.error("rain is not yet implemented (%s, %s)", sensor[0], name)
|
||||||
|
return None
|
||||||
elif sensor[1] is SensorType.iram:
|
elif sensor[1] is SensorType.iram:
|
||||||
var = self.getIram()
|
var = self.getIram()
|
||||||
elif sensor[1] is SensorType.irob:
|
elif sensor[1] is SensorType.irob:
|
||||||
var = self.getIrob()
|
var = self.getIrob()
|
||||||
else:
|
else:
|
||||||
self.log.error("FAILED TO LOAD "+name)
|
self.log.error("%s FAIL (unknown type)", status)
|
||||||
return None
|
return None
|
||||||
try:
|
try:
|
||||||
obj = self.__setupSensor__(callback, sensor[0], cbtime, var)
|
obj = self.__setupSensor__(callback, sensor[0], cbtime, var)
|
||||||
status += "OK"
|
self.log.info("%s OK", status)
|
||||||
self.log.info(status)
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
status += "FAIL"
|
self.log.error("%s FAIL:: %s",status, e)
|
||||||
#print(e)
|
|
||||||
#print(traceback.format_exc())
|
|
||||||
self.log.error(status)
|
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
def setupSensors(self):
|
def setupSensors(self):
|
||||||
|
|
|
||||||
6
main.py
6
main.py
|
|
@ -19,7 +19,7 @@ def setupLogger():
|
||||||
formatter = logging.Formatter('%(asctime)s:[%(levelname)s] - %(message)s')
|
formatter = logging.Formatter('%(asctime)s:[%(levelname)s] - %(message)s')
|
||||||
ch.setFormatter(formatter)
|
ch.setFormatter(formatter)
|
||||||
log.addHandler(ch)
|
log.addHandler(ch)
|
||||||
fh = logging.FileHandler(os.path.join(settings.logs, "logging.log"))
|
fh = logging.FileHandler(os.path.join(settings.logs, settings.logname))
|
||||||
fh.setFormatter(formatter)
|
fh.setFormatter(formatter)
|
||||||
log.addHandler(fh)
|
log.addHandler(fh)
|
||||||
return log
|
return log
|
||||||
|
|
@ -30,8 +30,6 @@ def check_dirs_and_files():
|
||||||
# log
|
# log
|
||||||
if not os.path.exists(settings.logs):
|
if not os.path.exists(settings.logs):
|
||||||
os.mkdir(settings.logs, 0000755)
|
os.mkdir(settings.logs, 0000755)
|
||||||
#if not os.path.exists(settings.logname):
|
|
||||||
# open(settings.logname, 'w').close()
|
|
||||||
if not os.path.exists(settings.exceptionlog):
|
if not os.path.exists(settings.exceptionlog):
|
||||||
file=open(settings.exceptionlog, 'w')
|
file=open(settings.exceptionlog, 'w')
|
||||||
file.write("<exceptions></exceptions>")
|
file.write("<exceptions></exceptions>")
|
||||||
|
|
@ -44,6 +42,7 @@ def check_dirs_and_files():
|
||||||
os.mkdir(settings.records, 0000755)
|
os.mkdir(settings.records, 0000755)
|
||||||
|
|
||||||
def obtainLock(lockfile = settings.lockname):
|
def obtainLock(lockfile = settings.lockname):
|
||||||
|
#TODO: path
|
||||||
if not os.path.exists(lockfile):
|
if not os.path.exists(lockfile):
|
||||||
lock = open(lockfile, 'w')
|
lock = open(lockfile, 'w')
|
||||||
lock.write( str(time.time()) )
|
lock.write( str(time.time()) )
|
||||||
|
|
@ -52,6 +51,7 @@ def obtainLock(lockfile = settings.lockname):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def freeLock(lockfile = settings.lockname):
|
def freeLock(lockfile = settings.lockname):
|
||||||
|
#TODO: path
|
||||||
if os.path.exists(lockfile):
|
if os.path.exists(lockfile):
|
||||||
os.remove(lockfile)
|
os.remove(lockfile)
|
||||||
|
|
||||||
|
|
|
||||||
42
move.py
42
move.py
|
|
@ -3,27 +3,40 @@
|
||||||
|
|
||||||
import time
|
import time
|
||||||
import os
|
import os
|
||||||
|
import logging
|
||||||
from shutil import move
|
from shutil import move
|
||||||
|
|
||||||
from timeFunctions import *
|
from timeFunctions import *
|
||||||
from settings import locks, logs
|
from settings import locks, logs, arch, records, movelog, movelock
|
||||||
|
|
||||||
checkfile=locks+'/records_moved'
|
def setupLogger():
|
||||||
|
log = logging.getLogger("weatherstation.move")
|
||||||
|
log.setLevel(logging.INFO)
|
||||||
|
ch = logging.StreamHandler()
|
||||||
|
#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(logs, movelog))
|
||||||
|
fh.setFormatter(formatter)
|
||||||
|
log.addHandler(fh)
|
||||||
|
return log
|
||||||
|
|
||||||
|
log = setupLogger()
|
||||||
|
|
||||||
|
checkfile=os.path.join(locks,movelock)
|
||||||
|
|
||||||
if not os.path.exists(logs+"/move.log"):
|
|
||||||
open(logs+"/move.log", 'w').close()
|
|
||||||
if not os.path.exists(checkfile):
|
if not os.path.exists(checkfile):
|
||||||
open(checkfile,'w').close()
|
open(checkfile,'w').close()
|
||||||
if not os.path.exists("arch"):
|
if not os.path.exists(arch):
|
||||||
os.mkdir("arch", 0000755)
|
os.mkdir(arch, 0000755)
|
||||||
|
|
||||||
def mycopy(keep):
|
def mycopy(keep):
|
||||||
names = os.listdir("records")
|
names = os.listdir(records)
|
||||||
for name in names:
|
for name in names:
|
||||||
if keep in name:
|
if keep in name:
|
||||||
continue
|
continue
|
||||||
move(os.path.join("records", name), "arch")
|
move(os.path.join(records, name), arch)
|
||||||
|
|
||||||
log=open(logs+"/move.log",'a')
|
|
||||||
|
|
||||||
check=open(checkfile,'r')
|
check=open(checkfile,'r')
|
||||||
temp=check.read()
|
temp=check.read()
|
||||||
|
|
@ -32,20 +45,17 @@ if len(temp)<1:
|
||||||
check=open(checkfile,'w')
|
check=open(checkfile,'w')
|
||||||
check.write(str(time.time()))
|
check.write(str(time.time()))
|
||||||
check.flush()
|
check.flush()
|
||||||
|
log.info("updated time since file was empty")
|
||||||
else:
|
else:
|
||||||
last=time.gmtime(float(temp))
|
last=time.gmtime(float(temp))
|
||||||
now=time.gmtime()
|
now=time.gmtime()
|
||||||
if(prevday(last,now)):
|
if(prevday(last,now)):
|
||||||
print("move")
|
log.info("moving records")
|
||||||
log.write("moving logs... @"+time.ctime()+"\n")
|
|
||||||
log.flush()
|
|
||||||
if not os.path.exists("arch"):
|
|
||||||
os.mkdir("arch")
|
|
||||||
mycopy(preptime())
|
mycopy(preptime())
|
||||||
check.close()
|
check.close()
|
||||||
check=open(checkfile,'w')
|
check=open(checkfile,'w')
|
||||||
check.write(str(time.time()))
|
check.write(str(time.time()))
|
||||||
check.flush()
|
check.flush()
|
||||||
else:
|
else:
|
||||||
print("today")
|
log.info("records were moved today already")
|
||||||
check.close()
|
check.close()
|
||||||
|
|
|
||||||
55
settings.py
55
settings.py
|
|
@ -9,31 +9,14 @@ class SensorType:
|
||||||
ambi = 3 # ambient light bricklet
|
ambi = 3 # ambient light bricklet
|
||||||
baro = 4 # barometer bricklet
|
baro = 4 # barometer bricklet
|
||||||
rain = 5 # IO4 #TODO
|
rain = 5 # IO4 #TODO
|
||||||
iram = 6 # temperature ir bricklet, ambient #TODO
|
iram = 6 # temperature ir bricklet, ambient
|
||||||
irob = 7 # temperature ir bricklet, object #TODO
|
irob = 7 # temperature ir bricklet, object
|
||||||
"""
|
|
||||||
0: {
|
|
||||||
"host": {
|
|
||||||
"name": "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],
|
|
||||||
"temp3": ["8ms", SensorType.temp],
|
|
||||||
"humi2": ["9V5", SensorType.humi],
|
|
||||||
}
|
|
||||||
},"""
|
|
||||||
SENSORS={
|
SENSORS={
|
||||||
"irtest": {
|
"irtest": {
|
||||||
"host":{"name": "localhost", "port":4223},
|
"host":{"name": "localhost", "port":4223},
|
||||||
"sensors":{
|
"sensors":{
|
||||||
"iram": ["c8w", SensorType.iram],
|
"iram": ["c8w", SensorType.iram],
|
||||||
"iram2": ["c8ws", SensorType.iram],
|
|
||||||
"irob": ["c8w", SensorType.irob]
|
"irob": ["c8w", SensorType.irob]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -44,9 +27,9 @@ TIMES={
|
||||||
SensorType.humi: 30000,
|
SensorType.humi: 30000,
|
||||||
SensorType.ambi: 60000,
|
SensorType.ambi: 60000,
|
||||||
SensorType.baro: 60000,
|
SensorType.baro: 60000,
|
||||||
SensorType.rain: 60000,
|
SensorType.rain: 0,
|
||||||
SensorType.iram: 1000,
|
SensorType.iram: 60000,
|
||||||
SensorType.irob: 1000,
|
SensorType.irob: 60000,
|
||||||
}
|
}
|
||||||
|
|
||||||
tempmaxdiff=200 # 200== 2.0 C
|
tempmaxdiff=200 # 200== 2.0 C
|
||||||
|
|
@ -55,11 +38,15 @@ prev_temps_default=20000
|
||||||
logs='logs'
|
logs='logs'
|
||||||
locks='locks'
|
locks='locks'
|
||||||
records='records'
|
records='records'
|
||||||
|
arch='arch'
|
||||||
|
|
||||||
#TODO: add move-log, move-lock, logging instead of writing to files
|
#TODO: lockname, exceptionslog: path.join
|
||||||
lockname=locks+"/all.lock"
|
lockname=locks+"/all.lock"
|
||||||
logname=logs+"/all.log"
|
logname="logging.log"
|
||||||
exceptionlog=logs+"/exceptions.xml"
|
exceptionlog=logs+"/exceptions.xml"
|
||||||
|
recordlog="record.log"
|
||||||
|
movelog="move.log"
|
||||||
|
movelock="last_move"
|
||||||
|
|
||||||
waitDelay = 10
|
waitDelay = 10
|
||||||
|
|
||||||
|
|
@ -88,3 +75,21 @@ for i in SENSORS:
|
||||||
if SENSORS[i]['sensors'][j][1] == SensorType.temp:
|
if SENSORS[i]['sensors'][j][1] == SensorType.temp:
|
||||||
tempSensors+=1
|
tempSensors+=1
|
||||||
|
|
||||||
|
"""
|
||||||
|
0: {
|
||||||
|
"host": {
|
||||||
|
"name": "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],
|
||||||
|
"temp3": ["8ms", SensorType.temp],
|
||||||
|
"humi2": ["9V5", SensorType.humi],
|
||||||
|
}
|
||||||
|
},"""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,8 +13,8 @@
|
||||||
# Aktionen
|
# Aktionen
|
||||||
case "$1" in
|
case "$1" in
|
||||||
start)
|
start)
|
||||||
cd /home/XXXX/temp/python
|
cd /home/XXXX/weather
|
||||||
sudo -u XXXX screen -dmS recordall python all.py&
|
sudo -u XXXX screen -dmS recordall python main.py&
|
||||||
;;
|
;;
|
||||||
stop)
|
stop)
|
||||||
# /opt/beispiel stop
|
# /opt/beispiel stop
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue