hOn/custom_components/hon/climate.py

163 lines
5.8 KiB
Python
Raw Normal View History

2023-04-26 23:57:44 +02:00
import logging
2023-05-17 00:01:33 +02:00
from pyhon import Hon
from pyhon.appliance import HonAppliance
2023-04-26 23:57:44 +02:00
from homeassistant.components.climate import (
ClimateEntity,
ClimateEntityDescription,
)
from homeassistant.components.climate.const import (
FAN_OFF,
SWING_OFF,
SWING_BOTH,
SWING_VERTICAL,
SWING_HORIZONTAL,
ClimateEntityFeature,
HVACMode,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
ATTR_TEMPERATURE,
PRECISION_WHOLE,
TEMP_CELSIUS,
)
from homeassistant.core import callback
2023-05-07 00:52:54 +02:00
from .const import HON_HVAC_MODE, HON_FAN, HON_HVAC_PROGRAM, DOMAIN
from .hon import HonEntity, HonCoordinator
2023-04-26 23:57:44 +02:00
_LOGGER = logging.getLogger(__name__)
CLIMATES = {
2023-05-10 18:13:05 +02:00
"AC": (
ClimateEntityDescription(
key="settings",
name="Air Conditioner",
icon="mdi:air-conditioner",
translation_key="air_conditioner",
),
),
2023-04-26 23:57:44 +02:00
}
async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> None:
hon: Hon = hass.data[DOMAIN][entry.unique_id]
coordinators = hass.data[DOMAIN]["coordinators"]
appliances = []
for device in hon.appliances:
if device.unique_id in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.unique_id]
else:
coordinator = HonCoordinator(hass, device)
hass.data[DOMAIN]["coordinators"][device.unique_id] = coordinator
await coordinator.async_config_entry_first_refresh()
if descriptions := CLIMATES.get(device.appliance_type):
for description in descriptions:
2023-05-08 02:05:04 +02:00
if description.key not in list(device.commands):
2023-04-26 23:57:44 +02:00
continue
2023-05-19 01:27:44 +02:00
appliances.append(
HonClimateEntity(hass, coordinator, entry, device, description)
2023-04-26 23:57:44 +02:00
)
async_add_entities(appliances)
class HonClimateEntity(HonEntity, ClimateEntity):
def __init__(
self, hass, coordinator, entry, device: HonAppliance, description
) -> None:
super().__init__(hass, entry, coordinator, device)
self.entity_description = description
self._attr_unique_id = f"{super().unique_id}climate"
self._attr_temperature_unit = TEMP_CELSIUS
self._attr_target_temperature_step = PRECISION_WHOLE
2023-05-08 02:05:04 +02:00
self._attr_max_temp = device.settings["settings.tempSel"].max
self._attr_min_temp = device.settings["settings.tempSel"].min
2023-04-26 23:57:44 +02:00
self._attr_hvac_modes = [HVACMode.OFF] + [
2023-05-08 02:05:04 +02:00
HON_HVAC_MODE[mode] for mode in device.settings["settings.machMode"].values
2023-04-26 23:57:44 +02:00
]
self._attr_fan_modes = [FAN_OFF] + [
2023-05-08 02:05:04 +02:00
HON_FAN[mode] for mode in device.settings["settings.windSpeed"].values
2023-04-26 23:57:44 +02:00
]
self._attr_swing_modes = [
SWING_OFF,
SWING_VERTICAL,
SWING_HORIZONTAL,
SWING_BOTH,
]
self._attr_supported_features = (
ClimateEntityFeature.TARGET_TEMPERATURE
| ClimateEntityFeature.FAN_MODE
| ClimateEntityFeature.SWING_MODE
)
2023-05-19 01:27:44 +02:00
self._handle_coordinator_update(update=False)
2023-05-08 02:05:04 +02:00
2023-04-26 23:57:44 +02:00
async def async_set_hvac_mode(self, hvac_mode):
if hvac_mode == HVACMode.OFF:
2023-05-08 02:05:04 +02:00
await self._device.commands["stopProgram"].send()
2023-04-26 23:57:44 +02:00
else:
2023-05-08 02:05:04 +02:00
self._device.settings["startProgram.program"].value = HON_HVAC_PROGRAM[
hvac_mode
]
await self._device.commands["startProgram"].send()
2023-04-26 23:57:44 +02:00
self._attr_hvac_mode = hvac_mode
2023-05-17 00:01:33 +02:00
self.async_write_ha_state()
2023-04-26 23:57:44 +02:00
async def async_set_fan_mode(self, fan_mode):
mode_number = list(HON_FAN.values()).index(fan_mode)
2023-05-08 02:05:04 +02:00
self._device.settings["settings.windSpeed"].value = list(HON_FAN.keys())[
mode_number
]
await self._device.commands["settings"].send()
2023-05-17 00:01:33 +02:00
self.async_write_ha_state()
2023-04-26 23:57:44 +02:00
async def async_set_swing_mode(self, swing_mode):
2023-05-08 02:05:04 +02:00
horizontal = self._device.settings["settings.windDirectionHorizontal"]
vertical = self._device.settings["settings.windDirectionVertical"]
2023-04-26 23:57:44 +02:00
if swing_mode in [SWING_BOTH, SWING_HORIZONTAL]:
horizontal.value = "7"
if swing_mode in [SWING_BOTH, SWING_VERTICAL]:
vertical.value = "8"
if swing_mode in [SWING_OFF, SWING_HORIZONTAL] and vertical.value == "8":
vertical.value = "5"
if swing_mode in [SWING_OFF, SWING_VERTICAL] and horizontal.value == "7":
horizontal.value = "0"
self._attr_swing_mode = swing_mode
2023-05-08 02:05:04 +02:00
await self._device.commands["settings"].send()
2023-05-17 00:01:33 +02:00
self.async_write_ha_state()
2023-04-26 23:57:44 +02:00
async def async_set_temperature(self, **kwargs):
if (temperature := kwargs.get(ATTR_TEMPERATURE)) is None:
return False
2023-05-17 00:01:33 +02:00
self._device.settings["settings.tempSel"].value = str(int(temperature))
2023-05-08 02:05:04 +02:00
await self._device.commands["settings"].send()
2023-05-17 00:01:33 +02:00
self.async_write_ha_state()
2023-04-26 23:57:44 +02:00
@callback
def _handle_coordinator_update(self, update=True) -> None:
self._attr_target_temperature = int(float(self._device.get("tempSel")))
self._attr_current_temperature = float(self._device.get("tempIndoor"))
2023-04-26 23:57:44 +02:00
if self._device.get("onOffStatus") == "0":
self._attr_hvac_mode = HVACMode.OFF
else:
2023-05-08 02:05:04 +02:00
self._attr_hvac_mode = HON_HVAC_MODE[self._device.get("machMode") or "0"]
2023-04-26 23:57:44 +02:00
2023-05-17 00:01:33 +02:00
self._attr_fan_mode = HON_FAN[self._device.get("windSpeed")]
2023-04-26 23:57:44 +02:00
2023-05-17 00:01:33 +02:00
horizontal = self._device.get("windDirectionHorizontal")
vertical = self._device.get("windDirectionVertical")
2023-04-26 23:57:44 +02:00
if horizontal == "7" and vertical == "8":
self._attr_swing_mode = SWING_BOTH
elif horizontal == "7":
self._attr_swing_mode = SWING_HORIZONTAL
elif vertical == "8":
self._attr_swing_mode = SWING_VERTICAL
else:
self._attr_swing_mode = SWING_OFF
2023-05-19 01:27:44 +02:00
if update:
self.async_write_ha_state()