diff --git a/src/routes/(app)/[slug]/+page.server.ts b/src/routes/(app)/[slug]/+page.server.ts
index 4488322..68d7496 100644
--- a/src/routes/(app)/[slug]/+page.server.ts
+++ b/src/routes/(app)/[slug]/+page.server.ts
@@ -5,33 +5,59 @@ import type { PageServerLoad } from "./$types";
import { connect } from "mqtt";
export const load: PageServerLoad = async ({ params }) => {
- {
- const floor_cnt = await db.select({ floor: table.plans.floor, json: table.plans.plan }).from(table.plans).where(eq(table.plans.floor, params.slug));
- if (floor_cnt.length == 0) {
- await db.insert(table.plans).values({ floor: params.slug, plan: {
- "regions": [
- { "start": { "x": 100, "y": 100 }, "end": { "x": 400, "y": 100 } },
- { "start": { "x": 400, "y": 100 }, "end": { "x": 400, "y": 300 } },
- { "start": { "x": 400, "y": 300 }, "end": { "x": 100, "y": 300 } },
- { "start": { "x": 100, "y": 300 }, "end": { "x": 100, "y": 100 } }
- ],
- "doors": [
- { "location": { "x": 240, "y": 100 }, "width": 50, "rotation": 0 }
- ],
- "furnitures": [
- {
- "minBound": { "x": 150, "y": 150 },
- "maxBound": { "x": 200, "y": 200 },
- "equipName": "Table",
- "xPlacement": 150,
- "yPlacement": 150,
- "rotation": 0
- }
- ]
- }});
+ // Convert slug to number for floor lookup
+ const floorNumber = Number(params.slug);
+
+ // First check if we have a saved floor configuration in the floors table
+ const floorData = await db.select({
+ floor: table.floors.floor,
+ url: table.floors.url
+ }).from(table.floors).where(eq(table.floors.floor, floorNumber));
+
+ if (floorData.length > 0 && floorData[0].url && floorData[0].url !== "/") {
+ try {
+ // Try to parse the saved configuration
+ const config = JSON.parse(floorData[0].url);
+ return {
+ slug: params.slug,
+ floorConfig: config,
+ hasConfig: true
+ };
+ } catch (e) {
+ console.error("Error parsing floor configuration:", e);
}
-
}
+
+ // Fallback to the old canvas drawing system
+ const floor_cnt = await db.select({ floor: table.plans.floor, json: table.plans.plan }).from(table.plans).where(eq(table.plans.floor, params.slug));
+ if (floor_cnt.length == 0) {
+ await db.insert(table.plans).values({ floor: params.slug, plan: {
+ "regions": [
+ { "start": { "x": 100, "y": 100 }, "end": { "x": 400, "y": 100 } },
+ { "start": { "x": 400, "y": 100 }, "end": { "x": 400, "y": 300 } },
+ { "start": { "x": 400, "y": 300 }, "end": { "x": 100, "y": 300 } },
+ { "start": { "x": 100, "y": 300 }, "end": { "x": 100, "y": 100 } }
+ ],
+ "doors": [
+ { "location": { "x": 240, "y": 100 }, "width": 50, "rotation": 0 }
+ ],
+ "furnitures": [
+ {
+ "minBound": { "x": 150, "y": 150 },
+ "maxBound": { "x": 200, "y": 200 },
+ "equipName": "Table",
+ "xPlacement": 150,
+ "yPlacement": 150,
+ "rotation": 0
+ }
+ ]
+ }});
+ }
+
const floor_ = await db.select({ floor: table.plans.floor, json: table.plans.plan }).from(table.plans).where(eq(table.plans.floor, params.slug));
- return { slug: params.slug, floor: floor_ };
+ return {
+ slug: params.slug,
+ floor: floor_,
+ hasConfig: false
+ };
};
diff --git a/src/routes/(app)/[slug]/+page.svelte b/src/routes/(app)/[slug]/+page.svelte
index 2f90051..27ee060 100644
--- a/src/routes/(app)/[slug]/+page.svelte
+++ b/src/routes/(app)/[slug]/+page.svelte
@@ -1,5 +1,6 @@
-
-
Floor {data.slug}
-
{mqttMessage}
-
+
+
Floor {data.slug}
+
+ {#if data.hasConfig && data.floorConfig}
+
+
+ {#if data.floorConfig.image}
+
+

+
+ {#if data.floorConfig.devices}
+ {#each data.floorConfig.devices as device}
+
+ {/each}
+ {/if}
+
+
+
+
MQTT Status: {mqttMessage}
+
+ {/if}
+
+ {:else}
+
+
+ {mqttMessage}
+
+
+ {/if}
diff --git a/src/routes/(app)/settings/+page.server.js b/src/routes/(app)/settings/+page.server.js
index 365a6b8..f65e398 100644
--- a/src/routes/(app)/settings/+page.server.js
+++ b/src/routes/(app)/settings/+page.server.js
@@ -4,7 +4,24 @@ import { fail } from "@sveltejs/kit";
import { eq } from "drizzle-orm";
export const load = async (event) => {
- return {};
+ // Fetch all available floors
+ const floors = await db
+ .select({ floor: table.floors.floor })
+ .from(table.floors)
+ .orderBy(table.floors.floor);
+
+ // Provide mock ESP8266 devices for now
+ const devices = [
+ { id: "esp8266-001", name: "ESP8266 #001", type: "esp8266", status: "online" },
+ { id: "esp8266-002", name: "ESP8266 #002", type: "esp8266", status: "online" },
+ { id: "esp8266-003", name: "ESP8266 #003", type: "esp8266", status: "offline" },
+ { id: "esp8266-004", name: "ESP8266 #004", type: "esp8266", status: "online" },
+ ];
+
+ return {
+ floors: floors.map((f) => f.floor),
+ devices: devices,
+ };
};
export const actions = {
@@ -41,4 +58,49 @@ export const actions = {
await db.delete(table.floors).where(eq(table.floors.floor, n));
},
+ savefloor: async (event) => {
+ const formData = await event.request.formData();
+ const floorNumber = formData.get("floorNumber");
+ const floorPlanImage = formData.get("floorPlanImage");
+ const devices = formData.get("devices");
+
+ const n = Number(floorNumber);
+ if (isNaN(n)) return fail(400, { message: "Invalid floor number!" });
+
+ if (!floorPlanImage || !devices) {
+ return fail(400, { message: "Missing floor plan or device configuration!" });
+ }
+
+ try {
+ const deviceData = JSON.parse(devices);
+
+ // Check if floor exists
+ const exists = await db
+ .select({ floor: table.floors.floor })
+ .from(table.floors)
+ .where(eq(table.floors.floor, n));
+
+ if (exists.length === 0) {
+ return fail(400, { message: `Floor ${n} does not exist! Please create it first.` });
+ }
+
+ // Update floor with configuration
+ // Note: In a real implementation, you would store this data properly
+ // For now, we'll just update the url field as a JSON string
+ const floorConfig = {
+ image: floorPlanImage,
+ devices: deviceData,
+ };
+
+ await db
+ .update(table.floors)
+ .set({ url: JSON.stringify(floorConfig) })
+ .where(eq(table.floors.floor, n));
+
+ return { success: true, message: `Floor ${n} configuration saved successfully!` };
+ } catch (error) {
+ console.error("Error saving floor configuration:", error);
+ return fail(500, { message: "Failed to save floor configuration!" });
+ }
+ },
};
diff --git a/src/routes/(app)/settings/+page.svelte b/src/routes/(app)/settings/+page.svelte
index 173578d..d8a8fb6 100644
--- a/src/routes/(app)/settings/+page.svelte
+++ b/src/routes/(app)/settings/+page.svelte
@@ -10,19 +10,29 @@
import CardTitle from "$lib/components/ui/card/card-title.svelte";
import { Thermometer, Droplets, Gauge, Mountain, Upload, Cpu } from "@lucide/svelte";
- const { form } = $props();
+ const { form, data } = $props();
let floorPlanImage = $state(null);
- let availableDevices = $state([
- { id: "esp8266-1", name: "ESP8266 #1", type: "esp8266", status: "online" },
- { id: "esp8266-2", name: "ESP8266 #2", type: "esp8266", status: "online" },
- { id: "esp8266-3", name: "ESP8266 #3", type: "esp8266", status: "offline" },
- { id: "esp8266-4", name: "ESP8266 #4", type: "esp8266", status: "online" },
- ]);
+ let availableDevices = $state(data.devices || []);
let placedDevices = $state([]);
let draggedDevice = $state(null);
let floorPlanRef = $state(null);
+ let selectedFloorNumber = $state("");
+ let saveMessage = $state(null);
+
+ $effect(() => {
+ if (data.floors && data.floors.length > 0 && !selectedFloorNumber) {
+ selectedFloorNumber = data.floors[0].toString();
+ }
+ });
+
+ $effect(() => {
+ // Update devices when data changes
+ if (data.devices) {
+ availableDevices = data.devices;
+ }
+ });
function handleFileUpload(event) {
const file = event.target.files?.[0];
@@ -168,6 +178,65 @@
Drag ESP8266 devices from below onto the floor plan to place them in specific rooms.
+
+ {#if floorPlanImage && placedDevices.length > 0}
+
+
Save Floor Configuration
+
+ {#if saveMessage}
+
+ {saveMessage.text}
+
+ {/if}
+
+ {/if}
{/if}
diff --git a/src/routes/mqtt/+server.js b/src/routes/mqtt/+server.js
index a834279..984b83f 100644
--- a/src/routes/mqtt/+server.js
+++ b/src/routes/mqtt/+server.js
@@ -18,6 +18,7 @@ function connectMqtt() {
// Replace with your MQTT broker details
const BROKER_URL = "mqtt://kada49.it:1883"; // Example public broker
+ //const BROKER_URL = "mqtt://test.mosquitto.org:1883";
const TOPIC = "esp8266/+/data"; // Replace with your desired topic
client = mqtt.connect(BROKER_URL);