Change state_information to return feature values (#804)

This changes `state_information` to return the names and values of
all defined features.
It was originally a "temporary" hack to show some extra, device-specific
information in the cli tool, but now that we have device-defined
features we can leverage them.
This commit is contained in:
Teemu R
2024-03-26 19:28:39 +01:00
committed by GitHub
parent d63f43a230
commit 35dbda7049
13 changed files with 70 additions and 115 deletions

View File

@@ -2,7 +2,7 @@
import logging
import re
from enum import Enum
from typing import Any, Dict, List, Optional, cast
from typing import Dict, List, Optional, cast
try:
from pydantic.v1 import BaseModel, Field, root_validator
@@ -462,23 +462,6 @@ class IotBulb(IotDevice, Bulb):
light_state = {"brightness": brightness}
return await self.set_light_state(light_state, transition=transition)
@property # type: ignore
@requires_update
def state_information(self) -> Dict[str, Any]:
"""Return bulb-specific state information."""
info: Dict[str, Any] = {
"Brightness": self.brightness,
"Is dimmable": self.is_dimmable,
}
if self.is_variable_color_temp:
info["Color temperature"] = self.color_temp
info["Valid temperature range"] = self.valid_temperature_range
if self.is_color:
info["HSV"] = self.hsv
info["Presets"] = self.presets
return info
@property # type: ignore
@requires_update
def is_on(self) -> bool:

View File

@@ -615,12 +615,6 @@ class IotDevice(Device):
return datetime.now().replace(microsecond=0) - timedelta(seconds=on_time)
@property # type: ignore
@requires_update
def state_information(self) -> Dict[str, Any]:
"""Return device-type specific, end-user friendly state information."""
raise NotImplementedError("Device subclass needs to implement this.")
@property # type: ignore
@requires_update
def device_id(self) -> str:

View File

@@ -232,12 +232,3 @@ class IotDimmer(IotPlug):
"""Whether the switch supports brightness changes."""
sys_info = self.sys_info
return "brightness" in sys_info
@property # type: ignore
@requires_update
def state_information(self) -> Dict[str, Any]:
"""Return switch-specific state information."""
info = super().state_information
info["Brightness"] = self.brightness
return info

View File

@@ -1,5 +1,5 @@
"""Module for light strips (KL430)."""
from typing import Any, Dict, List, Optional
from typing import Dict, List, Optional
from ..device_type import DeviceType
from ..deviceconfig import DeviceConfig
@@ -84,18 +84,6 @@ class IotLightStrip(IotBulb):
"""
return EFFECT_NAMES_V1 if self.has_effects else None
@property # type: ignore
@requires_update
def state_information(self) -> Dict[str, Any]:
"""Return strip specific state information."""
info = super().state_information
info["Length"] = self.length
if self.has_effects:
info["Effect"] = self.effect["name"]
return info
@requires_update
async def set_effect(
self,

View File

@@ -1,6 +1,6 @@
"""Module for smart plugs (HS100, HS110, ..)."""
import logging
from typing import Any, Dict, Optional
from typing import Optional
from ..device_type import DeviceType
from ..deviceconfig import DeviceConfig
@@ -99,12 +99,6 @@ class IotPlug(IotDevice):
"system", "set_led_off", {"off": int(not state)}
)
@property # type: ignore
@requires_update
def state_information(self) -> Dict[str, Any]:
"""Return switch-specific state information."""
return {}
class IotWallSwitch(IotPlug):
"""Representation of a TP-Link Smart Wall Switch."""

View File

@@ -154,19 +154,6 @@ class IotStrip(IotDevice):
"""Set the state of the led (night mode)."""
await self._query_helper("system", "set_led_off", {"off": int(not state)})
@property # type: ignore
@requires_update
def state_information(self) -> Dict[str, Any]:
"""Return strip-specific state information.
:return: Strip information dict, keys in user-presentable form.
"""
return {
"LED state": self.led,
"Childs count": len(self.children),
"On since": self.on_since,
}
async def current_consumption(self) -> float:
"""Get the current power consumption in watts."""
return sum([await plug.current_consumption() for plug in self.children])