Logi serwera dla rolety

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

Post

Hej,

Pytanie mam o interpretacje logów, które można zaobserwować np. w Monitorze portu szeregowego w Arduno IDE, po wgraniu przykładu "RollerShutter" do Wemos 'a.

Zebrałem chyba większość z nich oto takie logi otrzymałem ( nazwa przycisku w Supla sewerze -> log w termnalu ):

/

Code: Select all

/ Open full button pressed -> RollerShutter[1] new value from server: 10
//  Open full button pressed -> RollerShutter[1] new value from server: 110

// Open partially 1% button pressed -> RollerShutter[1] new value from server: 109
// Open partially 50% button pressed -> RollerShutter[1] new value from server: 60
// Open partially 99% button pressed -> RollerShutter[1] new value from server: 11
// Open partially 100% button pressed -> RollerShutter[1] new value from server: 10

// Close partially 1% button pressed -> RollerShutter[1] new value from server: 11
// Close partially 50% button pressed -> RollerShutter[1] new value from server: 60
// Close partially 99% button pressed -> RollerShutter[1] new value from server: 109
// Close partially 100% button pressed -> RollerShutter[1] new value from server: 110

// Stop button pressed ->  RollerShutter[1] new value from server: 0
// Up or stop button pressed ->  RollerShutter[1] new value from server: 4
// Down or stop button pressed ->  RollerShutter[1] new value from server: 3
// Step by step button pressed ->  RollerShutter[0] new value from server: 5
1. Co oznaczają konkretne wartości na końcu logów ? Czy to są numery komend/zdarzeń?
Jeśli tak, dlaczego w przypadku tych pierwszych 10 logów widać wartości z zakresu 10 - 110 ? Czy dla tych komend trzeba wykonać zawsze rachunek odejmowania 10tki żeby miało to sens ? np 110 - 10 = 100% albo 60 - 10 = 50% ?


2. Kolejna rzecz jaka martwi mnie czy Wemos poradzi sobie z dziwną pinologia, z wgranym softem z 16 roletami z 32 przekaznikami / pinami? Deklaracja ponów to oczywiście 2x 16 zadeklarowane. No:

Code: Select all

Supla::Control::RollerShutter *rs4 = new Supla::Control::RollerShutter(20, 21, true);
Jak wiadomo Wemos nie ma tyle pinów. Sprawdziłem 16 takich obierków -> działa. Pytanie dlaczego nadal działa z zadekretowanymi 32 pinami dla przekaźników ?
Oczywiście pomijam fakt niemożliwości fizycznego podłączania tylu przekaźników.

Pozdrawiam.
wladziu22
Posts: 23
Joined: Sat Dec 02, 2023 4:40 pm

Post

OK zdaje się ze sam sobie odpowiem na pytanie 1, bo znalazłem gdzie wszytko jest opisane, komentarz w pliku roller_shutter.cpp oraz metodę:

Code: Select all

/*
 * Protocol:
 * value[0]:
 *  0 - stop
 *  1 - down
 *  2 - up
 *  10 - 110 - 0% - 100%
 *
 * time is send in 0.1 s. i.e. 105 -> 10.5 s
 * time * 100 = gives time in ms
 *
 */

Code: Select all

int RollerShutter::handleNewValueFromServer(
    TSD_SuplaChannelNewValue *newValue) {
  uint32_t newClosingTime = (newValue->DurationMS & 0xFFFF) * 100;
  uint32_t newOpeningTime = ((newValue->DurationMS >> 16) & 0xFFFF) * 100;

  setOpenCloseTime(newClosingTime, newOpeningTime);

  char task = newValue->value[0];
  SUPLA_LOG_DEBUG("RollerShutter[%d] new value from server: %d",
      channel.getChannelNumber(), task);
  switch (task) {
    case 0: {
      stop();
      break;
    }
    case 1: {
      moveDown();
      break;
    }
    case 2: {
      moveUp();
      break;
    }
    case 3: {  // down or stop
      if (inMove()) {
        stop();
      } else {
        moveDown();
      }
      break;
    }
    case 4: {  // up or stop
      if (inMove()) {
        stop();
      } else {
        moveUp();
      }
      break;
    }
    case 5: {  // sbs
      if (inMove()) {
        stop();
      } else if (lastDirectionWasOpen()) {
        moveDown();
      } else if (lastDirectionWasClose()) {
        moveUp();
      } else if (currentPosition < 50) {
        moveDown();
      } else {
        moveUp();
      }
      break;
    }

    default: {
      if (task >= 10 && task <= 110) {
        setTargetPosition(task - 10);
      }
      break;
    }
  }
  return -1;
}



