From 19505463696c8a6bb1d4cfa10e98de4f52edb2ae Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 9 Aug 2015 17:59:07 -0700 Subject: [PATCH] Update MQTT documentation --- source/components/automation.markdown | 26 +++++++++++++++++----- source/components/index.markdown | 2 +- source/components/mqtt.markdown | 28 ++++++++++++------------ source/images/supported_brands/mqtt.png | Bin 0 -> 15351 bytes 4 files changed, 35 insertions(+), 21 deletions(-) create mode 100644 source/images/supported_brands/mqtt.png diff --git a/source/components/automation.markdown b/source/components/automation.markdown index 74ac93b01bb..306d9fa57a6 100644 --- a/source/components/automation.markdown +++ b/source/components/automation.markdown @@ -29,10 +29,10 @@ automation: service_data: {"message":"The sun has set"} ``` -## Setting up triggers +## {% linkable_title Setting up triggers %} -#### Time-based automation -This allows you to trigger actions whenever the time matches your filter. You can setup filters to match on hours, minutes and seconds. Any filter that you omit will match all values. +#### {% linkable_title Time-based automation %} +This allows you to trigger actions whenever the time matches your filter. You can setup filters to match on hours, minutes and seconds. Any filter that you omit will match all values. Here are some example values: @@ -49,7 +49,7 @@ Here are some example values: time_seconds: 0 ``` -#### State-based automation +#### {% linkable_title State-based automation %} This allows you to trigger actions based on state changes of any entity within Home Assistant. You can omit the `state_from` and `state_to` to match all. ``` @@ -76,7 +76,21 @@ This allows you to trigger actions based on state changes of any entity within H Use quotes around your values for state_from and state_to to avoid the YAML parser interpreting some values as booleans.

-## Setting up the action +#### {% linkable_title MQTT-based automation %} +This allows you to trigger actions based on messages on an MQTT topic. You can specify an optional payload to match as well. + +``` + # Match any changes to bathroom light + platform: mqtt + mqtt_topic: home/bathroom/light + + # Match only if bathroom light is turned on + platform: mqtt + mqtt_topic: home/bathroom/light + mqtt_payload: 'on' +``` + +## {% linkable_title Setting up the action %} Currently the only supported action is calling a service. Services are what devices expose to be controlled, so this will allow us to control anything that Home Assistant can control. @@ -95,7 +109,7 @@ Currently the only supported action is calling a service. Services are what devi service_data: {"message":"YAY"} ``` -## Putting it all together +## {% linkable_title Putting it all together %} For every combination of a trigger and an action we will have to combine the configuration lines and add it to an `automation` component entry in `configuration.yaml`. You can add an optional `alias` key to the configuration to make the logs more understandable. To setup multiple entries, append 2, 3 etc to the section name. An example of a `configuration.yaml` file: ``` diff --git a/source/components/index.markdown b/source/components/index.markdown index 6822784657b..21e451ec454 100644 --- a/source/components/index.markdown +++ b/source/components/index.markdown @@ -371,7 +371,7 @@ the manufacturers of these devices. - + MQTT Allow sending and recieving MQTT messages. diff --git a/source/components/mqtt.markdown b/source/components/mqtt.markdown index 50a38e2e82a..97962444823 100644 --- a/source/components/mqtt.markdown +++ b/source/components/mqtt.markdown @@ -8,7 +8,8 @@ comments: false sharing: true footer: true --- -MQTT (aka MQ Telemetry Transport) is a machine-to-machine or "Internet of Things" connectivity protocol on top of TCP/IP. It allows extremely lightweight publish/subscribe messaging transport. + +MQTT (aka MQ Telemetry Transport) is a machine-to-machine or "Internet of Things" connectivity protocol on top of TCP/IP. It allows extremely lightweight publish/subscribe messaging transport. The MQTT component needs an MQTT broker like [Mosquitto](http://mosquitto.org/) or [Mosca](http://www.mosca.io/). The Eclipse Foundation is running a public MQTT broker at [iot.eclipse.org](iot.eclipse.org) or the Mosquitto Project under [test.mosquitto.org](http://test.mosquitto.org). If you prefer to use a public, keep in mind to adjust the topic and that your messages may be publicly accessible. @@ -18,21 +19,24 @@ To integrate MQTT into Home Assistant, add the following section to your `config # Example configuration.yaml entry mqtt: broker: IP_ADDRESS_BROKER -``` -There are more optional entries available if your broker is using different settings or you have a special need. - -```yaml -# Example configuration.yaml entry -mqtt: - broker: 127.0.0.1 + # All the other options are optional: port: 1883 - topic: home-assistant keepalive: 60 qos: 0 username: your_username password: your_secret_password ``` - + +

+The MQTT component has no TLS support at the moment. This means that only plain-text communication is possible. +

+ +## Building on top of MQTT + +There are two ways to integrate MQTT into your process. One is by using the [MQTT-automation rule](/components/automation.html#mqtt-based-automation). The other one is by integrating it into a component. See the [MQTT example component](https://github.com/balloob/home-assistant/blob/dev/config/custom_components/mqtt_example.py) how to do this. + +## Testing + For debugging purposes `mosquitto` is shipping commandline tools to send and recieve MQTT messages. For sending test messages to a broker running on localhost: ```bash @@ -59,7 +63,3 @@ For reading all messages sent on the topic `home-assistant` to a broker running ```bash mosquitto_sub -h 127.0.0.1 -v -t "home-assistant/#" ``` - -

-The MQTT component has no TLS support at the moment. This means that only plain-text communication is possible. -

diff --git a/source/images/supported_brands/mqtt.png b/source/images/supported_brands/mqtt.png new file mode 100644 index 0000000000000000000000000000000000000000..1e649faf345e8e14cf1a125fadbe34580ee8d0bc GIT binary patch literal 15351 zcmY*gWmFwake!FSC%C)2+ruG{1P$))5ZoW`65KTbLU4C?C%C)21&8H3yMOk~shR2i zHQm!)UH8_laK$e&s7M4z005xM$x12%00`#&T@nHA{ccVx|M&d?a#EHN2g=8Z4&NJa zM)ER}z}tUUZd*~pdk><6tfmtHpnUnyKz?pfl<%GJ&T^ln;Fl2y&@h3m_F5YNAOqwi z#Z=vwPJPT%b=1@LyvCdI>~<&l|I7|oQ;mqDedmE&#*69#v2|s4)olA`^%)zu8^D`| z8Yb)ZkFr3IbjR6*5MRV+IVRfj4-Yf{rmp*WmMl;-e7RO5de$`C@aIp9T?0jpPxij6 zn~U12L$}x3`AhpXu|XA6a$mK^#}Okx*Zn~OgF0OLVn7RsxyYR`xiV7wcai&lZfxKnL43}a0&rwz9U+0u$$%*Q~|c$b8>Onvnc3*11bUtH(&?nkamD4 z27sm@Cn(?M#0mcT9&EX-&1rJxi|4>yFhTUhWyOT-VLDHN`UMTef`e9@81tR{JZS(W zObiSDf(SBzK%Q`2eC`R{L1|FKMZg�{X$8_1V`y-M<{C`N3|OipzdS1Fj-nZ9mNG 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 H1_A#Au}A3` literal 0 HcmV?d00001