Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Device(s) Failed to be registered! #65

Closed
rbyers8252 opened this issue Aug 16, 2018 · 102 comments
Closed

Device(s) Failed to be registered! #65

rbyers8252 opened this issue Aug 16, 2018 · 102 comments
Labels

Comments

@rbyers8252
Copy link

I've created the Tuya account and obtained the ID and Key from the site.

When I go to add a device I get the following error.
× Device(s) failed to be registered!
Error: Timed out wating for device(s) to connect to cloud
at Promise (C:\Users\xxxxxx\AppData\Roaming\npm\node_modules@tuyapi\cli\node_modules@tuyapi\cloud\index.js:275:12)
at

I'm using this smart plug https://www.amazon.com/gp/product/B07CHMDP1G/ref=oh_aui_detailpage_o09_s00?ie=UTF8&psc=1 with the Smart Life app. Running Charles on my iPhone I can confirm it's communicating through the Tuya Cloud. I put the switch in pairing mode but the wizard never finds it. Instantly can add it back to the Smart Life app though.

I use the iOS APP KEY from Tuya for apikey in the wizard and iOS APP Secret from Tuya for apisecret in the wizard. Am I doing something wrong?

@codetheweb
Copy link
Owner

@rbyers8252 everything sounds good...

I'm not sure what shell you're using on Windows, but can you please set the environment variable DEBUG to *, run the linking wizard again, and post the output?

@S-K-Lieren
Copy link

Very strangely, setting the environment var DEBUG to * already did the trick for me.

@rbyers8252
Copy link
Author

Not an expert with all of this. Been a long time since I did a bunch of this. How do I set the environment var debug to * ?

@stephenmhall
Copy link

stephenmhall commented Aug 17, 2018

I managed to find it for windows cmd SET DEBUG=*
or $env:DEBUG = "*" for powershell
I have the same error and I got a minute of this.

`- Registering devices(s)... @tuyapi/cloud Sending parameters: +202ms
@tuyapi/cloud { a: 'tuya.m.device.list.token',
@tuyapi/cloud deviceId: '6kkpgqusqcttueoa3502kj6vujbd0pya64u7t7l3k5h4',
@tuyapi/cloud os: 'Linux',
@tuyapi/cloud lang: 'en',
@tuyapi/cloud v: '1.0',
@tuyapi/cloud clientId: 'my ios app key',
@tuyapi/cloud time: 1534504445,
@tuyapi/cloud postData: '{"token":"cWW0KWZt"}',
@tuyapi/cloud sid: 'az15344262526951vjKzyby31f70b89116d7c63518372b15a642803f',
@tuyapi/cloud sign: 'dd7454007571175f79633aa0766a611f' } +3ms

  • Registering devices(s)... @tuyapi/cloud Received response: +530ms
    @tuyapi/cloud {"result":[],"t":1534504449201,"success":true,"status":"ok"}
    @tuyapi/cloud +5ms
    | Registering devices(s)... @tuyapi/cloud Sending parameters: +204ms
    @tuyapi/cloud { a: 'tuya.m.device.list.token',
    @tuyapi/cloud deviceId: '6kkpgqusqcttueoa3502kj6vujbd0pya64u7t7l3k5h4',
    @tuyapi/cloud os: 'Linux',
    @tuyapi/cloud lang: 'en',
    @tuyapi/cloud v: '1.0',
    @tuyapi/cloud clientId: 'my ios app key',
    @tuyapi/cloud time: 1534504446,
    @tuyapi/cloud postData: '{"token":"cWW0KWZt"}',
    @tuyapi/cloud sid: 'az15344262526951vjKzyby31f70b89116d7c63518372b15a642803f',
    @tuyapi/cloud sign: '02154a22499d79e19e792893c72d6068' } +5ms
    | Registering devices(s)... @tuyapi/cloud Received response: +489ms
    @tuyapi/cloud {"result":[],"t":1534504449907,"success":true,"status":"ok"}
    @tuyapi/cloud +5ms
    / Registering devices(s)... @tuyapi/cloud Sending parameters: +203ms
    @tuyapi/cloud { a: 'tuya.m.device.list.token',
    @tuyapi/cloud deviceId: '6kkpgqusqcttueoa3502kj6vujbd0pya64u7t7l3k5h4',
    @tuyapi/cloud os: 'Linux',
    @tuyapi/cloud lang: 'en',
    @tuyapi/cloud v: '1.0',
    @tuyapi/cloud clientId: 'my ios app key',
    @tuyapi/cloud time: 1534504447,
    @tuyapi/cloud postData: '{"token":"cWW0KWZt"}',
    @tuyapi/cloud sid: 'az15344262526951vjKzyby31f70b89116d7c63518372b15a642803f',
    @tuyapi/cloud sign: '605009dd21ab4e4e29f1419266edfe2d' } +2ms
    / Registering devices(s)... @tuyapi/cloud Received response: +533ms
    @tuyapi/cloud {"result":[],"t":1534504450647,"success":true,"status":"ok"}
    @tuyapi/cloud +4ms
    × Device(s) failed to be registered!
    Error: Timed out wating for device(s) to connect to cloud
    at Promise (C:\Users\Stephen\AppData\Roaming\npm\node_modules@tuyapi\cli\node_modules@tuyapi\cloud\index.js:275:12)
    at `

with no registration

@stephenmhall
Copy link

If I register it through the app is it the

@tuyapi/cloud deviceId: '6kkpgqusqcttueoa3502kj6vujbd0pya64u7t7l3k5h4',
that I need to use the API?

@codetheweb
Copy link
Owner

@BenjaminKauer if possible, could you run a few tests and see if setting DEBUG=* is the only reason it worked? If so, that's a rather strange bug that needs to be fixed.

@stephenmhall what's your configuration? Does the computer you're running the tool from have a (enabled) wireless card?

Sometimes devices get "stuck", and unplugging then plugging them back in seems to help.

@stephenmhall
Copy link

@stephenmhall what's your configuration? Does the computer you're running the tool from have a (enabled) wireless card?

Ok can I assume from this my PC has to be on the wifi not lan? Now I think about it of course it needs a wifi connection as it will need to connect to the plug before it gets placed on my network. Sorry fundamental misunderstanding from me there. I have wifi but disabled, I will have another go.

@stephenmhall
Copy link

well, a lot of it looks to be working but it never registers.

