summaryrefslogtreecommitdiff
path: root/src/platform.ts
diff options
context:
space:
mode:
authorZhineng Li <[email protected]>2026-03-29 06:53:53 +0800
committerZhineng Li <[email protected]>2026-03-29 06:53:53 +0800
commit256f19558f8ed5747c15c85f7e401835787504eb (patch)
tree1d879482c4945bd2b5d6fd94e60d831f6023d33c /src/platform.ts
downloadhomebridge-xiaomi-aircondition-ma2-256f19558f8ed5747c15c85f7e401835787504eb.tar.gz
homebridge-xiaomi-aircondition-ma2-256f19558f8ed5747c15c85f7e401835787504eb.zip
first commit
Diffstat (limited to 'src/platform.ts')
-rw-r--r--src/platform.ts64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/platform.ts b/src/platform.ts
new file mode 100644
index 0000000..1ea16fb
--- /dev/null
+++ b/src/platform.ts
@@ -0,0 +1,64 @@
+import type { API, DynamicPlatformPlugin, Logging, PlatformAccessory, PlatformConfig, Service, Characteristic } from 'homebridge';
+
+import miio from 'miio';
+
+import { Accessory } from './accessory.js';
+import { Device } from './device.js';
+import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js';
+
+export class Platform implements DynamicPlatformPlugin {
+ public readonly Service: typeof Service;
+ public readonly Characteristic: typeof Characteristic;
+
+ public readonly accessories: Map<string, PlatformAccessory> = new Map();
+ public readonly discoveredCacheUUIDs: string[] = [];
+
+ constructor(
+ public readonly log: Logging,
+ public readonly config: PlatformConfig,
+ public readonly api: API,
+ ) {
+ this.Service = api.hap.Service;
+ this.Characteristic = api.hap.Characteristic;
+
+ this.api.on('didFinishLaunching', () => {
+ this.discoverDevices();
+ });
+ }
+
+ configureAccessory(accessory: PlatformAccessory) {
+ this.log.info('Loading accessory from cache:', accessory.displayName);
+ this.accessories.set(accessory.UUID, accessory);
+ }
+
+ async discoverDevices() {
+ for (const config of this.config.devices) {
+ const connection = await miio.device({ address: config.address, token: config.token });
+ const device = new Device(connection);
+ const uuid = this.api.hap.uuid.generate(device.deviceId().toString(16));
+ const existingAccessory = this.accessories.get(uuid);
+
+ if (existingAccessory) {
+ this.log.info('Restoring existing accessory from cache:', existingAccessory.displayName);
+ existingAccessory.context.config = config;
+ this.api.updatePlatformAccessories([existingAccessory]);
+ new Accessory(this, existingAccessory, device);
+ } else {
+ this.log.info('Adding new accessory:', config.name);
+ const accessory = new this.api.platformAccessory(config.name, uuid);
+ accessory.context.config = config;
+ new Accessory(this, accessory, device);
+ this.api.registerPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [accessory]);
+ }
+
+ this.discoveredCacheUUIDs.push(uuid);
+ }
+
+ for (const [uuid, accessory] of this.accessories) {
+ if (! this.discoveredCacheUUIDs.includes(uuid)) {
+ this.log.info('Removing existing accessory from cache:', accessory.displayName);
+ this.api.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [accessory]);
+ }
+ }
+ }
+}