diff --git a/app/datalog.py b/app/datalog.py new file mode 100644 index 0000000..d5a8a27 --- /dev/null +++ b/app/datalog.py @@ -0,0 +1,124 @@ +import numpy as np +import datetime as dt +import pandas as pa +import time +#import ipdb +import signal +import thread +import logging +import atexit +import os + +# i2c io pins +P_SCK = 3 +P_SDA = 2 +P_BAUD = 50000 + +# sensor data +SENSOR_BASEID = 0x48 +SENSOR_DATALEN = 2 + +# i2c commands for pigpio software i2c +I2C_END = 0 +I2C_START = 2 +I2C_STOP = 3 +I2C_SET_ADDR = 4 +I2C_READ = 6 + +try: + import pigpio +except: + logging.fatal("PIGPIO library could not be loaded, install PIGPIO to read sensor data or disable data logging in the settings!") + exit() + + +class DataLogger: + + def __init__(self): + self.ioif = None + self.logging = True + signal.signal(signal.SIGINT, self.cleanup) + logging.info("Data Logger created") + thread.start_new_thread(self.log_data, ()) + #self.log_data() + + def log_data(self): + + # pigpio + self.ioif = pigpio.pi() + + # software i2c + try: + self.ioif.bb_i2c_open(P_SDA, P_SCK, P_BAUD) + except: + logging.error("bus already open") + self.ioif.bb_i2c_close(P_SDA) + self.ioif.bb_i2c_open(P_SDA, P_SCK, P_BAUD) + + logging.info("Data Logger started") + + log = 0 + data_fast = np.zeros(8) + data_perm = np.zeros(8) + n_fast = 1 + n_perm = 1 + while logging: + logging.info("Data Logger logging") + columns = list(("time", )) + + for i in range(SENSOR_BASEID, SENSOR_BASEID + 8): + (count, data) = self.ioif.bb_i2c_zip(P_SDA, [I2C_SET_ADDR, i, I2C_START, I2C_READ, SENSOR_DATALEN, I2C_STOP, I2C_END]) + columns.append(str(i)) + if count > 0: + data_fast[i-SENSOR_BASEID] += int(data[0]) + int(data[1]) / 256.0 + data_perm[i-SENSOR_BASEID] += int(data[0]) + int(data[1]) / 256.0 + else: + data_fast[i-SENSOR_BASEID] = np.nan + data_perm[i-SENSOR_BASEID] = np.nan + + infoline = np.empty((1, 9), dtype=object) + + if n_fast % 2 == 0: + infoline[0, 1:9] = data_fast[0:8] / n_fast + n_fast = 0 + infoline[0, 0] = dt.datetime.now() + pdataline = pa.DataFrame.from_records(infoline, columns=columns) + self.savetofile(False, pdataline) + data_fast = np.zeros(8) + + if n_perm % 120 == 0: + infoline[0, 1:9] = data_perm[0:8] / n_perm + n_perm = 0 + infoline[0, 0] = dt.datetime.now() + pdataline = pa.DataFrame.from_records(infoline, columns=columns) + self.savetofile(True, pdataline) + data_perm = np.zeros(8) + + n_fast += 1 + n_perm += 1 + time.sleep(0.5) + + def savetofile(self, permanent, data): + + if permanent: + date = dt.datetime.now().strftime('%Y%m%d') + exists = os.path.isfile('app/static/logdata_' + date + '.csv') + with open('app/static/logdata_' + date + '.csv', 'a+') as f: + data.to_csv(f, header=False, index=False) + else: + exists = os.path.isfile('/tmp/baroness_logdata_fast.csv') + with open('/tmp/baroness_logdata_fast.csv', 'a+') as f: + data.to_csv(f, header=not exists, index=False) + + def cleanup(self): + self.logging = False + logging.info("Data logger closed") + self.ioif.bb_i2c_close(P_SDA) + +if __name__ == "__main__": + + #for standalone mode + print "creating datalogger" + logger = DataLogger() + while(1): + time.sleep(1) \ No newline at end of file diff --git a/app/plot.py b/app/plot.py index a2b437b..091cd91 100644 --- a/app/plot.py +++ b/app/plot.py @@ -8,8 +8,51 @@ import numpy as np from user import User from database import * import multiprocessing as mp +import thread import pandas as pd import logging +import time +import glob + + +class Plotter: + + def __init__(self): + logging.info("Plotter started!") + self.joblist = list() + self.active = True + thread.start_new_thread(self.refresh, ()) + + def refresh(self): + ptime = 0 + while self.active: + logging.info("Plotter plotting stuff") + + logfiles = list() + logfiles += glob.glob("static/logdata*.csv") + logfiles.append("/tmp/baroness_logdata_fast.csv") + if logfiles: + plot_log(logfiles, hours = 2) + + # plotter not fully integrated yet + #if ptime % 30 or self.joblist: + # plot_total() + # plot_list(4) + # for u in self.joblist: + # plot_total(u) + # self.joblist = list() + + ptime += 1 + time.sleep(10) + + def addplot(self, user): + logging.info("Plotter add user " + user.name) + self.joblist.append(user) + + def stop(self): + logging.info("Plotter stop!") + self.active = False + def plot_all_thread(user=None): if user is not None: @@ -102,21 +145,15 @@ def plot_total(user=None): #plt.savefig(fill, dpi=400) -def plot_log(days, logfiles): - today = datetime.date.today() - delta = datetime.timedelta(days=1) - begin = today - datetime.timedelta(days=days) - dates = drange(begin, today + delta, delta) - - #print begin - #print today - #print dates +def plot_log(logfiles, hours): + end = datetime.datetime.now() + begin = end - datetime.timedelta(hours=hours) #load all logfiles data = None for logfile in logfiles: try: - d = pd.read_csv("app/static/testdata.csv", parse_dates=[0]) + d = pd.read_csv(logfile, parse_dates=[0]) if data: data = pd.concat((data, d)) else: @@ -139,7 +176,7 @@ def plot_log(days, logfiles): plt.plot(data.index.to_pydatetime(), frame, "b") ax = plt.gca() #ax.grid(True, linewidth=1.0) - plt.xlim(begin, today) + plt.xlim(begin, end) ax.spines['right'].set_visible(False) ax.spines['top'].set_visible(False) ax.yaxis.set_ticks_position('none')#('left') @@ -159,20 +196,20 @@ def plot_log(days, logfiles): #plt.xlabel('Datum') #plt.ylabel('Temperatur / C') outfile = "app/static/log_" + str(item) + ".png" - logging.info("plot plot_total " + str(datetime.datetime.now())) + logging.info("Plot plot_log " + str(datetime.datetime.now())) #480x320 plt.gcf().set_size_inches(5.3, 2.4) plt.tight_layout() plt.savefig(outfile, dpi=70, transparent=True, bbox_inches='tight') plt.close() - logging.info("end plot_list " + str(datetime.datetime.now())) + logging.info("Plot: End plot_log " + str(datetime.datetime.now())) def plot_list(duration): - logging.info("start plot_list " + str(datetime.datetime.now())) - today = datetime.datetime.today() - begin = today - datetime.timedelta(weeks=duration) + logging.info("Plot: Start plot_list " + str(datetime.datetime.now())) + end = datetime.datetime.now() + begin = end - datetime.timedelta(weeks=duration) users = get_users() products = get_products() @@ -246,11 +283,11 @@ def plot_list(duration): plt.title("Bierliste ("+ str(duration) + " Wochen)") - logging.info("plot plot_list " + str(datetime.datetime.now())) + logging.info("Plot plot_list " + str(datetime.datetime.now())) #800x600 fig.set_size_inches(15, 10) plt.savefig('app/static/bierliste_small.png', dpi=72, bbox_inches='tight') #1024x768 #fig.set_size_inches(10.24, 7.68) #plt.savefig('app/static/bierliste.png', dpi=100) - logging.info("end plot_list " + str(datetime.datetime.now())) \ No newline at end of file + logging.info("Plot End plot_list " + str(datetime.datetime.now())) \ No newline at end of file diff --git a/app/templates/base.html b/app/templates/base.html index d0d5cc2..45ec444 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -6,6 +6,11 @@ + + + + + {% if title %}