add plugin switchbotplugmini

This commit is contained in:
shakemid 2022-07-19 22:04:01 +09:00 committed by Kenyon Ralph
parent 6dfba8c0e0
commit 8cac37d2a7
2 changed files with 137 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

137
plugins/sensors/switchbotplugmini Executable file
View File

@ -0,0 +1,137 @@
#!/bin/bash
# -*- sh -*-
: << =cut
=head1 NAME
switchbotplugmini - Munin plugin to monitor power consumption from Switchbot Plug Mini
=head1 CONFIGURATION
Obtain a token and deviceid for SwitchBot API. See the following website.
https://github.com/OpenWonderLabs/SwitchBotAPI
=head1 ENVIRONMENT VARIABLES
env.token : Token to access SwitchBot API. (Required)
env.deviceid : Device ID(s) of SwitchBot Plug Mini. (Required)
Multiple device IDs can be set by separating with white space.
env.interval : Interval in seconds for API access. (Optional, default is 0)
=head1 NOTES
The amount of SwitchBot API calls per day is limited to 10000 times.
If munin-node executes this plugin every 5 minutes, the API will be called 288 times a day.
You can use env.interval parameter to prevent frequent API access. For example, if you set
env.interval 900, the API response will be cached to local file for 900 seconds(15 minutes).
=head1 AUTHOR
K.Cima https://github.com/shakemid
=head1 LICENSE
GPLv2
SPDX-License-Identifier: GPL-2.0-only
=head1 Magic markers
#%# family=contrib
#%# capabilities=
=cut
. "${MUNIN_LIBDIR}/plugins/plugin.sh"
set -o nounset
set -o pipefail
# Token to access SwitchBot API
token=${token:?}
# Device ID(s) of SwitchBot Plug Mini
deviceid=${deviceid:?}
# Interval for API access (second)
interval=${interval:-0}
config() {
cat <<EOF
graph_title SwitchBot Plug Mini Watts
graph_category sensors
graph_scale no
graph_vlabel Watts
graph_args --base 1000
EOF
for i in ${deviceid}; do
echo "weight${i}.label ${i}"
done
}
fetch() {
do_read_cache=0
do_store_cache=0
if [ "${interval}" -ne 0 ]; then
time_now=$( date +%s )
if [ -f "${MUNIN_STATEFILE}" ]; then
time_modified=$( stat --format=%Y "${MUNIN_STATEFILE}" )
else
time_modified=0
fi
if [ $(( time_now - time_modified )) -le "${interval}" ]; then
do_read_cache=1
else
do_store_cache=1
fi
fi
if [ "${do_read_cache}" -eq 1 ]; then
cat "${MUNIN_STATEFILE}"
else
if [ "${do_store_cache}" -eq 1 ]; then
cat /dev/null > "${MUNIN_STATEFILE}"
fi
for i in ${deviceid}; do
weight=$( fetch_api "${i}" )
echo "weight${i}.value ${weight}"
if [ "${do_store_cache}" -eq 1 ]; then
echo "weight${i}.value ${weight}" >> "${MUNIN_STATEFILE}"
fi
done
fi
}
fetch_api() {
local deviceid=$1
response=$( curl -s -H "Authorization:${token}" "https://api.switch-bot.com/v1.0/devices/${deviceid}/status" )
statusCode=$( echo "${response}" | jq '.statusCode' )
if [ "${statusCode}" -ne 100 ]; then
echo Error with statusCode = "${statusCode}" 1>&2
exit 1
fi
echo "${response}" | jq '.body.weight'
}
# Main
case ${1:-} in
config)
config
if [ "${MUNIN_CAP_DIRTYCONFIG:-}" = "1" ]; then
fetch
fi
;;
*)
fetch
;;
esac
exit 0