Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Climate entities for the Overkiz (by Somfy) integration."""
2 
3 from __future__ import annotations
4 
5 from enum import StrEnum, unique
6 
7 from pyoverkiz.enums import Protocol
8 from pyoverkiz.enums.ui import UIWidget
9 
10 from homeassistant.config_entries import ConfigEntry
11 from homeassistant.const import Platform
12 from homeassistant.core import HomeAssistant
13 from homeassistant.helpers.entity import Entity
14 from homeassistant.helpers.entity_platform import AddEntitiesCallback
15 
16 from .. import HomeAssistantOverkizData
17 from ..const import DOMAIN
18 from .atlantic_electrical_heater import AtlanticElectricalHeater
19 from .atlantic_electrical_heater_with_adjustable_temperature_setpoint import (
20  AtlanticElectricalHeaterWithAdjustableTemperatureSetpoint,
21 )
22 from .atlantic_electrical_towel_dryer import AtlanticElectricalTowelDryer
23 from .atlantic_heat_recovery_ventilation import AtlanticHeatRecoveryVentilation
24 from .atlantic_pass_apc_heat_pump_main_component import (
25  AtlanticPassAPCHeatPumpMainComponent,
26 )
27 from .atlantic_pass_apc_heating_zone import AtlanticPassAPCHeatingZone
28 from .atlantic_pass_apc_zone_control import AtlanticPassAPCZoneControl
29 from .atlantic_pass_apc_zone_control_zone import AtlanticPassAPCZoneControlZone
30 from .hitachi_air_to_air_heat_pump_hlrrwifi import HitachiAirToAirHeatPumpHLRRWIFI
31 from .hitachi_air_to_air_heat_pump_ovp import HitachiAirToAirHeatPumpOVP
32 from .somfy_heating_temperature_interface import SomfyHeatingTemperatureInterface
33 from .somfy_thermostat import SomfyThermostat
34 from .valve_heating_temperature_interface import ValveHeatingTemperatureInterface
35 
36 
37 @unique
38 class Controllable(StrEnum):
39  """Enum for widget controllables."""
40 
41  IO_ATLANTIC_PASS_APC_HEATING_AND_COOLING_ZONE = (
42  "io:AtlanticPassAPCHeatingAndCoolingZoneComponent"
43  )
44  IO_ATLANTIC_PASS_APC_ZONE_CONTROL_ZONE = (
45  "io:AtlanticPassAPCZoneControlZoneComponent"
46  )
47 
48 
49 WIDGET_TO_CLIMATE_ENTITY = {
50  UIWidget.ATLANTIC_ELECTRICAL_HEATER: AtlanticElectricalHeater,
51  UIWidget.ATLANTIC_ELECTRICAL_HEATER_WITH_ADJUSTABLE_TEMPERATURE_SETPOINT: AtlanticElectricalHeaterWithAdjustableTemperatureSetpoint,
52  UIWidget.ATLANTIC_ELECTRICAL_TOWEL_DRYER: AtlanticElectricalTowelDryer,
53  UIWidget.ATLANTIC_HEAT_RECOVERY_VENTILATION: AtlanticHeatRecoveryVentilation,
54  UIWidget.ATLANTIC_PASS_APC_HEATING_ZONE: AtlanticPassAPCHeatingZone,
55  UIWidget.ATLANTIC_PASS_APC_ZONE_CONTROL: AtlanticPassAPCZoneControl,
56  UIWidget.SOMFY_HEATING_TEMPERATURE_INTERFACE: SomfyHeatingTemperatureInterface,
57  UIWidget.SOMFY_THERMOSTAT: SomfyThermostat,
58  UIWidget.VALVE_HEATING_TEMPERATURE_INTERFACE: ValveHeatingTemperatureInterface,
59  UIWidget.ATLANTIC_PASS_APC_HEAT_PUMP: AtlanticPassAPCHeatPumpMainComponent,
60 }
61 
62 # For Atlantic APC, some devices are standalone and control themselves, some others needs to be
63 # managed by a ZoneControl device. Widget name is the same in the two cases.
64 WIDGET_AND_CONTROLLABLE_TO_CLIMATE_ENTITY = {
65  UIWidget.ATLANTIC_PASS_APC_HEATING_AND_COOLING_ZONE: {
66  Controllable.IO_ATLANTIC_PASS_APC_HEATING_AND_COOLING_ZONE: AtlanticPassAPCHeatingZone,
67  Controllable.IO_ATLANTIC_PASS_APC_ZONE_CONTROL_ZONE: AtlanticPassAPCZoneControlZone,
68  }
69 }
70 
71 # Hitachi air-to-air heatpumps come in 2 flavors (HLRRWIFI and OVP) that are separated in 2 classes
72 WIDGET_AND_PROTOCOL_TO_CLIMATE_ENTITY = {
73  UIWidget.HITACHI_AIR_TO_AIR_HEAT_PUMP: {
74  Protocol.HLRR_WIFI: HitachiAirToAirHeatPumpHLRRWIFI,
75  Protocol.OVP: HitachiAirToAirHeatPumpOVP,
76  },
77 }
78 
79 
81  hass: HomeAssistant,
82  entry: ConfigEntry,
83  async_add_entities: AddEntitiesCallback,
84 ) -> None:
85  """Set up the Overkiz climate from a config entry."""
86  data: HomeAssistantOverkizData = hass.data[DOMAIN][entry.entry_id]
87 
88  # Match devices based on the widget.
89  entities_based_on_widget: list[Entity] = [
90  WIDGET_TO_CLIMATE_ENTITY[device.widget](device.device_url, data.coordinator)
91  for device in data.platforms[Platform.CLIMATE]
92  if device.widget in WIDGET_TO_CLIMATE_ENTITY
93  ]
94 
95  # Match devices based on the widget and controllableName.
96  # ie Atlantic APC
97  entities_based_on_widget_and_controllable: list[Entity] = [
98  WIDGET_AND_CONTROLLABLE_TO_CLIMATE_ENTITY[device.widget][
99  device.controllable_name # type: ignore[index]
100  ](device.device_url, data.coordinator)
101  for device in data.platforms[Platform.CLIMATE]
102  if device.widget in WIDGET_AND_CONTROLLABLE_TO_CLIMATE_ENTITY
103  and device.controllable_name
104  in WIDGET_AND_CONTROLLABLE_TO_CLIMATE_ENTITY[device.widget]
105  ]
106 
107  # Match devices based on the widget and protocol.
108  # #ie Hitachi Air To Air Heat Pumps
109  entities_based_on_widget_and_protocol: list[Entity] = [
110  WIDGET_AND_PROTOCOL_TO_CLIMATE_ENTITY[device.widget][device.protocol](
111  device.device_url, data.coordinator
112  )
113  for device in data.platforms[Platform.CLIMATE]
114  if device.widget in WIDGET_AND_PROTOCOL_TO_CLIMATE_ENTITY
115  and device.protocol in WIDGET_AND_PROTOCOL_TO_CLIMATE_ENTITY[device.widget]
116  ]
117 
119  entities_based_on_widget
120  + entities_based_on_widget_and_controllable
121  + entities_based_on_widget_and_protocol
122  )
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: __init__.py:84