1
0

__init__.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. """Library to handle connection with Switchbot"""
  2. import logging
  3. import bluepy
  4. UUID = "cba20d00-224d-11e6-9fb8-0002a5d5c51b"
  5. HANDLE = "cba20002-224d-11e6-9fb8-0002a5d5c51b"
  6. ON_KEY = "570101"
  7. OFF_KEY = "570102"
  8. _LOGGER = logging.getLogger(__name__)
  9. class Switchmate:
  10. """Representation of a Switchmate."""
  11. def __init__(self, mac) -> None:
  12. self._mac = mac
  13. def _sendpacket(self, key, retry=2) -> bool:
  14. try:
  15. device = bluepy.btle.Peripheral(self._mac,
  16. bluepy.btle.ADDR_TYPE_RANDOM)
  17. hand_service = device.getServiceByUUID(UUID)
  18. hand = hand_service.getCharacteristics(HANDLE)[0]
  19. hand.write(binascii.a2b_hex(key))
  20. device.disconnect()
  21. except bluepy.btle.BTLEException:
  22. _LOGGER.error("Cannot connect to switchbot.", exc_info=True)
  23. if retry < 1:
  24. return False
  25. self._sendpacket(key, retry-1)
  26. return True
  27. def update(self) -> None:
  28. """Synchronize state with switch."""
  29. try:
  30. return self._device.readCharacteristic(HANDLE) == ON_KEY
  31. except bluepy.btle.BTLEException:
  32. self._connect()
  33. def turn_on(self, **kwargs) -> None:
  34. """Turn device on."""
  35. return self._sendpacket(ON_KEY)
  36. def turn_off(self, **kwargs) -> None:
  37. """Turn device off."""
  38. return self._sendpacket(OFF_KEY)