ラズパイでなんちゃってスマートホームを構築するにあたり、初心者の私がwebや書籍を調べてやったことを備忘録のようにつづっています。
ラズパイと温湿度センサを使ってLEDで表現するために、、、
前回に引き続き、ラズパイで検出した温湿度をBluetoothスピーカーに喋らせます。そして、不快指数を計算し、部屋の状態をLEDで表現します。
さらに、外気の温湿度をBluetoothスピーカーに喋らせて、不快指数を計算し、外の状態をLEDで表現します。今回は、
について説明します。
簡単に構築できるスマートホーム。全体の流れ
流れは以下のような感じです。難しいことは何もやっていません。初心者の私でもできるようなことしかやっていませんので、初心者の方も安心してチャレンジしてください。中身が非常に長くなるので、四部作で紹介します。
第二部 不快指数に応じて部屋の状態を判断し、部屋の状態(暑い、寒い)をスピーカーから喋らせる
第三部 外気温をwebAPIで取得して、不快指数により外の状態をスピーカーから喋らせる
第四部 部屋の状態、外の状態をLEDで表現する。
今回は第三部です。
実際に外の温度を計測するのは断念。。。
実は、最初の構想では、温度・湿度センサをエアコンのダクトから外に出して、実際の外の温度・湿度を計測しようと考えていました。ただし、実際にやろうとすると、真夏であれば、日射の影響による温度上昇があるなど、
正確に計測するにはどうするのが良いのかなあ、と考えましたが、結局百葉箱のようなものを作るしかなく、それは素人には手を出せないと思い、そもそも今の時代は、正確に測定したものをオープンにしているサイトもあり、そのデータを使った方が良いだろうと思い、
何でも自作でがんばるより、世の中にオープンになっているものを使った方が良いこともありますね。
外気温と湿度をOpenWweatherMapのAPIで取得して、部屋の状態を判定(暑い、寒い、心地よい)
- weathermapのAPIで、外の温度・湿度を取得する。
- 取得した温度・湿度から、不快指数を計算する
- 計算した不快指数から、外の状態を判定する
- 外の状態をスピーカに喋らせる
ラズパイと温湿度センサとスピーカがあれば、準備OK
準備するものは、
- ラズパイ
- 温湿度センサ(DHT11)
- ラズパイとセンサをつなぐケーブル類
- Bluetoothスピーカー
となります。
|
ラズパイとBluetoothスピーカーを接続する方法については、本ブログで紹介した記事を参考にしてください。↓
それでは実際の作業について説明します。
OpenWeatherMapのAPIで外の温度・湿度を取得する
OpenWeatherMapとは?
海外の天気サイトである、OpenWeatherMapというサイトの情報を使って、日本の天気を取得します。
この、OpenWeatherMapというサイトでは、自前で測定しているわけではなく、公共の温湿度測定データや、観測所の測定データを収集していて、独自の天気予報を作成したり、レーザーマップを提供したりしています。
海外のサイトだから、精度はいいかげんなんじゃないの?
という不安があると思います。しかし、そこはご心配なく。
蓄積された膨大なビッグデータを基に解析しているので、
精度面も安心です。
同じ都市の測定データでも、中には、あれ?っていうデータもあります。そういう時は、そのような信頼性が低いデータは使わなければ良いだけなので、大丈夫です。OpenWeatherMapの公式HPは↓です。
※公式HP(外部サイトへリンク)
OpenWeatherMapのAPIを使う準備
まずは無料登録(https://openweathermap.org/appid)しましょう。
そして、無料APIをゲットしましょう。このあたりの手続きは画面に従って入力すれば良いので簡単です。
無料APIをゲットすると、自分のページに以下のようにAPIキーが割り当てられます。外気温度、湿度を所得するときに、このAPIキーが必要になるので、
APIの使い方は、公式HPの説明サイト(https://openweathermap.org/current)にも書いてありますが、
非常に簡単なので、特に読む必要はないです。では、実際にAPIを使って、温湿度を取得する方法を説明します。
cript type="text/javascript" src="https://xml.affiliate.rakuten.co.jp/widget/js/rakuten_widget.js">
WEB APIで温湿度を取得する
まずは、APIキーを定義します。
温度と湿度を都市名をもとに取得しますので、以下の通りにします。温度はケルビンで取得したデータを℃に変換します。
response = requests.get(url)
date = json.loads(response.text)
k2c = lambda k: k – 273.15
temp = k2c(data[“main”][“temp”]
hum = data[“main”][“humidity”]
これで、温湿度が取得できました。非常に簡単なんです。
温度は、”temp”、湿度は、”hum”、として定義されています。つぎは、
これは、部屋の温湿度から、不快指数を計算した方法と同じなので、説明は割愛します。これで、外気温湿度をweb APIにて取得して、不快指数の計算が終了しました。
計算した不快指数に基づき、外の状態を判定して、状態を喋らせる
次は、不快指数から、外の状態を判定します。これも部屋の状態を判定した方法と同じなので、説明は割愛します。
しかも、日本人の中でも人によって感じる暑さ・寒さは異なります。ですので、不快指数は参考として使った後に、実際に自分が感じる感覚に合わせるように、判断基準の数値を変えると良いです。
さらに、夏と冬では感じ方も違うので、夏と冬でも基準を変えると、一番、自分の感覚と近くなります。夏と冬で着ている服も違うので、まったく同じ基準で判断するのは結構難しいです。
最後に、スピーカーに喋らせるコマンドですが、これもすでに説明した内容ですね。以上で外の状態をスピーカーが喋るようになります。たとえば、
只今の外の状態は、非常に寒い状態です。
と喋ります。さらに、乾燥状態の判断基準も加えて、湿度が40%以下の場合には、乾燥している注意を出す場合には、
外が非常に乾燥しています。ご注意ください。
としても良いです。
以上で第三部が終了です。次は最後に、部屋の状態と外の状態をLEDで表現します。
今日の内容のソースコードです。
#coding: utf-8
import subprocess
import RPi.GPIO as GPIO
#import dht11
import time
import datetime
from datetime import datetime
import requests
import json
import sys
#fukai80 = "暑くて汗が出る状態です。クーラーを付けた方が良いです。"
#fukai70 = "やや暑い状態です。"
#fukai65 = "快い状態です。"
#fukai55 = "肌寒い状態です。"
#fukai50 = "寒い状態です。"
talk = "sh /home/pi/Documents/talking.sh "
API_KEY = "****"
api = "http://api.openweathermap.org/data/2.5/weather?q={city}&APPID={key}"
city_name = "Yokohama-shi"
url = api.format(city = city_name, key = API_KEY)
response = requests.get(url)
data = json.loads(response.text)
k2c = lambda k: k - 273.15
temp = k2c(data["main"]["temp"])
hum = data["main"]["humidity"]
round_temp = round(temp,1)
fukai = 0.81 * temp + 0.01 * hum * (0.99 * temp -14.3) + 46.3
round_fukai = round(fukai)
time.sleep(2)
say_temp = "只今の外の気温は、"+ str(round_temp)+ "度"
say_hum = "湿度" + str(hum)+ "パーセント"
say_fukai = "不快指数は、" + str(round_fukai)+ "です。"
print(say_temp)
print(say_hum)
print(say_fukai)
if round_fukai > 80:
subprocess.call(talk + fukai80 ,shell=True)
elif round_fukai > 76:
subprocess.call(talk + fukai70 ,shell=True)
elif round_fukai > 61:
subprocess.call(talk + fukai65 ,shell=True)
elif round_fukai > 49:
subprocess.call(talk + fukai55 ,shell=True)
else:
subprocess.call(talk + fukai50 ,shell=True)
ソースコードは、第一部で紹介しています。
本ブログの過去記事↓
コメント