Git Product home page Git Product logo

mobizt / firebase-esp-client Goto Github PK

View Code? Open in Web Editor NEW
473.0 15.0 100.0 8.31 MB

[DEPRECATED]🔥Firebase Arduino Client Library for ESP8266, ESP32 and RP2040 Pico. The complete, fast, secured and reliable Firebase Arduino client library that supports RTDB, Cloud Firestore, Firebase and Google Cloud Storage, Cloud Messaging and Cloud Functions for Firebase.

License: MIT License

C++ 40.85% C 59.15%
arduino esp8266 esp32 google-cloud-firestore firebase-storage google-cloud-storage google-cloud-functions jwt oauth2-authentication firebase-cloud-messaging

firebase-esp-client's Introduction

Mobizt's GitHub stats

I'm engineer from Thailand.

I'm working on machine condition monitoring and vibration analysis.

The Industrial IoTs, data processing and data acquisition are the fields that I focused.

I develop and maintain the Arduino C++ opensource libraries for embedded devices.

One of my projects Firebase Arduino Client Library for ESP8266 and ESP32 wins the Google Open Source Peer Bonus Program.

The E-mail client library for Arduino project is the first E-mail client library in the Arduino platform that allows the embedded device to send and receive E-mail.

I'm ready to support and help for fixing the issues and answering the questions related to my libraries

firebase-esp-client's People

Contributors

escopecz avatar mobizt avatar wooldoughnut310 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

firebase-esp-client's Issues

Support for Arduino with Ethernet?

Hi, I really like this package and was wondering if I could simply use it on an arduino with an ethernet shield? Probably swap teh Wifi.h library for Ethernet.h ?

BUG RTDB.deleteNode gives error "data type mismatch" even though it does delete the node from firebase as expected

Describe the bug
RTDB.deleteNode returns false and gives error "data type mismatch" even though it does delete the node from firebase as expected

To Reproduce

  1. use Firebase.RTDB.deleteNode to delete a node from a Realtime Database
  2. it returns false, and fbdo.errorReason() equals "data type mismatch" though the node I'm trying to delete does get deleted from the database

I will post an example demonstrating the issue below.

Expected behavior
I expected RTDB.deleteNode to return true when it functions properly and deletes from the database, not return false even when it functions. I would like to be able to detect when there is an issue with deleting from the database.

IDE and its version:

  • Arduino
  • Version 1.8.13

ESP Arduino Core SDK version

  • ESP32 1.0.6

code that demonstrates the issue: (based on examples/RTDB/Basic)

#include <WiFi.h>
#include <Firebase_ESP_Client.h>

//Provide the token generation process info.
#include "addons/TokenHelper.h"
//Provide the RTDB payload printing info and other helper functions.
#include "addons/RTDBHelper.h"

/* 1. Define the WiFi credentials */
#define WIFI_SSID "removed"
#define WIFI_PASSWORD "removed"

/* 2. Define the API Key */
#define API_KEY "removed"

/* 3. Define the RTDB URL */
#define DATABASE_URL "something-default-rtdb.firebaseio.com" //<databaseName>.firebaseio.com or <databaseName>.<region>.firebasedatabase.app

/* 4. Define the user Email and password that alreadey registerd or added in your project */
#define USER_EMAIL "[email protected]"
#define USER_PASSWORD "removed"

//Define Firebase Data object
FirebaseData fbdo;

FirebaseAuth auth;
FirebaseConfig config;

unsigned long sendDataPrevMillis = 0;

int count = 0;

void setup()
{

  Serial.begin(115200);

  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("Connecting to Wi-Fi");
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(300);
  }
  Serial.println();
  Serial.print("Connected with IP: ");
  Serial.println(WiFi.localIP());
  Serial.println();

  Serial.printf("Firebase Client v%s\n\n", FIREBASE_CLIENT_VERSION);

  /* Assign the api key (required) */
  config.api_key = API_KEY;

  /* Assign the user sign in credentials */
  auth.user.email = USER_EMAIL;
  auth.user.password = USER_PASSWORD;

  /* Assign the RTDB URL (required) */
  config.database_url = DATABASE_URL;

  /* Assign the callback function for the long running token generation task */
  config.token_status_callback = tokenStatusCallback; //see addons/TokenHelper.h

  //Or use legacy authenticate method
  //config.database_url = DATABASE_URL;
  //config.signer.tokens.legacy_token = "<database secret>";

  Firebase.begin(&config, &auth);

  Firebase.reconnectWiFi(true);
}

void loop()
{
  if (Firebase.ready() && (millis() - sendDataPrevMillis > 15000 || sendDataPrevMillis == 0))
  {
    sendDataPrevMillis = millis();

    Serial.printf("Set int... %s\n", Firebase.RTDB.setInt(&fbdo, "/test/int", count) ? "ok" : fbdo.errorReason().c_str());
    delay(5000);
    Serial.printf("Delete node %s\n", Firebase.RTDB.deleteNode(&fbdo, "/test/int") ? "ok" : fbdo.errorReason().c_str());
    //the above line prints "Delete node data type mismatch" even though it deletes the value int.

    count++;
  }
}

result of running code:

Connecting to Wi-Fi........
Connected with IP: 10.0.0.14

Firebase Client v2.3.7

Token info: type = id token, status = on request
Token info: type = id token, status = ready
Set int... ok
Delete node data type mismatch
Set int... ok
Delete node data type mismatch

A value is added and deleted from the database, as I would expect.

Please ask me if there's any more information I could provide, and thank you so much for writing and supporting so many useful libraries!

getInt function takes a lot of time

Hello mobizt. I'm using your library and it made my project a lot better. However I'm having a little bit of trouble with getInt function.

I'm trying to read a simple integer value (varies from 0 to 100 by the way) on the Realtime Database and it sometimes takes less than a second to procces and sometimes it takes more than 10 seconds to read a single value. I don't really have a lot of experience with Firebase so I'm sorry if I'm doing something wrong.

Is there a way that I can make the procces faster or set the timeout correctly. I tried setReadTimeout function but it does not affect anything at all.

My code is too long so I'm just sharing the Firebase related parts so please let me know if something is missing.

#include <Firebase_ESP_Client.h>

int fanspeed;

#define DATABASE_URL ""
#define DATABASE_SECRET ""

FirebaseData firebaseData;
FirebaseAuth auth;
FirebaseConfig config;

void setup() {
  config.database_url = DATABASE_URL;
  config.signer.tokens.legacy_token = DATABASE_SECRET;

  Firebase.begin(&config, &auth);
  Firebase.reconnectWiFi(true);
  Firebase.RTDB.setReadTimeout(&firebaseData, 100);
}

void loop(){
    if(Firebase.ready())
    {
      Firebase.RTDB.getInt(&firebaseData, "/cYTdHBtkME/fanspeed2",&fanspeed);
    }

    Serial.print("Fan Speed: ");
    Serial.println(fanspeed);
}

HELP: Is the connection restarting?

Hi!
Today i was testing my code, that reads and writes in a Realtime database in Firebase, and I wrote in the plataformio.ini file the following:
build_flags = -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG
I saw how it works and the logs that are in the whole code, and I got surprised because each ~30 seconds, the following line appears:
[I][fb_ssl_client32.cpp:192] start_ssl_client(): WARNING: Use certificates for a more secure communication!
My code is running perfectly, but this means that the ssl connection restarts? I don't thing that is a problem, but in Firebase docs, they suggest to mantain the connection open, but maybe 30 seconds is the limit.

Another question I have is if I have to worry about the message WARNING: Use certificates for a more secure communication!. Should I use certificates for a more secure communication? How can I do it with Firebase?

And my las question: I've been supervising the usage of the realtime database, and this line:
Firebase.RTDB.getInt(&fbdo, path.c_str()) (is executed twice per second and its purpose is to hear for changes in a path that contains an Int. Is there a more efficient way to do it?)
This line downloads about 2,4 MB per hour from the databse. Is that too much? This big quantity of bytes can be related to the problem of the restarting connection, because in Firebase docs says:
These frequent, short-lived connections can actually add up to more connection costs, database load, and outbound bandwidth than live real-time connections to your database..

Create Firestore document inside HTTP_GET request inside void setup ()

Hi, I'm trying to create a Firestore document with HTTP_GET request

server.on("/temp", HTTP_GET, [](AsyncWebServerRequest *request) {
String content;
  FirebaseJson js;

  String documentPath = "sensors/temp";

  js.set("fields/value/integerValue", String(temp).c_str());
  js.toString(content);

Serial.println("------------------------------------");
Serial.println("Create a document...");

  if (Firebase.Firestore.createDocument(&fbdo, FIREBASE_PROJECT_ID, "" /* databaseId can be (default) or empty */, documentPath.c_str(), content.c_str()))
  {
    Serial.println("PASSED");
    Serial.println("------------------------------------");
    Serial.println(fbdo.payload());
    Serial.println("------------------------------------");
    Serial.println();
  }
  else
  {
    Serial.println("FAILED");
    Serial.println("REASON: " + fbdo.errorReason());
    Serial.println("------------------------------------");
    Serial.println();
  }

    request->send(200, "text/plain", "Hello, world");
});

