From 9d2e05594eadcc376661e85e9b5f440721b10c58 Mon Sep 17 00:00:00 2001 From: Max Isom Date: Fri, 19 Jan 2018 17:29:31 -0600 Subject: [PATCH] Add debugging tools --- index.js | 20 ++++++++ package-lock.json | 116 +++++++++++++++++++++++++++++++++++++++++++--- package.json | 3 +- 3 files changed, 131 insertions(+), 8 deletions(-) diff --git a/index.js b/index.js index 6aa02a7..c313388 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,7 @@ 'use strict'; // Import packages +const debug = require('debug')('TuyAPI'); const dgram = require('dgram'); const forge = require('node-forge'); const retryConnect = require('net-retry-connect'); @@ -60,6 +61,9 @@ function TuyaDevice(options) { // Create cipher from key this.devices[i].cipher = forge.cipher.createCipher('AES-ECB', this.devices[i].key); } + + debug('Device(s): '); + debug(this.devices); } /** @@ -84,6 +88,8 @@ TuyaDevice.prototype.resolveIds = function () { // add IPs to devices in array and return true return new Promise(resolve => { this.listener.on('message', message => { + debug('Received UDP message.'); + const thisId = this._extractJSON(message).gwId; if (needIP.length > 0) { @@ -150,6 +156,9 @@ TuyaDevice.prototype.get = function (options) { requests[currentDevice.type].status.command.devId = currentDevice.id; } + debug('Payload: '); + debug(requests[currentDevice.type].status.command); + // Create byte buffer from hex data const thisData = Buffer.from(JSON.stringify(requests[currentDevice.type].status.command)); const buffer = this._constructBuffer(currentDevice.type, thisData, 'status'); @@ -224,6 +233,9 @@ TuyaDevice.prototype.set = function (options) { thisRequest.dps[options.dps.toString] = options.set; } + debug('Payload: '); + debug(thisRequest); + // Encrypt data currentDevice.cipher.start({iv: ''}); currentDevice.cipher.update(forge.util.createBuffer(JSON.stringify(thisRequest), 'utf8')); @@ -259,15 +271,21 @@ TuyaDevice.prototype.set = function (options) { * @returns {Promise} - returned data */ TuyaDevice.prototype._send = function (ip, buffer) { + debug('Sending this data: ', buffer.toString('hex')); + return new Promise((resolve, reject) => { retryConnect.to({port: 6668, host: ip, retryOptions: {retries: 5}}, (error, client) => { if (error) { reject(error); } + client.write(buffer); client.on('data', data => { client.destroy(); + + debug('Received data back.'); + resolve(data); }); client.on('error', error => { @@ -302,6 +320,8 @@ TuyaDevice.prototype._constructBuffer = function (type, data, command) { * @returns {Object} extracted object */ TuyaDevice.prototype._extractJSON = function (data) { + debug('Parsing this data to JSON: ', data.toString('hex')); + data = data.toString(); // Find the # of occurrences of '{' and make that # match with the # of occurrences of '}' diff --git a/package-lock.json b/package-lock.json index 620ce66..777dc3e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "tuyapi", - "version": "1.1.2", + "version": "2.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -275,6 +275,17 @@ "private": "0.1.8", "slash": "1.0.0", "source-map": "0.5.7" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "babel-generator": { @@ -1170,6 +1181,17 @@ "globals": "9.18.0", "invariant": "2.2.2", "lodash": "4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "babel-types": { @@ -1830,10 +1852,9 @@ } }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "requires": { "ms": "2.0.0" } @@ -2301,6 +2322,17 @@ "table": "3.8.3", "text-table": "0.2.0", "user-home": "2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "eslint-config-xo": { @@ -2398,6 +2430,17 @@ "requires": { "debug": "2.6.9", "resolve": "1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "eslint-module-utils": { @@ -2408,6 +2451,17 @@ "requires": { "debug": "2.6.9", "pkg-dir": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "eslint-plugin-ava": { @@ -2444,6 +2498,15 @@ "read-pkg-up": "2.0.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "doctrine": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", @@ -5265,6 +5328,15 @@ "to-regex": "3.0.1" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -5463,8 +5535,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multimatch": { "version": "2.1.0", @@ -6686,6 +6757,15 @@ "use": "2.0.2" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -7169,6 +7249,17 @@ "livereload-js": "2.2.2", "object-assign": "4.1.1", "qs": "6.5.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "to-absolute-glob": { @@ -7940,6 +8031,17 @@ "slash": "1.0.0", "update-notifier": "2.3.0", "xo-init": "0.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "xo-init": { diff --git a/package.json b/package.json index 6c979fd..cf3421d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tuyapi", - "version": "2.0.0", + "version": "2.0.1", "description": "An easy-to-use API for devices that use Tuya's cloud services (currently only supports smart plugs)", "main": "index.js", "scripts": { @@ -25,6 +25,7 @@ }, "homepage": "https://github.com/codetheweb/tuyapi#readme", "dependencies": { + "debug": "^3.1.0", "net-retry-connect": "^0.1.1", "node-forge": "^0.7.1", "string-occurrence": "^1.2.0"