自宅サーバを更新し、Switchbot の温度監視を munin でグラフ化、その結果を nagios4 で結果のモニタリングをしていたけど、新しいサーバで Unknown の状態が頻発している。旧サーバでの運用時より、発生回数が増えている。
排他処理とリトライの追加
Switchbot API での値の取得だけれど、muninでの値取得とnagios4での値取得の処理と重なるとデータ取得に失敗すると思われるので、flock コマンドで排他処理を追加。これである程度は Unknown が減ったが、それでも Unknown 発生する。
しかたがないので、Switchbot API で 成功ステータス100が取れなかった時は、1秒の間をあけて1度だけリトライするようにした。(当初は0.3秒 sleep にしたけど効果が薄かった) これにより Unknown はかなり減ったけど、まだ失敗することがある。しかしながら、Switchbot API の1日あたりの回数制限もあるし、何度もリトライさせるのはやめておこう。
#!/bin/bash
. "/usr/local/etc/switchbot/token-v11.sh"
function curl_status() {
# flockで排他処理
/usr/bin/flock -x /tmp/switchbot-api.lock \
/usr/bin/curl -s --request GET \
-H "Content-Type: application/json" -H "Authorization: ${token}" \
-H "sign: ${sign}" -H "nonce: ${nonce}" -H "t: ${t}" \
"${url_list_v11_meter}"
}
function device_status() {
url_list_v11_meter="${url_list_v11}/$1/status"
JQ=/usr/bin/jq
json=$(curl_status)
state=$($JQ '.statusCode' <<< "$json" )
# 取得に失敗したら1度だけリトライ
if [ "$state" != "100" ]; then
# リトライ間隔(sleep 0.3 では効果が薄かった)
sleep 1
json=$(curl_status)
fi
$JQ -r '. | (.statusCode|tostring) + " " + (.message|tostring)' <<< "$json"
}
(追記) 0:00 頃に unknown
上記の改良後だけど、2日連続で 0:00 に unknown 状態になる。 Switchbot HUB 自身が、日替わり時に何らかの処理を実行しているんだろうなぁ…