diff --git a/package.json b/package.json
index 75383b6..fb9ac4e 100644
--- a/package.json
+++ b/package.json
@@ -68,6 +68,8 @@
"@node-rs/argon2": "^2.0.2",
"@oslojs/crypto": "^1.0.1",
"@oslojs/encoding": "^1.1.0",
+ "d3-scale": "^4.0.2",
+ "d3-shape": "^3.2.0",
"drizzle-orm": "^0.43.1",
"mqtt": "^5.13.1",
"postgres": "^3.4.5",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 7918f60..c8adcf8 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -17,6 +17,12 @@ importers:
'@oslojs/encoding':
specifier: ^1.1.0
version: 1.1.0
+ d3-scale:
+ specifier: ^4.0.2
+ version: 4.0.2
+ d3-shape:
+ specifier: ^3.2.0
+ version: 3.2.0
drizzle-orm:
specifier: ^0.43.1
version: 0.43.1(postgres@3.4.5)
diff --git a/src/lib/server/db/schema.js b/src/lib/server/db/schema.js
index 0ae02ed..9e7680e 100644
--- a/src/lib/server/db/schema.js
+++ b/src/lib/server/db/schema.js
@@ -42,4 +42,5 @@ export const sensorData = pgTable("sensor_data", {
humidity: real().notNull(),
pressure: real().notNull(),
altitude: real().notNull(),
+ time: timestamp().notNull().defaultNow(),
});
diff --git a/src/routes/(app)/[slug]/+page.svelte b/src/routes/(app)/[slug]/+page.svelte
index 3aa8411..e31f282 100644
--- a/src/routes/(app)/[slug]/+page.svelte
+++ b/src/routes/(app)/[slug]/+page.svelte
@@ -1,6 +1,10 @@
+
Floor {data.slug}
{#if data.hasConfig && data.floorConfig}
@@ -209,4 +287,127 @@
{/if}
+
+ Statistics
+
+
+
+
+ {#snippet child({ props })}
+
+ {/snippet}
+
+
+ {#each table as column}
+ (column.visible = !value)}
+ >
+ {column.id}
+
+ {/each}
+
+
+
+ Data for floor {data.slug}
+ Showing total data for the last 3 months
+
+
+
+ {selectedLabel}
+
+
+ Last 3 months
+ Last 30 days
+ Last 7 days
+
+
+
+
+
+ {
+ return v.toLocaleDateString("en-US", {
+ month: "short",
+ day: "numeric",
+ });
+ },
+ },
+
+ yAxis: { format: () => "" },
+ }}
+ >
+ {#snippet marks({ series, getAreaProps })}
+
+
+
+
+
+
+
+
+
+
+
+ {#each series as s, i (s.key)}
+
+ {/each}
+
+ {/snippet}
+ {#snippet tooltip()}
+ {
+ return v.toLocaleDateString("en-US", {
+ month: "long",
+ });
+ }}
+ indicator="line"
+ />
+ {/snippet}
+
+
+
+
+
+
diff --git a/src/routes/(app)/[slug]/stats/+server.ts b/src/routes/(app)/[slug]/stats/+server.ts
new file mode 100644
index 0000000..6356340
--- /dev/null
+++ b/src/routes/(app)/[slug]/stats/+server.ts
@@ -0,0 +1,13 @@
+import { db } from "$lib/server/db";
+import * as table from "$lib/server/db/schema"
+
+export const GET = async () => {
+ const data = await db.select({ sensor: table.sensorData.sensor }).from(table.sensorData);
+ console.log(data);
+
+ return new Response(JSON.stringify(data), {
+ headers: {
+ "Content-Type": "application/json"
+ }
+ });
+}
diff --git a/src/routes/mqtt/+server.js b/src/routes/mqtt/+server.js
index d705f2a..be1d000 100644
--- a/src/routes/mqtt/+server.js
+++ b/src/routes/mqtt/+server.js
@@ -1,6 +1,6 @@
// src/routes/mqtt/+server.js
import { connectedDevices, deviceSensorData, getCurrentDevices } from "$lib/server/mqtt-devices.js";
-import * as mqtt from "mqtt";
+import mqtt from "mqtt";
import { writable } from "svelte/store";
// A Svelte store to hold the latest MQTT message.