Dokumentacja API

czort
Posts: 13
Joined: Mon May 03, 2021 8:53 pm

Post

Cześć.

Przeglądam przykłady programów z Arduino Studio i nie mogę dotrzeć do jednej rzeczy - jak z poziomu kodu wymusić kontrolę nad urządzeniem?

Chciałbym sam włączyć sobie urządzenie, a do serwera wyłącznie przesłać info "urządzenie włączone".
Chciałbym sam sczytać temperaturę, czy jakiś parametr i samemu wysłać do serwera info: "urządzenie X, wartość Y".

Jest gdzieś to opisane, czy pozostaje mi reverse engineering kodu?

---

Tak w ogóle, cześć, jestem nowy.
Planuję remont i wpięciu kilku urządzeń w puszki oraz podpięcie kilku termometrów.
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Jeśli użyjesz biblioteki SuplaDevice, to w większej części kod składa się z tworzenia klas odpowiednich typów, które reprezentują poszczególne elementy Twojego urządzenia.
Jeśliz zrobisz np. instancję Supla::Control::Relay to ona może sterować np. światłem.
Jak dodasz do tego instancję Supla::Control::Button i odpowiednio powiążesz ją z wcześniej stworzonym przekaźnikiem, to używając przycisku na ścianie zmienisz stan przekaźnika i serwer Supli dostanie odpowiednią wiadomość.

Odnośnie termometrów, to jest trochę gotowych implementacji różnych czujników. Jeśli nie znajdziesz tam swojego, to najlepiej napisać własną klasę dziedziczącą po Supla::Sensor::Thermometer i nadpisać metodę "getValue()", która powinna zwracać odczyt z Twojego termometru. Ta metoda będzie wywoływana przez program co 10 s i będzie wysyłać dane do serwera Supli.

Zadałeś bardzo ogólne pytania, więc ciężko jest sensownie odpowiedzieć i pomóc.
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
pzygmunt
Posts: 20302
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Been thanked: 59 times

Post

Dokumentacji do biblioteki dla Arduino nie ma ponieważ dopiero co zakończyły się prace nad przebudową starej biblioteki. Mam nadzieje, że wraz z rozwojem tej nowej, znaczenie powstawać również dokumentacja na github wiki.
SUPLA.... Nareszcie w domu.
czort
Posts: 13
Joined: Mon May 03, 2021 8:53 pm

Post

klew wrote: Mon May 03, 2021 9:13 pmOdnośnie termometrów, to jest trochę gotowych implementacji różnych czujników. Jeśli nie znajdziesz tam swojego, to najlepiej napisać własną klasę dziedziczącą po Supla::Sensor::Thermometer i nadpisać metodę "getValue()", która powinna zwracać odczyt z Twojego termometru.
Dziękuję. Jest to jakiś pomysł. Chyba po prostu będę kombinował na sucho zanim wepnę to w instalację.

Przyznam, że przy braku dokumentacji, szybkość odpowiedzi na forum jest budująca.

Jeszcze raz dzięki.
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Z reguły nie ma co kombinować, bo często można znaleźć gotowe rozwiązania ;)

Łatwiej będzie pomóc jak napiszesz bardziej konkretnie co chciałbyś zrobić
Najlepsze suple dla Twojego domu :mrgreen:
czort
Posts: 13
Joined: Mon May 03, 2021 8:53 pm

Post

klew wrote: Tue May 04, 2021 4:58 pm Z reguły nie ma co kombinować, bo często można znaleźć gotowe rozwiązania ;)
Łatwiej będzie pomóc jak napiszesz bardziej konkretnie co chciałbyś zrobić
Pierwsze co mi przychodzi do głowy, to wyłącznik czasowy światła u dzieciaków - szczególnie w połączeniu z czujnikiem ruchu. Tzn. jeżeli nic się nie rusza przez godzinę, to światło się wyłącza.

Druga rzecz - obsługa dwóch/trzech źródeł światła za pomocą jednego przełącznika:
- click: włącza się nr 1
- click+click: włącza się nr 1+2
- click+click+click: włącza się nr 1+2+3
po kilku sekundach przełącznik z trybu "wyboru światła" przechodzi w tryb "wyłączania". Click powoduje wyłączenie wszystkiego.
Gdy światło jest wyłączone, "click" powoduje włączenie ostatniej konfiguracji.
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Na jakim sprzęcie chcesz to robić?

Ten włącznik czasowy ma też zapalać światło na czujkę ruchu?

Przy tych wieloklikach łatwiej by było gdyby była zdefiniowana konkretną akcja na daną sekwencję. Np w opisanym przez Ciebie przykładzie pojedyncze kliknięcie jest niejednoznaczne - raz oznacza włączenie nr 1, a innym razem włączenie ostatniego stanu.
Najlepsze suple dla Twojego domu :mrgreen:
czort
Posts: 13
Joined: Mon May 03, 2021 8:53 pm

Post

