早々に猛暑日が出てしまった2022の日本です、つらいですね.
※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.
レビュー時のiOSバージョン : iOS15.5
スポンサーリンク
暑さ指数とは
「暑さ」の指標は普通の気温以外にも体感温度や不快指数などがあり、それとはまた別に「暑さ指数」というものがあります.
熱中症を予防することを目的として作られた指標で、気温以外に湿度と周辺の熱環境を考慮した値となっています.
屋外か屋内かで定義が異なり、環境省などが発表しているものは前者になります.
単純に気温や湿度を見て判断するのも悪くないですが、目的次第ではこちらのほうが有益な情報となりえます.
サイトを見てわかる通り、暑さ指数や警戒アラートをメール配信するサービスもあるので単に暑さ指数を知りたいだけならそれらを使えば十分です.
しかしそれで完結しない処理をしたい場合は(目的次第ですが)ショートカットの出番です.
データを引っ張ってくるとどうなるか
今回は特定の観測地の最新の情報を引っ張ってくることにします.
せっかくなので値ごとの指標も表示するようにしてみましょう.
上のリンクから希望の地点を選ぶ最新の暑さ指数に加え今日および3日間の予測が表示されます.
ページ上にあるタブの「過去データ」に切り替え、もっとも新しい月を使います(記事執筆時点であれば「実況推定値(速報版)」の2022年6月).
ただし選択してしまうとCSVのダウンロードが始まってしまうので長押ししてURLを取得します.
因みに地元でもっとも近い観測地点である愛知県愛西市の場合URLは
https://www.wbgt.env.go.jp/mntr/2022/wbgt_2022/wbgt_51031_202206.csv
となります.
"2022"は西暦、"51031"は観測所番号、"202206"は選択した年月であることは容易に推定できます.
因みに観測点によってURLの構成が異なります、愛知県愛西市の場合は上記の通りですが、例えば東京都東京だと同じ2022年6月でも
https://www.wbgt.env.go.jp/mntr/dl/Tokyo_202206.csv
となっており、データも実況推定値(速報版)でなく「実測値」となっています.
これはそもそもの暑さ指数に必要な指標が観測地によっては環境省が測定していたり気象庁が観測していたりと異なるのが一因であると思われます.
更に「確定版」となった年のデータURLもまたパラメータの構文が異なります.
単に観測地番号と月日の数字だけ差し替えればよい…というわけではないため月や年をまたぐ処理がとても面倒なことになっています.
その辺の煩わしさは置いといて、上のように「Webの内容を取得」で実際にCSVの中身を確認したものが上の画像です.
","区切りで「日付」「時刻(1時間)」に応じて「暑さ指数」「黒球温度」の2項目が記録されています.
因みに日付の変わる時刻は前日の24時扱いとなり、CSV自体はその日の24時までのセルが用意されているようです.
そこまでではないですが面倒なことをしますね…
このデータから最新の情報を得るには、空のデータ行を取り除く必要があるわけです.
なお、時刻のデータが更新されるのはその時刻から20~30分程タイムラグがあるようです.
例えば10:00のデータは10:20~10:30頃に更新されます.
なので極端な話、その日の0:00~0:20くらいの時間帯は「その日だけのデータ」だけ引っ張ってくると空っぽということでもあります.
その場合前日の24:00のデータが欲しいわけですが、前日が先月だったり、そもそも先月が観測していなかったり(暑さ指数は毎月記録しているわけではないです)、速報版と確定版でURLが異なっていたり…と非常に面倒なので、今回はそういった例外処理は行いません.
レシピ
というわけでレシピを組んでみます.
希望の観測地に合わせてURLを指定し、「Webの内容を取得」で本文を取り出します.
画像のように、年数や月日などの情報は「現在の日付」のフォーマットを弄ることで、月が変わってもいちいち打ち直す手間なく使うことができます.
「値ごとの指標」も表示することにしたので、そのテンプレを「辞書」アクションに書いておきます.
キーは具体的に入力して使うことはしないので適当でいいです.
値は「辞書」にしましょう.
辞書の中身は以下のようにします.
- キー"a"(数字):暑さ指数の最小値、「~未満」の場合は適当に0にしただけです
- キー"b"(数字):暑さ指数の最大値、「~以上」の場合は適当に100などに
- キー"txt"(テキスト):暑さ指数の範囲における目安・指針.
環境省熱中症予防情報サイト 暑さ指数とは?にある「生活活動に関する指針」および「運動に関する指針」の内容を、タイトルや本文を"-"で繋げて一文にしたもの. 表示する際に"-"で分割して戻す.
続いて最新の一行を取得…なんですが、上で見た通り取得したデータはその月まるごとの上1時間間隔のものです.
つまり600行ちょっとのデータを常に取得します.
普通の高級言語なら全然大したことのない量ですが、何かとモタつくショートカットでは少しでも処理を減らす工夫をしないと実行時に萎えます.
というわけで「テキストの一致」とフォーマット、正規表現を使い、
.*現在の日付.*
にマッチする行だけをまず取り出します.
ここで"現在の日付"はフォーマットでその日の日付(記事執筆時に合わせると2022/6)にしています.
ただし、ここでまた厄介なのは今回のデータは例えば6月の場合上の通りで2022/06でなく2022/6と、先頭の0を使わないフォーマットとなっているため、
yyyy/M
とする必要があります.
更に空データ行を意味する、「",,"を含む行」を取り除くために「テキストを置き換え」で
.*,,.*
にマッチする対象を空に置き換えます.
更に更にこのままだと上で置き換えた結果は二重改行として残ったままです、そのためやはり「テキストを置き換え」で
\n\n
にマッチする対象を空に置きまえます.
こうして得た結果の末行が、最新のデータとなっているはずです.
というわけで上の結果をまず「テキストを分割」で改行で分割し、「リストから項目を取得」で最後の項目を取得します.
その結果を「テキストを分割」で区切り文字","で分割し、必要な情報、今回は1,2,3項目目に当たる年月日、時刻、そして暑さ指数を取り出します.
これでその日の最新の時刻とその暑さ指数は取得できました.
次に最初の方で用意した、暑さ指数に応じた指標などの情報を一つ選ぶ処理をします.
というわけで、用意した辞書のキーに対して「各項目を繰り返す」を行います.
辞書の値を取り出すわけですが、例えばキー1の値であるキーaの値0を取り出すには、「辞書の値を取得」で
1.a
をキーに指定することで可能となります.
いちいち辞書の値を取得してその値を辞書としてaの値を取得…ということは不要というわけですね.
逆に言うとキーに"."が含まれている場合「辞書の値を取得」は正しく処理してくれません.
ともかく、この方法で最小値と最大値を取り出し、if文で先に取り出した暑さ指数がこの範囲に含まれているかどうかを判定します.
真であれば同じキーにあるtxtの値を取り出し、これを目安・指針として採用します.
最後に「テキスト」アクションで日時や時刻、目安・指標の情報の体裁を整え、テンプレ時に決めた区切り文字"-"で分割してから表示します.
実行
レシピに問題なければ画像のように表示されます.
〆
今回は過去の情報でしたが、同じページの「グラフ」タブのURLを使えば予測の方の情報を取得できます(予測の方は3時間おき).
ただしYahoo!天気と異なり、時間が経過して過去となった時刻の情報がなくなってしまいます.
警告アラートは難しいですが、定時メールは可能ですしショートカットならではの応用も効きます.