mirror of
https://github.com/natekspencer/hacs-oasis_mini.git
synced 2025-11-15 08:33:52 -05:00
Handle empty color code
This commit is contained in:
@@ -68,8 +68,10 @@ class OasisMiniLightEntity(OasisMiniEntity, LightEntity):
|
|||||||
return self.device.brightness > 0
|
return self.device.brightness > 0
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def rgb_color(self) -> tuple[int, int, int]:
|
def rgb_color(self) -> tuple[int, int, int] | None:
|
||||||
"""Return the rgb color value [int, int, int]."""
|
"""Return the rgb color value [int, int, int]."""
|
||||||
|
if not self.device.color:
|
||||||
|
return None
|
||||||
return rgb_hex_to_rgb_list(self.device.color.replace("#", ""))
|
return rgb_hex_to_rgb_list(self.device.color.replace("#", ""))
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|||||||
@@ -2,10 +2,11 @@
|
|||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
from typing import Any, Awaitable, Callable, Final
|
from typing import Any, Awaitable, Final
|
||||||
from urllib.parse import urljoin
|
from urllib.parse import urljoin
|
||||||
|
|
||||||
from aiohttp import ClientResponseError, ClientSession
|
from aiohttp import ClientResponseError, ClientSession
|
||||||
|
import async_timeout
|
||||||
|
|
||||||
from .const import TRACKS
|
from .const import TRACKS
|
||||||
from .utils import _bit_to_bool
|
from .utils import _bit_to_bool
|
||||||
@@ -32,25 +33,6 @@ AUTOPLAY_MAP = {
|
|||||||
"4": "30 minutes",
|
"4": "30 minutes",
|
||||||
}
|
}
|
||||||
|
|
||||||
ATTRIBUTES: Final[list[tuple[str, Callable[[str], Any]]]] = [
|
|
||||||
("status_code", int), # see status code map
|
|
||||||
("error", int), # error, 0 = none, and 10 = ?, 18 = can't download?
|
|
||||||
("ball_speed", int), # 200 - 1000
|
|
||||||
("playlist", lambda value: [int(track) for track in value.split(",") if track]), # noqa: E501 # comma separated track ids
|
|
||||||
("playlist_index", int), # index of above
|
|
||||||
("progress", int), # 0 - max svg path
|
|
||||||
("led_effect", str), # led effect (code lookup)
|
|
||||||
("led_color_id", str), # led color id?
|
|
||||||
("led_speed", int), # -90 - 90
|
|
||||||
("brightness", int), # noqa: E501 # 0 - 200 in app, but seems to be 0 (off) to 304 (max), then repeats
|
|
||||||
("color", str), # hex color code
|
|
||||||
("busy", _bit_to_bool), # noqa: E501 # device is busy (downloading track, centering, software update)?
|
|
||||||
("download_progress", int), # 0 - 100%
|
|
||||||
("max_brightness", int),
|
|
||||||
("wifi_connected", _bit_to_bool),
|
|
||||||
("repeat_playlist", _bit_to_bool),
|
|
||||||
("autoplay", AUTOPLAY_MAP.get),
|
|
||||||
]
|
|
||||||
|
|
||||||
LED_EFFECTS: Final[dict[str, str]] = {
|
LED_EFFECTS: Final[dict[str, str]] = {
|
||||||
"0": "Solid",
|
"0": "Solid",
|
||||||
@@ -92,7 +74,7 @@ class OasisMini:
|
|||||||
autoplay: str
|
autoplay: str
|
||||||
brightness: int
|
brightness: int
|
||||||
busy: bool
|
busy: bool
|
||||||
color: str
|
color: str | None = None
|
||||||
download_progress: int
|
download_progress: int
|
||||||
error: int
|
error: int
|
||||||
led_effect: str
|
led_effect: str
|
||||||
@@ -223,14 +205,39 @@ class OasisMini:
|
|||||||
|
|
||||||
async def async_get_status(self) -> str:
|
async def async_get_status(self) -> str:
|
||||||
"""Get the status from the device."""
|
"""Get the status from the device."""
|
||||||
status = await self._async_get(params={"GETSTATUS": ""})
|
raw_status = await self._async_get(params={"GETSTATUS": ""})
|
||||||
_LOGGER.debug("Status: %s", status)
|
_LOGGER.debug("Status: %s", raw_status)
|
||||||
for index, value in enumerate(status.split(";")):
|
values = raw_status.split(";")
|
||||||
attr, func = ATTRIBUTES[index]
|
playlist = [int(track) for track in values[3].split(",") if track]
|
||||||
if (old_value := getattr(self, attr, None)) != (value := func(value)):
|
status = {
|
||||||
_LOGGER.debug("%s changed: '%s' -> '%s'", attr, old_value, value)
|
"status_code": int(values[0]), # see status code map
|
||||||
setattr(self, attr, value)
|
"error": int(values[1]), # noqa: E501; error, 0 = none, and 10 = ?, 18 = can't download?
|
||||||
return status
|
"ball_speed": int(values[2]), # 200 - 1000
|
||||||
|
"playlist": playlist,
|
||||||
|
"playlist_index": min(int(values[4]), len(playlist)), # index of above
|
||||||
|
"progress": int(values[5]), # 0 - max svg path
|
||||||
|
"led_effect": values[6], # led effect (code lookup)
|
||||||
|
"led_color_id": values[7], # led color id?
|
||||||
|
"led_speed": int(values[8]), # -90 - 90
|
||||||
|
"brightness": int(values[9]) if values[10] else 0, # noqa: E501; 0 - 200 in app, but seems to be 0 (off) to 304 (max), then repeats
|
||||||
|
"color": values[10] or None, # hex color code
|
||||||
|
"busy": _bit_to_bool(values[11]), # noqa: E501; device is busy (downloading track, centering, software update)?
|
||||||
|
"download_progress": int(values[12]),
|
||||||
|
"max_brightness": int(values[13]),
|
||||||
|
"wifi_connected": _bit_to_bool(values[14]),
|
||||||
|
"repeat_playlist": _bit_to_bool(values[15]),
|
||||||
|
"autoplay": AUTOPLAY_MAP.get(values[16]),
|
||||||
|
}
|
||||||
|
for key, value in status.items():
|
||||||
|
if (old_value := getattr(self, key, None)) != value:
|
||||||
|
_LOGGER.debug(
|
||||||
|
"%s changed: '%s' -> '%s'",
|
||||||
|
key.replace("_", " ").capitalize(),
|
||||||
|
old_value,
|
||||||
|
value,
|
||||||
|
)
|
||||||
|
setattr(self, key, value)
|
||||||
|
return raw_status
|
||||||
|
|
||||||
async def async_move_track(self, _from: int, _to: int) -> None:
|
async def async_move_track(self, _from: int, _to: int) -> None:
|
||||||
"""Move a track in the playlist."""
|
"""Move a track in the playlist."""
|
||||||
@@ -278,7 +285,7 @@ class OasisMini:
|
|||||||
if led_effect is None:
|
if led_effect is None:
|
||||||
led_effect = self.led_effect
|
led_effect = self.led_effect
|
||||||
if color is None:
|
if color is None:
|
||||||
color = self.color
|
color = self.color or "#ffffff"
|
||||||
if led_speed is None:
|
if led_speed is None:
|
||||||
led_speed = self.led_speed
|
led_speed = self.led_speed
|
||||||
if brightness is None:
|
if brightness is None:
|
||||||
|
|||||||
Reference in New Issue
Block a user