From 2ab42f59b3c488f3ed41234bf46c875970ea88d9 Mon Sep 17 00:00:00 2001 From: "Teemu R." Date: Wed, 15 Jan 2025 14:33:05 +0100 Subject: [PATCH] Fallback to is_low for batterysensor's battery_low (#1420) Fallback to `is_low` if `at_low_battery` is not available. --- kasa/smart/modules/batterysensor.py | 42 +++++++++++++++++++---------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/kasa/smart/modules/batterysensor.py b/kasa/smart/modules/batterysensor.py index 87072b10..aef100fc 100644 --- a/kasa/smart/modules/batterysensor.py +++ b/kasa/smart/modules/batterysensor.py @@ -2,7 +2,11 @@ from __future__ import annotations +from typing import Annotated + +from ...exceptions import KasaException from ...feature import Feature +from ...module import FeatureAttribute from ..smartmodule import SmartModule @@ -14,18 +18,22 @@ class BatterySensor(SmartModule): def _initialize_features(self) -> None: """Initialize features.""" - self._add_feature( - Feature( - self._device, - "battery_low", - "Battery low", - container=self, - attribute_getter="battery_low", - icon="mdi:alert", - type=Feature.Type.BinarySensor, - category=Feature.Category.Debug, + if ( + "at_low_battery" in self._device.sys_info + or "is_low" in self._device.sys_info + ): + self._add_feature( + Feature( + self._device, + "battery_low", + "Battery low", + container=self, + attribute_getter="battery_low", + icon="mdi:alert", + type=Feature.Type.BinarySensor, + category=Feature.Category.Debug, + ) ) - ) # Some devices, like T110 contact sensor do not report the battery percentage if "battery_percentage" in self._device.sys_info: @@ -48,11 +56,17 @@ class BatterySensor(SmartModule): return {} @property - def battery(self) -> int: + def battery(self) -> Annotated[int, FeatureAttribute()]: """Return battery level.""" return self._device.sys_info["battery_percentage"] @property - def battery_low(self) -> bool: + def battery_low(self) -> Annotated[bool, FeatureAttribute()]: """Return True if battery is low.""" - return self._device.sys_info["at_low_battery"] + is_low = self._device.sys_info.get( + "at_low_battery", self._device.sys_info.get("is_low") + ) + if is_low is None: + raise KasaException("Device does not report battery low status") + + return is_low