switchbot の温湿度計を munin で読み取るための python スクリプトを活用していたけど、特定閾値を超えた際の処理は nagios4 の方が便利。munin の警告だと閾値を越えている間は何度も警告メールが飛んでくる。nagios であれば、こういった処理がうまい。
かといって、swichbot の python アプリを nagios の check_*** に書き換えてみたが、bluetooth のアクセス権限などの設定が煩雑だしうまくいかなかった。
でも、munin は、ネットワーク経由の監視の機能があるので、それを使うこととした。munin のリモート接続のポート番号4949に接続して、list で測定できるものの一覧が取れて、fetch すれば 値を読み取ってくれる。
((( telnet でプロトコルを確認 ))) $ telnet localhost 4949 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. # munin node at localhost list df load processes switchbotmeterbt . fetch switchbotmeterbt xxxxxxxxxxxx_Temperature.value 27.6 xxxxxxxxxxxx_Humidity.value 54 xxxxxxxxxxxx_Battery.value 87 xxxxxxxxxxxx_Discomfort.value 75.68896000000001 xxxxxxxxxxxx_WBGT.value 24.176256000000006 . QUIT Connection closed by foreign host. ((( 単純なので nc を使って読ませる ))) $ echo -e "fetch switchbotmeterbt\nQUIT\n" | nc localhost 4949 # munin node at localhost xxxxxxxxxxxx_Temperature.value 27.7 xxxxxxxxxxxx_Humidity.value 54 xxxxxxxxxxxx_Battery.value 87 xxxxxxxxxxxx_Discomfort.value 75.82342 xxxxxxxxxxxx_WBGT.value 24.268412 .
ということで、ちょっとだけ手抜きで nc とか使って perl を使って読み取らせる処理を書いてみた。
#!/usr/bin/perl use strict ; use warnings ; my $SWBT_METER = "/usr/bin/echo -e 'fetch switchbotmeterbt\nQUIT\n' | /usr/bin/nc localhost 4949" ; my %value = () ; open( my $FH , "$SWBT_METER 2>/dev/null |" ) or die( "Can't open $SWBT_METER" ) ; while ( my $line = <$FH> ) { if ( $line =~ /^[0-9a-f]+_([^.]+)\.value\s+([\.0-9]+)\s*$/ ) { $value{$1} = $2 ; $flag = 1 ; } } close( $FH ) ;