diff --git a/package.json b/package.json index fb9ac4e..75383b6 100644 --- a/package.json +++ b/package.json @@ -68,8 +68,6 @@ "@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 c8adcf8..7918f60 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,12 +17,6 @@ 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 e048caa..0ae02ed 100644 --- a/src/lib/server/db/schema.js +++ b/src/lib/server/db/schema.js @@ -34,7 +34,7 @@ export const sensors = pgTable("sensors", { }); export const sensorData = pgTable("sensor_data", { - uuid: uuid().primaryKey().defaultRandom(), + uuid: uuid().primaryKey(), sensor: text("sensor") .references(() => sensors.id) .notNull(), @@ -42,5 +42,4 @@ export const sensorData = pgTable("sensor_data", { humidity: real().notNull(), pressure: real().notNull(), altitude: real().notNull(), - time: timestamp({ withTimezone: true, mode: "date" }).notNull().defaultNow(), }); diff --git a/src/routes/(app)/[slug]/+page.svelte b/src/routes/(app)/[slug]/+page.svelte index 6491725..3aa8411 100644 --- a/src/routes/(app)/[slug]/+page.svelte +++ b/src/routes/(app)/[slug]/+page.svelte @@ -1,10 +1,6 @@
-

Floor {data.slug}

{#if data.hasConfig && data.floorConfig} @@ -333,267 +209,4 @@
{/if} - - Statistics - - -
- Statistics for floor {data.slug} - Showing total data for the last 3 months -
-
- -
- - - {#snippet child({ props })} - - {/snippet} - - - - {#each sensorOptions as sensor} - - {sensor.label} - - {/each} - - - - - - - {selectedLabel} - - - Last 3 months - Last 30 days - Last 7 days - - - - -
- - {#if isLoading} -
-
-
-

Loading statistics...

-
-
- {:else if hasError} -
-
-

Error loading statistics

-

Please try again later

-
-
- {:else if chartData.length === 0} -
-
-

No data available

-

- Statistics will appear once sensor data is collected -

-
-
- {:else} - - - {selectedSensorConfig.label} - - -
- {#if filteredData.length > 0} - -
-
-
Latest
-
- {filteredData[filteredData.length - 1]?.[selectedSensor]?.toFixed(1)} - {#if selectedSensor === "temperature"}°C - {:else if selectedSensor === "humidity"}% - {:else if selectedSensor === "pressure"}kPa - {:else if selectedSensor === "altitude"}m - {/if} -
-
-
-
Average
-
- {( - filteredData.reduce((sum, item) => sum + item[selectedSensor], 0) / - filteredData.length - ).toFixed(1)} - {#if selectedSensor === "temperature"}°C - {:else if selectedSensor === "humidity"}% - {:else if selectedSensor === "pressure"}kPa - {:else if selectedSensor === "altitude"}m - {/if} -
-
-
-
Range
-
- {Math.min(...filteredData.map((d) => d[selectedSensor])).toFixed(1)} - {Math.max( - ...filteredData.map((d) => d[selectedSensor]), - ).toFixed(1)} - {#if selectedSensor === "temperature"}°C - {:else if selectedSensor === "humidity"}% - {:else if selectedSensor === "pressure"}kPa - {:else if selectedSensor === "altitude"}m - {/if} -
-
-
- - -
- - - {#if filteredData.length > 1} - {@const minValue = Math.min(...filteredData.map((d) => d[selectedSensor]))} - {@const maxValue = Math.max(...filteredData.map((d) => d[selectedSensor]))} - {@const valueRange = maxValue - minValue || 1} - {@const padding = 30} - {@const chartWidth = 800 - padding * 2} - {@const chartHeight = 400 - padding * 2} - - - - - - - - - - - {maxValue.toFixed(1)} - {((minValue + maxValue) / 2).toFixed(1)} - {minValue.toFixed(1)} - - - {#if filteredData.length > 0} - {@const firstDate = filteredData[0].date} - {@const lastDate = filteredData[filteredData.length - 1].date} - {@const midIndex = Math.floor(filteredData.length / 2)} - {@const midDate = filteredData[midIndex].date} - - - {@const formatDate = (date) => { - if (timeRange === "7d") { - return date.toLocaleDateString("en-US", { - weekday: "short", - month: "short", - day: "numeric", - }); - } else if (timeRange === "30d") { - return date.toLocaleDateString("en-US", { - month: "short", - day: "numeric", - }); - } else { - return date.toLocaleDateString("en-US", { month: "short" }); - } - }} - - {formatDate(firstDate)} - {formatDate(midDate)} - {formatDate(lastDate)} - {/if} - - - { - const x = padding + (i / (filteredData.length - 1)) * chartWidth; - const y = - padding + - chartHeight - - ((d[selectedSensor] - minValue) / valueRange) * chartHeight; - return `${x},${y}`; - }) - .join(" ")} - /> - {/if} - -
- -
- Data from {filteredData[0]?.date?.toLocaleDateString()} to {filteredData[ - filteredData.length - 1 - ]?.date?.toLocaleDateString()} -
- {:else} -
-
-

No data available

-

- No data found for the selected time period -

-
-
- {/if} -
-
-
- {/if} - - -
-
diff --git a/src/routes/(app)/[slug]/stats/+server.ts b/src/routes/(app)/[slug]/stats/+server.ts deleted file mode 100644 index fc68394..0000000 --- a/src/routes/(app)/[slug]/stats/+server.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { db } from "$lib/server/db"; -import * as table from "$lib/server/db/schema" - -export const GET = async () => { - // Get all sensor data (like the original working version) - const rawData = await db.select({ - altitude: table.sensorData.altitude, - humidity: table.sensorData.humidity, - pressure: table.sensorData.pressure, - temperature: table.sensorData.temperature, - date: table.sensorData.time, - }).from(table.sensorData); - - // Scale pressure values to be in a similar range as other sensors - // Divide by 1000 to convert from Pa to kPa (more reasonable scale) - const data = rawData.map(item => ({ - ...item, - pressure: Math.round((item.pressure / 1000) * 10) / 10 // Convert to kPa with 1 decimal place - })); - - console.log(`Returning ${data.length} data points`); - - return new Response(JSON.stringify(data), { - headers: { - "Content-Type": "application/json" - } - }); -} diff --git a/src/routes/(app)/settings/+page.server.js b/src/routes/(app)/settings/+page.server.js index 1939028..e7bdcb0 100644 --- a/src/routes/(app)/settings/+page.server.js +++ b/src/routes/(app)/settings/+page.server.js @@ -81,9 +81,6 @@ export const actions = { try { const deviceData = JSON.parse(devices); - deviceData.forEach(async (dev) => { - await db.insert(table.sensors).values({ id: dev.id, user: event.locals.session.userId }); - }); // Check if floor exists const exists = await db diff --git a/src/routes/mqtt/+server.js b/src/routes/mqtt/+server.js index 75ae0aa..d705f2a 100644 --- a/src/routes/mqtt/+server.js +++ b/src/routes/mqtt/+server.js @@ -1,9 +1,6 @@ // src/routes/mqtt/+server.js -import { db } from "$lib/server/db"; -import * as table from "$lib/server/db/schema"; import { connectedDevices, deviceSensorData, getCurrentDevices } from "$lib/server/mqtt-devices.js"; -import { eq } from "drizzle-orm"; -import mqtt from "mqtt"; +import * as mqtt from "mqtt"; import { writable } from "svelte/store"; // A Svelte store to hold the latest MQTT message. @@ -117,7 +114,7 @@ function connectMqtt() { }); }); - client.on("message", async (topic, message) => { + client.on("message", (topic, message) => { const payload = message.toString(); console.log(`Received message from topic "${topic}": ${payload}`); latestMessage.set(payload); // Update the Svelte store @@ -133,17 +130,6 @@ function connectMqtt() { if (sensorData) { console.log(`Parsed sensor data:`, sensorData); updateDevice(deviceId, sensorData); - const devices = await db.select().from(table.sensors).where(eq(table.sensors.id, deviceId)); - if (devices.length == 1) - await db - .insert(table.sensorData) - .values({ - sensor: deviceId, - temperature: sensorData.temperature, - humidity: sensorData.humidity, - altitude: sensorData.altitude, - pressure: sensorData.pressure, - }); } else { // Still update device as online even if data parsing failed updateDevice(deviceId);