`- Registering devices(s)... @tuyapi/cloud Sending parameters: +0ms
@tuyapi/cloud { a: 'tuya.m.user.email.register',
@tuyapi/cloud deviceId: '5fpd9gbt61dgwr5vz2y70xcj5xuj3e0xdqt5vqtnawht',
@tuyapi/cloud os: 'Linux',
@tuyapi/cloud lang: 'en',
@tuyapi/cloud v: '1.0',
@tuyapi/cloud clientId: 'myID',
@tuyapi/cloud time: 1534584771,
@tuyapi/cloud postData: '{"countryCode":"AZ","email":"johndoe@example.com","passwd":"8ac4253450b2e0eccdfe0fa24036b6d5"}',
@tuyapi/cloud sign: 'ae425b03f88f2fadf1fa6015d14aa676' } +2ms
| Registering devices(s)... @tuyapi/cloud Received response: +858ms
@tuyapi/cloud {"t":1534584773312,"success":false,"errorCode":"USER_NAME_IS_EXIST","status":"error","errorMsg":"Username exists."}
@tuyapi/cloud +4ms
@tuyapi/cloud Sending parameters: +3ms
@tuyapi/cloud { a: 'tuya.m.user.email.password.login',
@tuyapi/cloud deviceId: '5fpd9gbt61dgwr5vz2y70xcj5xuj3e0xdqt5vqtnawht',
@tuyapi/cloud os: 'Linux',
@tuyapi/cloud lang: 'en',
@tuyapi/cloud v: '1.0',
@tuyapi/cloud clientId: 'myID',
@tuyapi/cloud time: 1534584772,
@tuyapi/cloud postData: '{"countryCode":"AZ","email":"johndoe@example.com","passwd":"8ac4253450b2e0eccdfe0fa24036b6d5"}',
@tuyapi/cloud sign: '0e79cffff18b546803ceec5c6c2e57e9' } +1ms
| Registering devices(s)... @tuyapi/cloud Received response: +578ms
@tuyapi/cloud {"result":{"timezone":"","tempUnit":1,"sid":"az153442r2526951vxKzybb3e55dda0f3008986a3d2e77ca1881d5b5","uid":"az1534422526951vKzyb","nickname":"","phoneCode":"AZ","email":"johndoe@example.com","snsNickname":"","improveCompanyInfo":false,"dataVersion":0,"sex":0,"accountType":1,"mobile":"","headPic":"","ecode":"z5z453311141424z","domain":{"deviceHttpUrl":"http://a.tuyaus.com","deviceHttpsUrl":"https://a2.tuyaus.com","deviceMediaMqttUrl":"s.tuyaus.com","deviceMqttsUrl":"m2.tuyaus.com","gwApiUrl":"http://a.gw.tuyaus.com/gw.json","gwMqttUrl":"mq.gw.tuyaus.com","mobileApiUrl":"https://a1.tuyaus.com","mobileMediaMqttUrl":"s.tuyaus.com","mobileMqttUrl":"mq.mb.tuyaus.com","mobileMqttsUrl":"m1.tuyaus.com","pxApiUrl":"http://px.tuyaus.com","regionCode":"AZ"},"timezoneId":"","userType":1,"partnerIdentity":"p1095947","username":"johndoe@example.com"},"t":1534584773911,"success":true,"status":"ok"}
@tuyapi/cloud +4ms
@tuyapi/cloud Sending parameters: +3ms
@tuyapi/cloud { a: 'tuya.m.device.token.create',
@tuyapi/cloud deviceId: '5fpd9gbt61dgwr5vz2y70xcj5xuj3e0xdqt5vqtnawht',
@tuyapi/cloud os: 'Linux',
@tuyapi/cloud lang: 'en',
@tuyapi/cloud v: '1.0',
@tuyapi/cloud clientId: 'myID',
@tuyapi/cloud time: 1534584773,
@tuyapi/cloud postData: '{"timeZone":"-05:00"}',
@tuyapi/cloud sid: 'az153442r2526951vxKzybb3e55dda0f3008986a3d2e77ca1881d5b5',
@tuyapi/cloud sign: 'd8af7efbc00f1722c04fe150e0ece126' } +1ms
/ Registering devices(s)... @tuyapi/cloud Received response: +547ms
@tuyapi/cloud {"result":{"secret":"WU1C","token":"M4byJnXr"},"t":1534584774466,"success":true,"status":"ok"}
@tuyapi/cloud +1ms
@tuyapi/link:wizard Token: { secret: 'WU1C', token: 'M4byJnXr' } +0ms
@tuyapi/link:manual Sending SmartLink initialization packets +0ms
@tuyapi/link:wizard Polling cloud for details on token... +5ms
@tuyapi/cloud Sending parameters: +12ms
@tuyapi/cloud { a: 'tuya.m.device.list.token',
@tuyapi/cloud deviceId: '5fpd9gbt61dgwr5vz2y70xcj5xuj3e0xdqt5vqtnawht',
@tuyapi/cloud os: 'Linux',
@tuyapi/cloud lang: 'en',
@tuyapi/cloud v: '1.0',
@tuyapi/cloud clientId: 'myID',
@tuyapi/cloud time: 1534584773,
@tuyapi/cloud postData: '{"token":"M4byJnXr"}',
@tuyapi/cloud sid: 'az153442r2526951vxKzybb3e55dda0f3008986a3d2e77ca1881d5b5',
@tuyapi/cloud sign: 'ae16b8a5a59f20c9787b0e1a7785aa86' } +1ms
/ Registering devices(s)... @tuyapi/cloud Received response: +544ms
@tuyapi/cloud {"result":[],"t":1534584775017,"success":true,"status":"ok"}
@tuyapi/cloud +4ms

  • Registering devices(s)... @tuyapi/cloud Sending parameters: +203ms
    @tuyapi/cloud { a: 'tuya.m.device.list.token',
    @tuyapi/cloud deviceId: '5fpd9gbt61dgwr5vz2y70xcj5xuj3e0xdqt5vqtnawht',
    @tuyapi/cloud os: 'Linux',
    @tuyapi/cloud lang: 'en',
    @tuyapi/cloud v: '1.0',
    @tuyapi/cloud clientId: 'myID',
    @tuyapi/cloud time: 1534584774,
    @tuyapi/cloud postData: '{"token":"M4byJnXr"}',
    @tuyapi/cloud sid: 'az153442r2526951vxKzybb3e55dda0f3008986a3d2e77ca1881d5b5',
    @tuyapi/cloud sign: '6a68734d6e61cf5caee959cd7123dccc' } +4ms
  • Registering devices(s)... @tuyapi/cloud Received response: +526ms
    @tuyapi/cloud {"result":[],"t":1534584775761,"success":true,"status":"ok"}
    @tuyapi/cloud +4ms
    | Registering devices(s)... @tuyapi/cloud Sending parameters: +205ms
    @tuyapi/cloud { a: 'tuya.m.device.list.token',
    @tuyapi/cloud deviceId: '5fpd9gbt61dgwr5vz2y70xcj5xuj3e0xdqt5vqtnawht',
    @tuyapi/cloud os: 'Linux',
    @tuyapi/cloud lang: 'en',
    @tuyapi/cloud v: '1.0',
    @tuyapi/cloud clientId: 'myID',
    @tuyapi/cloud time: 1534584775,
    @tuyapi/cloud postData: '{"token":"M4byJnXr"}',
    @tuyapi/cloud sid: 'az153442r2526951vxKzybb3e55dda0f3008986a3d2e77ca1881d5b5',
    @tuyapi/cloud sign: '2e2059d4bf06cf422beb8eaa205c1644' } +4ms
    | Registering devices(s)... @tuyapi/cloud Received response: +526ms
    @tuyapi/cloud {"result":[],"t":1534584776498,"success":true,"status":"ok"}
    @tuyapi/cloud +4ms
  • Registering devices(s)... @tuyapi/cloud Sending parameters: +203ms
    @tuyapi/cloud { a: 'tuya.m.device.list.token',
    @tuyapi/cloud deviceId: '5fpd9gbt61dgwr5vz2y70xcj5xuj3e0xdqt5vqtnawht',
    @tuyapi/cloud os: 'Linux',
    @tuyapi/cloud lang: 'en',
    @tuyapi/cloud v: '1.0',
    @tuyapi/cloud clientId: 'myID',
    @tuyapi/cloud time: 1534584775,
    @tuyapi/cloud postData: '{"token":"M4byJnXr"}',
    @tuyapi/cloud sid: 'az153442r2526951vxKzybb3e55dda0f3008986a3d2e77ca1881d5b5',
    @tuyapi/cloud sign: '2e2059d4bf06cf422beb8eaa205c1644' } +2ms
  • Registering devices(s)... @tuyapi/cloud Received response: +629ms
    @tuyapi/cloud {"result":[],"t":1534584777333,"success":true,"status":"ok"}
    @tuyapi/cloud +4ms
    | Registering devices(s)... @tuyapi/cloud Sending parameters: +201ms
    @tuyapi/cloud { a: 'tuya.m.device.list.token',
    @tuyapi/cloud deviceId: '5fpd9gbt61dgwr5vz2y70xcj5xuj3e0xdqt5vqtnawht',
    @tuyapi/cloud os: 'Linux',
    @tuyapi/cloud lang: 'en',
    @tuyapi/cloud v: '1.0',
    @tuyapi/cloud clientId: 'myID',
    @tuyapi/cloud time: 1534584776,
    @tuyapi/cloud postData: '{"token":"M4byJnXr"}',
    @tuyapi/cloud sid: 'az153442r2526951vxKzybb3e55dda0f3008986a3d2e77ca1881d5b5',
    @tuyapi/cloud sign: 'b476c9b141cfcf5c501574df30eb87db' } +4ms
    | Registering devices(s)... @tuyapi/cloud Received response: +525ms
    @tuyapi/cloud {"result":[],"t":1534584778075,"success":true,"status":"ok"}
    @tuyapi/cloud +4ms
    / Registering devices(s)... @tuyapi/cloud Sending parameters: +202ms
    @tuyapi/cloud { a: 'tuya.m.device.list.token',
    @tuyapi/cloud deviceId: '5fpd9gbt61dgwr5vz2y70xcj5xuj3e0xdqt5vqtnawht',
    @tuyapi/cloud os: 'Linux',
    @tuyapi/cloud lang: 'en',
    @tuyapi/cloud v: '1.0',
    @tuyapi/cloud clientId: 'myID',
    @tuyapi/cloud time: 1534584777,
    @tuyapi/cloud postData: '{"token":"M4byJnXr"}',
    @tuyapi/cloud sid: 'az153442r2526951vxKzybb3e55dda0f3008986a3d2e77ca1881d5b5',
    @tuyapi/cloud sign: '8c62542333578bd8c5894327af0e380e' } +4ms
    / Registering devices(s)... @tuyapi/cloud Received response: +500ms
    @tuyapi/cloud {"result":[],"t":1534584778790,"success":true,"status":"ok"}
    @tuyapi/cloud +4ms
    \ Registering devices(s)... @tuyapi/cloud Sending parameters: +203ms
    @tuyapi/cloud { a: 'tuya.m.device.list.token',
    @tuyapi/cloud deviceId: '5fpd9gbt61dgwr5vz2y70xcj5xuj3e0xdqt5vqtnawht',
    @tuyapi/cloud os: 'Linux',
    @tuyapi/cloud lang: 'en',
    @tuyapi/cloud v: '1.0',
    @tuyapi/cloud clientId: 'myID',
    @tuyapi/cloud time: 1534584778,
    @tuyapi/cloud postData: '{"token":"M4byJnXr"}',
    @tuyapi/cloud sid: 'az153442r2526951vxKzybb3e55dda0f3008986a3d2e77ca1881d5b5',
    @tuyapi/cloud sign: 'd45ac6915e5ae6529e191eb62b9b42eb' } +4ms
    \ Registering devices(s)... @tuyapi/cloud Received response: +541ms
    @tuyapi/cloud {"result":[],"t":1534584779529,"success":true,"status":"ok"}
    @tuyapi/cloud +4ms
    / Registering devices(s)... @tuyapi/cloud Sending parameters: +203ms
    @tuyapi/cloud { a: 'tuya.m.device.list.token',
    @tuyapi/cloud deviceId: '5fpd9gbt61dgwr5vz2y70xcj5xuj3e0xdqt5vqtnawht',
    @tuyapi/cloud os: 'Linux',
    @tuyapi/cloud lang: 'en',
    @tuyapi/cloud v: '1.0',
    @tuyapi/cloud clientId: 'myID',
    @tuyapi/cloud time: 1534584778,
    @tuyapi/cloud postData: '{"token":"M4byJnXr"}',
    @tuyapi/cloud sid: 'az153442r2526951vxKzybb3e55dda0f3008986a3d2e77ca1881d5b5',
    @tuyapi/cloud sign: 'd45ac6915e5ae6529e191eb62b9b42eb' } +2ms
  • Registering devices(s)... @tuyapi/link:manual Sending SmartLink data packets +5s
    / Registering devices(s)... @tuyapi/cloud Received response: +592ms
    @tuyapi/cloud {"result":[],"t":1534584780333,"success":true,"status":"ok"}
    @tuyapi/cloud +4ms
    \ Registering devices(s)... @tuyapi/cloud Sending parameters: +201ms
    @tuyapi/cloud { a: 'tuya.m.device.list.token',
    @tuyapi/cloud deviceId: '5fpd9gbt61dgwr5vz2y70xcj5xuj3e0xdqt5vqtnawht',
    @tuyapi/cloud os: 'Linux',
    @tuyapi/cloud lang: 'en',
    @tuyapi/cloud v: '1.0',
    @tuyapi/cloud clientId: 'myID',
    @tuyapi/cloud time: 1534584779,
    @tuyapi/cloud postData: '{"token":"M4byJnXr"}',
    @tuyapi/cloud sid: 'az153442r2526951vxKzybb3e55dda0f3008986a3d2e77ca1881d5b5',
    @tuyapi/cloud sign: 'd979424725ed612765e9f2f9e3f75783' } +2ms`

