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

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

今回やりたいこと

MacroDroid の標準 GET リクエストアクションで ngrok express サーバーに緯度経度データを送って検証するメモ

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

事前準備

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

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

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

image

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

Functions を有効にする

image

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

image

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

image

従量制にしました。

image

アップグレード完了。

image

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

image

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

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

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! というメッセージと共にプロジェクトの初期化ができました。

image

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

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

はじめに: 最初の関数の記述、テスト、デプロイ の「必要なモジュールをインポートしてアプリを初期化する」を行った位置情報を受け付けるコードを 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

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

image

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

動かしてみる

image

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

image

リストが出てくるので、今回の場合は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 でアクセスします。

image

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

image

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

image

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

MacroDroid の設定を書き換える

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

image

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

image

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]となります。

image

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

image

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