light_strip.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. from __future__ import annotations
  2. from typing import Any
  3. from bleak.backends.device import BLEDevice
  4. from ..const import SwitchbotModel
  5. from ..const.light import ColorMode, StripLightColorMode
  6. from .base_light import SwitchbotSequenceBaseLight
  7. from .device import SwitchbotEncryptedDevice
  8. # Private mapping from device-specific color modes to original ColorMode enum
  9. _STRIP_LIGHT_COLOR_MODE_MAP = {
  10. StripLightColorMode.RGB: ColorMode.RGB,
  11. StripLightColorMode.SCENE: ColorMode.EFFECT,
  12. StripLightColorMode.MUSIC: ColorMode.EFFECT,
  13. StripLightColorMode.CONTROLLER: ColorMode.EFFECT,
  14. StripLightColorMode.COLOR_TEMP: ColorMode.COLOR_TEMP,
  15. StripLightColorMode.UNKNOWN: ColorMode.OFF,
  16. }
  17. LIGHT_STRIP_CONTROL_HEADER = "570F4901"
  18. COMMON_EFFECTS = {
  19. "christmas": [
  20. "570F49070200033C01",
  21. "570F490701000600009902006D0EFF0021",
  22. "570F490701000603009902006D0EFF0021",
  23. ],
  24. "halloween": ["570F49070200053C04", "570F490701000300FF6A009E00ED00EA0F"],
  25. "sunset": [
  26. "570F49070200033C3C",
  27. "570F490701000900FF9000ED8C04DD5800",
  28. "570F490701000903FF2E008E0B004F0500",
  29. "570F4907010009063F0010270056140033",
  30. ],
  31. "vitality": [
  32. "570F49070200053C02",
  33. "570F490701000600C5003FD9530AEC9800",
  34. "570F490701000603FFDF0000895500468B",
  35. ],
  36. "flashing": [
  37. "570F49070200053C02",
  38. "570F4907010006000000FF00FF00FF0000",
  39. "570F490701000603FFFF0000FFFFA020F0",
  40. ],
  41. "strobe": ["570F49070200043C02", "570F490701000300FF00E19D70FFFF0515"],
  42. "fade": [
  43. "570F49070200043C04",
  44. "570F490701000500FF5481FF00E19D70FF",
  45. "570F490701000503FF0515FF7FEB",
  46. ],
  47. "smooth": [
  48. "570F49070200033C02",
  49. "570F4907010007000036FC00F6FF00ED13",
  50. "570F490701000703F6FF00FF8300FF0800",
  51. "570F490701000706FF00E1",
  52. ],
  53. "forest": [
  54. "570F49070200033C06",
  55. "570F490701000400006400228B223CB371",
  56. "570F49070100040390EE90",
  57. ],
  58. "ocean": [
  59. "570F49070200033C06",
  60. "570F4907010007004400FF0061FF007BFF",
  61. "570F490701000703009DFF00B2FF00CBFF",
  62. "570F49070100070600E9FF",
  63. ],
  64. "autumn": [
  65. "570F49070200043C05",
  66. "570F490701000700D10035922D13A16501",
  67. "570F490701000703AB9100DD8C00F4AA29",
  68. "570F490701000706E8D000",
  69. ],
  70. "cool": [
  71. "570F49070200043C04",
  72. "570F490701000600001A63006C9A00468B",
  73. "570F490701000603009DA50089BE4378B6",
  74. ],
  75. "flow": [
  76. "570F49070200033C02",
  77. "570F490701000600FF00D8E100FFAA00FF",
  78. "570F4907010006037F00FF5000FF1900FF",
  79. ],
  80. "relax": [
  81. "570F49070200033C03",
  82. "570F490701000400FF8C00FF7200FF1D00",
  83. "570F490701000403FF5500",
  84. ],
  85. "modern": [
  86. "570F49070200043C03",
  87. "570F49070100060089231A5F8969829E5A",
  88. "570F490701000603BCB05EEDBE5AFF9D60",
  89. ],
  90. "rose": [
  91. "570F49070200043C04",
  92. "570F490701000500FF1969BC215F7C0225",
  93. "570F490701000503600C2B35040C",
  94. ],
  95. }
  96. class SwitchbotLightStrip(SwitchbotSequenceBaseLight):
  97. """Representation of a Switchbot light strip."""
  98. _effect_dict = COMMON_EFFECTS
  99. _turn_on_command = f"{LIGHT_STRIP_CONTROL_HEADER}01"
  100. _turn_off_command = f"{LIGHT_STRIP_CONTROL_HEADER}02"
  101. _set_rgb_command = f"{LIGHT_STRIP_CONTROL_HEADER}12{{}}"
  102. _set_color_temp_command = f"{LIGHT_STRIP_CONTROL_HEADER}11{{}}"
  103. _set_brightness_command = f"{LIGHT_STRIP_CONTROL_HEADER}14{{}}"
  104. _get_basic_info_command = ["570003", "570f4A01"]
  105. @property
  106. def color_modes(self) -> set[ColorMode]:
  107. """Return the supported color modes."""
  108. return {ColorMode.RGB}
  109. @property
  110. def color_mode(self) -> ColorMode:
  111. """Return the current color mode."""
  112. device_mode = StripLightColorMode(self._get_adv_value("color_mode") or 10)
  113. return _STRIP_LIGHT_COLOR_MODE_MAP.get(device_mode, ColorMode.OFF)
  114. async def get_basic_info(self) -> dict[str, Any] | None:
  115. """Get device basic settings."""
  116. if not (
  117. res := await self._get_multi_commands_results(self._get_basic_info_command)
  118. ):
  119. return None
  120. _version_info, _data = res
  121. self._state["r"] = _data[3]
  122. self._state["g"] = _data[4]
  123. self._state["b"] = _data[5]
  124. self._state["cw"] = int.from_bytes(_data[7:9], "big")
  125. return {
  126. "isOn": bool(_data[1] & 0b10000000),
  127. "brightness": _data[2] & 0b01111111,
  128. "r": self._state["r"],
  129. "g": self._state["g"],
  130. "b": self._state["b"],
  131. "cw": self._state["cw"],
  132. "color_mode": _data[10] & 0b00001111,
  133. "firmware": _version_info[2] / 10.0,
  134. }
  135. class SwitchbotStripLight3(SwitchbotEncryptedDevice, SwitchbotLightStrip):
  136. """Support for switchbot strip light3 and floor lamp."""
  137. def __init__(
  138. self,
  139. device: BLEDevice,
  140. key_id: str,
  141. encryption_key: str,
  142. interface: int = 0,
  143. model: SwitchbotModel = SwitchbotModel.STRIP_LIGHT_3,
  144. **kwargs: Any,
  145. ) -> None:
  146. super().__init__(device, key_id, encryption_key, model, interface, **kwargs)
  147. @classmethod
  148. async def verify_encryption_key(
  149. cls,
  150. device: BLEDevice,
  151. key_id: str,
  152. encryption_key: str,
  153. model: SwitchbotModel = SwitchbotModel.STRIP_LIGHT_3,
  154. **kwargs: Any,
  155. ) -> bool:
  156. return await super().verify_encryption_key(
  157. device, key_id, encryption_key, model, **kwargs
  158. )
  159. @property
  160. def color_modes(self) -> set[ColorMode]:
  161. """Return the supported color modes."""
  162. return {ColorMode.RGB, ColorMode.COLOR_TEMP}