Then what looks to be 37 seconds later.

`| Registering devices(s)... @tuyapi/cloud Received response: +591ms
@tuyapi/cloud {"result":[],"t":1534584817699,"success":true,"status":"ok"}
@tuyapi/cloud +4ms
/ Registering devices(s)... @tuyapi/link:manual Finished sending packets. +38s

  • Registering devices(s)... @tuyapi/cloud Sending parameters: +206ms
    @tuyapi/cloud { a: 'tuya.m.device.list.token',
    @tuyapi/cloud deviceId: '5fpd9gbt61dgwr5vz2y70xcj5xuj3e0xdqt5vqtnawht',
    @tuyapi/cloud os: 'Linux',
    @tuyapi/cloud lang: 'en',
    @tuyapi/cloud v: '1.0',
    @tuyapi/cloud clientId: 'myID',
    @tuyapi/cloud time: 1534584817,
    @tuyapi/cloud postData: '{"token":"M4byJnXr"}',
    @tuyapi/cloud sid: 'az153442r2526951vxKzybb3e55dda0f3008986a3d2e77ca1881d5b5',
    @tuyapi/cloud sign: '22915bddd1057fe029e9af2eae623397' } +3ms
    / Registering devices(s)... @tuyapi/cloud Received response: +523ms
    @tuyapi/cloud {"result":[],"t":1534584818428,"success":true,"status":"ok"}
    @tuyapi/cloud +6ms`

