2021年03月16日
「気象庁防災情報XMLフォーマット」とWorkato、Slackで従業員の安否確認システムを設計してみた大野 智之 Tomoyuki Ohno
皆さんこんにちは、リックソフトの大野です。
2021年3月11日で東日本大震災から10年が経ちます。
また、去る2021年2月13日の夜、福島県沖を震源とする最大震度6強の地震が発生しました。
地震災害で被災された皆様におかれましては、心よりお見舞い申し上げます。
災害発生時、企業がいちはやく知りたい情報に、地震に関する詳細な情報(最大震度や各地の震度、津波の有無等)と、従業員の安否情報(ケガの有無、出社可否等)があると思います。
地震活動が活発な状況が続く中、「Slack上で地震情報をチェックする仕組みや安否確認システムの仕組みが実現できないか」と考え、Workatoで簡単な実装を行ってみました。
地震情報を取得する方法は様々ありますが、その中でも最も確実かつ正確な情報源は「気象庁防災情報XMLフォーマット」から得られます。地震を含めた様々な災害情報をXMLフォーマットで取得することができます。
仕様は技術資料として公開されています。技術資料を参考にしながら作業を進め、容易かつ確実にシステムの実装へ落とし込むことができます。利用にあたり、ユーザー登録等の手続きは不要です。上記より取得した結果は、商用・非商用問わず利用規約の範囲で自由に利用することができます。
「気象庁防災情報XMLフォーマット」をデータソースとして利用することを前提に、実装に必要となる処理を簡単にまとめますと、次のとおりとなります。
この他に、メッセージの重複投稿排除や安否確認機能の実装等、実際の運用において必要となる機能について、あわせて検討します。
先に検討した内容をもとに、Workatoのレシピの実装を行います。
今回は、Workatoで「気象庁防災情報XMLフォーマット」から地震情報を取得し、Slackへメッセージを投稿するまでの最低限のレシピの実装を進めていきます。
なお、各手順においては、必要なコネクターの接続設定(Connection)が行われていることを前提とします。
このレシピでは、10分間隔でレシピを実行するようにしたいと思います。
10分間隔でレシピを実行する場合は、「Scheduler by Workato」コネクターを利用します。
「Scheduler by Workato」コネクターをトリガーとすることで、特定の間隔でレシピを実行することができます。
気象庁ホームページの「気象庁防災情報XMLフォーマット形式電文の公開(PULL型)」に掲載されている、地震火山の高頻度フィード(Atomフィード)より必要な情報をWorkatoで取得します。
まず、上記AtomフィードをWorkatoにダウンロードする処理を実装します。処理の実装には、「HTTP」コネクターを利用します。
RequestでMethodを「GET」、Request URLにAtomフィードのURLを入力することで、指定されたAtomフィードをダウンロードすることができます。
Responseを「Text」とすることで、プレーンテキスト(無加工のテキストファイル)として値を取得することができます。
「HTTP」コネクターで取得したAtomフィードは、Workato内で「XML parser by Workato」を利用して、XMLからWorkatoで利用可能な形にパースします。
属性のあるXMLファイルをパースするため、XML typeは「Full XML with attributes」を指定します。
このXML typeを指定すると、パースされたXMLの階層(ノード)は、全て配列として扱われます。
AtomフィードのXML構造をWorkatoへ認識させるため、Sample documentへXMLのサンプルを入力します。
Sample documentへXMLのサンプルを入力すると、その内容をもとに、Workatoによって自動的に配列や値などのオブジェクトが定義されます。
Documentには、「HTTP」コネクターの戻り値のオブジェクト(Body)をセットします。
まず、Atomフィードのエントリを1行ずつループ処理し、必要な情報を取得します。
「Repeat action」を利用することで、「XML parser by Workato」によりパースされた配列(リスト)など、特定の配列をもとにFor Eachループを行うことができます。
「XML parser by Workato」でパースされた配列もループ処理させることができます。
子階層もループさせたい場合は、ネストした形で「Repeat action」を利用します。
このAtomフィードでは、エントリである「entry」の親階層は「feed」であり、かつ「feed」はルート階層になります。
よって、最初に「feed」をループ処理し、次に「feed」内で「entry」をループ処理させるという実装にします。
あわせて、地震に関するエントリのみを取得したいため、条件分岐を行います。
「IF condition」あるいは「IF/ELSE condition」を利用することで、条件分岐を行うことができます。
「XML parser by Workato」でパースされた値や、ループ処理内の値などを条件に指定して使用することができます。
このAtomフィードでは、地震に関する情報の場合、「震度・震源に関する情報」という値が、各「entry」の「title」という要素の値としてセットされます。
Workatoにおいて、要素の値は「title」以下の「Content」というオブジェクトで取得することができますので、その値と比較して次の処理を実行します。
なお、Workatoにおいて、1つのインデックスしか存在しない配列に属するオブジェクトの値は、ループ処理や明示的にインデックスを指定することなく、直接オブジェクトを指定して取得することが可能です。
「2.Atomフィードからの地震情報の取得」と同じ要領で、防災情報XMLをダウンロードし、ダウンロードしたXMLをパースします。
「HTTP」コネクターで指定するRequest URLは、Atomフィードの各「entry」階層下の「link」要素の「href」属性を指定します。
「XML parser by Workato」で指定するSample documentのXMLは、気象庁ホームページの「気象庁防災情報XMLフォーマット」に掲載されている「技術資料サンプルデータ(xml及びtxt)セット」を利用します。
「Variables by Workato」コネクターを使用すると、Workatoのレシピ上で変数を管理することができます。
変数を利用すると、取得した値を変数にセットできるだけでなく、取得した値を加工(あるいは変換)した上で変数にセットすることが可能です。
例えば、以下の「origin_time」のようにFormula(式)を利用することで、関数を組み合わせて特定の書式で日時を出力する等、値を加工(あるいは変換)して出力することができます。
また、以下の「hypocenter」「sindo」「forecast_comment」では、「Content」というオブジェクトがセットされていますが、全て異なるオブジェクトです。
ご覧の通り、これらのオブジェクトは、見た目でどれが何であるのかを区別することや、セットされたオブジェクトの正しさ(意図したオブジェクトがセットされているか)をひと目で判断することが困難です。
このようなオブジェクトを変数で管理すると、値が区別しやすくなります。値の区別しやすくなることで、効率的な実装や不具合の減少に繋がります。
「Workbot for Slack」コネクターを利用することで、Slackの特定チャンネルへの通知を簡単に行うことが出来ます。
「Reply channel」で、通知したいチャンネルを指定します
「Message attachments」で、タイトルや本文等を定義します。
これまでの手順をもとにレシピの作成を進めますと、最終的に次のようなレシピが完成します。
「Start recipe」をクリックし、作成したレシピをスタートさせます。
レシピをスタートさせると、Slackの指定したチャンネルへ、作成したレシピをもとに地震情報が投稿されます。
なお、ここまでで作成したレシピでは、基本的な地震情報がSlackへ投稿されるものでしたが、このレシピでは一度チェックしたAtomフィードのエントリをスキップする仕組みがありません。
このため、実際の運用に際しては一定の日時を過ぎたエントリをスキップする、あるいはエントリ内の一意の値(例えばXMLのURL)をWorkato上で保持して(例えばLookup Tableで保持して)、その値が含まれるエントリをスキップする等の実装が必要となります。
このような仕組みが実現できますと、各地(市町村別)の震度を出力させたい、メッセージの投稿を特定震度以上としたい、特定震度以上で安否確認フォームのURLを投稿したい(簡易的な安否確認システムを構築したい)、社員の居住地域に応じてメンションを行い注意を促したい等の、様々な要望も生まれてくると思いますが、ここまで作成したレシピに対して追加実装を行うことで実現することができます。
例えば、以下のように各地の震度を表示したり、安否確認フォーム(例えばGoogleフォーム)のURLを通知することも可能です。
その他、WorkatoではSlackに限らず、Microsoft TeamsやGoogle Chatにも対応していますし、SMSやE-Mailにも対応できますので、Slackだけでなく他のチャネルでも同時に通知したいという要望にも応えられます。
また、サービスの運用管理(死活監視や作業要員手配の自動化等)やIoT機器・サービスとの連携など、様々な用途に応用することもできます。
もちろん、Workatoですので、これらの処理はノーコードで実装することが出来ます!
様々なシステムやサービスとノーコードで自在に連携可能なWorkatoを、是非ご検討ください。
製品について詳しくはこちらをご覧ください。
WorkatoWorkatoを試してみたい方はこちら。
Workato無料トライアルご依頼フォームWorkatoを試してみたい方はこちら。
Workato無料トライアルご依頼フォームWorkatoに関する資料請求、製品デモ、お見積もりのご要望は下記リンクより承っております。
Workato お問い合わせ本情報はブログを公開した時点の情報となります。
ご不明な点はお問い合わせください。
アトラシアン社ではサポート範囲外となっているサードパーティ製のアドオンをリックソフトのサポートではサポートします。
リックソフトのサポートは開発元が提供するサポート以上の価値があります。
ツールを導入しただけでは成功とはいえません。利用者が効果を感じていただくことが大切です。独自で制作した各種ガイドブックはツール活用を促進します。
リックソフトからライセンス購入を頂いたお客様にはガイドブックを無料進呈いたします。
ツール操作の研修だけでなく「ウォータフォール型開発」「アジャイル型開発」のシミュレーション研修も提供。
日本随一の生産性向上にも効果のある研修サービスです。
リックソフトからライセンス購入を頂いたお客様には無料招待や割引特典がございます。