Virtual relay we własnym kodzie ESP32-C3

User avatar
Alex1603
Posts: 93
Joined: Sat Jan 01, 2022 1:46 pm

Post

Witam szanownych kolegów,
Proszę o pomoc lub poradę, napisałem kawałek kodu, który się dobrze kompiluje. Moim zamysłem jest zastosowanie obiektu Virtual relay, którego stan true/false chcę wykorzystać w kodzie do warunkowania operacji if(). Kod kompiluje się poprawnie, obiekty dają się opisać i przesuwać w aplikacji, jednak nie przynoszą efektu na funkcję warunkową w pętli loop{}. temat zaczerpnąłem z exampli ale nie wiem czemu nie działa u mnie. Wrzucę istotne fragmenty kodu : definicję , setup i loop :

Code: Select all

Supla::Control::Relay *relayK1 = nullptr;
Supla::Control::VirtualRelay *tryb = nullptr;
Supla::Control::VirtualRelay *stan = nullptr;
Supla::Control::VirtualRelay *logika = nullptr;
bool lastRelayState1 = false;
bool auto_man = false;
...
void setup() {
...
  relayK1 = new Supla::Control::Relay(RELAY_PIN, true);   

  auto tryb = new Supla::Control::VirtualRelay(); //auto <> manual
  tryb->setDefaultFunction(SUPLA_CHANNELFNC_POWERSWITCH);
  tryb->setDefaultStateRestore();  
...
}

