Update mqtt.publish() function to use template_payload. Reorganise publish service. Use mqtt.publish() in tests.

This commit is contained in:
Flyte 2016-02-10 11:11:02 +00:00
parent 26fc637ab5
commit d52e2019c0
2 changed files with 23 additions and 22 deletions

View File

@ -57,11 +57,14 @@ ATTR_RETAIN = 'retain'
MAX_RECONNECT_WAIT = 300 # seconds MAX_RECONNECT_WAIT = 300 # seconds
def publish(hass, topic, payload, qos=None, retain=None): # pylint: disable=too-many-arguments
def publish(hass, topic, payload=None, qos=None,
retain=None, payload_template=None):
"""Publish message to an MQTT topic.""" """Publish message to an MQTT topic."""
data = { data = {
ATTR_TOPIC: topic, ATTR_TOPIC: topic,
ATTR_PAYLOAD: payload, ATTR_PAYLOAD: payload,
ATTR_PAYLOAD_TEMPLATE: payload_template
} }
if qos is not None: if qos is not None:
data[ATTR_QOS] = qos data[ATTR_QOS] = qos
@ -70,6 +73,7 @@ def publish(hass, topic, payload, qos=None, retain=None):
data[ATTR_RETAIN] = retain data[ATTR_RETAIN] = retain
hass.services.call(DOMAIN, SERVICE_PUBLISH, data) hass.services.call(DOMAIN, SERVICE_PUBLISH, data)
# pylint: enable=too-many-arguments
def subscribe(hass, topic, callback, qos=DEFAULT_QOS): def subscribe(hass, topic, callback, qos=DEFAULT_QOS):
@ -134,24 +138,25 @@ def setup(hass, config):
"""Handle MQTT publish service calls.""" """Handle MQTT publish service calls."""
msg_topic = call.data.get(ATTR_TOPIC) msg_topic = call.data.get(ATTR_TOPIC)
payload = call.data.get(ATTR_PAYLOAD) payload = call.data.get(ATTR_PAYLOAD)
payload_template = call.data.get(ATTR_PAYLOAD_TEMPLATE)
qos = call.data.get(ATTR_QOS, DEFAULT_QOS)
retain = call.data.get(ATTR_RETAIN, DEFAULT_RETAIN)
if payload is None: if payload is None:
if payload_template is None:
_LOGGER.error(
"You must set either '%s' or '%s' to use this service",
ATTR_PAYLOAD, ATTR_PAYLOAD_TEMPLATE)
return
try: try:
payload_template = call.data.get(ATTR_PAYLOAD_TEMPLATE)
if payload_template is None:
_LOGGER.error(
"You must set either '%s' or '%s' to use this service",
ATTR_PAYLOAD, ATTR_PAYLOAD_TEMPLATE)
return
payload = template.render(hass, payload_template) payload = template.render(hass, payload_template)
except AttributeError as exc: except template.jinja2.TemplateError as exc:
_LOGGER.error( _LOGGER.error(
"Unable to publish to '%s': rendering payload template of " "Unable to publish to '%s': rendering payload template of "
"'%s' failed because %s.", "'%s' failed because %s.",
msg_topic, payload_template, exc) msg_topic, payload_template, exc)
return
if msg_topic is None or payload is None: if msg_topic is None or payload is None:
return return
qos = call.data.get(ATTR_QOS, DEFAULT_QOS)
retain = call.data.get(ATTR_RETAIN, DEFAULT_RETAIN)
MQTT_CLIENT.publish(msg_topic, payload, qos, retain) MQTT_CLIENT.publish(msg_topic, payload, qos, retain)
hass.bus.listen_once(EVENT_HOMEASSISTANT_START, start_mqtt) hass.bus.listen_once(EVENT_HOMEASSISTANT_START, start_mqtt)

View File

@ -80,10 +80,9 @@ class TestMQTT(unittest.TestCase):
""" """
If 'payload_template' is provided and 'payload' is not, then render it. If 'payload_template' is provided and 'payload' is not, then render it.
""" """
self.hass.services.call(mqtt.DOMAIN, mqtt.SERVICE_PUBLISH, { mqtt.publish(self.hass, "test/topic",
mqtt.ATTR_TOPIC: "test/topic", **{mqtt.ATTR_PAYLOAD_TEMPLATE: "{{ 1+1 }}"})
mqtt.ATTR_PAYLOAD_TEMPLATE: "{{ 1+1 }}" self.hass.pool.block_till_done()
}, blocking=True)
self.assertTrue(mqtt.MQTT_CLIENT.publish.called) self.assertTrue(mqtt.MQTT_CLIENT.publish.called)
self.assertEqual(mqtt.MQTT_CLIENT.publish.call_args[0][1], "2") self.assertEqual(mqtt.MQTT_CLIENT.publish.call_args[0][1], "2")
@ -93,11 +92,9 @@ class TestMQTT(unittest.TestCase):
""" """
payload = "not a template" payload = "not a template"
payload_template = "a template" payload_template = "a template"
self.hass.services.call(mqtt.DOMAIN, mqtt.SERVICE_PUBLISH, { mqtt.publish(self.hass, "test/topic", payload,
mqtt.ATTR_TOPIC: "test/topic", **{mqtt.ATTR_PAYLOAD_TEMPLATE: payload_template})
mqtt.ATTR_PAYLOAD: payload, self.hass.pool.block_till_done()
mqtt.ATTR_PAYLOAD_TEMPLATE: payload_template
}, blocking=True)
self.assertTrue(mqtt.MQTT_CLIENT.publish.called) self.assertTrue(mqtt.MQTT_CLIENT.publish.called)
self.assertEqual(mqtt.MQTT_CLIENT.publish.call_args[0][1], payload) self.assertEqual(mqtt.MQTT_CLIENT.publish.call_args[0][1], payload)
@ -105,9 +102,8 @@ class TestMQTT(unittest.TestCase):
""" """
If neither 'payload' or 'payload_template' is provided then fail. If neither 'payload' or 'payload_template' is provided then fail.
""" """
self.hass.services.call(mqtt.DOMAIN, mqtt.SERVICE_PUBLISH, { mqtt.publish(self.hass, "test/topic")
mqtt.ATTR_TOPIC: "test/topic" self.hass.pool.block_till_done()
}, blocking=True)
self.assertFalse(mqtt.MQTT_CLIENT.publish.called) self.assertFalse(mqtt.MQTT_CLIENT.publish.called)
def test_subscribe_topic(self): def test_subscribe_topic(self):