Pytania techniczne dotyczące kodu [bramka ZigBee]

Moderator: vajera

User avatar
klew
Posts: 13911
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 136 times
Been thanked: 137 times

Post

vajera wrote: Fri Dec 12, 2025 12:04 pm żeby zachować wsteczną kompatybilność?
To się nie będzie kompilować. Tzn. trzeba by wszystkie klasy, które implementują swoje "handleAction" poprawić, aby sygnatura funkcji się zgadzała.
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
vajera
Posts: 7293
Joined: Wed Oct 31, 2018 7:58 am
Location: Biedrusko
Has thanked: 291 times
Been thanked: 161 times

Post

@klew W nawiązaniu do tego postu:

viewtopic.php?p=194477#p194477

Ten podział na subdevices - to skomplikowana sprawa? Jest szansa na jakiś przykład?
Bramka Zigbee <=> SUPLA
Więcej informacji tutaj:
https://forum.supla.org/viewforum.php?f=127
FAQ https://forum.supla.org/viewtopic.php?t=17277
User avatar
klew
Posts: 13911
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 136 times
Been thanked: 137 times

Post

vajera wrote: Mon Dec 22, 2025 8:42 am @klew W nawiązaniu do tego postu:

viewtopic.php?p=194477#p194477

Ten podział na subdevices - to skomplikowana sprawa? Jest szansa na jakiś przykład?
Podstawy powinny być proste.
Ja ogólnie mam klasę "DevicesConfigurator", która dziedziczy po Supla::Element i trzyma też listę sparowanych urządzeń.
W metodzie onRegistered oznaczam sobie wszystkie "subdevice" jako "do wysłania", a następnie w itarateConnected podsyłam detale każdego urządzenia z lekkim opóźnieniem (najpierw około 6 s czekam po rejestracji, a potem wysyłam - bo po samej rejestracji i tak leci masa komunikatów, więc nie chcę dokładać).

Powyższe pozwala na przesłanie nazwy, numeru seryjnego, wersji softu, wersji hw oraz "subdevice id" (liczby od 1 do 255).

Drugi ważny element, to oznaczenie każdego kanału odpowiednim subdevice id.
W kodzie każdego kanału/urządzenia:

Code: Select all

  channel.setSubDeviceId(deviceId);
Tu fragment tego DevicesConfigurator:

Code: Select all

void DevicesConfigurator::onRegistered(Supla::Protocol::SuplaSrpc *srpc) {
  this->srpc = srpc;
  // delay sending subdevice details to server by 1 s
  lastSendTime = millis();
  for (int i = 0; i < MAX_DEVICE_COUNT; i++) {
    if (devices[i] != nullptr) {
      devices[i]->prepareDetailsToSend();
    }
  }
}

bool DevicesConfigurator::iterateConnected() {
  bool dataSend = false;
  if (srpc == nullptr ||  millis() - lastSendTime < 6000) {
    return !dataSend;
  }
  lastSendTime = millis() - 5700;

  for (int i = 0; i < MAX_DEVICE_COUNT; i++) {
    if (devices[i] != nullptr && devices[i]->isDeviceDetailsReadyToSend()) {
      TDS_SubdeviceDetails subdeviceDetails = {};
      subdeviceDetails.SubDeviceId = devices[i]->getSubDeviceId();
      strncpy(subdeviceDetails.Name, devices[i]->getDeviceName(),
              SUPLA_DEVICE_NAME_MAXSIZE - 1);
      strncpy(subdeviceDetails.SoftVer, devices[i]->getFirmwareVersion(),
              VERSION_MAX_LENGTH);

      snprintf(subdeviceDetails.ProductCode,
               SUPLA_SUBDEVICE_PRODUCT_CODE_MAXSIZE, "%s (%s)",
               devices[i]->getProductCode(), devices[i]->getHardwareVersion());

      strncpy(subdeviceDetails.SerialNumber, devices[i]->getSerialNumber(),
              SERIAL_MAX_LENGTH);

      srpc->sendSubdeviceDetails(&subdeviceDetails);
      devices[i]->clearDeviceDetailsReadyToSend();
      dataSend = true;
      break;
    }
  }

  return !dataSend;
}
Do tego jeszcze dochodzi możliwość przesyłania komend "identify" i "reset" przez urządzenia. Ale nie wiem czy tego w bramce używasz. Jakby urządzenia ZigBee to miały i chciałbyś taką opcję udostępnić, to daj znać.

