ホーム » コンピュータ » Linux » switchbot API の排他処理とリトライ

システム

最近の投稿

アーカイブ

カテゴリー

switchbot API の排他処理とリトライ

自宅サーバを更新し、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 自身が、日替わり時に何らかの処理を実行しているんだろうなぁ…

Google 検索

My Google   Yahoo

Microsoft

ファンサイト