but I get this error

------------------------------------
Create a document...
FAILED
REASON: not connected
------------------------------------

Not finding any document

Hi,

I receive 404 not found on Firebase.RTDB.get / set even though I can see the document in the path. Here's what I'm using:

#include <Firebase_ESP_Client.h>
FirebaseData fbdo;
Firebase.RTDB.setInt(&fbdo, "document", 1)

Any suggestions?

RTDB Stream (callback mode) missing updates

Describe the bug
We are using RTDB with callback mode for a project. When updates are sent very frequently (~100ms between updates) some of them are lost and never provided to the callback function.

To Reproduce
Steps to reproduce the behavior:

  1. Go to examples/RTDB/Stream_Callback.ino
  2. Configure all settings
  3. Run it. We are using ESP32 from az-delivery
  4. From some other device connected to the same realtime database, send a few updates under /Test/Stream node. See code below used in a test page, which sends updates to /Test/Stream/a0 to /Test/Stream/a9 every 100ms:
for(let i=0; i<10; i++) {
  setTimeout(function() {
     firebase.database().ref(`/Test/Stream/a${i}`).set(firebase.database.ServerValue.increment(1));
  }, 100*i);
}

Expected behavior
The ESP32 callback should be called and output the 10 updates:

Stream Data1 available...
STREAM PATH: /Test/Stream
EVENT PATH: /a0
DATA TYPE: int
EVENT TYPE: put
VALUE: 1

[9 more updates skipped]

Actual behavior
Some updates are missing / skipped, and never get provided to the callback function. See full output for one test with 10 updates:

Stream Data1 available...
STREAM PATH: /Test/Stream
EVENT PATH: /a0
DATA TYPE: int
EVENT TYPE: put
VALUE: 1

Stream Data1 available...
STREAM PATH: /Test/Stream
EVENT PATH: /a4
DATA TYPE: int
EVENT TYPE: put
VALUE: 1

Stream Data1 available...
STREAM PATH: /Test/Stream
EVENT PATH: /a7
DATA TYPE: int
EVENT TYPE: put
VALUE: 1

Stream Data1 available...
STREAM PATH: /Test/Stream
EVENT PATH: /a9
DATA TYPE: int
EVENT TYPE: put
VALUE: 1

Screenshots
N/A, output provided above

IDE and its version:
arduino-cli alpha Version: 0.15.2 Commit: 0d4cb150 Date: 2021-02-09T13:02:49Z

ESP32 Arduino Core

  • esp32:esp32

Additional context

  • This was tested with Stream_Callback (not removing updates from that code), but all callbacks should be sent between updates from Callback. Removing those doesn't solve the issue.
  • Depending on the test different updates are missed.
  • Changing timeout between updates to 500ms all updates are sent to the callback in my tests.
  • Changing timeout between updates to 300ms some updates start to be lost, but less frequently than with 100ms.
  • Other Firebase integrations (ie. web) get all the updates, so they are ok in Firebase.

add more than 2 FirebaseData

when i use more than 2 FirebaseData it show an error "not connected" please help i need to use more than 2 FirebaseData

Compile error - Missing files

I get the following error compiling with Arduino IDE for my AI Thinker ESP32-CAM:

Firebase_ESP_Client.h:38:26: fatal error: rtdb/FB_RTDB.h: No such file or directory

I'm guessing maybe the rtdb folder was never committed and added to the repository with the refactor between 1.0.3 and 1.1.1. The issue does not exist on 1.0.3

Recommended memory settings in ESP8266 Arduino Core SDK v3.0.0

Arduino IDE

When you update the ESP8266 Arduino Core SDK to v3.0.0, the memory can be configurable from Arduino IDE board settings.

By default MMU option 1 was selected, the free Heap can be low and may not suitable for the SSL client usage in this library.

To increase the Heap, choose the MMU option 3, 16KB cache + 48KB IRAM and 2nd Heap (shared).

IDE config

More about MMU settings.
https://arduino-esp8266.readthedocs.io/en/latest/mmu.html

PlatformIO IDE

When Core SDK v3.0.0 becomes available in PlatformIO,

By default the balanced ratio (32KB cache + 32KB IRAM) configuration is used.

To increase the heap, PIO_FRAMEWORK_ARDUINO_MMU_CACHE16_IRAM48_SECHEAP_SHARED build flag should be assigned in platformio.ini.

At the time of writing, to update SDK to v3.0.0 you can follow these steps.

  1. In platformio.ini, edit the config as the following
[env:d1_mini]
platform = https://github.com/platformio/platform-espressif8266.git
build_flags = -D PIO_FRAMEWORK_ARDUINO_MMU_CACHE16_IRAM48_SECHEAP_SHARED
board = d1_mini
framework = arduino
monitor_speed = 115200
  1. Delete this folder C:\Users\UserName\.platformio\platforms\espressif8266@src-?????????????
  2. Delete .pio and .vscode folders in your project.
  3. Clean and Compile the project.

The supportedd MMU build flags in PlatformIO.

  • PIO_FRAMEWORK_ARDUINO_MMU_CACHE16_IRAM48
    16KB cache + 48KB IRAM (IRAM)

  • PIO_FRAMEWORK_ARDUINO_MMU_CACHE16_IRAM48_SECHEAP_SHARED
    16KB cache + 48KB IRAM and 2nd Heap (shared)

  • PIO_FRAMEWORK_ARDUINO_MMU_CACHE16_IRAM32_SECHEAP_NOTSHARED
    16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)

  • PIO_FRAMEWORK_ARDUINO_MMU_EXTERNAL_128K
    128K External 23LC1024

  • PIO_FRAMEWORK_ARDUINO_MMU_EXTERNAL_1024K
    1M External 64 MBit PSRAM

  • PIO_FRAMEWORK_ARDUINO_MMU_CUSTOM
    Disables default configuration and expects user-specified flags

Test code for MMU

#include <Arduino.h>
#include <umm_malloc/umm_heap_select.h>

void setup() 
{
  Serial.begin(74880);
  HeapSelectIram ephemeral;
  Serial.printf("IRAM free: %6d bytes\r\n", ESP.getFreeHeap());
  {
    HeapSelectDram ephemeral;
    Serial.printf("DRAM free: %6d bytes\r\n", ESP.getFreeHeap());
  }
}

void loop() {
  // put your main code here, to run repeatedly:
}

Filesystem should be a user choice

First of all, thank you!
I really like your great work with this library.

I'm doing some tests with Cloud Storage and I find it really inconvenient to have to change the filesystem at the library level and not in the user sketch.
I faced the same problem in some of my libraries and solved it passing the filesystem as parameter in the class contructor and by directly using a pointer to the parent class Stream when file access is needed (like upload for example).
This way you don't have to change the definitions in the library source every time.

Maybe this approach can be applied also to your work?

HELP: Get value in Document

This libary is save me.
I use fbdo.playload() to print my document in firestore and here result:

15:15:20.919 -> {
15:15:20.919 ->   "name": "projects/prjtest22222/databases/(default)/documents/users/oQz5x6rtlcP3i2Gyufjx8m8YjtC3/devices/ObjectName",
15:15:20.919 ->   "fields": {
15:15:20.919 ->     "relay-1": {
15:15:20.919 ->       "stringValue": "false,true,false,0:0:0,0,client"
15:15:20.919 ->     },
15:15:20.919 ->     "relay-4": {
15:15:20.919 ->       "stringValue": "false,true,false,0:0:0,0,client"
15:15:20.919 ->     },
15:15:20.919 ->     "relay-5": {
15:15:20.919 ->       "stringValue": "false,true,false,0:0:0,0,client"
15:15:20.965 ->     },
15:15:20.965 ->     "relay-2": {
15:15:20.965 ->       "stringValue": "false,true,false,0:0:0,0,client"
15:15:20.965 ->     },
15:15:20.965 ->     "relay-0": {
15:15:20.965 ->       "stringValue": "false,true,false,0:0:0,0,client"
15:15:20.965 ->     },
15:15:20.965 ->     "relay-6": {
15:15:20.965 ->       "stringValue": "false,true,false,0:0:0,0,client"
15:15:20.965 ->     },
15:15:20.965 ->     "relay-7": {
15:15:20.965 ->       "stringValue": "false,true,false,0:0:0,0,client"
15:15:20.965 ->     },
15:15:20.965 ->     "relay-3": {
15:15:20.965 ->       "stringValue": "false,true,false,0:0:0,0,client"
15:15:20.965 ->     }
15:15:20.965 ->   },
15:15:20.965 ->   "createTime": "2021-04-15T05:35:14.027754Z",
15:15:20.965 ->   "updateTime": "2021-04-15T07:51:34.013816Z"
15:15:21.012 -> }

