66from datetime import timedelta
77
88from ..const .evaporative_humidifier import (
9- OVER_HUMIDIFY_PROTECTION_MODES ,
10- TARGET_HUMIDITY_MODES ,
119 HumidifierMode ,
1210 HumidifierWaterLevel ,
1311)
12+ from ..helpers import celsius_to_fahrenheit
1413
1514_LOGGER = logging .getLogger (__name__ )
1615
2322# Low: 658000c5222b6300
2423# Med: 658000c5432b6300
2524# High: 658000c5642b6300
25+
26+
27+ def calculate_temperature_and_humidity (
28+ data : bytes , is_meter_binded : bool = True
29+ ) -> tuple [float | None , float | None , int | None ]:
30+ """Calculate temperature and humidity based on the given flag."""
31+ if len (data ) < 3 or not is_meter_binded :
32+ return None , None , None
33+
34+ humidity = data [0 ] & 0b01111111
35+ if humidity > 100 :
36+ return None , None , None
37+
38+ _temp_sign = 1 if data [1 ] & 0b10000000 else - 1
39+ _temp_c = _temp_sign * ((data [1 ] & 0b01111111 ) + ((data [2 ] >> 4 ) / 10 ))
40+ _temp_f = celsius_to_fahrenheit (_temp_c )
41+
42+ return _temp_c , _temp_f , humidity
43+
44+
2645def process_wohumidifier (
2746 data : bytes | None , mfr_data : bytes | None
2847) -> dict [str , bool | int ]:
@@ -46,48 +65,43 @@ def process_evaporative_humidifier(
4665) -> dict [str , bool | int ]:
4766 """Process WoHumi services data."""
4867 if mfr_data is None :
49- return {
50- "isOn" : None ,
51- "mode" : None ,
52- "target_humidity" : None ,
53- "child_lock" : None ,
54- "over_humidify_protection" : None ,
55- "tank_removed" : None ,
56- "tilted_alert" : None ,
57- "filter_missing" : None ,
58- "humidity" : None ,
59- "temperature" : None ,
60- "filter_run_time" : None ,
61- "filter_alert" : None ,
62- "water_level" : None ,
63- }
68+ return {}
6469
70+ seq_number = mfr_data [6 ]
6571 is_on = bool (mfr_data [7 ] & 0b10000000 )
6672 mode = HumidifierMode (mfr_data [7 ] & 0b00001111 )
67- filter_run_time = timedelta (hours = int .from_bytes (mfr_data [12 :14 ], byteorder = "big" ))
68- has_humidity = bool (mfr_data [9 ] & 0b10000000 )
69- has_temperature = bool (mfr_data [10 ] & 0b10000000 )
70- is_tank_removed = bool (mfr_data [8 ] & 0b00000100 )
73+ over_humidify_protection = bool (mfr_data [8 ] & 0b10000000 )
74+ child_lock = bool (mfr_data [8 ] & 0b00100000 )
75+ tank_removed = bool (mfr_data [8 ] & 0b00000100 )
76+ tilted_alert = bool (mfr_data [8 ] & 0b00000010 )
77+ filter_missing = bool (mfr_data [8 ] & 0b00000001 )
78+ is_meter_binded = bool (mfr_data [9 ] & 0b10000000 )
79+
80+ _temp_c , _temp_f , humidity = calculate_temperature_and_humidity (
81+ mfr_data [9 :12 ], is_meter_binded
82+ )
83+
84+ water_level = HumidifierWaterLevel (mfr_data [11 ] & 0b00000011 ).name .lower ()
85+ filter_run_time = timedelta (
86+ hours = int .from_bytes (mfr_data [12 :14 ], byteorder = "big" ) & 0xFFF
87+ )
88+ target_humidity = mfr_data [16 ] & 0b01111111
89+
7190 return {
91+ "seq_number" : seq_number ,
7292 "isOn" : is_on ,
73- "mode" : mode if is_on else None ,
74- "target_humidity" : (mfr_data [16 ] & 0b01111111 )
75- if is_on and mode in TARGET_HUMIDITY_MODES
76- else None ,
77- "child_lock" : bool (mfr_data [8 ] & 0b00100000 ),
78- "over_humidify_protection" : bool (mfr_data [8 ] & 0b10000000 )
79- if is_on and mode in OVER_HUMIDIFY_PROTECTION_MODES
80- else None ,
81- "tank_removed" : is_tank_removed ,
82- "tilted_alert" : bool (mfr_data [8 ] & 0b00000010 ),
83- "filter_missing" : bool (mfr_data [8 ] & 0b00000001 ),
84- "humidity" : (mfr_data [9 ] & 0b01111111 ) if has_humidity else None ,
85- "temperature" : float (mfr_data [10 ] & 0b01111111 ) + float (mfr_data [11 ] >> 4 ) / 10
86- if has_temperature
87- else None ,
93+ "mode" : mode ,
94+ "over_humidify_protection" : over_humidify_protection ,
95+ "child_lock" : child_lock ,
96+ "tank_removed" : tank_removed ,
97+ "tilted_alert" : tilted_alert ,
98+ "filter_missing" : filter_missing ,
99+ "is_meter_binded" : is_meter_binded ,
100+ "humidity" : humidity ,
101+ "temperature" : _temp_c ,
102+ "temp" : {"c" : _temp_c , "f" : _temp_f },
103+ "water_level" : water_level ,
88104 "filter_run_time" : filter_run_time ,
89105 "filter_alert" : filter_run_time .days >= 10 ,
90- "water_level" : HumidifierWaterLevel (mfr_data [11 ] & 0b00000011 )
91- if not is_tank_removed
92- else None ,
106+ "target_humidity" : target_humidity ,
93107 }
0 commit comments