mirror of
https://github.com/lehanspb/tuya-mqtt.git
synced 2025-12-23 09:45:04 +00:00
tuya extended class integrated and updated mqtt client
This commit is contained in:
180
tuyaapi-extended.js
Normal file
180
tuyaapi-extended.js
Normal file
@@ -0,0 +1,180 @@
|
||||
const TuyaDevice = require('tuyapi');
|
||||
const TuyaColor = require('./tuya-color');
|
||||
const debug = require('debug')('TuyAPI');
|
||||
|
||||
// Helpers
|
||||
const Cipher = require('tuyapi/lib/cipher');
|
||||
const Parser = require('tuyapi/lib/message-parser')
|
||||
|
||||
TuyaDevice.prototype.getDevice = function () {
|
||||
return this.device;
|
||||
}
|
||||
|
||||
TuyaDevice.prototype.get = function (options) {
|
||||
// Set empty object as default
|
||||
options = options ? options : {};
|
||||
|
||||
const payload = {
|
||||
gwId: this.device.id,
|
||||
devId: this.device.id
|
||||
};
|
||||
|
||||
debug('Payload: ', payload);
|
||||
|
||||
// Create byte buffer
|
||||
const buffer = Parser.encode({
|
||||
data: payload,
|
||||
commandByte: '0a'
|
||||
});
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
this._send(this.device.ip, buffer).then(data => {
|
||||
var dps = data.dps;
|
||||
if (options.schema === true) {
|
||||
resolve(data);
|
||||
} else if (options.dps) {
|
||||
resolve(dps[options.dps]);
|
||||
} else {
|
||||
if (dps != undefined && dps["1"] != undefined) {
|
||||
resolve(dps['1']);
|
||||
} else {
|
||||
resolve(dps);
|
||||
}
|
||||
}
|
||||
}).catch(err => {
|
||||
reject(err);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
TuyaDevice.prototype.set = function (options) {
|
||||
let dps = {};
|
||||
var count = Object.keys(options).length;
|
||||
|
||||
if (options.dps != undefined || options.set != undefined) {
|
||||
if (options.dps === undefined) {
|
||||
dps = {
|
||||
1: options.set
|
||||
};
|
||||
} else {
|
||||
dps = {
|
||||
[options.dps.toString()]: options.set
|
||||
};
|
||||
}
|
||||
} else {
|
||||
dps = options;
|
||||
}
|
||||
|
||||
const now = new Date();
|
||||
const timeStamp = (parseInt(now.getTime() / 1000, 10)).toString();
|
||||
|
||||
const payload = {
|
||||
devId: this.device.id,
|
||||
uid: '',
|
||||
t: timeStamp,
|
||||
dps
|
||||
};
|
||||
|
||||
debug('Payload:');
|
||||
debug(payload);
|
||||
|
||||
// Encrypt data
|
||||
const data = this.device.cipher.encrypt({
|
||||
data: JSON.stringify(payload)
|
||||
});
|
||||
|
||||
// Create MD5 signature
|
||||
const md5 = this.device.cipher.md5('data=' + data +
|
||||
'||lpv=' + this.device.version +
|
||||
'||' + this.device.key);
|
||||
|
||||
// Create byte buffer from hex data
|
||||
const thisData = Buffer.from(this.device.version + md5 + data);
|
||||
const buffer = Parser.encode({
|
||||
data: thisData,
|
||||
commandByte: '07'
|
||||
});
|
||||
|
||||
// Send request to change status
|
||||
return new Promise((resolve, reject) => {
|
||||
this._send(this.device.ip, buffer).then(() => {
|
||||
resolve(true);
|
||||
}).catch(err => {
|
||||
reject(err);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
TuyaDevice.prototype.getStatus = function (callback) {
|
||||
var tuya = this;
|
||||
tuya.get().then(status => {
|
||||
debug('Current Status: ' + status);
|
||||
callback.call(this, status);
|
||||
});
|
||||
}
|
||||
|
||||
TuyaDevice.prototype.setStatus = function (options, callback) {
|
||||
var tuya = this;
|
||||
tuya.set(options).then(result => {
|
||||
debug('Result of setting status to ' + options + ': ' + result);
|
||||
tuya.get().then(status => {
|
||||
debug('New status: ' + status);
|
||||
if (callback != undefined) {
|
||||
callback.call(this, status);
|
||||
} else {
|
||||
debug(status);
|
||||
}
|
||||
return;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
TuyaDevice.prototype.toggle = function (callback) {
|
||||
var tuya = this;
|
||||
tuya.get().then(status => {
|
||||
tuya.setStatus({
|
||||
set: !status
|
||||
}, callback);
|
||||
});
|
||||
}
|
||||
|
||||
TuyaDevice.prototype.onoff = function (newStatus, callback) {
|
||||
newStatus = newStatus.toLowerCase();
|
||||
debug("onoff: " + newStatus);
|
||||
if (newStatus == "on") {
|
||||
this.on(callback);
|
||||
}
|
||||
if (newStatus == "off") {
|
||||
this.off(callback);
|
||||
}
|
||||
}
|
||||
|
||||
TuyaDevice.prototype.setColor = function (hexColor, callback) {
|
||||
var tuya = this;
|
||||
var color = new TuyaColor(tuya);
|
||||
var dps = color.setColor(hexColor);
|
||||
tuya.get().then(status => {
|
||||
tuya.setStatus(dps, callback);
|
||||
});
|
||||
}
|
||||
|
||||
TuyaDevice.prototype.on = function (callback) {
|
||||
var tuya = this;
|
||||
tuya.get().then(status => {
|
||||
tuya.setStatus({
|
||||
set: true
|
||||
}, callback);
|
||||
});
|
||||
}
|
||||
|
||||
TuyaDevice.prototype.off = function (callback) {
|
||||
debug("off: ");
|
||||
var tuya = this;
|
||||
tuya.get().then(status => {
|
||||
tuya.setStatus({
|
||||
set: false
|
||||
}, callback);
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = TuyaDevice;
|
||||
Reference in New Issue
Block a user