Then the same lines over and over for another 107 seconds until, sorry couldnt get the next block to format.

| Registering devices(s)... @tuyapi/cloud Sending parameters: +204ms @tuyapi/cloud { a: 'tuya.m.device.list.token', @tuyapi/cloud deviceId: '5fpd9gbt61dgwr5vz2y70xcj5xuj3e0xdqt5vqtnawht', @tuyapi/cloud os: 'Linux', @tuyapi/cloud lang: 'en', @tuyapi/cloud v: '1.0', @tuyapi/cloud clientId: 'myID', @tuyapi/cloud time: 1534584924, @tuyapi/cloud postData: '{"token":"M4byJnXr"}', @tuyapi/cloud sid: 'az153442r2526951vxKzybb3e55dda0f3008986a3d2e77ca1881d5b5', @tuyapi/cloud sign: '2217ac6a22004d3e69a19495f69635a2' } +4ms | Registering devices(s)... @tuyapi/cloud Received response: +500ms @tuyapi/cloud {"result":[],"t":1534584925516,"success":true,"status":"ok"} @tuyapi/cloud +4ms Device(s) failed to be registered! Error: Timed out wating for device(s) to connect to cloud at Promise (C:\Users\Stephen\AppData\Roaming\npm\node_modules\@tuyapi\cli\node_modules\@tuyapi\cloud\index.js:275:12) at <anonymous>

@stephenmhall
Copy link

After all this it might be a faulty unit. I can't register it using the Smart Life app either. Came as a pair and the first one registered fine on the app.

@stephenmhall
Copy link

I got this after 116 seconds trying the pre registered one. It did however remove it from the app. It was re discovered by the app ok.

× Device(s) failed to be registered! { HTTPError: Response code 400 (Bad Request) at stream.catch.then.data (C:\Users\Stephen\AppData\Roaming\npm\node_modules\@tuyapi\cli\node_modules\got\index.js:386:13) at <anonymous> at process._tickCallback (internal/process/next_tick.js:118:7) name: 'HTTPError', host: 'a1.tuyaus.com', hostname: 'a1.tuyaus.com', method: 'GET', path: '/api.json?a=tuya.m.device.list.token&deviceId=t4kisxbdd4jxf7vyt74qgg3qa3ba56ywjho27ozwon46&os=Linux&lang=en&v=1.0&clientId=n87gvu8wapamy9jyqp3q&time=1534592956&postData=%7B%22token%22%3A%22c5eWa3yj%22%7D&sid=az153442l2526951vHKzybK31984620d3bcd8f72b8b93b3e0a771f1d&sign=f63352d342c8e96250e79c709a5f20a1', protocol: 'https:', url: 'https://a1.tuyaus.com/api.json', statusCode: 400, statusMessage: 'Bad Request', headers: { date: 'Sat, 18 Aug 2018 11:49:17 GMT', server: 'Apache-Coyote/1.1', 'content-length': '0', connection: 'Close' } }

@codetheweb
Copy link
Owner

@stephenmhall are you in the U.S.? If not, your issue may stem from Tuya wanting you to use a different endpoint/server than the default. I just realized this in a different issue.

@stephenmhall
Copy link

stephenmhall commented Aug 19, 2018

No I'm in the UK. So I presume I need to edit some of the default details in tuya-cli? I see the endpoints are coded into the cloud/index.js file, does the link-wizard need some extra code to select endpoint when registering.

@lanceuppercut47
Copy link

I'm also having a similar problem and am in the UK, I am able to use the Tuya app on my phone to register it without issue but I get this when trying to do it this way:

