Jak sprawdzić rodzaj kanałów

Awatar użytkownika
klew
Posty: 2088
Rejestracja: czw cze 27, 2019 12:16 pm

wt sty 12, 2021 10:25 am

krycha88 pisze:
wt sty 12, 2021 9:54 am
klew pisze:
pt mar 13, 2020 9:06 am
Define'y z headerów będą dodane zależnie od tego, czy zrobisz include'a, czy nie. Na tej podstawie nie odkryjesz czy dany kanał jest dodany.

Najlepiej pobiegać po tej liście kanałów z channel.h.
Dorzucę jakieś metody get aby pobierać dane, które są potrzebne.
Napisz tylko co potrzebujesz odczytać?
- channel type
- ostatnio odcyztana wartość (o tym już kiedyś pisaliśmy)
- coś jeszcze?

Po kanałach można przejść przy pomocy:

Kod: Zaznacz cały

for (auto channel = Supla::Channel::begin(); channel != nullptr; channel = channel->next()) {
   channel->doSomething();              
}


Na razie jedyny get, który jest to "getChannelNumber()".
Teraz aby odczytać wartość oraz rodzaj czujnika wykorzystuję globalnego vector, chcę się ich pozbyć bo niepotrzebnie zajmują pamięć. Chciałbym wykorzystać to rozwiązanie zaproponowane przez Ciebie ale brakuje możliwości odczytania ostatniej wartości kanału. Czy nie dało by się dorobić prostych metod odczytujących wartość z reg_dev.channels[channelNumber].value?
Kilka dni temu usunąłem tą listę w klasie Channel, więc już nie ma możliowści iteracji po niej ;)
Ale można zrobić to samo iterując po Element (identycznie jak w powyższym przykładzie).
Dodam gettery. Mam to na liście todo, tylko się zakurzyło ;). Ale ostatnio walczę z pisaniem testów do biblioteki, więc przyda się mała odskocznia.
krycha88
Posty: 1414
Rejestracja: pt lis 16, 2018 7:25 am

wt sty 12, 2021 10:40 am

klew pisze:
wt sty 12, 2021 10:25 am
Kilka dni temu usunąłem tą listę w klasie Channel, więc już nie ma możliowści iteracji po niej ;)
Ale można zrobić to samo iterując po Element (identycznie jak w powyższym przykładzie).
Dodam gettery. Mam to na liście todo, tylko się zakurzyło ;). Ale ostatnio walczę z pisaniem testów do biblioteki, więc przyda się mała odskocznia.
to ja ładnie poproszę, nie tylko ja na tym skorzystam :)
Awatar użytkownika
klew
Posty: 2088
Rejestracja: czw cze 27, 2019 12:16 pm

śr sty 13, 2021 12:04 pm

Dodałem metody do pobierania ostatnich odczytów/stanu.

Poniżej przykład jak się do tego dobrać:

Kod: Zaznacz cały

  for (auto element = Supla::Element::begin(); element != nullptr; element = element->next()) { // iterujemy po wszystkich elementach dodanych do programu
    if (element->getChannel()) { // sprawdzamy, czy do elementu jest przypisany kanał. Niektóre elementy (np. button) nie posiadają kanału.
      auto channel = element->getChannel();
      if (channel->getChannelType() == SUPLA_CHANNELTYPE_THERMOMETER) {
        double lastTemperature = channel->getValueDouble();
        // do something with lastTemperature
      }
    }
  }
"getChannelType" zwraca typ kanału używany w Supli. Pełna lista typów jest tutaj: https://github.com/SUPLA/arduino/blob/a ... oto.h#L280
Typ kanału używany przez elementy SuplaDevice są z reguły określone w konstruktorach danego elementu. Trzeba na to zwrócić uwagę, bo np Supla::Sensor::DS18B20 używa SUPLA_CHANNELTYPE_THERMOMETER a nie SUPLA_CHANNELTYPE_THERMOMETERDS18B20.
Można też szukać kanału po jego numerze - wtedy sprawdzamy po metodzie getChannelNumber()

Kolejna rzecz o której trzeba pamiętać, to sposób zapisu danego typu danych, który jest używany w protokole komunikacyjnym.
Innymi słowy, musimy wiedzieć co dany kanał przesyła i użyć odpowiedniej metody:
- jedną liczbę zmiennoprzecinkową (np. termoemtry, ciśnienie) - getValueDouble()
- dwie liczby zmiennoprzecinkowe (np. DHT22 przesyłające temperaturę oraz wilgotność w jednym kanale) - getValueDoubleFirst() (temperatura), getValueDoubleSecond() (wilgotność)
- typ logiczny (bool - np. sensor otwarcia) - getValueBool()
- liczbę całkowitą 32 bitową (np. rolety - poziom otwarcia) - getValueInt32()
- liczbę całkowitą 64 bitową (np. liczniki impulsów - UWAGA: nie robiłem pobierania danych z liczników prądu) - getValueInt64()
- zestaw liczb reprezentujących RGB z dwoma wartościami jasności (RGBW, dimmery) - getValueRed(), getValueBlue(), getValueGreen(), getValueColorBrightness(), getValueBrightness();
krycha88
Posty: 1414
Rejestracja: pt lis 16, 2018 7:25 am

