ラズパイでお天気情報


ラズパイでお天気情報を取得してみます。

予報に関してはLiveDoor Weather Haks

データに関してはOpenWeatherMap

を使ってみます。

この手の情報は一次ソースとしてとっても大事。

予報については「明日晴れるの?雨降る?…..」程度が分かればいいので、LiveDoorで十分。

データについては「気温や湿度、気圧…」などの細かいとこが知りたいのでOpenWeatherMapを使います。

データはDBに保存して、後で解析に使います。

気象病ってのが世の中にはあるそうです。

日記に体調などを(できれば時刻と一緒に)都度記述しておけば、気候の傾向と体調の関係を把握できるかもしれません(^^)。

また、J.リーグの公式記録(天候別勝敗表)によれば…..

雨模様の試合でガンバ大阪の2005~2018の記録は、80試合、27勝27分26敗。きれいに分散してます。

負けない率は、67.5%です。まぁ、勝てない率も同じくらいなんですけど……。

一番勝率がいいのは「雨のち曇」の場合で7勝2分2敗。

まぁ、ゲームの結果を予測しようなんて考えると、パラメータの数がアホほど多くなるのを覚悟せねば…..。きっとシャビの頭の中にはゲームを分析・予測する変数が常人の何十倍もあったんじゃない?!

 

 


LiveDoor Weather Haks

商用利用は不可というだけで、回数制限などは特に無いようです。

地域IDは全国の地点定義表から取得

Python3

以下は大阪の場合

 

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import urllib.request,urllib.error
import json

def get_weather():
    city = "270000" #<-地域ID
    json_url = "http://weather.livedoor.com/forecast/webservice/json/v1"
    
    try:
        r = urllib.request.urlopen('%s?city=%s' % (json_url, city) )
        
        b = r.read()
        sb = b.decode()
        obj = json.loads(sb)
        
        title = obj['title']
        print(title)
        
        forecasts = obj['forecasts']
        
        # 今日
        cast = forecasts[0]
        today_weather = cast['dateLabel'] + "の天気は" + cast['telop']
        print(today_weather)
        
        # 明日
        cast = forecasts[1]
        tommorow_weather = cast['dateLabel'] + "の天気は" + cast['telop']
        print(tommorow_weather)
    
    finally:
        r.close()

if __name__ == '__main__':
    get_weather()

 

 

 


OpenWeatherMap

無料版と有料版があります(使うのは当然無料版)

無料版では1分間に60リクエストまでと制限がありますが、そんなに頻繁に使う理由がないです。

無料版ではデータの種類も制限されます…..がこのくらいから始めてみます(相関に問題があれば別のパラメーターを探してみませう)。

気温・気圧・湿度・風速・風向・最高気温・最低気温・雲量など。

 

都市名と緯度・経度でデータ取得できます。緯度・経度は直近の観測場所のデータが採用されます。

どういう都市名が使えるかは都市ID(JSON)で調べられます。

APIキーを取得しておく必要があります。

 

都市名の場合:?q=都市名,jp  <-日本

緯度・経度の場合:?lat=34.802948&lon=135.537488

 

Python3で取得
以下は大阪市の場合

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import urllib.request,urllib.error
import json

def get_weather():
    city = "Osaka-shi"

    json_url = "http://api.openweathermap.org/data/2.5/find?q=" + city + ",jp&units=metric&APPID=<APIキー>"

    try:
        r = urllib.request.urlopen(json_url)
        
        b = r.read()
        sb = b.decode()
        obj = json.loads(sb)
        
        lists = obj['list']
        
        #今日
        cast = lists[0]
        tempreture = cast['main']['temp']
        print("気温:" + str(tempreture) + "度")
        pressure = cast['main']['pressure']
        print("気圧:" + str(pressure) + "hpa")
        humidity = cast['main']['humidity']
        print("湿度:" + str(humidity) + "%")
        temp_min = cast['main'].get('temp_min',None)
        print("最低気温:" + str(temp_min) + "度")
        temp_min = cast['max'].get('temp_max',None)
        print("最高気温:" + str(temp_max) + "度")
        wind_speed = cast['wind']['speed']
        print("風速:" + str(wind_speed) + "m")
        wind_degree = cast['wind'].get("deg",None)
        print("風向:" + str(wind_degree) + "度")
        cloud = cast['clouds']['all']
        print("雲量:" + str(cloud) + "")
        description = cast['weather'][0]['description']
        print("空模様:" + description + "")
    
    finally:
        r.close()

if __name__ == '__main__':
    get_weather()

OpenWeatherMapではdescriptionは英語表現なのでいまいち分かりづらい。

対照表:空模様

風向も0~360で表記されるのでピンときません。

風向き範囲

DBから検索する際、変換しとくとわかりやすいです。

 

 

データはローカルにDB(例:SQLite)に保存しておきます。

最低2年分くらいは欲しいです。

cronに設定しておきます(60分間隔で保存)

適当にPythonコード(set.py)を作っておいて

$crontab -e

*/60 * * * * /home/pi/weather_report/set.py

WisteriaHillではこんな具合にデータ保存中。

2番目のカラムには保存時のタイムスタンプを設定。

 

 


お天気データと日記の記述の関連を解析

日記と言っても音声認識を使ったメモのようなもので十分。

Google Keep(Android)に保存してみます。

こんな感じで保存されます。

 

PythonでKeepからデータを検索する場合はこちら

 


 

Be the first to comment

Leave a Reply

Your email address will not be published.


*