klew wrote: Tue May 04, 2021 7:31 pm Na jakim sprzęcie chcesz to robić?
NodeMCU albo Wroom32
klew wrote: Tue May 04, 2021 7:31 pm Ten włącznik czasowy ma też zapalać światło na czujkę ruchu?
Nie, ma tylko służyć do wyłączenia
klew wrote: Tue May 04, 2021 7:31 pm Przy tych wieloklikach łatwiej by było gdyby była zdefiniowana konkretną akcja na daną sekwencję. Np w opisanym przez Ciebie przykładzie pojedyncze kliknięcie jest niejednoznaczne - raz oznacza włączenie nr 1, a innym razem włączenie ostatniego stanu.
Jeżeli chodzi o oprogramowanie tego, to jest banalnie proste. Tylko jak to podpiąć do Supli?
Gdybym miał możliwość komunikowania się z serwerem i przekazywać mu tylko informacje "1,2,3 - zostały włączone", to nie miałbym żadnego problemu.
Chyba, że na jednym wejściu obsłużę swój "magiczny przełącznik", który będzie sterował za pomocą 3 wyjść trzema wejściami, które będzie monitorować Supla... ale to chyba trochę dziwne.
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

czort wrote: Tue May 04, 2021 7:45 pm Jeżeli chodzi o oprogramowanie tego, to jest banalnie proste. Tylko jak to podpiąć do Supli?
Gdybym miał możliwość komunikowania się z serwerem i przekazywać mu tylko informacje "1,2,3 - zostały włączone", to nie miałbym żadnego problemu.
Chyba, że na jednym wejściu obsłużę swój "magiczny przełącznik", który będzie sterował za pomocą 3 wyjść trzema wejściami, które będzie monitorować Supla... ale to chyba trochę dziwne.
SuplaDevice ma obsługę przekaźników oraz przycisków z wieloklikami.
Natomaist zestaw dostępnych akcji jest dość prosty i nie ma tam aktualnie możliwości zrobienia bezpośrednio takich sekwencji - ale da się to prosto rozbudować, o ile programowanie obiektowe nie jest Ci straszne.

W bibliotece SuplaDevice, wszystkie obiekty, które mogą wyzwalać jakąś akcję (np. Button po kliknięciu, albo jakiś Sensor binarny po zmianie stanu, albo Relay po zmianie stanu) dziedziczą po klasie Supla::LocalAction i w ich implementacji dla konkretnych zdarzeń, jest wywoływana metoda "runAction(int)". Np. Button woła runAction(ON_CLICK_4) w momencie gdy wykryje kliknięcie 4 razy.

Z drugiej strony są obiekty dziedziczące po Supla::ActionHandler, które powinny implementować metodę handleAction(event, akcja). Np. przekaźniki reagują na akcję TURN_ON lub TURN_OFF.

Obiekty dziedziczące po LocalAction posiadają metodę "addAction", która pozwala na zarejestrowanie "odbiorcy" (ActionHandler) na dane zdarzenie. Np:

Code: Select all

  button1->addAction(Supla::TURN_ON, relay1, Supla::ON_CLICK_2);
Tego typu powiązań można dodawać "bez ograniczeń" (aż ramu braknie, co raczej dzieje się dość szybko ;) ).


Tyle tytułem wstępu.
Aby dołożyć tam dodatkową logikę, czy coś na podobieństwo maszyny stanów, to wystarczy, że dodasz swoją klasę, która dziedziczy po ActionHandler i w "handleAction" zaimplementujesz bardziej zaawansowaną obsługę i logikę.

Trochę przykładów znajdziesz na forum wrzucając w google: "site:forum.supla.org addAction"
W ciągu ostatniego roku biblioteka była dość intensywnie rozwijana i akurat ten obszar "addAction" się kilka razy mocno zmieniał. Także w przykładach na forum może się zdażyć inna kolejność argumentów metod, albo inne nazwy klas basowych (np. ActionHandler nazywał się wcześniej Triggerable, "addAction" nazywało się kiedyś "willTrigger" itd.)
Tutaj (viewtopic.php?t=7630) znajdziesz gotowy przykład jak wstawić takiego "pośrednika" o nazwie "OneByOne" (po staremu dziedziczy po Triggerable, aktualnie powinno być ActionHandler).


Odnośnie do protokołu Supli, to raczej jest on trochę bardziej skomplikowany niż "wyślij stan 1, 2, 3". Supla utrzymuje stałe połączenie między urządzeniami wykonawczymi a serwerem. Urządzenie musi się rejestrować, utrzymywać połączenie (np. wiadomości przypominające ping), i na bierząco aktualizować stan, a także reagować na polecenia z Supli.
Protokół jest realizowany na prostych binarnych strukturach - możesz je znaleźć w pliku proto.h.
Także najłatwiej będzie używać gotowych klas do obsługi różnych elementów programu i dokładać samemu logikę wedle uznania. Niestety wymaga to zapoznania się trochę z biblioteką, ale jest prostsze niż pisanie wszystkiego od zera.
Te gotowe klasy mają z reguły wystawione interfejsy, aby robić z nimi co się zechce.
Najlepsze suple dla Twojego domu :mrgreen:
czort
Posts: 13
Joined: Mon May 03, 2021 8:53 pm

Post

klew wrote: Tue May 04, 2021 10:47 pm Aby dołożyć tam dodatkową logikę, czy coś na podobieństwo maszyny stanów, to wystarczy, że dodasz swoją klasę, która dziedziczy po ActionHandler i w "handleAction" zaimplementujesz bardziej zaawansowaną obsługę i logikę.
Wielkie dzięki.

Return to “Pomoc”