tsvesync
Version:
A TypeScript library for interacting with VeSync smart home devices
284 lines (254 loc) • 9.03 kB
text/typescript
/**
* VeSync Bulb Implementations
*/
import { VeSyncBulb, bulbConfig } from './vesyncBulb';
import { VeSync } from './vesync';
import { Helpers } from './helpers';
import { logger } from './logger';
/**
* ESL100 Bulb Implementation
*/
export class VeSyncBulbESL100 extends VeSyncBulb {
constructor(details: Record<string, any>, manager: VeSync) {
super(details, manager);
}
async setColorTemp(colorTemp: number): Promise<boolean> {
logger.error(`[${this.deviceName}] Color temperature control not supported`);
return false;
}
}
/**
* ESL100CW Bulb Implementation
*/
export class VeSyncBulbESL100CW extends VeSyncBulb {
constructor(details: Record<string, any>, manager: VeSync) {
super(details, manager);
}
async setColorTemp(colorTemp: number): Promise<boolean> {
if (!this.features.includes('color_temp')) {
logger.error(`[${this.deviceName}] Color temperature control not supported`);
return false;
}
logger.debug(`[${this.deviceName}] Setting color temperature to ${colorTemp}`);
const body = {
...Helpers.reqBody(this.manager, 'bypass'),
cid: this.cid,
configModule: this.configModule,
jsonCmd: {
light: {
colorTempe: colorTemp
}
}
};
const [response] = await this.callApi(
'/cloud/v1/deviceManaged/bypass',
'post',
body,
Helpers.reqHeaders(this.manager)
);
if (response?.code === 0) {
this.colorTemp = colorTemp;
logger.info(`[${this.deviceName}] Successfully set color temperature to ${colorTemp}`);
return true;
}
logger.error(`[${this.deviceName}] Failed to set color temperature: ${JSON.stringify(response)}`);
return false;
}
}
/**
* XYD0001 Bulb Implementation
*/
export class VeSyncBulbXYD0001 extends VeSyncBulb {
constructor(details: Record<string, any>, manager: VeSync) {
super(details, manager);
}
async setColorTemp(colorTemp: number): Promise<boolean> {
if (!this.features.includes('color_temp')) {
logger.error(`[${this.deviceName}] Color temperature control not supported`);
return false;
}
logger.debug(`[${this.deviceName}] Setting color temperature to ${colorTemp}`);
const body = {
...Helpers.reqBody(this.manager, 'bypassV2'),
cid: this.cid,
configModule: this.configModule,
payload: {
data: {
brightness: '',
colorMode: 'white',
colorTemp: colorTemp,
force: 1,
hue: '',
saturation: '',
value: ''
},
method: 'setLightStatusV2',
source: 'APP'
}
};
const [response] = await this.callApi(
'/cloud/v2/deviceManaged/bypassV2',
'post',
body,
Helpers.reqHeaders(this.manager)
);
if (response?.code === 0) {
this.colorTemp = colorTemp;
logger.info(`[${this.deviceName}] Successfully set color temperature to ${colorTemp}`);
return true;
}
logger.error(`[${this.deviceName}] Failed to set color temperature: ${JSON.stringify(response)}`);
return false;
}
async setHsv(hue: number, saturation: number, value: number): Promise<boolean> {
if (!this.features.includes('rgb_shift')) {
logger.error(`[${this.deviceName}] Color control not supported`);
return false;
}
logger.debug(`[${this.deviceName}] Setting HSV color to H:${hue} S:${saturation} V:${value}`);
const body = {
...Helpers.reqBody(this.manager, 'bypassV2'),
cid: this.cid,
configModule: this.configModule,
payload: {
data: {
brightness: value,
colorMode: 'hsv',
colorTemp: '',
force: 1,
hue: hue,
saturation: saturation,
value: value
},
method: 'setLightStatusV2',
source: 'APP'
}
};
const [response] = await this.callApi(
'/cloud/v2/deviceManaged/bypassV2',
'post',
body,
Helpers.reqHeaders(this.manager)
);
if (response?.code === 0) {
this.colorHue = hue;
this.colorSaturation = saturation;
this.colorValue = value;
logger.info(`[${this.deviceName}] Successfully set HSV color`);
return true;
}
logger.error(`[${this.deviceName}] Failed to set HSV color: ${JSON.stringify(response)}`);
return false;
}
async enableWhiteMode(): Promise<boolean> {
logger.debug(`[${this.deviceName}] Enabling white mode`);
const body = {
...Helpers.reqBody(this.manager, 'bypassV2'),
cid: this.cid,
configModule: this.configModule,
payload: {
data: {
brightness: '',
colorMode: 'white',
colorTemp: '',
force: 1,
red: '',
green: '',
blue: ''
},
method: 'setLightStatusV2',
source: 'APP'
}
};
const [response] = await this.callApi(
'/cloud/v2/deviceManaged/bypassV2',
'post',
body,
Helpers.reqHeaders(this.manager)
);
if (response?.code === 0) {
this.colorMode = 'white';
logger.info(`[${this.deviceName}] Successfully enabled white mode`);
return true;
}
logger.error(`[${this.deviceName}] Failed to enable white mode: ${JSON.stringify(response)}`);
return false;
}
}
/**
* ESL100MC Bulb Implementation
*/
export class VeSyncBulbESL100MC extends VeSyncBulb {
constructor(details: Record<string, any>, manager: VeSync) {
super(details, manager);
}
async setColorTemp(colorTemp: number): Promise<boolean> {
logger.error(`[${this.deviceName}] Color temperature control not supported`);
return false;
}
async setRgb(red: number, green: number, blue: number): Promise<boolean> {
if (!this.features.includes('rgb_shift')) {
logger.error(`[${this.deviceName}] Color control not supported`);
return false;
}
logger.debug(`[${this.deviceName}] Setting RGB color to R:${red} G:${green} B:${blue}`);
const body = {
...Helpers.reqBody(this.manager, 'bypass'),
cid: this.cid,
configModule: this.configModule,
jsonCmd: {
light: {
red: Math.round(red),
green: Math.round(green),
blue: Math.round(blue)
}
}
};
const [response] = await this.callApi(
'/cloud/v1/deviceManaged/bypass',
'post',
body,
Helpers.reqHeaders(this.manager)
);
if (response?.code === 0) {
this.rgbValues = { red, green, blue };
logger.info(`[${this.deviceName}] Successfully set RGB color`);
return true;
}
logger.error(`[${this.deviceName}] Failed to set RGB color: ${JSON.stringify(response)}`);
return false;
}
async enableWhiteMode(): Promise<boolean> {
logger.debug(`[${this.deviceName}] Enabling white mode`);
const body = {
...Helpers.reqBody(this.manager, 'bypass'),
cid: this.cid,
configModule: this.configModule,
jsonCmd: {
light: {
mode: 'white'
}
}
};
const [response] = await this.callApi(
'/cloud/v1/deviceManaged/bypass',
'post',
body,
Helpers.reqHeaders(this.manager)
);
if (response?.code === 0) {
this.colorMode = 'white';
logger.info(`[${this.deviceName}] Successfully enabled white mode`);
return true;
}
logger.error(`[${this.deviceName}] Failed to enable white mode: ${JSON.stringify(response)}`);
return false;
}
}
// Export the bulb modules dictionary
export const bulbModules: Record<string, new (details: Record<string, any>, manager: VeSync) => VeSyncBulb> = {
'ESL100': VeSyncBulbESL100,
'ESL100CW': VeSyncBulbESL100CW,
'XYD0001': VeSyncBulbXYD0001,
'ESL100MC': VeSyncBulbESL100MC
};