Supla na Waveshare ESP32-S3-8DI-8RO

J4c0PL
Posts: 2
Joined: Thu Jan 15, 2026 9:06 pm

Post

Dzień dobry,

Jestem nowy więc chciałem się przywitać :)
Mam problem który wynika z nietypowego zastosowania tj. potrzebuję sterowania wraz z przyciskami 6 kanałów najlepiej jednym urządzeniem, stąd padł wybór na Waveshare ESP32-S3-8DI-8RO i mam problem z nim. Otóż o ile wrzucenie Supli z Gui Generic Buildera to żaden problem, to znalezienie obsługi tego to druga strona medalu... Znalazłem już wszystkie DI, ale problem powstaje z obsługą przekaźników, ponieważ kierując się impulsem, pierw zakupiłem sprzęt, dopiero później spojrzałem, że wyjścia przekaźnikowe są sterowane przez extender TCA9554... Teraz zostałem z problemem takim, że nie mam jak sterować owymi przekaźnikami... Czy istnieje jakiś cień szansy, by ustawić któryś z dodatków do obsługi I2C (MCP czy PCF) w taki sposób, by to zadziałało ? Ewentualnie czy jeśli nie, jest szansa znaleźć jakieś wolne 6 szt na płycie i wykorzystać je jako wyjścia przekaźnikowe ?(wiem, rzeźba, ale co zrobić)

Proszę o pomoc :)
Pozdrawiam
Jacek
User avatar
george1255
Posts: 426
Joined: Fri Sep 02, 2022 8:48 pm
Location: Włodawa
Has thanked: 12 times
Been thanked: 7 times

Post

daj dokladny link do tego co kupiles na priv. Moze cos pomoge ;)
User avatar
veeroos
Posts: 1081
Joined: Sun Mar 20, 2022 9:30 am
Location: Głogów
Has thanked: 1 time
Been thanked: 9 times

Post

Hej. Patrzyłem na ten sterownik, to wygląda bardzo fajnie, w dokumentacji jest rozpis wszystkich pinów co jest do czego podłączone, więc można całkiem ciekawy sterownik z tego zbudować, aż mnie korci żeby to kupić 😂😂😂. Poprzez GG tego nie dodasz expandera do wyjść, chyba że byś chłopaków którzy tworzą nowe GG namówił żeby jego obsługę dodali. Dopisać ręcznie pisząc swój program nie będzie trudno. Wszystko w sieci jest. Więc za parę miesięcy (tak mam na tyle zajęcia z zaległymi projektami) mógłbym się pochylić nad oprogramowaniem tego modułu.
Zamel Mew-01, Zamel PEW-01, Zamel SBW-01, Zamel THW-01, Zamel SRW-01, Zamel mSLW-02, Auraton BOX + Indor Sensor, Airly Gate By Veeroos, Zigbee to Supla Gateway + sensors, Zamel SGW-01 and more

https://github.com/v33r005
radzik_r
Posts: 468
Joined: Sun Aug 11, 2019 5:32 pm
Has thanked: 1 time
Been thanked: 2 times

Post

Mam to, działa. :D :D
kimol
Posts: 7
Joined: Sun Jan 10, 2021 11:18 pm
Has thanked: 1 time

Post

Podzieli się proszę ktoś binarką do tego urządzenia :) przez GG nie jest w stanie dodać TCA9554PWR :(

albo wsadem do Arduino :)
kimol
Posts: 7
Joined: Sun Jan 10, 2021 11:18 pm
Has thanked: 1 time

Post

Podzielę się co wymodziłem... chętnie przyjmę poprawki/feedback

Code: Select all

/*
  ============================================================
  Waveshare ESP32-S3-ETH-8DI-8RO  —  Supla (Full Choice V14)
  ============================================================
  8x przekaźnik + 8x czujnik binarny (DI1-DI8)
  Przycisk BOOT przytrzymany przez 10s → tryb konfiguracji
*/

#define I2C_SDA_PIN     42
#define I2C_SCL_PIN     41
#define TCA9554_ADDR    0x20
#define TCA9554_REG_OUTPUT  0x01
#define TCA9554_REG_CONFIG  0x03

const int DI_PINS[8]   = {4, 5, 6, 7, 8, 9, 10, 11};
const int BOOT_BTN_PIN = 0;

#include <Wire.h>
#include <SuplaDevice.h>
#include <supla/network/esp_wifi.h>
#include <supla/control/virtual_relay.h> 
#include <supla/control/button.h>
#include <supla/sensor/binary.h>
#include <supla/storage/littlefs_config.h>
#include <supla/storage/eeprom.h>
#include <supla/network/esp_web_server.h>
#include <supla/network/html/device_info.h>
#include <supla/network/html/protocol_parameters.h>
#include <supla/network/html/wifi_parameters.h>
#include <supla/device/supla_ca_cert.h>
#include <supla/events.h>

static uint8_t tca_output = 0x00;

