0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

警報以上(地域)・特別警報(全国)の発表を取得し、 TC001 で表示させる

Posted at

基本的には JSON 内の注警報コードをかき集めれば実現できます

新年1本目は 気象庁サイトの注警報情報を取得し、 Ulanzi TC001 で表示させる の続編である。
自分の住んでいる市区町村の注警報情報に加え、都道府県レベルの警報・特別警報、全国の特別警報の発表情報を知りたい場合、それぞれ JSON を取得して判定させることができる。

フロー図は両方とも同じ形で、前回の注警報情報取得からアプリ部分を取り除いたものとなる。
jmawarn_notify1.png

違いは http request (地域コード.json / map.json)、状態保存の変数名、 後ろのparser(警報・特別警報で通知 / 特別警報のみ通知)、そして parser A の部分。
両者の parser A を下に記す。

parser A(長野県)
var warn_array = msg.payload;
var warns = warn_array.areaTypes[0];
var area_num = Object.keys(warns.areas).length;
var code = [];
var status = [];
var warn = [];

for (var j = 0; j < area_num; j++) {
    var warn_area = warns.areas[j].warnings;
    if (Object.keys(warn_area[0]).length > 1) {
        for (var i = 0; i < warn_area.length; i++) {
            if (warn_area[i].status !== "解除") {
                code.push(warn_area[i].code);
            }
        }
    }
}

if (code.find(value => value.match(/^3/))) {
    warn = "1";
} else if (code.find(value => value.match(/^0/))) {
    warn = "2";
} else if (code.find(value => value.match(/^1/))) {
    warn = "3";
} else if (code.find(value => value.match(/^2/))) {
    warn = "3";
} else {
    warn = "0";
}

msg.payload = warn;
return msg;
parser A(全国)
var warn_array = msg.payload;
var region_num = Object.keys(warn_array).length;
var code = [];
var status = [];
var warn = [];

for (var k = 0; k < region_num; k++) {
    var area_num = warn_array[k].areaTypes[0].areas.length;
    for (var j = 0; j < area_num; j++) {
        var warn_area = warn_array[k].areaTypes[0].areas[j].warnings;
        if (Object.keys(warn_area[0]).length > 1) {
            for (var i = 0; i < warn_area.length; i++) {
                if (warn_area[i].status !== "解除") {
                    code.push(warn_area[i].code);
                }
            }
        }
    }    
}

if (code.find(value => value.match(/^3/))) {
    warn = "1";
} else if (code.find(value => value.match(/^0/))) {
    warn = "2";
} else if (code.find(value => value.match(/^1/))) {
    warn = "3";
} else if (code.find(value => value.match(/^2/))) {
    warn = "3";
} else {
    warn = "0";
}

msg.payload = warn;
return msg;

基本的には地方(全国版のみ)・一次細分地域・注警報でぐるぐる回して code をかき集めるだけである。
全国版は一次細分地域全て(142地域)を集めるので注警報コードが数百個になるが、判定方法は特に変わらない(とはいえ実際に特別警報が発表された時に機能するかはまだ試せていないが)。

動作イメージはこのようになる。
頭にアイコンを表示できるので、発表対象の識別が可能な点も TC001 を使う利点となる。
jmawarn_notify2.png
jmawarn_notify3.png

それぞれ実行の度に JSON ファイルを読みに行くため、実行頻度(実用を考えると1分間隔程度で実行させたいが、地域版・全国版はもう少し頻度を減らす)と3本全部走らせるか(全国版は特別警報が出そうなタイミングのみ走らせる)を考慮したい。

毎年のように気象災害で犠牲者が出てしまっているが、今年は災害の少ない、犠牲のない年であることを願いたい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?