śr sty 13, 2021 12:49 pm

dzięki wielkie :)

channel->getChannelType() dla BME280 zwraca mi tylko kanał SUPLA_CHANNELTYPE_HUMIDITYANDTEMPSENSOR a nie zwraca mi kanału SUPLA_CHANNELTYPE_PRESSURESENSOR
Awatar użytkownika
klew
Posty: 2088
Rejestracja: czw cze 27, 2019 12:16 pm

śr sty 13, 2021 1:25 pm

krycha88 pisze:
śr sty 13, 2021 12:49 pm
dzięki wielkie :)

channel->getChannelType() dla BME280 zwraca mi tylko kanał SUPLA_CHANNELTYPE_HUMIDITYANDTEMPSENSOR a nie zwraca mi kanału SUPLA_CHANNELTYPE_PRESSURESENSOR
To ten trudniejszy przypadek ;)

Na chwilę obecną się do ciśnienia nie dostaniesz. Dodaję sobie to na listę todo.
krycha88
Posty: 1414
Rejestracja: pt lis 16, 2018 7:25 am

śr sty 13, 2021 2:40 pm

w takim razie czekam mam nadzieje, że się za bardzo nie zakurzy :D testuje Twoje rozwiązanie i na razie się sprawdza - dobra robota :)

Co myślisz o dodaniu dodatkowej zmiennej do klasy Supla::Element tylko na potrzeby użytkownika coś w stylu userData gdzie będzie można wpisać swoje wartości np. nazwy dla poszczególnych czujników lub oznaczenie "tego czujnika nie wyświetlaj" ??
Awatar użytkownika
klew
Posty: 2088
Rejestracja: czw cze 27, 2019 12:16 pm

śr sty 13, 2021 5:22 pm

Niestety jesteśmy mocno ograniczeni pamięcią RAM na arduino mega. Żadnych zbędnych zmiennych, które zjadają pamięć nie będę dodawał, bo i tak przy pełnym wykorzystaniu pinów jest bardzo mało pamięci
krycha88
Posty: 1414
Rejestracja: pt lis 16, 2018 7:25 am

śr sty 13, 2021 5:42 pm

klew pisze:
śr sty 13, 2021 5:22 pm
Niestety jesteśmy mocno ograniczeni pamięcią RAM na arduino mega. Żadnych zbędnych zmiennych, które zjadają pamięć nie będę dodawał, bo i tak przy pełnym wykorzystaniu pinów jest bardzo mało pamięci
ale to chyba nie problem bo można przecież to zapisać w taki sposób:

Kod: Zaznacz cały

#if defined(ESP8266)
//code
#endif
Edit:
Nie jest to aż tak ważne jak odczyt ciśnienia bo bez tego nie udostępnienie tego ludziom :(
przerobiłem już wszystkie czujniki bez użycia zmiennych globalnych więc suksess.
Awatar użytkownika
klew
Posty: 2088
Rejestracja: czw cze 27, 2019 12:16 pm

śr sty 13, 2021 10:58 pm

krycha88 pisze:
śr sty 13, 2021 12:49 pm
dzięki wielkie :)

channel->getChannelType() dla BME280 zwraca mi tylko kanał SUPLA_CHANNELTYPE_HUMIDITYANDTEMPSENSOR a nie zwraca mi kanału SUPLA_CHANNELTYPE_PRESSURESENSOR
Dorzuciłem metodę "getSecondaryChannel()" - możesz nią pobrać kanał ciśnienia dla BME. Metoda zwraca wskaźnik na Channel (podobnie jak getChannel() ).
Awatar użytkownika
klew
Posty: 2088
Rejestracja: czw cze 27, 2019 12:16 pm

śr sty 13, 2021 11:01 pm

krycha88 pisze:
śr sty 13, 2021 5:42 pm
klew pisze:
śr sty 13, 2021 5:22 pm
Niestety jesteśmy mocno ograniczeni pamięcią RAM na arduino mega. Żadnych zbędnych zmiennych, które zjadają pamięć nie będę dodawał, bo i tak przy pełnym wykorzystaniu pinów jest bardzo mało pamięci
ale to chyba nie problem bo można przecież to zapisać w taki sposób:

Kod: Zaznacz cały

#if defined(ESP8266)
//code
#endif
Nie widzę na razie sensu takiej zmiany:
1. dość trudno sobie wyobrazić, że ktoś poza Tobą, tego użyje,
2. #ifdefy raczej używam tam gdzie różnice wynikają z obsługi danego sprzętu, a nie aby dodawać metody i zmienne w danej klasie (dość niekoszerne rozwiązanie ;P )
3. myślę, że bardzo łatwo można sobie dostawić osobną strukturę, która będzie trzymała dodatkowe dane, których potrzebujesz. Można to też łatwo opakować w jakąś metodę, która dla danego elementu zwróci Ci wskaśnik/referencję na obiek z dodatkowymi danymi.
ODPOWIEDZ

Wróć do „Arduino IDE”