Skip to content

Commit dc88780

Browse files
committed
Major Update
1 parent 593bfe4 commit dc88780

29 files changed

+1296
-615
lines changed

custom_components/kocom_wallpad/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from homeassistant.config_entries import ConfigEntry
88

99
from .gateway import KocomGateway
10-
from .const import DOMAIN, LOGGER
10+
from .const import DOMAIN
1111

1212
PLATFORMS: list[Platform] = [
1313
Platform.BINARY_SENSOR,

custom_components/kocom_wallpad/binary_sensor.py

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,17 @@
1313
from homeassistant.helpers.entity_platform import AddEntitiesCallback
1414
from homeassistant.helpers.dispatcher import async_dispatcher_connect
1515

16-
from .pywallpad.const import STATE, ERROR_CODE, TIME
17-
from .pywallpad.packet import (
16+
from .pywallpad.api.kocom.const import STATE, ERROR_CODE, TIME
17+
from .pywallpad.api.kocom.packet import (
1818
KocomPacket,
1919
ThermostatPacket,
2020
FanPacket,
21-
MotionPacket
21+
MotionPacket,
2222
)
2323

2424
from .gateway import KocomGateway
2525
from .entity import KocomEntity
26-
from .const import DOMAIN, LOGGER, DEVICE_TYPE, ROOM_ID, SUB_ID
26+
from .const import DOMAIN, DEVICE_TYPE, ROOM_ID, SUB_ID
2727

2828

2929
async def async_setup_entry(
@@ -41,8 +41,6 @@ def async_add_binary_sensor(packet: KocomPacket) -> None:
4141
async_add_entities([KocomBinarySensorEntity(gateway, packet)])
4242
elif isinstance(packet, MotionPacket):
4343
async_add_entities([KocomMotionEntity(gateway, packet)])
44-
else:
45-
LOGGER.warning(f"Unsupported packet type: {packet}")
4644

4745
for entity in gateway.get_entities(Platform.BINARY_SENSOR):
4846
async_add_binary_sensor(entity)
@@ -70,11 +68,7 @@ def __init__(
7068
SUB_ID: self.device.sub_id,
7169
ERROR_CODE: self.device.state[ERROR_CODE],
7270
}
73-
74-
@property
75-
def is_on(self) -> bool:
76-
"""Return true if the binary sensor is on."""
77-
return self.device.state[STATE]
71+
self._attr_is_on = self.device.state[STATE]
7872

7973

8074
class KocomMotionEntity(KocomEntity, BinarySensorEntity):
@@ -95,9 +89,4 @@ def __init__(
9589
SUB_ID: self.device.sub_id,
9690
TIME: self.device.state[TIME],
9791
}
98-
99-
@property
100-
def is_on(self) -> bool:
101-
"""Return true if the binary sensor is on."""
102-
return self.device.state[STATE]
103-
92+
self._attr_is_on = self.device.state[STATE]

custom_components/kocom_wallpad/climate.py

Lines changed: 98 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,16 @@
1919
from homeassistant.helpers.entity_platform import AddEntitiesCallback
2020
from homeassistant.helpers.dispatcher import async_dispatcher_connect
2121

22-
from .pywallpad.const import (
22+
from .pywallpad.api.kocom.const import (
2323
POWER,
2424
AWAY_MODE,
2525
OP_MODE,
2626
FAN_MODE,
2727
CURRENT_TEMP,
2828
TARGET_TEMP,
2929
)
30-
from .pywallpad.enums import OpMode, FanMode
31-
from .pywallpad.packet import KocomPacket, ThermostatPacket, AcPacket
30+
from .pywallpad.api.kocom.enums import OpMode, FanMode
31+
from .pywallpad.api.kocom.packet import KocomPacket, ThermostatPacket, AcPacket
3232

3333
from .gateway import KocomGateway
3434
from .entity import KocomEntity
@@ -50,8 +50,6 @@ def async_add_climate(packet: KocomPacket) -> None:
5050
async_add_entities([KocomThermostatEntity(gateway, packet)])
5151
elif isinstance(packet, AcPacket):
5252
async_add_entities([KocomAcEntity(gateway, packet)])
53-
else:
54-
LOGGER.warning(f"Unsupported packet type: {packet}")
5553

5654
for entity in gateway.get_entities(Platform.CLIMATE):
5755
async_add_climate(entity)
@@ -62,45 +60,35 @@ def async_add_climate(packet: KocomPacket) -> None:
6260

6361

6462
class KocomThermostatEntity(KocomEntity, ClimateEntity):
65-
"""Representation of a Kocom climate."""
63+
"""Representation of a Kocom thermostat."""
6664

6765
_enable_turn_on_off_backwards_compatibility = False
6866
_attr_hvac_modes = [HVACMode.OFF, HVACMode.HEAT]
6967
_attr_preset_modes = [PRESET_AWAY, PRESET_NONE]
7068
_attr_supported_features = (
71-
ClimateEntityFeature.TARGET_TEMPERATURE |
72-
ClimateEntityFeature.TURN_OFF |
73-
ClimateEntityFeature.TURN_ON |
74-
ClimateEntityFeature.PRESET_MODE
69+
ClimateEntityFeature.TARGET_TEMPERATURE
70+
| ClimateEntityFeature.TURN_OFF
71+
| ClimateEntityFeature.TURN_ON
72+
| ClimateEntityFeature.PRESET_MODE
7573
)
7674
_attr_temperature_unit = UnitOfTemperature.CELSIUS
7775
_attr_max_temp = 40
7876
_attr_min_temp = 5
7977
_attr_target_temperature_step = 1
80-
81-
def __init__(
82-
self,
83-
gateway: KocomGateway,
84-
packet: KocomPacket,
85-
) -> None:
86-
"""Initialize the climate."""
78+
79+
def __init__(self, gateway: KocomGateway, packet: KocomPacket) -> None:
80+
"""Initialize the thermostat."""
8781
super().__init__(gateway, packet)
8882

8983
@property
9084
def hvac_mode(self) -> HVACMode:
91-
"""Return hvac operation ie. heat, cool mode."""
92-
if self.device.state[POWER]:
93-
return HVACMode.HEAT
94-
else:
95-
return HVACMode.OFF
96-
85+
"""Return the current HVAC mode."""
86+
return HVACMode.HEAT if self.device.state[POWER] else HVACMode.OFF
87+
9788
@property
9889
def preset_mode(self) -> str:
99-
"""Return the current preset mode, e.g., home, away, temp."""
100-
if self.device.state[AWAY_MODE]:
101-
return PRESET_AWAY
102-
else:
103-
return PRESET_NONE
90+
"""Return the current preset mode."""
91+
return PRESET_AWAY if self.device.state[AWAY_MODE] else PRESET_NONE
10492

10593
@property
10694
def current_temperature(self) -> int:
@@ -109,42 +97,40 @@ def current_temperature(self) -> int:
10997

11098
@property
11199
def target_temperature(self) -> int:
112-
"""Return the temperature we try to reach."""
100+
"""Return the target temperature."""
113101
return self.device.state[TARGET_TEMP]
114-
102+
115103
async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
116-
"""Set new target hvac mode."""
117-
if hvac_mode == HVACMode.OFF:
118-
power = False
119-
elif hvac_mode == HVACMode.HEAT:
120-
power = True
121-
else:
104+
"""Set the HVAC mode."""
105+
hvac_to_power = {
106+
HVACMode.OFF: False,
107+
HVACMode.HEAT: True,
108+
}
109+
power = hvac_to_power.get(hvac_mode)
110+
if power is None:
122111
raise ValueError(f"Unknown HVAC mode: {hvac_mode}")
123-
124-
packet = self.packet.make_status(power=power)
125-
await self.send(packet)
112+
113+
make_packet = self.packet.make_power_status(power)
114+
await self.send_packet(make_packet)
126115

127116
async def async_set_preset_mode(self, preset_mode: str) -> None:
128-
"""Set new target preset mode."""
129-
if preset_mode == PRESET_AWAY:
130-
away_mode = True
131-
elif preset_mode == PRESET_NONE:
132-
away_mode = False
133-
else:
117+
"""Set the preset mode."""
118+
preset_to_away = {
119+
PRESET_AWAY: True,
120+
PRESET_NONE: False,
121+
}
122+
away_mode = preset_to_away.get(preset_mode)
123+
if away_mode is None:
134124
raise ValueError(f"Unknown preset mode: {preset_mode}")
135-
136-
packet = self.packet.make_status(away_mode=away_mode)
137-
await self.send(packet)
125+
126+
make_packet = self.packet.make_away_status(away_mode)
127+
await self.send_packet(make_packet)
138128

139129
async def async_set_temperature(self, **kwargs) -> None:
140-
"""Set new target temperature."""
141-
target_temp = kwargs.get(ATTR_TEMPERATURE)
142-
if target_temp is None:
143-
LOGGER.warning("Missing temperature")
144-
return
145-
146-
packet = self.packet.make_status(target_temp=target_temp)
147-
await self.send(packet)
130+
"""Set the target temperature."""
131+
target_temp = int(kwargs.get(ATTR_TEMPERATURE, 0))
132+
make_packet = self.packet.make_target_temp(target_temp)
133+
await self.send_packet(make_packet)
148134

149135

150136
class KocomAcEntity(KocomEntity, ClimateEntity):
@@ -156,105 +142,89 @@ class KocomAcEntity(KocomEntity, ClimateEntity):
156142
HVACMode.COOL,
157143
HVACMode.FAN_ONLY,
158144
HVACMode.DRY,
159-
HVACMode.AUTO
145+
HVACMode.AUTO,
160146
]
161147
_attr_fan_modes = [FAN_LOW, FAN_MEDIUM, FAN_HIGH]
162148
_attr_supported_features = (
163-
ClimateEntityFeature.TARGET_TEMPERATURE |
164-
ClimateEntityFeature.TURN_OFF |
165-
ClimateEntityFeature.TURN_ON |
166-
ClimateEntityFeature.FAN_MODE
149+
ClimateEntityFeature.TARGET_TEMPERATURE
150+
| ClimateEntityFeature.TURN_OFF
151+
| ClimateEntityFeature.TURN_ON
152+
| ClimateEntityFeature.FAN_MODE
167153
)
168154
_attr_temperature_unit = UnitOfTemperature.CELSIUS
169155
_attr_max_temp = 30
170156
_attr_min_temp = 18
171157
_attr_target_temperature_step = 1
172-
173-
def __init__(
174-
self,
175-
gateway: KocomGateway,
176-
packet: KocomPacket,
177-
) -> None:
158+
159+
def __init__(self, gateway: KocomGateway, packet: KocomPacket) -> None:
178160
"""Initialize the climate."""
179161
super().__init__(gateway, packet)
180-
162+
181163
@property
182164
def hvac_mode(self) -> HVACMode:
183-
"""Return hvac operation ie. heat, cool mode."""
184-
if self.device.state[POWER] and (op_mode := self.device.state[OP_MODE]):
185-
if op_mode == OpMode.COOL:
186-
return HVACMode.COOL
187-
elif op_mode == OpMode.FAN_ONLY:
188-
return HVACMode.FAN_ONLY
189-
elif op_mode == OpMode.DRY:
190-
return HVACMode.DRY
191-
elif op_mode == OpMode.AUTO:
192-
return HVACMode.AUTO
193-
else:
194-
return HVACMode.OFF
195-
165+
"""Return current HVAC mode."""
166+
if self.device.state[POWER]:
167+
op_mode = self.device.state[OP_MODE]
168+
return {
169+
OpMode.COOL: HVACMode.COOL,
170+
OpMode.FAN_ONLY: HVACMode.FAN_ONLY,
171+
OpMode.DRY: HVACMode.DRY,
172+
OpMode.AUTO: HVACMode.AUTO,
173+
}.get(op_mode, HVACMode.OFF)
174+
return HVACMode.OFF
175+
196176
@property
197177
def fan_mode(self) -> str:
198-
"""Return the fan setting."""
199-
fan_mode = self.device.state[FAN_MODE]
200-
if fan_mode == FanMode.LOW:
201-
return FAN_LOW
202-
elif fan_mode == FanMode.MEDIUM:
203-
return FAN_MEDIUM
204-
elif fan_mode == FanMode.HIGH:
205-
return FAN_HIGH
206-
178+
"""Return current fan mode."""
179+
return {
180+
FanMode.LOW: FAN_LOW,
181+
FanMode.MEDIUM: FAN_MEDIUM,
182+
FanMode.HIGH: FAN_HIGH,
183+
}.get(self.device.state[FAN_MODE])
184+
207185
@property
208186
def current_temperature(self) -> int:
209187
"""Return the current temperature."""
210188
return self.device.state[CURRENT_TEMP]
211189

212190
@property
213191
def target_temperature(self) -> int:
214-
"""Return the temperature we try to reach."""
192+
"""Return the target temperature."""
215193
return self.device.state[TARGET_TEMP]
216-
194+
217195
async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
218-
"""Set new target hvac mode."""
196+
"""Set a new target HVAC mode."""
219197
if hvac_mode == HVACMode.OFF:
220-
op_mode = OpMode.OFF
221-
elif hvac_mode == HVACMode.COOL:
222-
op_mode = OpMode.COOL
223-
elif hvac_mode == HVACMode.FAN_ONLY:
224-
op_mode = OpMode.FAN_ONLY
225-
elif hvac_mode == HVACMode.DRY:
226-
op_mode = OpMode.DRY
227-
elif hvac_mode == HVACMode.AUTO:
228-
op_mode = OpMode.AUTO
198+
make_packet = self.packet.make_power_status(False)
229199
else:
230-
raise ValueError(f"Unknown HVAC mode: {hvac_mode}")
231-
232-
packet = self.packet.make_status(op_mode=op_mode)
233-
await self.send(packet)
200+
hvac_to_op_mode = {
201+
HVACMode.COOL: OpMode.COOL,
202+
HVACMode.FAN_ONLY: OpMode.FAN_ONLY,
203+
HVACMode.DRY: OpMode.DRY,
204+
HVACMode.AUTO: OpMode.AUTO,
205+
}
206+
op_mode = hvac_to_op_mode.get(hvac_mode)
207+
if op_mode is None:
208+
raise ValueError(f"Unknown HVAC mode: {hvac_mode}")
209+
make_packet = self.packet.make_op_mode(op_mode)
210+
211+
await self.send_packet(make_packet)
234212

235213
async def async_set_fan_mode(self, fan_mode: str) -> None:
236-
"""Set new target fan mode."""
237-
if fan_mode == FAN_LOW:
238-
fan_speed = FanMode.LOW
239-
elif fan_mode == FAN_MEDIUM:
240-
fan_speed = FanMode.MEDIUM
241-
elif fan_mode == FAN_HIGH:
242-
fan_speed = FanMode.HIGH
243-
else:
214+
"""Set a new target fan mode."""
215+
fan_speed = {
216+
FAN_LOW: FanMode.LOW,
217+
FAN_MEDIUM: FanMode.MEDIUM,
218+
FAN_HIGH: FanMode.HIGH,
219+
}.get(fan_mode)
220+
if fan_speed is None:
244221
raise ValueError(f"Unknown fan mode: {fan_mode}")
245-
246-
packet = self.packet.make_status(fan_mode=fan_speed)
247-
await self.send(packet)
248-
249-
async def async_set_preset_mode(self, preset_mode: str) -> None:
250-
"""Set new target preset mode."""
222+
223+
make_packet = self.packet.make_fan_mode(fan_speed)
224+
await self.send_packet(make_packet)
251225

252226
async def async_set_temperature(self, **kwargs) -> None:
253-
"""Set new target temperature."""
254-
target_temp = kwargs.get(ATTR_TEMPERATURE)
255-
if target_temp is None:
256-
LOGGER.warning("Missing temperature")
257-
return
258-
259-
packet = self.packet.make_status(target_temp=target_temp)
260-
await self.send(packet)
227+
"""Set a new target temperature."""
228+
target_temp = int(kwargs.get(ATTR_TEMPERATURE, 0))
229+
make_packet = self.packet.make_target_temp(target_temp)
230+
await self.send_packet(make_packet)

0 commit comments

Comments
 (0)