diff --git a/plugins/homekit/package-lock.json b/plugins/homekit/package-lock.json index e9d3ab4cd..fa7786caf 100644 --- a/plugins/homekit/package-lock.json +++ b/plugins/homekit/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/homekit", - "version": "0.0.118", + "version": "0.0.119", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/homekit", - "version": "0.0.118", + "version": "0.0.119", "dependencies": { "hap-nodejs": "file:../../external/HAP-NodeJS", "lodash": "^4.17.21", diff --git a/plugins/homekit/package.json b/plugins/homekit/package.json index 0425e8909..23fa8a8ff 100644 --- a/plugins/homekit/package.json +++ b/plugins/homekit/package.json @@ -40,5 +40,5 @@ "@types/qrcode": "^1.4.1", "@types/url-parse": "^1.4.3" }, - "version": "0.0.118" + "version": "0.0.119" } diff --git a/plugins/homekit/src/types/thermostat.ts b/plugins/homekit/src/types/thermostat.ts index bbd121ebd..0604b9de7 100644 --- a/plugins/homekit/src/types/thermostat.ts +++ b/plugins/homekit/src/types/thermostat.ts @@ -1,5 +1,6 @@ -import { Fan, FanMode, HumiditySensor, HumiditySetting, OnOff, ScryptedDevice, ScryptedDeviceType, ScryptedInterface, TemperatureSetting, TemperatureUnit, Thermometer, ThermostatMode } from '@scrypted/sdk' +import { Fan, FanMode, HumidityMode, HumiditySensor, HumiditySetting, OnOff, ScryptedDevice, ScryptedDeviceType, ScryptedInterface, TemperatureSetting, TemperatureUnit, Thermometer, ThermostatMode } from '@scrypted/sdk' +import { access } from 'fs'; import { Accessory } from 'hap-nodejs'; import { ROTATION_DIRECTION_CTYPE } from 'hap-nodejs/src/accessories/types'; import { addSupportedType, bindCharacteristic, DummyDevice } from '../common' @@ -95,6 +96,48 @@ addSupportedType({ () => device.humidity || 0); } + if (device.interfaces.includes(ScryptedInterface.HumiditySetting) && device.interfaces.includes(ScryptedInterface.HumiditySensor)) { + const humidityService = accessory.addService(Service.HumidifierDehumidifier); + + bindCharacteristic(device, ScryptedInterface.HumiditySensor, humidityService, Characteristic.Active, + () => !!device.humiditySetting?.activeMode); + humidityService.getCharacteristic(Characteristic.Active).on(CharacteristicEventTypes.SET, (value, callback) => { + callback(); + device.setHumidity({ + mode: value ? HumidityMode.Auto : HumidityMode.Off + }); + }); + + bindCharacteristic(device, ScryptedInterface.HumiditySensor, humidityService, Characteristic.CurrentRelativeHumidity, + () => device.humidity || 0); + + bindCharacteristic(device, ScryptedInterface.HumiditySensor, humidityService, Characteristic.CurrentHumidifierDehumidifierState, + () => !device.humiditySetting?.activeMode || device.humiditySetting?.activeMode === HumidityMode.Off + ? Characteristic.CurrentHumidifierDehumidifierState.INACTIVE + : device.humiditySetting.activeMode === HumidityMode.Dehumidify + ? Characteristic.CurrentHumidifierDehumidifierState.DEHUMIDIFYING + : device.humiditySetting.activeMode === HumidityMode.Humidify + ? Characteristic.CurrentHumidifierDehumidifierState.HUMIDIFYING + : Characteristic.CurrentHumidifierDehumidifierState.IDLE); + + bindCharacteristic(device, ScryptedInterface.HumiditySensor, humidityService, Characteristic.TargetHumidifierDehumidifierState, + () => !device.humiditySetting?.mode || device.humiditySetting?.mode === HumidityMode.Auto + ? Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER_OR_DEHUMIDIFIER + : device.humiditySetting?.mode === HumidityMode.Dehumidify + ? Characteristic.TargetHumidifierDehumidifierState.DEHUMIDIFIER + : Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER); + humidityService.getCharacteristic(Characteristic.TargetHumidifierDehumidifierState).on(CharacteristicEventTypes.SET, (value, callback) => { + callback(); + device.setHumidity({ + mode: value === Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER + ? HumidityMode.Humidify + : value === Characteristic.TargetHumidifierDehumidifierState.DEHUMIDIFIER + ? HumidityMode.Dehumidify + : HumidityMode.Auto + }); + }); + } + if (device.interfaces.includes(ScryptedInterface.Fan)) { const fanService = accessory.addService(Service.Fanv2); diff --git a/sdk/package-lock.json b/sdk/package-lock.json index 10aaa65b3..fb50cf42c 100644 --- a/sdk/package-lock.json +++ b/sdk/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/sdk", - "version": "0.0.102", + "version": "0.0.103", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/sdk", - "version": "0.0.102", + "version": "0.0.103", "license": "ISC", "dependencies": { "@babel/plugin-proposal-class-properties": "^7.14.5", diff --git a/sdk/package.json b/sdk/package.json index 65f9c694d..0210de1d6 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/sdk", - "version": "0.0.102", + "version": "0.0.103", "description": "", "main": "index.js", "scripts": { diff --git a/sdk/types.ts b/sdk/types.ts index 9c2805d14..7fea4469d 100644 --- a/sdk/types.ts +++ b/sdk/types.ts @@ -282,19 +282,19 @@ export interface TemperatureSetting { thermostatSetpointLow?: number; } export enum HumidityMode { - Off = "Off", Humidify = "Humidify", Dehumidify = "Dehumidify", Auto = "Auto", + Off = "Off", } export interface HumidityCommand { - mode: HumidityMode; - setpoint: number; + mode?: HumidityMode; + setpoint?: number; } export interface HumiditySettingStatus { mode: HumidityMode; setpoint: number; - activeMode: HumidityMode; + activeMode?: HumidityMode; availableModes: HumidityMode[]; } export interface HumiditySetting { diff --git a/server/package-lock.json b/server/package-lock.json index 79d880518..a3809a4ba 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -10,7 +10,7 @@ "license": "ISC", "dependencies": { "@mapbox/node-pre-gyp": "^1.0.5", - "@scrypted/sdk": "^0.0.102", + "@scrypted/sdk": "^0.0.103", "adm-zip": "^0.5.3", "axios": "^0.21.1", "body-parser": "^1.19.0", @@ -628,9 +628,9 @@ } }, "node_modules/@scrypted/sdk": { - "version": "0.0.102", - "resolved": "https://registry.npmjs.org/@scrypted/sdk/-/sdk-0.0.102.tgz", - "integrity": "sha512-TD8OJuAS0d8U9F/g+kKA+pK6tEaOrCeQszooU/rYaqQe1o+IwlRfd775ZmS5Kh8dy3+ohH/jTwXf5tByupZzUA==", + "version": "0.0.103", + "resolved": "https://registry.npmjs.org/@scrypted/sdk/-/sdk-0.0.103.tgz", + "integrity": "sha512-vmf8CivSglzXRgm5zwc753qbGZPX61b/Dop5WFWl8Te3D/C0vNWPIIfAp+q1WhiBikryzHYNJOHcbIkA0zgxUA==", "dependencies": { "@babel/plugin-proposal-class-properties": "^7.14.5", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", @@ -5091,9 +5091,9 @@ } }, "@scrypted/sdk": { - "version": "0.0.102", - "resolved": "https://registry.npmjs.org/@scrypted/sdk/-/sdk-0.0.102.tgz", - "integrity": "sha512-TD8OJuAS0d8U9F/g+kKA+pK6tEaOrCeQszooU/rYaqQe1o+IwlRfd775ZmS5Kh8dy3+ohH/jTwXf5tByupZzUA==", + "version": "0.0.103", + "resolved": "https://registry.npmjs.org/@scrypted/sdk/-/sdk-0.0.103.tgz", + "integrity": "sha512-vmf8CivSglzXRgm5zwc753qbGZPX61b/Dop5WFWl8Te3D/C0vNWPIIfAp+q1WhiBikryzHYNJOHcbIkA0zgxUA==", "requires": { "@babel/plugin-proposal-class-properties": "^7.14.5", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", diff --git a/server/package.json b/server/package.json index 7b7154082..d14f0766f 100644 --- a/server/package.json +++ b/server/package.json @@ -4,7 +4,7 @@ "description": "", "dependencies": { "@mapbox/node-pre-gyp": "^1.0.5", - "@scrypted/sdk": "^0.0.102", + "@scrypted/sdk": "^0.0.103", "adm-zip": "^0.5.3", "axios": "^0.21.1", "body-parser": "^1.19.0",