diff --git a/homeassistant/components/sensor/miflora.py b/homeassistant/components/sensor/miflora.py index 063c4e8068e..349e55abb5d 100644 --- a/homeassistant/components/sensor/miflora.py +++ b/homeassistant/components/sensor/miflora.py @@ -12,7 +12,8 @@ from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.helpers.entity import Entity import homeassistant.helpers.config_validation as cv from homeassistant.const import ( - CONF_MONITORED_CONDITIONS, CONF_NAME, CONF_MAC) + CONF_FORCE_UPDATE, CONF_MONITORED_CONDITIONS, CONF_NAME, CONF_MAC +) REQUIREMENTS = ['miflora==0.1.16'] @@ -20,7 +21,6 @@ _LOGGER = logging.getLogger(__name__) CONF_ADAPTER = 'adapter' CONF_CACHE = 'cache_value' -CONF_FORCE_UPDATE = 'force_update' CONF_MEDIAN = 'median' CONF_RETRIES = 'retries' CONF_TIMEOUT = 'timeout' diff --git a/homeassistant/components/sensor/mqtt.py b/homeassistant/components/sensor/mqtt.py index 70b1294c13f..bf7de94b5d7 100644 --- a/homeassistant/components/sensor/mqtt.py +++ b/homeassistant/components/sensor/mqtt.py @@ -13,7 +13,8 @@ import voluptuous as vol from homeassistant.core import callback from homeassistant.components.mqtt import CONF_STATE_TOPIC, CONF_QOS from homeassistant.const import ( - CONF_NAME, CONF_VALUE_TEMPLATE, STATE_UNKNOWN, CONF_UNIT_OF_MEASUREMENT) + CONF_FORCE_UPDATE, CONF_NAME, CONF_VALUE_TEMPLATE, STATE_UNKNOWN, + CONF_UNIT_OF_MEASUREMENT) from homeassistant.helpers.entity import Entity import homeassistant.components.mqtt as mqtt import homeassistant.helpers.config_validation as cv @@ -22,7 +23,6 @@ from homeassistant.util import dt as dt_util _LOGGER = logging.getLogger(__name__) -CONF_FORCE_UPDATE = 'force_update' CONF_EXPIRE_AFTER = 'expire_after' DEFAULT_NAME = 'MQTT Sensor' diff --git a/homeassistant/components/sensor/rest.py b/homeassistant/components/sensor/rest.py index 86362e8f2d9..19f5a1c271e 100644 --- a/homeassistant/components/sensor/rest.py +++ b/homeassistant/components/sensor/rest.py @@ -13,10 +13,11 @@ from requests.auth import HTTPBasicAuth, HTTPDigestAuth from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.const import ( - CONF_PAYLOAD, CONF_NAME, CONF_VALUE_TEMPLATE, CONF_METHOD, CONF_RESOURCE, - CONF_UNIT_OF_MEASUREMENT, STATE_UNKNOWN, CONF_VERIFY_SSL, CONF_USERNAME, - CONF_PASSWORD, CONF_AUTHENTICATION, HTTP_BASIC_AUTHENTICATION, - HTTP_DIGEST_AUTHENTICATION, CONF_HEADERS) + CONF_AUTHENTICATION, CONF_FORCE_UPDATE, CONF_HEADERS, CONF_NAME, + CONF_METHOD, CONF_PASSWORD, CONF_PAYLOAD, CONF_RESOURCE, + CONF_UNIT_OF_MEASUREMENT, CONF_USERNAME, + CONF_VALUE_TEMPLATE, CONF_VERIFY_SSL, + HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION, STATE_UNKNOWN) from homeassistant.helpers.entity import Entity import homeassistant.helpers.config_validation as cv @@ -25,6 +26,7 @@ _LOGGER = logging.getLogger(__name__) DEFAULT_METHOD = 'GET' DEFAULT_NAME = 'REST Sensor' DEFAULT_VERIFY_SSL = True +DEFAULT_FORCE_UPDATE = False CONF_JSON_ATTRS = 'json_attributes' METHODS = ['POST', 'GET'] @@ -43,6 +45,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_USERNAME): cv.string, vol.Optional(CONF_VALUE_TEMPLATE): cv.template, vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, + vol.Optional(CONF_FORCE_UPDATE, default=DEFAULT_FORCE_UPDATE): cv.boolean, }) @@ -59,6 +62,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None): unit = config.get(CONF_UNIT_OF_MEASUREMENT) value_template = config.get(CONF_VALUE_TEMPLATE) json_attrs = config.get(CONF_JSON_ATTRS) + force_update = config.get(CONF_FORCE_UPDATE) if value_template is not None: value_template.hass = hass @@ -74,14 +78,15 @@ def setup_platform(hass, config, add_devices, discovery_info=None): rest.update() add_devices([RestSensor( - hass, rest, name, unit, value_template, json_attrs)], True) + hass, rest, name, unit, value_template, json_attrs, force_update + )], True) class RestSensor(Entity): """Implementation of a REST sensor.""" - def __init__(self, hass, rest, name, - unit_of_measurement, value_template, json_attrs): + def __init__(self, hass, rest, name, unit_of_measurement, + value_template, json_attrs, force_update): """Initialize the REST sensor.""" self._hass = hass self.rest = rest @@ -91,6 +96,7 @@ class RestSensor(Entity): self._value_template = value_template self._json_attrs = json_attrs self._attributes = None + self._force_update = force_update @property def name(self): @@ -112,6 +118,11 @@ class RestSensor(Entity): """Return the state of the device.""" return self._state + @property + def force_update(self): + """Force update.""" + return self._force_update + def update(self): """Get the latest data from REST API and update the state.""" self.rest.update() diff --git a/homeassistant/const.py b/homeassistant/const.py index 85047f0482e..4f075249e57 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -75,6 +75,7 @@ CONF_EXCLUDE = 'exclude' CONF_FILE_PATH = 'file_path' CONF_FILENAME = 'filename' CONF_FOR = 'for' +CONF_FORCE_UPDATE = 'force_update' CONF_FRIENDLY_NAME = 'friendly_name' CONF_HEADERS = 'headers' CONF_HOST = 'host' diff --git a/tests/components/sensor/test_rest.py b/tests/components/sensor/test_rest.py index 1bda8ab82f3..eddab8caf4d 100644 --- a/tests/components/sensor/test_rest.py +++ b/tests/components/sensor/test_rest.py @@ -132,10 +132,12 @@ class TestRestSensor(unittest.TestCase): self.unit_of_measurement = 'MB' self.value_template = template('{{ value_json.key }}') self.value_template.hass = self.hass + self.force_update = False - self.sensor = rest.RestSensor(self.hass, self.rest, self.name, - self.unit_of_measurement, - self.value_template, []) + self.sensor = rest.RestSensor( + self.hass, self.rest, self.name, self.unit_of_measurement, + self.value_template, [], self.force_update + ) def tearDown(self): """Stop everything that was started.""" @@ -154,6 +156,11 @@ class TestRestSensor(unittest.TestCase): self.assertEqual( self.unit_of_measurement, self.sensor.unit_of_measurement) + def test_force_update(self): + """Test the unit of measurement.""" + self.assertEqual( + self.force_update, self.sensor.force_update) + def test_state(self): """Test the initial state.""" self.sensor.update() @@ -182,7 +189,8 @@ class TestRestSensor(unittest.TestCase): side_effect=self.update_side_effect( 'plain_state')) self.sensor = rest.RestSensor(self.hass, self.rest, self.name, - self.unit_of_measurement, None, []) + self.unit_of_measurement, None, [], + self.force_update) self.sensor.update() self.assertEqual('plain_state', self.sensor.state) self.assertTrue(self.sensor.available) @@ -193,7 +201,8 @@ class TestRestSensor(unittest.TestCase): side_effect=self.update_side_effect( '{ "key": "some_json_value" }')) self.sensor = rest.RestSensor(self.hass, self.rest, self.name, - self.unit_of_measurement, None, ['key']) + self.unit_of_measurement, None, ['key'], + self.force_update) self.sensor.update() self.assertEqual('some_json_value', self.sensor.device_state_attributes['key']) @@ -205,7 +214,8 @@ class TestRestSensor(unittest.TestCase): side_effect=self.update_side_effect( '["list", "of", "things"]')) self.sensor = rest.RestSensor(self.hass, self.rest, self.name, - self.unit_of_measurement, None, ['key']) + self.unit_of_measurement, None, ['key'], + self.force_update) self.sensor.update() self.assertEqual({}, self.sensor.device_state_attributes) self.assertTrue(mock_logger.warning.called) @@ -217,7 +227,8 @@ class TestRestSensor(unittest.TestCase): side_effect=self.update_side_effect( 'This is text rather than JSON data.')) self.sensor = rest.RestSensor(self.hass, self.rest, self.name, - self.unit_of_measurement, None, ['key']) + self.unit_of_measurement, None, ['key'], + self.force_update) self.sensor.update() self.assertEqual({}, self.sensor.device_state_attributes) self.assertTrue(mock_logger.warning.called) @@ -230,12 +241,14 @@ class TestRestSensor(unittest.TestCase): '{ "key": "json_state_updated_value" }')) self.sensor = rest.RestSensor(self.hass, self.rest, self.name, self.unit_of_measurement, - self.value_template, ['key']) + self.value_template, ['key'], + self.force_update) self.sensor.update() self.assertEqual('json_state_updated_value', self.sensor.state) self.assertEqual('json_state_updated_value', - self.sensor.device_state_attributes['key']) + self.sensor.device_state_attributes['key'], + self.force_update) class TestRestData(unittest.TestCase):