MacroDroid の標準 GET リクエストアクションで位置情報を送って Cloud Functions for Firebase 経由でデータを記録するメモ

MacroDroid の標準 GET リクエストアクションで位置情報を送って Cloud Functions for Firebase 経由でデータを記録するメモ

MacroDroid の標準 GET リクエストアクションで位置情報を送って Cloud Functions for Firebase 経由でデータを記録するメモです。

今回やりたいこと

https://www.1ft-seabass.jp/memo/2021/02/17/macrodroid-get-request-test-to-ngrok/

MacroDroid の標準 GET リクエストアクションで ngrok express サーバーに緯度経度データを送って検証するメモ で、データが送られることが検証出来たら、Cloud Functions for Firebase 経由でデータを記録してみます。今回は Firebase Realtime Database で保存します。

事前準備

2021/02/18 時点の情報で進めます。

MacroDroid の標準 GET リクエストアクションで ngrok express サーバーに緯度経度データを送って検証するメモ で手元でデータが送れることが確認できているところからはじめます。

はじめに: 最初の関数の記述、テスト、デプロイ を参考に進めます。「Firebase プロジェクトを作成する」の章は、私はすでに Firebase プロジェクトがあったものを使いました。

Firebase Realtime Database を使うので事前に開始しておきましょう。いきなり使おうとすると構築が待たさせたりするので注意です。

Functions を有効にする

メニューから Functions を選びます。

私のプロジェクトでは、無料版で使っていたのでこのようになっていました。ということで、アップグレードします。

従量制にしました。

アップグレード完了。

心配な人は予算アラートを設定しておきましょう。Firebase Pricing を見る限りは、Free up で割と無料枠で検証できそうな雰囲気です。

ということで、使えるようになりました。

ちなみにこれをやらないと、

Error: Your project xxxxxxxxxxxxxxx must be on the Blaze (pay-as-you-go) plan to complete this command. Required API cloudbuild.googleapis.com can't be enabled until the upgrade is complete. To upgrade, visit the following URL:

というエラーがデプロイ時に出て、作った Function がデプロイされない(受け付けない)ので、ちゃんと対応しましょう。私が遭遇した時は、直近のデプロイで何かおかしいかと思って少々ハマりました。

Node.js と Firebase CLI を設定する&プロジェクトの初期化

引き続き、はじめに: 最初の関数の記述、テスト、デプロイ を参考に「Node.js と Firebase CLI を設定する」「プロジェクトの初期化」の章を進めます。

npm install -g firebase-tools のあとに、早くやりたい気持ちがあふれてしまい firebase login の認証を忘れて実行しようとしてダメですよってエラーが出してしまいましたが。(ドキュメント悪くない)

プロジェクトの初期化については、

  • Are you ready to proceed?
    • Yes
  • Please select an option:
    • Use an existing project
  • Select a default Firebase project for this directory:
    • 今回 Functions を使えるようにしたプロジェクトを選択
  • What language would you like to use to write Cloud Functions?
    • JavaScript
  • Do you want to use ESLint to catch probable bugs and enforce style?
    • No
    • いずれは ON にする
  • Do you want to install dependencies with npm now?
    • Yes

という設定で Firebase initialization complete! というメッセージと共にプロジェクトの初期化ができました。

こんな感じのファイル構造になっていました。

位置情報を受け付けるコードを反映

はじめに: 最初の関数の記述、テスト、デプロイ の「必要なモジュールをインポートしてアプリを初期化する」を行った位置情報を受け付けるコードを index.js に上書きします。

const functions = require("firebase-functions");

// 
const admin = require("firebase-admin");
admin.initializeApp();

// 今回の処理
exports.macroDroid = functions.https.onRequest((request, response) => {
  functions.logger.info("macroDroid logs!", {structuredData: true});

  const locationQuery = request.query.location;
  
  functions.logger.info(`locationQuery ${locationQuery}`, {structuredData: true});

  // カンマ区切りなので分ける
  const locationData = locationQuery.split(",");
  const lat = locationData[0];  // 1つめのデータが緯度
  const lon = locationData[1]; // 2つめのデータが経度
  const d = new Date();
  const dateISO = d.toISOString();  // ISO タイプスタンプ

  const message = `lat ${lat} lon ${lon} dateISO ${dateISO}`;
  functions.logger.info(message, {structuredData: true});
  
  // Realtime Database への書き込み
  admin.database().ref("/macrodroid").push({
    lat:Number(lat),
    lon:Number(lon),
    CreateAt:dateISO
  }).then(() => {
    response.send(message);
  });
  
});

macroDroid という URL で作成され、MacroDroid の標準 GET リクエストアクションで ngrok express サーバーに緯度経度データを送って検証するメモと同じように、緯度経度情報がカンマ区切りのデータで来るとレスポンスを返しつつ、Realtime Database への書き込みを行うものです。

また、同じ Firebase 内のやり取りのため、特別な設定なしで admin.initializeApp(); だけで呼び出せています。(これが最初分からず、ずっと設定値を気にしていたのですが、結局これでよかったようです。)

本番環境にデプロイ

はじめに: 最初の関数の記述、テスト、デプロイ を参考に「本番環境に関数をデプロイする」を参考に、

firebase deploy --only functions

というコマンド打って本番環境に関数をデプロイします。

Deploy complete! というメッセージが出てデプロイされました。

動かしてみる

こちらの Project Console に書かれているURLから Functions を見に行きます。

リストが出てくるので、今回の場合は1つだけ Function があるので、リクエストの下にあるURLに ?location=123,456 をくっつけてアクセスします。仮に https://us-central1-myproject-sample.cloudfunctions.net/macroDroid であれば、 https://us-central1-myproject-sample.cloudfunctions.net/macroDroid?location=123,456 でアクセスします。

このように、緯度経度と dateISO で今のUTCな日時を返してくれれば、デプロイ成功でうまく動作しています。

Realtime Database のほうも確認します。

先ほどのデータがうまく記録されています。

MacroDroid の設定を書き換える

ここまで検証出来たら MacroDroid の設定を書き換えます。

MacroDroid の標準 GET リクエストアクションで ngrok express サーバーに緯度経度データを送って検証するメモ のマクロをクリックして、Web サイトを開く/HTTP GET の設定を開いて、URL を変更します。

URLを入力の入力エリアに Functions のURLに /macrodroid?location=[lv=location] と、つけた文字列を入力します。仮に https://us-central1-myproject-sample.cloudfunctions.net/macroDroid の場合は、 https://us-central1-myproject-sample.cloudfunctions.net/macroDroid?location=[lv=location]となります。

これでマクロを保存して書き変わったことを確認してから、マクロ実行してみてデータを送ってみましょう。

このようにデータが保存されます。