Jak sprawdzić rodzaj kanałów

User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

krycha88 wrote: Tue Jan 12, 2021 9:54 am
klew wrote: Fri 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:

Code: Select all

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.
Najlepsze suple dla Twojego domu :mrgreen:
krycha88
Posts: 5575
Joined: Fri Nov 16, 2018 7:25 am
Been thanked: 5 times

Post

klew wrote: Tue Jan 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 :)
https://gui-generic-builder.supla.io/
User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

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

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

Code: Select all

  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();
Najlepsze suple dla Twojego domu :mrgreen:
krycha88
Posts: 5575
Joined: Fri Nov 16, 2018 7:25 am
Been thanked: 5 times

Post

dzięki wielkie :)

channel->getChannelType() dla BME280 zwraca mi tylko kanał SUPLA_CHANNELTYPE_HUMIDITYANDTEMPSENSOR a nie zwraca mi kanału SUPLA_CHANNELTYPE_PRESSURESENSOR
https://gui-generic-builder.supla.io/
User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

krycha88 wrote: Wed Jan 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.
Najlepsze suple dla Twojego domu :mrgreen:
krycha88
Posts: 5575
Joined: Fri Nov 16, 2018 7:25 am
Been thanked: 5 times

Post

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" ??
https://gui-generic-builder.supla.io/
User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

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
Najlepsze suple dla Twojego domu :mrgreen:
krycha88
Posts: 5575
Joined: Fri Nov 16, 2018 7:25 am
Been thanked: 5 times

Post

klew wrote: Wed Jan 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:

Code: Select all

#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.
https://gui-generic-builder.supla.io/
User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

krycha88 wrote: Wed Jan 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() ).
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

krycha88 wrote: Wed Jan 13, 2021 5:42 pm
klew wrote: Wed Jan 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:

Code: Select all

#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.
Najlepsze suple dla Twojego domu :mrgreen:

Return to “Arduino IDE”