I have looked for examples,
I try use FirebaseJsonData or fbdo.jsonString() but the result is empty.

`

    FirebaseJsonData jsonData;
    FirebaseJson js = fbdo.jsonObject();

    for (int i = 0; i < relays_length; i++) {
        js.get(jsonData, "relay-" + String(i));
        if (jsonData.success) {
            data[i] = jsonData.stringValue;
        }
    }
    //or
    Serial.println(fbdo.jsonString());

`

I need get key value. And when i try update the document with update mask, it print failed Invalid property path \"relay-0\".

Can you help me with the optimal solution.

Thanks,

token is not ready

#include <ESP8266WiFi.h>
//#include <FirebaseESP8266.h>
#include <Firebase_ESP_Client.h>
#define WIFI_SSID "Gal"
#define WIFI_PASSWORD "00000000"
const char* host = "www.google.com"; 
#define FIREBASE_HOST "endoscopiegold.firebaseio.com"


#define API_KEY "AIzaSyCc382c8SlODF-j55zz8lWfsQnSeahV9GQ"
//#define FIREBASE_AUTH "kutF4xktyVbOtxFqjxf1tcJQZH9rXf1A9GomGeIP"
const long utcOffsetInSeconds = 3600;


//Define FirebaseESP8266 data object
FirebaseData fbdo;
FirebaseData fbdo2;
FirebaseData fbdo3;
FirebaseData fbdo4;

FirebaseJson json;
FirebaseJson json2;
FirebaseJson json3;
FirebaseJson json4;


String fireStatus = ""; 
                        
int up = 5; 
int down=4;
int buttondown = 13; // push button is connected
int buttonup = 3;

int tempdown = 0;
int tempup = 0;
int s=0;
// void printResult(FirebaseData &data);
FirebaseAuth auth;
FirebaseConfig config;

void streamCallback(FirebaseStream  data)
{

     if (data.dataType() == "string") {
      Serial.println(data.stringData());
      fireStatus=data.stringData();
      if (fireStatus == "on" ) 
      {        
                                                        // compare the input of led status received from firebase
      Serial.println("Led Turned ON");                                                        
      digitalWrite(up, LOW);                                                         // make external led ON
      } 
      else if (fireStatus == "off") 
      {   
                                                       // compare the input of led status received from firebase
      Serial.println("Led Turned OFF");
      digitalWrite(up, HIGH);                                                         // make external led OFF
    }
    else{
    Serial.println("Command Error! Please send ON/OFF");
    }
    

  } else {
    Serial.println(fbdo4.errorReason());
  }

}

void streamTimeoutCallback(bool timeout)
{
  if(timeout){
    //Stream timeout occurred
    Serial.println("Stream timeout, resume streaming...");
  }  
}
	
void streamCallback2(FirebaseStream  data)
{

    if (data.dataType() == "string") {
      Serial.println(data.stringData());
      fireStatus=data.stringData();
      if (fireStatus == "up" & tempdown == LOW) 
      {                                                          // compare the input of led status received from firebase
      Serial.println("Led Turned ON");                                                        
      digitalWrite(down, LOW);                                                         // make external led ON
      } 
      else if (fireStatus == "stop") 
      {                                                  // compare the input of led status received from firebase
      Serial.println("Led Turned OFF");
      digitalWrite(down, HIGH);                                                         // make external led OFF
    }
    else{
    Serial.println("Command Error! Please send ON/OFF");
    }
    

  } else {
    Serial.println(fbdo2.errorReason());
  }

}

void streamTimeoutCallback2(bool timeout)
{
  if(timeout){
    //Stream timeout occurred
    Serial.println("Stream timeout, resume streaming...");
  }  
}

void setup()
{

  Serial.begin(115200);
  pinMode(up, OUTPUT);
  digitalWrite(up, HIGH);  

  pinMode(down, OUTPUT);
  digitalWrite(down, HIGH); 

  pinMode(buttondown, INPUT_PULLUP);
  pinMode(buttonup, INPUT_PULLUP);
  
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

  Serial.print("Connecting to Wi-Fi");
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(300);
  }

  Serial.println();
  Serial.print("Connected with IP: ");
  Serial.println(WiFi.localIP());
  Serial.println();

config.host = FIREBASE_HOST;
config.api_key = API_KEY;

  Firebase.begin(&config,&auth);
  Firebase.reconnectWiFi(true);
Firebase.RTDB.setStreamCallback(&fbdo4, streamCallback, streamTimeoutCallback);
 Firebase.RTDB.setStreamCallback(&fbdo2, streamCallback2, streamTimeoutCallback2);

please help me am using platfomio i get this error token is not ready 

HELP Token is not ready

For some reason, custom tokens are taking a long time to be generated. I checked my router, but it seems fine. I tried using different esp32 boards, and they have the same issue. On the first run, it's instantaneous; however, after reboot it takes around 2 minutes to be generated. What can I do to make the process faster?

My general scheme for my project is as follows:

  1. I have an android app that creates a user and sends the UID to the esp32
  2. esp32 uses the UID to generate a token.
  3. esp32 waits for the "token ready" event in the callback
  4. esp32 uses the real-time database.

Sometimes, another issue that occurs is that my firebase project's website gets slower and my phone takes a while to sign in to firebase while the esp32 is generating a custom token.

HELP - REASON: INVALID_PASSWORD

I'm trying to use the Stream example from the Firebase_ESP_Client library and the following error is happening:
-> Set string ...
-> FAILED
-> REASON: INVALID_PASSWORD

Where do I need to validate the email and password to use in the code?

Send_Message examples throw missing header files error (ESP8266)

Hey, Im using Arduino Uno to program ESP8266 to send messages to my phone via FCM.
After inserting all keywords i got the following error for both the legacy and HTTPv1 examples:

C:...\Firebase-ESP-Client-main\src/Firebase_ESP_Client.h:42:17: fatal error: No such file or directory
#include <ETH.h>

I editet the file "Firebase_ESP_Client.h", so that ETH.h will not be imported. The program compiled properly.
I got it working for the HTTPv1 Protocol, but not for legacy, but its possible that there are non related problems.

Firestore: Store Float/Double value | create document with auto id

Hey, thanks for providing this tool, it's really awesome!

I just struggle with two points:
Running the Create_Documents.ino works fine for me. But now I want to store float/double values instead of int/bool. I could not find any documentation on that in your repository and the google docs. Could you help me out there?

Also the 2nd question is regarding creating a new document. In your example you have a counter and provide firebase with your own unique id. In my case I want to have multiple devices writing to the same Firebase and need to use the auto id generation therefore. Could you tell me how the syntax is for this here as well? Could not find this in the docs either.

Do you have a general approach of transferring js code syntax to your plugin? I'm quite familiar using firestore with js...

Thanks in advance!

Keep the good work up!

Can use set() and pathExisted()

Describe the bug
after V2.0.7 I can't verify a pathExisted() and can't publish a array on a RTDB.

To Reproduce
Firebase.RTDB.pathExisted(&fbdo2, Path.c_str())
this function is retuning "1" with a path that do not exists.

Firebase.RTDB.set(&fbdo2, Path.c_str(), relayConfig);
this function returns "Invalid data; couldn't parse JSON object, array, or value."

IDE and its version:

  • Arduino IDE 1.8.13

ESP8266 Arduino Core SDK version

  • ESP8266 (WEMOS D1 mini)
    SDK: 2.2.2-dev(38a443e)
    core:2_7_4

Code
code.zip

HELP - Updating map field value

Hi, is possible to somehow update just one of map's field value? If so, example would be awesome. Because whenever I try to use patch or update document via commit it deletes whole map and only the one field that I requested to update stays there with its value. Thank you

Not creating/updating a field in firestore document when path is long

Describe the bug

I am trying to create/update myTimestamp field in inouts_id2 document but it's showing as failed without any error message only when document path is long. Otherwise when document path is short, it's working fine.

To Reproduce

  • String documentPath = "school inout/west bengal/howrah/711101/wb0001/2020-2021/students/inouts_id2";

    Firebase Client v2.3.5
    
    Token info: type = id token, status = on request
    Token info: type = id token, status = ready
    Update a document... 
    FAILED
    REASON: 
    ------------------------------------
    
  • String documentPath = "aa/bb";

    Firebase Client v2.3.5
    
    Token info: type = id token, status = on request
    Token info: type = id token, status = ready
    Update a document... 
    PASSED
    JSON DATA: 
    ------------------------------------
    
    ok
    {
      "name": "projects/electronics-f66ec/databases/(default)/documents/aa/bb",
      "fields": {
        "myTimestamp": {
          "timestampValue": "2021-07-04T08:56:23Z"
        }
      },
      "createTime": "2021-07-03T14:22:13.620444Z",
      "updateTime": "2021-07-04T09:09:07.522699Z"
    }
    

