MQTTT
MQTTT (named for "MQTT Tree") is a MQTT router which uses a the structure of a filesystem hierarchy to subscribe to MQTT topics and dispatch them to executables within this structure.
It is deprecated as there's no particular advantage to having a directory hierarchy as opposed to having a config file with routes mapped to program invocations.
Building
Use cargo build
as normal.
The DEFAULT_ROOT
environment variable controls the default root path which is
normally /var/run/mqttt
.
The SYSCONFDIR
environment variable controls the location of where
mqttt.toml
is searched. The default is /usr/local/etc
.
Installation and Configuration
Copy the mqttt
binary to the path on the target system. The default
configuration is equivalent to the following contents of mqttt.toml
:
root = "/var/run/mqttt" # Path to MQTTT root
host = "localhost" # MQTT server host
port = 1883 # MQTT server port
# [credentials] # Uncomment to specify MQTT connection credentials
# username = "username"
# password = "password"
id = "mqttt" # MQTT client identifier
}
Usage
Create a directory structure under the root directory which matches the MQTT topic you want to subscribe to. For example:
$ mkdir -p /var/run/mqttt/zigbee2mqtt/light_switch
Populate this directory with executables which you wish to run when a message matching that topic filter is received.
$ cat <<EOF >/var/run/mqttt/zigbee2mqtt/light_switch/toggle_light
#!/usr/bin/env bash
topic=$1
action=$(jq --raw-output .action)
[[ $action == "toggle" ]] || exit 0
mosquitto_pub --topic "zigbee2mqtt/light/set" --message '{"state":"TOGGLE"}'
EOF
$ chmod +x /var/run/mqttt/zigbee2mqtt/light_switch/toggle_light
Start the mqttt
program. It cannot be forked to background so it is expected
to be ran under a daemontools style supervisor, the daemon
utility or with
something like systemd.
It's a good idea to run mqttt
as its own dedicated user.
The special +
and #
wildcards can be used as path components. Additonally
#empty
path component can be used to represent a topic such as foo//bar
as
the filesystem path foo/#empty/bar
.
Known bugs
- Executables are run sequentially
- No timeout
- Can't map to a topic with a single or double dot as a path component
- No permission checks on
mqttt.toml
if it contains a password (to ensure the password isn't being exposed) - No way to specify the subscription QOS for a route (default is 0 (at most once))