diff --git a/MQTT.md b/MQTT.md new file mode 100644 index 00000000..d47f3b55 --- /dev/null +++ b/MQTT.md @@ -0,0 +1,120 @@ +MQTT is the recommended protocol for controlling your devices. If you have no previous knowledge of MQTT you can learn more from [MQTT Overview](MQTT-Overview) or get a complete course in the [MQTT Essentials](http://www.hivemq.com/mqtt-essentials/) article series. After you have a working [MQTT broker](https://www.google.com/search?q=setting+up+an+mqtt+broker) you need to configure Tasmota to communicate with it. + +## Configure MQTT +If you flashed a precompiled .bin or didn't enter MQTT info in `user_config_override.h` before compiling you need to configure MQTT on your device first. + +### Configure MQTT using WebUI +Go to **Configuration -> Configure Other** and make sure **"MQTT Enable"** box is checked.
+Once MQTT is enabled you need to set it up using **Configuration -> Configure MQTT**. + +![Configure MQTT ](https://user-images.githubusercontent.com/5904370/53048775-d3d16e00-3495-11e9-8917-70b56451ebeb.png) + +For a basic setup you only need to set **Host**, **User** and **Password** but it is recommended to change **Topic** to avoid issues. Each device should have a unique **Topic**. + +- **Host** = your MQTT broker address or IP +- **Port** = your MQTT broker port (default port is set to 1883) +- **Client** = device's unique identifier, do not change if not sure what it is for +- **User** = username for authenticating on your MQTT broker +- **Password** = password for authenticating on your MQTT broker +- **Topic** = unique identifying topic for your device (e.g. `hallswitch`, `kitchen-light`). `%topic%` in wiki references to this. +- **FullTopic** = [full topic definition](#mqtt-topic-definition), do not change if not sure what it is for + +### Configure MQTT using Backlog + +Using a serial connection or the WebUI Console you can issue (or even better, paste a premade) Backlog command for quick and easy MQTT setup. + +``` +Backlog mqtthost ; mqttport ; mqttuser ; mqttpassword ; topic +``` + +After a reboot all necessary MQTT settings are configured. Don't forget, you can use Backlog for all [commands](#commands)! + +## Commands over MQTT +To send commands and view responses you'll need an [MQTT client](http://www.hivemq.com/blog/seven-best-mqtt-client-tools). + +Commands over MQTT are issued to Tasmota by using `cmnd/%topic%/ `. If there is no `` (an empty MQTT message/payload), a query is sent for current status of the ``. + +> If you are using *mosquitto_pub*, you can issue an empty payload using the `-n` command line option. +> If your MQTT client cannot issue an empty payload, you can use the single character `?` instead. + + +### Command flow + +The following example will go in depth on what happens when you send an MQTT command. + +A device was flashed and configured with the **FullTopic** as default `%prefix%/%topic%/` and the **Topic** set to `sonoff-switch`. We want to see current status of the switch and change it. + +By looking at the [commands](commands) table we can learn about the [Power](commands#power) command and options associated with it. +* Ask the device for status: + ```java + cmnd/sonoff-switch/Power ← // an empty message/payload sends a status query + ↳ cmnd/sonoff-switch/RESULT → {"POWER":"OFF"} + ↳ stat/sonoff-switch/POWER → OFF + ``` + We can see that the module's relay is turned off. + +* Send a command to toggle the switch: + ```java + cmnd/sonoff-switch/Power ← "TOGGLE" + ↳ // Power for relay 1 is toggled + ↳ cmnd/sonoff-switch/RESULT → {"POWER":"ON"} + ↳ stat/sonoff-switch/POWER → ON + ``` + We've sent the toggle command and received confirmation that the switch is turned on. + +### Examples +In the following examples `%topic%` is `sonoff` for demonstration purposes: + +- The relay can be controlled with `cmnd/sonoff/power on`, ```cmnd/sonoff/power off``` or ```cmnd/sonoff/power toggle```. Sonoff will send a MQTT status message like ```stat/sonoff/POWER ON```. + +- The power state message can be sent with the retain flag set. Enable this with ```cmnd/sonoff/PowerRetain on```. + +- The telemetry messages can also be sent with the retain flag, but this is a compile time option. See [#1071](https://github.com/arendst/Sonoff-Tasmota/issues/1071). + +- For sonoff dual or 4CH the relays need to be addressed with ```cmnd/sonoff/power{n}```, where {n} is the relay number from 1 to 2 (Sonoff Dual) or from 1 to 4 (Sonoff 4CH). `cmnd/sonoff/power4 off` turns off the 4th relay on a Sonoff 4CH. + +- QTT topic can be changed with ```cmnd/sonoff/topic sonoff1``` which reboots sonoff and changes the `%topic%` to `sonoff1`. From that point on MQTT commands should look like ```cmnd/sonoff1/power on```. + +- The OTA firmware location can be made known to sonoff with ```cmnd/sonoff/otaurl http://thehackbox.org/tasmota/release/sonoff.bin```. Reset to default with ```cmnd/sonoff/otaurl 1```. + +- Upgrade OTA firmware from the OtaUrl server with ```cmnd/sonoff/upgrade 1```. + +- Show all status information with ```cmnd/sonoff/status 0```. + +- The button can send a MQTT message to the broker that in turn will switch the relay. To configure this you need to perform ```cmnd/sonoff/ButtonTopic sonoff``` where sonoff equals to Topic. The message can also be provided with the retain flag by ```cmnd/sonoff/ButtonRetain on```. + +- Sonoff Pow status can be retreived with ```cmnd/sonoff/status 8``` or periodically every 5 minutes using ```cmnd/sonoff/TelePeriod 300```. + +- When a Sonoff Pow threshold like PowerLow has been met a message ```tele/sonoff/POWER_LOW ON``` will be sent. When the error is corrected a message ```tele/sonoff/POWER_LOW OFF``` will be sent. + +While most MQTT commands will result in a message in JSON format the power status feedback will always be returned like ```stat/sonoff/POWER ON``` too. + +Telemetry data will be sent by prefix ```tele``` like ```tele/sonoff/SENSOR {"Time":"2017-02-16T10:13:52", "DS18B20":{"Temperature":20.6}}``` + +## MQTT Topic definition +Until version 5.0.5 the MQTT topic was defined rigidly by using the commands ``Prefix`` and ``Topic`` resulting in a command topic string like ``cmnd/sonoff/Power``. + +Starting with version 5.0.5 the MQTT topic is more flexible using command ``FullTopic`` and tokens to be placed within the user definable string up to 100 characters in size. The provided tokens are: +- ``%prefix%`` to be dynamically substituted by one of three prefixes as defined by commands ``Prefix1`` (default: "cmnd"), ``Prefix2`` (default: "stat") and ``Prefix3`` (default: "tele"). +- ``%topic%`` to be dynamically substituted by one of five topics as defined by commands ``Topic``, ``GroupTopic``, ``ButtonTopic``, ``SwitchTopic`` and ``MqttClient``. + +Using the tokens the following example topics can be made: +- ``FullTopic %prefix%/%topic%/`` being the legacy situation up to version 5.0.5 +- ``FullTopic tasmota/%topic%/%prefix%/`` +- ``FullTopic tasmota/bedroom/%topic%/%prefix%/`` +- ``FullTopic penthouse/bedroom1/bathroom2/%topic%/%prefix%/`` + +### %prefix% +Tasmota uses 3 prefixes for forming a FullTopic: + +- `cmnd` - prefix to issue commands; ask for status +- `stat` - reports back status or configuration message +- `tele` - reports telemetry info at specified intervals + +>Theo's note: +> +>To solve possible MQTT topic loops I strongly suggest to use the ``%prefix%`` token in all of your FullTopics. It may work without `%prefix%` as I implemented some validation by forcing the use of a prefix in commands sent to the device but status and telemetry do not need a prefix. Just play with it and report strange problems I might solve in the future. + +The use of the ``%topic%`` token is also mandatory in case you want to use [`ButtonTopic`](commands#buttontopic) and/or [`SwitchTopic`](commands#switchtopic). It also provides for grouptopic and fallback topic functionality. + +Recommendation: **Use both tokens at all time within your FullTopic string** \ No newline at end of file