Expected behavior

String documentPath = "school inout/west bengal/howrah/711101/wb0001/2020-2021/students/inouts_id2";

Firebase Client v2.3.5

Token info: type = id token, status = on request
Token info: type = id token, status = ready
Update a document... 
PASSED
JSON DATA: 
------------------------------------

ok
{
  "name": "projects/electronics-f66ec/databases/(default)/documents/school inout/west bengal/howrah/711101/wb0001/2020-2021/students/inouts_id2",
  "fields": {
    "myTimestamp": {
      "timestampValue": "2021-07-04T08:56:23Z"
    }
  },
  "createTime": "2021-07-03T14:22:13.620444Z",
  "updateTime": "2021-07-04T09:09:07.522699Z"
}

IDE and its version:

  • Arduino
  • Version 1.8.15

ESP8266 Arduino Core SDK version

  • Version 3.0.1

Additional context

Below code snippet for the reference:

    String content;
    FirebaseJson js;

    String documentPath = "school inout/west bengal/howrah/711101/wb0001/2020-2021/students/inouts_id2";

    js.set("fields/myTimestamp/timestampValue", "2021-07-04T14:41:23+05:30");
    js.toString(content);

    Serial.println("Update a document... ");

    /** if updateMask contains the field name that exists in the remote document and
       this field name does not exist in the document (content), that field will be delete from remote document
    */

    if (Firebase.Firestore.patchDocument(&fbdo, FIREBASE_PROJECT_ID, "" /* databaseId can be (default) or empty */, documentPath.c_str(), content.c_str(), "myTimestamp" /* updateMask */))
    {
      Serial.println("PASSED");
      Serial.println("JSON DATA: ");
      Serial.println("------------------------------------");
      Serial.println();
      Serial.printf("ok\n%s\n\n", fbdo.payload().c_str());
    }
    else
    {
      Serial.println("FAILED");
      Serial.println("REASON: " + fbdo.errorReason());
      Serial.println("------------------------------------");
      Serial.println(); 
    }

Issue with SD Card verification when performing Cloud Storage Upload

Describe the bug
Whilst testing the firebase upload, i noticed i kept getting a File I/O error even though the SD card is working correctly in the rest of my application. When i comment out the sd_test condition from FCS.cpp the uploads works.

To Reproduce
Steps to reproduce the behavior:

  1. Configure application using email/password auth.
  2. Copy and paste the upload code from the example
  3. Attempt to upload a .txt file to project cloud storage bucket
  4. Upload fails due to File I/O error.
  5. Comment out the lines FCS.cpp lines 232-236.
  6. Upload is successful.

Expected behavior
A clear and concise description of what you expected to happen.

Screenshots
If applicable, add screenshots to help explain your problem.

IDE and its version:

  • PlatformIO
  • Version 5.1.1

ESP8266/ESP32 Arduino Core SDK version

  • Espressif 32 3.2.0

Additional context
When i comment out the check from FCS.cpp lines 232-236, and the upload worked.

Two questions about this library and realtimes simultaneos connections

Greetings, first I'd like to say thanks for this library.
After reading the docs I have two matters unclear.

  1. If I listen to changed on two nodes for example with multipath, would this count on firebase as 2 simultaneous connections? Or only 1
  2. If I update some values of a node for example with setInt and be done with it, would this count as a connection? As Im not using a stream? Then I would be able to do as many continuous updates no matter connections only data transfer (As example blaze plan is 200k max connections)

Best regards

HELP - How could increment a value on firestore.

Hi, could be posible to perform on increment or decrement on an exist value on the firestore cloud.

i saw some examples like this, but is not found with this library.

firebase.firestore.FieldValue.increment(50)

firebase.firestore.FieldValue.increment(-50)

Regards.GC

HELP

Hello, i'm using firebase stream on ESP8288
it works good but i have the following question :
when i leave it for a long time it become idle and refuse to get any stream data until i restart it.
i noticed the following defines in common.h
#define KEEP_ALIVE_TIMEOUT 45000
#define STREAM_ERROR_NOTIFIED_INTERVAL 3000
#define STREAM_RECONNECT_INTERVAL 1000

the question is what if i need the connection alive forever without timeout?

HELP ! Messagin Legacy_API Send_Mesaggin (Flutter. firebase_messaging: ^9.1.0)

Hello, I have problems receiving the title and body of the notification in my Flutter App, from my ESP8266, using the example of inherited delivery method, however the data I do receive.
I / flutter (19818): Handling a background message 0: 1618972418215250% 0353096bf9fd7ecd
I / flutter (19818): {timestamp: 1609815454, unit: celsius, temp: 28}
I / flutter (19818): FlutterFire Messaging: An error occurred in your background messaging handler:
I / flutter (19818): NoSuchMethodError: The getter 'title' was called on null.
. From the FireBase console or from Node js I have no problems.
I am Spanish speaking and again I have actually signed up to try to solve this problem, so I apologize if I have not understood any community rules. Thank you very much community

incomplete type std::string for strings used in library (_host , _CaCert )

C:\Users\User\Documents\Arduino\libraries\arduino_107156\src/wcs/esp8266/FB_HTTPClient.h:109:15: error: field '_host' has incomplete type 'std::string' {aka 'std::__cxx11::basic_string'}
109 | std::string _host = "";

Error when compiling the files itself.

To Reproduce
Steps to reproduce the behavior:

  1. Update to arduino core 3.0.0
  2. Open any example from library
  3. Compile

Expected behavior
Was compiling flawlessly previously in Arduino core 2.7.4

IDE and its version:

  • Arduino, 1.8.14

ESP8266 Arduino Core SDK version

  • 3.0.0

ENHANCEMENT

Is it possible to implement onDisconnect for Firebase RTDB?

Hi @mobizt, thanks for such an amazing library.

I was wondering if it's possible to add onDisconnect functionality to Firebase RTDB.

If we're using websocket. It should be possible.

Let me know what you think.

Thanks.

RTDB callback dataType method returns unreadable data type

Describe the bug
I am using the board nodeMCU (esp8266) and RTDB streams with callback, When I print the data type of the value, I am getting strange characters. The same behavior occurs also in the Callback example.

To Reproduce
Steps to reproduce the behavior:

  1. Clone or copy the examples/RTDB/DataChangesListener/Callback project
  2. Configure the WIFI and Firebase credentials
  3. Build and flash the project into a board
  4. Open a serial monitor and see error

Expected behavior
In the serial monitor should appear the right data type of the payload (integer, float, double, boolean, string, JSON or blob)

Actual behavior
Instead, it prints incompressible characters
Screenshots
image

IDE and its version:
-PlatformIO

  • Version 5.1.1

ESP8266 Arduino Core SDK version

  • Version 3.0.0

Additional context
My OS is Windows, using wsl1 (ubuntu 18.04)
Same results on macOS Big Sur Arduino IDE version 1.8.15

Cannot build on PlatformIO

I'm using the example script provided and it fails at the linking stage producing a long error. I've included the complete build log at the end.

I'm not sure if this is supposed to happen but every time I delete Firebase ESP8266 Client it keeps coming back. Could this possibly be what's causing the error?

image