Do grupowania po "subdevice" w Cloud, chyba wystarczy, że kanały oznaczysz odpowiednim setSubdeviceId(nr). A ta druga część pozwala na dosłanie detali co to za urządzenie.
Numery nie muszą być ciągłe. Wartość "0" oznacza kanał na głównym urządzeniu.
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
vajera
Posts: 7293
Joined: Wed Oct 31, 2018 7:58 am
Location: Biedrusko
Has thanked: 291 times
Been thanked: 161 times

Post

klew wrote: Mon Dec 22, 2025 9:53 am Podstawy powinny być proste.
Ja ogólnie mam klasę "DevicesConfigurator", która dziedziczy po Supla::Element i trzyma też listę sparowanych urządzeń.
W metodzie onRegistered oznaczam sobie wszystkie "subdevice" jako "do wysłania", a następnie w itarateConnected podsyłam detale każdego urządzenia z lekkim opóźnieniem (najpierw około 6 s czekam po rejestracji, a potem wysyłam - bo po samej rejestracji i tak leci masa komunikatów, więc nie chcę dokładać).

Powyższe pozwala na przesłanie nazwy, numeru seryjnego, wersji softu, wersji hw oraz "subdevice id" (liczby od 1 do 255).

Drugi ważny element, to oznaczenie każdego kanału odpowiednim subdevice id.
W kodzie każdego kanału/urządzenia:

Code: Select all

 .....
Dzięki!
Do tego jeszcze dochodzi możliwość przesyłania komend "identify" i "reset" przez urządzenia. Ale nie wiem czy tego w bramce używasz. Jakby urządzenia ZigBee to miały i chciałbyś taką opcję udostępnić, to daj znać.
W tek chwili używam IDENTIFY i RESET dla samej bramki - tutaj coś się zmieni? Urządzenia Zigbee mogą mieć funkcję IDENTIFY, z możliwością resetu chyba się nie spotkałem.
Bramka Zigbee <=> SUPLA
Więcej informacji tutaj:
https://forum.supla.org/viewforum.php?f=127
FAQ https://forum.supla.org/viewtopic.php?t=17277
User avatar
klew
Posts: 13911
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 136 times
Been thanked: 137 times

Post

vajera wrote: Mon Dec 22, 2025 10:13 am W tek chwili używam IDENTIFY i RESET dla samej bramki - tutaj coś się zmieni? Urządzenia Zigbee mogą mieć funkcję IDENTIFY, z możliwością resetu chyba się nie spotkałem.
Dla bramki się nie zmienia.
Przy subudevice można też dodać te polecenia dla konkretnego subdevice (osobno reset i identify).
Ale to nie koliduje z tym co opisałem wcześniej, więc możesz ogarnąć najpierw ten pierwszy etap.
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
vajera
Posts: 7293
Joined: Wed Oct 31, 2018 7:58 am
Location: Biedrusko
Has thanked: 291 times
Been thanked: 161 times

Post

klew wrote: Mon Dec 22, 2025 9:53 am
Podstawy powinny być proste.
Ja ogólnie mam klasę "DevicesConfigurator", która dziedziczy po Supla::Element i trzyma też listę sparowanych urządzeń.
W metodzie onRegistered oznaczam sobie wszystkie "subdevice" jako "do wysłania", a następnie w itarateConnected podsyłam detale każdego urządzenia z lekkim opóźnieniem (najpierw około 6 s czekam po rejestracji, a potem wysyłam - bo po samej rejestracji i tak leci masa komunikatów, więc nie chcę dokładać).

Powyższe pozwala na przesłanie nazwy, numeru seryjnego, wersji softu, wersji hw oraz "subdevice id" (liczby od 1 do 255).
Zastosowałem się do Twoich wytycznych, zdefiniowałem odpowiednią klasę, oczywiście dostosowałem do moich struktur danych.
Dałem ten sam warunek progu czasowego oraz wysłanie po jednym urządzeniu, niestety mam coś takiego:

Code: Select all

[ 12694][I][z2s_devices_table.h:780] iterateConnected(): ------------------------------
[ 12695][I][z2s_devices_table.h:781] iterateConnected(): 0: _TZE204_ltwbm23f
[ 12695][I][z2s_devices_table.h:782] iterateConnected(): ------------------------------

