Prep for YamiIchi export
This commit is contained in:
parent
a0699dbb12
commit
260ab48a72
4 changed files with 162 additions and 18 deletions
|
@ -1,6 +1,7 @@
|
|||
# TODO: web frontend
|
||||
import os
|
||||
import tornado.web
|
||||
from .ranges import yamiIchiCodes
|
||||
|
||||
class ExportHandler(tornado.web.RequestHandler):
|
||||
|
||||
|
@ -11,19 +12,30 @@ class ExportHandler(tornado.web.RequestHandler):
|
|||
self.conn = conn
|
||||
|
||||
def get(self, range):
|
||||
# TODO: userid + start time
|
||||
c = self.conn.cursor()
|
||||
self.set_header("Content-Type", 'text/csv')
|
||||
ranges = {
|
||||
'1h': '-1 hour',
|
||||
'24h': '-1 day',
|
||||
'week': '-7 days',
|
||||
'1h': ('-1 hour',),
|
||||
'24h': ('-1 day',),
|
||||
'week': ('-7 days',),
|
||||
}
|
||||
q = "SELECT * FROM beats WHERE recordedAt > date('now', ?) ORDER BY recordedAt ASC"
|
||||
if range in yamiIchiCodes:
|
||||
range = yamiIchiCodes[range]
|
||||
# range = 1d, 3d, 1w
|
||||
ranges = {
|
||||
"1d": ("2018-11-04 10:00:00","2018-11-05 12:00:00"),
|
||||
"3d": ("2018-11-04 10:00:00","2018-11-07 12:00:00"),
|
||||
"1w": ("2018-11-04 10:00:00","2018-11-11 12:00:00")
|
||||
}
|
||||
q = "SELECT * FROM beats WHERE recordedAt > ? AND recordedAt < ? ORDER BY recordedAt ASC"
|
||||
|
||||
# TODO: userid + start time
|
||||
if range not in ranges:
|
||||
# Not found
|
||||
raise tornado.web.HTTPError(404)
|
||||
|
||||
c.execute("SELECT * FROM beats WHERE recordedAt > date('now', ?) ORDER BY recordedAt ASC", (ranges[range],))
|
||||
c = self.conn.cursor()
|
||||
self.set_header("Content-Type", 'text/csv')
|
||||
c.execute(q, ranges[range])
|
||||
self.write("id,bpm,timestamp\n")
|
||||
for row in c:
|
||||
self.write("{},{},{}\n".format(row['id'], row['bpm'], row['createdAt']))
|
||||
|
|
102
heartbeat/ranges.py
Normal file
102
heartbeat/ranges.py
Normal file
|
@ -0,0 +1,102 @@
|
|||
yamiIchiCodes = {
|
||||
"BwsHAAIGCw4": "24h",
|
||||
"DAYFAgoLBw4": "24h",
|
||||
"BQMDDgMECAw": "24h",
|
||||
"BgYHBwYAAw0": "24h",
|
||||
"BgoGAgIFBQc": "24h",
|
||||
"DgkIDg0NBA8": "24h",
|
||||
"AA4KDQYKBwE": "24h",
|
||||
"BgANCQwACAY": "24h",
|
||||
"DA0KAw4KBg4": "24h",
|
||||
"DQcABgEAAQ4": "24h",
|
||||
"AA4ADQ4PCQw": "24h",
|
||||
"AAoPAQIJAg4": "24h",
|
||||
"DwAFDAYGDgw": "24h",
|
||||
"CwQDAg8IBgI": "24h",
|
||||
"BQsHBg4MBwM": "24h",
|
||||
"AgYAAgQLAgQ": "24h",
|
||||
"Cw4LDQACBAw": "24h",
|
||||
"DwADDQIADQE": "24h",
|
||||
"CwsGCQEDCgc": "24h",
|
||||
"CgIGBw8EAQU": "24h",
|
||||
"BAoECQ0JCwY": "24h",
|
||||
"CQIAAQECDgg": "24h",
|
||||
"BAMNDQQCAg0": "24h",
|
||||
"BQULBAEABgk": "24h",
|
||||
"DQMIDQUICwQ": "24h",
|
||||
"DwgABAcBBgk": "24h",
|
||||
"BAsPBAsLBQo": "24h",
|
||||
"AQMABgMMCAQ": "24h",
|
||||
"AwwNAA8HBws": "24h",
|
||||
"CgoDDQoCCwM": "24h",
|
||||
"CQIPAgwBBwk": "24h",
|
||||
"AQsIDAkBCA8": "24h",
|
||||
"BwMGBwQPAQs": "24h",
|
||||
"DQgPDgkECQ4": "24h",
|
||||
"BQICBwcLBQ8": "24h",
|
||||
"AAcFDg8HCQM": "24h",
|
||||
"CgEPAwMLBQo": "24h",
|
||||
"Cw8ICgUMBwo": "24h",
|
||||
"BQYIDg4JCAI": "24h",
|
||||
"CAQLDQkDDQY": "24h",
|
||||
"AAYBDQ8DCwc": "24h",
|
||||
"DQ0CBgILCgg": "24h",
|
||||
"DwULAg4IBQI": "24h",
|
||||
"Aw8FBQEPCAA": "24h",
|
||||
"AA4BAg0KCQs": "24h",
|
||||
"AAsABg0EDgE": "24h",
|
||||
"AQIABA0FAwE": "24h",
|
||||
"AQ4CBwYECgc": "24h",
|
||||
"BwcGAwkEAQM": "3d",
|
||||
"DggLCAUCAQA": "3d",
|
||||
"DQkOBQAOAwY": "3d",
|
||||
"BAwHAAQIDgc": "3d",
|
||||
"CwoDAAUADgM": "3d",
|
||||
"DgIIAAsODwM": "3d",
|
||||
"Dw0KBgsIBAM": "3d",
|
||||
"DwkEDwwBBgA": "3d",
|
||||
"AAsCDgQKBQ0": "3d",
|
||||
"DQQDCA4CAgs": "3d",
|
||||
"BAwHCwEMBwA": "3d",
|
||||
"AwwBAQkOAwQ": "3d",
|
||||
"DgINAwsOAQk": "3d",
|
||||
"CQMHBg4HBgI": "3d",
|
||||
"AQ8EBwECBg0": "3d",
|
||||
"CAAJAwQMCwM": "3d",
|
||||
"BQgGAAoABgA": "3d",
|
||||
"DAcOBAYDCQs": "3d",
|
||||
"DA4GDg4HCAg": "3d",
|
||||
"CAoHBwgADAY": "3d",
|
||||
"BwsCDgUIBgs": "3d",
|
||||
"AwYLAwsCCQ4": "3d",
|
||||
"DQABAQ0LBwA": "3d",
|
||||
"AwIDCQgBAgw": "3d",
|
||||
"DgsBDwAFCgw": "3d",
|
||||
"AAoKAQMHBQA": "3d",
|
||||
"AggACQ4FCwg": "3d",
|
||||
"DAoIDggKAQU": "3d",
|
||||
"BAULCgkAAA4": "3d",
|
||||
"DwoPDg8KCgc": "3d",
|
||||
"AQAHAAsKAQ4": "1w",
|
||||
"CwQIAQkEBgw": "1w",
|
||||
"BQQPAggLDwY": "1w",
|
||||
"CQgFCQUDCAQ": "1w",
|
||||
"CgYBAA0GCgY": "1w",
|
||||
"BQwDAgwNAQ8": "1w",
|
||||
"AQIFBQcKBwM": "1w",
|
||||
"AgECDQwFDwk": "1w",
|
||||
"DQILDgsJAgA": "1w",
|
||||
"BwIDDAAMAQ0": "1w",
|
||||
"AQEIAwABDwE": "1w",
|
||||
"BQcFDAAKCAM": "1w",
|
||||
"AwEEAwUIAgQ": "1w",
|
||||
"BAwABQsDAwA": "1w",
|
||||
"BQQPCAgDAQU": "1w",
|
||||
"BwoMDwsPAA0": "1w",
|
||||
"CwoGCg0EDQ4": "1w",
|
||||
"DQUPAAcGCgo": "1w",
|
||||
"AgIEDAAGDQo": "1w",
|
||||
"BwEDAA4NBwk": "1w",
|
||||
"Dg0IDwsLDQ8": "1w",
|
||||
"DwwPDgsEBAs": "1w",
|
||||
}
|
|
@ -4,6 +4,7 @@ import tornado.ioloop
|
|||
from .ws import WebSocketHandler
|
||||
from .frontend import FrontendHandler
|
||||
from .export import ExportHandler
|
||||
from .ranges import yamiIchiCodes
|
||||
import sqlite3
|
||||
import os
|
||||
import json
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8" />
|
||||
<title>Quantified Other: Heart Edition</title>
|
||||
<link rel="stylesheet" media="screen" href="https://fontlibrary.org/face/d-din" type="text/css"/>
|
||||
<style media="screen">
|
||||
body{
|
||||
font-family: Helvetica, sans-serif;
|
||||
font-family: 'DDINRegular', Helvetica, sans-serif;
|
||||
}
|
||||
#graph{
|
||||
height: calc(100vh);
|
||||
|
@ -13,19 +14,25 @@
|
|||
left:0;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
h1{
|
||||
color: darkblue;
|
||||
}
|
||||
#downloads {
|
||||
border: solid #ccc 1px;
|
||||
border: solid #000 1px;
|
||||
padding: 10px;
|
||||
position: absolute;
|
||||
top: 180px;
|
||||
top: 160px;
|
||||
right: 10px;
|
||||
background: aliceblue;
|
||||
background: darkblue;
|
||||
font-weight: bold;
|
||||
width: 200px;
|
||||
color: white;
|
||||
}
|
||||
#downloads a{
|
||||
color: yellow;
|
||||
}
|
||||
#title {
|
||||
background: aliceblue;
|
||||
background: darkblue;
|
||||
width: 200px;
|
||||
height: 130px;
|
||||
display: flex;
|
||||
|
@ -37,8 +44,9 @@
|
|||
position: absolute;
|
||||
top: 10px;
|
||||
right: 10px;
|
||||
border: solid 1px #ccc;
|
||||
text-shadow: 1px 1px #ccc, -1px -1px #ccc,1px -1px #ccc, -1px 1px #ccc;
|
||||
border: solid 1px #000;
|
||||
text-shadow: 1px 1px #000, -1px -1px #000,1px -1px #000, -1px 1px #000;
|
||||
margin-top:0;
|
||||
}
|
||||
#value {
|
||||
padding-left: 6px;
|
||||
|
@ -46,12 +54,31 @@
|
|||
display: block;
|
||||
float: right;
|
||||
width: 50%;
|
||||
text-align: right;
|
||||
}
|
||||
#downloads span {
|
||||
font-weight: normal;
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
#projecttitle{
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 10px;
|
||||
}
|
||||
|
||||
#me{
|
||||
font-style: italic;
|
||||
position: absolute;
|
||||
bottom: 10px;
|
||||
right:10px;
|
||||
font-size: 70%;
|
||||
}
|
||||
|
||||
.gtitle{
|
||||
transform: translateY(47px);
|
||||
}
|
||||
|
||||
</style>
|
||||
<script src="https://cdn.plot.ly/plotly-1.5.0.min.js"></script>
|
||||
<script language="javascript" type="text/javascript">
|
||||
|
@ -61,9 +88,11 @@
|
|||
|
||||
</script>
|
||||
|
||||
<h1 id="projecttitle">Data Double Black Market</h1>
|
||||
<div id="me">A project by <a href="https://rubenvandeven.com">Ruben van de Ven</a></div>
|
||||
<h2 id="title">live bpm: <span id='value'>...</span></h2>
|
||||
<div id='downloads'>
|
||||
Data
|
||||
<div class='description>'>Available sets:</div>
|
||||
<span><a href='/1h.csv'>hour</a></span>
|
||||
<span><a href='/24h.csv'>day</a></span>
|
||||
<span><a href='/week.csv'>week</a></span>
|
||||
|
@ -87,13 +116,13 @@ Plotly.d3.csv("/1h.csv", function(err, rows){
|
|||
name: 'BPM',
|
||||
x: unpack(rows, 'timestamp'),
|
||||
y: unpack(rows, 'bpm'),
|
||||
line: {color: '#17BECF'}
|
||||
line: {color: '#02028b'}//17BECF
|
||||
}
|
||||
|
||||
var data = [trace1];
|
||||
|
||||
var layout = {
|
||||
title: 'Last hour',
|
||||
title: 'Heartbeat on sale: Ruben van de Ven',
|
||||
};
|
||||
|
||||
var currentBpm = null;
|
||||
|
|
Loading…
Reference in a new issue