Как структурировать данные моего датчика при отправке в Firebase из NodeMCU? - PullRequest
0 голосов
/ 02 февраля 2019

Я отправил данные моего датчика DHT из моего NodeMCU в Firebase со следующим кодом.

void loop() {
  if(timeSinceLastRead > 2000) {
    float h = dht.readHumidity();
    float t = dht.readTemperature();
    float f = dht.readTemperature(true);
    if (isnan(h) || isnan(t) || isnan(f)) {
      Serial.println("Failed to read from DHT sensor!");
      timeSinceLastRead = 0;
      return;
    }

    float hif = dht.computeHeatIndex(f, h);
    float hic = dht.computeHeatIndex(t, h, false);

    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.print(t);
    Serial.print(" *C ");
    Serial.print(f);
    Serial.print(" *F\t");
    Serial.print("Heat index: ");
    Serial.print(hic);
    Serial.print(" *C ");
    Serial.print(hif);
    Serial.println(" *F");
    Firebase.setFloat("Temp",t);
    Firebase.setFloat("Humidity",h);
    Firebase.setFloat("HeatIndex",hic);

    timeSinceLastRead = 0;
  }
  delay(100);
  timeSinceLastRead += 100;
 }

Он успешно отправил данные в Firebase, но в следующей структуре.

Field-Root
|_ HeatIndex: <value>
|_ Humidity : <value>
|_ Temp     : <value>

Но у меня есть еще два пользовательских идентификатора, которые я хочу отправить в Firebase, и мне нужна следующая структура.

Field-Root
|_ ID1
   |_ ID2
      |_ HeatIndex: <value>
      |_ Humidity : <value>
      |_ Temp     : <value>

Но я не получаю нужную мне иерархическую структуру, где вместо этогоЯ получаю старую структуру.Как мне это получить?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Первый параметр метода setFloat позволяет указать путь к данным.

From https://firebase -arduino.readthedocs.io / en / latest / # _ CPPv2N15FirebaseArduino8setFloatERK6Stringf

void setFloat(const String &path, float value)

  Writes the float value to the node located at path equivalent to 
  the REST API’s PUT.

parameters
  path: The path inside of your db to the node you wish to update.
  value: Float value that you wish to write. 

Таким образом, вы можете использовать путь вроде:

Firebase.setFloat("ID-Floor1/ID-Bathroom/Temp", 1.1);
Firebase.setFloat("ID-Floor1/ID-Bathroom/Humidity", 2.2);
Firebase.setFloat("ID-Floor1/ID-Bathroom/HeatIndex", 3.3);

, который будет отображаться в Firebase как:

Firebase screenshot

Вы также можете минимизировать манипуляции со строками в зависимости от того, когда доступны ID1 и ID2.

Если они известны в вашей настройке, вы можете жестко закодировать пути, как в примере выше.

В противном случае вы можете сформировать путь (предпочтительно один раз), используя:

String path = Id1;
path.concat("/");
path.concat(Id2);
path.concat("/");

String temperaturePath = path;
temperaturePath.concat("Temp");
String humidityPath = path;
humidityPath.concat("Temp");
String heatIndexPath = path;
heatIndexPath.concat("Temp");

Затем в функции loop используйте:

Firebase.setFloat(temperaturePath, 1.1);
Firebase.setFloat(humidityPath, 2.2);
Firebase.setFloat(heatIndexPath, 3.3);
0 голосов
/ 05 февраля 2019

Чтобы получить желаемую структуру базы данных, внутри функции setFloat вам потребуется получить ссылку на ID2 перед записью значений с плавающей запятой t, h или hic, используя код, подобный приведенному ниже (это предполагает, что Field-Root показан в вашей структуре БДявляется корнем вашей базы данных Firebase)

function setFloat(fieldName, fieldValue) {
    //.....
    firebase.database().ref( ID1 + '/' + ID2 + '/' + fieldName).set(fieldValue);
    //.....
}

Это даст вам структуру ниже

Field-Root
|_ ID1
   |_ ID2
      |_ HeatIndex: <value>
      |_ Humidity : <value>
      |_ Temp     : <value>
...