From 29cd5221c87eedef3a92b33116253f88129a46c8 Mon Sep 17 00:00:00 2001 From: c727 Date: Sat, 16 Jun 2018 04:37:05 +0200 Subject: [PATCH 1/4] Use symbol as unit of measurement --- homeassistant/components/sensor/uptime.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/sensor/uptime.py b/homeassistant/components/sensor/uptime.py index 7e89389981517..cb73ced988674 100644 --- a/homeassistant/components/sensor/uptime.py +++ b/homeassistant/components/sensor/uptime.py @@ -20,6 +20,12 @@ ICON = 'mdi:clock' +UNIT_OF_MEASUREMENT = { + 'hours': 'h', + 'minutes': 'min', + 'days': 'd' +} + PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_UNIT_OF_MEASUREMENT, default='days'): @@ -42,7 +48,7 @@ class UptimeSensor(Entity): def __init__(self, name, unit): """Initialize the uptime sensor.""" self._name = name - self._unit = unit + self._unit = UNIT_OF_MEASUREMENT[unit] self.initial = dt_util.now() self._state = None @@ -71,9 +77,9 @@ async def async_update(self): delta = dt_util.now() - self.initial div_factor = 3600 - if self.unit_of_measurement == 'days': + if self.unit_of_measurement == 'd': div_factor *= 24 - elif self.unit_of_measurement == 'minutes': + elif self.unit_of_measurement == 'min': div_factor /= 60 delta = delta.total_seconds() / div_factor From e9b841c92ab4824bf1d91645bef694e0f2d73ae5 Mon Sep 17 00:00:00 2001 From: c727 Date: Sat, 16 Jun 2018 05:09:20 +0200 Subject: [PATCH 2/4] Update tests --- tests/components/sensor/test_uptime.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/components/sensor/test_uptime.py b/tests/components/sensor/test_uptime.py index a919e7d20db92..74902aa25b415 100644 --- a/tests/components/sensor/test_uptime.py +++ b/tests/components/sensor/test_uptime.py @@ -62,7 +62,7 @@ def test_uptime_sensor_config_minutes(self): def test_uptime_sensor_days_output(self): """Test uptime sensor output data.""" sensor = UptimeSensor('test', 'days') - self.assertEqual(sensor.unit_of_measurement, 'days') + self.assertEqual(sensor.unit_of_measurement, 'd') new_time = sensor.initial + timedelta(days=1) with patch('homeassistant.util.dt.now', return_value=new_time): run_coroutine_threadsafe( @@ -81,7 +81,7 @@ def test_uptime_sensor_days_output(self): def test_uptime_sensor_hours_output(self): """Test uptime sensor output data.""" sensor = UptimeSensor('test', 'hours') - self.assertEqual(sensor.unit_of_measurement, 'hours') + self.assertEqual(sensor.unit_of_measurement, 'h') new_time = sensor.initial + timedelta(hours=16) with patch('homeassistant.util.dt.now', return_value=new_time): run_coroutine_threadsafe( @@ -100,7 +100,7 @@ def test_uptime_sensor_hours_output(self): def test_uptime_sensor_minutes_output(self): """Test uptime sensor output data.""" sensor = UptimeSensor('test', 'minutes') - self.assertEqual(sensor.unit_of_measurement, 'minutes') + self.assertEqual(sensor.unit_of_measurement, 'min') new_time = sensor.initial + timedelta(minutes=16) with patch('homeassistant.util.dt.now', return_value=new_time): run_coroutine_threadsafe( From 2ee2fee22e385dee344ff6cc67ac1d3d0656c2bd Mon Sep 17 00:00:00 2001 From: c727 <11984118+c727@users.noreply.github.com> Date: Sat, 16 Jun 2018 14:11:30 +0200 Subject: [PATCH 3/4] Change to new device class --- homeassistant/components/sensor/uptime.py | 41 +++--------- tests/components/sensor/test_uptime.py | 80 ----------------------- 2 files changed, 9 insertions(+), 112 deletions(-) diff --git a/homeassistant/components/sensor/uptime.py b/homeassistant/components/sensor/uptime.py index cb73ced988674..18a7c7575f46e 100644 --- a/homeassistant/components/sensor/uptime.py +++ b/homeassistant/components/sensor/uptime.py @@ -9,7 +9,7 @@ import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import CONF_NAME, CONF_UNIT_OF_MEASUREMENT +from homeassistant.const import CONF_NAME import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity import homeassistant.util.dt as dt_util @@ -18,18 +18,12 @@ DEFAULT_NAME = 'Uptime' -ICON = 'mdi:clock' +ICON = 'mdi:timer' -UNIT_OF_MEASUREMENT = { - 'hours': 'h', - 'minutes': 'min', - 'days': 'd' -} +DEVICE_CLASS = 'datetime' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_UNIT_OF_MEASUREMENT, default='days'): - vol.All(cv.string, vol.In(['minutes', 'hours', 'days'])) }) @@ -37,20 +31,17 @@ async def async_setup_platform( hass, config, async_add_devices, discovery_info=None): """Set up the uptime sensor platform.""" name = config.get(CONF_NAME) - units = config.get(CONF_UNIT_OF_MEASUREMENT) - async_add_devices([UptimeSensor(name, units)], True) + async_add_devices([UptimeSensor(name)], True) class UptimeSensor(Entity): """Representation of an uptime sensor.""" - def __init__(self, name, unit): + def __init__(self, name): """Initialize the uptime sensor.""" self._name = name - self._unit = UNIT_OF_MEASUREMENT[unit] - self.initial = dt_util.now() - self._state = None + self._state = dt_util.now() @property def name(self): @@ -63,25 +54,11 @@ def icon(self): return ICON @property - def unit_of_measurement(self): - """Return the unit of measurement the value is expressed in.""" - return self._unit + def device_class(self): + """Return the device class of the sensor.""" + return DEVICE_CLASS @property def state(self): """Return the state of the sensor.""" return self._state - - async def async_update(self): - """Update the state of the sensor.""" - delta = dt_util.now() - self.initial - div_factor = 3600 - - if self.unit_of_measurement == 'd': - div_factor *= 24 - elif self.unit_of_measurement == 'min': - div_factor /= 60 - - delta = delta.total_seconds() / div_factor - self._state = round(delta, 2) - _LOGGER.debug("New value: %s", delta) diff --git a/tests/components/sensor/test_uptime.py b/tests/components/sensor/test_uptime.py index 74902aa25b415..00c4f3d4ae3a3 100644 --- a/tests/components/sensor/test_uptime.py +++ b/tests/components/sensor/test_uptime.py @@ -1,9 +1,6 @@ """The tests for the uptime sensor platform.""" import unittest -from unittest.mock import patch -from datetime import timedelta -from homeassistant.util.async_ import run_coroutine_threadsafe from homeassistant.setup import setup_component from homeassistant.components.sensor.uptime import UptimeSensor from tests.common import get_test_home_assistant @@ -38,80 +35,3 @@ def test_uptime_sensor_name_change(self): } } assert setup_component(self.hass, 'sensor', config) - - def test_uptime_sensor_config_hours(self): - """Test uptime sensor with hours defined in config.""" - config = { - 'sensor': { - 'platform': 'uptime', - 'unit_of_measurement': 'hours', - } - } - assert setup_component(self.hass, 'sensor', config) - - def test_uptime_sensor_config_minutes(self): - """Test uptime sensor with minutes defined in config.""" - config = { - 'sensor': { - 'platform': 'uptime', - 'unit_of_measurement': 'minutes', - } - } - assert setup_component(self.hass, 'sensor', config) - - def test_uptime_sensor_days_output(self): - """Test uptime sensor output data.""" - sensor = UptimeSensor('test', 'days') - self.assertEqual(sensor.unit_of_measurement, 'd') - new_time = sensor.initial + timedelta(days=1) - with patch('homeassistant.util.dt.now', return_value=new_time): - run_coroutine_threadsafe( - sensor.async_update(), - self.hass.loop - ).result() - self.assertEqual(sensor.state, 1.00) - new_time = sensor.initial + timedelta(days=111.499) - with patch('homeassistant.util.dt.now', return_value=new_time): - run_coroutine_threadsafe( - sensor.async_update(), - self.hass.loop - ).result() - self.assertEqual(sensor.state, 111.50) - - def test_uptime_sensor_hours_output(self): - """Test uptime sensor output data.""" - sensor = UptimeSensor('test', 'hours') - self.assertEqual(sensor.unit_of_measurement, 'h') - new_time = sensor.initial + timedelta(hours=16) - with patch('homeassistant.util.dt.now', return_value=new_time): - run_coroutine_threadsafe( - sensor.async_update(), - self.hass.loop - ).result() - self.assertEqual(sensor.state, 16.00) - new_time = sensor.initial + timedelta(hours=72.499) - with patch('homeassistant.util.dt.now', return_value=new_time): - run_coroutine_threadsafe( - sensor.async_update(), - self.hass.loop - ).result() - self.assertEqual(sensor.state, 72.50) - - def test_uptime_sensor_minutes_output(self): - """Test uptime sensor output data.""" - sensor = UptimeSensor('test', 'minutes') - self.assertEqual(sensor.unit_of_measurement, 'min') - new_time = sensor.initial + timedelta(minutes=16) - with patch('homeassistant.util.dt.now', return_value=new_time): - run_coroutine_threadsafe( - sensor.async_update(), - self.hass.loop - ).result() - self.assertEqual(sensor.state, 16.00) - new_time = sensor.initial + timedelta(minutes=12.499) - with patch('homeassistant.util.dt.now', return_value=new_time): - run_coroutine_threadsafe( - sensor.async_update(), - self.hass.loop - ).result() - self.assertEqual(sensor.state, 12.50) From 7a62afc21391de9dccb604d2970d462c846dec98 Mon Sep 17 00:00:00 2001 From: c727 <11984118+c727@users.noreply.github.com> Date: Tue, 19 Jun 2018 16:35:16 +0200 Subject: [PATCH 4/4] Move to constants --- homeassistant/components/sensor/__init__.py | 3 ++- homeassistant/components/sensor/uptime.py | 9 ++++----- homeassistant/const.py | 1 + 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/sensor/__init__.py b/homeassistant/components/sensor/__init__.py index 8550d175b6333..a2d11a11dca42 100644 --- a/homeassistant/components/sensor/__init__.py +++ b/homeassistant/components/sensor/__init__.py @@ -14,7 +14,7 @@ from homeassistant.helpers.config_validation import PLATFORM_SCHEMA # noqa from homeassistant.const import ( DEVICE_CLASS_BATTERY, DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_ILLUMINANCE, - DEVICE_CLASS_TEMPERATURE) + DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_TIMESTAMP) _LOGGER = logging.getLogger(__name__) @@ -28,6 +28,7 @@ DEVICE_CLASS_HUMIDITY, # % of humidity in the air DEVICE_CLASS_ILLUMINANCE, # current light level (lx/lm) DEVICE_CLASS_TEMPERATURE, # temperature (C/F) + DEVICE_CLASS_TIMESTAMP, # ISO formatted timestamp ] DEVICE_CLASSES_SCHEMA = vol.All(vol.Lower, vol.In(DEVICE_CLASSES)) diff --git a/homeassistant/components/sensor/uptime.py b/homeassistant/components/sensor/uptime.py index 18a7c7575f46e..a85ac91a00c55 100644 --- a/homeassistant/components/sensor/uptime.py +++ b/homeassistant/components/sensor/uptime.py @@ -9,19 +9,18 @@ import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import CONF_NAME +from homeassistant.const import ( + CONF_NAME, DEVICE_CLASS_TIMESTAMP) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity import homeassistant.util.dt as dt_util _LOGGER = logging.getLogger(__name__) -DEFAULT_NAME = 'Uptime' +DEFAULT_NAME = 'Start' ICON = 'mdi:timer' -DEVICE_CLASS = 'datetime' - PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, }) @@ -56,7 +55,7 @@ def icon(self): @property def device_class(self): """Return the device class of the sensor.""" - return DEVICE_CLASS + return DEVICE_CLASS_TIMESTAMP @property def state(self): diff --git a/homeassistant/const.py b/homeassistant/const.py index 5644c3d0a1f2f..a1051fb639ab4 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -171,6 +171,7 @@ DEVICE_CLASS_HUMIDITY = 'humidity' DEVICE_CLASS_ILLUMINANCE = 'illuminance' DEVICE_CLASS_TEMPERATURE = 'temperature' +DEVICE_CLASS_TIMESTAMP = 'timestamp' # #### STATES #### STATE_ON = 'on'