klasa dla SDS011 (KPOP)

malarz
Posts: 135
Joined: Wed Jan 27, 2021 4:04 pm

Post

Jak już gdzieś pisałem zamierzam zbudować sobie stację pogodową bazując na Nettigo. Soft ma być świeży, ze wszystkimi obecnymi możliwościami SD, docelowo konfigurowalny via SD. Na razie jestem na zbieraniu bibliotek do obsługi kolejnych kanałów i doszedłem do SDS011.

Z tego co znalazłem na forum to jest wiekowy kod shimano73
shimano73 wrote: Mon Aug 19, 2024 3:16 pm Soft do tej stacij jest już bardzo "wiekowy" dodatkowo nie ma w nim kanałów ogólnego przeznaczenia a to oznacza że nie które pomiary są stopniach Celciusza np nasłonecznienie czy pomiary smogu .
Na forum sa osoby ktore zrobiły softy do swoich stacji po"nowemu " moż ktoś się podzieli , niestety ja cierpie na chroniczny brak czasu i/lub chęci :lol:
viewtopic.php?t=5131
viewtopic.php?t=8574
https://github.com/shimano73/Stacja_pog ... e/main/lib
wykorzystujący bibliotekę sds-dust-sensors-arduino-library
https://github.com/lewapek/sds-dust-sen ... no-library
i zrobiony jako klasa :P , ale dziedzicząca kanał temperatury :cry:

Wadą tego rozwiązania wydaje się to co zauważył krycha88
krycha88 wrote: Mon May 03, 2021 7:31 am Ogólnie jakoś dziwnie jest napisana ta biblioteka SdsDustSensor.h stosowane są w niej delay(500)...
:cry:

Znalazłem też projekt SOYERa
SOYER wrote: Sun Nov 10, 2024 5:19 pm Cześć, z racji tego, że jeden z użytkowników prosił mnie o dodanie dodatkowo obsługi czujnika SDS011, to poniżej wklejam szkic który to powinien robić. Jednak fizycznie nie mam tego czujnika, więc nie mam możliwości sprawdzenia czy ta biblioteka zastosowana i cały szkic będą współdziałać z czujnikiem.
Nie zapomnijcie dodać biblioteki:
https://github.com/ricki-z/SDS011
uzupełnić dane wifi, GUID i AUTH, oraz dane do logowania do serwera.
viewtopic.php?t=16100
viewtopic.php?t=16151
wykorzystujący bibliotekę ricki-z/SDS011
https://github.com/ricki-z/SDS011
i zrobiony na kanale KPOP :P , ale bezpośrednio w szkicu a nie jako klasa :cry:

Tak więc mi wychodzi, że muszę napisać nową klasę, która dziedzicząc po KPOP będzie do wykorzystania w dowolnym projekcie. I mam związane z tym kilka pytań:
1. Czy czegoś gotowego nie przeoczyłem - nie ma sensu powtarzać roboty; może ktoś już to zrobił i by się podzielił jak to napisał shimano73 w cytowanym poście
2. Która biblioteka do odczytu (sds-dust-sensors-arduino-library czy ricki-z/SDS011) jest lepsza i dlaczego akurat tę wybraliście.
3. Może ktoś ma jakieś doświadczenia z jeszcze inną biblioteką - chętnie posłucham.
4. Na co powinienem zwrócić uwagę.
5. Jakieś pomysły dodatkowe; może które rzeczy powinny być konfigurowalne za pośrednictwem metod klasy.

