TuyaAPI / cli

🔧 A CLI for Tuya devices
MIT License
267 stars 43 forks source link

Specifing both --ip and --id cause infinite loop #29

Closed jezzaaa closed 5 years ago

jezzaaa commented 5 years ago

I have a Tuya-based color bulb I'm trying to control. Using tuya-cli, I can read data just fine when specifying either IP or ID but not both. When I specify both, the command never returns and I have to ^C. Under debug, it seems to be receiving and parsing a message but not parsing it correctly.

When I compare the raw message in DEBUG output with that from a run with only --id specified, it appears to be the same length and content except for 40 bytes near the end (around offset 0x186) and a couple of bytes at offset 3A (a counter?).

$ DEBUG="*" tuya-cli get --id 572757322cf432269a18 --ip 192.168.1.89 --dps 20
  TuyAPI IP and ID are already both resolved. +0ms
  TuyAPI Connecting to 192.168.1.89... +13ms
  TuyAPI Socket connected. +16ms
  TuyAPI GET Payload: +3ms
  TuyAPI { gwId: '572757322cf432269a18', devId: '572757322cf432269a18' } +1ms
  TuyAPI Received data: 000055aa0000000000000008000000cb00000000332e330000000000000e2500000001fe69584f50dd7df21f8765abd18425e27a3d78dbf479ce5d3ace084aa1132bc9ba849c8af24ae0237ad75028dd11bd4ed7c56cddf42da77b2db53cdaeacf4ccb8b7a8b09204c5c3eeed78dfc1d1db1a1c90cabb671c5bf556719e56b00102bf34a5a924273ba412e6074022c8476360a4b85daeed87ad730859440a79e512e4c5182d7902e58731f7e8ec11aa54dcd2c1acac006eaa0530c1ddec9c419c9da63d7b7721cd382c7577057b53eef9460c9133b52030000aa55 +176ms
  TuyAPI Parsed: +10ms
  TuyAPI { payload:
  TuyAPI    '3.3\u0000\u0000\u0000\u0000\u0000\u0000\u000e%\u0000\u0000\u0000\u0001�iXOP�}�\u001f�e�ф%�z=x��y�]:�\bJ�\u0013+ɺ����J�#z�P(�\u0011�N��l��-�{-�<���Lˋz�\t L\\>�׍�\u001d\u001d���\f��qſUg\u0019�k\u0000\u0010+�JZ�Bs�A.`t\u0002,�v6\nK����z�0��@��Q.LQ�א.Xs\u001f~��\u001a�M�,\u001a��\u0006�S\f\u001d���\u0019��c׷r\u001cӂ�WpW�>�`�',
  TuyAPI   leftover: false,
  TuyAPI   commandByte: 8,
  TuyAPI   sequenceN: 0 } +0ms
  TuyAPI Received data: 000055aa0000000000000008000000cb00000000332e330000000000000e2600000001fe69584f50dd7df21f8765abd18425e27a3d78dbf479ce5d3ace084aa1132bc9ba849c8af24ae0237ad75028dd11bd4ed7c56cddf42da77b2db53cdaeacf4ccb8b7a8b09204c5c3eeed78dfc1d1db1a1c90cabb671c5bf556719e56b00102bf34a5a924273ba412e6074022c8476360a4b85daeed87ad730859440a79e512e4c5182d7902e58731f7e8ec11aa54dcd2c1acac006eaa0530c1ddec9c419c9da63e934f2de4d411a8642d9b13d67c23439dae9472f0000aa55 +501ms
  TuyAPI Parsed: +2ms
  TuyAPI { payload:
  TuyAPI    '3.3\u0000\u0000\u0000\u0000\u0000\u0000\u000e&\u0000\u0000\u0000\u0001�iXOP�}�\u001f�e�ф%�z=x��y�]:�\bJ�\u0013+ɺ����J�#z�P(�\u0011�N��l��-�{-�<���Lˋz�\t L\\>�׍�\u001d\u001d���\f��qſUg\u0019�k\u0000\u0010+�JZ�Bs�A.`t\u0002,�v6\nK����z�0��@��Q.LQ�א.Xs\u001f~��\u001a�M�,\u001a��\u0006�S\f\u001d���\u0019��c�4��MA\u001a�Bٱ=g�49',
  TuyAPI   leftover: false,
  TuyAPI   commandByte: 8,
  TuyAPI   sequenceN: 0 } +1ms