Jeszcze nie wiem co z pytaniem 2. Jak ktoś wie to proszę o info.
User avatar
klew
Posts: 11224
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

16 rolet powinno być ok. Oczywiście bez dostępnych gpio i tak nic z tym nie zrobisz. Jakiś expander portów byłby potrzebny.
wladziu22
Posts: 23
Joined: Sat Dec 02, 2023 4:40 pm

Post

hej,
dziękuję za info. Expander nie będzie potrzebny, bo mam już rolety i przyciski fizyczne (te do rolet i te grupowe) działające na Arduino Mega od kilku lat, zanim poznałem, a może nawet zanim pojawiła się Supla ;)

Dopytuje i zaglądam w Twój (Wasz) kod, bo chciałbym "wpiąć" się w kodzie Supla i wysyłać ramki po i2c z NodeMcu 1.0 (esp8266) do Ardunino Mega. Ramki zawierałaby podstawowe polecenia.

Pytanie czy już takiego czegoś nie ma w kodzie? Nie chciałbym wyważać otwartych drzwi. Dodatkowo jestem biegły w C a nie C++, wiec narazie probuje dopisać kod w klasę "RollerShutter". Zapewne byłoby lepiej jakby klasę "RollerShutter" dziedziczyła po nowej klasie np "TwoWireBridge", gdzie byłaby cala logika "notyfikacji" po i2c, do Arduino Mega.

Wkleilem krotki kod do trzech metod, i zobaczę jak to będzie działać :

Code: Select all

void RollerShutter::startClosing() {
...
  notify(channel.getChannelNumber(), currentDirection, targetPosition);
}

void RollerShutter::startOpening() {
...
  notify(channel.getChannelNumber(), currentDirection, targetPosition);
}

void RollerShutter::stopMovement() {
...
  notify(channel.getChannelNumber(), currentDirection, targetPosition);
...
}
gdzie dodana metoda notyfikacji ramki po i2c

Code: Select all

void RollerShutter::notify(int channel, int command, int position) {
    char frame[] = "[BS:W:00:000:00]";
    sprintf(frame, "[BS:W:%02d:%03d:%02d]", channel, command, position);
    SUPLA_LOG_DEBUG("RollerShutter::notify -> %s to adress %d", frame, RollerShutter::i2cSlaveAddr);
    	
    Wire.beginTransmission(RollerShutter::i2cSlaveAddr);
    Wire.write(frame);
    Wire.endTransmission();
}
User avatar
klew
Posts: 11224
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

wladziu22 wrote: Sun Aug 25, 2024 7:52 pm
Jeśli masz u siebie zewnętrzny sterownik (arduino mega), to tutaj raczej należałoby zrobić komunikację dwustronną. Tzn. ESP gada z serwrem oraz z mega.
Każdy rozkaz "otwórz", "zamknij", "stop", "zamknij lub stop", "ustaw pozycję 65%" itd. powinien być przesłany do mega, natomiast każda zmiana pozycji (którą zna mega) powinna być przesłana do ESP, który to prześle do serwera.

Klasa "RollerShutter" ma pełną obsługę logiki sterowania na przekaźnikach, więc ona się trochę nie nadaje do zastosowania jako taki interfejs do zewnętrzengo urządzenia (mega).