static bool tca_write(uint8_t val) {
  Wire.beginTransmission(TCA9554_ADDR);
  Wire.write(TCA9554_REG_OUTPUT);
  Wire.write(val);
  return Wire.endTransmission() == 0;
}

static bool tca_init() {
  Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN, 100000UL);
  Wire.beginTransmission(TCA9554_ADDR);
  Wire.write(TCA9554_REG_CONFIG);
  Wire.write(0x00);
  if (Wire.endTransmission() != 0) return false;
  tca_output = 0x00;
  return tca_write(tca_output);
}

static void tca_set(uint8_t idx, bool on) {
  if (on) tca_output |=  (1 << idx);
  else    tca_output &= ~(1 << idx);
  tca_write(tca_output);
}

static bool tca_get(uint8_t idx) {
  return (tca_output >> idx) & 0x01;
}

class TcaRelay : public Supla::Control::VirtualRelay {
 public:
  uint8_t idx;

  explicit TcaRelay(uint8_t index)
      : Supla::Control::VirtualRelay(), idx(index) {
  }

  void turnOn(_supla_int_t duration = 0) override {
    Supla::Control::VirtualRelay::turnOn(duration);
    tca_set(idx, true);
    
    Serial.print("[TCA9554] Przekaźnik ");
    Serial.print(idx + 1);
    Serial.println(" -> WLACZONY");
  }

  void turnOff(_supla_int_t duration = 0) override {
    Supla::Control::VirtualRelay::turnOff(duration);
    tca_set(idx, false);
    
    Serial.print("[TCA9554] Przekaźnik ");
    Serial.print(idx + 1);
    Serial.println(" -> WYLACZONY");
  }

  void onInit() override {
    Supla::Control::VirtualRelay::onInit();
    channel.setNewValue(tca_get(idx));
  }
};

Supla::Eeprom eeprom;
Supla::ESPWifi wifi;
Supla::LittleFsConfig configSupla;
Supla::EspWebServer suplaServer;

Supla::Html::DeviceInfo         htmlDeviceInfo(&SuplaDevice);
Supla::Html::WifiParameters     htmlWifi;
Supla::Html::ProtocolParameters htmlProto;

TcaRelay* relays[8];
Supla::Sensor::Binary* diSensors[8];
Supla::Control::Button* cfgButton;

void setup() {
  delay(3000);
  Serial.begin(115200);
  Serial.println("\n=== Waveshare 8DI-8RO + Supla V14 ===");

  // ⚠️ WAŻNE: Odkomentuj poniższą linię na jedno pierwsze uruchomienie, 
  // aby wyczyścić starą konfigurację kanałów w pamięci ESP, 
  // po czym zakomentuj ją i wgraj program ponownie.
  //configSupla.removeAll();

  if (tca_init()) {
    Serial.println("[TCA9554] OK");
  } else {
    Serial.println("[TCA9554] BLAD!");
  }

  // Konfiguracja 8 przekaźników
  for (int i = 0; i < 8; i++) {
    relays[i] = new TcaRelay(i);
    String caption = "Relay " + String(i + 1);
    relays[i]->setInitialCaption(caption.c_str());
    relays[i]->setDefaultStateRestore();
  }

  // Konfiguracja 8 wejść DI
  for (int i = 0; i < 8; i++) {
    diSensors[i] = new Supla::Sensor::Binary(DI_PINS[i], true, true);
    String caption = "DI" + String(i + 1);
    diSensors[i]->setInitialCaption(caption.c_str());
  }

  // Przycisk BOOT na płytce (10s trzymania odpala config)
  cfgButton = new Supla::Control::Button(BOOT_BTN_PIN, true, true);
  cfgButton->setInitialCaption("BOOT - Config (10s)");
  cfgButton->configureAsConfigButton(&SuplaDevice);
  cfgButton->setHoldTime(10000);

  // Dynamiczne generowanie unikalnej nazwy sieci konfiguracji AP na podstawie MAC
  uint8_t mac[6];
  WiFi.macAddress(mac);
  char apName[40];
  sprintf(apName, "SUPLA_%02X%02X", mac[4], mac[5]);
  
  Serial.print("[WIFI] Wygenerowana nazwa unikalna: ");
  Serial.println(apName);

  SuplaDevice.setInitialMode(Supla::InitialMode::StartInCfgMode);
  SuplaDevice.setSuplaCACert(suplaCACert);
  SuplaDevice.setSupla3rdPartyCACert(supla3rdCACert);
  
  // POPRAWKA: Przekazujemy naszą nazwę jako nazwę urządzenia. 
  // Biblioteka automatycznie nazwie tak punkt dostępowy (AP) w trybie konfiguracji!
  SuplaDevice.setName(apName);
  
  SuplaDevice.begin();
}



void loop() {
  SuplaDevice.iterate();
}
User avatar
klew
Posts: 13905
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