Compare a run without --ip:

$ DEBUG="*" tuya-cli get --id 572757322cf432269a18 --dps 20
  TuyAPI Finding missing IP undefined or ID 572757322cf432269a18 +0ms
  TuyAPI Received UDP message. +1s
  TuyAPI UDP data: +19ms
  TuyAPI { payload:
  TuyAPI    { ip: '192.168.1.89',
  TuyAPI      gwId: '572757322cf432269a18',
  TuyAPI      active: 2,
  TuyAPI      ability: 0,
  TuyAPI      mode: 0,
  TuyAPI      encrypt: true,
  TuyAPI      productKey: '4kheilyfiyazqpda',
  TuyAPI      version: '3.3' },
  TuyAPI   leftover: false,
  TuyAPI   commandByte: 19,
  TuyAPI   sequenceN: 0 } +1ms
  TuyAPI Connecting to 192.168.1.89... +31ms
  TuyAPI Socket connected. +21ms
  TuyAPI GET Payload: +3ms
  TuyAPI { gwId: '572757322cf432269a18', devId: '572757322cf432269a18' } +1ms
  TuyAPI Received data: 000055aa000000010000000a000000bc00000000fe69584f50dd7df21f8765abd18425e27a3d78dbf479ce5d3ace084aa1132bc9ba849c8af24ae0237ad75028dd11bd4ed7c56cddf42da77b2db53cdaeacf4ccb8b7a8b09204c5c3eeed78dfc1d1db1a1c90cabb671c5bf556719e56b00102bf34a5a924273ba412e6074022c8476360a4b85daeed87ad730859440a79e512e4c5182d7902e58731f7e8ec11aa54dcd2c1acac006eaa0530c1ddec9c419c9da63223dcfd6b378904d1afac9d5548743b4a9c700340000aa55 +59ms
  TuyAPI Parsed: +4ms
  TuyAPI { payload:
  TuyAPI    { devId: '572757322cf432269a18',
  TuyAPI      dps:
  TuyAPI       { '20': true,
  TuyAPI         '21': 'white',
  TuyAPI         '22': 150,
  TuyAPI         '23': 44,
  TuyAPI         '24': '00180389003c',
  TuyAPI         '25': '04464602007803e803e800000000464602007803e8000a00000000' } },
  TuyAPI   leftover: false,
  TuyAPI   commandByte: 10,
  TuyAPI   sequenceN: 1 } +0ms
  TuyAPI GET Payload: +5ms
  TuyAPI { gwId: '572757322cf432269a18', devId: '572757322cf432269a18' } +1ms
  TuyAPI Received data: 000055aa0000000000000008000000cb00000000332e330000000000000e7600000001fe69584f50dd7df21f8765abd18425e27a3d78dbf479ce5d3ace084aa1132bc9ba849c8af24ae0237ad75028dd11bd4ed7c56cddf42da77b2db53cdaeacf4ccb8b7a8b09204c5c3eeed78dfc1d1db1a1c90cabb671c5bf556719e56b00102bf34a5a924273ba412e6074022c8476360a4b85daeed87ad730859440a79e512e4c5182d7902e58731f7e8ec11aa54dcd2c1acac006eaa0530c1ddec9c419c9da63301a2a50ba9c84b8e0158053d2fb298ca57c68510000aa55 +4ms
  TuyAPI Parsed: +1ms
  TuyAPI { payload:
  TuyAPI    { devId: '572757322cf432269a18',
  TuyAPI      dps:
  TuyAPI       { '20': true,
  TuyAPI         '21': 'white',
  TuyAPI         '22': 150,
  TuyAPI         '23': 44,
  TuyAPI         '24': '00180389003c',
  TuyAPI         '25': '04464602007803e803e800000000464602007803e8000a00000000' },
  TuyAPI      t: 1861 },
  TuyAPI   leftover: false,
  TuyAPI   commandByte: 8,
  TuyAPI   sequenceN: 0 } +0ms
  TuyAPI Received data: 000055aa000000020000000a000000bc00000000fe69584f50dd7df21f8765abd18425e27a3d78dbf479ce5d3ace084aa1132bc9ba849c8af24ae0237ad75028dd11bd4ed7c56cddf42da77b2db53cdaeacf4ccb8b7a8b09204c5c3eeed78dfc1d1db1a1c90cabb671c5bf556719e56b00102bf34a5a924273ba412e6074022c8476360a4b85daeed87ad730859440a79e512e4c5182d7902e58731f7e8ec11aa54dcd2c1acac006eaa0530c1ddec9c419c9da63223dcfd6b378904d1afac9d5548743b4833cec1b0000aa55 +48ms
  TuyAPI Parsed: +1ms
  TuyAPI { payload:
  TuyAPI    { devId: '572757322cf432269a18',
  TuyAPI      dps:
  TuyAPI       { '20': true,
  TuyAPI         '21': 'white',
  TuyAPI         '22': 150,
  TuyAPI         '23': 44,
  TuyAPI         '24': '00180389003c',
  TuyAPI         '25': '04464602007803e803e800000000464602007803e8000a00000000' } },
  TuyAPI   leftover: false,
  TuyAPI   commandByte: 10,
  TuyAPI   sequenceN: 2 } +0ms
  TuyAPI Disconnect +2ms
