tsvesync
Version:
A TypeScript library for interacting with VeSync smart home devices
175 lines (174 loc) • 6.38 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.VeSyncWarmHumidifier = void 0;
const humidifier_1 = require("./humidifier");
const helpers_1 = require("../helpers");
const logger_1 = require("../logger");
/**
* VeSync Warm Humidifier Class
*/
class VeSyncWarmHumidifier extends humidifier_1.VeSyncHumidifier {
constructor(details, manager) {
super(details, manager);
this.warmLevels = [1, 2, 3];
logger_1.logger.debug(`Initialized VeSyncWarmHumidifier device: ${this.deviceName}`);
}
/**
* Get device details
*/
async getDetails() {
const success = await super.getDetails();
if (success && this.details) {
// Add warm humidifier specific fields
this.details = {
...this.details,
warm_enabled: Boolean(this.details.warm_level && this.details.warm_level > 0),
drying_mode_enabled: this.details.autoDryingSwitch === 1,
drying_mode_state: this.details.dryingMode || '',
drying_mode_level: this.details.dryingLevel || 0,
drying_mode_seconds_remaining: this.details.dryingRemainTime || 0
};
}
return success;
}
/**
* Change fan speed - Implemented to satisfy interface but redirects to setMistLevel
*/
async changeFanSpeed(speed) {
logger_1.logger.debug(`Redirecting fan speed change to mist level for device: ${this.deviceName}`);
return this.setMistLevel(speed);
}
/**
* Set device mode
*/
async setMode(mode) {
if (!this.modes.includes(mode)) {
const error = `Invalid mode: ${mode}. Must be one of: ${this.modes.join(', ')}`;
logger_1.logger.error(`${error} for device: ${this.deviceName}`);
throw new Error(error);
}
logger_1.logger.debug(`Setting mode to ${mode} for device: ${this.deviceName}`);
const [response, status] = await this.callApi('/cloud/v2/deviceManaged/bypassV2', 'post', {
...helpers_1.Helpers.reqBody(this.manager, 'bypassV2'),
cid: this.cid,
configModule: this.configModule,
payload: {
data: {
mode
},
method: 'setHumidityMode',
source: 'APP'
}
}, helpers_1.Helpers.reqHeaderBypass());
const success = this.checkResponse([response, status], 'setMode');
if (success) {
this.details.mode = mode;
}
else {
logger_1.logger.error(`Failed to set mode to ${mode} for device: ${this.deviceName}`);
}
return success;
}
/**
* Set warm mist level
*/
async setWarmLevel(level) {
if (!this.hasFeature('warm')) {
const error = 'Warm mist control not supported';
logger_1.logger.error(`${error} for device: ${this.deviceName}`);
throw new Error(error);
}
if (!this.warmLevels.includes(level)) {
const error = `Invalid warm level: ${level}. Must be one of: ${this.warmLevels.join(', ')}`;
logger_1.logger.error(`${error} for device: ${this.deviceName}`);
throw new Error(error);
}
logger_1.logger.debug(`Setting warm level to ${level} for device: ${this.deviceName}`);
const [response, status] = await this.callApi('/cloud/v2/deviceManaged/bypassV2', 'post', {
...helpers_1.Helpers.reqBody(this.manager, 'bypassV2'),
cid: this.cid,
configModule: this.configModule,
payload: {
data: {
id: 0,
level: level,
type: 'warm'
},
method: 'setLevel',
source: 'APP'
}
}, helpers_1.Helpers.reqHeaderBypass());
const success = this.checkResponse([response, status], 'setWarmLevel');
if (success) {
this.details.warm_level = level;
this.details.warm_enabled = level > 0;
}
else {
logger_1.logger.error(`Failed to set warm level to ${level} for device: ${this.deviceName}`);
}
return success;
}
/**
* Set drying mode enabled
*/
async setDryingModeEnabled(enabled) {
if (!this.hasFeature('drying')) {
const error = 'Drying mode not supported';
logger_1.logger.error(`${error} for device: ${this.deviceName}`);
throw new Error(error);
}
logger_1.logger.debug(`Setting drying mode to ${enabled} for device: ${this.deviceName}`);
const [response, status] = await this.callApi('/cloud/v2/deviceManaged/bypassV2', 'post', {
...helpers_1.Helpers.reqBody(this.manager, 'bypassV2'),
cid: this.cid,
configModule: this.configModule,
payload: {
data: {
autoDryingSwitch: enabled ? 1 : 0
},
method: 'setDryingMode',
source: 'APP'
}
}, helpers_1.Helpers.reqHeaderBypass());
const success = this.checkResponse([response, status], 'setDryingModeEnabled');
if (success) {
this.details.drying_mode_enabled = enabled;
this.details.autoDryingSwitch = enabled ? 1 : 0;
}
else {
logger_1.logger.error(`Failed to set drying mode to ${enabled} for device: ${this.deviceName}`);
}
return success;
}
/**
* Get warm mist enabled status
*/
get warmMistEnabled() {
return this.details.warm_enabled || false;
}
/**
* Get drying mode enabled status
*/
get dryingModeEnabled() {
return this.details.drying_mode_enabled || false;
}
/**
* Get drying mode state
*/
get dryingModeState() {
return this.details.drying_mode_state || '';
}
/**
* Get drying mode level
*/
get dryingModeLevel() {
return this.details.drying_mode_level || 0;
}
/**
* Get drying mode seconds remaining
*/
get dryingModeSecondsRemaining() {
return this.details.drying_mode_seconds_remaining || 0;
}
}
exports.VeSyncWarmHumidifier = VeSyncWarmHumidifier;