はじめに
前回の記事で、地震を感知したら教えてくれるアプリを作った話を書きました。
・震度1以上で表示
・震度5弱以上や緊急地震速報のときは地図付きで強調表示
という内容です。
公開してからも普通に動かし続けていたのですが、しばらく使っているうちにどうにも引っかかる挙動に気づきました。
「緊急地震速報を検知しました」という通知が、体感で1〜2分に1回のペースで届き続けるのです。
気象庁が本当にそんな頻度で緊急地震速報を出すはずがありません。
実際に何が起きていたのかを調べたら、根本的な勘違いをしていたことがわかりました。
今回はそのお話をします。
何が起きていたか
アプリはP2P地震情報というAPIのWebSocketを使っていて、「code」という数値でメッセージの種類を判別しています。
私はcode 554とcode 555を「緊急地震速報の発表検知」と「緊急地震速報の警報」として扱っていました。
前回の記事でも、555のareasフィールドが実は市町村別震度ではなくP2Pネットワークの中継ピア数だった、という話を書いています。
この時点で「実データの形が想定と違った」というだけの話だと思っていました。
ところが、555から得られる情報は震源も震度も
ほぼ空
でした。
市町村別のデータだけがおかしいのではなく、地震の内容そのものが最初から入っていなかったのです。
しかも1〜8分おきに届きます。本物の緊急地震速報がそんな頻度で発表されるはずがない、と考え直したのがきっかけでした。
公式仕様を読みに行った
P2P地震情報のEPSP仕様書を改めて読みに行くと、codeの一覧がありました。
| code | 名称 | 内容 |
|---|---|---|
| 551 | JMAQuake | 地震情報 |
| 552 | JMATsunami | 津波予報 |
| 554 | EEWDetection | 緊急地震速報の発表検出(チャイムのみ) |
| 555 | Areapeers | P2P地震情報ネットワークに接続しているピアの地域分布 |
| 556 | EEW | 緊急地震速報(警報)の実際の内容 |
555はAreapeers、つまり地震とは無関係な「このネットワークに今どれくらいの端末がつながっているか」という、いわばネットワークの健康状態を示すテレメトリでした。
地震が起きていなくても定期的に飛んできます。
震源情報が空だったのも当然で、そもそも地震のデータではなかったからです。
そして本物の緊急地震速報の内容が入っているのはcode 556でした。
震源、マグニチュード、地域ごとの予想震度まで、ちゃんとしたデータが入っています。
私のアプリは、この556を一度も購読していませんでした。
なぜ気づかなかったのか
正直に言うと、最初にAPIの仕様を確認したときに554と555を「EEW関連のコード」とひとまとめにして実装してしまい、556の存在を見落としていました。
555から返ってくるJSONにareasというフィールドがあり、たまたま地震の警報区域を表すのに自然な名前だったため、深く疑わずに「震度データが入る想定のフィールド」として実装を進めてしまいました。
実際のデータを見て中身がおかしいと気づいた後も、しばらくは
「EEWの詳細情報は基本的に来ないもの」
という認識で片付けてしまっていました。
以前の記事に
「モックデータでは気づけない不具合が、実データを流した瞬間に表面化する」
と書きましたが、今回はその逆でした。
実データを見ていたのに、思い込みのせいでおかしさに気づくまで時間がかかったパターンです。データの形がなんとなく動いていると、公式仕様を読み直すところまで踏み込まなくなるのだと思います。
直した内容
connector側の型定義とメッセージ処理を556ベースに書き直しました。
// 修正前: 554と555を「EEW」として扱っていた
export interface EewMessage {
code: 554 | 555;
// ...
}
// 修正後: 実際にEEWの内容を持つ556のみを扱う
export interface EewMessage {
code: 556;
earthquake?: { originTime?: string; hypocenter?: Hypocenter };
areas?: EewArea[]; // pref/name/scaleFrom/scaleToを持つ、地方単位の震度予報
}
副産物として、EEW段階でも地方単位の震度予報がareasに入るようになりました。
以前は震源不明のまま
「強い揺れに警戒してください」
としか出せていなかったので、これは実質的な機能アップグレードにもなりました。
修正をFargateに再デプロイしてログを見ると、以前は1分おきに出ていた「緊急地震速報を検知しました」がぴたりと止まりました。
P2P地震情報の履歴を確認しても、本物の556が飛んでくるのは実際に大きめの地震があったときだけで、体感の頻度としてはかなり自然なものになりました。
終わりに
「よくわからないけどそれっぽい名前のフィールドがある」を見た瞬間に、公式仕様を確認せず実装を進めてしまったのが今回の根本原因でした。
フィールド名から意味を推測するのは楽ですが、外部APIの仕様書に当たる一手間を惜しむと、こういう形で後から返ってきます。
実データを見て「なんかおかしいな」と思ったときの直感は正しかったので、その違和感をもう少し早く公式ドキュメントの確認に結びつけるべきだったと反省しています。
最後まで読んでいただきありがとうございました。