fix: data logger now called from main, plot in thread

This commit is contained in:
Bernhard Stampfer
2016-06-05 23:00:25 +02:00
parent 042d0c86fa
commit adbe4f858a
6 changed files with 194 additions and 20 deletions

124
app/datalog.py Normal file
View File

@@ -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)

View File

@@ -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()))
logging.info("Plot End plot_list " + str(datetime.datetime.now()))

View File

@@ -6,6 +6,11 @@
<meta charset="utf-8">
<meta name="viewport" content="width=500">
<!--<meta name="viewport" content="width=device-width, initial-scale=1.0">-->
<meta Http-Equiv="Cache-Control" Content="no-cache">
<meta Http-Equiv="Pragma" Content="no-cache">
<meta Http-Equiv="Expires" Content="0">
<meta Http-Equiv="Pragma-directive: no-cache">
<meta Http-Equiv="Cache-directive: no-cache">
<link rel="stylesheet" type="text/css" href="/static/style.css">
{% if title %}
<title> {{ title }} - Baroness </title>

View File

@@ -17,7 +17,7 @@
{% set fils = "log_%s.png" % sensor.id %}
<img src="{{ url_for('static', filename=fils) }}" /><br>
</div>
{% endfor %}b
{% endfor %}
</div>
</div>
{% endfor %}

View File

@@ -67,7 +67,6 @@ def logout():
@app.route('/fridges')
def fridges():
plot_log(30, ("static/testdata.csv",))
return render_template('fridges.html', fridges=settings.fridges, user=get_user_by_name(session.get('name')))

9
run.py
View File

@@ -5,6 +5,9 @@ from os import urandom
from app import gui
import thread
import logging
from app import settings
from app import datalog
from app import plot
if __name__ == '__main__':
@@ -15,6 +18,12 @@ if __name__ == '__main__':
logging.info("Baroness started!")
print "Baroness started: logging to ", logfile
#start data logging
if settings.settings.fridgeLogging:
logger = datalog.DataLogger()
#start plot thread
plotter = plot.Plotter()
#start gui
wx = wx.App()