Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for the CO2signal platform."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 
8 from aioelectricitymaps.models import CarbonIntensityResponse
9 
11  SensorEntity,
12  SensorEntityDescription,
13  SensorStateClass,
14 )
15 from homeassistant.const import PERCENTAGE
16 from homeassistant.core import HomeAssistant
17 from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 from homeassistant.helpers.update_coordinator import CoordinatorEntity
20 
21 from . import CO2SignalConfigEntry
22 from .const import ATTRIBUTION, DOMAIN
23 from .coordinator import CO2SignalCoordinator
24 
25 
26 @dataclass(frozen=True, kw_only=True)
28  """Provide a description of a CO2 sensor."""
29 
30  # For backwards compat, allow description to override unique ID key to use
31  unique_id: str | None = None
32  unit_of_measurement_fn: Callable[[CarbonIntensityResponse], str | None] | None = (
33  None
34  )
35  value_fn: Callable[[CarbonIntensityResponse], float | None]
36 
37 
38 SENSORS = (
40  key="carbonIntensity",
41  translation_key="carbon_intensity",
42  unique_id="co2intensity",
43  value_fn=lambda response: response.data.carbon_intensity,
44  unit_of_measurement_fn=lambda response: response.units.carbon_intensity,
45  ),
47  key="fossilFuelPercentage",
48  translation_key="fossil_fuel_percentage",
49  native_unit_of_measurement=PERCENTAGE,
50  value_fn=lambda response: response.data.fossil_fuel_percentage,
51  ),
52 )
53 
54 
56  hass: HomeAssistant,
57  entry: CO2SignalConfigEntry,
58  async_add_entities: AddEntitiesCallback,
59 ) -> None:
60  """Set up the CO2signal sensor."""
61  coordinator = entry.runtime_data
63  [CO2Sensor(coordinator, description) for description in SENSORS], False
64  )
65 
66 
67 class CO2Sensor(CoordinatorEntity[CO2SignalCoordinator], SensorEntity):
68  """Implementation of the CO2Signal sensor."""
69 
70  entity_description: CO2SensorEntityDescription
71  _attr_attribution = ATTRIBUTION
72  _attr_has_entity_name = True
73  _attr_state_class = SensorStateClass.MEASUREMENT
74 
75  def __init__(
76  self, coordinator: CO2SignalCoordinator, description: CO2SensorEntityDescription
77  ) -> None:
78  """Initialize the sensor."""
79  super().__init__(coordinator)
80  self.entity_descriptionentity_description = description
81 
82  self._attr_extra_state_attributes_attr_extra_state_attributes = {
83  "country_code": coordinator.data.country_code,
84  }
85  self._attr_device_info_attr_device_info = DeviceInfo(
86  configuration_url="https://www.electricitymaps.com/",
87  entry_type=DeviceEntryType.SERVICE,
88  identifiers={(DOMAIN, coordinator.entry_id)},
89  manufacturer="Electricity Maps",
90  name="Electricity Maps",
91  )
92  self._attr_unique_id_attr_unique_id = (
93  f"{coordinator.entry_id}_{description.unique_id or description.key}"
94  )
95 
96  @property
97  def native_value(self) -> float | None:
98  """Return sensor state."""
99  return self.entity_descriptionentity_description.value_fn(self.coordinator.data)
100 
101  @property
102  def native_unit_of_measurement(self) -> str | None:
103  """Return the unit of measurement."""
104  if self.entity_descriptionentity_description.unit_of_measurement_fn:
105  return self.entity_descriptionentity_description.unit_of_measurement_fn(self.coordinator.data)
106 
107  return self.entity_descriptionentity_description.native_unit_of_measurement
None __init__(self, CO2SignalCoordinator coordinator, CO2SensorEntityDescription description)
Definition: sensor.py:77
None async_setup_entry(HomeAssistant hass, CO2SignalConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:59