ITmedia NEWS > STUDIO >
連載
» 2020年09月16日 07時00分 公開

名刺サイズの超小型PC「ラズパイ」で遊ぶ(第27回):ラズパイで気温と湿度を測定、LINEで通知を受け取る 〜後編〜

今回は温湿度センサーモジュールとラズパイを組み合わせ、LINEと連携させる方法を紹介します。今回はLINEとの連携方法について解説します。

[岩泉茂,ITmedia]

 前回は、温湿度センサーモジュール「SHT31」を使って気温と湿度を測定し、記録するところまで解説しました。今回はこのデータをLINEのメッセージとして送信する方法までを解説します。

ラズパイからLINE宛てにメッセージを送る

 第10回では、撮影した画像をLINEに送る仕組みについてご紹介しました。今回も同じ方法で、測定した気温と湿度のデータをLINEへ送信してみましょう。

 ラズパイからLINEでメッセージを送るためには「アクセストークン」を発行する必要があります。その手順は第10回で紹介していますので、そちらをたどって設定してください。ここではトークンの取得が終了したところから解説します。

 第10回ではシェルスクリプトでのメッセージ送信を例に挙げましたが、今回はPythonのプログラムで送る方法についてご紹介します。

 Pythonには「requests」というライブラリがあります。requestsはHTTP通信ライブラリなので、これを使うとWebサイトにアクセスすることができるので、「https://notify-api.line.me/api/notify」からLINEあてにメッセージを送信できます。プログラムは以下の通りです。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
url = "https://notify-api.line.me/api/notify" 
token = "(取得したトークン)"
headers = {"Authorization" : "Bearer "+ token} 
message =  "ラズパイからメッセージ" 
payload = {"message" :  message} 
r = requests.post(url, headers = headers, params=payload) 

 「token」とあるところに取得したトークンを記述すればOKです。「message」には好きなメッセージを入れてみてください。これを「line.py」などのプログラム名で保存しておきましょう。そして

$ python line.py

 と入力すれば、LINEにメッセージを送ることができます。

SHT31 LINEにメッセージが送信される

LINE宛てに測定した気温と湿度を送る

 LINEでメッセージが送れるようになったら、これを踏まえて、測定した結果をLINEで送るプログラムを作成しましょう。改変する部分は「message」の場所です。気温「roomtemp」と湿度「roomhum」の値を「.1f」で小数点以下第1位で丸めて「str」で文字列に変換し、それをひとかたまりにしてLINEに送ります。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import smbus
import datetime
import requests
smb = smbus.SMBus(1)
# SHT31のI2Cアドレス
addr = 0x45
# データの読み出し
smb.write_i2c_block_data(addr, 0x2C, [0x06])
data = smb.read_i2c_block_data(addr, 0x00, 6)
# 気温
st = data[0] <<8 | data[1]
roomtemp = -45 + (175 * st/float((2**16 - 1)))
# 湿度
srh = data[3] <<8 | data[4]
roomhum = 100 * srh/ float((2**16 - 1))
# 温度と湿度をLINEで送る
url = "https://notify-api.line.me/api/notify" 
token = "(取得したトークン)"
headers = {"Authorization" : "Bearer "+ token} 
message = ["気温" + str(format(roomtemp,'.1f')) + "C", "湿度" + str(format(roomhum,'.1f')) + "%"] 
payload = {"message" :  message} 
r = requests.post(url, headers = headers, params=payload)

 先ほどは「ラズパイからメッセージ」という単純な文字列を送りました。測定データは小数で表されたデータなので、そこから桁数を小数点以下第1位にし、さらにそれを文字列として変更したうえで、表示を整えました。これをcronなどと組み合わせれば、定期的にデータを測定してLINEに送信するようにできます。

SHT31 気温と湿度が送信される

暑さ指数をLINEで送る

 ここまで段階を経て述べてきましたが、最終目的である「暑さ指数(WBGT)」により、アラートをLINEに送ってくれる仕組みを作りましょう。

 暑さ指数と警報基準の関係は以下のようになります。

■暑さ指数と基準の関係