true
  TuyAPI Socket closed: 192.168.1.89 +5ms
codetheweb commented 5 years ago

That's strange, have you tried reproducing it by writing a script that calls TuyAPI directly to see if it's an issue with the CLI tool?

My guess is that it's an issue with your device or our parser, as AFAIK two packets with identical payloads should be byte-for-byte identical.

If the same problem occurs when calling TuyAPI directly, please open an issue here.

jezzaaa commented 5 years ago

Tried this and it's still doing the same thing. The received data is now smaller for some reason.

Script:

#!/usr/local/bin/node

const TuyAPI = require('tuyapi');

const device = new TuyAPI({
    //ip: '192.168.1.88',
    id: '12084540ecfabc449c45',
    key: '80bbc8a7b2a80dda'
});

(async () => {

  await device.find();

  await device.connect();

  let status = await device.get();

  console.log(`Status: ${status}.`);

  device.disconnect();
})();

Output with "ip" commented out as above (also happens if "ip" set to ""):

$ DEBUG='*' ./get-status.js
  TuyAPI Finding missing IP undefined or ID 572757322cf432269a18 +0ms
  TuyAPI Received UDP message. +4s
  TuyAPI UDP data: +13ms
  TuyAPI { payload:
  TuyAPI    { ip: '192.168.1.89',
  TuyAPI      gwId: '572757322cf432269a18',
  TuyAPI      active: 2,
  TuyAPI      ability: 0,
  TuyAPI      mode: 0,
  TuyAPI      encrypt: true,
  TuyAPI      productKey: '4kheilyfiyazqpda',
  TuyAPI      version: '3.3' },
  TuyAPI   leftover: false,
  TuyAPI   commandByte: 19,
  TuyAPI   sequenceN: 0 } +1ms
  TuyAPI Connecting to 192.168.1.89... +29ms
  TuyAPI Socket connected. +16ms
  TuyAPI GET Payload: +2ms
  TuyAPI { gwId: '572757322cf432269a18', devId: '572757322cf432269a18' } +2ms
  TuyAPI Received data: 000055aa000000010000000a000000bc00000000fe69584f50dd7df21f8765abd18425e27a3d78dbf479ce5d3ace084aa1132bc9ba849c8af24ae0237ad75028dd11bd4ed7c56cddf42da77b2db53cdaeacf4ccb8b7a8b09204c5c3eeed78dfc1d1db1a1c90cabb671c5bf556719e56b00102bf34a5a924273ba412e6074022c8476360a4b85daeed87ad730859440a79e512e4c5182d7902e58731f7e8ec11aa54dcd2c1acac006eaa0530c1ddec9c419c9da63223dcfd6b378904d1afac9d5548743b4a9c700340000aa55 +34ms
  TuyAPI Parsed: +2ms
  TuyAPI { payload:
  TuyAPI    { devId: '572757322cf432269a18',
  TuyAPI      dps:
  TuyAPI       { '20': true,
  TuyAPI         '21': 'white',
  TuyAPI         '22': 150,
  TuyAPI         '23': 44,
  TuyAPI         '24': '00180389003c',
  TuyAPI         '25': '04464602007803e803e800000000464602007803e8000a00000000' } },
  TuyAPI   leftover: false,
  TuyAPI   commandByte: 10,
  TuyAPI   sequenceN: 1 } +2ms
  TuyAPI GET Payload: +7ms
  TuyAPI { gwId: '572757322cf432269a18', devId: '572757322cf432269a18' } +1ms
  TuyAPI Received data: 000055aa000000020000000a000000bc00000000fe69584f50dd7df21f8765abd18425e27a3d78dbf479ce5d3ace084aa1132bc9ba849c8af24ae0237ad75028dd11bd4ed7c56cddf42da77b2db53cdaeacf4ccb8b7a8b09204c5c3eeed78dfc1d1db1a1c90cabb671c5bf556719e56b00102bf34a5a924273ba412e6074022c8476360a4b85daeed87ad730859440a79e512e4c5182d7902e58731f7e8ec11aa54dcd2c1acac006eaa0530c1ddec9c419c9da63223dcfd6b378904d1afac9d5548743b4833cec1b0000aa55 +22ms
  TuyAPI Parsed: +2ms
  TuyAPI { payload:
  TuyAPI    { devId: '572757322cf432269a18',
  TuyAPI      dps:
  TuyAPI       { '20': true,
  TuyAPI         '21': 'white',
  TuyAPI         '22': 150,
  TuyAPI         '23': 44,
  TuyAPI         '24': '00180389003c',
  TuyAPI         '25': '04464602007803e803e800000000464602007803e8000a00000000' } },
  TuyAPI   leftover: false,
  TuyAPI   commandByte: 10,
  TuyAPI   sequenceN: 2 } +1ms
