0

CLIで天気を確認する

天気が表示されるだけのコマンド
shokai/weather-yahoo-jp-cli: CLI tool for weather-yahoo-jp npm


npmjs.comに公開するほどでもないのでgithubからインストールする方式でいいや

% npm i shokai/weather-yahoo-jp-cli -g
% weather-yahoo-jp 東京


コマンド名が長いけど、shellのhistoryから補完するし東京神奈川以外を見ることもないから長くてかまわん

0

Node.jsでYahooから天気予報とリアルタイム降雨データを取得する

Node.jsでYahooから天気を取得するnpmを作った。

https://www.npmjs.com/package/weather-yahoo-jp

YOLP(Yahoo Open Local Platform)のリアルタイム降雨情報のAPIと、Yahoo天気の予報の取得ができる。

Nodeに日本の天気関係のnpmが無かったのと、今まで使っていたRubyのお天気系Rubygemが全て動かなくなっていたので自作した。
天気をスクレイピングして取ってくる部分がHTMLの変更により動かなくなってしまう事が多いみたいなので、CircleCIで毎日テストを走らせる事により異常にすぐ気づけるようにしてある。


現時点でv0.2.0
forecastの方はまだ多少項目追加する予定なので(気温の前日との差や降水確率など)最新情報はREADMEを見ると良い
エラーや要望はissuetwitterにどうぞ

インストール


% npm install weather-yahoo-jp


天気予報の取得

地名、もしくは天気ページのURLでgetすると天気が得られる。
import {forecast} from "weather-yahoo-jp";

forecast
.get("横浜")
.then((forecast) => {
console.log(forecast); // 取得した天気
})
.catch((err) => {
console.error(err.stack || err);
});


{
where: '神奈川県 東部(横浜)',
today: { text: '曇後雨', temperature: { high: 9, low: 4 } },
tomorrow: { text: '晴れ', temperature: { high: 8, low: 3 } },
url: 'http://weather.yahoo.co.jp/weather/jp/14/4610.html'
}

これを使ってhubot scriptも作ってみた


forecast.getはわりと適当に地名を入れても天気を返してくれる。事前に地名と天気のURLのリストを作ってforecast-url.jsonに保存してあって、この中から適当にそれっぽい地点の天気を返す。

このリストの作成にcoを使ったらdelayをいれながらゆっくりリンクをたどる処理を普通のfor文で書けたのでcoすごいと思った。
JavaSciptでディレイを入れながらゆっくり1つずつクロールするのってqueueを使うか、async.jsとかで変な書き方しないと駄目だと思ってたんだけどRubyみたいな普通な感じに書けるのでcoすごい。


@neoyokohama の天気予報にも使ってる



YOLP APIで現在の降雨状況を取得する

Yahoo Open Local PlatformのAPIに緯度経度を渡すと今そこにどれだけ雨が降ってるか取得できる。
数分後の予報も付いてくる。単位はmm/hらしい。

YOLP(地図):気象情報API – Yahoo!デベロッパーネットワーク


先にアプリケーションIDを取得する必要がある
https://e.developer.yahoo.co.jp/register

coordinatesに10個まで地名と緯度経度のペアを設定してgetWeatherすると、地名がkeyでvalueが降雨データのオブジェクトが取得できる。

試しにobservation(観測値)とforecast配列(予測値)を単純に比較して人間語で出力してみる
import {Yolp} from "weather-yahoo-jp";
var yolp = new Yolp("取得したAPPID");

var query = {
coordinates: {
東京: "139.7667157,35.6810851",
京都: "135.7605917,35.0075224",
沖縄: "128.0150716,26.5918277",
新潟: "139.0618657,37.9123509"
}
};

yolp.getWeather(query)
.then(function(data){
for(var where in data){
var w = data[where];
if(w.observation.rain > 0){
if(w.forecast[0].rain > 0){
console.log(where + "は雨が" + w.observation.rain + "降っています");
}
else{
console.log(where + "でもうすぐ雨が止みます");
}
}
else{
if(w.forecast[0].rain === 0){
console.log(where + "は雨が降っていません");
}
else{
console.log(where + "でもうすぐ雨が" + w.forecast[0].rain + "降ります");
}
}
}
})
.catch(function(err){
console.error(err.stack || err);
});

こうなる
東京でもうすぐ雨が止みます
京都でもうすぐ雨が0.25降ります
沖縄は雨が1.65降っています
新潟は雨が降っていません

YOLP APIのレスポンスはXML形式がプライマリみたいなので、JSON形式で取得するとマークアップがJSONなだけで構造がXMLっぽい超入り組んだ変なフォーマットで返ってくる。さらに複数地点の降雨データが配列で返ってきてどれがどこなのかわからない。
このままだと厳しいのでJavaScriptから使いやすいようにgetWeather関数内で直してある。
もし元データをそのまま取得したい場合はyolp.get(query)を呼べば加工前のフォーマットで取得できる。


これを使って定期的に降雨データを取得してnode-lindaにtupleで流し、それを色々な所に通知すると、hubot-lindaが反応してslackに通知が来たり、うちのMacminiが「雨が降ります」とか喋り出したり、Hueが青や赤に点滅したりする。