Matts-MacBook-Pro:~ matt$ tuya-cli link-wizard
? Make the indicator light on your device flash.
For most devices, this means holding down the main button.
Press return when it's blinking. Yes
? What's your WiFi called? WIFI1111
? What's the password for your WiFi? [hidden]
? How many devices do you want to link? 1
? Do you want to save devices that are successfully linked? Yes
✖ Device(s) failed to be registered!
Error: Timed out wating for device(s) to connect to cloud
at Promise (/usr/local/lib/node_modules/@tuyapi/cli/node_modules/@tuyapi/cloud/index.js:275:12)

@codetheweb
Copy link
Owner

codetheweb commented Aug 20, 2018

For those in the UK: try the instructions below to see if the error is related to your region.

  1. Clone @tuyapi/link by running git clone https://github.com/TuyaAPI/link.git or downloading a zipped version of the master branch from Github.
  2. Move to the new directory (cd link on *nix) and create a new file called dev.js with the contents below:
const TuyaLink = require('./index.js');

const register = new TuyaLink.wizard({apiKey: '<your-api-key>',
                                      apiSecret: '<your-api-secret>',
                                      email: 'example@example.com', password: 'example-password',
                                      region: 'EU'});

register.init().then(sid => {
  register.linkDevice({ssid: '<your-ssid>', wifiPassword: '<your-wifi-password>'}).then(devices => {
  	console.log(devices)
  });

}).catch(err => {
  console.log(err)
});
  1. Replace the <*> placeholders with the appropriate values (the email and password parameters don't really matter).

  2. Run npm i to install dependencies.

  3. Run DEBUG=* node dev.js and paste the results.

@amitn16
Copy link

amitn16 commented Aug 23, 2018

Hi Team,

I am also facing similar issue, while running "tuya-cli link-wizard". It is throwing error in registering the plug with timeout error message.

I

bought plugs from China and it works well with Smart Life app and I am using these plugs in Norway..later it would be used in India also :).

Error

✖ Device(s) failed to be registered!
Error: Timed out wating for device(s) to connect to cloud
at Promise (/usr/local/lib/node_modules/@tuyapi/cli/node_modules/@tuyapi/cloud/index.js:275:12)

@codehearts
Copy link

I'm experiencing the same issue in the states, I attempt to register but it times out waiting for it to connect to the cloud. I have this Tonbux power strip but haven't tried setting it up with an app (I was hoping to avoid that)

DEBUG=* didn't seem to change anything, I get the same repeated lines detailed above.

@codetheweb
Copy link
Owner

Has anyone in this thread:

  • Resolved their issue?
  • Tried using the EU-region code above?
  • Got it working without changing anything?

@mafu-mac
Copy link

I was getting the same timeout problem trying to register my bulb from a Raspberry Pi here in the UK.
Many thanks for posting the code above - now says it's registered fine.

@codehearts
Copy link

I tried registering my device three times (the third time I unplugged and plugged the device back in while the link wizard ran), didn't work. I then tried with DEBUG=* and it worked for me 🤷‍♀️

@the-swissionary
Copy link

