@constructorfleet/ultimate-govee
Version:
Library for interacting with Govee devices written in Typescript.
132 lines • 5.06 kB
JavaScript
;
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 IoTService_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.IoTService = void 0;
const common_1 = require("@nestjs/common");
const class_transformer_1 = require("class-transformer");
const _ultimate_govee_common_1 = require("../../common");
const persist_1 = require("../../persist");
const iot_client_1 = require("./iot.client");
const iot_message_1 = require("./models/iot-message");
const payloadDecoder = new TextDecoder();
const parseMessage = (payload) => {
const decoded = payloadDecoder.decode(payload);
const plain = JSON.parse(decoded);
IoTService.recordRawMessage(plain.device, plain);
return (0, class_transformer_1.plainToInstance)(iot_message_1.IoTMessage, plain);
};
let IoTService = IoTService_1 = class IoTService {
constructor(client) {
this.client = client;
this.logger = new common_1.Logger(IoTService_1.name);
}
onMessage(topic, payload, dup) {
const message = parseMessage(payload);
if (!dup && this.messageCallback) {
this.messageCallback(IoTService_1.parseIoTMessage(message));
}
}
async connect(iotData, callback) {
try {
if (this.client !== undefined) {
await this.client.disconnect();
}
this.messageCallback = callback;
await this.client.create(iotData, this);
}
catch (error) {
this.logger.error(error);
}
}
async disconnect() {
return await this.client?.disconnect();
}
async send(topic, payload) {
await this.client?.publish(topic, payload);
}
async subscribe(topic) {
await this.client?.subscribe(topic);
}
static parseIoTMessage(message) {
const code = message.state?.status?.code;
let humidityCode;
if (code !== undefined) {
humidityCode = (0, _ultimate_govee_common_1.unpaddedHexToArray)(code)?.slice(-1)[0];
}
const currentHumditity = message.humidity ? message.humidity : humidityCode;
const result = {
id: message.deviceId,
model: message.model,
pactCode: message.pactCode,
pactType: message.pactType,
cmd: message.command,
state: {
online: message.state?.connected,
isOn: message.state?.isOn,
temperature: {
current: message.temperature,
},
humidity: {
current: currentHumditity,
},
brightness: message.state?.brightness,
colorTemperature: {
current: message.state?.colorTemperature,
},
color: message.state?.color !== undefined
? {
red: message.state.color.red,
green: message.state.color.green,
blue: message.state.color.blue,
}
: undefined,
mode: message.state?.mode,
},
op: message.op,
};
this.recordMessage(result.id, result);
return result;
}
static recordMessage(deviceId, message) {
return {
...message,
timestamp: Date.now(),
};
}
static recordRawMessage(deviceId, message) {
return message;
}
};
exports.IoTService = IoTService;
__decorate([
(0, persist_1.PersistResult)({
filename: 'govee.{0}.iot-status.json',
// append: true,
}),
__metadata("design:type", Function),
__metadata("design:paramtypes", [String, Object]),
__metadata("design:returntype", Object)
], IoTService, "recordMessage", null);
__decorate([
(0, persist_1.PersistResult)({
filename: 'govee.{0}.iot-raw.log',
append: true,
}),
__metadata("design:type", Function),
__metadata("design:paramtypes", [String, Object]),
__metadata("design:returntype", Object)
], IoTService, "recordRawMessage", null);
exports.IoTService = IoTService = IoTService_1 = __decorate([
(0, common_1.Injectable)(),
__metadata("design:paramtypes", [iot_client_1.IoTClient])
], IoTService);
//# sourceMappingURL=iot.service.js.map