雨止みますという通知を俺が受信してタイミングよく買い物に行ったりできる。



0

今日の天気をHueで表示する

weather_jpで降水確率を取得して、30%以上だったら青に、そうでなければ赤く光らせる。
これがあると朝ぱっと天気が目に入るので、傘を忘れることがなくなる。

github.com/shokai/weather-hue
関連:プログラマブル電球hueをRubyから使う

実装

bundle exec ruby weather-hue.rb --city 鎌倉
で実行できる。crontabなどに登録して定期的に動かすとよい。

weather-hue.rb
require 'rubygems'
require 'bundler'
Bundler.require

args = ArgsParser.parse ARGV do
arg :city, 'city', :alias => :c, :default => '東京'
arg :rain, '降水確率のしきい値 (%)', :default => 30
arg :help, 'show help', :alias => :h
arg :hue, 'hue light number', :default => 0

on :help do
STDERR.puts help
STDERR.puts "e.g. ruby #{$0} -city 鎌倉"
exit 1
end
end

weather = WeatherJp.get args[:city], :today
puts "#{weather} - #{Time.now}"

light = Hue::Client.new.lights[ args[:hue].to_i ]
puts "light : #{light.name}"
light.on = true
light.saturation = 180
light.brightness = 200

if weather.rain < args[:rain]
light.hue = 60000 # red
else
light.hue = 47000 # blue
end

0

CUIから天気や気温が確認できて便利

@zakuniのweather-report gemに入ってたコマンドを修正して、pull requestしたら一瞬でマージされてリリースされた。


CUIから天気や気温が確認できる
Webブラウザ開いたりする必要がないので最速


こんな感じで使える

require 'weather-report'

yokohama = WeatherReport.get("横浜")
puts yokohama.today.telop # => "晴のち曇"
puts yokohama.today.temperature_max # => "37"
puts yokohama.tomorrow.telop # => "晴時々曇"
暑すぎ

0

RubyとArduinoとTwitterで天気予報を見る

こういうのを数年おきに、その時の近代的な実装で作りなおしてみるとプログラミング環境の進歩がわかる。


1. 今日傘が必要かどうか表示してくれるてるてる坊主

晴れの時


雨が降る可能性がある時

ウチでは15分おきにその日の天気予報を取得して表示している。うちテレビ無いけどこれのお陰で傘を忘れたりしなくなった。


プログラムはものすごい単純になっている。Rubyのみ。
Macで開発してRaspberry Piにデプロイした。Ruby動くUNIX系ならどこでも動くはず。
require 'rubygems'
require 'arduino_firmata'
require 'weather_jp'

arduino = ArduinoFirmata.connect
weather = WeatherJp.get '東京'
if weather.today.rain > 30 # 降水確率30%以上
arduino.digital_write 13, true ## 青色LED
else
arduino.digital_write 12, true ## 赤色LED
end
taiki45さんのweather_jpと俺のarduino_firmataを合わせると超綺麗に書ける。
MSN天気からデータを取ってきている。
6年ぐらい前に作ったときはPerlのCGI+XPortだったり、4年ぐらい前はRubyからArduinoにシリアル通信したりでもっと行数多かった。


ちなみにzakuniさん作のweather-reportはlivedoor weatherからデータを取ってきていて、降水量情報がない代わりに雨/雪/雹の可能性を示すumbrella?メソッドが在る。
require 'rubygems'
require 'arduino_firmata'
require 'weather-report'

arduino = ArduinoFirmata.connect
weather = WeatherReport.get '横浜'
if weather.today.umbrella? ## 傘が必要な時
arduino.digital_write 13, true ## 青色LED
else
arduino.digital_write 12, true ## 赤色LED
end


地名や降水確率のしきい値を実行時引数に渡せる仕様にして、githubに置いておいた。
ProcfileもあるのでMacやRaspberry Pi等にサービスとしてインストールできる。
shokai/teruteru · GitHub


回路は、昔秋月で買ったRGBフルカラーLEDを使った。
アノード3本/カソード1本のスタンダードな奴。

arduinoのどのピンにRGBが接続されているかはプログラム中に書いてある

こういうシールドにして、その上にティッシュかぶせて顔を書けば完成です。



2. 今日雨が降りそうだったら教えてくれるtwitter bot


雨が振りそうな日の朝に、こういうのが来る

Twを使うとtwitter botが簡単に作れる。
天気botこれだけで書ける。
require 'rubygems'
require 'tw'
require 'weather_jp'

tw = Tw::Client.new
tw.auth 'shokai_log' ## botアカウントで認証
weather = WeatherJp.get '東京'
if weather.today.rain > 30 # 降水確率30%以上
tw.tweet "@shokai #{weather.today}" ## @shokaiにmention送る
else
puts weather.today ## 予報の文章をterminalに表示するだけ
end

降らない時にも「今日の天気は晴れ」とか送ってるとだんだん見なくなるので、雨降る日だけtweetするようにした。

これも多少使いやすくしてgithubにコード置いておいた。
shokai/twitter-weather-alert · GitHub
cronで朝実行するようにしている。