From 633a009d5e19b90dbd15b48713e339b959423eaf Mon Sep 17 00:00:00 2001 From: Patrik Lindgren <21142447+ggravlingen@users.noreply.github.com> Date: Tue, 1 Feb 2022 17:17:24 +0000 Subject: [PATCH 1/5] Add new properties --- pytradfri/const.py | 5 +++++ pytradfri/device/air_purifier.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/pytradfri/const.py b/pytradfri/const.py index 94b763c2..ce201dc7 100644 --- a/pytradfri/const.py +++ b/pytradfri/const.py @@ -21,6 +21,11 @@ ATTR_AIR_PURIFIER_MODE = "5900" ATTR_AIR_PURIFIER_MODE_AUTO = 1 +ATTR_AIR_PURIFIER_FILTER_RUNTIME = "5902" +ATTR_AIR_PURIFIER_FILTER_STATUS = "5903" +ATTR_AIR_PURIFIER_FILTER_LIFETIME_TOTAL = "5904" +ATTR_AIR_PURIFIER_MOTOR_RUNTIME_TOTAL = "5909" +ATTR_AIR_PURIFIER_FILTER_LIFETIME_REMAINING = "5910" ATTR_AIR_PURIFIER_CONTROLS_LOCKED = "5905" ATTR_AIR_PURIFIER_LEDS_OFF = "5906" ATTR_AIR_PURIFIER_AIR_QUALITY = "5907" diff --git a/pytradfri/device/air_purifier.py b/pytradfri/device/air_purifier.py index 5c8544c1..f1cc2363 100644 --- a/pytradfri/device/air_purifier.py +++ b/pytradfri/device/air_purifier.py @@ -7,9 +7,14 @@ ATTR_AIR_PURIFIER_AIR_QUALITY, ATTR_AIR_PURIFIER_CONTROLS_LOCKED, ATTR_AIR_PURIFIER_FAN_SPEED, + ATTR_AIR_PURIFIER_FILTER_LIFETIME_REMAINING, + ATTR_AIR_PURIFIER_FILTER_LIFETIME_TOTAL, + ATTR_AIR_PURIFIER_FILTER_RUNTIME, + ATTR_AIR_PURIFIER_FILTER_STATUS, ATTR_AIR_PURIFIER_LEDS_OFF, ATTR_AIR_PURIFIER_MODE, ATTR_AIR_PURIFIER_MODE_AUTO, + ATTR_AIR_PURIFIER_MOTOR_RUNTIME_TOTAL, ROOT_AIR_PURIFIER, ) from ..resource import TypeRaw, TypeRawList @@ -35,6 +40,31 @@ def raw(self) -> TypeRaw: cast(TypeRawList, self.device.raw)[ROOT_AIR_PURIFIER][self.index], ) + @property + def motor_runtime_total(self) -> int: + """Return runtime of fan motor, expressed in [x].""" + return cast(int, self.raw[ATTR_AIR_PURIFIER_MOTOR_RUNTIME_TOTAL]) + + @property + def filter_lifetime_total(self) -> int: + """Return total lifetime of filter, expressed in [x].""" + return cast(int, self.raw[ATTR_AIR_PURIFIER_FILTER_LIFETIME_TOTAL]) + + @property + def filter_status(self) -> int: + """Return filter status, expressed in [x].""" + return cast(int, self.raw[ATTR_AIR_PURIFIER_FILTER_STATUS]) + + @property + def filter_lifetime_remaining(self) -> int: + """Return remaining lifetime of filter, expressed in [x].""" + return cast(int, self.raw[ATTR_AIR_PURIFIER_FILTER_LIFETIME_REMAINING]) + + @property + def filter_runtime(self) -> int: + """Return filter runtime, expressed in [x].""" + return cast(int, self.raw[ATTR_AIR_PURIFIER_FILTER_RUNTIME]) + @property def is_auto_mode(self) -> bool: """ From 207f80d6e5b48500c90e68b70d6c88c17e207250 Mon Sep 17 00:00:00 2001 From: Patrik Lindgren <21142447+ggravlingen@users.noreply.github.com> Date: Sat, 5 Feb 2022 08:21:53 +0000 Subject: [PATCH 2/5] Add tests --- tests/test_air_purifiers.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/tests/test_air_purifiers.py b/tests/test_air_purifiers.py index f8a998e3..412617ab 100644 --- a/tests/test_air_purifiers.py +++ b/tests/test_air_purifiers.py @@ -62,3 +62,38 @@ def test_leds_off(device): air_purifier = device.air_purifier_control.air_purifiers[0] assert not air_purifier.leds_off + + +def test_motor_runtime_total(device): + """Test motor's total runtime.""" + + air_purifier = device.air_purifier_control.air_purifiers[0] + assert air_purifier.motor_runtime_total == 2 + + +def test_filter_lifetime_total(device): + """Test filter's total life time.""" + + air_purifier = device.air_purifier_control.air_purifiers[0] + assert air_purifier.filter_lifetime_total == 259200 + + +def test_filter_status(device): + """Test filter status.""" + + air_purifier = device.air_purifier_control.air_purifiers[0] + assert air_purifier.filter_status == 0 + + +def test_filter_lifetime_remaining(device): + """Test remaining life of filter.""" + + air_purifier = device.air_purifier_control.air_purifiers[0] + assert air_purifier.filter_lifetime_remaining == 259198 + + +def test_filter_runtime(device): + """Test filter's run time.""" + + air_purifier = device.air_purifier_control.air_purifiers[0] + assert air_purifier.filter_runtime == 2 From d9f661ac9a8a6ea68508f902495ebc5f4a5b2a1d Mon Sep 17 00:00:00 2001 From: Patrik Lindgren <21142447+ggravlingen@users.noreply.github.com> Date: Sat, 5 Feb 2022 08:34:12 +0000 Subject: [PATCH 3/5] Add units --- pytradfri/device/air_purifier.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pytradfri/device/air_purifier.py b/pytradfri/device/air_purifier.py index f7673b9b..eb76ae52 100644 --- a/pytradfri/device/air_purifier.py +++ b/pytradfri/device/air_purifier.py @@ -62,27 +62,27 @@ def raw(self) -> TypeAirPurifier: @property def motor_runtime_total(self) -> int: - """Return runtime of fan motor, expressed in [x].""" + """Return runtime of fan motor, expressed in minutes.""" return self.raw[ATTR_AIR_PURIFIER_MOTOR_RUNTIME_TOTAL] @property def filter_lifetime_total(self) -> int: - """Return total lifetime of filter, expressed in [x].""" + """Return total lifetime of filter, expressed in minutes.""" return self.raw[ATTR_AIR_PURIFIER_FILTER_LIFETIME_TOTAL] @property def filter_status(self) -> int: - """Return filter status, expressed in [x].""" + """Return filter status.""" return self.raw[ATTR_AIR_PURIFIER_FILTER_STATUS] @property def filter_lifetime_remaining(self) -> int: - """Return remaining lifetime of filter, expressed in [x].""" + """Return remaining lifetime of filter, expressed in minutes.""" return self.raw[ATTR_AIR_PURIFIER_FILTER_LIFETIME_REMAINING] @property def filter_runtime(self) -> int: - """Return filter runtime, expressed in [x].""" + """Return filter runtime, expressed in minutes.""" return self.raw[ATTR_AIR_PURIFIER_FILTER_RUNTIME] @property From c95d6d9a2ec7782f01b2aba907b69288368545cb Mon Sep 17 00:00:00 2001 From: Patrik Lindgren <21142447+ggravlingen@users.noreply.github.com> Date: Sat, 5 Feb 2022 10:36:54 +0000 Subject: [PATCH 4/5] Filter properties --- pytradfri/device/air_purifier.py | 86 ++++++++++++++++---------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/pytradfri/device/air_purifier.py b/pytradfri/device/air_purifier.py index eb76ae52..d4b02cbe 100644 --- a/pytradfri/device/air_purifier.py +++ b/pytradfri/device/air_purifier.py @@ -53,38 +53,50 @@ def __init__(self, device: Device, index: int) -> None: self.index = index @property - def raw(self) -> TypeAirPurifier: - """Return raw data that it represents.""" - return cast( - TypeAirPurifier, - cast(TypeRawList, self.device.raw)[ROOT_AIR_PURIFIER][self.index], - ) + def air_quality(self) -> int: + """Get the current air quality measured by the air purifier. - @property - def motor_runtime_total(self) -> int: - """Return runtime of fan motor, expressed in minutes.""" - return self.raw[ATTR_AIR_PURIFIER_MOTOR_RUNTIME_TOTAL] + 0..35: Good + 36..85: OK + 86..: Not good + 65535: If the fan is off or during measuring time after turning on + """ + return self.raw[ATTR_AIR_PURIFIER_AIR_QUALITY] @property - def filter_lifetime_total(self) -> int: - """Return total lifetime of filter, expressed in minutes.""" - return self.raw[ATTR_AIR_PURIFIER_FILTER_LIFETIME_TOTAL] + def controls_locked(self) -> bool: + """Return True if physical controls on the air purifier are locked.""" + return self.raw[ATTR_AIR_PURIFIER_CONTROLS_LOCKED] == 1 @property - def filter_status(self) -> int: - """Return filter status.""" - return self.raw[ATTR_AIR_PURIFIER_FILTER_STATUS] + def fan_speed(self) -> int: + """Get the current fan speed of the air purifier. + + 0: Device is off + 2..50: Fan speed with a step size of 1. + """ + return self.raw[ATTR_AIR_PURIFIER_FAN_SPEED] @property def filter_lifetime_remaining(self) -> int: """Return remaining lifetime of filter, expressed in minutes.""" return self.raw[ATTR_AIR_PURIFIER_FILTER_LIFETIME_REMAINING] + @property + def filter_lifetime_total(self) -> int: + """Return total lifetime of filter, expressed in minutes.""" + return self.raw[ATTR_AIR_PURIFIER_FILTER_LIFETIME_TOTAL] + @property def filter_runtime(self) -> int: """Return filter runtime, expressed in minutes.""" return self.raw[ATTR_AIR_PURIFIER_FILTER_RUNTIME] + @property + def filter_status(self) -> int: + """Return filter status.""" + return self.raw[ATTR_AIR_PURIFIER_FILTER_STATUS] + @property def is_auto_mode(self) -> bool: """ @@ -94,37 +106,25 @@ def is_auto_mode(self) -> bool: """ return self.raw[ATTR_AIR_PURIFIER_MODE] == ATTR_AIR_PURIFIER_MODE_AUTO - @property - def state(self) -> bool: - """Return device state, ie on or off.""" - return self.raw[ATTR_AIR_PURIFIER_MODE] > 0 - - @property - def fan_speed(self) -> int: - """Get the current fan speed of the air purifier. - - 0: Device is off - 2..50: Fan speed with a step size of 1. - """ - return self.raw[ATTR_AIR_PURIFIER_FAN_SPEED] - - @property - def controls_locked(self) -> bool: - """Return True if physical controls on the air purifier are locked.""" - return self.raw[ATTR_AIR_PURIFIER_CONTROLS_LOCKED] == 1 - @property def leds_off(self) -> bool: """Return True if led's on the air purifier are turned off.""" return self.raw[ATTR_AIR_PURIFIER_LEDS_OFF] == 1 @property - def air_quality(self) -> int: - """Get the current air quality measured by the air purifier. + def motor_runtime_total(self) -> int: + """Return runtime of fan motor, expressed in minutes.""" + return self.raw[ATTR_AIR_PURIFIER_MOTOR_RUNTIME_TOTAL] - 0..35: Good - 36..85: OK - 86..: Not good - 65535: If the fan is off or during measuring time after turning on - """ - return self.raw[ATTR_AIR_PURIFIER_AIR_QUALITY] + @property + def raw(self) -> TypeAirPurifier: + """Return raw data that it represents.""" + return cast( + TypeAirPurifier, + cast(TypeRawList, self.device.raw)[ROOT_AIR_PURIFIER][self.index], + ) + + @property + def state(self) -> bool: + """Return device state, ie on or off.""" + return self.raw[ATTR_AIR_PURIFIER_MODE] > 0 From 06d4125c639691bf03458cb5ed794711f7a01540 Mon Sep 17 00:00:00 2001 From: Patrik Lindgren <21142447+ggravlingen@users.noreply.github.com> Date: Sat, 5 Feb 2022 10:39:43 +0000 Subject: [PATCH 5/5] Sort constants --- pytradfri/const.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pytradfri/const.py b/pytradfri/const.py index 2b10c8ea..65116f2b 100644 --- a/pytradfri/const.py +++ b/pytradfri/const.py @@ -21,17 +21,17 @@ ATTR_BLIND_CURRENT_POSITION = "5536" ATTR_BLIND_TRIGGER = "5523" +ATTR_AIR_PURIFIER_MODE: Final = "5900" ATTR_AIR_PURIFIER_FILTER_RUNTIME: Final = "5902" ATTR_AIR_PURIFIER_FILTER_STATUS: Final = "5903" ATTR_AIR_PURIFIER_FILTER_LIFETIME_TOTAL: Final = "5904" -ATTR_AIR_PURIFIER_MOTOR_RUNTIME_TOTAL: Final = "5909" -ATTR_AIR_PURIFIER_FILTER_LIFETIME_REMAINING: Final = "5910" -ATTR_AIR_PURIFIER_MODE: Final = "5900" -ATTR_AIR_PURIFIER_MODE_AUTO: Final = 1 ATTR_AIR_PURIFIER_CONTROLS_LOCKED: Final = "5905" ATTR_AIR_PURIFIER_LEDS_OFF: Final = "5906" ATTR_AIR_PURIFIER_AIR_QUALITY: Final = "5907" ATTR_AIR_PURIFIER_FAN_SPEED: Final = "5908" +ATTR_AIR_PURIFIER_MOTOR_RUNTIME_TOTAL: Final = "5909" +ATTR_AIR_PURIFIER_FILTER_LIFETIME_REMAINING: Final = "5910" +ATTR_AIR_PURIFIER_MODE_AUTO: Final = 1 ATTR_CERTIFICATE_PEM = "9096" ATTR_CERTIFICATE_PROV = "9092"