void loop() {
  SuplaDevice.iterate();

  if ( tryb != nullptr) {
    bool auto_man = tryb->isOn();
    if (currentState1 != lastRelayState1) {
     lastRelayState1 = currentState1; 
     if (currentState1) { auto_man=true; } 
     else { auto_man=false; }
    }
...
    if(auto_man==true){ relayK1->turnOn();}  
    else{ relayK1->turnOff();} 
}
może wprawne oko wypatrzy problem, biblioteka 25.6.0, sterowanie zwykłego przekaźnika relay K1 (tzn. na podstawie np. temperatury) działa , Virtual nie reaguje ale daje się przesuwać,
być może to nie jest dobry obiekt do ustawiania warunku w pętli loop??

proszę o pomoc. Dziękuję serdecznie
*-------------- Pomysłów po sufit, czasu po kostki --------------*
*------ https://github.com/Rebel1603?tab=repositories ------*
User avatar
vajera
Posts: 7289
Joined: Wed Oct 31, 2018 7:58 am
Location: Biedrusko
Has thanked: 289 times
Been thanked: 161 times

Post

Alex1603 wrote: Tue Oct 28, 2025 8:11 pm Witam szanownych kolegów,
Proszę o pomoc lub poradę, napisałem kawałek kodu, który się dobrze kompiluje. Moim zamysłem jest zastosowanie obiektu Virtual relay, którego stan true/false chcę wykorzystać w kodzie do warunkowania operacji if(). Kod kompiluje się poprawnie, obiekty dają się opisać i przesuwać w aplikacji, jednak nie przynoszą efektu na funkcję warunkową w pętli loop{}. temat zaczerpnąłem z exampli ale nie wiem czemu nie działa u mnie. Wrzucę istotne fragmenty kodu : definicję , setup i loop :

Code: Select all

Supla::Control::Relay *relayK1 = nullptr;
Supla::Control::VirtualRelay *tryb = nullptr;
Supla::Control::VirtualRelay *stan = nullptr;
Supla::Control::VirtualRelay *logika = nullptr;
bool lastRelayState1 = false;
bool auto_man = false;
...
void setup() {
...
  relayK1 = new Supla::Control::Relay(RELAY_PIN, true);   

  auto tryb = new Supla::Control::VirtualRelay(); //auto <> manual
  tryb->setDefaultFunction(SUPLA_CHANNELFNC_POWERSWITCH);
  tryb->setDefaultStateRestore();  
...

}

void loop() {
  SuplaDevice.iterate();
  if ( tryb != nullptr) {
    bool auto_man = tryb->isOn();
    if (currentState1 != lastRelayState1) {
     lastRelayState1 = currentState1; 
     if (currentState1) { auto_man=true; } 
     else { auto_man=false; }
    }
...
    if(auto_man==true){ relayK1->turnOn();}  
    else{ relayK1->turnOff();} 
}
może wprawne oko wypatrzy problem, biblioteka 25.6.0, sterowanie zwykłego przekaźnika relay K1 (tzn. na podstawie np. temperatury) działa , Virtual nie reaguje ale daje się przesuwać,
być może to nie jest dobry obiekt do ustawiania warunku w pętli loop??

proszę o pomoc. Dziękuję serdecznie
O ile dobrze policzyłem "{" to auto_man jest zmienną lokalną, która ma zasięg w tym obszarze "if ( tryb != nullptr) {" do "else { auto_man=false; }
}", czyli tutaj " if(auto_man==true){ " już nie istnieje - to Ci się kompiluje?

Wyrzuć definicję bool auto_man przed " if ( tryb != nullptr) {", poza tym z kodu nie widać gdzie/czy ustawiasz wartość "currentState1"?
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
Alex1603
Posts: 93
Joined: Sat Jan 01, 2022 1:46 pm

Post

Dziękuję za odpowiedź , oczywiście nie chciałem zaśmiecać całym kodem wiadomości , zmienną currentstate jest oczywiście globalnie zadeklarowana , gdzieś obciąłem za dużo , jednak co mi teraz dało do myślenia to deklaracja zmiennej auto_man, kompiluje się bez błędu, jest zadeklarowana tylko w pętli loop no i użyta tylko lokalnie - co prawda w jednym warunku , ale ciągle nie wychodzi poza procedurę loop{}. Czy to ma prawo nie działać ? Czy tak zadeklarowana zmienna traci wartość poza obszarem if(tryb…) ? Jutro sprawdzę inną deklarację . Dziękuję za wskazanie
*-------------- Pomysłów po sufit, czasu po kostki --------------*
*------ https://github.com/Rebel1603?tab=repositories ------*
User avatar
Alex1603
Posts: 93
Joined: Sat Jan 01, 2022 1:46 pm

Post

Teraz jeszcze raz patrzę - może nie zauważyłeś, w deklaracjach globalnych u góry pomyłkowo mam powtórnie zadeklarowaną zmienną auto_man , także bool, czy jest możliwe że powtórna deklaracja w warunku if(…){} zeruje wartość ? To by tłumaczyło brak błędu kompilatora .
Jakby nie patrzeć mam w kodzie błąd 😄
*-------------- Pomysłów po sufit, czasu po kostki --------------*
*------ https://github.com/Rebel1603?tab=repositories ------*
User avatar
vajera
Posts: 7289
Joined: Wed Oct 31, 2018 7:58 am
Location: Biedrusko
Has thanked: 289 times
Been thanked: 161 times

Post

Alex1603 wrote: Tue Oct 28, 2025 9:36 pm Teraz jeszcze raz patrzę - może nie zauważyłeś, w deklaracjach globalnych u góry pomyłkowo mam powtórnie zadeklarowaną zmienną auto_man , także bool, czy jest możliwe że powtórna deklaracja w warunku if(…){} zeruje wartość ? To by tłumaczyło brak błędu kompilatora .
Jakby nie patrzeć mam w kodzie błąd 😄
Nie zauważyłem, ale to wszystko tłumaczy - powtórna deklaracja nie zeruje zmiennej globalnej, tylko tworzy nową lokalną (o tej samej nazwie), którą ustawiasz w tym zakresie {...} a później ona przepada :( i dalej sprawdzasz tę globalną (nieustawioną).
Wystarczy, że wyrzucisz to drugie bool.
Bramka Zigbee <=> SUPLA
Więcej informacji tutaj:
https://forum.supla.org/viewforum.php?f=127
FAQ https://forum.supla.org/viewtopic.php?t=17277
zzrr
Posts: 1864
Joined: Wed Oct 26, 2022 7:35 pm
Has thanked: 76 times
Been thanked: 119 times

Post

Alex1603 wrote: Tue Oct 28, 2025 8:11 pm Witam szanownych kolegów, ...
Jeśli tworzysz obiekt globalnie tak jak to zrobiłeś...
Supla::Control::VirtualRelay *tryb = nullptr;
to w Setup już nie dajesz auto
ma być
tryb = new Supla::Control::VirtualRelay();
jeśli utworzysz z auto to też można ale wtedy nie będzie widoczny w loop i Ci się warunek dla tego obiektu nie wykona
User avatar
vajera
Posts: 7289
Joined: Wed Oct 31, 2018 7:58 am
Location: Biedrusko
Has thanked: 289 times
Been thanked: 161 times

Post

zzrr wrote: Tue Oct 28, 2025 10:26 pm
Alex1603 wrote: Tue Oct 28, 2025 8:11 pm Witam szanownych kolegów, ...
Jeśli tworzysz obiekt globalnie tak jak to zrobiłeś...
Supla::Control::VirtualRelay *tryb = nullptr;
to w Setup już nie dajesz auto
ma być
tryb = new Supla::Control::VirtualRelay();
jeśli utworzysz z auto to też można ale wtedy nie będzie widoczny w loop i Ci się warunek dla tego obiektu nie wykona
Czyli mamy zlokalizowane 2 błędy.
Bramka Zigbee <=> SUPLA
Więcej informacji tutaj:
https://forum.supla.org/viewforum.php?f=127
FAQ https://forum.supla.org/viewtopic.php?t=17277
zzrr
Posts: 1864
Joined: Wed Oct 26, 2022 7:35 pm
Has thanked: 76 times
Been thanked: 119 times

Post

vajera wrote: Tue Oct 28, 2025 10:28 pm
Czyli mamy zlokalizowane 2 błędy.
chyba będzie więcej ;) Pozostałe VirtualRelay... tak samo trzeba poprawić bo pewnie są w kodzie z auto
User avatar
Alex1603
Posts: 93
Joined: Sat Jan 01, 2022 1:46 pm

Post

dziękuję koledzy,
po południu będę działał. o wynikach oczywiście poinformuję :)
*-------------- Pomysłów po sufit, czasu po kostki --------------*
*------ https://github.com/Rebel1603?tab=repositories ------*
zzrr
Posts: 1864
Joined: Wed Oct 26, 2022 7:35 pm
Has thanked: 76 times
Been thanked: 119 times

Post

@Alex1603
Zapytam tak coś nieśmiało. Zastanawiam się od wczoraj i nie daje mi to spokoju...
Z góry przepraszam jeśli wyskoczę z pytaniem które okaże się nietaktowne
Oczywiście odpowiesz jeśli zechcesz...
Ale czy Twój avatar to jest jakiś manifest polityczny? Ja rozumiem pięść zaciśniętą, walka o prawa, bunt, determinacja
Ale na pięcioramiennej czerwonej gwieździe to się trochę kontekst rozszerza i wchodzimy być może w temat że ktoś może nam tu swoimi poglądami że tak powiem w twarz pluć a my myślimy że to mżawka naszła.
Przepraszam wszystkich za takie pytanie totalnie nie mające nic wspólnego z SUPLĄ ale zdradzisz ździebko...

Return to “Pomoc”