google / python-lakeside

Apache License 2.0
45 stars 18 forks source link

Errors when running lakeside #14

Closed nmerket closed 5 years ago

nmerket commented 5 years ago

I have been using this library for months to control my lights from a raspberry pi zero (thanks!). In the past few days it hasn't been working. I get the following traceback:

Traceback (most recent call last):
  File "/home/pi/lights/env/lib/python3.5/site-packages/lakeside/__init__.py", line 82, in send_packet
    self.s.send(encrypted_packet)
AttributeError: 'bulb' object has no attribute 's'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "living_room_lights.py", line 47, in <module>
    switch_lights(args.off)
  File "living_room_lights.py", line 35, in switch_lights
    bulb.set_state(power=pwr)
  File "/home/pi/lights/env/lib/python3.5/site-packages/lakeside/__init__.py", line 187, in set_state
    packet.sequence = self.get_sequence()
  File "/home/pi/lights/env/lib/python3.5/site-packages/lakeside/__init__.py", line 134, in get_sequence
    return device.get_sequence(self)
  File "/home/pi/lights/env/lib/python3.5/site-packages/lakeside/__init__.py", line 115, in get_sequence
    response = self.send_packet(packet, True)
  File "/home/pi/lights/env/lib/python3.5/site-packages/lakeside/__init__.py", line 131, in send_packet
    return device.send_packet(self, packet, response)
  File "/home/pi/lights/env/lib/python3.5/site-packages/lakeside/__init__.py", line 84, in send_packet
    self.connect()

[the following lines repeated over and over]

  File "/home/pi/lights/env/lib/python3.5/site-packages/lakeside/__init__.py", line 128, in connect
    return device.connect(self)
  File "/home/pi/lights/env/lib/python3.5/site-packages/lakeside/__init__.py", line 66, in connect
    self.update()
  File "/home/pi/lights/env/lib/python3.5/site-packages/lakeside/__init__.py", line 192, in update
    response = self.get_status()
  File "/home/pi/lights/env/lib/python3.5/site-packages/lakeside/__init__.py", line 138, in get_status
    packet.sequence = self.get_sequence()
  File "/home/pi/lights/env/lib/python3.5/site-packages/lakeside/__init__.py", line 134, in get_sequence
    return device.get_sequence(self)
  File "/home/pi/lights/env/lib/python3.5/site-packages/lakeside/__init__.py", line 115, in get_sequence
    response = self.send_packet(packet, True)
  File "/home/pi/lights/env/lib/python3.5/site-packages/lakeside/__init__.py", line 131, in send_packet
    return device.send_packet(self, packet, response)
  File "/home/pi/lights/env/lib/python3.5/site-packages/lakeside/__init__.py", line 73, in send_packet
    cipher = AES.new(bytes(key), AES.MODE_CBC, bytes(iv))

[end repeated section]

  File "/home/pi/lights/env/lib/python3.5/site-packages/Crypto/Cipher/AES.py", line 232, in new
    return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs)
  File "/home/pi/lights/env/lib/python3.5/site-packages/Crypto/Cipher/__init__.py", line 79, in _create_cipher
    return modes[mode](factory, **kwargs)
  File "/home/pi/lights/env/lib/python3.5/site-packages/Crypto/Cipher/_mode_cbc.py", line 293, in _create_cbc_cipher
    return CbcMode(cipher_state, iv)
  File "/home/pi/lights/env/lib/python3.5/site-packages/Crypto/Cipher/_mode_cbc.py", line 95, in __init__
    self._state = VoidPointer()
  File "/home/pi/lights/env/lib/python3.5/site-packages/Crypto/Util/_raw_api.py", line 251, in VoidPointer
    return VoidPointer_ctypes()
RecursionError: maximum recursion depth exceeded

I'm using Python 3.5 with these packages installed.

astral==1.9.2
certifi==2018.11.29
chardet==3.0.4
idna==2.8
lakeside==0.11
pkg-resources==0.0.0
protobuf==3.6.1
pycryptodome==3.7.3
pytz==2018.9
PyYAML==3.13
requests==2.21.0
six==1.12.0
urllib3==1.24.1

I'm guessing this has something to do with Eufy changing their API. Has anyone else seen this and know how to fix it?

sebmos commented 5 years ago

Hey @nmerket ,

The error suggests that the connect() method isn't called before calling set_state(). The attribute s your error message mentions refers to the socket, which only gets created once connect() is called. Is that possible?

nmerket commented 5 years ago

@sebmos, yep that was it. The weird thing is that it used to work at all. Oh well. Thank you for your help.