Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 14 additions & 6 deletions homeassistant/components/tplink/light.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@

LIGHT_STATE_DFT_ON = "dft_on_state"
LIGHT_STATE_ON_OFF = "on_off"
LIGHT_STATE_RELAY_STATE = "relay_state"
LIGHT_STATE_BRIGHTNESS = "brightness"
LIGHT_STATE_COLOR_TEMP = "color_temp"
LIGHT_STATE_HUE = "hue"
Expand Down Expand Up @@ -116,6 +117,7 @@ class LightFeatures(NamedTuple):
supported_features: int
min_mireds: float
max_mireds: float
has_emeter: bool


class TPLinkSmartBulb(Light):
Expand Down Expand Up @@ -273,8 +275,9 @@ def _get_light_features(self):
model = sysinfo[LIGHT_SYSINFO_MODEL]
min_mireds = None
max_mireds = None
has_emeter = self.smartbulb.has_emeter

if sysinfo.get(LIGHT_SYSINFO_IS_DIMMABLE):
if sysinfo.get(LIGHT_SYSINFO_IS_DIMMABLE) or LIGHT_STATE_BRIGHTNESS in sysinfo:
supported_features += SUPPORT_BRIGHTNESS
if sysinfo.get(LIGHT_SYSINFO_IS_VARIABLE_COLOR_TEMP):
supported_features += SUPPORT_COLOR_TEMP
Expand All @@ -294,6 +297,7 @@ def _get_light_features(self):
supported_features=supported_features,
min_mireds=min_mireds,
max_mireds=max_mireds,
has_emeter=has_emeter,
)

def _get_light_state_retry(self) -> LightState:
Expand Down Expand Up @@ -348,7 +352,7 @@ def _get_light_state(self) -> LightState:
return self._light_state_from_params(self._get_device_state())

def _update_emeter(self):
if not self.smartbulb.has_emeter:
if not self._light_features.has_emeter:
return

now = dt_util.utcnow()
Expand Down Expand Up @@ -434,10 +438,11 @@ def _get_device_state(self):
if isinstance(self.smartbulb, SmartBulb):
return self.smartbulb.get_light_state()

sysinfo = self.smartbulb.sys_info
# Its not really a bulb, its a dimmable SmartPlug (aka Wall Switch)
return {
LIGHT_STATE_ON_OFF: self.smartbulb.state,
LIGHT_STATE_BRIGHTNESS: self.smartbulb.brightness,
LIGHT_STATE_ON_OFF: sysinfo[LIGHT_STATE_RELAY_STATE],
LIGHT_STATE_BRIGHTNESS: sysinfo.get(LIGHT_STATE_BRIGHTNESS, 0),
LIGHT_STATE_COLOR_TEMP: 0,
LIGHT_STATE_HUE: 0,
LIGHT_STATE_SATURATION: 0,
Expand All @@ -456,9 +461,12 @@ def _set_device_state(self, state):
if state[LIGHT_STATE_BRIGHTNESS]:
self.smartbulb.brightness = state[LIGHT_STATE_BRIGHTNESS]
else:
self.smartbulb.state = 0
self.smartbulb.state = self.smartbulb.SWITCH_STATE_OFF
elif LIGHT_STATE_ON_OFF in state:
self.smartbulb.state = state[LIGHT_STATE_ON_OFF]
if state[LIGHT_STATE_ON_OFF]:
self.smartbulb.state = self.smartbulb.SWITCH_STATE_ON
else:
self.smartbulb.state = self.smartbulb.SWITCH_STATE_OFF

return self._get_device_state()

Expand Down
42 changes: 20 additions & 22 deletions tests/components/tplink/test_light.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ class SmartSwitchMockData(NamedTuple):
"""Mock smart switch data."""

sys_info: dict
light_state: dict
state_mock: Mock
brightness_mock: Mock
get_sysinfo_mock: Mock
Expand Down Expand Up @@ -188,28 +187,28 @@ def dimmer_switch_mock_data_fixture() -> None:
"model": "HS220",
"alias": "dimmer1",
"feature": ":",
}

light_state = {
"on_off": 1,
"relay_state": 1,
"brightness": 13,
}

def state(*args, **kwargs):
nonlocal light_state
nonlocal sys_info
if len(args) == 0:
return light_state["on_off"]
light_state["on_off"] = args[0]
return sys_info["relay_state"]
if args[0] == "ON":
sys_info["relay_state"] = 1
else:
sys_info["relay_state"] = 0

def brightness(*args, **kwargs):
nonlocal light_state
nonlocal sys_info
if len(args) == 0:
return light_state["brightness"]
if light_state["brightness"] == 0:
light_state["on_off"] = 0
return sys_info["brightness"]
if sys_info["brightness"] == 0:
sys_info["relay_state"] = 0
else:
light_state["on_off"] = 1
light_state["brightness"] = args[0]
sys_info["relay_state"] = 1
sys_info["brightness"] = args[0]

get_sysinfo_patch = patch(
"homeassistant.components.tplink.common.SmartDevice.get_sysinfo",
Expand All @@ -228,7 +227,6 @@ def brightness(*args, **kwargs):
with brightness_patch as brightness_mock, state_patch as state_mock, get_sysinfo_patch as get_sysinfo_mock:
yield SmartSwitchMockData(
sys_info=sys_info,
light_state=light_state,
brightness_mock=brightness_mock,
state_mock=state_mock,
get_sysinfo_mock=get_sysinfo_mock,
Expand All @@ -247,7 +245,7 @@ async def test_smartswitch(
hass: HomeAssistant, dimmer_switch_mock_data: SmartSwitchMockData
) -> None:
"""Test function."""
light_state = dimmer_switch_mock_data.light_state
sys_info = dimmer_switch_mock_data.sys_info

await async_setup_component(hass, HA_DOMAIN, {})
await hass.async_block_till_done()
Expand Down Expand Up @@ -276,7 +274,7 @@ async def test_smartswitch(
await update_entity(hass, "light.dimmer1")

assert hass.states.get("light.dimmer1").state == "off"
assert light_state["on_off"] == 0
assert sys_info["relay_state"] == 0

await hass.services.async_call(
LIGHT_DOMAIN,
Expand All @@ -290,7 +288,7 @@ async def test_smartswitch(
state = hass.states.get("light.dimmer1")
assert state.state == "on"
assert state.attributes["brightness"] == 48.45
assert light_state["on_off"] == 1
assert sys_info["relay_state"] == 1

await hass.services.async_call(
LIGHT_DOMAIN,
Expand All @@ -304,10 +302,10 @@ async def test_smartswitch(
state = hass.states.get("light.dimmer1")
assert state.state == "on"
assert state.attributes["brightness"] == 53.55
assert light_state["brightness"] == 21
assert sys_info["brightness"] == 21

light_state["on_off"] = 0
light_state["brightness"] = 66
sys_info["relay_state"] = 0
sys_info["brightness"] = 66

await hass.services.async_call(
LIGHT_DOMAIN,
Expand All @@ -330,7 +328,7 @@ async def test_smartswitch(
state = hass.states.get("light.dimmer1")
assert state.state == "on"
assert state.attributes["brightness"] == 168.3
assert light_state["brightness"] == 66
assert sys_info["brightness"] == 66


async def test_light(hass: HomeAssistant, light_mock_data: LightMockData) -> None:
Expand Down