Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for getting the disk temperature of a host."""
2 
3 from __future__ import annotations
4 
5 from datetime import timedelta
6 import logging
7 import socket
8 from telnetlib import Telnet # pylint: disable=deprecated-module
9 from typing import Any
10 
11 import voluptuous as vol
12 
14  PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA,
15  SensorDeviceClass,
16  SensorEntity,
17 )
18 from homeassistant.const import (
19  CONF_DISKS,
20  CONF_HOST,
21  CONF_NAME,
22  CONF_PORT,
23  UnitOfTemperature,
24 )
25 from homeassistant.core import HomeAssistant
27 from homeassistant.helpers.entity_platform import AddEntitiesCallback
28 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
29 
30 _LOGGER = logging.getLogger(__name__)
31 
32 ATTR_DEVICE = "device"
33 ATTR_MODEL = "model"
34 
35 DEFAULT_HOST = "localhost"
36 DEFAULT_PORT = 7634
37 DEFAULT_NAME = "HD Temperature"
38 DEFAULT_TIMEOUT = 5
39 
40 SCAN_INTERVAL = timedelta(minutes=1)
41 
42 PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend(
43  {
44  vol.Optional(CONF_DISKS, default=[]): vol.All(cv.ensure_list, [cv.string]),
45  vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string,
46  vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
47  vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
48  }
49 )
50 
51 
53  hass: HomeAssistant,
54  config: ConfigType,
55  add_entities: AddEntitiesCallback,
56  discovery_info: DiscoveryInfoType | None = None,
57 ) -> None:
58  """Set up the HDDTemp sensor."""
59  name = config.get(CONF_NAME)
60  host = config.get(CONF_HOST)
61  port = config.get(CONF_PORT)
62  disks = config.get(CONF_DISKS)
63 
64  hddtemp = HddTempData(host, port)
65  hddtemp.update()
66 
67  if not disks:
68  disks = [next(iter(hddtemp.data)).split("|")[0]]
69 
70  add_entities((HddTempSensor(name, disk, hddtemp) for disk in disks), True)
71 
72 
74  """Representation of a HDDTemp sensor."""
75 
76  _attr_device_class = SensorDeviceClass.TEMPERATURE
77 
78  def __init__(self, name, disk, hddtemp):
79  """Initialize a HDDTemp sensor."""
80  self.hddtemphddtemp = hddtemp
81  self.diskdisk = disk
82  self._attr_name_attr_name = f"{name} {disk}"
83  self._details_details = None
84 
85  @property
86  def extra_state_attributes(self) -> dict[str, Any] | None:
87  """Return the state attributes of the sensor."""
88  if self._details_details is not None:
89  return {ATTR_DEVICE: self._details_details[0], ATTR_MODEL: self._details_details[1]}
90  return None
91 
92  def update(self) -> None:
93  """Get the latest data from HDDTemp daemon and updates the state."""
94  self.hddtemphddtemp.update()
95 
96  if self.hddtemphddtemp.data and self.diskdisk in self.hddtemphddtemp.data:
97  self._details_details = self.hddtemphddtemp.data[self.diskdisk].split("|")
98  self._attr_native_value_attr_native_value = self._details_details[2]
99  if self._details_details is not None and self._details_details[3] == "F":
100  self._attr_native_unit_of_measurement_attr_native_unit_of_measurement = UnitOfTemperature.FAHRENHEIT
101  else:
102  self._attr_native_unit_of_measurement_attr_native_unit_of_measurement = UnitOfTemperature.CELSIUS
103  else:
104  self._attr_native_value_attr_native_value = None
105 
106 
108  """Get the latest data from HDDTemp and update the states."""
109 
110  def __init__(self, host, port):
111  """Initialize the data object."""
112  self.hosthost = host
113  self.portport = port
114  self.datadata = None
115 
116  def update(self):
117  """Get the latest data from HDDTemp running as daemon."""
118  try:
119  connection = Telnet(host=self.hosthost, port=self.portport, timeout=DEFAULT_TIMEOUT)
120  data = (
121  connection.read_all()
122  .decode("ascii")
123  .lstrip("|")
124  .rstrip("|")
125  .split("||")
126  )
127  self.datadata = {data[i].split("|")[0]: data[i] for i in range(0, len(data), 1)}
128  except ConnectionRefusedError:
129  _LOGGER.error("HDDTemp is not available at %s:%s", self.hosthost, self.portport)
130  self.datadata = None
131  except socket.gaierror:
132  _LOGGER.error("HDDTemp host not found %s:%s", self.hosthost, self.portport)
133  self.datadata = None
def __init__(self, name, disk, hddtemp)
Definition: sensor.py:78
dict[str, Any]|None extra_state_attributes(self)
Definition: sensor.py:86
None setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback add_entities, DiscoveryInfoType|None discovery_info=None)
Definition: sensor.py:57
def add_entities(account, async_add_entities, tracked)
Definition: sensor.py:40