c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(Firebase_ESP_Client.cpp.o):(.bss.Firebase+0x0): multiple definition of `Firebase'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):(.bss.Firebase+0x0): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::FirebaseData()':
FB_Session.cpp:(.text._ZN12FirebaseDataC2Ev+0x10): multiple definition of `FirebaseData::FirebaseData()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseDataC2Ev+0x60): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::FirebaseData()':
FB_Session.cpp:(.text._ZN12FirebaseDataC2Ev+0x10): multiple definition of `FirebaseData::FirebaseData()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseDataC2Ev+0x60): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::clearNodeList()':
FB_Session.cpp:(.text._ZN12FirebaseData13clearNodeListEv+0x10): multiple definition of `FirebaseData::clearNodeList()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData13clearNodeListEv+0x10): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::setBSSLBufferSize(unsigned short, unsigned short)':
FB_Session.cpp:(.text._ZN12FirebaseData17setBSSLBufferSizeEtt+0x4): multiple definition of `FirebaseData::setBSSLBufferSize(unsigned short, unsigned short)'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData17setBSSLBufferSizeEtt+0x4): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::setResponseSize(unsigned short)':
FB_Session.cpp:(.text._ZN12FirebaseData15setResponseSizeEt+0x0): multiple definition of `FirebaseData::setResponseSize(unsigned short)'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData15setResponseSizeEt+0x0): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::pauseFirebase(bool)':
FB_Session.cpp:(.text._ZN12FirebaseData13pauseFirebaseEb+0x18): multiple definition of `FirebaseData::pauseFirebase(bool)'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData13pauseFirebaseEb+0x18): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::stopWiFiClient()':
FB_Session.cpp:(.text._ZN12FirebaseData14stopWiFiClientEv+0xc): multiple definition of `FirebaseData::stopWiFiClient()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData14stopWiFiClientEv+0xc): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::getWiFiClient()':
FB_Session.cpp:(.text._ZN12FirebaseData13getWiFiClientEv+0x0): multiple definition of `FirebaseData::getWiFiClient()'; .pio\build\esp12e\lib1d3\libFirebase 
ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData13getWiFiClientEv+0x0): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::eventType()':
FB_Session.cpp:(.text._ZN12FirebaseData9eventTypeEv+0x4): multiple definition of `FirebaseData::eventType()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData9eventTypeEv+0x4): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::ETag()':
FB_Session.cpp:(.text._ZN12FirebaseData4ETagEv+0x4): multiple definition of `FirebaseData::ETag()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData4ETagEv+0x4): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::getDataType(unsigned char)':
FB_Session.cpp:(.text._ZN12FirebaseData11getDataTypeEh+0x48): multiple definition of `FirebaseData::getDataType(unsigned char)'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData11getDataTypeEh+0x3c): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::dataType()':
FB_Session.cpp:(.text._ZN12FirebaseData8dataTypeEv+0xc): multiple definition of `FirebaseData::dataType()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData8dataTypeEv+0xc): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::getMethod(unsigned char)':
FB_Session.cpp:(.text._ZN12FirebaseData9getMethodEh+0x34): multiple definition of `FirebaseData::getMethod(unsigned char)'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData9getMethodEh+0x28): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::streamPath()':
FB_Session.cpp:(.text._ZN12FirebaseData10streamPathEv+0x4): multiple definition of `FirebaseData::streamPath()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData10streamPathEv+0x4): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::dataPath()':
FB_Session.cpp:(.text._ZN12FirebaseData8dataPathEv+0x4): multiple definition of `FirebaseData::dataPath()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData8dataPathEv+0x4): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::intData()':
FB_Session.cpp:(.text._ZN12FirebaseData7intDataEv+0x18): multiple definition of `FirebaseData::intData()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData7intDataEv+0x18): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::floatData()':
FB_Session.cpp:(.text._ZN12FirebaseData9floatDataEv+0xc): multiple definition of `FirebaseData::floatData()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData9floatDataEv+0xc): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::doubleData()':
FB_Session.cpp:(.text._ZN12FirebaseData10doubleDataEv+0xc): multiple definition of `FirebaseData::doubleData()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData10doubleDataEv+0xc): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::boolData()':
FB_Session.cpp:(.text._ZN12FirebaseData8boolDataEv+0x14): multiple definition of `FirebaseData::boolData()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData8boolDataEv+0x14): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::stringData()':
FB_Session.cpp:(.text._ZN12FirebaseData10stringDataEv+0x10): multiple definition of `FirebaseData::stringData()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData10stringDataEv+0x10): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::jsonString()':
FB_Session.cpp:(.text._ZN12FirebaseData10jsonStringEv+0x14): multiple definition of `FirebaseData::jsonString()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData10jsonStringEv+0x14): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::jsonObjectPtr()':
FB_Session.cpp:(.text._ZN12FirebaseData13jsonObjectPtrEv+0x0): multiple definition of `FirebaseData::jsonObjectPtr()'; .pio\build\esp12e\lib1d3\libFirebase 
ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData13jsonObjectPtrEv+0x0): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::jsonObject()':
FB_Session.cpp:(.text._ZN12FirebaseData10jsonObjectEv+0x0): multiple definition of `FirebaseData::jsonObject()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData10jsonObjectEv+0x0): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::jsonData()':
FB_Session.cpp:(.text._ZN12FirebaseData8jsonDataEv+0x0): multiple definition of `FirebaseData::jsonData()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData8jsonDataEv+0x0): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::jsonDataPtr()':
FB_Session.cpp:(.text._ZN12FirebaseData11jsonDataPtrEv+0x0): multiple definition of `FirebaseData::jsonDataPtr()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData11jsonDataPtrEv+0x0): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::pushName()':
FB_Session.cpp:(.text._ZN12FirebaseData8pushNameEv+0x4): multiple definition of `FirebaseData::pushName()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData8pushNameEv+0x10): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::isStream()':
FB_Session.cpp:(.text._ZN12FirebaseData8isStreamEv+0x0): multiple definition of `FirebaseData::isStream()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData8isStreamEv+0x0): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::httpConnected()':
FB_Session.cpp:(.text._ZN12FirebaseData13httpConnectedEv+0x0): multiple definition of `FirebaseData::httpConnected()'; .pio\build\esp12e\lib1d3\libFirebase 
ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData13httpConnectedEv+0x0): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::dataAvailable()':
FB_Session.cpp:(.text._ZN12FirebaseData13dataAvailableEv+0x0): multiple definition of `FirebaseData::dataAvailable()'; .pio\build\esp12e\lib1d3\libFirebase 
ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData13dataAvailableEv+0x0): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::streamAvailable()':
FB_Session.cpp:(.text._ZN12FirebaseData15streamAvailableEv+0x0): multiple definition of `FirebaseData::streamAvailable()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData15streamAvailableEv+0x0): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::mismatchDataType()':
FB_Session.cpp:(.text._ZN12FirebaseData16mismatchDataTypeEv+0x0): multiple definition of `FirebaseData::mismatchDataType()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData16mismatchDataTypeEv+0x0): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::bufferOverflow()':
FB_Session.cpp:(.text._ZN12FirebaseData14bufferOverflowEv+0x0): multiple definition of `FirebaseData::bufferOverflow()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData14bufferOverflowEv+0x0): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::getBackupFileSize()':
FB_Session.cpp:(.text._ZN12FirebaseData17getBackupFileSizeEv+0x0): multiple definition of `FirebaseData::getBackupFileSize()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData17getBackupFileSizeEv+0x0): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::getBackupFilename()':
FB_Session.cpp:(.text._ZN12FirebaseData17getBackupFilenameEv+0x4): multiple definition of `FirebaseData::getBackupFilename()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData17getBackupFilenameEv+0x4): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::fileTransferError()':
FB_Session.cpp:(.text._ZN12FirebaseData17fileTransferErrorEv+0x4): multiple definition of `FirebaseData::fileTransferError()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData17fileTransferErrorEv+0x4): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::payload()':
FB_Session.cpp:(.text._ZN12FirebaseData7payloadEv+0x8): multiple definition of `FirebaseData::payload()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData7payloadEv+0x4): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::errorReason()':
FB_Session.cpp:(.text._ZN12FirebaseData11errorReasonEv+0x18): multiple definition of `FirebaseData::errorReason()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData11errorReasonEv+0x18): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::httpCode()':
FB_Session.cpp:(.text._ZN12FirebaseData8httpCodeEv+0x0): multiple definition of `FirebaseData::httpCode()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData8httpCodeEv+0x0): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::streamTimeout()':
FB_Session.cpp:(.text._ZN12FirebaseData13streamTimeoutEv+0x10): multiple definition of `FirebaseData::streamTimeout()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData13streamTimeoutEv+0x14): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::clear()':
FB_Session.cpp:(.text._ZN12FirebaseData5clearEv+0x14): multiple definition of `FirebaseData::clear()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData5clearEv+0xb4): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::jsonArrayPtr()':
FB_Session.cpp:(.text._ZN12FirebaseData12jsonArrayPtrEv+0x78): multiple definition of `FirebaseData::jsonArrayPtr()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData12jsonArrayPtrEv+0x74): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::jsonArray()':
FB_Session.cpp:(.text._ZN12FirebaseData9jsonArrayEv+0x4): multiple definition of `FirebaseData::jsonArray()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData9jsonArrayEv+0x4): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::fileStream()':
FB_Session.cpp:(.text._ZN12FirebaseData10fileStreamEv+0x44): multiple definition of `FirebaseData::fileStream()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData10fileStreamEv+0x30): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::~FirebaseData()':
FB_Session.cpp:(.text._ZN12FirebaseDataD2Ev+0x14): multiple definition of `FirebaseData::~FirebaseData()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseDataD2Ev+0x6c): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::~FirebaseData()':
FB_Session.cpp:(.text._ZN12FirebaseDataD2Ev+0x14): multiple definition of `FirebaseData::~FirebaseData()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseDataD2Ev+0x6c): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::blobData()':
FB_Session.cpp:(.text._ZN12FirebaseData8blobDataEv+0x4): multiple definition of `FirebaseData::blobData()'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData8blobDataEv+0x4): first defined here
c:/users/simeon.ramjit/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\lib6fe\libFirebase Arduino Client Library for ESP8266 and ESP32.a(FB_Session.cpp.o): in function `FirebaseData::addNodeList(String const*, unsigned int)':FB_Session.cpp:(.text._ZN12FirebaseData11addNodeListEPK6Stringj+0x1c): multiple definition of `FirebaseData::addNodeList(String const*, unsigned int)'; .pio\build\esp12e\lib1d3\libFirebase ESP8266 Client.a(FirebaseESP8266.cpp.o):FirebaseESP8266.cpp:(.text._ZN12FirebaseData11addNodeListEPK6Stringj+0x20): first defined here
collect2.exe: error: ld returned 1 exit status
*** [.pio\build\esp12e\firmware.elf] Error 1

