ラズパイ(ラズベリーパイ)で外気温をAPI取得して、外の状態(暑い・寒いなど)を喋らせる

アイキャッチ画像ラズパイ

ラズパイでなんちゃってスマートホームを構築するにあたり、初心者の私がwebや書籍を調べてやったことを備忘録のようにつづっています。

ラズパイと温湿度センサを使ってLEDで表現するために、、、

前回に引き続き、ラズパイで検出した温湿度をBluetoothスピーカーに喋らせる。そして、不快指数を計算し、部屋の状態をLEDで表現します。

さらに、外気の温湿度をBluetoothスピーカーに喋らせる。そして、不快指数を計算し、外の状態をLEDで表現します。今回は、”不快指数に応じて部屋の状態を判断し、部屋の状態をスピーカーから喋らせる”について説明します。

 

 

 

簡単に構築できるスマートホーム。全体の流れ

流れは以下のような感じです。難しいことは何もやっていません。初心者の私でもできるようなことしかやっていませんので、初心者の方も安心してチャレンジしてください。中身が非常に長くなるので、四部作で紹介します。

今回は第三部です。

 

実際に外の温度を計測するのは断念。。。

実は、最初の構想では、温度・湿度センサをエアコンのダクトから外に出して、実際の外の温度・湿度を計測しようと考えていました。ただし、実際にやろうとすると、真夏であれば、日射の影響による温度上昇があるなど、正確に計測できないことが分かり、断念しました。

正確に計測するにはどうするのが良いのかなあ、と考えましたが、結局百葉箱のようなものを作るしかなく、それは素人には手を出せないと思い、そもそも今の時代は、正確に測定したものをオープンにしているサイトもあり、そのデータを使った方が良いだろう、ということでオープンソースの温度データを使うことにしました。

何でも自作でがんばるより、世の中にオープンになっているものを使った方が良いこともありますね。

温度計

 

外気温と湿度をOpenWweatherMapのAPIで取得して、部屋の状態を判定(暑い、寒い、心地よい)

  1. weathermapのAPIで、外の温度・湿度を取得する。
  2. 取得した温度・湿度から、不快指数を計算する
  3. 計算した不快指数から、外の状態を判定する
  4. 外の状態をスピーカに喋らせる

 

ラズパイと温湿度センサとスピーカがあれば、準備OK

準備するものは、

  • ラズパイ
  • 温湿度センサ(DHT11)
  • ラズパイとセンサをつなぐケーブル類
  • Bluetoothスピーカー

となります。

今回使った温湿度センサはこれです。接続も簡単なのでおすすめです。

 

by カエレバ

 

ラズパイとBluetoothスピーカーを接続する方法については、本ブログで紹介した記事を参考にしてください。↓

【ラズパイ】Google Homeの連携。エラーで音が出なくなったときの対処方法。
ラズパイ(ラズベリーパイ)とGoogle Homeの連携。時報としてGoogle Homeに喋らせる方法を紹介します。時々、Google Homeが喋らなくなるトラブルへの対処方法を初心者の方にも分かるように紹介します!

それでは実際の作業について説明します。

 

OpenWeatherMapのAPIで外の温度・湿度を取得する

OpenWeatherMapとは?

海外の天気サイトである、OpenWeatherMapというサイトの情報を使って、日本の天気を取得します。
この、OpenWeatherMapというサイトでは、自前で測定しているわけではなく、公共の温湿度測定データや、観測所の測定データを収集していて、独自の天気予報を作成したり、レーザーマップを提供したりしています。

海外のサイトだから、精度はいいかげんなんじゃないの?

という不安があると思います。しかし、そこはご心配なく。

蓄積された膨大なビッグデータを基に解析しているので、

精度面も安心です。

同じ都市の測定データでも、中には、あれ?っていうデータもあります。そういう時は、そのような信頼性が低いデータは使わなければ良いだけなので、大丈夫です。OpenWeatherMapの公式HPは↓です。英語版ですが、Google翻訳を使えば大丈夫です。

※公式HP(外部サイトへリンク)

Weather API - OpenWeatherMap
Simple and fast and free weather API from OpenWeatherMap you have access to current weather data, hourly, 5- and 16-day forecasts. Historical weather data for 4...

OpenWeatherMapのAPIを使う準備

まずは無料登録(https://openweathermap.org/appid)しましょう。

openweathermapの登録画面

そして、無料APIをゲットしましょう。このあたりの手続きは画面に従って入力すれば良いので簡単です。

無料APIをゲットすると、自分のページに以下のようにAPIキーが割り当てられます。外気温度、湿度を所得するときに、このAPIキーが必要になるので、メモ帳などにコピペしておきましょう。

APIキーの画面

APIの使い方は、公式HPの説明サイト(https://openweathermap.org/current)にも書いてありますが、
非常に簡単なので、特に読む必要はないです。では、実際にAPIを使って、温湿度を取得する方法を説明します。

 

 

WEB APIで温湿度を取得する

まずは、APIキーを定義します。

API_KEY = “****”
“****”については、さきほど取得したAPIキーをコピペしてください。”API_KEY”という名前は好きな名前を付けても大丈夫です。つぎに、APIを取得するためのページを定義します。これも簡単です。
api = “http://api.openweathermap.org/data/2.5/weather?q={city}&APPID={key}”
このページに行きなさい、と解釈すれば良いと思います。つぎは、都市名を定義します。例えば、横浜市のデータを取得したいのであれば、
api = “http://api.openweathermap.org/data/2.5/weather?q={city}&APPID={key}”
とします。そして、APIとして吐き出されるデータをどのように処理するかを定義します。温度と湿度を都市名をもとに取得しますので、以下の通りにします。温度はケルビンで取得したデータを℃に変換します。
api = “http://api.openweathermap.org/data/2.5/weather?q={city}&APPID={key}”
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)

ソースコードは、第一部で紹介しています。
本ブログの過去記事↓

ラズパイ(ラズベリーパイ)を使って、温度・湿度、不快指数をテキスト化する
ラズパイでなんちゃってスマートホームを構築するにあたり、初心者の私がwebや書籍を調べてやったことを備忘録のようにつづっています。温湿度センサを使って測定今回のネタは、ラズパイで検出した温湿度をBluetoothスピーカーに喋らせる。そ...

コメント