From 11f11481b2073720815f718f1a8bc658ad9a87ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B3bert=20Nagy?= Date: Sat, 11 Mar 2017 19:07:52 +0100 Subject: [PATCH] Force update support for MQTT sensor (#6492) --- homeassistant/components/sensor/mqtt.py | 13 +++++- tests/components/sensor/test_mqtt.py | 59 +++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/sensor/mqtt.py b/homeassistant/components/sensor/mqtt.py index a5ecd029a88..1e17e929b2c 100644 --- a/homeassistant/components/sensor/mqtt.py +++ b/homeassistant/components/sensor/mqtt.py @@ -19,12 +19,16 @@ import homeassistant.helpers.config_validation as cv _LOGGER = logging.getLogger(__name__) +CONF_FORCE_UPDATE = 'force_update' + DEFAULT_NAME = 'MQTT Sensor' +DEFAULT_FORCE_UPDATE = False DEPENDENCIES = ['mqtt'] PLATFORM_SCHEMA = mqtt.MQTT_RO_PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + vol.Optional(CONF_FORCE_UPDATE, default=DEFAULT_FORCE_UPDATE): cv.boolean, }) @@ -43,6 +47,7 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): config.get(CONF_STATE_TOPIC), config.get(CONF_QOS), config.get(CONF_UNIT_OF_MEASUREMENT), + config.get(CONF_FORCE_UPDATE), value_template, )]) @@ -51,13 +56,14 @@ class MqttSensor(Entity): """Representation of a sensor that can be updated using MQTT.""" def __init__(self, name, state_topic, qos, unit_of_measurement, - value_template): + force_update, value_template): """Initialize the sensor.""" self._state = STATE_UNKNOWN self._name = name self._state_topic = state_topic self._qos = qos self._unit_of_measurement = unit_of_measurement + self._force_update = force_update self._template = value_template def async_added_to_hass(self): @@ -92,6 +98,11 @@ class MqttSensor(Entity): """Return the unit this state is expressed in.""" return self._unit_of_measurement + @property + def force_update(self): + """Force update.""" + return self._force_update + @property def state(self): """Return the state of the entity.""" diff --git a/tests/components/sensor/test_mqtt.py b/tests/components/sensor/test_mqtt.py index c70fddb67fc..336c7fd57c5 100644 --- a/tests/components/sensor/test_mqtt.py +++ b/tests/components/sensor/test_mqtt.py @@ -1,8 +1,10 @@ """The tests for the MQTT sensor platform.""" import unittest +import homeassistant.core as ha from homeassistant.setup import setup_component import homeassistant.components.sensor as sensor +from homeassistant.const import EVENT_STATE_CHANGED from tests.common import mock_mqtt_component, fire_mqtt_message from tests.common import get_test_home_assistant, mock_component @@ -58,3 +60,60 @@ class TestSensorMQTT(unittest.TestCase): state = self.hass.states.get('sensor.test') self.assertEqual('100', state.state) + + def test_force_update_disabled(self): + """Test force update option.""" + mock_component(self.hass, 'mqtt') + assert setup_component(self.hass, sensor.DOMAIN, { + sensor.DOMAIN: { + 'platform': 'mqtt', + 'name': 'test', + 'state_topic': 'test-topic', + 'unit_of_measurement': 'fav unit' + } + }) + + events = [] + + @ha.callback + def callback(event): + events.append(event) + + self.hass.bus.listen(EVENT_STATE_CHANGED, callback) + + fire_mqtt_message(self.hass, 'test-topic', '100') + self.hass.block_till_done() + self.assertEqual(1, len(events)) + + fire_mqtt_message(self.hass, 'test-topic', '100') + self.hass.block_till_done() + self.assertEqual(1, len(events)) + + def test_force_update_enabled(self): + """Test force update option.""" + mock_component(self.hass, 'mqtt') + assert setup_component(self.hass, sensor.DOMAIN, { + sensor.DOMAIN: { + 'platform': 'mqtt', + 'name': 'test', + 'state_topic': 'test-topic', + 'unit_of_measurement': 'fav unit', + 'force_update': True + } + }) + + events = [] + + @ha.callback + def callback(event): + events.append(event) + + self.hass.bus.listen(EVENT_STATE_CHANGED, callback) + + fire_mqtt_message(self.hass, 'test-topic', '100') + self.hass.block_till_done() + self.assertEqual(1, len(events)) + + fire_mqtt_message(self.hass, 'test-topic', '100') + self.hass.block_till_done() + self.assertEqual(2, len(events))