BME280 + MQTT + Enc...
 
Powiadomienia
Wyczyść wszystko

BME280 + MQTT + Encja Temp/Wilg/Baro

5 Wpisów
3 Użytkownicy
0 Likes
813 Wyświetleń
(@przemo)
Wpisów: 18
Praktykant
Autor tematu
 

Cześć

Po MQTT wysylam poniższa fraze

{"command": "udevice", "idx": 321, "nvalue": 0, "svalue": "22.77; 41.19; 1007.90", "parse": true}

Przy prubie dodania w domoticzu wirtualnego sensora Temp/Wilg/Baro parametry nie sa poprawnie wyswietlane w zakladce Temperatura. Dane w zakladce Urzadzenia pod danym idx sa aktualizowane.

Natomiast konfiguracja virtualnego sensora Temp/Wilg wyswietla w encji dane poprawnie.

Czy ktoś moze mnie naprowadzić jak poprawnie powinna wygladać fraza MQTT w przypadku konfiguracji virtualnego sensora dla 3 wartosci ?

 

Pozdrawiam

 
Dodane : 14/02/2022 4:24 pm
(@steel_rat)
Wpisów: 603
Ekspert
 

Znalazłem takie coś.

Temperature+Humidity+Barometer

The temperature+Humidity+Barometer sensor will show just that and an environment level and a prediction. You can send digits for the temperature but only the first is displayed (it is rounded off). The humidity only displays whole numbers (chops off any digits).

 

{"command":"udevice", "idx":1234, "svalue":"tm;hu;lv;ba;pr"}

where tm is the temperature, hu is the humidity and lv is the environment level, ba is the pressure and pr is the prediction.

 

lv can have the following values:

 

0, normal

1, comfortable

2, dry

3, wet

pr can have the following values:

 

0, no prediction

1, sunny

2, partly cloudy

3, cloudy

4, rain

5, unknown

(oddly enough 6 cloudy/rain does not work for this sensor)

 
Dodane : 14/02/2022 4:41 pm
adrian
(@adrian)
Wpisów: 3981
Szefu Admin Zasłużony dla Forum, Patron Strony
 

@przemo w AFE Firmware wysyłamy w taki sposób

{"command":"udevice", "idx":1234, "svalue":"temperatura;wilgotoność;status_wilgotności;ciśnienie;0"}

status_wilgotności wyliczam tak

byte AFESensorsCommon::convertHumidyStatusDomoticz(float humidity) {
  //  https://www.airthings.com/resources/everything-you-need-to-know-about-humidity 
  if (humidity >= 70) {
    return domoticzHumidityWet;
  } else if (humidity >= 60) {
    return domoticzHumidityNormal;
  } else if (humidity >= 30) {
    return domoticzHumidityComfortable;
  } else if (humidity >= 25) {
    return domoticzHumidityNormal;
  } else {
    return domoticzHumidityDry;
  }
}

Wartości które są za domoticzHumidityWet itd @steel_rat napisał powyżej

 

Na końcu zero, bo z samego czujnika temp, wilgotność, ciśnienie ciężko przewidzieć czy jest pochmurno, deszczowo itd.

Pzdr.

 
Dodane : 14/02/2022 10:34 pm
(@przemo)
Wpisów: 18
Praktykant
Autor tematu
 

@steel_rat

Z Twoja pomoca udalo sie poprawnie odczytać w Domoticz wartości.

@adrian

Dzieki za sugestie co do statusu wilgotności. Dlaczego w swoim zakresie wilgotności masz 2 razy uwzgledniony status  Normal (zakres 25-30 i 60-70) ?

Na jednym z forum znalazlem jeszcze jak jest wyliczany ostatni argument na podstawie ciśnienia.

