@ronniepettersson/homebridge-dummy
Version:
Create Homebridge accessories to help with automation and control — scheduling, delays, sensors, commands, webhooks, and more
107 lines • 5.09 kB
JavaScript
import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js';
import { DummyAccessory } from '../accessory/base.js';
import { GroupAccessory } from '../accessory/group.js';
import { createDummyAccessory } from '../accessory/helpers.js';
import { setLanguage, strings } from '../i18n/i18n.js';
import { migrateAccessories } from '../tools/configMigration.js';
import { Log } from '../tools/log.js';
import getVersion from '../tools/version.js';
import { WebhookManager } from '../model/webhook.js';
import { Storage } from '../tools/storage.js';
export class HomebridgeDummyPlatform {
config;
api;
Service;
Characteristic;
log;
platformAccessories = new Map();
dummyAccessories = [];
webhookManager;
constructor(logger, config, api) {
this.config = config;
this.api = api;
const userLang = Intl.DateTimeFormat().resolvedOptions().locale.split('-')[0];
setLanguage(userLang);
this.Service = api.hap.Service;
this.Characteristic = api.hap.Characteristic;
this.log = new Log(logger, config.verbose === true);
this.webhookManager = new WebhookManager(this.Characteristic, this.log, config.webhookPort);
this.log.always('v%s | System %s | Node %s | HB v%s | HAPNodeJS v%s', getVersion(), process.platform, process.version, api.serverVersion, api.hap.HAPLibraryVersion());
api.on('didFinishLaunching', () => {
this.setup();
});
api.on('shutdown', () => {
this.teardown();
});
}
configureAccessory(accessory) {
this.log.always(strings.startup.restoringAccessory, accessory.displayName);
this.platformAccessories.set(accessory.context.identifier, accessory);
}
teardown() {
this.dummyAccessories.forEach(accessory => {
accessory.teardown();
});
}
async setup() {
await Storage.init(this.api.user.persistPath());
const keepIdentifiers = new Set();
const accessories = this.config.accessories || [];
if (this.config.migrationNeeded) {
const migratedAccessories = await migrateAccessories(this.log, this.api.user.configPath()) ?? [];
accessories.push(...migratedAccessories);
}
const groupAccessories = new Map();
for (const accessoryConfig of accessories) {
if (accessoryConfig.groupName?.length) {
const groupConfig = groupAccessories.get(accessoryConfig.groupName) || { accessories: [] };
groupConfig.accessories.push(accessoryConfig);
groupAccessories.set(accessoryConfig.groupName, groupConfig);
continue;
}
const id = DummyAccessory.identifier(accessoryConfig);
keepIdentifiers.add(id);
const accessory = this.platformAccessories.get(id) ?? this.createPlatformAccessory(id, accessoryConfig.name);
const dummyAccessory = createDummyAccessory(this.Service, this.Characteristic, accessory, accessoryConfig, this.log);
if (!dummyAccessory) {
continue;
}
if (accessoryConfig.enableWebook) {
this.webhookManager.registerAccessory(dummyAccessory);
}
this.dummyAccessories.push(dummyAccessory);
}
;
for (const groupName of groupAccessories.keys()) {
const groupConfig = groupAccessories.get(groupName);
const id = GroupAccessory.identifier(groupName);
keepIdentifiers.add(id);
const accessory = this.platformAccessories.get(id) ?? this.createPlatformAccessory(id, groupName);
const groupAccessory = new GroupAccessory(this.Service, this.Characteristic, accessory, groupConfig, this.log, this.webhookManager);
this.dummyAccessories.push(groupAccessory);
}
this.platformAccessories.forEach(accessory => {
if (!keepIdentifiers.has(accessory.context.identifier)) {
this.removeCachedAccessory(accessory);
}
});
this.webhookManager.startServer();
const randIndex = Math.floor(Math.random() * strings.startup.welcome.length);
this.log.always(`${strings.startup.setupComplete}\n${strings.startup.welcome[randIndex]}`);
}
createPlatformAccessory(id, name) {
this.log.always(strings.startup.newAccessory, name);
const uuid = this.api.hap.uuid.generate(id);
const accessory = new this.api.platformAccessory(name, uuid);
accessory.context.identifier = id;
this.platformAccessories.set(id, accessory);
this.api.registerPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [accessory]);
return accessory;
}
removeCachedAccessory(accessory) {
this.log.always(strings.startup.removeAccessory, accessory.displayName);
this.api.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [accessory]);
this.platformAccessories.delete(accessory.context.identifier);
}
}
//# sourceMappingURL=platform.js.map