mirror of
https://github.com/home-assistant/core.git
synced 2025-07-18 02:37:08 +00:00
Add hddtemp sensor device even if unreachable. (#10623)
* Add hddtemp sensor device even if unreachable. * Removed old commented code. * Move unit detection logic into update.
This commit is contained in:
parent
e9b691173a
commit
be5f0fb3ac
@ -7,6 +7,7 @@ https://home-assistant.io/components/sensor.hddtemp/
|
|||||||
import logging
|
import logging
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from telnetlib import Telnet
|
from telnetlib import Telnet
|
||||||
|
import socket
|
||||||
|
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
@ -46,15 +47,11 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
|||||||
hddtemp = HddTempData(host, port)
|
hddtemp = HddTempData(host, port)
|
||||||
hddtemp.update()
|
hddtemp.update()
|
||||||
|
|
||||||
if hddtemp.data is None:
|
|
||||||
return False
|
|
||||||
|
|
||||||
if not disks:
|
if not disks:
|
||||||
disks = [next(iter(hddtemp.data)).split('|')[0]]
|
disks = [next(iter(hddtemp.data)).split('|')[0]]
|
||||||
|
|
||||||
dev = []
|
dev = []
|
||||||
for disk in disks:
|
for disk in disks:
|
||||||
if disk in hddtemp.data:
|
|
||||||
dev.append(HddTempSensor(name, disk, hddtemp))
|
dev.append(HddTempSensor(name, disk, hddtemp))
|
||||||
|
|
||||||
add_devices(dev, True)
|
add_devices(dev, True)
|
||||||
@ -70,6 +67,7 @@ class HddTempSensor(Entity):
|
|||||||
self._name = '{} {}'.format(name, disk)
|
self._name = '{} {}'.format(name, disk)
|
||||||
self._state = None
|
self._state = None
|
||||||
self._details = None
|
self._details = None
|
||||||
|
self._unit = None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def name(self):
|
def name(self):
|
||||||
@ -84,13 +82,12 @@ class HddTempSensor(Entity):
|
|||||||
@property
|
@property
|
||||||
def unit_of_measurement(self):
|
def unit_of_measurement(self):
|
||||||
"""Return the unit the value is expressed in."""
|
"""Return the unit the value is expressed in."""
|
||||||
if self._details[3] == 'C':
|
return self._unit
|
||||||
return TEMP_CELSIUS
|
|
||||||
return TEMP_FAHRENHEIT
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def device_state_attributes(self):
|
def device_state_attributes(self):
|
||||||
"""Return the state attributes of the sensor."""
|
"""Return the state attributes of the sensor."""
|
||||||
|
if self._details is not None:
|
||||||
return {
|
return {
|
||||||
ATTR_DEVICE: self._details[0],
|
ATTR_DEVICE: self._details[0],
|
||||||
ATTR_MODEL: self._details[1],
|
ATTR_MODEL: self._details[1],
|
||||||
@ -103,6 +100,10 @@ class HddTempSensor(Entity):
|
|||||||
if self.hddtemp.data and self.disk in self.hddtemp.data:
|
if self.hddtemp.data and self.disk in self.hddtemp.data:
|
||||||
self._details = self.hddtemp.data[self.disk].split('|')
|
self._details = self.hddtemp.data[self.disk].split('|')
|
||||||
self._state = self._details[2]
|
self._state = self._details[2]
|
||||||
|
if self._details is not None and self._details[3] == 'F':
|
||||||
|
self._unit = TEMP_FAHRENHEIT
|
||||||
|
else:
|
||||||
|
self._unit = TEMP_CELSIUS
|
||||||
else:
|
else:
|
||||||
self._state = None
|
self._state = None
|
||||||
|
|
||||||
@ -126,6 +127,9 @@ class HddTempData(object):
|
|||||||
self.data = {data[i].split('|')[0]: data[i]
|
self.data = {data[i].split('|')[0]: data[i]
|
||||||
for i in range(0, len(data), 1)}
|
for i in range(0, len(data), 1)}
|
||||||
except ConnectionRefusedError:
|
except ConnectionRefusedError:
|
||||||
_LOGGER.error(
|
_LOGGER.error("HDDTemp is not available at %s:%s",
|
||||||
"HDDTemp is not available at %s:%s", self.host, self.port)
|
self.host, self.port)
|
||||||
|
self.data = None
|
||||||
|
except socket.gaierror:
|
||||||
|
_LOGGER.error("HDDTemp host not found %s:%s", self.host, self.port)
|
||||||
self.data = None
|
self.data = None
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
"""The tests for the hddtemp platform."""
|
"""The tests for the hddtemp platform."""
|
||||||
|
import socket
|
||||||
|
|
||||||
import unittest
|
import unittest
|
||||||
from unittest.mock import patch
|
from unittest.mock import patch
|
||||||
|
|
||||||
@ -56,6 +58,13 @@ VALID_CONFIG_HOST = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VALID_CONFIG_HOST_UNREACHABLE = {
|
||||||
|
'sensor': {
|
||||||
|
'platform': 'hddtemp',
|
||||||
|
'host': 'bob.local',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class TelnetMock():
|
class TelnetMock():
|
||||||
"""Mock class for the telnetlib.Telnet object."""
|
"""Mock class for the telnetlib.Telnet object."""
|
||||||
@ -75,6 +84,8 @@ class TelnetMock():
|
|||||||
"""Return sample values."""
|
"""Return sample values."""
|
||||||
if self.host == 'alice.local':
|
if self.host == 'alice.local':
|
||||||
raise ConnectionRefusedError
|
raise ConnectionRefusedError
|
||||||
|
elif self.host == 'bob.local':
|
||||||
|
raise socket.gaierror
|
||||||
else:
|
else:
|
||||||
return self.sample_data
|
return self.sample_data
|
||||||
return None
|
return None
|
||||||
@ -161,7 +172,10 @@ class TestHDDTempSensor(unittest.TestCase):
|
|||||||
"""Test hddtemp wrong disk configuration."""
|
"""Test hddtemp wrong disk configuration."""
|
||||||
assert setup_component(self.hass, 'sensor', VALID_CONFIG_WRONG_DISK)
|
assert setup_component(self.hass, 'sensor', VALID_CONFIG_WRONG_DISK)
|
||||||
|
|
||||||
self.assertEqual(len(self.hass.states.all()), 0)
|
self.assertEqual(len(self.hass.states.all()), 1)
|
||||||
|
state = self.hass.states.get('sensor.hd_temperature_devsdx1')
|
||||||
|
self.assertEqual(state.attributes.get('friendly_name'),
|
||||||
|
'HD Temperature ' + '/dev/sdx1')
|
||||||
|
|
||||||
@patch('telnetlib.Telnet', new=TelnetMock)
|
@patch('telnetlib.Telnet', new=TelnetMock)
|
||||||
def test_hddtemp_multiple_disks(self):
|
def test_hddtemp_multiple_disks(self):
|
||||||
@ -189,7 +203,14 @@ class TestHDDTempSensor(unittest.TestCase):
|
|||||||
'HD Temperature ' + reference['device'])
|
'HD Temperature ' + reference['device'])
|
||||||
|
|
||||||
@patch('telnetlib.Telnet', new=TelnetMock)
|
@patch('telnetlib.Telnet', new=TelnetMock)
|
||||||
def test_hddtemp_host_unreachable(self):
|
def test_hddtemp_host_refused(self):
|
||||||
"""Test hddtemp if host unreachable."""
|
"""Test hddtemp if host unreachable."""
|
||||||
assert setup_component(self.hass, 'sensor', VALID_CONFIG_HOST)
|
assert setup_component(self.hass, 'sensor', VALID_CONFIG_HOST)
|
||||||
self.assertEqual(len(self.hass.states.all()), 0)
|
self.assertEqual(len(self.hass.states.all()), 0)
|
||||||
|
|
||||||
|
@patch('telnetlib.Telnet', new=TelnetMock)
|
||||||
|
def test_hddtemp_host_unreachable(self):
|
||||||
|
"""Test hddtemp if host unreachable."""
|
||||||
|
assert setup_component(self.hass, 'sensor',
|
||||||
|
VALID_CONFIG_HOST_UNREACHABLE)
|
||||||
|
self.assertEqual(len(self.hass.states.all()), 0)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user