Home Assistant Unofficial Reference 2024.12.1
manual_setup.py
Go to the documentation of this file.
1 """Handle manual setup of ihc resources as entities in Home Assistant."""
2 
3 import logging
4 
5 import voluptuous as vol
6 
7 from homeassistant.components.binary_sensor import DEVICE_CLASSES_SCHEMA
8 from homeassistant.const import (
9  CONF_ID,
10  CONF_NAME,
11  CONF_PASSWORD,
12  CONF_TYPE,
13  CONF_UNIT_OF_MEASUREMENT,
14  CONF_URL,
15  CONF_USERNAME,
16 )
17 from homeassistant.core import HomeAssistant
18 from homeassistant.helpers import discovery
20 from homeassistant.helpers.typing import ConfigType
21 
22 from .const import (
23  CONF_AUTOSETUP,
24  CONF_BINARY_SENSOR,
25  CONF_DIMMABLE,
26  CONF_INFO,
27  CONF_INVERTING,
28  CONF_LIGHT,
29  CONF_NOTE,
30  CONF_OFF_ID,
31  CONF_ON_ID,
32  CONF_POSITION,
33  CONF_SENSOR,
34  CONF_SWITCH,
35  DOMAIN,
36  IHC_PLATFORMS,
37 )
38 
39 _LOGGER = logging.getLogger(__name__)
40 
41 
42 def validate_name(config):
43  """Validate the device name."""
44  if CONF_NAME in config:
45  return config
46  ihcid = config[CONF_ID]
47  name = f"ihc_{ihcid}"
48  config[CONF_NAME] = name
49  return config
50 
51 
52 DEVICE_SCHEMA = vol.Schema(
53  {
54  vol.Required(CONF_ID): cv.positive_int,
55  vol.Optional(CONF_NAME): cv.string,
56  vol.Optional(CONF_NOTE): cv.string,
57  vol.Optional(CONF_POSITION): cv.string,
58  }
59 )
60 
61 SWITCH_SCHEMA = DEVICE_SCHEMA.extend(
62  {
63  vol.Optional(CONF_OFF_ID, default=0): cv.positive_int,
64  vol.Optional(CONF_ON_ID, default=0): cv.positive_int,
65  }
66 )
67 
68 BINARY_SENSOR_SCHEMA = DEVICE_SCHEMA.extend(
69  {
70  vol.Optional(CONF_INVERTING, default=False): cv.boolean,
71  vol.Optional(CONF_TYPE): DEVICE_CLASSES_SCHEMA,
72  }
73 )
74 
75 LIGHT_SCHEMA = DEVICE_SCHEMA.extend(
76  {
77  vol.Optional(CONF_DIMMABLE, default=False): cv.boolean,
78  vol.Optional(CONF_OFF_ID, default=0): cv.positive_int,
79  vol.Optional(CONF_ON_ID, default=0): cv.positive_int,
80  }
81 )
82 
83 SENSOR_SCHEMA = DEVICE_SCHEMA.extend(
84  {vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string}
85 )
86 
87 IHC_SCHEMA = vol.Schema(
88  {
89  vol.Required(CONF_PASSWORD): cv.string,
90  vol.Required(CONF_URL): cv.string,
91  vol.Required(CONF_USERNAME): cv.string,
92  vol.Optional(CONF_AUTOSETUP, default=True): cv.boolean,
93  vol.Optional(CONF_BINARY_SENSOR, default=[]): vol.All(
94  cv.ensure_list, [vol.All(BINARY_SENSOR_SCHEMA, validate_name)]
95  ),
96  vol.Optional(CONF_INFO, default=True): cv.boolean,
97  vol.Optional(CONF_LIGHT, default=[]): vol.All(
98  cv.ensure_list, [vol.All(LIGHT_SCHEMA, validate_name)]
99  ),
100  vol.Optional(CONF_SENSOR, default=[]): vol.All(
101  cv.ensure_list, [vol.All(SENSOR_SCHEMA, validate_name)]
102  ),
103  vol.Optional(CONF_SWITCH, default=[]): vol.All(
104  cv.ensure_list, [vol.All(SWITCH_SCHEMA, validate_name)]
105  ),
106  }
107 )
108 
109 
111  hass: HomeAssistant,
112  config: ConfigType,
113  controller_conf: ConfigType,
114  controller_id: str,
115 ) -> None:
116  """Get manual configuration for IHC devices."""
117  for platform in IHC_PLATFORMS:
118  discovery_info = {}
119  if platform in controller_conf:
120  platform_setup = controller_conf.get(platform, {})
121  for sensor_cfg in platform_setup:
122  name = sensor_cfg[CONF_NAME]
123  device = {
124  "ihc_id": sensor_cfg[CONF_ID],
125  "ctrl_id": controller_id,
126  "product": {
127  "name": name,
128  "note": sensor_cfg.get(CONF_NOTE) or "",
129  "position": sensor_cfg.get(CONF_POSITION) or "",
130  },
131  "product_cfg": {
132  "type": sensor_cfg.get(CONF_TYPE),
133  "inverting": sensor_cfg.get(CONF_INVERTING),
134  "off_id": sensor_cfg.get(CONF_OFF_ID),
135  "on_id": sensor_cfg.get(CONF_ON_ID),
136  "dimmable": sensor_cfg.get(CONF_DIMMABLE),
137  "unit_of_measurement": sensor_cfg.get(CONF_UNIT_OF_MEASUREMENT),
138  },
139  }
140  discovery_info[name] = device
141  if discovery_info:
142  discovery.load_platform(hass, platform, DOMAIN, discovery_info, config)
None get_manual_configuration(HomeAssistant hass, ConfigType config, ConfigType controller_conf, str controller_id)