Jeśli Ci się bardzo nie spieszy, to w najbliższych kilku dniach powinienem dodawać tego typu klasę z interfejsem do rolet. W formie pośrednika do mega powinna ona się sprawdzić.
wladziu22
Posts: 23
Joined: Sat Dec 02, 2023 4:40 pm

Post

Hej,
klew wrote: Mon Aug 26, 2024 9:29 am Jeśli Ci się bardzo nie spieszy, to w najbliższych kilku dniach powinienem dodawać tego typu klasę z interfejsem do rolet. W formie pośrednika do mega powinna ona się sprawdzić.
Chętnie przyjrzę się tej nowej zapowiedzianej klasie "pośrednika", którą planujesz dodać. A może już masz gotową?

Oczywiście, najlepiej byłoby wykonać obustronna komunikacje, tak żeby serwer wiedział co jest "grane" w MEGA i jaką faktycznie pozycję lub stany mają rolety w domu, czyli żeby wizualizować np ruch rolety w apce, zarówno przy pomocy przycisków w domu (tak jak to widać za pomocą przycisków w apce komórki).

Nie, spieszy mi się z implementacją.
Póki co walczyłem z I2C pomiędzy Uno <-> NodeMcu, oraz jednostronnymi ramkami, które wysyła NodeMcu z "RollerShutter.cpp" -> UNO.
UNO używam zamiast MEGA, żeby nie popsuć m.in. rolet w domu ;)

Na biurku działa.
Z NodeMcu leca logi np (moje to te z prefixem >>>>>>>>>>>>> ):

Code: Select all

23:37:54.180 -> Recv: [53 55 50 4C 41 17 4F 00 00 00 6E 00 00 00 11 00 00 00 B3 00 00 00 01 96 00 96 00 6E 00 00 00 00 00 00 00 53 55 50 4C 41 ]
23:37:54.215 -> RollerShutter[1] new value from server: 110
23:37:54.215 ->  **** Digital write[1], gpio: 16; value 0
23:37:54.215 ->  **** Digital write[1], gpio: 17; value 1
>>>>>>>>>>>>>23:37:54.215 -> RollerShutter::notify -> [RS:W:01:01:100] to adress 8
23:37:54.350 -> Channel(1) value changed to 20
23:37:54.350 -> Send: [53 55 50 4C 41 17 B3 00 00 00 67 00 00 00 0E 00 00 00 01 00 00 00 00 00 14 00 00 00 00 00 00 00 ]
23:37:54.452 -> Send: [53 55 50 4C 41 ]
23:37:54.486 -> Channel(1) value changed to 21
23:37:54.521 -> Send: [53 55 50 4C 41 17 B4 00 00 00 67 00 00 00 0E 00 00 00 01 00 00 00 00 00 15 00 00 00 00 00 00 00 ]
23:37:54.588 -> Send: [53 55 50 4C 41 ]
23:37:54.656 -> Channel(1) value changed to 22
23:37:54.656 -> Send: [53 55 50 4C 41 17 B5 00 00 00 67 00 00 00 0E 00 00 00 01 00 00 00 00 00 16 00 00 00 00 00 00 00 ]
23:37:54.792 -> Channel(1) value changed to 23
23:37:54.827 -> Send: [53 55 50 4C 41 ]
23:37:54.962 -> Channel(1) value changed to 24
23:37:54.962 -> Send: [53 55 50 4C 41 17 B6 00 00 00 67 00 00 00 0E 00 00 00 01 00 00 00 00 00 18 00 00 00 00 00 00 00 ]
23:37:55.098 -> Channel(1) value changed to 25
23:37:55.133 -> Send: [53 55 50 4C 41 ]
23:37:55.235 -> Channel(1) value changed to 26
23:37:55.302 -> Send: [53 55 50 4C 41 17 B7 00 00 00 67 00 00 00 0E 00 00 00 01 00 00 00 00 00 1A 00 00 00 00 00 00 00 ]
23:37:55.405 -> Channel(1) value changed to 27
23:37:55.405 -> Send: [53 55 50 4C 41 ]
23:37:55.506 -> Send: [53 55 50 4C 41 17 B8 00 00 00 67 00 00 00 0E 00 00 00 01 00 00 00 00 00 1B 00 00 00 00 00 00 00 ]
23:37:55.540 -> Channel(1) value changed to 28
23:37:55.573 -> Send: [53 55 50 4C 41 ]
23:37:55.641 -> Send: [53 55 50 4C 41 17 B9 00 00 00 67 00 00 00 0E 00 00 00 01 00 00 00 00 00 1C 00 00 00 00 00 00 00 ]
23:37:55.709 -> Channel(1) value changed to 29
23:37:55.709 -> Send: [53 55 50 4C 41 ]
23:37:55.777 -> Send: [53 55 50 4C 41 17 BA 00 00 00 67 00 00 00 0E 00 00 00 01 00 00 00 00 00 1D 00 00 00 00 00 00 00 ]
23:37:55.848 -> Channel(1) value changed to 30
23:37:55.879 -> Send: [53 55 50 4C 41 ]
23:37:55.981 -> Recv: [53 55 50 4C 41 17 50 00 00 00 6E 00 00 00 11 00 00 00 B3 00 00 00 01 96 00 96 00 00 00 00 00 00 00 00 00 53 55 50 4C 41 ]
23:37:55.981 -> RollerShutter[1] new value from server: 0
>>>>>>>>>>>>23:37:55.981 -> RollerShutter::notify -> [RS:W:01:00:202] to adress **** Digital write[1], gpio: 16; value 0
23:37:56.015 ->  **** Digital write[1], gpio: 17; value 0
>>>>>>>>>>>>>23:37:56.015 -> RollerShutter::notify -> [RS:W:01:00:202] to adress 8
23:37:56.015 -> Send: [53 55 50 4C 41 17 BB 00 00 00 67 00 00 00 0E 00 00 00 01 00 00 00 00 00 1E 00 00 00 00 00 00 00 ]
23:37:56.085 -> Send: [53 55 50 4C 41 ]
23:38:01.004 -> Wrote 9 bytes to storage at 124
23:38:01.004 -> Wrote 7 bytes to storage at 108
23:38:01.033 -> Commit

