From 51d7b6c23958882dc4858b13bf8a651e07cb1bb8 Mon Sep 17 00:00:00 2001 From: Daniel Bulant Date: Sat, 14 Mar 2026 19:43:18 +0100 Subject: [PATCH] working version --- a5/db.py | 4 ++-- a5/greetings.db | Bin 12288 -> 12288 bytes a5/main.m5f | 1 + a5/main.py | 8 +++++++- a5/templates/block/index.html.j2 | 14 ++++++++++---- a5/templates/block/measurements.html.j2 | 6 +++--- 6 files changed, 23 insertions(+), 10 deletions(-) create mode 100644 a5/main.m5f diff --git a/a5/db.py b/a5/db.py index fe40095..7a62b5c 100644 --- a/a5/db.py +++ b/a5/db.py @@ -79,12 +79,12 @@ CREATE TABLE IF NOT EXISTS measurements return stats def get_page(self, page: int, page_size: int = 20) -> List[sqlite3.Row]: - """Gets a paged list of all measurements. Page is 0 indexed.""" + """Gets a paged list of all measurements. Page is 1 indexed.""" with closing(self._conn.cursor()) as cursor: cursor.execute( # sql "SELECT timestamp, tvoc, co2 FROM measurements ORDER BY timestamp DESC LIMIT ?, ?", - (page_size, (page - 1) * page_size), + ((page - 1) * page_size, page_size), ) return cursor.fetchall() diff --git a/a5/greetings.db b/a5/greetings.db index 79e5337fc5f87a6cb9a80eee61c83a18093e49b0..0a26612098814b92946c1f3f6ec26ad6c8fb3fe8 100644 GIT binary patch delta 165 zcmZojXh@hK&B!`Y#+i|IW5N=C9v1!+4E&$?pYUJfKe1U*U{b! z;aVPM7%y+txqm!Na9+5*EDs}$m-K91Cl><)0}KCI2L3Pn&-rihp9Pw>m*1F&nVk`4 X77L66GKv|_0h+|b&CCwA5@Zkn!&5Qw delta 43 qcmZojXh@hK&B!=W#+i|EW5N=CCI*4cf(m>1CpOrzaWMb^oC^Q~Aq!Ff diff --git a/a5/main.m5f b/a5/main.m5f new file mode 100644 index 0000000..fdb8547 --- /dev/null +++ b/a5/main.m5f @@ -0,0 +1 @@ +{"components":[{"id":"_stickplus2screen","createTime":1773505709934,"name":"screen","x":0,"y":0,"width":160,"height":284,"backgroundColor":"#111111","backgroundImage":"","size":0,"screenType":"default","type":"screen"},{"id":"j+N9hFD*o0Vb^sST","createTime":1773511509305,"isCoreInk":false,"isPaper":false,"name":"title0","x":0,"y":0,"width":271,"height":16,"color":"#FFFFFF","backgroundColor":"#0000FF","text":"CO2/TVOC","textOffset":3,"font":"lcd.FONT_Default","screenType":"default","type":"title","layer":6,"radius":null},{"id":"gyu&hkSHvY^UG#8n","createTime":1773511520734,"isCoreTwo":false,"isPaper":false,"name":"current","x":0,"y":48,"color":"#FFFFFF","text":"Current","font":"lcd.FONT_Default","rotation":0,"screenType":"default","type":"label","layer":8,"width":null,"height":null,"radius":null},{"id":"OvArlsM&HQaOQX3t","createTime":1773511523127,"isCoreTwo":false,"isPaper":false,"name":"min","x":0,"y":66,"color":"#FFFFFF","text":"Min","font":"lcd.FONT_Default","rotation":0,"screenType":"default","type":"label","layer":10,"width":null,"height":null,"radius":null},{"id":"Wq9Y62dNY$V56hBe","createTime":1773511530768,"isCoreTwo":false,"isPaper":false,"name":"Max","x":0,"y":82,"color":"#FFFFFF","text":"Max","font":"lcd.FONT_Default","rotation":0,"screenType":"default","type":"label","layer":12,"width":null,"height":null,"radius":null},{"id":"ik2LdCLXN-2h*PCP","createTime":1773511572426,"isCoreTwo":false,"isPaper":false,"name":"CO2","x":46,"y":29,"color":"#FFFFFF","text":"CO2","font":"lcd.FONT_Default","rotation":0,"screenType":"default","type":"label","layer":14,"width":null,"height":null,"radius":null},{"id":"V6251bTdMBjc*r4B","createTime":1773511576735,"isCoreTwo":false,"isPaper":false,"name":"TVOC","x":88,"y":29,"color":"#FFFFFF","text":"TVOC","font":"lcd.FONT_Default","rotation":0,"screenType":"default","type":"label","layer":16,"width":null,"height":null,"radius":null},{"id":"yRkr_2I6b8UvwJM9","createTime":1773511583746,"isCoreTwo":false,"isPaper":false,"name":"co2_cur","x":63,"y":48,"color":"#FFFFFF","text":"0","font":"lcd.FONT_Default","rotation":0,"screenType":"default","type":"label","layer":18,"width":null,"height":null,"radius":null},{"id":"TdBK6w#ltWA3n+82","createTime":1773511586266,"isCoreTwo":false,"isPaper":false,"name":"co2_min","x":64,"y":66,"color":"#FFFFFF","text":"1","font":"lcd.FONT_Default","rotation":0,"screenType":"default","type":"label","layer":20,"width":null,"height":null,"radius":null},{"id":"vsRS!bn+HAxafAs%","createTime":1773511588928,"isCoreTwo":false,"isPaper":false,"name":"co2_max","x":63,"y":82,"color":"#FFFFFF","text":"2","font":"lcd.FONT_Default","rotation":0,"screenType":"default","type":"label","layer":22,"width":null,"height":null,"radius":null},{"id":"r5^kGjCUaZJpQ9B`","createTime":1773511591345,"isCoreTwo":false,"isPaper":false,"name":"tvoc_cur","x":101,"y":48,"color":"#FFFFFF","text":"01","font":"lcd.FONT_Default","rotation":0,"screenType":"default","type":"label","layer":24,"width":null,"height":null,"radius":null},{"id":"YNUuKr-@_wFQ2!r@","createTime":1773511594230,"isCoreTwo":false,"isPaper":false,"name":"tvoc_min","x":119,"y":62,"color":"#FFFFFF","text":"1","font":"lcd.FONT_Default","rotation":0,"screenType":"default","type":"label","layer":26,"width":null,"height":null,"radius":null},{"id":"Npl6$lTJrsB!^IqA","createTime":1773511597591,"isCoreTwo":false,"isPaper":false,"name":"tvoc_max","x":116,"y":82,"color":"#FFFFFF","text":"2","font":"lcd.FONT_Default","rotation":0,"screenType":"default","type":"label","layer":28,"width":null,"height":null,"radius":null},{"id":"E+*G69n$qNHPVMxt","createTime":1773511816738,"name":"rectangle0","x":6,"y":111,"width":120,"height":120,"borderColor":"#FFFFFF","backgroundColor":"#FFFFFF","screenType":"default","type":"rectangle","layer":29,"radius":null}],"type":"stick-C-plus2","versions":"Beta","units":[{"id":"mQ^l$mnOtRytHL_j","createTime":1773506064396,"hidden":false,"type":"tvoc","name":"tvoc_0","port":"A","default":["A","PAHUB","Custom"],"pb_port":[0,1,2,3,4,5],"new_pb_port":"0","user_port":["21","22"],"icon":"TVOC.png","url":"https://docs.m5stack.com/en/products/sku/U088"}],"hats":[{"id":"M9Z&m%S8765$zYFq","createTime":1773505986887,"type":"hat_pir","name":"hat_pir_0","port":"A","default":["A"],"icon":"hat_PIR.png","url":"https://docs.m5stack.com/en/products/sku/U054"}],"stamps":[],"chains":[],"blockly":"co2minco2maxco2tvocmintvocmaxtvoclcdon2Describe this function...100lcdoff0x012000lcdoff0AwasPressedmeasureco2tvoc_0tvoctvoc_0GTco2maxco2maxco2co2LTco2minco2minco2co2GTtvocmaxtvocmaxtvoctvocLTtvocmintvocmintvoctvocPOSThttps://au790508.eu.pythonanywhere.com/api/reporttvoctvocco2co2co2_curHello M5co2co2_minHello M5minco2co2_maxHello M5maxco2tvoc_curHello M5tvoctvoc_minHello M5mintvoctvoc_maxHello M5maxtvocmeasure0x0060000pir0x0010006111120maxco20maxtvoc0minco210000mintvoc10000pirhat_pir_0100lcdoff0mintvocco2maxco2maxtvoctvocminco2","Blockly.Remotes":[],"Blockly.RemotePlus":[{"id":"__title","blockId":"","createTime":1773505693300,"name":"M5RemoteTitle","dragAndDrop":false,"resizable":false,"options":{"minWidth":1,"minHeight":1,"maxWidth":6,"maxHeight":10,"defaultWidth":2,"defaultHeight":1},"w":2,"h":1,"bgColor":"#0080FF","color":"#fff","fontsize":"M","label":"M5Remote","interval":3000,"code":"","event":"","dataSource":"none","ezdataToken":"","topic":"","needShadow":false,"type":"title","x":null,"y":null},{"id":"8CJ2Eo_o2!33t5l0","blockId":"","createTime":1773506642678,"name":"1","dragAndDrop":true,"resizable":true,"options":{"minWidth":1,"minHeight":1,"maxWidth":6,"maxHeight":10,"defaultWidth":2,"defaultHeight":1},"w":2,"h":1,"bgColor":"#fff","color":"#0080FF","fontsize":"M","label":"CO2","interval":3000,"code":"","event":"","dataSource":"none","ezdataToken":"bIbsOtSuQbxld4hgPLtUoWEogrOxrYDM","topic":"","needShadow":false,"type":"title","x":0,"y":0},{"id":"mHk3#3ejs1eU_@Lj","blockId":"","createTime":1773506645674,"name":"2","dragAndDrop":true,"resizable":true,"options":{"minWidth":1,"minHeight":1,"maxWidth":6,"maxHeight":10,"defaultWidth":2,"defaultHeight":1},"w":2,"h":1,"bgColor":"#fff","color":"#0080FF","fontsize":"M","label":"TVOC","interval":3000,"code":"","event":"","dataSource":"none","ezdataToken":"bIbsOtSuQbxld4hgPLtUoWEogrOxrYDM","topic":"","needShadow":false,"type":"title","x":0,"y":2},{"id":"fe#dz@VR0%VSkx5e","blockId":"","createTime":1773506666939,"name":"3","dragAndDrop":true,"resizable":true,"options":{"minWidth":1,"minHeight":1,"maxWidth":6,"maxHeight":10,"defaultWidth":2,"defaultHeight":1},"w":2,"h":1,"bgColor":"#fff","color":"#0080FF","fontsize":"M","label":"min","interval":3000,"code":"","event":"","dataSource":"none","ezdataToken":"bIbsOtSuQbxld4hgPLtUoWEogrOxrYDM","topic":"","needShadow":false,"type":"title","x":2,"y":0},{"id":"_MjH8#@=v2mbG35e","blockId":"","createTime":1773506668352,"name":"4","dragAndDrop":true,"resizable":true,"options":{"minWidth":1,"minHeight":1,"maxWidth":6,"maxHeight":10,"defaultWidth":2,"defaultHeight":1},"w":2,"h":1,"bgColor":"#fff","color":"#0080FF","fontsize":"M","label":"min","interval":3000,"code":"","event":"","dataSource":"none","ezdataToken":"bIbsOtSuQbxld4hgPLtUoWEogrOxrYDM","topic":"","needShadow":false,"type":"title","x":2,"y":2},{"id":"D9QIhYej^JOw%OFh","blockId":"","createTime":1773506669587,"name":"5","dragAndDrop":true,"resizable":true,"options":{"minWidth":1,"minHeight":1,"maxWidth":6,"maxHeight":10,"defaultWidth":2,"defaultHeight":1},"w":2,"h":1,"bgColor":"#fff","color":"#0080FF","fontsize":"M","label":"max","interval":3000,"code":"","event":"","dataSource":"none","ezdataToken":"bIbsOtSuQbxld4hgPLtUoWEogrOxrYDM","topic":"","needShadow":false,"type":"title","x":4,"y":0},{"id":"Q*DgWT%rmic*u_cA","blockId":"","createTime":1773506670891,"name":"6","dragAndDrop":true,"resizable":true,"options":{"minWidth":1,"minHeight":1,"maxWidth":6,"maxHeight":10,"defaultWidth":2,"defaultHeight":1},"w":2,"h":1,"bgColor":"#fff","color":"#0080FF","fontsize":"M","label":"max","interval":3000,"code":"","event":"","dataSource":"none","ezdataToken":"bIbsOtSuQbxld4hgPLtUoWEogrOxrYDM","topic":"","needShadow":false,"type":"title","x":4,"y":2},{"id":"@Bqg^F&J$R2BslIm","blockId":"zRO9HbtF+XP@#3WdUnOA","createTime":1773511743960,"name":"co2","dragAndDrop":true,"resizable":true,"options":{"minWidth":2,"minHeight":1,"maxWidth":6,"maxHeight":6,"defaultWidth":2,"defaultHeight":2},"w":2,"h":1,"showTitle":false,"color":"#0080FF","interval":3000,"fontsize":"M","code":"def label_co2_callback():\n global co2, minco2, maxco2, tvoc, mintvoc, maxtvoc, tvoc_0, lcdon2 \n return co2","event":"label_co2_callback","dataSource":"uiflow","ezdataToken":"bIbsOtSuQbxld4hgPLtUoWEogrOxrYDM","topic":"","needShadow":false,"type":"label","x":0,"y":1},{"id":"&-&$U9NCzDf+ADl`","blockId":"AiWmLVIPJPX`zLv$)TvO","createTime":1773511754152,"name":"co2_min","dragAndDrop":true,"resizable":true,"options":{"minWidth":2,"minHeight":1,"maxWidth":6,"maxHeight":6,"defaultWidth":2,"defaultHeight":2},"w":2,"h":1,"showTitle":false,"color":"#0080FF","interval":3000,"fontsize":"M","code":"def label_co2_min_callback():\n global co2, minco2, maxco2, tvoc, mintvoc, maxtvoc, tvoc_0, lcdon2 \n return minco2","event":"label_co2_min_callback","dataSource":"uiflow","ezdataToken":"bIbsOtSuQbxld4hgPLtUoWEogrOxrYDM","topic":"","needShadow":false,"type":"label","x":2,"y":1},{"id":"+uGT&Fayy_jOKbe=","blockId":"5d^QfcHJ`lFu,AJlNuPD","createTime":1773511759952,"name":"co2_max","dragAndDrop":true,"resizable":true,"options":{"minWidth":2,"minHeight":1,"maxWidth":6,"maxHeight":6,"defaultWidth":2,"defaultHeight":2},"w":2,"h":1,"showTitle":false,"color":"#0080FF","interval":3000,"fontsize":"M","code":"def label_co2_max_callback():\n global co2, minco2, maxco2, tvoc, mintvoc, maxtvoc, tvoc_0, lcdon2 \n return maxco2","event":"label_co2_max_callback","dataSource":"uiflow","ezdataToken":"bIbsOtSuQbxld4hgPLtUoWEogrOxrYDM","topic":"","needShadow":false,"type":"label","x":4,"y":1},{"id":"OrsYdo&h%x^EH_5$","blockId":"hj@8pn`*F`,PAt2@dH24","createTime":1773511765199,"name":"tvoc","dragAndDrop":true,"resizable":true,"options":{"minWidth":2,"minHeight":1,"maxWidth":6,"maxHeight":6,"defaultWidth":2,"defaultHeight":2},"w":2,"h":1,"showTitle":false,"color":"#0080FF","interval":3000,"fontsize":"M","code":"def label_tvoc_callback():\n global co2, minco2, maxco2, tvoc, mintvoc, maxtvoc, tvoc_0, lcdon2 \n return tvoc","event":"label_tvoc_callback","dataSource":"uiflow","ezdataToken":"bIbsOtSuQbxld4hgPLtUoWEogrOxrYDM","topic":"","needShadow":false,"type":"label","x":0,"y":3},{"id":"*ZxYoSNfNTvPg56C","blockId":"+:mS5ZLSXGgZ.R0nrr${","createTime":1773511767300,"name":"tvoc_min","dragAndDrop":true,"resizable":true,"options":{"minWidth":2,"minHeight":1,"maxWidth":6,"maxHeight":6,"defaultWidth":2,"defaultHeight":2},"w":2,"h":1,"showTitle":false,"color":"#0080FF","interval":3000,"fontsize":"M","code":"def label_tvoc_min_callback():\n global co2, minco2, maxco2, tvoc, mintvoc, maxtvoc, tvoc_0, lcdon2 \n return mintvoc","event":"label_tvoc_min_callback","dataSource":"uiflow","ezdataToken":"bIbsOtSuQbxld4hgPLtUoWEogrOxrYDM","topic":"","needShadow":false,"type":"label","x":2,"y":3},{"id":"_PZfaU*4M#3Ruwo1","blockId":"MP([sji5;)I]j]gABTbk","createTime":1773511770272,"name":"tvoc_max","dragAndDrop":true,"resizable":true,"options":{"minWidth":2,"minHeight":1,"maxWidth":6,"maxHeight":6,"defaultWidth":2,"defaultHeight":2},"w":2,"h":1,"showTitle":false,"color":"#0080FF","interval":3000,"fontsize":"M","code":"def label_tvoc_max_callback():\n global co2, minco2, maxco2, tvoc, mintvoc, maxtvoc, tvoc_0, lcdon2 \n return maxtvoc","event":"label_tvoc_max_callback","dataSource":"uiflow","ezdataToken":"bIbsOtSuQbxld4hgPLtUoWEogrOxrYDM","topic":"","needShadow":false,"type":"label","x":4,"y":3},{"id":"&16P3Q69lWd%Tb=S","blockId":"K#{i2F!st76Xb-[(i*8z","createTime":1773511781022,"name":"lcdon","dragAndDrop":true,"resizable":true,"options":{"minWidth":2,"minHeight":1,"maxWidth":6,"maxHeight":6,"defaultWidth":2,"defaultHeight":1},"w":2,"h":1,"showTitle":false,"label":"ON","color":"#fff","bgColor":"#0080FF","edges":"sharp","style":"solid","needShadow":false,"code":"def button_lcdon_callback():\n global co2, minco2, maxco2, tvoc, mintvoc, maxtvoc, tvoc_0, lcdon2 \n M5pwr.brightness(100)\n timerSch.stop('lcdoff')\n","event":"button_lcdon_callback","type":"button","x":0,"y":8},{"id":"fhnQhYQhK3y8UoI%","blockId":"ud@sf!,Nh-Wb.mC|Sz#u","createTime":1773511783391,"name":"lcdoff","dragAndDrop":true,"resizable":true,"options":{"minWidth":2,"minHeight":1,"maxWidth":6,"maxHeight":6,"defaultWidth":2,"defaultHeight":1},"w":2,"h":1,"showTitle":false,"label":"OFF","color":"#fff","bgColor":"#0080FF","edges":"sharp","style":"solid","needShadow":false,"code":"def button_lcdoff_callback():\n global co2, minco2, maxco2, tvoc, mintvoc, maxtvoc, tvoc_0, lcdon2 \n M5pwr.brightness(0)\n","event":"button_lcdoff_callback","type":"button","x":2,"y":8}],"modules":["remotePlus"],"cbIdList_":[],"eventCBIdList_":[],"apikey":"218E4484","uuid":"155dcc00-0c50-4a86-9422-1b2d6d394675"} diff --git a/a5/main.py b/a5/main.py index e6a2c0c..fe98514 100644 --- a/a5/main.py +++ b/a5/main.py @@ -1,3 +1,4 @@ +from datetime import datetime from time import time from flask import Flask, g, render_template, request @@ -10,6 +11,11 @@ app = Flask(__name__) htmx = HTMX(app) +@app.template_filter() +def format_datetime(value): + return datetime.fromtimestamp(value).isoformat() + + @app.route("/api/report", methods=["POST"]) def report() -> ResponseReturnValue: """Adds a measurement""" @@ -33,7 +39,7 @@ def stats() -> ResponseReturnValue: """Gets overall statistics as well as few recent measurements""" db = get_db() stats = db.get_stats() - recents = db.get_page(0, 10) + recents = db.get_page(1, 10) template = "page/index.html.j2" if htmx: template = "block/index.html.j2" diff --git a/a5/templates/block/index.html.j2 b/a5/templates/block/index.html.j2 index 4b9f653..289c202 100644 --- a/a5/templates/block/index.html.j2 +++ b/a5/templates/block/index.html.j2 @@ -1,10 +1,14 @@ -
+

Overview

- Count {{ stats.count }} +
+ Count {{ stats.count }}
+ TVOC min {{ stats.tvoc_min.tvoc }} @ {{ stats.tvoc_min.timestamp|format_datetime }} max {{ stats.tvoc_max.tvoc }} @ {{ stats.tvoc_max.timestamp|format_datetime }}
+ CO2 min {{ stats.co2_min.co2 }} @ {{ stats.co2_min.timestamp|format_datetime }} max {{ stats.co2_max.co2 }} @ {{ stats.co2_max.timestamp|format_datetime }} +
@@ -14,8 +18,10 @@
@ {{row['timestamp']}}
- CO2: {{row['co2']}} - TVOC: {{row['tvoc']}} +
+ CO2: {{row['co2']}} + TVOC: {{row['tvoc']}} +
{% else %} diff --git a/a5/templates/block/measurements.html.j2 b/a5/templates/block/measurements.html.j2 index 8fce3f7..8311752 100644 --- a/a5/templates/block/measurements.html.j2 +++ b/a5/templates/block/measurements.html.j2 @@ -1,4 +1,4 @@ -
+

Measurements

Page {{page}}

@@ -21,10 +21,10 @@
{% if page > 1 %} - Previous page + Previous page {% endif %} {% if has_next_page %} - Next page + Next page {% endif %} View statistics