UNPKG

@constructorfleet/ultimate-govee

Version:

Library for interacting with Govee devices written in Typescript.

175 lines 7.08 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; var OpenAPIService_1; Object.defineProperty(exports, "__esModule", { value: true }); exports.OpenAPIService = void 0; const common_1 = require("@nestjs/common"); const uuid_1 = require("uuid"); const _ultimate_govee_common_1 = require("../../common"); const utils_1 = require("../utils"); const device_list_response_1 = require("./models/device-list.response"); const device_scenes_response_1 = require("./models/device-scenes.response"); const device_state_response_1 = require("./models/device-state.response"); const openapi_models_1 = require("./openapi.models"); const openapi_providers_1 = require("./openapi.providers"); const class_transformer_1 = require("class-transformer"); let OpenAPIService = OpenAPIService_1 = class OpenAPIService { static findState(capabilities, capabilityInstance, stateName) { return capabilities .find((cap) => cap.instance === capabilityInstance) ?.state?.find((s) => s.name === stateName)?.value; } static deserializeMqttMessage(payload) { return (0, class_transformer_1.plainToInstance)(openapi_models_1.OpenAPIMqttPacket, payload); } static parseMqttMessage(message) { const lackWater = OpenAPIService_1.findState(message.capabilities, 'lackWaterEvent', 'Lack'); const presence = OpenAPIService_1.findState(message.capabilities, 'bodyAppearedEvent', 'Presence'); const absence = OpenAPIService_1.findState(message.capabilities, 'bodyAppearedEvent', 'Absence'); // const motion = OpenAPIService.findState<number>(message.capabilities, 'bodyAppearedEvent', 'Presence'); const result = { id: message.deviceId, model: message.model, pactCode: 0, pactType: 0, cmd: 'status', state: { waterShortage: lackWater !== undefined ? lackWater === 1 : undefined, presence: presence !== undefined ? true : absence !== undefined ? false : undefined, }, }; return result; } constructor(config, mqtt) { this.config = config; this.mqtt = mqtt; this.logger = new common_1.Logger(OpenAPIService_1.name); } async handle(message, topic) { if (this.messageCallback === undefined) { return; } this.logger.verbose(`Received MQTT message on topic ${topic}`); await this.messageCallback(OpenAPIService_1.parseMqttMessage(message)); } setApiKey(apiKey) { this.apiKey = apiKey; } setMqttCallback(callback) { this.messageCallback = callback; } async sendMessage(topic, message) { await this.mqtt.publish(topic, message); } request(url, headers = {}, payload = undefined) { if (!this.apiKey) { return; } return (0, utils_1.request)(url, { ...headers, ...(0, utils_1.goveeAPIKeyHeaders)(this.apiKey) }, payload); } async connect() { if (!this.apiKey) { return; } await this.mqtt.connect({ username: this.apiKey, password: this.apiKey, clientId: this.apiKey, }, this); } async disconnect() { if (!this.mqtt) { return; } await this.mqtt.disconnect(); } async getDevices() { try { const response = await this.request(this.config.deviceListUrl)?.get(device_list_response_1.OpenAPIDeviceListResponse); if (!response?.data) { return []; } return response.data.devices; } catch (error) { throw new Error('Unable to retreive devices from OpenAPI'); } } async getDevice(deviceId, model, commandId = (0, uuid_1.v4)()) { try { const response = await this.request(this.config.deviceStateUrl, {}, { requestId: commandId, payload: { sku: model, device: deviceId, }, })?.post(device_state_response_1.OpenAPIDeviceStateResponse); if (!response?.data) { return undefined; } return response.data.device; } catch (error) { // this.logger.error(`Unable to retrieve device from OpenAPI: ${error}`); throw new Error('Unable to retreive device from OpenAPI'); } } async getScenes(deviceId, model) { try { const response = await this.request(this.config.deviceLightScenesUrl, {}, { requestId: (0, uuid_1.v4)(), payload: { sku: model, device: deviceId, }, })?.post(device_scenes_response_1.OpenAPIDeviceScenesResponse); if (!response?.data) { return undefined; } return response.data.payload; } catch (error) { throw new Error('Unable to retreive scenes from OpenAPI'); } } async getDIYScenes(deviceId, model) { try { const response = await this.request(this.config.deviceDIYScenesUrl, {}, { requestId: (0, uuid_1.v4)(), payload: { sku: model, device: deviceId, }, })?.post(device_scenes_response_1.OpenAPIDeviceScenesResponse); if (!response?.data) { return undefined; } return response.data.payload; } catch (error) { throw new Error('Unable to retreive diy scenes from OpenAPI'); } } }; exports.OpenAPIService = OpenAPIService; exports.OpenAPIService = OpenAPIService = OpenAPIService_1 = __decorate([ (0, common_1.Injectable)(), __param(0, (0, common_1.Inject)(openapi_providers_1.OpenAPIConfigProvider.provide)), __metadata("design:paramtypes", [Object, _ultimate_govee_common_1.MqttService]) ], OpenAPIService); //# sourceMappingURL=openapi.service.js.map