名刺サイズの超小型PC「ラズパイ」で遊ぶ(第27回)
ラズパイで気温と湿度を測定、LINEで通知を受け取る ~後編~
前回は、温湿度センサーモジュール「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にメッセージを送ることができます。
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に送信するようにできます。
暑さ指数を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で「危険」を送信
2825で「注意」を送信
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文を入れていますが、これは削除しても構いません。
あとは定期的に測定してメッセージが送られるようにしましょう。こちらもcronを使います。
$ sudo crontab -e
とエディットモードで表示したら、以下のように記述します。
*/10 * * * * python /home/pi/sht31_wbgt.py
これで10時10分、10時20分のように、毎時10分おきにLINEのメッセージが送られます。
Copyright © ITmedia, Inc. All Rights Reserved.
名刺サイズの超小型PC「ラズパイ」で遊ぶ
今やスマートフォンアプリで何でも完結できてしまう時代。しかし、一から自分の手でデバイスを作り上げ、試行錯誤しながらアイデアを具現化する楽しさは格別です。この連載では、テーマや用途にあわせてマイクロコンピュータ(マイコン)と呼ばれる名刺サイズの超小型PC「Raspberry Pi」(通称ラズパイ)の活用方法から具体的な工作手順までを紹介します。
この記事の著者
関連記事
こんなメディアも見られています
ITmedia NEWSに関連する情報をお探しであれば、こちらのメディアもお役に立てるかもしれません。
SpecialPR
本日の新着記事
アクセスランキング
-
1
「comico」サ終にマンガ家が思う“縦読みマンガ”の弱点と戦略ミス
-
2
LINE、着せかえ表示問題を謝罪 希望者に返金へ
-
3
FANZA、成人向けAI創作・公開サービス「FANZAスタジオ」発表 先行体験は8月24日から
-
4
目指すは、日本発IPで海外売上20兆円 経産省が新戦略を発表 「ものがたり大国5カ年計画」
-
5
スマート給餌器で38時間の障害、ペットがご飯食べられず 飼い主の苦情殺到 「旅行中なのに」「猫が死んじゃう」
-
6
法務省、「ラヴ上等」とのタイアップ中止 「当初の意図を全うすることが難しい」
-
7
中国の動画サイト「bilibili」にグローバル版アプリ 日本でも配信開始 まずはAndroidから
-
8
終了発表の縦読み漫画「comico」――元重課金ユーザーが振り返る「いつしか開かなくなった」理由
-
9
バスローブ姿で取材対応の秋田県職員 ラブホ不倫現場からリモート対応だった 県が処分
-
10
Tesla歴5年の筆者がみなさんの疑問に答えます
ITmedia NEWS SNS
インフォメーション
注目情報をチェック
ITmediaNEWSをフォロー
あなたにおすすめの記事PR