Expected behavior
The script builds and works as intended from the example docs

IDE and its version:

  • PlatformIO v5.1.0,
  • VSCode v1.52.1

Additional context
I'm using the ESP8266 board and this is my platform.ini file

[env:esp12e]
platform = espressif8266
board = esp12e
framework = arduino
monitor_speed = 115200
lib_deps = 
	mobizt/Firebase ESP8266 Client@^3.0.3
	khoih-prog/ESP8266TimerInterrupt@^1.0.3
	mobizt/Firebase Arduino Client Library for ESP8266 and ESP32@^1.1.0

HELP

@mobizt
Hello, I'm having a problem when using a function from the Firestore configurations. When I attempt to use Firebase.begin(&config, &auth); inside of my function, I get the following error and the device restarts:
Error:

Guru Meditation Error: Core  1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC      : 0x400dda5b  PS      : 0x00060e30  A0      : 0x800df942  A1      : 0x3ffd0420  
A2      : 0x3ffc7290  A3      : 0x00000002  A4      : 0x3ffc7700  A5      : 0x3ffc59e8  
A6      : 0x3ffe9724  A7      : 0x3fff65ec  A8      : 0x800dda5b  A9      : 0x3ffd0400  
A10     : 0x00000000  A11     : 0x00000000  A12     : 0x000000ff  A13     : 0x0000ff00  
A14     : 0x00ff0000  A15     : 0xff000000  SAR     : 0x00000010  EXCCAUSE: 0x0000001c  
EXCVADDR: 0x00000000  LBEG    : 0x4000c46c  LEND    : 0x4000c477  LCOUNT  : 0x00000000  

Backtrace: 0x400dda5b:0x3ffd0420 0x400df93f:0x3ffd0460 0x400e0e2d:0x3ffd0570 0x400d6310:0x3ffd0590 0x400d275b:0x3ffd0640 0x400d31c9:0x3ffd0860 0x400d20fd:0x3ffd09a0 0x400e4b31:0x3ffd09c0 0x4008e8e9:0x3ffd09e0

Rebooting...
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:8896
load:0x40080400,len:5816
entry 0x400806ac

The code, this is a cpp file:


// FIRESTORE CONFIG _________________________________________________________________________________________________________
#define FIREBASE_HOST "ds-com-aplicativo.firebaseio.com"
#define FIREBASE_PROJECT_ID "ds-com-aplicativo"
#define API_KEY "ds"

//Define Firebase Data object
FirebaseData fbdo;

//Json object to access data
FirebaseJsonData jsonData;

FirebaseAuth auth;
FirebaseConfig config;

// FIRESTORE CONFIG _________________________________________________________________________________________________________


void funcClass::create_document_database(char email[], char password[]){
  int count = 0;

  delay(1000);
  
  SerialBT.disconnect();

  Serial.println("Connecting to WiFi");
  WiFi.mode(WIFI_STA);
  WiFi.begin("test", "test");

  unsigned long startAttemptTime = millis();

  while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < WIFI_TIMEOUT_MS)
  {
    Serial.print(".");
    delay(500);
  }

  if (WiFi.status() != WL_CONNECTED){
    Serial.println("\nConnection FAILED!");
    delete_file_info();
    return;
  }else{
    Serial.println("\nSuccessful Connection!");
  }

  config.host = FIREBASE_HOST;
  config.api_key = API_KEY;

  auth.user.email = "[email protected]";
  auth.user.password = "test";

  Firebase.begin(&config, &auth);
  Firebase.reconnectWiFi(true);

  String content;
  FirebaseJson js;
  
  //We will create the nested document in the parent path "a0/b0/c0
  //a0 is the collection id, b0 is the document id in collection a0 and c0 is the collection id id in the document b0.
  //and d? is the document id in the document collection id c0 which we will create.
  String documentPath = "a0/b0/c0/d" + String(count);

  js.set("fields/count/integerValue", String(count).c_str());
  js.set("fields/status/booleanValue", count % 2 == 0);
  js.toString(content);
  
  count++;

  Serial.println("------------------------------------");
  Serial.println("Create a document...");

  if (Firebase.Firestore.createDocument(&fbdo, FIREBASE_PROJECT_ID, "" /* databaseId can be (default) or empty */, documentPath.c_str(), content.c_str()))
  {
      Serial.println("PASSED");
      Serial.println("------------------------------------");
      Serial.println(fbdo.payload());
      Serial.println("------------------------------------");
      Serial.println();
  }
  else
  {
      Serial.println("FAILED");
      Serial.println("REASON: " + fbdo.errorReason());
      Serial.println("------------------------------------");
      Serial.println();
  }
}

Unable to initialise via Ethernet

Describe the bug
Wen using the library with wifi works great, but I am not able to use it trough ethernet

To Reproduce
Steps to reproduce the behavior:

  1. connect the ESP32 with ethernet and do Firebase.begin(&config,&auth);

Expected behavior
Connect to firebase

Screenshots

Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC : 0x40191532 PS : 0x00060f30 A0 : 0x801957c5 A1 : 0x3f803d30
0x40191532: Firebase_Signer::handleSignerError(int) at /home/joel/Documents/fw-bird-esp32/VeltiumCharger/components/Arduino/libraries/Firebase-ESP-Client/src/signer/Signer.cpp:516

A2 : 0x3ffc7328 A3 : 0x00000003 A4 : 0x3ffc6460 A5 : 0x00000000
A6 : 0x3f803bd0 A7 : 0x00000000 A8 : 0x80191532 A9 : 0x3f803d10
A10 : 0x00000000 A11 : 0x3ffc7f88 A12 : 0xffffffff A13 : 0x00000000
A14 : 0x00000000 A15 : 0x00000000 SAR : 0x00000008 EXCCAUSE: 0x0000001c
EXCVADDR: 0x00000000 LBEG : 0x40098b00 LEND : 0x40098b0b LCOUNT : 0x00000000

IDE and its version:

  • ESP.IDF 4.0

ESP8266 Arduino Core SDK version

  • 4.0

Question

Describe the bug
streamAvailable() is returning false , first time it work fine but i install wifimanager library and doesn't work with it , then i delete wifimanager library and write the example only but not work again

Expected behavior
get true when change in realtime database

IDE and its version:

  • Arduino
  • Version 1.8.13

ESP8266 Arduino Core SDK version

  • Version 2.7.4

HELP - with downloading large files from firebase storage using esp32

