Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for DSMR Reader through MQTT."""
2 
3 from __future__ import annotations
4 
5 from homeassistant.components import mqtt
6 from homeassistant.components.sensor import SensorEntity
7 from homeassistant.config_entries import ConfigEntry
8 from homeassistant.core import HomeAssistant, callback
9 from homeassistant.exceptions import HomeAssistantError
10 from homeassistant.helpers.entity_platform import AddEntitiesCallback
11 from homeassistant.helpers.issue_registry import IssueSeverity, async_create_issue
12 from homeassistant.util import slugify
13 
14 from .const import DOMAIN
15 from .definitions import SENSORS, DSMRReaderSensorEntityDescription
16 
17 
19  _: HomeAssistant,
20  config_entry: ConfigEntry,
21  async_add_entities: AddEntitiesCallback,
22 ) -> None:
23  """Set up DSMR Reader sensors from config entry."""
24  async_add_entities(DSMRSensor(description, config_entry) for description in SENSORS)
25 
26 
28  """Representation of a DSMR sensor that is updated via MQTT."""
29 
30  _attr_has_entity_name = True
31  entity_description: DSMRReaderSensorEntityDescription
32 
33  def __init__(
34  self, description: DSMRReaderSensorEntityDescription, config_entry: ConfigEntry
35  ) -> None:
36  """Initialize the sensor."""
37  self.entity_descriptionentity_description = description
38 
39  slug = slugify(description.key.replace("/", "_"))
40  self.entity_identity_identity_id = f"sensor.{slug}"
41  self._attr_unique_id_attr_unique_id = f"{config_entry.entry_id}-{slug}"
42 
43  async def async_added_to_hass(self) -> None:
44  """Subscribe to MQTT events."""
45 
46  @callback
47  def message_received(message):
48  """Handle new MQTT messages."""
49  if message.payload == "":
50  self._attr_native_value_attr_native_value = None
51  elif self.entity_descriptionentity_description.state is not None:
52  # Perform optional additional parsing
53  self._attr_native_value_attr_native_value = self.entity_descriptionentity_description.state(message.payload)
54  else:
55  self._attr_native_value_attr_native_value = message.payload
56 
57  self.async_write_ha_stateasync_write_ha_state()
58 
59  try:
60  await mqtt.async_subscribe(
61  self.hasshass, self.entity_descriptionentity_description.key, message_received, 1
62  )
63  except HomeAssistantError:
65  self.hasshass,
66  DOMAIN,
67  f"cannot_subscribe_mqtt_topic_{self.entity_description.key}",
68  is_fixable=False,
69  severity=IssueSeverity.WARNING,
70  translation_key="cannot_subscribe_mqtt_topic",
71  translation_placeholders={
72  "topic": self.entity_descriptionentity_description.key,
73  "topic_title": self.entity_descriptionentity_description.key.split("/")[-1],
74  },
75  )
None __init__(self, DSMRReaderSensorEntityDescription description, ConfigEntry config_entry)
Definition: sensor.py:35
None async_setup_entry(HomeAssistant _, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:22
None async_create_issue(HomeAssistant hass, str entry_id)
Definition: repairs.py:69