homebridge-nordpool-baltics
Version:
Plugin exposes virtual accessories (switch, light, presence, temperature) and enables HomeKit automation by Nordpool electricity price in Lithuania, Latvia, Estonia, Sweden, Norway, Denmark.
167 lines • 6.87 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.fnc_currentHour = exports.fnc_tomorrowKey = exports.fnc_todayKey = exports.defaultAreaTimezone = exports.defaultPricesCache = exports.defaultService = exports.pricing = exports.devices = exports.PLATFORM_SERIAL_NUMBER = exports.PLATFORM_MODEL = exports.PLATFORM_VERSION = exports.PLATFORM_MANUFACTURER = exports.PLUGIN_NAME = exports.PLATFORM_NAME = void 0;
const Path = __importStar(require("path"));
const fs = __importStar(require("fs"));
const luxon_1 = require("luxon");
const file_system_cache_1 = require("file-system-cache");
/* eslint @typescript-eslint/no-var-requires: "off" */
const pkg = require('../package.json');
exports.PLATFORM_NAME = 'Nordpool';
exports.PLUGIN_NAME = pkg.name;
exports.PLATFORM_MANUFACTURER = pkg.author.name;
exports.PLATFORM_VERSION = pkg.version;
exports.PLATFORM_MODEL = 'Electricity price sensors';
exports.PLATFORM_SERIAL_NUMBER = 'UN783GU921Y0';
// main device(s)
exports.devices = [
{
UniqueId: 'JKGhJH654*87pDE',
displayName: 'Nordpool',
},
];
// eslint-disable-next-line prefer-const
exports.pricing = {
today: [],
currently: 0.0001,
currentHour: 0,
cheapestHour: [],
cheapest4Hours: [],
cheapest5Hours: [],
cheapest5HoursConsec: [],
cheapest5HoursConsec2days: [],
cheapest6Hours: [],
cheapest7Hours: [],
cheapest8Hours: [],
cheapest9Hours: [],
cheapest10Hours: [],
cheapest11Hours: [],
cheapest12Hours: [],
priciestHour: [],
median: 0,
median2days: 0,
};
exports.defaultService = {
currently: null,
cheapestHour: null,
cheapest4Hours: null,
cheapest5Hours: null,
cheapest5HoursConsec: null,
cheapest6Hours: null,
cheapest7Hours: null,
cheapest8Hours: null,
cheapest9Hours: null,
cheapest10Hours: null,
cheapest11Hours: null,
cheapest12Hours: null,
priciestHour: null,
hourlyTickerSwitch: null,
};
function defaultPricesCache(api, log) {
const ns = 'homebridge-nordpool-baltics';
const nsHash = 'b162cf22c8adb8fa829628b261839cad18dc3994';
const storagePath = api.user.storagePath();
const cacheDirectory = Path.join(storagePath, '.cache');
const fallbackDirectory = storagePath; // Fallback to root storage path
let finalCacheDirectory = cacheDirectory;
try {
// Ensure .cache directory exists
if (!fs.existsSync(cacheDirectory)) {
fs.mkdirSync(cacheDirectory, { recursive: true });
log.debug(`OK: Cache directory created at ${cacheDirectory}`);
}
// Check if directory is writable
fs.accessSync(cacheDirectory, fs.constants.W_OK);
}
catch (error) {
// If .cache directory creation or access fails, fall back to root storage path
log.warn(`Failed to access or create cache directory at ${cacheDirectory}: ${error instanceof Error ? error.message : 'Unknown error'}`);
log.warn(`Falling back to root storage path: ${fallbackDirectory}`);
finalCacheDirectory = fallbackDirectory;
}
// Auto-cleanup of old cached files on init
const files = fs.readdirSync(finalCacheDirectory);
const now = Date.now();
files.filter(file => file.startsWith(`${nsHash}-`)).forEach(file => {
const filePath = Path.join(finalCacheDirectory, file);
try {
const stats = fs.statSync(filePath);
const fileAge = now - stats.mtimeMs;
// If the file is older than 2 days, clean up
if (fileAge >= 172800 * 1000 * 2) {
fs.unlinkSync(filePath);
log.debug(`OK: Deleted old cache file: ${filePath}`);
}
}
catch (error) {
log.warn(`Failed to access file stats or delete file: ${filePath}. Error: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
});
return new file_system_cache_1.Cache({ basePath: finalCacheDirectory, ns: ns, ttl: 172800 });
}
exports.defaultPricesCache = defaultPricesCache;
// Dynamically determine the timezone based on the configured area
function defaultAreaTimezone(config) {
var _a;
const area = (_a = config.area) === null || _a === void 0 ? void 0 : _a.toUpperCase();
// Define timezone mappings for supported areas
const timezoneMapping = {
LT: 'Europe/Vilnius', // Lithuania
LV: 'Europe/Riga', // Latvia
EE: 'Europe/Tallinn', // Estonia
FI: 'Europe/Helsinki', // Finland
SE1: 'Europe/Stockholm', // Sweden
SE2: 'Europe/Stockholm', // Sweden
SE3: 'Europe/Stockholm', // Sweden
SE4: 'Europe/Stockholm', // Sweden
DK1: 'Europe/Copenhagen', // Denmark DK1
DK2: 'Europe/Copenhagen', // Denmark DK2
NO1: 'Europe/Oslo', // Norway NO1
NO2: 'Europe/Oslo', // Norway NO2
NO3: 'Europe/Oslo', // Norway NO3
NO4: 'Europe/Oslo', // Norway NO4
NO5: 'Europe/Oslo', // Norway NO5
};
// Return the corresponding timezone or fallback to a default (e.g., Europe/Vilnius)
return timezoneMapping[area] || 'Europe/Vilnius';
}
exports.defaultAreaTimezone = defaultAreaTimezone;
function fnc_todayKey(config) {
const timezone = defaultAreaTimezone(config);
return luxon_1.DateTime.local().setZone(timezone).toFormat('yyyy-MM-dd');
}
exports.fnc_todayKey = fnc_todayKey;
function fnc_tomorrowKey(config) {
const timezone = defaultAreaTimezone(config);
return luxon_1.DateTime.local().plus({ day: 1 }).setZone(timezone).toFormat('yyyy-MM-dd');
}
exports.fnc_tomorrowKey = fnc_tomorrowKey;
function fnc_currentHour(config) {
const timezone = defaultAreaTimezone(config);
return luxon_1.DateTime.local().setZone(timezone).hour;
}
exports.fnc_currentHour = fnc_currentHour;
//# sourceMappingURL=settings.js.map