Hello,
Sadly, I was not that successful.
I too am getting the "timeout waiting for device(s)" message.
I did try pasting the code into dev.js
Sadly, this one almost instantly fails with an error, saying my session had expired. As I copy-pasted all the necessary items, I don't think I made a typo.
These are the last lines appearing in the debug:
@tuyapi/cloud { a: 'tuya.m.device.token.create',
@tuyapi/cloud deviceId: 'emcg84ujrzo19pltd1x7yxwoo2fe9wnn87o0cggzrems',
@tuyapi/cloud os: 'Linux',
@tuyapi/cloud lang: 'en',
@tuyapi/cloud v: '1.0',
@tuyapi/cloud clientId: 'p8fcw87cepukt98u5rnh',
@tuyapi/cloud time: 1535828794,
@tuyapi/cloud postData: '{"timeZone":"-05:00"}',
@tuyapi/cloud sid: 'az153582M80686451rLRjro3c47a810b55d3f0b46e342acd89f9dd1e
',
@tuyapi/cloud sign: 'cff1f48e5e76b7ce51a90fa5aada5285' } +1ms
@tuyapi/cloud Received response: +218ms
@tuyapi/cloud {"t":1535828794017,"success":false,"errorCode":"USER_SESSION_INV
ALID","status":"error","errorMsg":"Session Expired, please log in again"}

Is there anything I can try / check?
I am in Switzerland, so I guess EU as a region is correct.

@codetheweb
Copy link
Owner

Besides the region parameter, the other one that might affect stuff is the timezone.

@the-swissionary @amitn16 @lanceuppercut47 @stephenmhall

Try adjusting the timezone parameter in the below code with your UTC offset and see if it works:

const TuyaLink = require('./index.js');

const register = new TuyaLink.wizard({apiKey: '<your-api-key>',
                                      apiSecret: '<your-api-secret>',
                                      timezone: '-05:00',
                                      email: 'example@example.com', password: 'example-password',
                                      region: 'EU'});

register.init().then(sid => {
  register.linkDevice({ssid: '<your-ssid>', wifiPassword: '<your-wifi-password>'}).then(devices => {
  	console.log(devices)
  });

}).catch(err => {
  console.log(err)
});

@codehearts
Copy link

I've been able to register the device twice, but it takes a few hours of trying to connect. I tried changing the timezone but it's just as finicky. The default region should be ok since I'm in the US.

@codetheweb
Copy link
Owner

Huh. I'm really confused because it works flawlessly for me every single time.

@the-swissionary
Copy link

Well, I tried the new code you sent me (try to reply to your message via email, but somehow, my reply must have gotten stuck).
Sadly, adjusting the time zone to "02:00" and to "01:002 alone did not fix the "session expoired" error.
However, I experimentally tried to change the region code to "AZ" - because in the debug log, I saw that one been returned by what I guess was the tuya server.
Setting the region code to "AZ" at least does not give me the "session expired" message anymore, and the dev.js script runs perfectly.
Sadly, it still would not recognize or register my device. :-(
Mostly, the debug log shows this in repeat:
@tuyapi/cloud Sending parameters: +205ms
@tuyapi/cloud { a: 'tuya.m.device.list.token',
@tuyapi/cloud deviceId: 'd6pxx9dleh9ky0sivwy559v6mpchfr1axlhzgxzcio38',
@tuyapi/cloud os: 'Linux',
@tuyapi/cloud lang: 'en',
@tuyapi/cloud v: '1.0',
@tuyapi/cloud clientId: 'p8fcw87cepukt98u5rnh',
@tuyapi/cloud time: 1535832118,
@tuyapi/cloud postData: '{"token":"sjz1FO1p"}',
@tuyapi/cloud sid: 'az153574f0632470K9iQHQM39ef18d02eb85dfa875fd1dc7404d51f6
',
@tuyapi/cloud sign: 'd81405b15dce2e4d3db93fe3172977e2' } +0ms
@tuyapi/cloud Received response: +610ms
@tuyapi/cloud {"result":[],"t":1535832118572,"success":true,"status":"ok"}
@tuyapi/cloud +0ms
@tuyapi/cloud Sending parameters: +207ms
...
and so on.
What I don't see in the debug at all any sign of tuya-cli trying to somehow scan my wlan for a tuya device.
This makes me wonder: Is there anything I have to configure in my wlan settings?
curently, the raspberry pi connects to my network using its built-in wlan adapter.
Is that ok? Or does the wlan adapter have to remain not connected?

@chsims1
Copy link

chsims1 commented Sep 2, 2018

No joy here in UK. Tried EU region code:

@tuyapi/cloud Sending parameters: +0ms
@tuyapi/cloud { a: 'tuya.m.user.email.register',
@tuyapi/cloud deviceId: '5cf84u0il716lsutflgtb6wjk40r8xwdq18n3s65si4w',
@tuyapi/cloud os: 'Linux',
@tuyapi/cloud lang: 'en',
@tuyapi/cloud v: '1.0',
@tuyapi/cloud clientId: '',
@tuyapi/cloud time: 1535886159,
@tuyapi/cloud postData:
@tuyapi/cloud '{"countryCode":"EU","email":"example@example.com","passwd":"cc4436eff149ba9761aaac07b36360ea"}',
@tuyapi/cloud sign: '2aa222ade568b747f1d0e49d9d2eb85a' } +1ms
@tuyapi/cloud Received response: +529ms
@tuyapi/cloud {"t":1535886159131,"success":false,"errorCode":"USER_NAME_IS_EXIST","status":"error","errorMsg":"Username exists."}
@tuyapi/cloud +0ms
@tuyapi/cloud Sending parameters: +1ms
@tuyapi/cloud { a: 'tuya.m.user.email.password.login',
@tuyapi/cloud deviceId: '5cf84u0il716lsutflgtb6wjk40r8xwdq18n3s65si4w',
@tuyapi/cloud os: 'Linux',
@tuyapi/cloud lang: 'en',
@tuyapi/cloud v: '1.0',
@tuyapi/cloud clientId: '
',
@tuyapi/cloud time: 1535886159,
@tuyapi/cloud postData:
@tuyapi/cloud '{"countryCode":"EU","email":"example@example.com","passwd":"cc4436eff149ba9761aaac07b36360ea"}',
@tuyapi/cloud sign: 'b35d6b5cc1fbb64c1f6e77d6a9779dfc' } +0ms
@tuyapi/cloud Received response: +916ms
@tuyapi/cloud {"result":{"dataVersion":0,"timezone":"","sex":0,"accountType":1,"tempUnit":1,"mobile":"","headPic":"","sid":"az153588y5226667Csa4XsJ3e7e236f98de40c9e36a5b2d673afb8a5","ecode":"z2z555yy55118888","uid":"az1535885226667Ca4Xs","domain":{"gwApiUrl":"http://a.gw.tuyaus.com/gw.json","mobileApiUrl":"https://a1.tuyaus.com","regionCode":"AZ","deviceHttpUrl":"http://a.tuyaus.com","mobileMqttUrl":"mq.mb.tuyaus.com","deviceMediaMqttUrl":"s.tuyaus.com","pxApiUrl":"http://px.tuyaus.com","deviceHttpsUrl":"https://a2.tuyaus.com","deviceMqttsUrl":"m2.tuyaus.com","gwMqttUrl":"mq.gw.tuyaus.com","mobileMediaMqttUrl":"s.tuyaus.com","mobileMqttsUrl":"m1.tuyaus.com"},"nickname":"","phoneCode":"EU","timezoneId":"","userType":1,"partnerIdentity":"p1107934","email":"example@example.com","snsNickname":"","improveCompanyInfo":false,"username":"example@example.com"},"t":1535886160059,"success":true,"status":"ok"}
@tuyapi/cloud +0ms
@tuyapi/cloud Sending parameters: +2ms
@tuyapi/cloud { a: 'tuya.m.device.token.create',
@tuyapi/cloud deviceId: '5cf84u0il716lsutflgtb6wjk40r8xwdq18n3s65si4w',
@tuyapi/cloud os: 'Linux',
@tuyapi/cloud lang: 'en',
@tuyapi/cloud v: '1.0',
@tuyapi/cloud clientId: '
**************',
@tuyapi/cloud time: 1535886160,
@tuyapi/cloud postData: '{"timeZone":"+01:00"}',
@tuyapi/cloud sid: 'az153588y5226667Csa4XsJ3e7e236f98de40c9e36a5b2d673afb8a5',
@tuyapi/cloud sign: 'b5193a4f047e03944825ba398e765148' } +0ms
@tuyapi/cloud Received response: +136ms
@tuyapi/cloud {"t":1535886160283,"success":false,"errorCode":"USER_SESSION_INVALID","status":"error","errorMsg":"Session Expired, please log in again"}

Adding timezone didn't work either.

@amitn16
Copy link

amitn16 commented Sep 2, 2018

I am able to do that for tuyaapi but not able to integrate with openhab.
follow following..
install npm & timeout.. follow the procedure given in below link. ( cleanup would be good ) and then install tuyaapi.

cd /etc/openhab2/scripts
npm install codetheweb/tuyapi

https://github.com/unparagoned/njsTuya/blob/master/README.md

local key you have to find using capture packet. ( capture logs while connecting smart plug 1st time iwth Smartlife or any other similar app)
other details you can get by running > python njstuyamonitor.py >

you would able to control switch through command line using it.. but openhab integration.. I am still struggling.. any clue..

@codetheweb
Copy link
Owner

@the-swissionary the state of your WiFi adapter shouldn't matter as long as it's enabled; the setup process works by broadcasting a series of UDP packets that are sniffed by Tuya devices.

For those who are still struggling to get it to work: do you hear your device "click" during an unsuccessful setup?

@lanceuppercut47
Copy link

Mine doesn't click but I've given up using this new one until it's fixed, the old one works fine now that I know to assign an IP in the config.json

@jrcharles
Copy link

If anyone is still working on this...

I tried for days to make this work on my rp3 on ethernet.

I disconnected the ethernet and connected it to the built in wifi. Afterwards, I was able to reconnect the ethernet and it worked.

tuya-cli link-wizard set it up the first Time on both devices on wifi

@BillSobel
Copy link

BillSobel commented Oct 17, 2018 via email

@Apollon77
Copy link
Collaborator

I think "sharing the key" is a topic of trust because the owner of the account could access all devices and control them ... I do not know if someone is willing to share :-(

Key in App: shit :-(

Could it be an idea to contact them (the Tuya Cloud Guys) as "group of open source home automation developers" and ask them for maybe an "official" way supported from their side?

@Apollon77
Copy link
Collaborator

@codetheweb For an proxy you would need to also terminate the SSL and re-encrypt before sending to the real server ... so as "charles" is doing by injecting an own root cert in the phone ... puuhhh

@Apollon77
Copy link
Collaborator

@BillSobel
Copy link

BillSobel commented Oct 17, 2018 via email

@eddeandres
Copy link

eddeandres commented Oct 17, 2018 via email

@BillSobel
Copy link

BillSobel commented Oct 17, 2018 via email

@Apollon77
Copy link
Collaborator

I guess the other option is adding Tuya to Home Assistant and doing it that way.

What you mean with this? Or would the idea be to have "one" account for all the Home Assistant users ... I already thourght the same for ioBroker ...

@Apollon77
Copy link
Collaborator

Apollon77 commented Oct 17, 2018

From what I remember they pin the cert, so this wouldn’t work. I’ll have to go back and verify

But when capturing TLS traffic via Charles works then it should not be pinned because else also Charles would not work ... and I was also able to capture traffic using Charles with Smart Live App on iOS

@NorthernMan54
Copy link
Contributor

NorthernMan54 commented Oct 17, 2018 via email

@NorthernMan54
Copy link
Contributor

NorthernMan54 commented Oct 17, 2018 via email

@codetheweb
Copy link
Owner

codetheweb commented Oct 17, 2018

@Apollon77:
I have seen the anyproxy package, it's actually what I would probably base my implementation off of. I am not open to attempting to extract the key pair from Tuya's app for numerous reasons, including the simple fact that if a few hundred unauthorized people begin using it it's fairly easy for them to change.

The contents of the email that Tuya sent out (translated from Chinese):

respected user
Thank you for joining the big family of graffiti, now the graffiti launches the Amazon WWA quick certification free collar event, click to learn more!
Learn more
If you are unable to open the link above, you can try copying and pasting the link into your browser address:

@Apollon77
Copy link
Collaborator

Apollon77 commented Oct 18, 2018

@NorthernMan54 When I signed up for the API key I called it homebridge, if wanted we could just reuse it.

My question is, if they change this now, how future proof it will be to use it. I think the Proxy idea will be more future proof because they can kill the free API accounts any time (especially when they see "traffic" on one of them)

@Apollon77
Copy link
Collaborator

@codetheweb I have seen the anyproxy package, it's actually what I would probably base my implementation off of. I am not open to attempting to extract the key pair from Tuya's app for numerous reasons, including the simple fact that if a few hundred unauthorized people begin using it it's fairly easy for them to change.

agreed. I will also play around a bit with it ... I send you when I have something ... move this discussion to a new isseu?

@Apollon77
Copy link
Collaborator

Apollon77 commented Oct 18, 2018

@codetheweb I played around a bit with AnyProxy and was working basically good. It generates the certificate key for your computer so nothing shared. I configured it to intercept all https traffic when host contains "tuya" and catched the response when the response contained tuya.m.my.group.device.list . then you get that full blob of data:

{"result":[{"result":[{"uid":"eu1539013901029biqMB","password":"f19281c5141e8e5d","protocolVer":"2.1","code":"tymesh1539014046","pv":"2.1","name":"tymesh1539014046","share":false,"id":"mebf2c43e9fd12e74256mt","ownerId":"2019615","meshId":"mebf2c43e9fd12e74256mt","localKey":"ed0dd970be35cfbc"}],"a":"tuya.m.my.group.mesh.list","t":1539872261369,"success":true,"v":"1.0","status":"ok"},{"result":{"geoName":"xxxxxxxxxxx","rooms":[{"name":"Wohnzimmer","displayOrder":0,"id":910154},{"name":"Hauptschlafzimmer","displayOrder":1,"id":910155},{"name":"Zweit-Schlafzimmer","displayOrder":2,"id":910156},{"name":"Esszimmer","displayOrder":3,"id":910157},{"name":"Küche","displayOrder":4,"id":910158},{"name":"Arbeitszimmer","displayOrder":5,"id":910159}],"gid":2019615,"background":"","groupId":2019615,"displayOrder":0,"name":"Fischer","admin":true,"lon":0,"id":645961,"lat":0},"a":"tuya.m.location.get","t":1539872261369,"success":true,"v":"2.0","status":"ok"},{"result":[],"a":"tuya.m.my.group.device.group.list","t":1539872261368,"success":true,"v":"1.0","status":"ok"},{"result":[{"devId":"34305060807d3a1d7178","dpMaxTime":1539872229429,"virtual":false,"productId":"8FAPq5h6gdV51Vcr","dps":{"1":false,"2":0,"3":1,"4":146,"5":31,"6":2283},"activeTime":1539811217,"ip":"91.89.163.25","lon":"8.345742","moduleMap":{"wifi":{"upgradeStatus":0,"bv":"5.27","cdv":"1.0.0","pv":"2.1","verSw":"1.0.1","isOnline":true,"id":2957892,"cadv":""},"mcu":{"upgradeStatus":0,"cdv":"","verSw":"1.0.1","isOnline":true,"id":2957893,"cadv":""}},"uuid":"34305060807d3a1d7178","name":"Steckdose 2","timezoneId":"Europe/Berlin","iconUrl":"https://images.tuyaus.com/smart/icon/1521522457nf46uh6z3tk3jag1m6bfq1tt9_0.jpg","lat":"49.035767","runtimeEnv":"prod","localKey":"183a1aexxxxxxxxxx"}],"a":"tuya.m.my.group.device.list","t":1539872261380,"success":true,"v":"1.0","status":"ok"},{"result":[{"schemaInfo":{"schema":"[{\"mode\":\"rw\",\"code\":\"switch_on\",\"name\":\"开关\",\"property\":{\"type\":\"bool\"},\"iconname\":\"icon-dp_power3\",\"id\":1,\"type\":\"obj\",\"desc\":\"\"},{\"mode\":\"rw\",\"code\":\"countdown\",\"name\":\"延迟\",\"property\":{\"unit\":\"秒\",\"min\":0,\"max\":86400,\"scale\":0,\"step\":1,\"type\":\"value\"},\"id\":2,\"type\":\"obj\",\"passive\":true,\"desc\":\"\"},{\"mode\":\"ro\",\"code\":\"add_ele\",\"name\":\"电量\",\"property\":{\"unit\":\"度\",\"min\":0,\"max\":500000,\"scale\":3,\"step\":100,\"type\":\"value\"},\"id\":3,\"type\":\"obj\",\"desc\":\"上报的为放大100倍之后的值,即上报56,实际值为0.56度\"},{\"mode\":\"ro\",\"code\":\"cur_current\",\"name\":\"电流\",\"property\":{\"unit\":\"mA\",\"min\":0,\"max\":30000,\"scale\":0,\"step\":1,\"type\":\"value\"},\"id\":4,\"type\":\"obj\",\"desc\":\"\"},{\"mode\":\"ro\",\"code\":\"cur_power\",\"name\":\"功率\",\"property\":{\"unit\":\"W\",\"min\":0,\"max\":50000,\"scale\":0,\"step\":1,\"type\":\"value\"},\"id\":5,\"type\":\"obj\",\"desc\":\"\"},{\"mode\":\"ro\",\"code\":\"cur_voltage\",\"name\":\"电压\",\"property\":{\"unit\":\"V\",\"min\":0,\"max\":2500,\"scale\":0,\"step\":1,\"type\":\"value\"},\"id\":6,\"type\":\"obj\",\"desc\":\"\"}]","schemaExt":"[]"},"capability":1,"uiInfo":{"phase":"release","appRnVersion":"5.1","rnFind":true,"ui":"000000012x_0.2.5","id":661346,"type":"RN"},"panelConfig":{},"shortcut":{"quickOpDps":[],"faultDps":[],"displayDps":[1],"switchDp":1,"displayMsgs":{"quickop_dp_switch_on":"Schakelaar ","dp_switch_on_on":"ON","quickop_dp_switch_on_on":"ON","dp_switch_on_off":"OFF","dp_switch_on":"Schakelaar ","quickop_dp_switch_on_off":"OFF"}},"i18nTime":1533717958591,"id":"8FAPq5h6gdV51Vcr","attribute":918400,"category":"cz","supportGroup":true,"meshCategory":""}],"a":"tuya.m.device.ref.info.my.list","t":1539872261381,"success":true,"v":"1.0","status":"ok"},{"result":{"2":[{"children":{"4":[{"displayOrder":0,"id":"910154"},{"displayOrder":1,"id":"910155"},{"displayOrder":2,"id":"910156"},{"displayOrder":3,"id":"910157"},{"displayOrder":4,"id":"910158"},{"displayOrder":5,"id":"910159"}]},"id":"645961"}],"4":[{"children":{"6":[{"displayOrder":1,"id":"34305060807d3a1d7178"}]},"id":"910154"}]},"a":"tuya.m.my.group.device.relation.list","t":1539872261368,"success":true,"v":"1.0","status":"ok"},{"result":[],"a":"tuya.m.my.shared.device.group.list","t":1539872261368,"success":true,"v":"1.0","status":"ok"},{"result":[],"a":"tuya.m.my.shared.device.list","t":1539872261370,"success":true,"v":"1.0","status":"ok"}],"t":1539872261381,"success":true,"status":"ok"}

For me this would contain anything I would need. The devices, the localkeys and also the "data schema".

here the files. Install anyproxy via npm beforehand then simply execute node proxy.js ... web interface is also there for getting the certs file
proxy.zip

@eddeandres
Copy link

eddeandres commented Oct 18, 2018 via email

@Apollon77
Copy link
Collaborator

For my proxy code: would be great if someone with Android could test it tinder if the json is the same ...

@codetheweb
Copy link
Owner

@Apollon77 nice, thanks. I'll check it out. (The response for Android and iOS should be the same.) Created new issue #91 for discussion.

@eddeandres although most people are probably using Tuya devices with HA and Homebridge, I would prefer to retain the flexibility of using other options.

@Apollon77
Copy link
Collaborator

@eddeandres I still do not really get it ... I thought that also the python version uses the "get a free api account" idea, or not ?! If so the problems are the same in the end, or ?!

@S-K-Lieren
Copy link

@Apollon7:

You might want to anonymize the data you posted. Your home address is visible to the public.

@eddeandres
Copy link

eddeandres commented Oct 19, 2018 via email

@Apollon77
Copy link
Collaborator

@eddeandres interesting ... can you point ot the HA code for that so that I can have a look?!

@S-K-Lieren
Copy link

@Apollon77 There are still latitude and longitude values in your data 😝

@Apollon77
Copy link
Collaborator

Apollon77 commented Oct 19, 2018

Was stupid post ... because wrong

@Apollon77
Copy link
Collaborator

@eddeandres HA uses a Auth endpoint where they get a accesstoken and then use this to get device data on polling as a skill would do ... seems no way to get the localkey that way ...

@codetheweb
Copy link
Owner

I just pushed an update to tuya-cli that allows you to perform a MITM attack on your phone and easily acquire device parameters. Update with npm i @tuyapi/cli -g, then you should be able to run tuya-cli list-app. I also updated the documentation on setup.

Unfortunately, I realized after all this while writing the documentation that Android doesn't support installing root certificates for arbitrary apps. So Android users will have to use the old setup method for now (sorry about that). If you have any ideas on getting Android to work as well, I'd love to hear them.

A little sneak peak:
screen shot 2018-10-20 at 19 36 08

Closing this issue.

@uDude
Copy link

uDude commented Aug 14, 2019

This issue should be closed (again), but regarding the reversing of the android app and pulling the key from the image see:

https://github.com/nalajcie/tuya-sign-hacking

It's a neat bit of work.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests