Logi "Send" do serwera

wladziu22
Posts: 14
Joined: Sat Dec 02, 2023 4:40 pm

Post

hej,

pomóżcie proszę bo udało mi sie wyczaic, w którym miejscu w kodzie repo supla-arduino wysyłane są logi do serwera dla np rolet np:

to podczas ruchu rolety :

Code: Select all

18:29:13.070 -> Channel(1) value changed to 39
18:29:13.070 -> Send: [53 55 50 4C 41 17 75 00 00 00 67 00 00 00 0E 00 00 00 01 00 00 00 00 00 27 00 00 00 00 00 00 00 ]
18:29:13.105 -> Send: [53 55 50 4C 41 ]
Logi posyła ESP8266 z zaprogramowana funkcją sterownika rolet.

wiem gdzie jest definicja metody :

Code: Select all

size_t Supla::Client::write(const uint8_t *buf, size_t size) {
#ifdef SUPLA_COMM_DEBUG
  if (debugLogs) {
    Supla::Network::printData("Send", buf, size);
  }
#endif
  return writeImp(buf, size);
}
ale nie wiec gdzie konkretnie składany jest buffor i wysyłany jest powyższy ciąg znaków.
User avatar
klew
Posts: 9704
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

To jest dość złożone. Ogólnie zawartość tej ramki leci na 8 bajtach channel value oraz informacja o numerze kanału.
Całość jest w srpc.c opakowana w numer wiadomości i kilka innych danych i wysłana.
Kiedy będzie Supla Offline Party / SOP#2025 ?
wladziu22
Posts: 14
Joined: Sat Dec 02, 2023 4:40 pm

Post

Hej,
Potrzebowałbym trochę więcej info, gdyż chciałbym coś podobnego wysyłać do serwera Supla, żeby powiadomić o ruchu rolety przypiętej do kanały X, która została wprawiona w ruch przyciskiem analogowym na ścianie.
Jeśli aplikacja w komórce nie zna statusu rolety to działa to trochę ułomnie, np nie da się w aplikacji otworzyć rolety jak jest już "otwarta" w okienku aplikacji (na animacji), a w rzeczywiści jest zamknięta, bo ktoś wcisnął analogowy przycisk.

tak, juz "byłem" w tym piku co podajesz supla_srcp.cpp oraz innych clinet.cpp, channel.cpp, channel_types.h/cpp, proto.h, reay.h. Cała ta zabawa zaczyna się w zasadzie od :

Code: Select all

File: roller_shutter.cpp

  TDSC_RollerShutterValue value = {};
  value.position = currentPosition;
  channel.setNewValue(value);
  
i to jest jedyny "set", który leci po wykonanym kroku rolety , po wciśniętym przycisku. A potem następuje sekwencja zdarzeń, składanie ramki i wysłanie.
wladziu22
Posts: 14
Joined: Sat Dec 02, 2023 4:40 pm

Post

To jeszcze jedno pytanie czy dodając jakieś przyciski (które nie są mi do niczego potrzebne, bo nie jestem w stanie podpiąć przycisków do Node Mcu ESP8266 na którym mam kod Supla dot rolet) np:

Code: Select all

  
 [dostepne w RollerShutter sketch]
 
  Supla::Control::Button *buttonOpen = new Supla::Control::Button(28, true, true);
  Supla::Control::Button *buttonClose = new Supla::Control::Button(29, true, true);
 
czy te przyciski wywołują w pliku RollerShuter.cpp akcje z handlera :

Code: Select all

void RollerShutter::handleAction(int event, int action) 
?

A potem po czasie 500ms wysyłana jest do serwera informacja za pomocą wspomnianego:

Code: Select all

  TDSC_RollerShutterValue value = {};
  value.position = currentPosition;
  channel.setNewValue(value);
?

Resumując: Próbuję znaleźć jakiś inny sposób jak powiadomić serwer o statusie rolety (ruszanej przyciskiem analogowym). I zastanawiam sie czy może jakoś tymi przyciskami dałoby sie ruszać cale domino za pomocą moich ramek o statusie rolet.

BTW, w moim innym poście wyjaśniałem, że z poziomu NodeMcu ESP8266 komunikuje się z moim ArduinoMega za pomocą i2c ramek ( polecenia do sterowania roletami ).Teraz chcę w druga stronę, z ArduimoMega wysłać info do NodeMcu ESP8266 o statusie rolet. i dalej do serwera.
User avatar
klew
Posts: 9704
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

To trochę taka robota na około.
Łatwiej po prostu zrobić sterowanie na supla-device i tyle.
Aktualna implementacja rolet zakłada, że sama ogarnia całe sterowanie. Ty byś natomiast potrzebował po prostu interfejsu do integracji z zewnętrznym sterownikiem. Takie coś będę dodawał do biblioteki "niedługo".
Kiedy będzie Supla Offline Party / SOP#2025 ?
wladziu22
Posts: 14
Joined: Sat Dec 02, 2023 4:40 pm

Post

Hej, Masz całkowita racje, ze to jest robota na około. Zdecydowanie wolałbym używać oryginalny kod z Supla, bo wówczas nie będę miał za wiele różnic w przyszłości, jakbym chciał zaktualizować kod względem nowej wersji Supla.

Jeszcze miałem ostatni pomysł "tymczasowy", użycia buttonów alokowanych w workspace Arduino czyli w sekcji

Code: Select all

void setup() { 
....
  buttonOpen->addAction(Supla::OPEN_OR_STOP, *rs1, Supla::ON_PRESS);
  buttonClose->addAction(Supla::CLOSE_OR_STOP, *rs1, Supla::ON_PRESS);
} 
Wyżej mamy dwa buttony przykładowe, jeden steruje roleta do góry obiektu "rs1" rolety, a drugi tą samą roleta w dół.

W sekcji loop {} uruchomiłem odbieranie ramek statusowych z mojego ArduinMega. I teraz.. mój pomysł, jakbym mógł wyłuskać obiekty ww. butonów w sekcji
void loop() {
SuplaDevice.iterate();

}
,
to mógłbym chociaż tymczasowo sterować wg. otrzymana ramka1 -> button1 itd.
A potem już poleci "jak po maśle", w kodzie supla, ten sam obiekt button, zostanie obsłużony w

Code: Select all

void RollerShutter::handleAction(int event, int action)
Jakbym wiedział ja to z nudów napisałbym ci ten kod który sam musisz napisać, ale musiałbyś mnie jakoś wprowadzić w to, a potem zapewne poprawić, bo ja to zatrzymałem się na C a a C++ to tylko trochę znam.

Pozdrawiam i dziękuję, że masz czas odpisać i zaplanować kolejny task.

Return to “Ogólna dyskusja”