diff --git a/sdk/index.d.ts b/sdk/index.d.ts index 35ef32469..86786d800 100644 --- a/sdk/index.d.ts +++ b/sdk/index.d.ts @@ -1,6 +1,6 @@ export * from './types'; import type { ScryptedNativeId } from './types'; -import type { DeviceInformation, ScryptedInterface, ScryptedStatic, ScryptedDeviceType, Logger, ColorRgb, ColorHsv, DeviceState, TemperatureUnit, LockState, ThermostatMode, Position } from './types'; +import type { HumiditySettingStatus, DeviceInformation, ScryptedInterface, ScryptedStatic, ScryptedDeviceType, Logger, ColorRgb, ColorHsv, DeviceState, TemperatureUnit, LockState, ThermostatMode, Position, FanStatus } from './types'; export declare class ScryptedDeviceBase implements DeviceState { nativeId?: string; id?: string; @@ -38,6 +38,8 @@ export declare class ScryptedDeviceBase implements DeviceState { thermostatSetpoint?: number; thermostatSetpointHigh?: number; thermostatSetpointLow?: number; + humiditySetting?: HumiditySettingStatus; + fan?: FanStatus; lockState?: LockState; entryOpen?: boolean; batteryLevel?: number; diff --git a/sdk/index.ts b/sdk/index.ts index b71d74bf2..56a2de74c 100644 --- a/sdk/index.ts +++ b/sdk/index.ts @@ -1,7 +1,7 @@ export * from './types' import { ScryptedInterfaceProperty } from './types'; import type { ScryptedNativeId, DeviceManager, SystemManager, MediaManager, EndpointManager } from './types'; -import type { DeviceInformation, ScryptedInterface, ScryptedStatic, ScryptedDeviceType, Logger, ColorRgb, ColorHsv, DeviceState, TemperatureUnit, LockState, ThermostatMode, Position, ScryptedDevice } from './types'; +import type { HumiditySettingStatus, DeviceInformation, ScryptedInterface, ScryptedStatic, ScryptedDeviceType, Logger, ColorRgb, ColorHsv, DeviceState, TemperatureUnit, LockState, ThermostatMode, Position, FanStatus } from './types'; export class ScryptedDeviceBase implements DeviceState { id?: string; @@ -39,6 +39,8 @@ export class ScryptedDeviceBase implements DeviceState { thermostatSetpoint?: number; thermostatSetpointHigh?: number; thermostatSetpointLow?: number; + humiditySetting?: HumiditySettingStatus; + fan?: FanStatus; lockState?: LockState; entryOpen?: boolean; batteryLevel?: number; diff --git a/sdk/package-lock.json b/sdk/package-lock.json index d4db8ba5f..281e9d9c5 100644 --- a/sdk/package-lock.json +++ b/sdk/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/sdk", - "version": "0.0.93", + "version": "0.0.94", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/sdk", - "version": "0.0.93", + "version": "0.0.94", "license": "ISC", "dependencies": { "@babel/plugin-proposal-class-properties": "^7.14.5", diff --git a/sdk/package.json b/sdk/package.json index 62b5dd400..d4e7ae600 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/sdk", - "version": "0.0.93", + "version": "0.0.94", "description": "", "main": "index.js", "scripts": { diff --git a/sdk/types.d.ts b/sdk/types.d.ts index eed3832ae..84c905258 100644 --- a/sdk/types.d.ts +++ b/sdk/types.d.ts @@ -245,7 +245,7 @@ export interface Dock { /** * TemperatureSetting represents a thermostat device. */ -export interface TemperatureSetting extends Thermometer, HumiditySensor { +export interface TemperatureSetting { setThermostatMode(mode: ThermostatMode): Promise; setThermostatSetpoint(degrees: number): Promise; setThermostatSetpointHigh(high: number): Promise; @@ -257,6 +257,41 @@ export interface TemperatureSetting extends Thermometer, HumiditySensor { thermostatSetpointHigh?: number; thermostatSetpointLow?: number; } +export declare enum HumidityMode { + Off = "Off", + Humidify = "Humidify", + Dehumidify = "Dehumidify", + Auto = "Auto" +} +export interface HumidityCommand { + mode?: HumidityMode; + setpoint?: number; +} +export interface HumiditySettingStatus extends HumidityCommand { + activeMode?: HumidityMode; + availableModes?: HumidityMode[]; +} +export interface HumiditySetting { + humiditySetting: HumiditySettingStatus; + setHumidity(humidity: HumidityCommand): Promise; +} +export interface FanStatus { + speed?: number; + /** + * Available fan speed range in RPM. + */ + availableSpeeds: [number, number]; +} +export interface Fan { + /** + * RPM. Negative numbers are valid to indicate fan direction, + * if it rotates in both directions. + * A fan speed of zero indicates it is active, but currently off. + * A fan speed of null or undefined indicates the fan is off. + */ + fan?: FanStatus; + setFanSpeed(speed: number): Promise; +} export interface Thermometer { /** * Get the ambient temperature in Celsius. diff --git a/sdk/types.js b/sdk/types.js index e4b74bb2d..fcefecd08 100644 --- a/sdk/types.js +++ b/sdk/types.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.ScryptedInterfaceDescriptors = exports.SCRYPTED_MEDIA_SCHEME = exports.ScryptedMimeTypes = exports.ScryptedInterfaceProperty = exports.ScryptedInterface = exports.MediaPlayerState = exports.LockState = exports.ThermostatMode = exports.TemperatureUnit = exports.ScryptedDeviceType = void 0; +exports.ScryptedInterfaceDescriptors = exports.SCRYPTED_MEDIA_SCHEME = exports.ScryptedMimeTypes = exports.ScryptedInterfaceProperty = exports.ScryptedInterface = exports.MediaPlayerState = exports.LockState = exports.ThermostatMode = exports.TemperatureUnit = exports.HumidityMode = exports.ScryptedDeviceType = void 0; var ScryptedDeviceType; (function (ScryptedDeviceType) { ScryptedDeviceType["Builtin"] = "Builtin"; @@ -32,6 +32,13 @@ var ScryptedDeviceType; ScryptedDeviceType["Person"] = "Person"; ScryptedDeviceType["Unknown"] = "Unknown"; })(ScryptedDeviceType = exports.ScryptedDeviceType || (exports.ScryptedDeviceType = {})); +var HumidityMode; +(function (HumidityMode) { + HumidityMode["Off"] = "Off"; + HumidityMode["Humidify"] = "Humidify"; + HumidityMode["Dehumidify"] = "Dehumidify"; + HumidityMode["Auto"] = "Auto"; +})(HumidityMode = exports.HumidityMode || (exports.HumidityMode = {})); var TemperatureUnit; (function (TemperatureUnit) { TemperatureUnit["C"] = "C"; @@ -602,6 +609,24 @@ exports.ScryptedInterfaceDescriptors = { "getDetectionInput", "getObjectTypes", ] + }, + HumiditySetting: { + name: "HumiditySetting", + properties: [ + "humiditySetting", + ], + methods: [ + "setHumidity", + ] + }, + Fan: { + name: "Fan", + properties: [ + "fan", + ], + methods: [ + "setFanSpeed", + ], } }; //# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/sdk/types.ts b/sdk/types.ts index 6a7002238..1f57e8764 100644 --- a/sdk/types.ts +++ b/sdk/types.ts @@ -265,7 +265,7 @@ export interface Dock { /** * TemperatureSetting represents a thermostat device. */ -export interface TemperatureSetting extends Thermometer, HumiditySensor { +export interface TemperatureSetting { setThermostatMode(mode: ThermostatMode): Promise; setThermostatSetpoint(degrees: number): Promise; @@ -281,6 +281,41 @@ export interface TemperatureSetting extends Thermometer, HumiditySensor { thermostatSetpointHigh?: number; thermostatSetpointLow?: number; } +export enum HumidityMode { + Off = "Off", + Humidify = "Humidify", + Dehumidify = "Dehumidify", + Auto = "Auto", +} +export interface HumidityCommand { + mode?: HumidityMode; + setpoint?: number; +} +export interface HumiditySettingStatus extends HumidityCommand { + activeMode?: HumidityMode; + availableModes?: HumidityMode[]; +} +export interface HumiditySetting { + humiditySetting: HumiditySettingStatus; + setHumidity(humidity: HumidityCommand): Promise; +} +export interface FanStatus { + speed?: number; + /** + * Available fan speed range in RPM. + */ + availableSpeeds: [number, number]; +} +export interface Fan { + /** + * RPM. Negative numbers are valid to indicate fan direction, + * if it rotates in both directions. + * A fan speed of zero indicates it is active, but currently off. + * A fan speed of null or undefined indicates the fan is off. + */ + fan?: FanStatus; + setFanSpeed(speed: number): Promise; +} export interface Thermometer { /** * Get the ambient temperature in Celsius. @@ -1668,6 +1703,24 @@ export const ScryptedInterfaceDescriptors: { [scryptedInterface: string]: Scrypt "getDetectionInput", "getObjectTypes", ] + }, + HumiditySetting: { + name: "HumiditySetting", + properties: [ + "humiditySetting", + ], + methods: [ + "setHumidity", + ] + }, + Fan: { + name: "Fan", + properties: [ + "fan", + ], + methods: [ + "setFanSpeed", + ], } } as any; diff --git a/server/package-lock.json b/server/package-lock.json index 16bb8975a..0262167fe 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -1,16 +1,16 @@ { "name": "@scrypted/server", - "version": "0.0.54", + "version": "0.0.55", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/server", - "version": "0.0.54", + "version": "0.0.55", "license": "ISC", "dependencies": { "@mapbox/node-pre-gyp": "^1.0.5", - "@scrypted/sdk": "^0.0.93", + "@scrypted/sdk": "^0.0.94", "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.93", - "resolved": "https://registry.npmjs.org/@scrypted/sdk/-/sdk-0.0.93.tgz", - "integrity": "sha512-BP7QBrFOF3LViVn6KYEm6jHGmnlkUVEXxtCwhH2iHmUqUVQvuK2ZIJ2MIUAZ8ql6s+SnP0rd//8a2v6s2ujWMA==", + "version": "0.0.94", + "resolved": "https://registry.npmjs.org/@scrypted/sdk/-/sdk-0.0.94.tgz", + "integrity": "sha512-rLb/esVaQUbooyqzoOJBugMVagvlu6O4Q9QjTgjOV4rs1PImVtcth73rVY7bu0fg3kyb5zOg0yBoL9TB5UsZyg==", "dependencies": { "@babel/plugin-proposal-class-properties": "^7.14.5", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", @@ -645,8 +645,10 @@ "babel-loader": "^8.2.3", "babel-plugin-const-enum": "^1.1.0", "esbuild": "^0.13.8", + "ncp": "^2.0.0", "raw-loader": "^4.0.2", "rimraf": "^3.0.2", + "tmp": "^0.2.1", "ts-loader": "^9.2.6", "typescript-json-schema": "^0.50.1", "webpack": "^5.59.0" @@ -3227,6 +3229,14 @@ "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==" }, + "node_modules/ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "bin": { + "ncp": "bin/ncp" + } + }, "node_modules/negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -5081,9 +5091,9 @@ } }, "@scrypted/sdk": { - "version": "0.0.93", - "resolved": "https://registry.npmjs.org/@scrypted/sdk/-/sdk-0.0.93.tgz", - "integrity": "sha512-BP7QBrFOF3LViVn6KYEm6jHGmnlkUVEXxtCwhH2iHmUqUVQvuK2ZIJ2MIUAZ8ql6s+SnP0rd//8a2v6s2ujWMA==", + "version": "0.0.94", + "resolved": "https://registry.npmjs.org/@scrypted/sdk/-/sdk-0.0.94.tgz", + "integrity": "sha512-rLb/esVaQUbooyqzoOJBugMVagvlu6O4Q9QjTgjOV4rs1PImVtcth73rVY7bu0fg3kyb5zOg0yBoL9TB5UsZyg==", "requires": { "@babel/plugin-proposal-class-properties": "^7.14.5", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", @@ -5098,8 +5108,10 @@ "babel-loader": "^8.2.3", "babel-plugin-const-enum": "^1.1.0", "esbuild": "^0.13.8", + "ncp": "^2.0.0", "raw-loader": "^4.0.2", "rimraf": "^3.0.2", + "tmp": "^0.2.1", "ts-loader": "^9.2.6", "typescript-json-schema": "^0.50.1", "webpack": "^5.59.0" @@ -7085,6 +7097,11 @@ "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==" }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=" + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", diff --git a/server/package.json b/server/package.json index 75b5396ce..ecee28b23 100644 --- a/server/package.json +++ b/server/package.json @@ -1,10 +1,10 @@ { "name": "@scrypted/server", - "version": "0.0.54", + "version": "0.0.55", "description": "", "dependencies": { "@mapbox/node-pre-gyp": "^1.0.5", - "@scrypted/sdk": "^0.0.93", + "@scrypted/sdk": "^0.0.94", "adm-zip": "^0.5.3", "axios": "^0.21.1", "body-parser": "^1.19.0", diff --git a/server/src/runtime.ts b/server/src/runtime.ts index e60ecfb79..9225e1cf2 100644 --- a/server/src/runtime.ts +++ b/server/src/runtime.ts @@ -601,7 +601,7 @@ export class ScryptedRuntime { await this.datastore.remove(device); if (providerId == null || providerId === device._id) { const plugin = await this.datastore.tryGet(Plugin, device.pluginId); - await this.killPlugin(plugin); + this.killPlugin(plugin); await this.datastore.remove(plugin); } this.stateManager.removeDevice(device._id); @@ -665,7 +665,6 @@ export class ScryptedRuntime { this.stateManager.setPluginDeviceState(pluginDevice, ScryptedInterfaceProperty.providedRoom, providedRoom); if (isUsingDefaultRoom) this.stateManager.setPluginDeviceState(pluginDevice, ScryptedInterfaceProperty.room, getProvidedRoomOrDefault(pluginDevice)); - // pluginDevice.state.model = device.model; const ret = this.notifyPluginDeviceDescriptorChanged(pluginDevice);