UNPKG

@homebridge-plugins/homebridge-smarthq

Version:

The SmartHQ plugin allows you to interact with SmartHQ Devices in HomeKit and with Siri.

184 lines 8.92 kB
import axios from 'axios'; import { interval, skipWhile } from 'rxjs'; import { ERD_TYPES } from '../settings.js'; import { deviceBase } from './device.js'; export class SmartHQRefrigerator extends deviceBase { platform; device; // Updates SensorUpdateInProgress; deviceStatus; constructor(platform, accessory, device) { super(platform, accessory, device); this.platform = platform; this.device = device; this.debugLog(`Refrigerator Features: ${JSON.stringify(accessory.context.device.features)}`); // Refrigerator Door Sensor const doorSensorService = this.accessory.getService('Refrigerator Door') ?? this.accessory.addService(this.platform.Service.ContactSensor, 'Refrigerator Door', 'RefrigeratorDoor'); doorSensorService.setCharacteristic(this.platform.Characteristic.Name, 'Refrigerator Door'); doorSensorService .getCharacteristic(this.platform.Characteristic.ContactSensorState) .onGet(async () => { try { const r = await this.readErd(ERD_TYPES.DOOR_STATUS); return Number.parseInt(r) !== 0; } catch (error) { this.warnLog?.(`Refrigerator Door Sensor readErd error: ${error?.message ?? error}`); return false; } }); // Fridge Temperature Sensor const fridgeTempService = this.accessory.getService('Fridge Temperature') ?? this.accessory.addService(this.platform.Service.TemperatureSensor, 'Fridge Temperature', 'FridgeTemp'); fridgeTempService.setCharacteristic(this.platform.Characteristic.Name, 'Fridge Temperature'); fridgeTempService .getCharacteristic(this.platform.Characteristic.CurrentTemperature) .onGet(async () => { try { const r = await this.readErd(ERD_TYPES.CURRENT_TEMPERATURE); // CURRENT_TEMPERATURE returns a byte array: byte 0 = fridge temp (°F), byte 1 = freezer temp (°F) // Need to convert from hex string to get first byte const bytes = r.match(/.{1,2}/g) || []; const fridgeTemp = bytes[0] ? Number.parseInt(bytes[0], 16) : 0; // Convert Fahrenheit to Celsius for HomeKit return (fridgeTemp - 32) * 5 / 9; } catch (error) { this.warnLog?.(`Fridge Temperature readErd error: ${error?.message ?? error}`); return 0; } }); // Freezer Temperature Sensor const freezerTempService = this.accessory.getService('Freezer Temperature') ?? this.accessory.addService(this.platform.Service.TemperatureSensor, 'Freezer Temperature', 'FreezerTemp'); freezerTempService.setCharacteristic(this.platform.Characteristic.Name, 'Freezer Temperature'); freezerTempService .getCharacteristic(this.platform.Characteristic.CurrentTemperature) .onGet(async () => { try { const r = await this.readErd(ERD_TYPES.CURRENT_TEMPERATURE); // CURRENT_TEMPERATURE returns a byte array: byte 0 = fridge temp (°F), byte 1 = freezer temp (°F) const bytes = r.match(/.{1,2}/g) || []; const freezerTemp = bytes[1] ? Number.parseInt(bytes[1], 16) : 0; // Convert Fahrenheit to Celsius for HomeKit return (freezerTemp - 32) * 5 / 9; } catch (error) { this.warnLog?.(`Freezer Temperature readErd error: ${error?.message ?? error}`); return 0; } }); // Air Filter Status const filterService = this.accessory.getService('Air Filter') ?? this.accessory.addService(this.platform.Service.FilterMaintenance, 'Air Filter', 'AirFilter'); filterService.setCharacteristic(this.platform.Characteristic.Name, 'Air Filter'); filterService .getCharacteristic(this.platform.Characteristic.FilterChangeIndication) .onGet(async () => { try { const r = await this.readErd(ERD_TYPES.AIR_FILTER_STATUS); return Number.parseInt(r) === 1 ? this.platform.Characteristic.FilterChangeIndication.CHANGE_FILTER : this.platform.Characteristic.FilterChangeIndication.FILTER_OK; } catch (error) { this.warnLog?.(`Air Filter Status readErd error: ${error?.message ?? error}`); return this.platform.Characteristic.FilterChangeIndication.FILTER_OK; } }); // Ice Maker Control (Switch) const iceMakerService = this.accessory.getService('Ice Maker') ?? this.accessory.addService(this.platform.Service.Switch, 'Ice Maker', 'IceMaker'); iceMakerService.setCharacteristic(this.platform.Characteristic.Name, 'Ice Maker'); iceMakerService .getCharacteristic(this.platform.Characteristic.On) .onGet(async () => { try { const r = await this.readErd(ERD_TYPES.ICE_MAKER_CONTROL); return Number.parseInt(r) !== 0; } catch (error) { this.warnLog?.(`Ice Maker Control readErd error: ${error?.message ?? error}`); return false; } }) .onSet(async (value) => { try { await this.writeErd(ERD_TYPES.ICE_MAKER_CONTROL, value); } catch (error) { this.warnLog?.(`Ice Maker Control writeErd error: ${error?.message ?? error}`); } }); // Turbo Cool Switch const turboCoolService = this.accessory.getService('Turbo Cool') ?? this.accessory.addService(this.platform.Service.Switch, 'Turbo Cool', 'TurboCool'); turboCoolService.setCharacteristic(this.platform.Characteristic.Name, 'Turbo Cool'); turboCoolService .getCharacteristic(this.platform.Characteristic.On) .onGet(async () => { try { const r = await this.readErd(ERD_TYPES.TURBO_COOL_STATUS); return Number.parseInt(r) !== 0; } catch (error) { this.warnLog?.(`Turbo Cool Status readErd error: ${error?.message ?? error}`); return false; } }) .onSet(async (value) => { try { await this.writeErd(ERD_TYPES.TURBO_COOL_STATUS, value); } catch (error) { this.warnLog?.(`Turbo Cool Status writeErd error: ${error?.message ?? error}`); } }); // Turbo Freeze Switch const turboFreezeService = this.accessory.getService('Turbo Freeze') ?? this.accessory.addService(this.platform.Service.Switch, 'Turbo Freeze', 'TurboFreeze'); turboFreezeService.setCharacteristic(this.platform.Characteristic.Name, 'Turbo Freeze'); turboFreezeService .getCharacteristic(this.platform.Characteristic.On) .onGet(async () => { try { const r = await this.readErd(ERD_TYPES.TURBO_FREEZE_STATUS); return Number.parseInt(r) !== 0; } catch (error) { this.warnLog?.(`Turbo Freeze Status readErd error: ${error?.message ?? error}`); return false; } }) .onSet(async (value) => { try { await this.writeErd(ERD_TYPES.TURBO_FREEZE_STATUS, value); } catch (error) { this.warnLog?.(`Turbo Freeze Status writeErd error: ${error?.message ?? error}`); } }); // this is subject we use to track when we need to POST changes to the SmartHQ API this.SensorUpdateInProgress = false; // Retrieve initial values and updateHomekit // this.refreshStatus() // Start an update interval interval(this.deviceRefreshRate * 10000) .pipe(skipWhile(() => this.SensorUpdateInProgress)) .subscribe(async () => { // await this.refreshStatus() }); } async readErd(erd) { const d = await axios .get(`/appliance/${this.accessory.context.device.applianceId}/erd/${erd}`); return String(d.data.value); } async writeErd(erd, value) { await axios .post(`/appliance/${this.accessory.context.device.applianceId}/erd/${erd}`, { kind: 'appliance#erdListEntry', userId: this.accessory.context.userId, applianceId: this.accessory.context.device.applianceId, erd, value: typeof value === 'boolean' ? (value ? '01' : '00') : value, }); return undefined; } } //# sourceMappingURL=refrigerator.js.map