1 """The command_line component."""
3 from __future__
import annotations
6 from collections.abc
import Coroutine
10 import voluptuous
as vol
13 DEVICE_CLASSES_SCHEMA
as BINARY_SENSOR_DEVICE_CLASSES_SCHEMA,
14 DOMAIN
as BINARY_SENSOR_DOMAIN,
15 SCAN_INTERVAL
as BINARY_SENSOR_DEFAULT_SCAN_INTERVAL,
18 DEVICE_CLASSES_SCHEMA
as COVER_DEVICE_CLASSES_SCHEMA,
19 DOMAIN
as COVER_DOMAIN,
20 SCAN_INTERVAL
as COVER_DEFAULT_SCAN_INTERVAL,
25 DEVICE_CLASSES_SCHEMA
as SENSOR_DEVICE_CLASSES_SCHEMA,
26 DOMAIN
as SENSOR_DOMAIN,
27 SCAN_INTERVAL
as SENSOR_DEFAULT_SCAN_INTERVAL,
28 STATE_CLASSES_SCHEMA
as SENSOR_STATE_CLASSES_SCHEMA,
31 DOMAIN
as SWITCH_DOMAIN,
32 SCAN_INTERVAL
as SWITCH_DEFAULT_SCAN_INTERVAL,
49 CONF_UNIT_OF_MEASUREMENT,
66 CONF_JSON_ATTRIBUTES_PATH,
71 BINARY_SENSOR_DEFAULT_NAME =
"Binary Command Sensor"
72 DEFAULT_PAYLOAD_ON =
"ON"
73 DEFAULT_PAYLOAD_OFF =
"OFF"
74 SENSOR_DEFAULT_NAME =
"Command Sensor"
75 CONF_NOTIFIERS =
"notifiers"
78 BINARY_SENSOR_DOMAIN: Platform.BINARY_SENSOR,
79 COVER_DOMAIN: Platform.COVER,
80 NOTIFY_DOMAIN: Platform.NOTIFY,
81 SENSOR_DOMAIN: Platform.SENSOR,
82 SWITCH_DOMAIN: Platform.SWITCH,
85 _LOGGER = logging.getLogger(__name__)
87 BINARY_SENSOR_SCHEMA = vol.Schema(
89 vol.Required(CONF_COMMAND): cv.string,
90 vol.Optional(CONF_NAME, default=BINARY_SENSOR_DEFAULT_NAME): cv.string,
91 vol.Optional(CONF_ICON): cv.template,
92 vol.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string,
93 vol.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string,
94 vol.Optional(CONF_DEVICE_CLASS): BINARY_SENSOR_DEVICE_CLASSES_SCHEMA,
95 vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
96 vol.Optional(CONF_COMMAND_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int,
97 vol.Optional(CONF_UNIQUE_ID): cv.string,
99 CONF_SCAN_INTERVAL, default=BINARY_SENSOR_DEFAULT_SCAN_INTERVAL
100 ): vol.All(cv.time_period, cv.positive_timedelta),
101 vol.Optional(CONF_AVAILABILITY): cv.template,
104 COVER_SCHEMA = vol.Schema(
106 vol.Optional(CONF_COMMAND_CLOSE, default=
"true"): cv.string,
107 vol.Optional(CONF_COMMAND_OPEN, default=
"true"): cv.string,
108 vol.Optional(CONF_COMMAND_STATE): cv.string,
109 vol.Optional(CONF_COMMAND_STOP, default=
"true"): cv.string,
110 vol.Required(CONF_NAME): cv.string,
111 vol.Optional(CONF_ICON): cv.template,
112 vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
113 vol.Optional(CONF_COMMAND_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int,
114 vol.Optional(CONF_DEVICE_CLASS): COVER_DEVICE_CLASSES_SCHEMA,
115 vol.Optional(CONF_UNIQUE_ID): cv.string,
116 vol.Optional(CONF_SCAN_INTERVAL, default=COVER_DEFAULT_SCAN_INTERVAL): vol.All(
117 cv.time_period, cv.positive_timedelta
119 vol.Optional(CONF_AVAILABILITY): cv.template,
122 NOTIFY_SCHEMA = vol.Schema(
124 vol.Required(CONF_COMMAND): cv.string,
125 vol.Optional(CONF_NAME): cv.string,
126 vol.Optional(CONF_COMMAND_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int,
129 SENSOR_SCHEMA = vol.Schema(
131 vol.Required(CONF_COMMAND): cv.string,
132 vol.Optional(CONF_COMMAND_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int,
133 vol.Optional(CONF_JSON_ATTRIBUTES): cv.ensure_list_csv,
134 vol.Optional(CONF_JSON_ATTRIBUTES_PATH): cv.string,
135 vol.Optional(CONF_NAME, default=SENSOR_DEFAULT_NAME): cv.string,
136 vol.Optional(CONF_ICON): cv.template,
137 vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string,
138 vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
139 vol.Optional(CONF_UNIQUE_ID): cv.string,
140 vol.Optional(CONF_DEVICE_CLASS): SENSOR_DEVICE_CLASSES_SCHEMA,
141 vol.Optional(CONF_STATE_CLASS): SENSOR_STATE_CLASSES_SCHEMA,
142 vol.Optional(CONF_SCAN_INTERVAL, default=SENSOR_DEFAULT_SCAN_INTERVAL): vol.All(
143 cv.time_period, cv.positive_timedelta
145 vol.Optional(CONF_AVAILABILITY): cv.template,
148 SWITCH_SCHEMA = vol.Schema(
150 vol.Optional(CONF_COMMAND_OFF, default=
"true"): cv.string,
151 vol.Optional(CONF_COMMAND_ON, default=
"true"): cv.string,
152 vol.Optional(CONF_COMMAND_STATE): cv.string,
153 vol.Required(CONF_NAME): cv.string,
154 vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
155 vol.Optional(CONF_ICON): cv.template,
156 vol.Optional(CONF_COMMAND_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int,
157 vol.Optional(CONF_UNIQUE_ID): cv.string,
158 vol.Optional(CONF_SCAN_INTERVAL, default=SWITCH_DEFAULT_SCAN_INTERVAL): vol.All(
159 cv.time_period, cv.positive_timedelta
161 vol.Optional(CONF_AVAILABILITY): cv.template,
164 COMBINED_SCHEMA = vol.Schema(
166 vol.Optional(BINARY_SENSOR_DOMAIN): BINARY_SENSOR_SCHEMA,
167 vol.Optional(COVER_DOMAIN): COVER_SCHEMA,
168 vol.Optional(NOTIFY_DOMAIN): NOTIFY_SCHEMA,
169 vol.Optional(SENSOR_DOMAIN): SENSOR_SCHEMA,
170 vol.Optional(SWITCH_DOMAIN): SWITCH_SCHEMA,
173 CONFIG_SCHEMA = vol.Schema(
175 vol.Optional(DOMAIN): vol.All(
180 extra=vol.ALLOW_EXTRA,
184 async
def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
185 """Set up Command Line from yaml config."""
187 async
def _reload_config(call: Event | ServiceCall) ->
None:
188 """Reload Command Line."""
191 for reset_platform
in reset_platforms:
192 _LOGGER.debug(
"Reload resetting platform: %s", reset_platform.domain)
193 await reset_platform.async_reset()
194 if not reload_config:
207 command_line_config: list[dict[str, dict[str, Any]]],
210 """Load platforms from yaml."""
211 if not command_line_config:
214 _LOGGER.debug(
"Full config loaded: %s", command_line_config)
216 load_coroutines: list[Coroutine[Any, Any,
None]] = []
217 platforms: list[Platform] = []
218 reload_configs: list[tuple[Platform, dict[str, Any]]] = []
219 for platform_config
in command_line_config:
220 for platform, _config
in platform_config.items():
221 if (mapped_platform := PLATFORM_MAPPING[platform])
not in platforms:
222 platforms.append(mapped_platform)
224 "Loading config %s for platform %s",
226 PLATFORM_MAPPING[platform],
228 reload_configs.append((PLATFORM_MAPPING[platform], _config))
229 load_coroutines.append(
230 discovery.async_load_platform(
232 PLATFORM_MAPPING[platform],
240 _LOGGER.debug(
"Loading platforms: %s", platforms)
241 await asyncio.gather(*load_coroutines)
bool async_setup(HomeAssistant hass, ConfigType config)
None async_load_platforms(HomeAssistant hass, list[dict[str, dict[str, Any]]] command_line_config, ConfigType config)
ConfigType|None async_integration_yaml_config(HomeAssistant hass, str integration_name)
None async_register_admin_service(HomeAssistant hass, str domain, str service, Callable[[ServiceCall], Awaitable[None]|None] service_func, VolSchemaType schema=vol.Schema({}, extra=vol.PREVENT_EXTRA))