Uprzedzając pytania:
1. Korzystając z sugestii @klew zamierzam zasugerować (requestem) dołączenie tej klasy do supla-device
2. Kolejna rzecz na liście to obsługa grzałki HECA, też chyba jako klasa do jednolinijkowego włączenia w szkicu (https://nettigo.pl/products/nettigo-air ... sterujacym) ale jeszcze nie analizowałem kodu shimano w tym zakresie ani nie przeszukałem forum pod tym kątem. Ale założę na to nowy wątek po skończeniu pracy nad SDSem.
Próbuję przerobić pomysły na działające projekty w ArduinoIDE.
malarz
Posts: 135
Joined: Wed Jan 27, 2021 4:04 pm

Post

Biblioteka powoli staje na nogi. Z klasą trochę wzorowałem się na src/supla/sensor/therm_hygro_press_meter.cpp (jedyna znana mi klasa, które tworzy dwa kanały) Mam jednak problemy z konfiguracją drugiego kanału.

Code: Select all

// Dependencies:
// https://github.com/ricki-z/SDS011

#ifndef SRC_SUPLA_SENSOR_SDS011_H_
#define SRC_SUPLA_SENSOR_SDS011_H_

#include <supla/sensor/general_purpose_measurement.h>

#include <SDS011.h>
#include <supla/log_wrapper.h>

namespace Supla {
namespace Sensor {
class sds011 : public GeneralPurposeMeasurement {
 public:
  explicit sds011(int rx_pin, int tx_pin, int refresh = 10000)
      : GeneralPurposeMeasurement(nullptr, false) {
    refreshIntervalMs = refresh;
    sensor.begin(rx_pin, tx_pin);
  
    setDefaultUnitAfterValue("μg/m³");
    getChannel()->setInitialCaption("PM 2.5");
    getChannel()->setDefaultIcon(8);

    pm10channel.setType(SUPLA_CHANNELTYPE_GENERAL_PURPOSE_MEASUREMENT);
    pm10channel.setDefault(SUPLA_CHANNELFNC_GENERAL_PURPOSE_MEASUREMENT);
//    pm10channel.setDefaultUnitAfterValue("μg/m³");
    pm10channel.setInitialCaption("PM 10");
    pm10channel.setDefaultIcon(8);
  }

  void onInit() override {
    readValuesFromDevice();
    channel.setNewValue(getValue());
    pm10channel.setNewValue(gePm10tValue());
  }

  void iterateAlways() {
    if (millis() - lastReadTime > refreshIntervalMs) {
      readValuesFromDevice();
      channel.setNewValue(getValue());
      pm10channel.setNewValue(gePm10tValue());
    }
  }

  Supla::Channel *getSecondaryChannel() {
    return &pm10channel;
  }

  const Supla::Channel *getSecondaryChannel()
      const {
    return &pm10channel;
  }

  void addAction(uint16_t action,
        ActionHandler &client,
        uint16_t event,
        bool alwaysEnabled) {
    // delegate secondary channel event registration to secondary channel
    switch (event) {
      case Supla::ON_SECONDARY_CHANNEL_CHANGE: {
        getSecondaryChannel()->addAction(action, client, event, alwaysEnabled);
        return;
      }
    }
    // delegate all other events to primary channel
    channel.addAction(action, client, event, alwaysEnabled);
  }

  void addAction(uint16_t action,
        ActionHandler *client,
        uint16_t event,
        bool alwaysEnabled) {
    addAction(action, *client, event, alwaysEnabled);
  }

protected:
  void readValuesFromDevice() {
    sensor.read(&pm25, &pm10);
    lastReadTime = millis();
  }

  double getValue() override {
    return pm25;
  }

  double gePm10tValue() {
    return pm10;
  }

  ::SDS011 sensor;

  float pm25 = NAN;
  float pm10 = NAN;

  Channel pm10channel;
};

}  // namespace Sensor
}  // namespace Supla

#endif  // SRC_SUPLA_SENSOR_SDS011_H_
W cloudzie w drugim kanale pojawia się komunikat:
Konfiguracja jeszcze nie jest dostępna. Poczekaj, aż urządzenie się podłączy.
I nie wiem jak ustawić jednostki, bo linia

Code: Select all

pm10channel.setDefaultUnitAfterValue("μg/m³");
nie działa z powodu braku metody w klasie (w powyższym kodzie wykomentowana).

Nie wiem czy są potrzebne metody getSecondaryChannel i addAction, ale ich dodanie spowodował np. aktywację zmiany domyślnej nazwy kanału.
Próbuję przerobić pomysły na działające projekty w ArduinoIDE.
User avatar
klew
Posts: 10453
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

Klasa Chanel to nie jest kolejny kpop i tego tak nie można dodać.
Lepiej będzie jeśli dodasz klasę dziedzicząca po Supla:: Element, która będzie zawierała dwie instancje klasy kpop.
SOYER
Posts: 1312
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry

Post

malarz wrote: Mon Jan 20, 2025 6:25 pm Jak już gdzieś pisałem zamierzam zbudować sobie stację pogodową bazując na Nettigo. Soft ma być świeży, ze wszystkimi obecnymi możliwościami SD, docelowo konfigurowalny via SD. Na razie jestem na zbieraniu bibliotek do obsługi kolejnych kanałów i doszedłem do SDS011.

Z tego co znalazłem na forum to jest wiekowy kod shimano73
shimano73 wrote: Mon Aug 19, 2024 3:16 pm Soft do tej stacij jest już bardzo "wiekowy" dodatkowo nie ma w nim kanałów ogólnego przeznaczenia a to oznacza że nie które pomiary są stopniach Celciusza np nasłonecznienie czy pomiary smogu .
Na forum sa osoby ktore zrobiły softy do swoich stacji po"nowemu " moż ktoś się podzieli , niestety ja cierpie na chroniczny brak czasu i/lub chęci :lol:
viewtopic.php?t=5131
viewtopic.php?t=8574
https://github.com/shimano73/Stacja_pog ... e/main/lib
wykorzystujący bibliotekę sds-dust-sensors-arduino-library
https://github.com/lewapek/sds-dust-sen ... no-library
i zrobiony jako klasa :P , ale dziedzicząca kanał temperatury :cry:

Wadą tego rozwiązania wydaje się to co zauważył krycha88
krycha88 wrote: Mon May 03, 2021 7:31 am Ogólnie jakoś dziwnie jest napisana ta biblioteka SdsDustSensor.h stosowane są w niej delay(500)...
:cry:

Znalazłem też projekt SOYERa
SOYER wrote: Sun Nov 10, 2024 5:19 pm Cześć, z racji tego, że jeden z użytkowników prosił mnie o dodanie dodatkowo obsługi czujnika SDS011, to poniżej wklejam szkic który to powinien robić. Jednak fizycznie nie mam tego czujnika, więc nie mam możliwości sprawdzenia czy ta biblioteka zastosowana i cały szkic będą współdziałać z czujnikiem.
Nie zapomnijcie dodać biblioteki:
https://github.com/ricki-z/SDS011
uzupełnić dane wifi, GUID i AUTH, oraz dane do logowania do serwera.
viewtopic.php?t=16100
viewtopic.php?t=16151
wykorzystujący bibliotekę ricki-z/SDS011
https://github.com/ricki-z/SDS011
i zrobiony na kanale KPOP :P , ale bezpośrednio w szkicu a nie jako klasa :cry:

Tak więc mi wychodzi, że muszę napisać nową klasę, która dziedzicząc po KPOP będzie do wykorzystania w dowolnym projekcie. I mam związane z tym kilka pytań:
1. Czy czegoś gotowego nie przeoczyłem - nie ma sensu powtarzać roboty; może ktoś już to zrobił i by się podzielił jak to napisał shimano73 w cytowanym poście
2. Która biblioteka do odczytu (sds-dust-sensors-arduino-library czy ricki-z/SDS011) jest lepsza i dlaczego akurat tę wybraliście.
3. Może ktoś ma jakieś doświadczenia z jeszcze inną biblioteką - chętnie posłucham.
4. Na co powinienem zwrócić uwagę.
5. Jakieś pomysły dodatkowe; może które rzeczy powinny być konfigurowalne za pośrednictwem metod klasy.

Uprzedzając pytania:
1. Korzystając z sugestii @klew zamierzam zasugerować (requestem) dołączenie tej klasy do supla-device
2. Kolejna rzecz na liście to obsługa grzałki HECA, też chyba jako klasa do jednolinijkowego włączenia w szkicu (https://nettigo.pl/products/nettigo-air ... sterujacym) ale jeszcze nie analizowałem kodu shimano w tym zakresie ani nie przeszukałem forum pod tym kątem. Ale założę na to nowy wątek po skończeniu pracy nad SDSem.
Do czego Ci ta klasa potrzebna, dodajesz bibliotekę od SDS, uruchamiasz 2 x KPOP, lub 3x KPOP, uzyskane odczyty wysyłasz na KPOP. Kilka linijek kodu.
https://kryry01.aqi.eco/pl
https://app.weathercloud.net/d4311785603
malarz
Posts: 135
Joined: Wed Jan 27, 2021 4:04 pm

Post

SOYER wrote: Fri Jan 24, 2025 7:21 am Do czego Ci ta klasa potrzebna, dodajesz bibliotekę od SDS, uruchamiasz 2 x KPOP, lub 3x KPOP, uzyskane odczyty wysyłasz na KPOP. Kilka linijek kodu.
Właśnie do tego aby w szkicu dodać w setup() tylko utworzenie klasy i całą resztę niech robią jej metody (zmiany wyników itp) i metody supla-device. Tak samo jak wygląda dodanie innych sensorów, mających biblioteki w supla-device.

Wtedy szkice są czytelniejsze. Wszystko związane z obsługą sensora jest w jednym miejscu i nie jest pomieszane z innymi elementami.
Last edited by malarz on Fri Jan 24, 2025 9:26 am, edited 2 times in total.
Próbuję przerobić pomysły na działające projekty w ArduinoIDE.
malarz
Posts: 135
Joined: Wed Jan 27, 2021 4:04 pm

Post

klew wrote: Thu Jan 23, 2025 10:36 pm Klasa Chanel to nie jest kolejny kpop i tego tak nie można dodać.
Lepiej będzie jeśli dodasz klasę dziedzicząca po Supla:: Element, która będzie zawierała dwie instancje klasy kpop.
A jest gdzieś podobny element (z dwoma klasami sensorów, niekoniecznie kpop) w supla-device?
Próbuję przerobić pomysły na działające projekty w ArduinoIDE.
User avatar
klew
Posts: 10453
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

malarz wrote: Fri Jan 24, 2025 9:24 am
klew wrote: Thu Jan 23, 2025 10:36 pm Klasa Chanel to nie jest kolejny kpop i tego tak nie można dodać.
Lepiej będzie jeśli dodasz klasę dziedzicząca po Supla:: Element, która będzie zawierała dwie instancje klasy kpop.
A jest gdzieś podobny element (z dwoma klasami sensorów, niekoniecznie kpop) w supla-device?
Nie wiem, ale to coś takiego:

Code: Select all

class MySensor : public Supla::Element {
 public:
  ....
  void onInit() override {
   pomiar1.setDe....
   ...
   }
   
   void iterateAlways override {
     co 10 s: 
       odczyt z sensora
       pomiar1.setValue(x);
       pomiar2.setValue(y);
       }
  
 protected:
  Supla::Sensor::GeneralPurposeMeasurement pomiar1;
  Supla::Sensor::GeneralPurposeMeasurement pomiar2;
   itd.
};
malarz
Posts: 135
Joined: Wed Jan 27, 2021 4:04 pm

Post

Oto i jest. Trochę zrobiłem inaczej (więcej wpakowałem do konstruktora, pominąłem onInit, same kanały zrobiłem dynamiczne). Niektóre zmiany zrobiłem w trakcie szukania innych błędów, niektóre tak sobie.

W którymś momencie było już (prawie) dobrze i zapragnąłem mieć miejsca po przecinku. Jak ustawiłem to zniknęły mi jednostki. Jak usunąłem funkcję do ustawiania liczby miejsc po przecinku to cały czas je mam i cały czas nie mam jednostek. Co robię źle?

Przy okazji: jaka jest praktyczna różnica pomiędzy:
* setDefaultUnitAfterValue i setUnitAfterValue
* setDefaultValuePrecision i setValuePrecision
Które z tych funkcji powinno się w jakich momentach stosować?


Odczytywanie z czujników jest z premedytacją wyłączone. Klasa zwraca zawsze te same wartości. Tak szybciej mogę sprawdzać efekty zmian.

Code: Select all

// Dependencies:
// https://github.com/ricki-z/SDS011

#ifndef SRC_SUPLA_SENSOR_SDS011_H_
#define SRC_SUPLA_SENSOR_SDS011_H_

#include <supla/sensor/general_purpose_measurement.h>
#include <supla/sensor/general_purpose_channel_base.h>

#include <SDS011.h>
#include <supla/log_wrapper.h>

namespace Supla {
namespace Sensor {
class sds011 : public Supla::Element {
 public:
  explicit sds011(int rx_pin, int tx_pin, int refresh = 10) {
    refreshIntervalMs = refresh * 60 * 1000;
    SUPLA_LOG_DEBUG("sds011: starting");
//    sensor.begin(rx_pin, tx_pin);
    SUPLA_LOG_DEBUG("sds011: started");

    pm25channel = new GeneralPurposeMeasurement();
    pm10channel = new GeneralPurposeMeasurement();

    pm25channel->setDefaultUnitAfterValue("μg/m³");
    pm25channel->setInitialCaption("PM 2.5");
    pm25channel->getChannel()->setDefaultIcon(8);
//    pm25channel->setDefaultValuePrecision(0);

    pm10channel->setUnitAfterValue("μg/m³");
    pm10channel->setInitialCaption("PM 10");
    pm10channel->getChannel()->setDefaultIcon(8);
//    pm10channel->setValuePrecision(0);
  }

  void iterateAlways() override {
    if (millis() - lastReadTime > refreshIntervalMs) {

      float pm25 = NAN;
      float pm10 = NAN;
      SUPLA_LOG_DEBUG("sds011: start reading");
//      sensor.read(&pm25, &pm10);
      lastReadTime = millis();
      SUPLA_LOG_DEBUG("sds011: read %f and %f on %d", pm25, pm10, lastReadTime);

      pm25 = 21.123;
      pm10 = 99.789;

      pm25channel->setValue(pm25);
      pm10channel->setValue(pm10);
    }
  }

protected:
  ::SDS011 sensor;
  uint16_t refreshIntervalMs = 10000;
  uint32_t lastReadTime = 0;

  GeneralPurposeMeasurement *pm25channel = nullptr;
  GeneralPurposeMeasurement *pm10channel = nullptr;
};

}  // namespace Sensor
}  // namespace Supla

#endif  // SRC_SUPLA_SENSOR_SDS011_H_
Próbuję przerobić pomysły na działające projekty w ArduinoIDE.
SOYER
Posts: 1312
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry

Post

malarz wrote: Fri Jan 24, 2025 6:40 pm Oto i jest. Trochę zrobiłem inaczej (więcej wpakowałem do konstruktora, pominąłem onInit, same kanały zrobiłem dynamiczne). Niektóre zmiany zrobiłem w trakcie szukania innych błędów, niektóre tak sobie.

W którymś momencie było już (prawie) dobrze i zapragnąłem mieć miejsca po przecinku. Jak ustawiłem to zniknęły mi jednostki. Jak usunąłem funkcję do ustawiania liczby miejsc po przecinku to cały czas je mam i cały czas nie mam jednostek. Co robię źle?

Przy okazji: jaka jest praktyczna różnica pomiędzy:
* setDefaultUnitAfterValue i setUnitAfterValue
* setDefaultValuePrecision i setValuePrecision
Które z tych funkcji powinno się w jakich momentach stosować?


Odczytywanie z czujników jest z premedytacją wyłączone. Klasa zwraca zawsze te same wartości. Tak szybciej mogę sprawdzać efekty zmian.

Code: Select all

// Dependencies:
// https://github.com/ricki-z/SDS011

#ifndef SRC_SUPLA_SENSOR_SDS011_H_
#define SRC_SUPLA_SENSOR_SDS011_H_

#include <supla/sensor/general_purpose_measurement.h>
#include <supla/sensor/general_purpose_channel_base.h>

#include <SDS011.h>
#include <supla/log_wrapper.h>

namespace Supla {
namespace Sensor {
class sds011 : public Supla::Element {
 public:
  explicit sds011(int rx_pin, int tx_pin, int refresh = 10) {
    refreshIntervalMs = refresh * 60 * 1000;
    SUPLA_LOG_DEBUG("sds011: starting");
//    sensor.begin(rx_pin, tx_pin);
    SUPLA_LOG_DEBUG("sds011: started");

    pm25channel = new GeneralPurposeMeasurement();
    pm10channel = new GeneralPurposeMeasurement();

    pm25channel->setDefaultUnitAfterValue("μg/m³");
    pm25channel->setInitialCaption("PM 2.5");
    pm25channel->getChannel()->setDefaultIcon(8);
//    pm25channel->setDefaultValuePrecision(0);

    pm10channel->setUnitAfterValue("μg/m³");
    pm10channel->setInitialCaption("PM 10");
    pm10channel->getChannel()->setDefaultIcon(8);
//    pm10channel->setValuePrecision(0);
  }

  void iterateAlways() override {
    if (millis() - lastReadTime > refreshIntervalMs) {

      float pm25 = NAN;
      float pm10 = NAN;
      SUPLA_LOG_DEBUG("sds011: start reading");
//      sensor.read(&pm25, &pm10);
      lastReadTime = millis();
      SUPLA_LOG_DEBUG("sds011: read %f and %f on %d", pm25, pm10, lastReadTime);

      pm25 = 21.123;
      pm10 = 99.789;

      pm25channel->setValue(pm25);
      pm10channel->setValue(pm10);
    }
  }

protected:
  ::SDS011 sensor;
  uint16_t refreshIntervalMs = 10000;
  uint32_t lastReadTime = 0;

  GeneralPurposeMeasurement *pm25channel = nullptr;
  GeneralPurposeMeasurement *pm10channel = nullptr;
};

}  // namespace Sensor
}  // namespace Supla

#endif  // SRC_SUPLA_SENSOR_SDS011_H_

Miejsca po przecinku dla PM 2.5 i PM10??
Wiesz o czym piszesz?
https://kryry01.aqi.eco/pl
https://app.weathercloud.net/d4311785603
SOYER
Posts: 1312
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry

Post

SOYER wrote: Fri Jan 24, 2025 6:57 pm
malarz wrote: Fri Jan 24, 2025 6:40 pm Oto i jest. Trochę zrobiłem inaczej (więcej wpakowałem do konstruktora, pominąłem onInit, same kanały zrobiłem dynamiczne). Niektóre zmiany zrobiłem w trakcie szukania innych błędów, niektóre tak sobie.

W którymś momencie było już (prawie) dobrze i zapragnąłem mieć miejsca po przecinku. Jak ustawiłem to zniknęły mi jednostki. Jak usunąłem funkcję do ustawiania liczby miejsc po przecinku to cały czas je mam i cały czas nie mam jednostek. Co robię źle?

Przy okazji: jaka jest praktyczna różnica pomiędzy:
* setDefaultUnitAfterValue i setUnitAfterValue
* setDefaultValuePrecision i setValuePrecision
Które z tych funkcji powinno się w jakich momentach stosować?


Odczytywanie z czujników jest z premedytacją wyłączone. Klasa zwraca zawsze te same wartości. Tak szybciej mogę sprawdzać efekty zmian.

Code: Select all

// Dependencies:
// https://github.com/ricki-z/SDS011

#ifndef SRC_SUPLA_SENSOR_SDS011_H_
#define SRC_SUPLA_SENSOR_SDS011_H_

#include <supla/sensor/general_purpose_measurement.h>
#include <supla/sensor/general_purpose_channel_base.h>

#include <SDS011.h>
#include <supla/log_wrapper.h>

namespace Supla {
namespace Sensor {
class sds011 : public Supla::Element {
 public:
  explicit sds011(int rx_pin, int tx_pin, int refresh = 10) {
    refreshIntervalMs = refresh * 60 * 1000;
    SUPLA_LOG_DEBUG("sds011: starting");
//    sensor.begin(rx_pin, tx_pin);
    SUPLA_LOG_DEBUG("sds011: started");

    pm25channel = new GeneralPurposeMeasurement();
    pm10channel = new GeneralPurposeMeasurement();

    pm25channel->setDefaultUnitAfterValue("μg/m³");
    pm25channel->setInitialCaption("PM 2.5");
    pm25channel->getChannel()->setDefaultIcon(8);
//    pm25channel->setDefaultValuePrecision(0);

    pm10channel->setUnitAfterValue("μg/m³");
    pm10channel->setInitialCaption("PM 10");
    pm10channel->getChannel()->setDefaultIcon(8);
//    pm10channel->setValuePrecision(0);
  }

  void iterateAlways() override {
    if (millis() - lastReadTime > refreshIntervalMs) {

      float pm25 = NAN;
      float pm10 = NAN;
      SUPLA_LOG_DEBUG("sds011: start reading");
//      sensor.read(&pm25, &pm10);
      lastReadTime = millis();
      SUPLA_LOG_DEBUG("sds011: read %f and %f on %d", pm25, pm10, lastReadTime);

      pm25 = 21.123;
      pm10 = 99.789;

      pm25channel->setValue(pm25);
      pm10channel->setValue(pm10);
    }
  }

protected:
  ::SDS011 sensor;
  uint16_t refreshIntervalMs = 10000;
  uint32_t lastReadTime = 0;

  GeneralPurposeMeasurement *pm25channel = nullptr;
  GeneralPurposeMeasurement *pm10channel = nullptr;
};

}  // namespace Sensor
}  // namespace Supla

#endif  // SRC_SUPLA_SENSOR_SDS011_H_

Miejsca po przecinku dla PM 2.5 i PM10??
Wiesz o czym piszesz?
To było podobnie jakby ktoś ustawiał czwarte miejsce po przecinku dla ds18:)))
https://kryry01.aqi.eco/pl
https://app.weathercloud.net/d4311785603

Return to “Pomoc”