1 """Configure select in a device through MQTT topic."""
3 from __future__
import annotations
5 from collections.abc
import Callable
8 import voluptuous
as vol
21 from .
import subscription
22 from .config
import MQTT_RW_SCHEMA
24 CONF_COMMAND_TEMPLATE,
29 from .entity
import MqttEntity, async_setup_entity_entry_helper
36 from .schemas
import MQTT_ENTITY_COMMON_SCHEMA
38 _LOGGER = logging.getLogger(__name__)
42 DEFAULT_NAME =
"MQTT Select"
44 MQTT_SELECT_ATTRIBUTES_BLOCKED = frozenset(
51 PLATFORM_SCHEMA_MODERN = MQTT_RW_SCHEMA.extend(
53 vol.Optional(CONF_COMMAND_TEMPLATE): cv.template,
54 vol.Optional(CONF_NAME): vol.Any(cv.string,
None),
55 vol.Required(CONF_OPTIONS): cv.ensure_list,
56 vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
58 ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema)
60 DISCOVERY_SCHEMA = vol.All(PLATFORM_SCHEMA_MODERN.extend({}, extra=vol.REMOVE_EXTRA))
65 config_entry: ConfigEntry,
66 async_add_entities: AddEntitiesCallback,
68 """Set up MQTT select through YAML and through MQTT discovery."""
76 PLATFORM_SCHEMA_MODERN,
81 """representation of an MQTT select."""
83 _attr_current_option: str |
None =
None
84 _default_name = DEFAULT_NAME
85 _entity_id_format = select.ENTITY_ID_FORMAT
86 _attributes_extra_blocked = MQTT_SELECT_ATTRIBUTES_BLOCKED
87 _command_template: Callable[[PublishPayloadType], PublishPayloadType]
88 _value_template: Callable[[ReceivePayloadType], ReceivePayloadType]
89 _optimistic: bool =
False
93 """Return the config schema."""
94 return DISCOVERY_SCHEMA
97 """(Re)Setup the entity."""
102 config.get(CONF_COMMAND_TEMPLATE),
106 config.get(CONF_VALUE_TEMPLATE), entity=self
107 ).async_render_with_possible_json_value
111 """Handle new MQTT messages."""
113 if not payload.strip():
115 "Ignoring empty payload '%s' after rendering for topic %s",
120 if payload.lower() ==
"none":
124 if payload
not in self.
optionsoptions:
126 "Invalid option for %s: '%s' (valid options: %s)",
136 """(Re)Subscribe to topics."""
138 CONF_STATE_TOPIC, self.
_message_received_message_received, {
"_attr_current_option"}
145 """(Re)Subscribe to topics."""
146 subscription.async_subscribe_topics_internal(self.
hasshasshass, self.
_sub_state_sub_state)
154 """Update the current value."""
None async_publish_with_config(self, str topic, PublishPayloadType payload)
bool add_subscription(self, str state_topic_config_key, Callable[[ReceiveMessage], None] msg_callback, set[str]|None tracked_attributes, bool disable_encoding=False)
VolSchemaType config_schema()
None _message_received(self, ReceiveMessage msg)
None _prepare_subscribe_topics(self)
None _setup_from_config(self, ConfigType config)
None _subscribe_topics(self)
None async_select_option(self, str option)
None async_write_ha_state(self)
State|None async_get_last_state(self)
None async_setup_entity_entry_helper(HomeAssistant hass, ConfigEntry entry, type[MqttEntity]|None entity_class, str domain, AddEntitiesCallback async_add_entities, VolSchemaType discovery_schema, VolSchemaType platform_schema_modern, dict[str, type[MqttEntity]]|None schema_class_mapping=None)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)