diff --git a/homeassistant/components/binary_sensor/mqtt.py b/homeassistant/components/binary_sensor/mqtt.py index d2a2be88172533..f4b0459fb07edc 100644 --- a/homeassistant/components/binary_sensor/mqtt.py +++ b/homeassistant/components/binary_sensor/mqtt.py @@ -135,7 +135,7 @@ def state_message_received(_topic, payload, _qos): value_template = self._config.get(CONF_VALUE_TEMPLATE) if value_template is not None: payload = value_template.async_render_with_possible_json_value( - payload) + payload, variables={'entity_id': self.entity_id}) if payload == self._config.get(CONF_PAYLOAD_ON): self._state = True elif payload == self._config.get(CONF_PAYLOAD_OFF): diff --git a/homeassistant/helpers/template.py b/homeassistant/helpers/template.py index 2173f972cba819..e82302dfd3b9cd 100644 --- a/homeassistant/helpers/template.py +++ b/homeassistant/helpers/template.py @@ -149,7 +149,8 @@ def render_with_possible_json_value(self, value, error_value=_SENTINEL): error_value).result() def async_render_with_possible_json_value(self, value, - error_value=_SENTINEL): + error_value=_SENTINEL, + variables=None): """Render template with value exposed. If valid JSON will expose value_json too. @@ -159,9 +160,9 @@ def async_render_with_possible_json_value(self, value, if self._compiled is None: self._ensure_compiled() - variables = { - 'value': value - } + variables = dict(variables or {}) + variables['value'] = value + try: variables['value_json'] = json.loads(value) except ValueError: diff --git a/tests/components/binary_sensor/test_mqtt.py b/tests/components/binary_sensor/test_mqtt.py index 74c7d32927ba68..ce9293ba256ba3 100644 --- a/tests/components/binary_sensor/test_mqtt.py +++ b/tests/components/binary_sensor/test_mqtt.py @@ -58,6 +58,33 @@ def test_setting_sensor_value_via_mqtt_message(self): state = self.hass.states.get('binary_sensor.test') assert STATE_OFF == state.state + def test_setting_sensor_value_via_mqtt_message_and_template(self): + """Test the setting of the value via MQTT.""" + assert setup_component(self.hass, binary_sensor.DOMAIN, { + binary_sensor.DOMAIN: { + 'platform': 'mqtt', + 'name': 'test', + 'state_topic': 'test-topic', + 'payload_on': 'ON', + 'payload_off': 'OFF', + 'value_template': '{%if is_state(entity_id,\"on\")-%}OFF' + '{%-else-%}ON{%-endif%}' + } + }) + + state = self.hass.states.get('binary_sensor.test') + assert STATE_OFF == state.state + + fire_mqtt_message(self.hass, 'test-topic', '') + self.hass.block_till_done() + state = self.hass.states.get('binary_sensor.test') + assert STATE_ON == state.state + + fire_mqtt_message(self.hass, 'test-topic', '') + self.hass.block_till_done() + state = self.hass.states.get('binary_sensor.test') + assert STATE_OFF == state.state + def test_valid_device_class(self): """Test the setting of a valid sensor class.""" assert setup_component(self.hass, binary_sensor.DOMAIN, {