Dokumentacja API

czort
Posty: 13
Rejestracja: pn maja 03, 2021 8:53 pm

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.
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

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.
Widzimy się na Supla Offline Party vol. 2 :!:
Awatar użytkownika
pzygmunt
Posty: 18281
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontakt:

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.
czort
Posty: 13
Rejestracja: pn maja 03, 2021 8:53 pm

klew pisze: pn maja 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.
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

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ć
Widzimy się na Supla Offline Party vol. 2 :!:
czort
Posty: 13
Rejestracja: pn maja 03, 2021 8:53 pm

klew pisze: wt maja 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.
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

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.
Widzimy się na Supla Offline Party vol. 2 :!:
czort
Posty: 13
Rejestracja: pn maja 03, 2021 8:53 pm

klew pisze: wt maja 04, 2021 7:31 pm Na jakim sprzęcie chcesz to robić?
NodeMCU albo Wroom32
klew pisze: wt maja 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 pisze: wt maja 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.
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

czort pisze: wt maja 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:

Kod: Zaznacz cały

  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.
Widzimy się na Supla Offline Party vol. 2 :!:
czort
Posty: 13
Rejestracja: pn maja 03, 2021 8:53 pm

klew pisze: wt maja 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.
ODPOWIEDZ

Wróć do „Pomoc”