Forward OwnTracks low-battery warnings to ntfy#
About#
By subscribing to your OwnTracks MQTT topic, and adding a user-defined filter
function, you can make mqttwarn
send notifications, for example when your
phone battery level decreases below a certain threshold.
Details#
As an example, this tutorial will submit notifications to a public topic on
ntfy.sh. However, you can always choose a different notification service
provided by mqttwarn
, or run your own instance of ntfy. A list of all options
is presented on the Notifier catalog page.
The tutorial will expect that you installed the mqttwarn
command-line program
on your machine, so that you can run it within your terminal. There are different
options to install mqttwarn.
Configuration#
Within the mqttwarn configuration file, the launch
setting within the
The [defaults] section, and the [config:ntfy]
service section
will define ntfy as a notification target.
The topic section [owntracks/#]
will define the MQTT topic mqttwarn will
subscribe to, here owntracks/#
. Its configuration settings filter
, format
, and
targets
, will instruct mqttwarn to format the outbound message like defined by a
template string, and dispatch it to the corresponding target address descriptor slot
ntfy:testdrive
.
# Forward OwnTracks low-battery warnings to ntfy.
# https://mqttwarn.readthedocs.io/en/latest/examples/owntracks-ntfy/readme.html
[defaults]
functions = mqttwarn-owntracks.py
launch = ntfy
[config:ntfy]
targets = {'testdrive': 'https://ntfy.sh/testdrive'}
[owntracks/#]
filter = owntracks_batteryfilter()
format = My phone battery is getting low ({batt}%)!
targets = ntfy:testdrive
The user-defined filter function owntracks_batteryfilter()
will inspect OwnTracks’
JSON event payload for the value of your phone’s battery level.
"""
Forward OwnTracks low-battery warnings to ntfy.
https://mqttwarn.readthedocs.io/en/latest/examples/owntracks-ntfy/readme.html
"""
import json
def owntracks_batteryfilter(topic: str, message: str):
ignore = True
try:
data = dict(json.loads(message).items())
except:
data = None
if data and "batt" in data and data["batt"] is not None:
ignore = int(data["batt"]) > 20
return ignore
Usage#
Using three terminal sessions, and one browser session, you can exercise the tutorial interactively.
Setup#
First, let’s start the Mosquitto MQTT broker.
docker run --name=mosquitto -it --rm --publish=1883:1883 eclipse-mosquitto:2.0 mosquitto -c /mosquitto-no-auth.conf
Let’s acquire the configuration file mqttwarn-owntracks.ini
, and the user-defined
functions file mqttwarn-owntracks.py
, and start mqttwarn
.
wget https://github.com/mqtt-tools/mqttwarn/raw/main/examples/owntracks-ntfy/mqttwarn-owntracks.ini
wget https://github.com/mqtt-tools/mqttwarn/raw/main/examples/owntracks-ntfy/mqttwarn-owntracks.py
mqttwarn --config-file=mqttwarn-owntracks.ini
Before dry-run publishing a JSON message, in order to validate your setup, subscribe to the
ntfy topic testdrive
, either using your browser of choice,
open https://ntfy.sh/testdrive
or a commandline-based HTTP client like curl
.
curl -s https://ntfy.sh/testdrive/json
Self-test#
Now, when publishing a minimal example JSON event payload, mqttwarn
will run a notification
to ntfy when the battery level threshold is reached, as instructed.
echo '{"batt": 19}' | mosquitto_pub -t 'owntracks/testdrive' -l
A JSON event with a battery level above the minimum threshold will not trigger a notification.
echo '{"batt": 42.42}' | mosquitto_pub -t 'owntracks/testdrive' -l
An invalid message, which can’t be decoded, will also not trigger a notification.
echo 'foobar' | mosquitto_pub -t 'owntracks/testdrive' -l
Appendix#
This section demonstrates a few alternative methods for solving different aspects of this recipe, and also includes administrative information.
Running mqttwarn as container#
This command will run mqttwarn in a container, using the docker
command to launch it.
Alternatively, podman
can be used. It expects an MQTT broker to be running on localhost
,
so it uses the --network=host
option. The command will mount the configuration file and
the user-defined functions file correctly, and will invoke mqttwarn with the corresponding
--config-file
option.
docker run --rm -it --network=host --volume=$PWD:/etc/mqttwarn \
ghcr.io/jpmens/mqttwarn-standard \
mqttwarn --config-file=mqttwarn-owntracks.ini
Running ntfy as container#
While this tutorial uses the ntfy service at ntfy.sh, it is possible to run your own instance. For example, use Docker or Podman.
docker run --name=ntfy --rm -it --publish=5555:80 \
binwiederhier/ntfy serve --base-url="http://localhost:5555"
In this case, please adjust the ntfy configuration section [config:ntfy]
to use
a different URL, and make sure to restart mqttwarn afterwards.
[config:ntfy]
targets = {'testdrive': 'http://localhost:5555/testdrive'}
Backlog#
Todo
[o] Define battery threshold level within the configuration file.