From 503a2adc38fa0e1a429a6c7c7f28f92d8236b6cc Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Fri, 8 May 2015 16:59:46 +0200 Subject: [PATCH 1/7] add date & time sensor --- homeassistant/components/sensor/time_date.py | 96 ++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 homeassistant/components/sensor/time_date.py diff --git a/homeassistant/components/sensor/time_date.py b/homeassistant/components/sensor/time_date.py new file mode 100644 index 00000000000..c80e8e98981 --- /dev/null +++ b/homeassistant/components/sensor/time_date.py @@ -0,0 +1,96 @@ +""" +homeassistant.components.sensor.time_date +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Date and Time service. + +Configuration: + +To use the Date and Time sensor you will need to add something like the +following to your config/configuration.yaml + +sensor: + platform: time_date + monitored_variables: + - type: 'time' + - type: 'date' + - type: 'datetime' + +VARIABLES: + +monitored_variables +*Required +An array specifying the variables to monitor. + +These are the variables for the monitored_variables array: + +type +*Required +The variable you wish to display,see the configuration example above for a +list of all available variables + + +""" +import logging + +import homeassistant.util.dt as dt_util +from homeassistant.helpers.entity import Entity + +_LOGGER = logging.getLogger(__name__) +SENSOR_TYPES = { + 'time': ['Time'], + 'date': ['Date'], + 'datetime': ['Date & Time'] +} + + +def setup_platform(hass, config, add_devices, discovery_info=None): + """ Get the Time and Date sensor. """ + + if hass.config.time_zone is None: + _LOGGER.error("Timezone is not set in Home Assistant config") + return False + + dev = [] + for variable in config['monitored_variables']: + if variable['type'] not in SENSOR_TYPES: + _LOGGER.error('Sensor type: "%s" does not exist', variable['type']) + else: + dev.append(TimeDateSensor(variable['type'])) + + add_devices(dev) + + +# pylint: disable=too-few-public-methods +class TimeDateSensor(Entity): + """ Implements a Time and Date sensor. """ + + def __init__(self, sensor_type): + self._name = SENSOR_TYPES[sensor_type][0] + self.type = sensor_type + self._state = None + self.update() + + @property + def name(self): + """ Returns the name of the device. """ + return self._name + + @property + def state(self): + """ Returns the state of the device. """ + return self._state + + def update(self): + """ Gets the latest data and updates the states. """ + if self.type == 'time': + self._state = dt_util.datetime_to_short_time_str( + dt_util.now(dt_util.DEFAULT_TIME_ZONE)) + if self.type == 'date': + self._state = dt_util.datetime_to_short_date_str( + dt_util.now(dt_util.DEFAULT_TIME_ZONE)) + if self.type == 'datetime': + self._state = dt_util.datetime_to_short_date_str( + dt_util.now(dt_util.DEFAULT_TIME_ZONE)) + ', ' + \ + dt_util.datetime_to_short_time_str( + dt_util.now(dt_util.DEFAULT_TIME_ZONE)) From 5266e101400d0cf29686fa63430c261554058914 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Fri, 8 May 2015 17:00:12 +0200 Subject: [PATCH 2/7] add new methods for date/time output --- homeassistant/util/dt.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/homeassistant/util/dt.py b/homeassistant/util/dt.py index 2439f77c558..fbe00c85527 100644 --- a/homeassistant/util/dt.py +++ b/homeassistant/util/dt.py @@ -10,6 +10,8 @@ import datetime as dt import pytz DATE_STR_FORMAT = "%H:%M:%S %d-%m-%Y" +DATE_SHORT_STR_FORMAT = "%Y-%m-%d" +TIME_SHORT_STR_FORMAT = "%H:%M" UTC = DEFAULT_TIME_ZONE = pytz.utc @@ -79,6 +81,22 @@ def datetime_to_str(dattim): return dattim.strftime(DATE_STR_FORMAT) +def datetime_to_short_time_str(dattim): + """ Converts datetime to a string format as short time. + + @rtype : str + """ + return dattim.strftime(TIME_SHORT_STR_FORMAT) + + +def datetime_to_short_date_str(dattim): + """ Converts datetime to a string format as short date. + + @rtype : str + """ + return dattim.strftime(DATE_SHORT_STR_FORMAT) + + def str_to_datetime(dt_str): """ Converts a string to a UTC datetime object. From f72cedf4464c46fa07e5bbf223df2c4561622553 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Fri, 8 May 2015 17:03:42 +0200 Subject: [PATCH 3/7] add missing space --- homeassistant/components/sensor/time_date.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/sensor/time_date.py b/homeassistant/components/sensor/time_date.py index c80e8e98981..007d80e9946 100644 --- a/homeassistant/components/sensor/time_date.py +++ b/homeassistant/components/sensor/time_date.py @@ -26,7 +26,7 @@ These are the variables for the monitored_variables array: type *Required -The variable you wish to display,see the configuration example above for a +The variable you wish to display, see the configuration example above for a list of all available variables From b55e8fc4c4c29250c8204a943f2c83a7dd2fb299 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Fri, 8 May 2015 17:44:27 +0200 Subject: [PATCH 4/7] add time_date.py --- .coveragerc | 1 + 1 file changed, 1 insertion(+) diff --git a/.coveragerc b/.coveragerc index 250d207f343..6ba5e2f9364 100644 --- a/.coveragerc +++ b/.coveragerc @@ -39,6 +39,7 @@ omit = homeassistant/components/sensor/openweathermap.py homeassistant/components/sensor/sabnzbd.py homeassistant/components/sensor/systemmonitor.py + homeassistant/components/sensor/time_date.py homeassistant/components/sensor/transmission.py homeassistant/components/switch/wemo.py homeassistant/components/thermostat/nest.py From 079ec432915d5250dd5d41da24ead2cd46b089fb Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Fri, 8 May 2015 18:31:48 +0200 Subject: [PATCH 5/7] remove list --- homeassistant/components/sensor/time_date.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/sensor/time_date.py b/homeassistant/components/sensor/time_date.py index 007d80e9946..9254ea37673 100644 --- a/homeassistant/components/sensor/time_date.py +++ b/homeassistant/components/sensor/time_date.py @@ -38,9 +38,9 @@ from homeassistant.helpers.entity import Entity _LOGGER = logging.getLogger(__name__) SENSOR_TYPES = { - 'time': ['Time'], - 'date': ['Date'], - 'datetime': ['Date & Time'] + 'time': 'Time', + 'date': 'Date', + 'datetime': 'Date & Time' } @@ -66,7 +66,7 @@ class TimeDateSensor(Entity): """ Implements a Time and Date sensor. """ def __init__(self, sensor_type): - self._name = SENSOR_TYPES[sensor_type][0] + self._name = SENSOR_TYPES[sensor_type] self.type = sensor_type self._state = None self.update() From 03993cd5face94f588b60dee172fcf8dfb45880a Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Fri, 8 May 2015 18:39:28 +0200 Subject: [PATCH 6/7] fix if and remove tz --- homeassistant/components/sensor/time_date.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/homeassistant/components/sensor/time_date.py b/homeassistant/components/sensor/time_date.py index 9254ea37673..7de02e3fb26 100644 --- a/homeassistant/components/sensor/time_date.py +++ b/homeassistant/components/sensor/time_date.py @@ -84,13 +84,10 @@ class TimeDateSensor(Entity): def update(self): """ Gets the latest data and updates the states. """ if self.type == 'time': - self._state = dt_util.datetime_to_short_time_str( - dt_util.now(dt_util.DEFAULT_TIME_ZONE)) - if self.type == 'date': - self._state = dt_util.datetime_to_short_date_str( - dt_util.now(dt_util.DEFAULT_TIME_ZONE)) - if self.type == 'datetime': - self._state = dt_util.datetime_to_short_date_str( - dt_util.now(dt_util.DEFAULT_TIME_ZONE)) + ', ' + \ - dt_util.datetime_to_short_time_str( - dt_util.now(dt_util.DEFAULT_TIME_ZONE)) + self._state = dt_util.datetime_to_short_time_str(dt_util.now()) + elif self.type == 'date': + self._state = dt_util.datetime_to_short_date_str(dt_util.now()) + elif self.type == 'datetime': + self._state = dt_util.datetime_to_short_date_str(dt_util.now()) + \ + ', ' + \ + dt_util.datetime_to_short_time_str(dt_util.now()) From 9f042db0f5344b4e6af6b1dd2f888ce8909cbfe3 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Fri, 8 May 2015 18:50:57 +0200 Subject: [PATCH 7/7] call dt_util.now() only once, add additional format --- homeassistant/components/sensor/time_date.py | 23 +++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/sensor/time_date.py b/homeassistant/components/sensor/time_date.py index 7de02e3fb26..a49773ddccb 100644 --- a/homeassistant/components/sensor/time_date.py +++ b/homeassistant/components/sensor/time_date.py @@ -14,7 +14,8 @@ sensor: monitored_variables: - type: 'time' - type: 'date' - - type: 'datetime' + - type: 'date_time' + - type: 'time_date' VARIABLES: @@ -40,7 +41,8 @@ _LOGGER = logging.getLogger(__name__) SENSOR_TYPES = { 'time': 'Time', 'date': 'Date', - 'datetime': 'Date & Time' + 'date_time': 'Date & Time', + 'time_date': 'Time & Date' } @@ -83,11 +85,16 @@ class TimeDateSensor(Entity): def update(self): """ Gets the latest data and updates the states. """ + + time_date = dt_util.now() + time = dt_util.datetime_to_short_time_str(time_date) + date = dt_util.datetime_to_short_date_str(time_date) + if self.type == 'time': - self._state = dt_util.datetime_to_short_time_str(dt_util.now()) + self._state = time elif self.type == 'date': - self._state = dt_util.datetime_to_short_date_str(dt_util.now()) - elif self.type == 'datetime': - self._state = dt_util.datetime_to_short_date_str(dt_util.now()) + \ - ', ' + \ - dt_util.datetime_to_short_time_str(dt_util.now()) + self._state = date + elif self.type == 'date_time': + self._state = date + ', ' + time + elif self.type == 'time_date': + self._state = time + ', ' + date