Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
461f0b3
Terse defaults (#162)
kueblc Feb 26, 2019
31a0cab
Parser cipher updates (#160)
kueblc Feb 26, 2019
680af28
Pin dependency clone to 2.1.2 (#167)
renovate[bot] Feb 27, 2019
cb8531c
Update dependency ava to v1.3.0 (#170)
renovate[bot] Mar 5, 2019
cd76c9c
Update dependency ava to v1.3.1 (#171)
renovate[bot] Mar 5, 2019
de8e81a
Update dependency p-retry to v4 (#172)
renovate[bot] Mar 11, 2019
450aea9
Update dependency p-timeout to v3 (#173)
renovate[bot] Mar 12, 2019
b9a3a9a
Update dependency documentation to v9.3.1 (#174)
renovate[bot] Mar 12, 2019
cc36945
First attempt at queue system
codetheweb Mar 21, 2019
5a74cf8
Update dependency ava to v1.4.0 (#177)
renovate[bot] Mar 26, 2019
495eca4
Implement Tuya flavored CRC (#178)
kueblc Mar 26, 2019
c2bfe82
Hack in support for sequence bytes
codetheweb Mar 27, 2019
19aaacd
Update dependency ava to v1.4.1 (#179)
renovate[bot] Mar 27, 2019
4839c78
Fix CRC computation; wrong payload range (my bad! no coding before co…
kueblc Apr 1, 2019
3b970bb
Update dependency p-retry to v4.1.0 (#181)
renovate[bot] Apr 1, 2019
1de2e41
Merge branch 'master' into development
codetheweb Apr 1, 2019
2312fd4
Same bug as #182 but for encode instead of parse (#184)
kueblc Apr 1, 2019
dd71be1
Update dependency p-timeout to v3.1.0 (#186)
renovate[bot] Apr 4, 2019
98d4bf8
Add support for parsing multiple packets in a single response
codetheweb Apr 6, 2019
da81300
Merge branch 'development'
codetheweb Apr 6, 2019
6889d38
Add documentation
codetheweb Apr 10, 2019
379add2
Remove TODO from README
codetheweb Apr 10, 2019
9bc3890
Add `encrypted` option to MessageParser.encode()
codetheweb Apr 10, 2019
ab5db86
Fix find() for new MessageParser class
codetheweb Apr 10, 2019
d7a018a
Fix find() for new MessageParser class
codetheweb Apr 10, 2019
192d671
Merge branch 'patch-response-bad-data' of github.com:codetheweb/tuya-…
codetheweb Apr 10, 2019
8bae930
Write sequence number in inital call to encode()
codetheweb Apr 11, 2019
8f21238
Update dependency nyc to v14 (#190)
renovate[bot] Apr 16, 2019
cc91641
Update dependency documentation to v10 (#191)
renovate[bot] Apr 18, 2019
75dc710
Update dependency documentation to v10.1.0 (#192)
renovate[bot] Apr 25, 2019
9fe569b
Remove Cipher instance
codetheweb Apr 26, 2019
fd82b58
Add seperate utils file
codetheweb Apr 26, 2019
adc25bc
Clean up Cipher and MessageParser
codetheweb Apr 26, 2019
eea2663
Make behavior when receiving a sequence number of 0 more clear
codetheweb Apr 26, 2019
f73c76a
Check for version number at beginning of payload
codetheweb Apr 26, 2019
a0c4122
Add CommandType enum
codetheweb Apr 27, 2019
b9162cd
Update dependency nyc to v14.1.0 (#194)
renovate[bot] May 4, 2019
75e9197
Update dependency documentation to v11 (#195)
renovate[bot] May 8, 2019
7ee1c94
Update dependency nyc to v14.1.1 (#196)
renovate[bot] May 11, 2019
a3299cb
Add sequence number to heartbeat packets
kueblc May 16, 2019
f568e36
Merge branch 'master' into development
kueblc May 19, 2019
cd93b82
Merge remote-tracking branch 'upstream/patch-response-bad-data' into …
kueblc May 19, 2019
e5a1b5a
Merge branch 'bugfix-resolvers' into development
kueblc May 19, 2019
6553087
Fix heartbeat resolver logic
codetheweb May 21, 2019
0166802
Add sequence number to heartbeat packet
codetheweb May 27, 2019
a959dd2
Fix set() resolver
codetheweb Jun 1, 2019
b9ad2e7
Merge branch 'patch-response-bad-data'
codetheweb Jun 1, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 87 additions & 2 deletions docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<html>
<head>
<meta charset='utf-8' />
<title>tuyapi 4.0.4 | Documentation</title>
<title>tuyapi 4.0.3 | Documentation</title>
<meta name='description' content='An easy-to-use API for devices that use Tuya&#39;s cloud services'>
<meta name='viewport' content='width=device-width,initial-scale=1'>
<link href='assets/bass.css' rel='stylesheet' />
Expand All @@ -15,7 +15,7 @@
<div id='split-left' class='overflow-auto fs0 height-viewport-100'>
<div class='py1 px2'>
<h3 class='mb0 no-anchor'>tuyapi</h3>
<div class='mb1'><code>4.0.4</code></div>
<div class='mb1'><code>4.0.3</code></div>
<input
placeholder='Filter'
id='filter-input'
Expand Down Expand Up @@ -125,6 +125,16 @@ <h3 class='mb0 no-anchor'>tuyapi</h3>
</li>


<li><a
href='#eventtuyadevicedata'
class="">
TuyaDevice#data

</a>

</li>


<li><a
href='#eventtuyadevicedisconnected'
class="">
Expand Down Expand Up @@ -1180,6 +1190,81 @@ <h3 class='fl m0' id='eventtuyadevicedata'>



</section>




<section class='p2 mb2 clearfix bg-white minishadow'>


<div class='clearfix'>

<h3 class='fl m0' id='eventtuyadevicedata'>
TuyaDevice#data
</h3>


</div>


<p>Emitted when data is returned from device.</p>

<div class='pre p1 fill-light mt0'>TuyaDevice#data</div>













<div class='py1 quiet mt1 prose-big'>Properties</div>
<div>

<div class='space-bottom0'>
<span class='code bold'>data</span> <code class='quiet'>(<a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object">Object</a>)</code>
: received data


</div>

<div class='space-bottom0'>
<span class='code bold'>commandByte</span> <code class='quiet'>(<a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number">Number</a>)</code>
: commandByte of result
(e.g. 7=requested response, 8=proactive update from device)


</div>

<div class='space-bottom0'>
<span class='code bold'>sequenceN</span> <code class='quiet'>(<a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number">Number</a>)</code>
: the packet sequence number


</div>

</div>















</section>


Expand Down
66 changes: 53 additions & 13 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@ class TuyaDevice extends EventEmitter {
this._responseTimeout = 5; // Seconds
this._connectTimeout = 5; // Seconds
this._pingPongPeriod = 10; // Seconds

this._currentSequenceN = 0;
this._resolvers = {};

this._waitingForSetToResolve = false;
}

/**
Expand Down Expand Up @@ -209,22 +214,13 @@ class TuyaDevice extends EventEmitter {
});

// Send request and wait for response
this._waitingForSetToResolve = true;
return new Promise((resolve, reject) => {
try {
// Send request
this._send(buffer).then(() => {
// Runs when data event is emitted
const resolveSet = _ => {
// Remove self listener
this.removeListener('data', resolveSet);
this._send(buffer);

// Return true
resolve(true);
};

// Add listener to data event
this.on('data', resolveSet);
});
this._setResolver = resolve;
} catch (error) {
reject(error);
}
Expand Down Expand Up @@ -264,7 +260,8 @@ class TuyaDevice extends EventEmitter {
// Create byte buffer
const buffer = Parser.encode({
data: Buffer.allocUnsafe(0),
commandByte: 9 // 0x09
commandByte: CommandType.HEART_BEAT,
sequenceN: ++this._currentSequenceN
});

// Send ping
Expand Down Expand Up @@ -427,6 +424,49 @@ class TuyaDevice extends EventEmitter {
return Promise.resolve(true);
}

_packetHandler(packet) {
// Response was received, so stop waiting
clearTimeout(this._sendTimeout);

if (packet.commandByte === CommandType.HEART_BEAT) {
debug(`Pong from ${this.device.ip}`);

// Remove resolver
delete this._resolvers[packet.sequenceN];
return;
}

/**
* Emitted when data is returned from device.
* @event TuyaDevice#data
* @property {Object} data received data
* @property {Number} commandByte
* commandByte of result
* (e.g. 7=requested response, 8=proactive update from device)
* @property {Number} sequenceN the packet sequence number
*/
this.emit('data', packet.payload, packet.commandByte, packet.sequenceN);

// Status response to SET command
if (packet.sequenceN === 0 &&
packet.commandByte === CommandType.STATUS &&
this._waitingForSetToResolve) {
this._setResolver(packet.payload);

// Remove resolver
this._setResolver = undefined;
return;
}

// Call data resolver for sequence number
if (packet.sequenceN in this._resolvers) {
this._resolvers[packet.sequenceN](packet.payload);

// Remove resolver
delete this._resolvers[packet.sequenceN];
}
}

/**
* Disconnects from the device, use to
* close the socket and exit gracefully.
Expand Down
2 changes: 1 addition & 1 deletion lib/message-parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ function encode(options) {

// Add payload, crc, and suffix
payload.copy(buffer, 16);
buffer.writeInt32BE(crc(payload), payload.length + 16);
buffer.writeInt32BE(crc(buffer.slice(0, payload.length + 16)), payload.length + 16);
buffer.writeUInt32BE(0x0000AA55, payload.length + 20);

return buffer;
Expand Down
Loading