Switch light colormode to be bitfields instead of enums (#95)

This commit is contained in:
Otto Winter 2021-08-25 13:45:28 +02:00 committed by GitHub
parent b5047689c7
commit 6f131f4bf6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 154 additions and 218 deletions

View File

@ -356,18 +356,6 @@ message FanCommandRequest {
}
// ==================== LIGHT ====================
enum ColorMode {
COLOR_MODE_UNKNOWN = 0;
COLOR_MODE_ON_OFF = 1;
COLOR_MODE_BRIGHTNESS = 2;
COLOR_MODE_WHITE = 7;
COLOR_MODE_COLOR_TEMPERATURE = 11;
COLOR_MODE_COLD_WARM_WHITE = 19;
COLOR_MODE_RGB = 35;
COLOR_MODE_RGB_WHITE = 39;
COLOR_MODE_RGB_COLOR_TEMPERATURE = 47;
COLOR_MODE_RGB_COLD_WARM_WHITE = 51;
}
message ListEntitiesLightResponse {
option (id) = 15;
option (source) = SOURCE_SERVER;
@ -378,7 +366,7 @@ message ListEntitiesLightResponse {
string name = 3;
string unique_id = 4;
repeated ColorMode supported_color_modes = 12;
repeated int32 supported_color_modes = 12;
// next four supports_* are for legacy clients, newer clients should use color modes
bool legacy_supports_brightness = 5 [deprecated=true];
bool legacy_supports_rgb = 6 [deprecated=true];
@ -398,7 +386,7 @@ message LightStateResponse {
fixed32 key = 1;
bool state = 2;
float brightness = 3;
ColorMode color_mode = 11;
int32 color_mode = 11;
float color_brightness = 10;
float red = 4;
float green = 5;
@ -421,7 +409,7 @@ message LightCommandRequest {
bool has_brightness = 4;
float brightness = 5;
bool has_color_mode = 22;
ColorMode color_mode = 23;
int32 color_mode = 23;
bool has_color_brightness = 20;
float color_brightness = 21;
bool has_rgb = 6;

File diff suppressed because one or more lines are too long

View File

@ -88,7 +88,6 @@ from .model import (
FanState,
HomeassistantServiceCall,
LegacyCoverCommand,
LightColorMode,
LightInfo,
LightState,
LogLevel,
@ -431,7 +430,7 @@ class APIClient:
key: int,
state: Optional[bool] = None,
brightness: Optional[float] = None,
color_mode: Optional[LightColorMode] = None,
color_mode: Optional[int] = None,
color_brightness: Optional[float] = None,
rgb: Optional[Tuple[float, float, float]] = None,
white: Optional[float] = None,

View File

@ -210,23 +210,19 @@ class FanState(EntityState):
# ==================== LIGHT ====================
class LightColorMode(APIIntEnum):
UNKNOWN = 0
ON_OFF = 1
BRIGHTNESS = 2
WHITE = 7
COLOR_TEMPERATURE = 11
COLD_WARM_WHITE = 19
RGB = 35
RGB_WHITE = 39
RGB_COLOR_TEMPERATURE = 47
RGB_COLD_WARM_WHITE = 51
class LightColorCapability(enum.IntFlag):
ON_OFF = 1 << 0
BRIGHTNESS = 1 << 1
WHITE = 1 << 2
COLOR_TEMPERATURE = 1 << 3
COLD_WARM_WHITE = 1 << 4
RGB = 1 << 5
@dataclass(frozen=True)
class LightInfo(EntityInfo):
supported_color_modes: List[LightColorMode] = converter_field(
default_factory=list, converter=LightColorMode.convert_list
supported_color_modes: List[int] = converter_field(
default_factory=list, converter=list
)
min_mireds: float = 0.0
max_mireds: float = 0.0
@ -238,9 +234,7 @@ class LightInfo(EntityInfo):
legacy_supports_white_value: bool = False
legacy_supports_color_temperature: bool = False
def supported_color_modes_compat(
self, api_version: APIVersion
) -> List[LightColorMode]:
def supported_color_modes_compat(self, api_version: APIVersion) -> List[int]:
if api_version < APIVersion(1, 6):
key = (
self.legacy_supports_brightness,
@ -251,16 +245,42 @@ class LightInfo(EntityInfo):
# map legacy flags to color modes,
# key: (brightness, rgb, white, color_temp)
modes_map = {
(False, False, False, False): [LightColorMode.ON_OFF],
(True, False, False, False): [LightColorMode.BRIGHTNESS],
(True, False, False, True): [LightColorMode.COLOR_TEMPERATURE],
(True, True, False, False): [LightColorMode.RGB],
(True, True, True, False): [LightColorMode.RGB_WHITE],
(True, True, False, True): [LightColorMode.RGB_COLOR_TEMPERATURE],
(True, True, True, True): [LightColorMode.RGB_COLOR_TEMPERATURE],
(False, False, False, False): [LightColorCapability.ON_OFF],
(True, False, False, False): [
LightColorCapability.ON_OFF | LightColorCapability.BRIGHTNESS
],
(True, False, False, True): [
LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS
| LightColorCapability.COLOR_TEMPERATURE
],
(True, True, False, False): [
LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS
| LightColorCapability.RGB
],
(True, True, True, False): [
LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS
| LightColorCapability.RGB
| LightColorCapability.WHITE
],
(True, True, False, True): [
LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS
| LightColorCapability.RGB
| LightColorCapability.COLOR_TEMPERATURE
],
(True, True, True, True): [
LightColorCapability.ON_OFF
| LightColorCapability.BRIGHTNESS
| LightColorCapability.RGB
| LightColorCapability.WHITE
| LightColorCapability.COLOR_TEMPERATURE
],
}
return modes_map[key] if key in modes_map else []
return cast(List[int], modes_map[key]) if key in modes_map else []
return self.supported_color_modes
@ -269,9 +289,7 @@ class LightInfo(EntityInfo):
class LightState(EntityState):
state: bool = False
brightness: float = 0.0
color_mode: Optional[LightColorMode] = converter_field(
default=LightColorMode.UNKNOWN, converter=LightColorMode.convert
)
color_mode: int = 0
color_brightness: float = 0.0
red: float = 0.0
green: float = 0.0