Home Assistant Unofficial Reference 2024.12.1
button.py
Go to the documentation of this file.
1 """Support for MQTT buttons."""
2 
3 from __future__ import annotations
4 
5 import voluptuous as vol
6 
7 from homeassistant.components import button
8 from homeassistant.components.button import DEVICE_CLASSES_SCHEMA, ButtonEntity
9 from homeassistant.config_entries import ConfigEntry
10 from homeassistant.const import CONF_DEVICE_CLASS, CONF_NAME
11 from homeassistant.core import HomeAssistant, callback
13 from homeassistant.helpers.entity_platform import AddEntitiesCallback
14 from homeassistant.helpers.typing import ConfigType
15 
16 from .config import DEFAULT_RETAIN, MQTT_BASE_SCHEMA
17 from .const import CONF_COMMAND_TEMPLATE, CONF_COMMAND_TOPIC, CONF_RETAIN
18 from .entity import MqttEntity, async_setup_entity_entry_helper
19 from .models import MqttCommandTemplate
20 from .schemas import MQTT_ENTITY_COMMON_SCHEMA
21 from .util import valid_publish_topic
22 
23 PARALLEL_UPDATES = 0
24 
25 CONF_PAYLOAD_PRESS = "payload_press"
26 DEFAULT_NAME = "MQTT Button"
27 DEFAULT_PAYLOAD_PRESS = "PRESS"
28 
29 PLATFORM_SCHEMA_MODERN = MQTT_BASE_SCHEMA.extend(
30  {
31  vol.Optional(CONF_COMMAND_TEMPLATE): cv.template,
32  vol.Required(CONF_COMMAND_TOPIC): valid_publish_topic,
33  vol.Optional(CONF_DEVICE_CLASS): vol.Any(DEVICE_CLASSES_SCHEMA, None),
34  vol.Optional(CONF_NAME): vol.Any(cv.string, None),
35  vol.Optional(CONF_PAYLOAD_PRESS, default=DEFAULT_PAYLOAD_PRESS): cv.string,
36  vol.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean,
37  }
38 ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema)
39 
40 DISCOVERY_SCHEMA = PLATFORM_SCHEMA_MODERN.extend({}, extra=vol.REMOVE_EXTRA)
41 
42 
44  hass: HomeAssistant,
45  config_entry: ConfigEntry,
46  async_add_entities: AddEntitiesCallback,
47 ) -> None:
48  """Set up MQTT button through YAML and through MQTT discovery."""
50  hass,
51  config_entry,
52  MqttButton,
53  button.DOMAIN,
54  async_add_entities,
55  DISCOVERY_SCHEMA,
56  PLATFORM_SCHEMA_MODERN,
57  )
58 
59 
61  """Representation of a switch that can be toggled using MQTT."""
62 
63  _default_name = DEFAULT_NAME
64  _entity_id_format = button.ENTITY_ID_FORMAT
65 
66  @staticmethod
67  def config_schema() -> vol.Schema:
68  """Return the config schema."""
69  return DISCOVERY_SCHEMA
70 
71  def _setup_from_config(self, config: ConfigType) -> None:
72  """(Re)Setup the entity."""
73  self._command_template_command_template = MqttCommandTemplate(
74  config.get(CONF_COMMAND_TEMPLATE), entity=self
75  ).async_render
76  self._attr_device_class_attr_device_class = self._config_config.get(CONF_DEVICE_CLASS)
77 
78  @callback
79  def _prepare_subscribe_topics(self) -> None:
80  """(Re)Subscribe to topics."""
81 
82  async def _subscribe_topics(self) -> None:
83  """(Re)Subscribe to topics."""
84 
85  async def async_press(self) -> None:
86  """Turn the device on.
87 
88  This method is a coroutine.
89  """
90  payload = self._command_template(self._config[CONF_PAYLOAD_PRESS])
91  await self.async_publish_with_config(self._config[CONF_COMMAND_TOPIC], payload)
None _setup_from_config(self, ConfigType config)
Definition: button.py:71
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: button.py:47
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)
Definition: entity.py:245