Sending subdevice details failed

[ 12994][I][z2s_devices_table.h:780] iterateConnected(): ------------------------------
[ 12995][I][z2s_devices_table.h:781] iterateConnected(): 1: Aqara
[ 12995][I][z2s_devices_table.h:782] iterateConnected(): ------------------------------

Sending subdevice details failed
Poniżej czasy:

Code: Select all

[2025-12-22 18:38:51.860] LAST STATE ADDED: Registered and ready

Code: Select all

[2025-12-22 18:38:57.721] [ 10205][I][ZigbeeGateway.cpp:2695] sendCustomClusterCmd(): _custom_cmd_last_tsn = 2
[2025-12-22 18:38:57.921] [ 10405][I][ZigbeeGateway.cpp:2703] sendCustomClusterCmd(): _custom_cmd_last_tsn_flag = 2
[2025-12-22 18:38:57.952] [ 10426][I][z2s_devices_table.h:780] iterateConnected(): ------------------------------
[2025-12-22 18:38:57.952] [ 10427][I][z2s_devices_table.h:781] iterateConnected(): 0: _TZE204_ltwbm23f
[2025-12-22 18:38:57.952] [ 10427][I][z2s_devices_table.h:782] iterateConnected(): ------------------------------
[2025-12-22 18:38:57.952] Sending subdevice details failed
[2025-12-22 18:38:58.246] [ 10726][I][z2s_devices_table.h:780] iterateConnected(): ------------------------------
[2025-12-22 18:38:58.246] [ 10727][I][z2s_devices_table.h:781] iterateConnected(): 1: Aqara
[2025-12-22 18:38:58.246] [ 10727][I][z2s_devices_table.h:782] iterateConnected(): ------------------------------
[2025-12-22 18:38:58.246] Sending subdevice details failed
Bramka Zigbee <=> SUPLA
Więcej informacji tutaj:
https://forum.supla.org/viewforum.php?f=127
FAQ https://forum.supla.org/viewtopic.php?t=17277
User avatar
klew
Posts: 13911
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 136 times
Been thanked: 137 times

Post

Może wersja proto za niska?
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
vajera
Posts: 7293
Joined: Wed Oct 31, 2018 7:58 am
Location: Biedrusko
Has thanked: 291 times
Been thanked: 161 times

Post

klew wrote: Mon Dec 22, 2025 5:46 pm Może wersja proto za niska?
Jak ją podnieść - korzystam z SD sprzed tygodnia? EDIT - już wiem:

Code: Select all

SuplaDevice.begin(28);
Bramka Zigbee <=> SUPLA
Więcej informacji tutaj:
https://forum.supla.org/viewforum.php?f=127
FAQ https://forum.supla.org/viewtopic.php?t=17277
User avatar
vajera
Posts: 7293
Joined: Wed Oct 31, 2018 7:58 am
Location: Biedrusko
Has thanked: 291 times
Been thanked: 161 times

Post

Poszło na proto 28, ale w warstwie wizualnej Cloud - bez zmian?

Czy to przypisanie:

Code: Select all

element->getChannel()->setSubDeviceId(zb_device_number_slot + 1);
może być po utworzeniu kanału a przed begin(28)?

Czy dopiero po przesłaniu danych urządzeń mogę ustawiać subDeviceId?
Bramka Zigbee <=> SUPLA
Więcej informacji tutaj:
https://forum.supla.org/viewforum.php?f=127
FAQ https://forum.supla.org/viewtopic.php?t=17277
User avatar
vajera
Posts: 7293
Joined: Wed Oct 31, 2018 7:58 am
Location: Biedrusko
Has thanked: 291 times
Been thanked: 161 times

Post

@klew - zadziałało po tym, jak usunąłem urządzenie z Cloud i pozwoliłem bramce dodać się ponownie - to jest jedyna opcja?

obraz_2025-12-22_191447061.png
You do not have the required permissions to view the files attached to this post.
Bramka Zigbee <=> SUPLA
Więcej informacji tutaj:
https://forum.supla.org/viewforum.php?f=127
FAQ https://forum.supla.org/viewtopic.php?t=17277

Return to “Bramka ZigBee”