Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Details about the built-in battery."""
2 
3 from __future__ import annotations
4 
5 import logging
6 import os
7 
8 from batinfo import Batteries
9 import voluptuous as vol
10 
12  PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA,
13  SensorDeviceClass,
14  SensorEntity,
15 )
16 from homeassistant.const import ATTR_NAME, ATTR_SERIAL_NUMBER, CONF_NAME, PERCENTAGE
17 from homeassistant.core import HomeAssistant
19 from homeassistant.helpers.entity_platform import AddEntitiesCallback
20 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
21 
22 _LOGGER = logging.getLogger(__name__)
23 
24 ATTR_PATH = "path"
25 ATTR_ALARM = "alarm"
26 ATTR_CAPACITY = "capacity"
27 ATTR_CAPACITY_LEVEL = "capacity_level"
28 ATTR_CYCLE_COUNT = "cycle_count"
29 ATTR_ENERGY_FULL = "energy_full"
30 ATTR_ENERGY_FULL_DESIGN = "energy_full_design"
31 ATTR_ENERGY_NOW = "energy_now"
32 ATTR_MANUFACTURER = "manufacturer"
33 ATTR_MODEL_NAME = "model_name"
34 ATTR_POWER_NOW = "power_now"
35 ATTR_STATUS = "status"
36 ATTR_VOLTAGE_MIN_DESIGN = "voltage_min_design"
37 ATTR_VOLTAGE_NOW = "voltage_now"
38 
39 ATTR_HEALTH = "health"
40 ATTR_STATUS = "status"
41 
42 CONF_BATTERY = "battery"
43 CONF_SYSTEM = "system"
44 
45 DEFAULT_BATTERY = 1
46 DEFAULT_NAME = "Battery"
47 DEFAULT_PATH = "/sys/class/power_supply"
48 DEFAULT_SYSTEM = "linux"
49 
50 SYSTEMS = ["android", "linux"]
51 
52 PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend(
53  {
54  vol.Optional(CONF_BATTERY, default=DEFAULT_BATTERY): cv.positive_int,
55  vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
56  vol.Optional(CONF_SYSTEM, default=DEFAULT_SYSTEM): vol.In(SYSTEMS),
57  }
58 )
59 
60 
62  hass: HomeAssistant,
63  config: ConfigType,
64  add_entities: AddEntitiesCallback,
65  discovery_info: DiscoveryInfoType | None = None,
66 ) -> None:
67  """Set up the Linux Battery sensor."""
68  name = config.get(CONF_NAME)
69  battery_id = config.get(CONF_BATTERY)
70  system = config.get(CONF_SYSTEM)
71 
72  try:
73  if system == "android":
74  os.listdir(os.path.join(DEFAULT_PATH, "battery"))
75  else:
76  os.listdir(os.path.join(DEFAULT_PATH, f"BAT{battery_id}"))
77  except FileNotFoundError:
78  _LOGGER.error("No battery found")
79  return
80 
81  add_entities([LinuxBatterySensor(name, battery_id, system)], True)
82 
83 
85  """Representation of a Linux Battery sensor."""
86 
87  _attr_device_class = SensorDeviceClass.BATTERY
88  _attr_native_unit_of_measurement = PERCENTAGE
89 
90  def __init__(self, name, battery_id, system):
91  """Initialize the battery sensor."""
92  self._battery_battery = Batteries()
93 
94  self._attr_name_attr_name = name
95  self._battery_stat_battery_stat = None
96  self._battery_id_battery_id = battery_id - 1
97  self._system_system = system
98 
99  @property
101  """Return the state attributes of the sensor."""
102  if self._system_system == "android":
103  return {
104  ATTR_NAME: self._battery_stat_battery_stat.name,
105  ATTR_PATH: self._battery_stat_battery_stat.path,
106  ATTR_HEALTH: self._battery_stat_battery_stat.health,
107  ATTR_STATUS: self._battery_stat_battery_stat.status,
108  }
109  return {
110  ATTR_NAME: self._battery_stat_battery_stat.name,
111  ATTR_PATH: self._battery_stat_battery_stat.path,
112  ATTR_ALARM: self._battery_stat_battery_stat.alarm,
113  ATTR_CAPACITY_LEVEL: self._battery_stat_battery_stat.capacity_level,
114  ATTR_CYCLE_COUNT: self._battery_stat_battery_stat.cycle_count,
115  ATTR_ENERGY_FULL: self._battery_stat_battery_stat.energy_full,
116  ATTR_ENERGY_FULL_DESIGN: self._battery_stat_battery_stat.energy_full_design,
117  ATTR_ENERGY_NOW: self._battery_stat_battery_stat.energy_now,
118  ATTR_MANUFACTURER: self._battery_stat_battery_stat.manufacturer,
119  ATTR_MODEL_NAME: self._battery_stat_battery_stat.model_name,
120  ATTR_POWER_NOW: self._battery_stat_battery_stat.power_now,
121  ATTR_SERIAL_NUMBER: self._battery_stat_battery_stat.serial_number,
122  ATTR_STATUS: self._battery_stat_battery_stat.status,
123  ATTR_VOLTAGE_MIN_DESIGN: self._battery_stat_battery_stat.voltage_min_design,
124  ATTR_VOLTAGE_NOW: self._battery_stat_battery_stat.voltage_now,
125  }
126 
127  def update(self) -> None:
128  """Get the latest data and updates the states."""
129  self._battery_battery.update()
130  self._battery_stat_battery_stat = self._battery_battery.stat[self._battery_id_battery_id]
131  self._attr_native_value_attr_native_value = self._battery_stat_battery_stat.capacity
def add_entities(account, async_add_entities, tracked)
Definition: sensor.py:40
None setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback add_entities, DiscoveryInfoType|None discovery_info=None)
Definition: sensor.py:66