🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

Q&A

解決済

1回答

1609閲覧

FirebaseでFirebase.setIntでデータアップロードしているだけなのに、ダウンロード課金される。

MaeharaKenji

総合スコア86

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

0グッド

1クリップ

投稿2021/01/26 12:28

編集2021/01/27 05:07

Firebaseというgoogleのクラウドサービスを勉強しています。

Firebaseでは、データをアップロードする分にならば、課金は発生しないということを聞きました。

試しにM5Stackを、1秒間ごとにインクリメントしたデータをFirebase.setIntでクラウド側にアップロードするプログラムを作成して実行してみました。

3日程度実行してみると、無料枠の10Gbyteから訳150Mbyteが消費してしまいました。

クラウド側にアップロードして、特にFirebase.getIntなどのダウンロード行為はしていないのですが、150Mbyte分課金されたようになるのはなぜでしょうか?

どうぞ、ご教示の程よろしくお願い致します。

cpp

1 2#include <ArduinoJson.h> 3#include <IOXhop_FirebaseStream.h> 4#include <IOXhop_FirebaseESP32.h> 5#include <M5Stack.h> 6#include <WiFi.h> 7 8 9 10 11 12#define WIFI_SSID "*********" 13#define WIFI_PASSWORD "*********" 14 15// FirebaseのデータベースURL(ご自身のデータベースURLに変更してください) 16#define FIREBASE_DATABASE_URL "https://*******-default-rtdb.firebaseio.com" 17 18 19//timer interrupt variable. 20volatile unsigned long usecCount = 0; 21hw_timer_t *interrupptTimer = NULL; 22portMUX_TYPE mutex = portMUX_INITIALIZER_UNLOCKED; 23 24int secCount = 0; 25int emgAramCount = -1; 26int emgAramSoundCount = -1; 27 28 29//Timer count 30void IRAM_ATTR usecTimer() 31{ 32 portENTER_CRITICAL_ISR(&mutex); 33 usecCount += 5; 34 portEXIT_CRITICAL_ISR(&mutex); 35 36 if(((usecCount / 1000000) % 60) > 0){ 37 if(secCount > -1) 38 { 39 secCount++; 40 } 41 42 usecCount = 0; 43 44 } 45} 46 47 48void setup() { 49 M5.begin(); 50 51 // Wi-Fi接続 52 WiFi.begin(WIFI_SSID, WIFI_PASSWORD); 53 Serial.print("connecting"); 54 while (WiFi.status() != WL_CONNECTED) { 55 Serial.print("."); 56 delay(500); 57 } 58 Serial.println(); 59 60 // Firebase初期化 61 Firebase.begin(FIREBASE_DATABASE_URL); 62 63 // WiFi Connected 64 Serial.println("\nWiFi Connected."); 65 Serial.println(WiFi.localIP()); 66 M5.Lcd.setTextSize(3); 67 M5.Lcd.setCursor(10, 100); 68 M5.Lcd.println("Button Click!"); 69 70 71 72 //interrupt timer setting 73 //timerBegin is count per 100 microsec. 74 interrupptTimer = timerBegin(0, 80, true); 75 76 //interrupt method setting 77 timerAttachInterrupt(interrupptTimer, &usecTimer, true); 78 79 //interrupt timing setting. 80 timerAlarmWrite(interrupptTimer, 5, true); 81 timerAlarmDisable(interrupptTimer); 82 83 portENTER_CRITICAL(&mutex); 84 timerAlarmEnable(interrupptTimer); 85 portEXIT_CRITICAL(&mutex); 86} 87 88 89int countIncriment=0; 90 91void loop() { 92 M5.update(); 93 94 95 if(secCount > 0) 96 { 97 Firebase.setInt("/M5Stack/counter", countIncriment); 98 countIncriment++; 99 secCount=0; 100 } 101 102} 103 104

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

詳しくないですが回答がつかないので。

お使いのデータベースは Firebase Realtime Database ですか? Firestore ですか?
(データベースに値を格納されているんですよね?)

10GiB 無料枠って、Firestore ネットワーク(下り) の 10GiB/月 しか見当たらないのですが、このことを指しておられますか?

投稿2021/01/27 04:07

68user

総合スコア2022

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MaeharaKenji

2021/01/27 05:10