kimol wrote: Tue Jun 09, 2026 9:59 am Podzielę się co wymodziłem... chętnie przyjmę poprawki/feedback
Serio?
Feedback: zacznij od kompilacji i uruchomienia podstawowych przykładów z supla-device.
Następnie dodaj proste komponenty potrzebne do Twojego urządzenia.
Potem zrób komunikację z zewnętrznym układem, jeśli taka jest tam potrzebna.
Czytaj logi, postaraj się je zrozumieć.
Jak masz jakieś konkretne pytania, to pytaj.
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
klew
Posts: 13905
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

I jeśli już korzystasz z "AI", to przynajmniej wrzuć mu przykłady i dokumenty przygotowane w repo specjalnie pod AI, aby sobie trochę lepiej z kodem radziły.
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
Lector
Posts: 2470
Joined: Fri Nov 17, 2017 2:26 pm
Location: Poznań
Has thanked: 13 times
Been thanked: 25 times

Post

kimol wrote: Tue Jun 09, 2026 9:59 am Podzielę się co wymodziłem... chętnie przyjmę poprawki/feedback
Zobacz z jakich chatów ja korzystałem przy swoim firmware.
viewtopic.php?t=18601
Niespełniony automatyk. :mrgreen:
https://3d-lamp.photos/
https://pool.lector.top/
J4c0PL
Posts: 2
Joined: Thu Jan 15, 2026 9:06 pm

Post

Cześć!

Przepraszam, że temat nie monitorowany, ale udało mi się wypocić wraz z AI taki oto kod. Nie ma strony konfiguracyjnej, więc wszystko tylko z pliku, ale działa, działają wszystkie wejścia w trybie monostabilnym (łączniki dzwonkowe, przyciski, co kto woli) do tego wszystkie wyjścia są sterowane, reszty nie potrzebowałem ale myślę, że coś tam by się udało pewnie wskórać. Wrzucam to co mi się udało wypocić i życzę wszystkim zainteresowanym miłej zabawy z tym fajnym sprzętem :D
Wrzucałem za pomocą Arduino IDE 2.3.7


#include <Arduino.h>
#include <Wire.h>
#include <WiFi.h>
#include <Adafruit_XCA9554.h>

#include <SuplaDevice.h>
#include <supla/network/esp_wifi.h>
#include <supla/control/virtual_relay.h>
#include <supla/control/button.h>
#include <supla/device/supla_ca_cert.h>

// ------------------- KONFIGURACJA -------------------
const char* ssid = "xxx";
const char* password = "xxx";
#define SUPLA_SERVER "sxxx.supla.org"
#define EMAIL "xxx"

const char AUTHKEY[16] = {xxx};
const char GUID[16] = {xxx};

// DEFINICJA PINÓW DLA WAVESHARE ESP32-S3-ETH-8DI-8RO
#define I2C_SDA 42
#define I2C_SCL 41
#define TCA9554_ADDR 0x20

Adafruit_XCA9554 tca;

const int diPins[8] = {4, 5, 6, 7, 8, 9, 10, 11};

Supla::ESPWifi suplaWifi(ssid, password);

// Używamy standardowego VirtualRelay
Supla::Control::VirtualRelay* myRelays[8];
Supla::Control::Button* myButtons[8];

void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("\n--- START ---");

Wire.begin(I2C_SDA, I2C_SCL);
if (!tca.begin(TCA9554_ADDR, &Wire)) {
Serial.println("❌ Brak ekspandera!");
}

for(int i=0; i<8; i++) {
tca.pinMode(i, OUTPUT);
tca.digitalWrite(i, LOW); // Wyłączone na starcie

// Tworzymy zwykły przekaźnik wirtualny
myRelays = new Supla::Control::VirtualRelay();

// Wejścia DI
pinMode(diPins, INPUT_PULLUP);
myButtons = new Supla::Control::Button(diPins, true, true);
myButtons->addAction(Supla::TOGGLE, myRelays, Supla::ON_PRESS);
}

SuplaDevice.begin(GUID, SUPLA_SERVER, EMAIL, AUTHKEY);
}

void loop() {
SuplaDevice.iterate();

// --- RĘCZNA SYNCHRONIZACJA (To zastępuje niedziałające funkcje) ---
static bool lastStates[8] = {false};
static unsigned long lastSync = 0;

// Sprawdzaj co 50ms czy stan w Supli się zmienił
if (millis() - lastSync > 50) {
lastSync = millis();
for (int i = 0; i < 8; i++) {
bool currentState = myRelays->isOn();
if (currentState != lastStates) {
lastStates = currentState;

// FIZYCZNE STEROWANIE
if (currentState) {
tca.digitalWrite(i, HIGH); // Załącz
Serial.printf("PRZEKAŹNIK %d: FIZYCZNIE ON\n", i);
} else {
tca.digitalWrite(i, LOW); // Wyłącz
Serial.printf("PRZEKAŹNIK %d: FIZYCZNIE OFF\n", i);
}
}
}
}
}
Last edited by J4c0PL on Sat Aug 15, 2026 12:15 pm, edited 1 time in total.

Return to “Pomoc”