1 """Support for MQTT text platform."""
3 from __future__
import annotations
5 from collections.abc
import Callable
10 import voluptuous
as vol
20 MAX_LENGTH_STATE_STATE,
28 from .
import subscription
29 from .config
import MQTT_RW_SCHEMA
30 from .const
import CONF_COMMAND_TEMPLATE, CONF_COMMAND_TOPIC, CONF_STATE_TOPIC
31 from .entity
import MqttEntity, async_setup_entity_entry_helper
38 from .schemas
import MQTT_ENTITY_COMMON_SCHEMA
39 from .util
import check_state_too_long
41 _LOGGER = logging.getLogger(__name__)
47 CONF_PATTERN =
"pattern"
49 DEFAULT_NAME =
"MQTT Text"
50 DEFAULT_PAYLOAD_RESET =
"None"
52 MQTT_TEXT_ATTRIBUTES_BLOCKED = frozenset(
63 """Validate that the text length configuration is valid, throws if it isn't."""
64 if config[CONF_MIN] > config[CONF_MAX]:
65 raise vol.Invalid(
"text length min must be <= max")
66 if config[CONF_MAX] > MAX_LENGTH_STATE_STATE:
67 raise vol.Invalid(f
"max text length must be <= {MAX_LENGTH_STATE_STATE}")
72 _PLATFORM_SCHEMA_BASE = MQTT_RW_SCHEMA.extend(
74 vol.Optional(CONF_COMMAND_TEMPLATE): cv.template,
75 vol.Optional(CONF_NAME): vol.Any(cv.string,
None),
76 vol.Optional(CONF_MAX, default=MAX_LENGTH_STATE_STATE): cv.positive_int,
77 vol.Optional(CONF_MIN, default=0): cv.positive_int,
78 vol.Optional(CONF_MODE, default=text.TextMode.TEXT): vol.In(
79 [text.TextMode.TEXT, text.TextMode.PASSWORD]
81 vol.Optional(CONF_PATTERN): cv.is_regex,
82 vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
84 ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema)
87 DISCOVERY_SCHEMA = vol.All(
88 _PLATFORM_SCHEMA_BASE.extend({}, extra=vol.REMOVE_EXTRA),
89 valid_text_size_configuration,
92 PLATFORM_SCHEMA_MODERN = vol.All(_PLATFORM_SCHEMA_BASE, valid_text_size_configuration)
97 config_entry: ConfigEntry,
98 async_add_entities: AddEntitiesCallback,
100 """Set up MQTT text through YAML and through MQTT discovery."""
108 PLATFORM_SCHEMA_MODERN,
113 """Representation of the MQTT text entity."""
115 _attr_native_value: str |
None =
None
116 _attributes_extra_blocked = MQTT_TEXT_ATTRIBUTES_BLOCKED
117 _default_name = DEFAULT_NAME
118 _entity_id_format = text.ENTITY_ID_FORMAT
120 _compiled_pattern: re.Pattern[Any] |
None
122 _command_template: Callable[[PublishPayloadType], PublishPayloadType]
123 _value_template: Callable[[ReceivePayloadType], ReceivePayloadType]
127 """Return the config schema."""
128 return DISCOVERY_SCHEMA
131 """(Re)Setup the entity."""
141 config.get(CONF_COMMAND_TEMPLATE),
145 config.get(CONF_VALUE_TEMPLATE),
147 ).async_render_with_possible_json_value
148 optimistic: bool = config[CONF_OPTIMISTIC]
149 self.
_optimistic_optimistic = optimistic
or config.get(CONF_STATE_TOPIC)
is None
154 """Handle receiving state message via MQTT."""
162 """(Re)Subscribe to topics."""
166 {
"_attr_native_value"},
170 """(Re)Subscribe to topics."""
171 subscription.async_subscribe_topics_internal(self.
hasshasshass, self.
_sub_state_sub_state)
174 """Change the text."""
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)
None _setup_from_config(self, ConfigType config)
None async_set_value(self, str value)
VolSchemaType config_schema()
None _prepare_subscribe_topics(self)
None _subscribe_topics(self)
None _handle_state_message_received(self, ReceiveMessage msg)
None async_write_ha_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)
ConfigType valid_text_size_configuration(ConfigType config)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
bool check_state_too_long(logging.Logger logger, str proposed_state, str entity_id, ReceiveMessage msg)