DIYで大体なんとかする

このブログのあらすじは… 注文住宅建てたい→中古住宅買う→DIYとコーヒーにハマる(いまここ)

Nature Remoで取得した部屋温度をZabbixでグラフ化する Ver.2

バージョンアップしました。

・NatureRemoをZabbixテンプレート化
・LLDでのremo検出
・複数台remo対応
・温度/湿度/照度に対応

Zabbixさえ使えるならこっちの方が簡単だと思います。
remoのトークン取得までは前回記事参照。
kodate.hatenablog.com

ちなみにウチではこれをdockerコンテナ化したZabbix-agentで動かし、同じくZabbix-proxyコンテナからクラウド上のZabbixサーバーにデータを投げてますが、そのあたりまで解説し始めるとキリがないので省略。


手順

というわけでZabbixがわかってる人向けにゴリゴリ進めて参ります。

クラウド上のRemoサーバーから取ってきたJSONデータを
別のJSONフォーマットで再整形するというけったいなスクリプト
何せスクリプトスキルが低いので、試行錯誤の結果こうなったというだけ。
その過程でjqを知った今となっては、たぶんこんなことしないでも直接jqだけで整形できるなぁと思う。

vi /usr/local/bin/remo-json.sh
#!/bin/bash
rm /tmp/remo*
LF=$(printf '\\\012_')
LF=${LF%_}
DS="  "
curl -s -X GET "https://api.nature.global/1/devices" -H "accept: application/json" -H "Authorization: Bearer $1" |sed 's/{\"name\"/'"$LF{\"name\""'/g' > /tmp/remo
ROWS=$(cat /tmp/remo | wc -l)
REMONUM=$ROWS
loop=`expr $ROWS - 1`;#֤
i=0;

echo -e -n '{\n\t"data":[\n'

while true
do
REMONUM=`expr $REMONUM + 1`

eval NAME${REMONUM}=$(sed -n ${REMONUM}p /tmp/remo |awk '{print substr($0, index($0, "\"name\""))}'|awk '{sub("id.*", "");print $0;}'|sed -e 's/"//g'|sed -e 's/,//g'|sed -e 's/name://g')
eval TEMP${REMONUM}=$(sed -n ${REMONUM}p /tmp/remo |awk '{print substr($0, index($0, "\"te\""))}'|awk '{sub("created.*", "");print $0;}'|sed -e 's/"//g'|sed -e 's/,//g'|sed -e 's/{//g'|sed -e 's/te:val://g'|awk '{printf("%d",$1 + 0.5)}')
eval HUMI${REMONUM}=$(sed -n ${REMONUM}p /tmp/remo |awk '{print substr($0, index($0, "\"hu\""))}'|awk '{sub("created.*", "");print $0;}'|sed -e 's/"//g'|sed -e 's/,//g'|sed -e 's/{//g'|sed -e 's/hu:val://g'|awk '{printf("%d",$1 + 0.5)}')
eval ILLUMI${REMONUM}=$(sed -n ${REMONUM}p /tmp/remo |awk '{print substr($0, index($0, "\"il\""))}'|awk '{sub("created.*", "");print $0;}'|sed -e 's/"//g'|sed -e 's/,//g'|sed -e 's/{//g'|sed -e 's/il:val://g'|awk '{printf("%d",$1 + 0.5)}')
                echo -e -n "\t\t"
                eval echo '{ \"{#REMONAME}\":\"''$NAME'$REMONUM'\",\"{#REMOTEMP}\":\"''$TEMP'$REMONUM'\",\"{#REMOHUMI}\":\"''$HUMI'$REMONUM'\",\"{#REMOILLUMI}\":\"''$ILLUMI'$REMONUM'\" }'
REMONUM=`expr $REMONUM - 2`;
i=`expr $i + 1`
if [ $i -le $loop ]; then
echo -e -n ","
elif [ $i -gt $loop ]; then
break
fi
done

echo -e -n '\t]\n'
echo "}"

exit 0
  • remo-json.shに権限付与
chmod +x /usr/local/bin/remo-json.sh
chown zabbix:zabbix /usr/local/bin/remo-json.sh

