Files
homeAutomation/energy-management/backend/src/db/index.ts
2026-08-19 18:35:47 +02:00

73 lines
2.3 KiB
TypeScript

import Database from "better-sqlite3";
import { mkdirSync } from "node:fs";
import { dirname } from "node:path";
import type { Env } from "../env.js";
export function openDb(env: Env): Database.Database {
mkdirSync(dirname(env.DB_PATH), { recursive: true });
const db = new Database(env.DB_PATH);
db.pragma("journal_mode = WAL");
migrate(db, env);
return db;
}
function migrate(db: Database.Database, env: Env): void {
db.exec(`
CREATE TABLE IF NOT EXISTS devices (
id INTEGER PRIMARY KEY AUTOINCREMENT,
entity_id TEXT NOT NULL UNIQUE,
name TEXT NOT NULL,
kind TEXT NOT NULL CHECK (kind IN ('switch', 'number')),
priority INTEGER NOT NULL,
min_value REAL NOT NULL DEFAULT 0,
max_value REAL NOT NULL DEFAULT 1,
dwell_seconds INTEGER NOT NULL DEFAULT 300,
manual_override INTEGER NOT NULL DEFAULT 0,
shed INTEGER NOT NULL DEFAULT 0,
last_changed_at TEXT
);
CREATE TABLE IF NOT EXISTS settings (
key TEXT PRIMARY KEY,
value TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS control_actions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp_ms INTEGER NOT NULL,
entity_id TEXT NOT NULL,
action TEXT NOT NULL CHECK (action IN ('shed', 'restore')),
reason TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS block_history (
block_start_ms INTEGER PRIMARY KEY,
average_w REAL NOT NULL
);
`);
const existingTarget = db.prepare("SELECT value FROM settings WHERE key = 'target_kw'").get();
if (!existingTarget) {
db.prepare("INSERT INTO settings (key, value) VALUES ('target_kw', ?)").run(String(env.TARGET_KW));
}
const deviceColumns = new Set(
(db.prepare("PRAGMA table_info(devices)").all() as { name: string }[]).map((c) => c.name),
);
if (!deviceColumns.has("only_when_sun")) {
db.exec("ALTER TABLE devices ADD COLUMN only_when_sun INTEGER NOT NULL DEFAULT 0");
}
if (!deviceColumns.has("from_time")) {
db.exec("ALTER TABLE devices ADD COLUMN from_time TEXT");
}
if (!deviceColumns.has("to_time")) {
db.exec("ALTER TABLE devices ADD COLUMN to_time TEXT");
}
if (!deviceColumns.has("enable_url")) {
db.exec("ALTER TABLE devices ADD COLUMN enable_url TEXT");
}
if (!deviceColumns.has("disable_url")) {
db.exec("ALTER TABLE devices ADD COLUMN disable_url TEXT");
}
}