名刺サイズの超小型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
「菜の花がおかしい」――イラストレーター制作うたうマラソン大会ポスターに指摘相次ぐ 事務局がAI使用明かす【訂正あり】
-
2
くら寿司、10%割引の“適用漏れ”を謝罪 レシート持参で返金へ ちいかわコラボのお詫び施策
-
3
iPhone 18シリーズ発表、今年はPro・Pro Maxのみ なんと“無印”なし 価格は21万9800円から【更新終了】
-
4
「ペンギンを返して」 Suica新キャラ候補3案公開でSNSに戸惑いの声 一般投票は8日から
-
5
幻の「ちいかわ」コラボ第3弾皿、捨てちゃうの? くら寿司に聞いてみた
-
6
藤井風のリサイタル、公式サイトがインターネット老人会すぎると話題 公民館のチラシみたいだけど東京ドーム開催
-
7
「ペンギンを返して」→「3匹全部採用して」 批判殺到のSuica新キャラ、ファンアートが空気を変えた? SNSの声
-
8
Duolingoの新アイコンが「気持ち悪い」 世界のユーザーから「元に戻して」の声
-
9
農水省の“クソダサ”ポスター話題 「AIよりよっぽど良い」の声も 担当者に狙いを聞いた
-
10
大雨で「首都圏外郭放水路」稼働 濁流が“地下神殿”を満たすまでの動画公開 国交省
ITmedia NEWS SNS
インフォメーション
注目情報をチェック
ITmediaNEWSをフォロー
あなたにおすすめの記事PR