Status: undefined.
  TuyAPI Disconnect +9ms
  TuyAPI Socket closed: 192.168.1.89 +4ms

And with the comment removed from the "ip":

$ DEBUG='*' ./get-status.js
  TuyAPI IP and ID are already both resolved. +0ms
  TuyAPI Connecting to 192.168.1.89... +13ms
  TuyAPI Socket connected. +124ms
  TuyAPI GET Payload: +2ms
  TuyAPI { gwId: '572757322cf432269a18', devId: '572757322cf432269a18' } +1ms
  TuyAPI Pinging 192.168.1.89 +10s
  TuyAPI Received data: 000055aa00000000000000090000000c00000000b051ab030000aa55 +29ms
  TuyAPI Parsed: +8ms
  TuyAPI { payload: false, leftover: false, commandByte: 9, sequenceN: 0 } +1ms
  TuyAPI Pong from 192.168.1.89 +3ms
  TuyAPI Pinging 192.168.1.89 +10s
  TuyAPI Received data: 000055aa00000000000000090000000c00000000b051ab030000aa55 +84ms
  TuyAPI Parsed: +1ms
  TuyAPI { payload: false, leftover: false, commandByte: 9, sequenceN: 0 } +0ms
  TuyAPI Pong from 192.168.1.89 +1ms
  TuyAPI Pinging 192.168.1.89 +10s
  TuyAPI Received data: 000055aa00000000000000090000000c00000000b051ab030000aa55 +76ms
  TuyAPI Parsed: +16ms
  TuyAPI { payload: false, leftover: false, commandByte: 9, sequenceN: 0 } +1ms
  TuyAPI Pong from 192.168.1.89 +1ms
codetheweb commented 5 years ago

Sorry, should have looked closer at the initial output; I think I know what the issue is.

It looks like your device uses the v3.3 protocol version. When the IP is omitted, TuyAPI automatically changes the protocol version to v3.3 when it receives a broadcast from the device with the ID, IP, and version.

However, if you specify both the IP and ID without including the protocol version it defaults to v3.1.

TL;DR: try changing the protocol version to v3.3 with the CLI flag --protocol-version 3.3 or the constructor option { ... version: 3.3 ... }. Everything should then work as expected.

jezzaaa commented 5 years ago

Bingo! Adding --protocol-version 3.3 did the trick. Thankyou very much!

codetheweb commented 5 years ago

Glad it hear it's working.