Display devices and there status
This commit is contained in:
6
app.py
6
app.py
@@ -50,6 +50,12 @@ def home():
|
|||||||
return render_template('base.html')
|
return render_template('base.html')
|
||||||
|
|
||||||
|
|
||||||
|
@ app.route("/devices")
|
||||||
|
def devices():
|
||||||
|
devices = db.get_devices()
|
||||||
|
return render_template('devices.html', devices=devices)
|
||||||
|
|
||||||
|
|
||||||
@app.route("/overview")
|
@app.route("/overview")
|
||||||
def overview():
|
def overview():
|
||||||
cadences = db.get_all_cadences()
|
cadences = db.get_all_cadences()
|
||||||
|
|||||||
14
db.py
14
db.py
@@ -42,3 +42,17 @@ class DataBase():
|
|||||||
|
|
||||||
def get_all_cadences(self):
|
def get_all_cadences(self):
|
||||||
return self.execute('SELECT * FROM cadence')
|
return self.execute('SELECT * FROM cadence')
|
||||||
|
|
||||||
|
def get_devices(self):
|
||||||
|
return self.execute("""
|
||||||
|
SELECT DEVICE.ID,
|
||||||
|
DEVICE.NAME,
|
||||||
|
MAX(CADENCE.LOGGED_AT) AS LAST_LOGGED_AT,
|
||||||
|
CASE WHEN(NOW() < (MAX(CADENCE.LOGGED_AT) + (INTERVAL '5 min'))) THEN 'yes'
|
||||||
|
ELSE 'no'
|
||||||
|
END AS IS_ACTIVE
|
||||||
|
FROM DEVICE
|
||||||
|
LEFT JOIN CADENCE ON DEVICE.ID = CADENCE.DEVICE_ID
|
||||||
|
GROUP BY DEVICE.ID
|
||||||
|
ORDER BY LAST_LOGGED_AT
|
||||||
|
""")
|
||||||
|
|||||||
4
graph.py
4
graph.py
@@ -14,6 +14,10 @@ custom_style = Style(
|
|||||||
|
|
||||||
|
|
||||||
def generate_graph(x_labels, data, style=custom_style):
|
def generate_graph(x_labels, data, style=custom_style):
|
||||||
|
"""
|
||||||
|
Generate SVG line graph using pygal
|
||||||
|
example usage: generate_graph([1,2,3], [("RPM", [1,2,3]),("Power", [2,4,6])])
|
||||||
|
"""
|
||||||
graph = pygal.Line(show_y_guides=False,
|
graph = pygal.Line(show_y_guides=False,
|
||||||
show_legend=False, style=style)
|
show_legend=False, style=style)
|
||||||
graph.x_labels = x_labels
|
graph.x_labels = x_labels
|
||||||
|
|||||||
@@ -15,6 +15,8 @@
|
|||||||
<div class="h-full w-full bg-gray-50 relative overflow-y-auto">
|
<div class="h-full w-full bg-gray-50 relative overflow-y-auto">
|
||||||
<main>
|
<main>
|
||||||
<div class="px-4 container mx-auto pt-8" id="container">
|
<div class="px-4 container mx-auto pt-8" id="container">
|
||||||
|
<div hx-get="{{ url_for('devices') }}" hx-trigger="load">
|
||||||
|
</div>
|
||||||
<div hx-get="{{ url_for('overview') }}" hx-trigger="load, every 2s">
|
<div hx-get="{{ url_for('overview') }}" hx-trigger="load, every 2s">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
26
templates/devices.html
Normal file
26
templates/devices.html
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<div class="relative overflow-x-auto">
|
||||||
|
<table class="lg:w-1/4 sm:w-full text-sm text-left text-gray-500 dark:text-gray-400">
|
||||||
|
<thead class="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400">
|
||||||
|
<tr>
|
||||||
|
<th scope="col" class="px-6 py-3">
|
||||||
|
Name
|
||||||
|
</th>
|
||||||
|
<th scope="col" class="px-6 py-3">
|
||||||
|
Status
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for d in devices %}
|
||||||
|
<tr class="bg-white border-b dark:bg-gray-800 dark:border-gray-700 cursor-pointer">
|
||||||
|
<th scope="row" class="px-6 py-4 font-medium text-gray-900 whitespace-nowrap dark:text-white">
|
||||||
|
{{d['name']}}
|
||||||
|
</th>
|
||||||
|
<td class="px-6 py-4">
|
||||||
|
{{d['is_active']}}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
Reference in New Issue
Block a user