From b2a15e17d3fd846fa750b9e319779edcf0b47a99 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 4 Dec 2016 09:53:05 -0800 Subject: [PATCH] MQTT Automation: parse payload as JSON (#4703) --- homeassistant/components/automation/mqtt.py | 21 +++++++++++++++------ tests/components/automation/test_mqtt.py | 7 ++++--- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/homeassistant/components/automation/mqtt.py b/homeassistant/components/automation/mqtt.py index 39deae3d66e..4818c02d9ff 100644 --- a/homeassistant/components/automation/mqtt.py +++ b/homeassistant/components/automation/mqtt.py @@ -4,6 +4,8 @@ Offer MQTT listening automation rules. For more details about this automation rule, please refer to the documentation at https://home-assistant.io/components/automation/#mqtt-trigger """ +import json + import voluptuous as vol from homeassistant.core import callback @@ -31,13 +33,20 @@ def async_trigger(hass, config, action): def mqtt_automation_listener(msg_topic, msg_payload, qos): """Listen for MQTT messages.""" if payload is None or payload == msg_payload: + data = { + 'platform': 'mqtt', + 'topic': msg_topic, + 'payload': msg_payload, + 'qos': qos, + } + + try: + data['payload_json'] = json.loads(msg_payload) + except ValueError: + pass + hass.async_run_job(action, { - 'trigger': { - 'platform': 'mqtt', - 'topic': msg_topic, - 'payload': msg_payload, - 'qos': qos, - } + 'trigger': data }) return mqtt.async_subscribe(hass, topic, mqtt_automation_listener) diff --git a/tests/components/automation/test_mqtt.py b/tests/components/automation/test_mqtt.py index e704b9b2d64..7ee2aadeaf6 100644 --- a/tests/components/automation/test_mqtt.py +++ b/tests/components/automation/test_mqtt.py @@ -42,16 +42,17 @@ class TestAutomationMQTT(unittest.TestCase): 'service': 'test.automation', 'data_template': { 'some': '{{ trigger.platform }} - {{ trigger.topic }}' - ' - {{ trigger.payload }}' + ' - {{ trigger.payload }} - ' + '{{ trigger.payload_json.hello }}' }, } } }) - fire_mqtt_message(self.hass, 'test-topic', 'test_payload') + fire_mqtt_message(self.hass, 'test-topic', '{ "hello": "world" }') self.hass.block_till_done() self.assertEqual(1, len(self.calls)) - self.assertEqual('mqtt - test-topic - test_payload', + self.assertEqual('mqtt - test-topic - { "hello": "world" } - world', self.calls[0].data['some']) automation.turn_off(self.hass)