Raspberry Pi で温度・湿度・気圧を Slack に投稿する

前回は Raspberry Pi で計測した温度・湿度・気圧をツイートできるようにした。

Raspberry Pi で温度・湿度・気圧をツイートする|荒川仁志|note
https://note.com/hitoshiarakawa/n/nbe5c2a353ab8

次は Slack に投稿するようにしてみよう。

環境:Raspberry Pi Zero W、Raspberry Pi OS Stretch、macOS Catalina Version 10.15.6 から SSH 接続、AE-BME280(温湿度・気圧センサモジュールキット)

(1)Slack で Webhook URL を取得する。

(2)今回も SWITCH SCIENCE さんのサンプルスクリプトを活用させてもらう。以下のページの「Python27>BME280_sample.py」を Raspberry Pi のホームディレクトリにダウンロードする。

GitHub - SWITCHSCIENCE/BME280
https://github.com/SWITCHSCIENCE/BME280

(3)Raspberry Pi のホームディレクトリに以下のシェルスクリプトを作成する(PostToSlack.sh というファイル名とする)。

#!/bin/sh

date=`date '+%Y/%m/%d %H:%M:%S'`

#Slack用の設定
url="https://hooks.slack.com/services/xxxxxxxxx/xxxxxxxxx/xxxxxxxxxxxxxxxxx"
channel=general
username=PiSensor
icon_emoji=:clipboard:

#センサーデータ
result1=`python /home/pi/bme280_sample.py | grep hum | cut -d' ' -f4`
result2=`python /home/pi/bme280_sample.py | grep temp | cut -d' ' -f3`
result3=`python /home/pi/bme280_sample.py | grep pressure | cut -d' ' -f3`

if [ $? -gt 0 ]; then
	exit 1;
fi

message="【${date}】湿度:${result1}% 温度:${result2}度 気圧:${result3}hPa"

#call curl
curl -X POST --data-urlencode "payload={\"channel\":\"$channel\",\"username\":\"$username\",\"text\":\"$message\",\"icon_emoji\":\"$icon_emoji\"}" $url

(4)シェルスクリプトに実行権限を与える。

$ sudo chmod 735 PostToSlack.sh

(5)以下のコマンドを実行。

$ ./SensorToSlack.sh

以下のように Slack に投稿されるはずだ。

【2021/10/03 17:48:18】湿度:45.55% 温度:30.36度 気圧:1023.23hPa

以下のように cron に登録すれば毎時0分に実行できるだろう。

0 * * * * ./SensorToSlack.sh

***

しかし、いちいち Slack に通知が来るのが煩わしいという場合もあるはず。私は湿度が 60% を超えたときのみ Slack に通知されればいい。

そのようにシェルスクリプトを書き換えてみよう。そのためには、スクリプト内で湿度の値を 60 と比較し評価することになるが、湿度は小数点となる。小数点の比較をするには bc コマンドを使う必要があるので、bc コマンドをインストールする。

$ sudo apt install bc

この上で、スクリプトを以下のように書き換えた。

#!/bin/bash

date=`date '+%Y/%m/%d %H:%M:%S'`

#Slack用の設定
url="https://hooks.slack.com/services/xxxxxxxxx/xxxxxxxxx/xxxxxxxxxxxxxxxxx"
channel=general
username=PiSensorBot
icon_emoji=:clipboard:

#センサーデータ
result1=`python /home/pi/bme280_sample.py | grep hum | cut -d' ' -f4`
result2=`python /home/pi/bme280_sample.py | grep temp | cut -d' ' -f3`
result3=`python /home/pi/bme280_sample.py | grep pressure | cut -d' ' -f3`

if [ $? -gt 0 ]; then
	exit 1;
fi

#湿度が60%以上のときのみ投稿
if [ `echo "$result1 > 60" | bc` == 1 ]; then
	message="【${date}】湿度:${result1}% 温度:${result2}度 気圧:${result3}hPa 60%を超えています!";
	curl -X POST --data-urlencode "payload={\"channel\":\"$channel\",\"username\":\"$username\",\"text\":\"$message\",\"icon_emoji\":\"$icon_emoji\"}" $url
fi

これで湿度が 60% を超えたときのみ以下のように投稿される(60% 以下なら投稿されない)。

【2021/10/04 11:16:42】湿度:62.25% 温度:29.84度 気圧:1025.47hPa 60%を超えています!

例えば、6時から 21 時の間だけ毎時0分にチェックするなら、以下のように cron に登録する。

0 6-21 * * * ./PostToSlack.sh

参考:
raspberrypi/Raspberry PiでIO制御 - PukiWiki
http://www.pwv.co.jp/~take/TakeWiki/index.php?raspberrypi%2FRaspberry%20Pi%E3%81%A7IO%E5%88%B6%E5%BE%A1

linux - [ :Unexpected operator in shell programming - Stack Overflow
https://stackoverflow.com/questions/3411048/unexpected-operator-in-shell-programming/3411061

bashで小数点を比較する方法: 小粋空間
https://www.koikikukan.com/archives/2019/11/06-235555.php

Linuxコマンドを連続して使うには - Qiita
https://qiita.com/egawa_kun/items/714394609eef6be8e0bf


この記事が気に入ったらサポートをしてみませんか?