Natomiast UNO łapie:

Code: Select all

23:38:50.102 -> New commnad: [RS:W:01:01:100]
23:38:51.561 -> New commnad: [RS:W:01:00:202]
23:38:51.561 -> New commnad: [RS:W:01:00:202]
czyli włączenie zamykania samoczynnego (lewy kursor w apce w dol) i przerwanie przyciskiem stop.
Ramka, przykładowy opis:
RS -> RollerShutter, przewiduje ramki związane z innymi funkcjami jakie mam w MEGA.
W -> zapis
01 -> roleta kanału 1
01 - komenda, kierunek w dol
100 - pozycja, tu początkowa 100, inaczej 0 (100-100)

Pozostaje kwestia obsługi ramek w MEGA, ale to już zależy od kodu autora czy też mojego.
wladziu22
Posts: 23
Joined: Sat Dec 02, 2023 4:40 pm

Post

klew wrote: Mon Aug 26, 2024 9:29 am
wladziu22 wrote: Sun Aug 25, 2024 7:52 pm
Jeśli Ci się bardzo nie spieszy, to w najbliższych kilku dniach powinienem dodawać tego typu klasę z interfejsem do rolet. W formie pośrednika do mega powinna ona się sprawdzić.
Hej, zrobiłeś może ta klasę pośrednika?
User avatar
klew
Posts: 11224
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

wladziu22 wrote: Sun Oct 13, 2024 6:09 pm
klew wrote: Mon Aug 26, 2024 9:29 am
wladziu22 wrote: Sun Aug 25, 2024 7:52 pm
Jeśli Ci się bardzo nie spieszy, to w najbliższych kilku dniach powinienem dodawać tego typu klasę z interfejsem do rolet. W formie pośrednika do mega powinna ona się sprawdzić.
Hej, zrobiłeś może ta klasę pośrednika?
Jeszcze nie

Return to “Ogólna dyskusja”