Logi "Send" do serwera

wladziu22
Posts: 36
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: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

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.
Najlepsze suple dla Twojego domu :mrgreen:
wladziu22
Posts: 36
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: 36
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: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

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".
Najlepsze suple dla Twojego domu :mrgreen:
wladziu22
Posts: 36
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.
wladziu22
Posts: 36
Joined: Sat Dec 02, 2023 4:40 pm

Post

klew wrote: Fri Nov 15, 2024 1:52 pm 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".
Hej Czy udało Ci się wprowadzić interfejs do integracji?
Pozdrawiam
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

wladziu22 wrote: Mon Mar 31, 2025 7:26 pm Hej Czy udało Ci się wprowadzić interfejs do integracji?
Pozdrawiam
Tak, jest wyciągnięte wszystko do klasy RollerShutterInterface
Najlepsze suple dla Twojego domu :mrgreen:
wladziu22
Posts: 36
Joined: Sat Dec 02, 2023 4:40 pm

Post

MEGA dziękuje za poświęcony czas :)
I podziękuje drugi raz jak wytłumaczysz mi co o jak używać, bo nie jestem pewny.

Patrząc na to co jest w cpp i h plikach klasy RollerShutterInterface wnioskuje, że powinienem w skicu RollerShutter zaprzestać używać tworzenia obiektów np :

Code: Select all

  Supla::Control::RollerShutter *rs1 = new Supla::Control::RollerShutter(14, 15, true);
  Supla::Control::RollerShutter *rs2 = new Supla::Control::RollerShutter(16, 17, true); 
...
i powinienem utworzyć nowe ? wg

Code: Select all

Supla::Control::RollerShutterInterface *rsi1 = new Supla::Control::RollerShutterInterface();
Supla::Control::RollerShutterInterface *rsi2= new Supla::Control::RollerShutterInterface();
...
i każdy kolejny będzie miał kanał 0, 1, 2, .. i zatem będzie widoczny w SuplaCload ?

Potem mogę jak wnioskuje używać metod np:

Code: Select all

rsi1->open();
rsi2->close();
....

Albo calkiem inaczej, dotychczasowe obiekty w szkicu

Code: Select all

  Supla::Control::RollerShutter *rs1 = new Supla::Control::RollerShutter(14, 15, true);
  Supla::Control::RollerShutter *rs2 = new Supla::Control::RollerShutter(16, 17, true); 
...
powinienem rzutować "jakos" (jeszcze nie wiem jak) na obiekt klasy RollerShutterInterface

Code: Select all

Supla::Control::RollerShutterInterface *rsi1 
Supla::Control::RollerShutterInterface *rsi2
?
i wtedy miałbym dodatkowe interfejsowe metody obiektów / rolet, które mam obecnie działajace.
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

wladziu22 wrote: Wed Apr 02, 2025 9:39 pm
Obsługa rolet ma wiele niuansów :P. A kiedyś będzie jeszcze gorzej, jak dojdzie tam obsługa żaluzji fasadowych.

Ogólnie polecam przejrzeć sobie te dwie klasy: RollerShutterInterface oraz RollerShutter - ze szczególną uwagą poświęconą RollerShutter.

Aktualnie RollerShutter (RS) dziedziczy po RollerShutterInterface (RSI) i implementuje komunikację ze sprzętem związaną ze sterowaniem roletą bezpośrednio przez GPIO i przekaźniki.
Klasa RSI ogarnia wspólną cześć i komunikację z serwerem.

W RS jest kilka metod do sterowania przekaźnikami oraz implementacja onTimer, która ogarnia całą logikę związaną ze sterowaniem roletą.

Także Ty potrzebujesz dodać swoją nową klasę, która dziedziczy po RSI i np. w "iterateAlways" napisać resztę komunikacji.
Coś w tym stylu:

Code: Select all

class MyI2CRollerShutter: public Supla::Control::RollerShutterInterface {
public:
 // konstruktor itp - jeśli potrzebujesz
 // i dalej:
void iterateAlways() override{
  Supla::Control::RollerShutterInterface::iterateAlways();

  if (isCalibrationInProgress()) {
    newTargetPositionAvailable = false;
    setCalibrate(false);
    return;
  }

  if (isCalibrationRequested()) {
    SUPLA_LOG_DEBUG("RS[%d]: Calibration requested",
                    channel.getChannelNumber());
    setCalibrate(false);
    newTargetPositionAvailable = false;
    i2c->send(komenda_startująca_kalibrację);    // I2C
    return;
  }

  if (newTargetPositionAvailable) {
    newTargetPositionAvailable = false;
    switch (targetPosition) {
      case STOP_POSITION: {
      i2c->send(komenda_STOP);    // I2C     
     break;
      }
      case MOVE_UP_POSITION: {
      i2c->send(komenda_MOVE_UP);    // I2C     
        break;
      }
      case MOVE_DOWN_POSITION: {
        i2c->send(komenda_MOVE_DOWN);    // I2C     
        break;
      }
      case UNKNOWN_POSITION: {
        break;
      }
    }
    if (targetPosition >= 0 && targetPosition <= 100) {
      i2c->send(komenda_USTAW_POZYCJE);    // I2C     
    }
  }
}
Dodatkowo gdzieś trzeba wstawić czytanie z I2C i ustawiania stanu rolety:

Code: Select all

    data = I2C.read() ; 
   if (data.ready()) {
      if (data.position == -1) {
        rs->setNotCalibrated();
      } else if (data.position >= 0 && data.position <= 100) {
        rs->setCurrentPosition(data.position);
      }
Powyższe to nie jest kompilujący się kod, tylko pisany na kolanie tekst na forum :)
Najlepsze suple dla Twojego domu :mrgreen:

Return to “Ogólna dyskusja”