ソースコードを追加しました。1秒間ごとに変数”countIncriment”をインクリメントして、その都度、Firebase.setInt("/M5Stack/counter", countIncriment);でクラウド側の/M5Stack/counterに渡しています。 Firebase Realtime Databaseを使用しています。 この操作を1日ずっと行わせていると、50Mbyte分をダウンロードしているとされます。
68user

2021/01/27 05:40

であれば、https://firebase.google.com/pricing?hl=en の Free の、Realtime Database のところの、  GB downloaded: 10 GB/month が該当するのでしょうか。 https://firebase.google.com/docs/database/usage/billing?hl=ja には  ダウンロード: データベースからダウンロードされたすべてのバイト数で、プロトコルや暗号化のオーバーヘッドも含まれます。 とあります。 Firebase.setInt というのが何なのかわからないですが、Realtime Database への store 時のレスポンスがつもりつもって 50MB なのかもしれませんね。
MaeharaKenji

2021/01/27 05:50

私は単純に ”Firebase.setInt” ----> アップロード ”Firebase.getInt” ----> ダウンロード このように考えていたんですが、TCP通信の再送が発生した場合の信号とか、MQTT通信の再送関係のパケットとかはやはりカウントされるようですね。 10Gbyteの無料枠を超えると、1Gbyteあたり5ドルに課金されるとのことで、結構な値段だなと思い、なんとか削る方法はないかと思っています(^^;
MaeharaKenji

2021/01/27 05:55

それです。M5Stackの入門書を読んでいてサンプルコードで紹介されていました。
68user

2021/01/27 05:58

なるほど~。 https://firebase.google.com/docs/database/usage/billing?hl=ja の「接続数を減らす」には、  HTTP keep-alive やサーバー送信イベントの使用を検討してください とありますね。そのライブラリを使う以上はそういう調整はできないのかもしれませんけれども。
68user

2021/01/27 06:03

あと、Realtime Database ではなく Firestore を使うと、リージョン内下りは無料とあるので、M5Stack → Cloud Functions → Firestore というのもあるのかもしれません。 https://firebase.google.com/docs/firestore/pricing?hl=ja そもそも毎秒? 送信しているのであれば、ちょっとやりすぎ感はあるので、データを溜め込んで 1分に1回まとめてとかはできないものでしょうか。
MaeharaKenji

2021/01/27 06:18

今自分がやりたいことになるんですが、有線で8CH入力できる警報表示器があるんですが、その8CHすべてをwifi無線化したい(それぞれのCHにESP32をつけて、すべてのセンサ信号をクラウド側に送りたい。表示器はクラウド経由で信号をもらう)と思っています。 現在1秒間隔で信号を送るというのは少し自分でも多すぎかなと感じてます。 1度検知したら、5分程度は無検知状態にするとか、そういうので節約した方がいいかもですね。 ただ、表示器側はなるべくFirebase.getIntで検知信号がないかどうかをなるべく短い間隔でポーリングしないとまずい気がする(チャンネルが増えればそれ毎に)ので、なかなかコストの面で実現は難しいかなと感じています。
68user

2021/01/27 06:39 編集

少なくとも get が高頻度になるなら、受け取った信号は永続化しつつキャッシュしておいて、get に対してはそれを返した方がいいかもしれませんね。無料枠のある GAE とか? ただ、ConoHa VPS とかで 500円のを借りて、自作 API (データはローカルのファイルか MySQL などに保存) 作るのが最安かもしれませんね。可用性も対障害性もございませんけれども。しかし IoT 楽しそうでいいですね…
MaeharaKenji

2021/01/27 06:52

やはりチャンネル毎にダウンロードよりは、センサ信号がたくさんあるならどこか1つにまとめてた方がよいのですね。GAEとかって、AWS lambdaみたいなプログラムサービスですよね・・・ 課金はされるものの、ESP側のプログラムがとても単純・明解に作れて、以前よりも複雑なことができるのはクラウドいい感じですね。
68user

2021/01/27 06:59

GAE は、プログラムサービスです。lambda や functions のように短時間で終了せず、おおむねずっと立ち上がりっぱなしです (全くアクセスがないと消えますが、次回アクセス時に自動でupします)。1インスタンス分ならあげっぱなしでも無料です。
MaeharaKenji

2021/01/27 07:23

そういうオプションのサービスとかが豊富ですよね。紐づけたセンサの生存監視機能とか、ゆくゆくはスマホアプリとかの連携とかリッチな機能の開発も簡単にしてくれそうで、夢が膨らみます(^^)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問