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

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);
}
}
}
}
}