From e8e0dc5720d83ff1055e40e2d05431831382a4dd Mon Sep 17 00:00:00 2001 From: Tobias Sauerwein Date: Thu, 16 Nov 2017 22:05:23 +0000 Subject: [PATCH 1/3] Add hddtemp sensor device even if unreachable. --- homeassistant/components/sensor/hddtemp.py | 34 +++++++++++++--------- tests/components/sensor/test_hddtemp.py | 25 ++++++++++++++-- 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/homeassistant/components/sensor/hddtemp.py b/homeassistant/components/sensor/hddtemp.py index e025cd2fbcd022..25fde228328777 100644 --- a/homeassistant/components/sensor/hddtemp.py +++ b/homeassistant/components/sensor/hddtemp.py @@ -7,6 +7,7 @@ import logging from datetime import timedelta from telnetlib import Telnet +import socket import voluptuous as vol @@ -46,16 +47,12 @@ def setup_platform(hass, config, add_devices, discovery_info=None): hddtemp = HddTempData(host, port) hddtemp.update() - if hddtemp.data is None: - return False - if not disks: disks = [next(iter(hddtemp.data)).split('|')[0]] dev = [] 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) @@ -84,17 +81,23 @@ def state(self): @property def unit_of_measurement(self): """Return the unit the value is expressed in.""" - if self._details[3] == 'C': - return TEMP_CELSIUS - return TEMP_FAHRENHEIT + if self._details is not None and self._details[3] == 'F': + return TEMP_FAHRENHEIT + return TEMP_CELSIUS @property def device_state_attributes(self): """Return the state attributes of the sensor.""" - return { - ATTR_DEVICE: self._details[0], - ATTR_MODEL: self._details[1], - } + if self._details is not None: + return { + ATTR_DEVICE: self._details[0], + ATTR_MODEL: self._details[1], + } + # else: + # return { + # ATTR_DEVICE: '-', + # ATTR_MODEL: '-', + # } def update(self): """Get the latest data from HDDTemp daemon and updates the state.""" @@ -126,6 +129,9 @@ def update(self): self.data = {data[i].split('|')[0]: data[i] for i in range(0, len(data), 1)} except ConnectionRefusedError: - _LOGGER.error( - "HDDTemp is not available at %s:%s", self.host, self.port) + _LOGGER.error("HDDTemp is not available at %s:%s", + 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 diff --git a/tests/components/sensor/test_hddtemp.py b/tests/components/sensor/test_hddtemp.py index 35d1c08c08a73d..3be35f3281c101 100644 --- a/tests/components/sensor/test_hddtemp.py +++ b/tests/components/sensor/test_hddtemp.py @@ -1,4 +1,6 @@ """The tests for the hddtemp platform.""" +import socket + import unittest from unittest.mock import patch @@ -56,6 +58,13 @@ } } +VALID_CONFIG_HOST_UNREACHABLE = { + 'sensor': { + 'platform': 'hddtemp', + 'host': 'bob.local', + } +} + class TelnetMock(): """Mock class for the telnetlib.Telnet object.""" @@ -75,6 +84,8 @@ def read_all(self): """Return sample values.""" if self.host == 'alice.local': raise ConnectionRefusedError + elif self.host == 'bob.local': + raise socket.gaierror else: return self.sample_data return None @@ -161,7 +172,10 @@ def test_hddtemp_wrong_disk(self): """Test hddtemp wrong disk configuration.""" 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) def test_hddtemp_multiple_disks(self): @@ -189,7 +203,14 @@ def test_hddtemp_multiple_disks(self): 'HD Temperature ' + reference['device']) @patch('telnetlib.Telnet', new=TelnetMock) - def test_hddtemp_host_unreachable(self): + def test_hddtemp_host_refused(self): """Test hddtemp if host unreachable.""" assert setup_component(self.hass, 'sensor', VALID_CONFIG_HOST) 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) From 4af21a26b0ebab6df885302cbae2ad58181e6c06 Mon Sep 17 00:00:00 2001 From: Tobias Sauerwein Date: Thu, 16 Nov 2017 22:46:31 +0000 Subject: [PATCH 2/3] Removed old commented code. --- homeassistant/components/sensor/hddtemp.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/homeassistant/components/sensor/hddtemp.py b/homeassistant/components/sensor/hddtemp.py index 25fde228328777..d7c24492ce12d3 100644 --- a/homeassistant/components/sensor/hddtemp.py +++ b/homeassistant/components/sensor/hddtemp.py @@ -93,11 +93,6 @@ def device_state_attributes(self): ATTR_DEVICE: self._details[0], ATTR_MODEL: self._details[1], } - # else: - # return { - # ATTR_DEVICE: '-', - # ATTR_MODEL: '-', - # } def update(self): """Get the latest data from HDDTemp daemon and updates the state.""" From 7e9ea9de1cd7f9be007d052353ba6946168e7426 Mon Sep 17 00:00:00 2001 From: Tobias Sauerwein Date: Fri, 17 Nov 2017 08:45:18 +0000 Subject: [PATCH 3/3] Move unit detection logic into update. --- homeassistant/components/sensor/hddtemp.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/sensor/hddtemp.py b/homeassistant/components/sensor/hddtemp.py index d7c24492ce12d3..006542a777f7fb 100644 --- a/homeassistant/components/sensor/hddtemp.py +++ b/homeassistant/components/sensor/hddtemp.py @@ -67,6 +67,7 @@ def __init__(self, name, disk, hddtemp): self._name = '{} {}'.format(name, disk) self._state = None self._details = None + self._unit = None @property def name(self): @@ -81,9 +82,7 @@ def state(self): @property def unit_of_measurement(self): """Return the unit the value is expressed in.""" - if self._details is not None and self._details[3] == 'F': - return TEMP_FAHRENHEIT - return TEMP_CELSIUS + return self._unit @property def device_state_attributes(self): @@ -101,6 +100,10 @@ def update(self): if self.hddtemp.data and self.disk in self.hddtemp.data: self._details = self.hddtemp.data[self.disk].split('|') 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: self._state = None