I am trying to download large files (1-5 MB's) from my firebase storage onto an SD card through the esp32. When I use the examples for downloading files from firebase storage and cloud storage, only a very small fraction of the files actually download. However, when I try to upload the files from the SD card into firebase storage, everything works.

I've read that the files will need to be sent over in chunks, but I do not know how to implement that or if this library is capable of doing that. Any help or pointers would be greatly appreciated!

Whoops. Looks like I created this post using my work account. Sorry about that.

Compilation error

Here is an error I get after running the basic rtdb , any guide on this please?
Thanks.
In file included from C:\Users\Dev. Ben Salcie\Documents\Arduino\libraries\Firebase-ESP-Client-
main\src/common.h:45:0,

             from C:\Users\Dev. Ben Salcie\Documents\Arduino\libraries\Firebase-ESP-Client-main\src/Utils.h:37,

             from C:\Users\Dev. Ben Salcie\Documents\Arduino\libraries\Firebase-ESP-Client-main\src/signer/Signer.h:37,

             from C:\Users\Dev. Ben Salcie\Documents\Arduino\libraries\Firebase-ESP-Client-main\src/Firebase_ESP_Client.h:37,

             from C:\Users\Dev. Ben Salcie\Documents\Arduino\libraries\Firebase-ESP-Client- 
            main\examples\RTDB\Basic\Basic.ino:18:

              C:\Users\Dev. Ben Salcie\Documents\Arduino\libraries\Firebase-ESP-Client- 
               main\src/wcs/esp8266/FB_HTTPClient.h:50:30: fatal error: CertStoreBearSSL.h: No such file or directory

              #include <CertStoreBearSSL.h>

                          ^

Question

I am using firebase realtime database and example "AutomaticPlantWatering.ino". Compilation gives following error

sketch\AutomaticPlantWatering.ino.cpp.o:(.literal._Z5setupv+0x88): undefined reference to bool FB_RTDB::set<FirebaseJsonArray>(FirebaseData*, char const*, FirebaseJsonArray)' sketch\AutomaticPlantWatering.ino.cpp.o: In function setup()':

Also when i want to use following function
FirebaseData fbdo1;
FirebaseData fbdo2;
Firebase.RTDB.set(&fbdo2, path + "/Dimmer" + j + "Speed", 0);

program throw following error
no matching function for call to 'FB_RTDB::set(FirebaseData*, StringSumHelper&, int)'

Please help and at least add one example to set and read a variable from realtime database

failed with create/get/patch documents

Hello, mobizt, at first thanks you for providing such a complete Firebase lib, and here i test the Firestoreexample in last few days but i get the error.

Then i found the problem is the example code miss the setting config of host and api_key, as the follows.

  1. config.host = FIREBASE_HOST;
  2. config.api_key = API_KEY;

But in few days i try to modify the create_documents example that will create a documents 5 min a period, and then it cannot correctly upload a documents to Firestore.
As same as i change the period for 3(or 4) min, and it's works well.
I try to add the httpcode at the failed part, and it got 200 when uploads failed, so i guess the main problem may be that the Firebase connection will lost due to idle too long. So how can avoid this problem?

Here is my test code

/**

*/

//This example shows how to create a document in a document collection. This operation required Email/password, custom or OAUth2.0 authentication.

#if defined(ESP32)
#include <WiFi.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#endif
#include <Firebase_ESP_Client.h>

/* 1. Define the WiFi credentials */
#define WIFI_SSID "WIFI_AP"
#define WIFI_PASSWORD "WIFI_PASSWORD"

#define FIREBASE_HOST "PROJECT_ID.firebaseio.com"
#define API_KEY "API_KEY"

/* 2. Define the project ID */
#define FIREBASE_PROJECT_ID "PROJECT_ID"

/* 3. Define the user Email and password that alreadey registerd or added in your project */
#define USER_EMAIL "USER_EMAIL"
#define USER_PASSWORD "USER_PASSWORD"

//Define Firebase Data object
FirebaseData fbdo;

FirebaseAuth auth;
FirebaseConfig config;

unsigned long dataMillis = 0;
int count = 0;

void setup()
{

  Serial.begin(115200);

  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("Connecting to Wi-Fi");
  while (WiFi.status() != WL_CONNECTED)
  {
      Serial.print(".");
      delay(300);
  }
  Serial.println();
  Serial.print("Connected with IP: ");
  Serial.println(WiFi.localIP());
  Serial.println();

  config.host = FIREBASE_HOST;
  config.api_key = API_KEY;
  /* Assign the user sign in credentials */
  auth.user.email = USER_EMAIL;
  auth.user.password = USER_PASSWORD;

  Firebase.begin(&config, &auth);
  Firebase.reconnectWiFi(true);

#if defined(ESP8266)
//Set the size of WiFi rx/tx buffers in the case where we want to work with large data.
fbdo.setBSSLBufferSize(1024, 1024);
#endif
}

void loop()
{

  if (millis() - dataMillis > 300000 || dataMillis == 0)
  {
      dataMillis = millis();

      String content;
      FirebaseJson js;
      
      //We will create the nested document in the parent path "a0/b0/c0
      //a0 is the collection id, b0 is the document id in collection a0 and c0 is the collection id id in the document b0.
      //and d? is the document id in the document collection id c0 which we will create.
      String documentPath = "a0/b0/c0/d" + String(count);

      js.set("fields/count/integerValue", String(count).c_str());
      js.set("fields/status/booleanValue", count % 2 == 0);
      js.toString(content);
      
      count++;

      Serial.println("------------------------------------");
      Serial.println("Create a document...");

      if (Firebase.Firestore.createDocument(&fbdo, FIREBASE_PROJECT_ID, "" /* databaseId can be (default) or empty */, documentPath.c_str(), content.c_str()))
      {
          Serial.println("PASSED");
          Serial.println("------------------------------------");
          Serial.println(fbdo.payload());
          Serial.println("------------------------------------");
          Serial.println();
      }
      else
      {
          Serial.println("FAILED");
          Serial.println("REASON: " + fbdo.errorReason());
          Serial.println("HTTP CODE: " + fbdo.httpCode());
          Serial.println("------------------------------------");
          Serial.println();
      }
  }

}

get functions are slow?

Hi,
Any reason why the code snip below takes seconds to process?
On the previous version its pretty much instant.

Path = firmwareSubfolder + String("/update");  

if (Firebase.RTDB.getInt(&FBdata, Path.c_str())) {......

Many thanks

Firebase callFunction returns bad request when you add json data input.

Describe the bug
When using the firebase call function, adding data input returns bad request response from firebase. Two variations of this are observed.

  1. Json data input returns bad request 400 result from firebase server.
  2. When you just enter text and it succeeds, the req.body.data does not contain the data sent from the ESP32

Code:

FirebaseJson json;
json.set("data/message", "Some text data example.");
json.set("data/token", "Example of token data.");

String data;
json.toString(data, true);

// Serial.println(data.c_str());

if (Firebase.Functions.callFunction(&fbdo, FIREBASE_PROJECT_ID, PROJECT_LOCATION, "getAudio", data.c_str()))
{
  Serial.printf("ok\n%s\n\n", fbdo.payload().c_str());

}

To Reproduce
Steps to reproduce the behavior:

  1. Run code snipper example provoked above. You will get a bad request response.
  2. Replace the data.c_str() with just a plain string constant, and you also get a bad request reply.

Expected behavior
Json objects converted into string constants should appear as part of req.body.data object in cloud functions.

Screenshots
If applicable, add screenshots to help explain your problem.

IDE and its version:

  • PlatformIO - 5.1.1
  • Esspresif 32 3.2.0

Additional context
Can you also confirm if the library supports compatibility with both the cloud function onRequest and onCall functions.

Delay required to avoid "token is not ready"

Describe the bug
I tried forever to make the Beginner_Start_Here work, but kept getting "token is not ready".

I finally added a 3000ms delay here:

I'm not sure if there's a callback available for Firebase.begin. A 3000ms delay doesn't sound like the right way to fix this, but it does work around the problem. I'd love it if you could give this a look and see if there's a better way to address the problem. Thank you!

StoreProhibitedCause Exception using the example Storage/List_Files.ino

Describe the bug
I've tried the example List_Files.ino with the ESP8266 Wemos D1 Mini Lite but during the request it throws an exception (output at the end).

To Reproduce
Steps to reproduce the behavior:

  1. Open the example List_Files.ino
  2. Set all your Wifi and Firebase credentials.
  3. Upload and run
  4. See error

IDE and its version:

  • Platformio Core 5.1.0

Board and framework info
PLATFORM: Espressif 8266 (2.6.3) > WeMos D1 mini Lite
PACKAGES:

  • framework-arduinoespressif8266 3.20704.0 (2.7.4)
  • tool-esptool 1.413.0 (4.13)
  • tool-esptoolpy 1.30000.201119 (3.0.0)
  • toolchain-xtensa 2.40802.200502 (4.8.2)

Additional information

  • The Storage is working properly, I've used another Firebase.Storage functions like .getMetadata(...) and .upload(...) without problems.
  • Only the Wifi and Firebase credentials are the modified parts of the example, the rest of the code is the same
  • I just have 23 files on the Firebase Storage, the names are using 8.3 filename convention (from SD)
  • I dont know if this might help but according to a bunch of Serial prints, the exception could be happening at line 596 of FCS.cpp (json.get function)

Serial output

Connecting to Wi-Fi.
Connected with IP: 192.168.1.129

------------------------------------
Get file meta datatest...

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Exception (29):
epc1=0x4000e1b2 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000

>>>stack>>>

ctx: cont
sp: 3ffff800 end: 3fffffc0 offset: 0190
3ffff990:  00007b60 00000893 ffffffff 40205e74  
3ffff9a0:  3ffffa90 3ffef490 ffffffff 402082c0  
3ffff9b0:  3ffffa90 40205e74 00000020 40100abe  
3ffff9c0:  00000000 3fff98c8 3ffef490 4022800a  
3ffff9d0:  00000000 3fff74f8 00000000 4020f1ec  
3ffff9e0:  3ffffa0c 00000002 3ffffb90 00000001  
3ffff9f0:  3ffffa90 00000002 3ffffb90 402084e5  
3ffffa00:  3fff74b8 3fff7500 3ffef490 4022800a  
3ffffa10:  00000000 3fff74e4 3ffffe20 40228026  
3ffffa20:  3ffffa48 00000000 3ffffa90 3ffffb24  
3ffffa30:  3ffffbb0 3ffffe20 3ffffa90 402086a4  
3ffffa40:  3ffef490 0000000b 3ffee918 4026b509  
3ffffa50:  00000000 3ffffd70 3ffffe20 4020eecc  
3ffffa60:  3fff749c 3ffffe20 3fff749c 3fff768c  
3ffffa70:  3fff749c 3ffffd70 3ffee918 4020d273  
3ffffa80:  3ffed9d8 3ffeff24 3ffefabc 00000030  
3ffffa90:  00000000 ffffffff ffffffff ffffffff  
3ffffaa0:  00000000 ffffffff 00000000 ffffffff  
3ffffab0:  ffffffff 00000078 00000000 00000100  
3ffffac0:  00000001 3fff6a14 3fff498c 3fff3824  
3ffffad0:  3fff27c4 3fff2cb4 3fff2a8c 3fff2a94  
3ffffae0:  3fff29f4 3fff4a4c 3fff68fc 3fff29ec  
3ffffaf0:  3fff6904 3fff690c 3fff6914 3fff6924  
3ffffb00:  3fff6934 3fff6944 3fff694c 3fff695c  
3ffffb10:  3fff696c 3fff697c 3fff698c 3fff7494  
3ffffb20:  3fff87a8 3ffef490 3ffe8f01 00000008  
3ffffb30:  4025867e 3ffec548 4025862f 3fff752c  
3ffffb40:  3fff753c 3fff753c 00000000 00000000  
3ffffb50:  00000000 00000000 00000000 00000000  
3ffffb60:  00000000 00000000 80000020 00000000  
3ffffb70:  00000000 00000005 00000000 00000000  
3ffffb80:  3ffe8d00 65646e75 656e6966 89000064  
3ffffb90:  00000000 00000000 00000000 00000000  
3ffffba0:  00000000 00000000 00000000 00000000  
3ffffbb0:  3ffef490 40104f7f 3fff2c74 3fff2b44  
3ffffbc0:  3fff768c 3fff74cc 00000005 ffffffff  
3ffffbd0:  ffffffff 00000001 00000000 00000000  
3ffffbe0:  00000001 00000004 ffffffff 00000005  
3ffffbf0:  00000001 00000000 00000001 3fff26c4  
3ffffc00:  3fff3074 3fff281c 3fff252c 3fff2534  
3ffffc10:  3ffeffcc 3ffeffd4 3fff2fc4 3fff2fcc  
3ffffc20:  3fff2fdc 3fff2fbc 3fff2fe4 3fff2fec  
3ffffc30:  3fff2ff4 3fff3004 3fff3014 3fff3024  
3ffffc40:  3fff302c 3fff2c1c 3fff2c2c 3fff2c3c  
3ffffc50:  3fff2c4c 3fff303c 3fff6838 3ffef490  
3ffffc60:  3ffe9660 2c9f0300 4000050c 3fffc278  
3ffffc70:  401025d8 00000000 00000000 00000000  
3ffffc80:  00000000 00000000 00000000 3fff2c5c  
3ffffc90:  3fff2c5c 3fff2c6c 3fff29fc 0021002f  
3ffffca0:  00000056 00000000 00000000 fffffffe  
3ffffcb0:  00000000 00000000 00000000 69727473  
3ffffcc0:  6500676e 86000064 00000103 00000003  
3ffffcd0:  0000002e 0000002e 0000004f 00000003  
3ffffce0:  00000000 00000000 3ffef490 00418937  
3ffffcf0:  3fff405c 3fff305c 00000000 00000000  
3ffffd00:  000000c8 0000087f 0000087f 00000000  
3ffffd10:  00000000 00000000 00000300 00000000  
3ffffd20:  00000000 00000b72 00000000 00000000  
3ffffd30:  00000000 00000000 00000000 00000000  
3ffffd40:  00000000 3ffef490 3fff2c90 3ffef490  
3ffffd50:  3ffef490 3ffef490 3ffef490 3ffef490  
3ffffd60:  3ffef490 3ffef490 3ffef490 40100a87  
3ffffd70:  3fff6800 3fff2a60 80c6a7f0 00000000  
3ffffd80:  00000000 0e13b00b 00000000 00000000  
3ffffd90:  00000000 4bc6a700 00000b88 80000430  
3ffffda0:  00000000 00000000 00000000 00000000  
3ffffdb0:  00000000 00000000 00000000 00000000  
3ffffdc0:  3ffef490 0000005c 3fff2734 0021002f  
3ffffdd0:  09000056 00000000 00000000 40204626  
3ffffde0:  00000000 00000000 3fff0500 69727473  
3ffffdf0:  0000676e 86000b71 3fff0103 00000003  
3ffffe00:  0000002e 0000002e 0000004f 00000003  
3ffffe10:  00000000 00000000 3fff7660 4021c0ea  
3ffffe20:  6f727265 6f632f72 8a006564 3ffef490  
3ffffe30:  ffffffff 3fff36e8 00000000 00000000  
3ffffe40:  00000000 00000d50 00000020 3fff4a68  
3ffffe50:  3fff6c0c 00000000 3fff6024 3fff6024  
3ffffe60:  00000000 0000087f 00000001 0000006e  
3ffffe70:  00000000 3ffeef80 0000087f 00000289  
3ffffe80:  0000087f 00000d7f 3ffeedd4 0000087f  
3ffffe90:  3ffffd70 3ffffd90 00000880 4020dec6  
3ffffea0:  4026b587 3ffffee8 3fffff40 3ffee918  
3ffffeb0:  4026b587 3ffef1f8 3fffff40 4020daa0  
3ffffec0:  3fff2688 000001bb 00000400 4022800a  
3ffffed0:  402206b8 ea1ed9ac 402206b8 40228026  
3ffffee0:  3fff2408 000001bb 3fff4a68 3fff3838  
3ffffef0:  3ffeed18 3ffeef80 3ffee918 3ffe871f  
3fffff00:  3ffeef80 3fffff40 3ffee918 00000000  
3fffff10:  3ffeef80 3fffff40 3ffee918 4020dba8  
3fffff20:  4020e2ec 3ffef230 3ffee918 3ffe871f  
3fffff30:  3ffe875e 3ffeef80 3ffee918 4020dc1b  
3fffff40:  3ffef490 3ffef490 3fff2500 3ffef490  
3fffff50:  00000000 00000005 3ffef230 4020e7cc  
3fffff60:  3ffee7d0 3ffee918 3ffef230 402032c8  
3fffff70:  402206b8 8101a8c0 feefeffe feefeffe  
3fffff80:  feefeffe feefeffe feefeffe feefeffe  
3fffff90:  feefeffe feefeffe feefeffe 3ffef2c8  
3fffffa0:  3fffdad0 00000000 3ffef288 4020f3f4  
3fffffb0:  feefeffe feefeffe 3ffe8538 40100229  
<<<stack<<<

last failed alloc call: 40205E74(2195)

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Firestore update

hello,

first many compliments for the library.

As I'm using Firestore I would like to ask if stream , that in Firestore are realtime updates, are supported

thanks

Updating timestamp in Firestore Document - Suggestion

First of all, we want to say thank you @mobizt for bringing this library. It's making the development life easier. Currently, we are facing a problem in updating the timestamp field of type timestampValue in firestore document.

We checked that timestamp field of type timestampValue is coming during Get document but we are not able to Update timestamp field in the same type. Can you please suggest/share code snippet on how to update the timestamp field using this library.

Below is the code snippet we are using:

void updateDataToFirestore() {

  timeClient.update();
  unsigned long unix_epoch = timeClient.getEpochTime(); //unix_epoch holds unix time in milliseconds

  String content;
  FirebaseJson js;

  String documentPath = "school inout/west bengal/howrah/711101/wb0001/2020-2021/students/inouts_id2";

  js.set("fields/timestamp/timestampValue", unix_epoch); //undefined reference issue coming during compile time
  js.set("fields/timestamp/timestampValue", DateTime(unix_epoch*1000));  // issue coming during compile time
  
  js.toString(content);

  Serial.println("------------------------------------");
  Serial.println("Update a document...");

  /** if updateMask contains the field name that exists in the remote document and 
   * this field name does not exist in the document (content), that field will be delete from remote document
   */

  if (Firebase.Firestore.patchDocument( & fbdo, FIREBASE_PROJECT_ID, "" /* databaseId can be (default) or empty */ , documentPath.c_str(), content.c_str(), "timestamp" /* updateMask */ )) {
    Serial.println("PASSED");
    Serial.println("------------------------------------");
    Serial.println(fbdo.payload());
    Serial.println("------------------------------------");
    Serial.println();
  } else {
    Serial.println("FAILED");
    Serial.println("REASON: " + fbdo.errorReason());
    Serial.println("------------------------------------");
    Serial.println();
  }
}

Create Document - Firestore failed

Hey Mobizt,

Just love your repos man!

I am trying to get ahold of the create document example, but getting this error:

Create a document...
FAILED
REASON:

Can you please check this.

P.S. - I am using Nodemcu v0.9

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.