38 lines
1.3 KiB
TypeScript
38 lines
1.3 KiB
TypeScript
import { config as loadDotenv } from "dotenv";
|
|
import { fileURLToPath } from "node:url";
|
|
import { dirname, join } from "node:path";
|
|
import { z } from "zod";
|
|
|
|
// In production (docker-compose) env vars are already injected via env_file;
|
|
// this only fills gaps for local `npm run dev`, and is a no-op if the file is absent.
|
|
loadDotenv({ path: join(dirname(fileURLToPath(import.meta.url)), "../../.env") });
|
|
|
|
const envSchema = z.object({
|
|
PORT: z.coerce.number().default(3000),
|
|
INFLUX_URL: z.string().url(),
|
|
INFLUX_TOKEN: z.string().min(1),
|
|
INFLUX_ORG: z.string().min(1),
|
|
INFLUX_BUCKET: z.string().min(1),
|
|
INFLUX_MEASUREMENT: z.string().default("power"),
|
|
INFLUX_DOMAIN: z.string(),
|
|
INFLUX_ENTITY_ID: z.string(),
|
|
INFLUX_FIELD: z.string().default("value"),
|
|
INFLUX_FIELD_UNIT: z.enum(["W", "kW"]).default("W"),
|
|
HA_URL: z.string().url(),
|
|
HA_TOKEN: z.string().min(1),
|
|
TARGET_KW: z.coerce.number().positive(),
|
|
DB_PATH: z.string().default("./data/energy.db"),
|
|
CONTROL_LOOP_INTERVAL_MS: z.coerce.number().default(10_000),
|
|
});
|
|
|
|
export type Env = z.infer<typeof envSchema>;
|
|
|
|
export function loadEnv(): Env {
|
|
const parsed = envSchema.safeParse(process.env);
|
|
if (!parsed.success) {
|
|
console.error("Invalid environment configuration:", parsed.error.flatten().fieldErrors);
|
|
process.exit(1);
|
|
}
|
|
return parsed.data;
|
|
}
|