これで、スクリプトの引数にトークンを付けて実行すると…

# /usr/local/bi/remo-json.sh [取得したトークン]
{
        "data":[
                { "{#REMONAME}":"ベッド","{#REMOTEMP}":"26","{#REMOHUMI}":"0","{#REMOILLUMI}":"0" }
,               { "{#REMONAME}":"リビング","{#REMOTEMP}":"22","{#REMOHUMI}":"40","{#REMOILLUMI}":"70" }
        ]
}

こんな感じにデータが返ってきます。

  • Zabbix-Agent側にuserparameterを定義

スクリプトが吐き出すJSONデータからLLDでRemoを検出し、それらの温湿度とかを取得。

vi /etc/zabbix/zabbix_agentd.d/userparameter_natureremo.conf
UserParameter=natureremo.discovery[*],/usr/local/bin/remo-json.sh $1 |jq . | tee /tmp/rmt
UserParameter=natureremo.temp[*],cat /tmp/rmt | sed -e "s/{#//g"|sed -e "s/}"\"":/"\"":/g"|jq -r '.data[] | select(.REMONAME=="$1")|.REMOTEMP'
UserParameter=natureremo.humi[*],cat /tmp/rmt | sed -e "s/{#//g"|sed -e "s/}"\"":/"\"":/g"|jq -r '.data[] | select(.REMONAME=="$1")|.REMOHUMI'
UserParameter=natureremo.illumi[*],cat /tmp/rmt | sed -e "s/{#//g"|sed -e "s/}"\"":/"\"":/g"|jq -r '.data[] | select(.REMONAME=="$1")|.REMOILLUMI'
  • 動作確認

AgentかServer上とかで、zabbix_getで実際に値を取ってみます。
ところで[任意の値]を表現する角括弧と、実際に必要な角括弧が混じっててわかりづらい感じになってますが、natureremo.discoveryの後ろは角括弧[]の中にトークンを入れてください。他は角括弧不要。

# zabbix_get -s [AgentのIP] -k natureremo.discovery[[取得したトークン]]
{
  "data": [
    {
      "{#REMONAME}": "ベッド",
      "{#REMOTEMP}": "26",
      "{#REMOHUMI}": "0",
      "{#REMOILLUMI}": "0"
    },
    {
      "{#REMONAME}": "リビング",
      "{#REMOTEMP}": "22",
      "{#REMOHUMI}": "40",
      "{#REMOILLUMI}": "60"
    }
  ]
}
  • Zabbixテンプレートを作成

名前はご自由に、"Template NatureRemo"など。
xmlテンプレートファイルはこちら。
Zabbix Share - Template NatureRemo
ただしZabbix4.0で出力してるのでそれ以上じゃないと取り込めないはず。
難しいことは一切してないので、以下の通り手で作れば2.2ぐらいでも使えると思います。

テンプレートのマクロ
マクロ {$REMO_BEARER}
empty
ディスカバリルール
名前 NatureRemo Discovery
タイプ Zabbixエージェント
キー natureremo.discovery[{$REMO_BEARER]
アイテムのプロトタイプ
名前 {#REMONAME} 室温
タイプ Zabbixエージェント
キー natureremo.temp[{#REMONAME}]
データ型 数値(浮動小数)
単位
アイテムのプロトタイプ
名前 {#REMONAME} 湿度
タイプ Zabbixエージェント
キー natureremo.humi[{#REMONAME}]
データ型 数値(整数)
単位 %
アイテムのプロトタイプ
名前 {#REMONAME} 照度
タイプ Zabbixエージェント
キー natureremo.illumi[{#REMONAME}]
データ型 数値(整数)
単位 lx
  • Zabbixホストを作成

Zabbixエージェントホストに上のテンプレを割り当て、以下のようにホストマクロを編集。

継承したマクロとホストマクロ
マクロ {$REMO_BEARER}
実効値 取得したremoトーク

テンプレDLした人はテンプレに含まれてますが、手入力した人はグラフも手で作ってもらえれば、こんな感じのグラフが描けます。

f:id:nakaring:20190322160405p:plain
NatureRemoグラフ