暑さ指数(WBGT) 基準
31以上 危険
28以上、31℃未満 厳重警戒
25以上、28℃未満 警戒
21以上、25℃未満 注意
21未満 ほぼ安全

 WBGTの求め方ですが、環境省のWebサイトによると以下のようになります。

 WBGT=0.7×Tw+0.2×Tg+0.1×Ta

 ここでTgは黒球温度の観測値、Taは気象庁観測の気温、Twは湿球温度です。ただし家の中で測定する場合は、それなりの装置がないと黒球温度や湿球温度を測定することはできません。そこで同じページにある予測値の式を利用します。

 WBGT=0.735×Ta+0.0374×RH+0.00292×Ta×RH+7.619×SR−4.557×SR2−0.0572×WS−4.064

 ここでTaは気温(℃)、RHは相対湿度(%)、SRは全天日射量(kW/m2)、WSは平均風速(m/s)です。全天日射量や平均風速ですが、全天日射量の平均は0.2程度です。これに加えて平均風速を0として考えると、もう少し式が簡単になります。

WBGT=0.735×Ta+0.0374×RH+0.00292×Ta×RH−3.4516

 これを踏まえてプログラムを設計しましょう。変数を「wbgt」として暑さ指数と基準の関係に当てはめると以下のようになります。

wgbt>31で「危険」を送信
28<wbgt<31で「厳重警戒」を送信
25<wbgt<28で「警戒」を送信
21<wbgt>25で「注意」を送信
wbgt<21で「ほぼ安全」を送信

 これらの場合分けをして、条件に合うメッセージをLINEで送る仕組みを作ります。場合分けですが、「if」と「elif」、「else」で条件を分岐させればよさそうです。これを踏まえてプログラムを作ると以下のようになります。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import smbus
import datetime
import requests
t = datetime.datetime.today()
smb = smbus.SMBus(1)
# SHT31のI2Cアドレス
addr = 0x45
# データの読み出し
smb.write_i2c_block_data(addr, 0x2C, [0x06])
data = smb.read_i2c_block_data(addr, 0x00, 6)
# 気温
st = data[0] <<8 | data[1]
roomtemp = -45 + (175 * st/float((2**16 - 1)))
# 湿度
srh = data[3] <<8 | data[4]
roomhum = 100 * srh/ float((2**16 - 1))
# WBGTを求める
wbgt = 0.735 * roomtemp + 0.0374 * roomhum + 0.00292 * roomtemp * roomhum - 3.4516
# 温度と湿度をLINEで送る
url = "https://notify-api.line.me/api/notify" 
token = "(取得したトークン)"
headers = {"Authorization" : "Bearer "+ token} 
message = ["気温" + str(format(roomtemp,'.1f')) + "C", "湿度" + str(format(roomhum,'.1f')) + "%"] # ←変更
payload = {"message" :  message} 
r = requests.post(url, headers = headers, params=payload)
if wbgt >= 31:
    message = ["暑さ指数 危険!"]
elif 28 <= wbgt < 31:
    message = ["暑さ指数 厳重警戒!"] 
elif 25 <= wbgt < 28:
    message = ["暑さ指数 警戒!"]
elif 21 <= wbgt <25:
    message = ["暑さ指数 注意!"]
else:
    message = ["ほぼ安全"]
# 念のためコンソールにデータを表示
print ('wbgt : %.1f' %wbgt)
print ('Temp : %.1f C' %roomtemp)
print ('Humi : %.1f %%'%roomhum)
# ここまで
# WBGT警報をLINEで送る
url = "https://notify-api.line.me/api/notify" 
token = "(取得したトークン)"
headers = {"Authorization" : "Bearer "+ token} 
payload = {"message" :  message} 
r = requests.post(url, headers = headers, params=payload)

 このプログラムには「sht31_wbgt.py」などのように、名前を付けて保存しましょう。気温と湿度がメッセージで送られたあと、WBGTの指数に従って「警戒!」などのメッセージが送られます。途中、計算がちゃんとされているか確かめるためにprint文を入れていますが、これは削除しても構いません。

SHT31 暑さ指数と気温、湿度が送信される

 あとは定期的に測定してメッセージが送られるようにしましょう。こちらもcronを使います。

$ sudo crontab -e

 とエディットモードで表示したら、以下のように記述します。

*/10 * * * * python /home/pi/sht31_wbgt.py

 これで10時10分、10時20分のように、毎時10分おきにLINEのメッセージが送られます。

Copyright © ITmedia, Inc. All Rights Reserved.