1 """Configure number in a device through MQTT topic."""
3 from __future__
import annotations
5 from collections.abc
import Callable
8 import voluptuous
as vol
25 CONF_UNIT_OF_MEASUREMENT,
34 from .
import subscription
35 from .config
import MQTT_RW_SCHEMA
37 CONF_COMMAND_TEMPLATE,
42 from .entity
import MqttEntity, async_setup_entity_entry_helper
49 from .schemas
import MQTT_ENTITY_COMMON_SCHEMA
51 _LOGGER = logging.getLogger(__name__)
59 DEFAULT_NAME =
"MQTT Number"
60 DEFAULT_PAYLOAD_RESET =
"None"
62 MQTT_NUMBER_ATTRIBUTES_BLOCKED = frozenset(
72 """Validate that the configuration is valid, throws if it isn't."""
73 if config[CONF_MIN] >= config[CONF_MAX]:
74 raise vol.Invalid(f
"'{CONF_MAX}' must be > '{CONF_MIN}'")
79 _PLATFORM_SCHEMA_BASE = MQTT_RW_SCHEMA.extend(
81 vol.Optional(CONF_COMMAND_TEMPLATE): cv.template,
82 vol.Optional(CONF_DEVICE_CLASS): vol.Any(
83 vol.All(vol.Lower, vol.Coerce(NumberDeviceClass)),
None
85 vol.Optional(CONF_MAX, default=DEFAULT_MAX_VALUE): vol.Coerce(float),
86 vol.Optional(CONF_MIN, default=DEFAULT_MIN_VALUE): vol.Coerce(float),
87 vol.Optional(CONF_MODE, default=NumberMode.AUTO): vol.Coerce(NumberMode),
88 vol.Optional(CONF_NAME): vol.Any(cv.string,
None),
89 vol.Optional(CONF_PAYLOAD_RESET, default=DEFAULT_PAYLOAD_RESET): cv.string,
90 vol.Optional(CONF_STEP, default=DEFAULT_STEP): vol.All(
91 vol.Coerce(float), vol.Range(min=1e-3)
93 vol.Optional(CONF_UNIT_OF_MEASUREMENT): vol.Any(cv.string,
None),
94 vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
96 ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema)
98 PLATFORM_SCHEMA_MODERN = vol.All(
99 _PLATFORM_SCHEMA_BASE,
103 DISCOVERY_SCHEMA = vol.All(
104 _PLATFORM_SCHEMA_BASE.extend({}, extra=vol.REMOVE_EXTRA),
111 config_entry: ConfigEntry,
112 async_add_entities: AddEntitiesCallback,
114 """Set up MQTT number through YAML and through MQTT discovery."""
122 PLATFORM_SCHEMA_MODERN,
127 """representation of an MQTT number."""
129 _default_name = DEFAULT_NAME
130 _entity_id_format = number.ENTITY_ID_FORMAT
131 _attributes_extra_blocked = MQTT_NUMBER_ATTRIBUTES_BLOCKED
134 _command_template: Callable[[PublishPayloadType], PublishPayloadType]
135 _value_template: Callable[[ReceivePayloadType], ReceivePayloadType]
139 """Return the config schema."""
140 return DISCOVERY_SCHEMA
143 """(Re)Setup the entity."""
148 config.get(CONF_COMMAND_TEMPLATE), entity=self
151 config.get(CONF_VALUE_TEMPLATE),
153 ).async_render_with_possible_json_value
164 """Handle new MQTT messages."""
165 num_value: int | float |
None
167 if not payload.strip():
168 _LOGGER.debug(
"Ignoring empty state update from '%s'", msg.topic)
173 elif payload.isnumeric():
174 num_value =
int(payload)
176 num_value =
float(payload)
178 _LOGGER.warning(
"Payload '%s' is not a Number", msg.payload)
181 if num_value
is not None and (
185 "Invalid value for %s: %s (range %s - %s)",
197 """(Re)Subscribe to topics."""
199 CONF_STATE_TOPIC, self.
_message_received_message_received, {
"_attr_native_value"}
206 """(Re)Subscribe to topics."""
207 subscription.async_subscribe_topics_internal(self.
hasshasshass, self.
_sub_state_sub_state)
215 """Update the current value."""
216 current_number = value
218 if value.is_integer():
219 current_number =
int(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)
None _message_received(self, ReceiveMessage msg)
VolSchemaType config_schema()
None _prepare_subscribe_topics(self)
_attr_native_unit_of_measurement
None _setup_from_config(self, ConfigType config)
None async_set_native_value(self, float value)
None _subscribe_topics(self)
NumberExtraStoredData|None async_get_last_number_data(self)
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)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
ConfigType validate_config(ConfigType config)