Home Assistant Unofficial Reference 2024.12.1
scene.py
Go to the documentation of this file.
1 """Support for MQTT scenes."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 import voluptuous as vol
8 
9 from homeassistant.components import scene
10 from homeassistant.components.scene import Scene
11 from homeassistant.config_entries import ConfigEntry
12 from homeassistant.const import CONF_NAME, CONF_PAYLOAD_ON
13 from homeassistant.core import HomeAssistant, callback
15 from homeassistant.helpers.entity_platform import AddEntitiesCallback
16 from homeassistant.helpers.typing import ConfigType
17 
18 from .config import MQTT_BASE_SCHEMA
19 from .const import CONF_COMMAND_TOPIC, CONF_RETAIN
20 from .entity import MqttEntity, async_setup_entity_entry_helper
21 from .schemas import MQTT_ENTITY_COMMON_SCHEMA
22 from .util import valid_publish_topic
23 
24 PARALLEL_UPDATES = 0
25 
26 DEFAULT_NAME = "MQTT Scene"
27 DEFAULT_RETAIN = False
28 
29 ENTITY_ID_FORMAT = scene.DOMAIN + ".{}"
30 
31 PLATFORM_SCHEMA_MODERN = MQTT_BASE_SCHEMA.extend(
32  {
33  vol.Required(CONF_COMMAND_TOPIC): valid_publish_topic,
34  vol.Optional(CONF_NAME): vol.Any(cv.string, None),
35  vol.Optional(CONF_PAYLOAD_ON): 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 scene through YAML and through MQTT discovery."""
50  hass,
51  config_entry,
52  MqttScene,
53  scene.DOMAIN,
54  async_add_entities,
55  DISCOVERY_SCHEMA,
56  PLATFORM_SCHEMA_MODERN,
57  )
58 
59 
60 class MqttScene(
61  MqttEntity,
62  Scene,
63 ):
64  """Representation of a scene that can be activated using MQTT."""
65 
66  _default_name = DEFAULT_NAME
67  _entity_id_format = scene.DOMAIN + ".{}"
68 
69  @staticmethod
70  def config_schema() -> vol.Schema:
71  """Return the config schema."""
72  return DISCOVERY_SCHEMA
73 
74  def _setup_from_config(self, config: ConfigType) -> None:
75  """(Re)Setup the entity."""
76 
77  @callback
78  def _prepare_subscribe_topics(self) -> None:
79  """(Re)Subscribe to topics."""
80 
81  async def _subscribe_topics(self) -> None:
82  """(Re)Subscribe to topics."""
83 
84  async def async_activate(self, **kwargs: Any) -> None:
85  """Activate the scene.
86 
87  This method is a coroutine.
88  """
89  await self.async_publish_with_config(
90  self._config[CONF_COMMAND_TOPIC], self._config[CONF_PAYLOAD_ON]
91  )
None _setup_from_config(self, ConfigType config)
Definition: scene.py:74
None async_activate(self, **Any kwargs)
Definition: scene.py:84
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
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: scene.py:47