jasonacox/tuyapower

Tuya switch - firmware 1.4.2

pesor opened this issue · 9 comments

pesor commented

I just tested this, and I get no data, only a rubbish string.

The plug is a Shenzhen WiFi smart plug
I have a suspicion that the protocol again have changed, the firmware ver in the plug is 1.4.2.
I am situated in Europe, I do not know if that is an issue.

I got the local key from tuya-cli list-app:
Set your HTTP proxy IP to 192.168.1.238 with port 8001.
This machine has 3 IPs; to choose a different one, use the --ip option.
✔ Response intercepted.
Devices(s):
[
{
name: 'DEV123456789',
id: 'bf20d8688f946386bd7rjo',
key: '582a2be355a6ffb4'
}
]

this is the output from your test.py, with additional print statements from the Crypto module.
Crypto importet
crypto is NOT none
in if crypto AESCipher
in if crypto self._pad(raw) b'{"gwId":"bf20d8688f946386bd7rj0","devId":"bf20d8688f946386bd7rj0"}\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10'
crypted_text 1 %r b'\x86a\x85\x92\xeaD\xc5 ,\xa9]vLz>\x1ceY\xc6\xc2\x94\x94\xc4\x99\x0e\x8aE\xe7\xd2\xbe\x9fz]\xa1\x18!\x9b\xe8\x94Y\x0c\x9d\x9f\xac\r\xde;\xa8AN\x1b\xef\x11F\xb9]\xa7o\xb0{1^\x9c\xe4A*\xb4\x0c\x1c\x90\xa7\xe4\xdd\xa0"\x83zp\x13\x1e'
crypted_text 2 lenght (%d) %r 80
in if crypto AESCipher
in if crypto self._pad(raw) b'{"gwId":"bf20d8688f946386bd7rj0","devId":"bf20d8688f946386bd7rj0"}\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10'
crypted_text 1 %r b'\x86a\x85\x92\xeaD\xc5 ,\xa9]vLz>\x1ceY\xc6\xc2\x94\x94\xc4\x99\x0e\x8aE\xe7\xd2\xbe\x9fz]\xa1\x18!\x9b\xe8\x94Y\x0c\x9d\x9f\xac\r\xde;\xa8AN\x1b\xef\x11F\xb9]\xa7o\xb0{1^\x9c\xe4A*\xb4\x0c\x1c\x90\xa7\xe4\xdd\xa0"\x83zp\x13\x1e'
crypted_text 2 lenght (%d) %r 80
ERROR: Timeout polling device

TuyaPower (Tuya Power Stats)

Device bf20d8688f946386bd7rj0 at 192.168.1.98 key 582a2be355a6ffb4 protocol 3.3:
Switch On: False
Power (W): -99.000000
Current (mA): -99.000000
Voltage (V): -99.000000
Projected usage (kWh): Day: -2.376000 Week: -16.632000 Month: -72.072000

{ "datetime": "2020-01-12T13:00:50Z", "switch": "False", "power": "-99", "current": "-99", "voltage": "-99" }

It shows you are using protocol 3.3. Try forcing protocol 3.1 and see what happens:

export PLUGVERS=3.1 && python tuyatest.py bf20d8688f946386bd7rj0 192.168.1.98 582a2be355a6ffb4

pesor commented

I tried with your suggestion, and got the following result:

Device bf6d7bd92f9f526e6enec9 at 192.168.1.109 key 0123456789abcdef protocol 3.1:
Switch On: False
Power (W): -99.000000
Current (mA): -99.000000
Voltage (V): -99.000000
Projected usage (kWh): Day: -2.376000 Week: -16.632000 Month: -72.072000

{ "datetime": "2020-01-24T09:53:55Z", "switch": "False", "power": "-99", "current": "-99", "voltage": "-99" }

Thanks @pesor I'm not sure if this is an encryption issue or a response change for the 1.4.2 firmware. Can you try running the following commands from python directly and paste the output?

$ python
>>> import pytuya
>>> d = pytuya.OutletDevice('bf6d7bd92f9f526e6enec9', '192.168.1.109', '582a2be355a6ffb4')
>>> d.set_version(3.3)
>>> d.status()

Also, in case it isn't using protocol 3.3, try this:

$ python
>>> import pytuya
>>> d = pytuya.OutletDevice('bf6d7bd92f9f526e6enec9', '192.168.1.109', '582a2be355a6ffb4')
>>> d.status()

Sometimes d.status() will fail with a socket error so try it a few times. If it works, you should get something like this:
{u'devId': u'bf6d7bd92f9f526e6enec9', u'dps': {u'1': True, u'2': 0, u'5': 59, u'4': 54, u'6': 1203}}

I have added a tool scan.py to this repo that will listen to your local network for Tuya compatible devices that are broadcasting their IP, Device ID and protocol Version. Give this a try. Also scan-enc.py provides a bit more information and attempts to decrypt payloads from some devices.

I have the same problem, with the newfirmware the port is 6668 in TCP.

@magostinelli do you see the device if you run a scan: python -m tuyapower?

Also I'll do some research on firmwares using 6668. What device are you using?

I use a docker image build from the repository, inside there is a scan.py that i run, It doesn't found anything:
docker run -it tuyapower
Scanning on UDP ports 6666 and 6668 for devices...

Scan Complete! Found 0 devices.

I have this devices: tekin smart plug (https://www.amazon.it/gp/product/B07CWQGP9C/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1)

I think i have the same problem.
My Wifi-switch: https://www.amazon.de/gp/product/B07B7G1TF7/ref=ppx_yo_dt_b_asin_title_o08_s00?ie=UTF8&psc=1

Firmware: 1.0.2

First I run scan.py. everything okay.
Then when I run test.py i get following output:
``
TuyaPower (Tuya Power Stats)

Device 107200463c71bf3d9f13 at 192.168.1.120 key fcLzUB4zWk95xYdk protocol 3.3:
Switch On: False
Power (W): -99.000000
Current (mA): -99.000000
Voltage (V): -99.000000
Projected usage (kWh): Day: -2.376000 Week: -16.632000 Month: -72.072000

{ "datetime": "2020-04-13T16:45:35Z", "switch": "False", "power": "-99", "current": "-99", "voltage": "-99" }

I tried your hint with:
$ python

import pytuya
d = pytuya.OutletDevice('bf6d7bd92f9f526e6enec9', '192.168.1.109', '582a2be355a6ffb4')
d.set_version(3.3)
d.status()
or
$ python
import pytuya
d = pytuya.OutletDevice('bf6d7bd92f9f526e6enec9', '192.168.1.109', '582a2be355a6ffb4')
d.status()
This is the output:
Traceback (most recent call last):
File "", line 1, in
File "/home/pi/env/lib/python3.5/site-packages/pytuya/init.py", line 281, in status
data = self._send_receive(payload)
File "/home/pi/env/lib/python3.5/site-packages/pytuya/init.py", line 179, in _send_receive
data = s.recv(1024)
socket.timeout: timed out
``

I think I found the problem! I just realized that your Device ID is 22 character. The pytuya library was designed to only support 20 character Device IDs which is what all of my devices have.

Since pytuya is no longer maintained, I created a forked and modified version tinytuya that incorporates 22 character support discovered by rospogrigio (https://github.com/rospogrigio/localtuya-homeassistant) and added support for that intuyapower v0.0.23.

Try updating and see if this correct the timeout issue:

pip install tinytuya
pip install --upgrade tuyapower