// Algorithm found here
//  http://www.freescale.com/files/sensors/doc/app_note/AN3914.pdf 
// Pressure in hPa -->  forecast done by calculating kPa/h
int sample(float pressure)
{
  // Calculate the average of the last n minutes.
  int index = minuteCount % LAST_SAMPLES_COUNT;
  lastPressureSamples[index] = pressure;

  minuteCount++;
  if (minuteCount > 185)
  {
    minuteCount = 6;
  }

  if (minuteCount == 5)
  {
    pressureAvg = getLastPressureSamplesAverage();
  }
  else if (minuteCount == 35)
  {
    float lastPressureAvg = getLastPressureSamplesAverage();
    float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
    if (firstRound) // first time initial 3 hour
    {
      dP_dt = change * 2; // note this is for t = 0.5hour
    }
    else
    {
      dP_dt = change / 1.5; // divide by 1.5 as this is the difference in time from 0 value.
    }
  }
  else if (minuteCount == 65)
  {
    float lastPressureAvg = getLastPressureSamplesAverage();
    float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
    if (firstRound) //first time initial 3 hour
    {
      dP_dt = change; //note this is for t = 1 hour
    }
    else
    {
      dP_dt = change / 2; //divide by 2 as this is the difference in time from 0 value
    }
  }
  else if (minuteCount == 95)
  {
    float lastPressureAvg = getLastPressureSamplesAverage();
    float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
    if (firstRound) // first time initial 3 hour
    {
      dP_dt = change / 1.5; // note this is for t = 1.5 hour
    }
    else
    {
      dP_dt = change / 2.5; // divide by 2.5 as this is the difference in time from 0 value
    }
  }
  else if (minuteCount == 125)
  {
    float lastPressureAvg = getLastPressureSamplesAverage();
    pressureAvg2 = lastPressureAvg; // store for later use.
    float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
    if (firstRound) // first time initial 3 hour
    {
      dP_dt = change / 2; // note this is for t = 2 hour
    }
    else
    {
      dP_dt = change / 3; // divide by 3 as this is the difference in time from 0 value
    }
  }
  else if (minuteCount == 155)
  {
    float lastPressureAvg = getLastPressureSamplesAverage();
    float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
    if (firstRound) // first time initial 3 hour
    {
      dP_dt = change / 2.5; // note this is for t = 2.5 hour
    }
    else
    {
      dP_dt = change / 3.5; // divide by 3.5 as this is the difference in time from 0 value
    }
  }
  else if (minuteCount == 185)
  {
    float lastPressureAvg = getLastPressureSamplesAverage();
    float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
    if (firstRound) // first time initial 3 hour
    {
      dP_dt = change / 3; // note this is for t = 3 hour
    }
    else
    {
      dP_dt = change / 4; // divide by 4 as this is the difference in time from 0 value
    }
    pressureAvg = pressureAvg2; // Equating the pressure at 0 to the pressure at 2 hour after 3 hours have past.
    firstRound = false; // flag to let you know that this is on the past 3 hour mark. Initialized to 0 outside main loop.
  }

  int forecast = UNKNOWN;
  if (minuteCount < 35 && firstRound) //if time is less than 35 min on the first 3 hour interval.
  {
    forecast = UNKNOWN;
  }
  else if (dP_dt < (-0.25))
  {
    forecast = THUNDERSTORM;
  }
  else if (dP_dt > 0.25)
  {
    forecast = UNSTABLE;
  }
  else if ((dP_dt > (-0.25)) && (dP_dt < (-0.05)))
  {
    forecast = CLOUDY;
  }
  else if ((dP_dt > 0.05) && (dP_dt < 0.25))
  {
    forecast = SUNNY;
  }
  else if ((dP_dt >(-0.05)) && (dP_dt < 0.05))
  {
    forecast = STABLE;
  }
  else
  {
    forecast = UNKNOWN;
  }

  // uncomment when debugging
  //Serial.print(F("Forecast at minute "));
  //Serial.print(minuteCount);
  //Serial.print(F(" dP/dt = "));
  //Serial.print(dP_dt);
  //Serial.print(F("kPa/h --> "));
  //Serial.println(weather[forecast]);

  return forecast;
}
 
Dodane : 15/02/2022 4:41 pm
adrian
(@adrian)
Wpisów: 3981
Szefu Admin Zasłużony dla Forum, Patron Strony
 

@przemo na podstawie zakresów pod tym linkiem w tej metodzie co Ci załączyłem

image
 
Dodane : 15/02/2022 4:45 pm
Udostępnij: