Wysyłanie stanu przekaźnika do SuplaCloud

PawelM
Posts: 14
Joined: Thu Dec 29, 2022 2:25 pm

Post

Cześć,
używam ESP8266 z postawioną stroną (html, websocket) do włączania i wyłączania lokalnie (pompy, oswietlenie, odczyt temp itp). Chciałem dodać funkcjonalność SUPLA i niby wszystko działa tak jak powinno od strony SuplaCloud ale gdy lokalnie zmieniam stan wyjścia to w SUPLA on się nie zmienia. Szukam informacji od dłuższego czasu, ponieważ funkcja:

Code: Select all

SuplaDevice.channelValueChanged()

przestała działać od pewnej wersji, nie ma nawet jej w podpowiedzi w ArduinoIDE.

Moje pytanie brzmi - jak wysłać na serwer zmianę stanu przekaźnika? Chciałbym uniknąć przebudowy wszystkiego - jest to możliwe? Nie wchodząc w szczegóły kodu poniżej coś co z głowy wyciągnąłem:

Code: Select all

//extender portów
PCF8574 EXT1(0x21);
PCF8574 EXT2(0x22);

#define K0 0  //Przekaznik 0 w EXT1 expander portów
#define S0 0 //Przycisk 0 w EXT2 input expander portów

bool K0status =1;

void loop(){

EXT1.write(K0, K0status);

if(S0){
K0status = 0;
//tutaj mógłbym wysłać na serwer supla zmianę stanu
}

 EXT1.write(K0, K0status);

}

Może - jak tutaj to nazywacie - mało eleganckie ale tym sposobem miałbym załatwioną informację dla suplacloud, że ESP8266 lokalnie zmienił status wyjścia np przez harmonogram czasowy który już mam zrobiony. Kod wyżej pisany z głowy, na pewno ma błędy ;)
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

suplda-device nie monitoruje stanu wyjść, tylko zakłada, że tylko ona tym zarządza ;)

Wg mnie najprościej jest to zrobić tak, że zamiast operować samemu na wyjściach, to odpalać metody na klasach z Supli - niech one ustawią stan na GPIO i wtedy będzie też poprawny stan w Cloud.

Czyli np. taka linijka:

Code: Select all

EXT1.write(K0, K0status);
zamieniasz na:

Code: Select all

if (K0status) {
  relay1->turnOn();
} else {
  relay1->turnOff();
}
"relay1" to instancja klasy Supla::Control::Relay, która jest ustawiona do sterowania tym GPIO K0.

Alternatywnie możesz dodatkowo odpalać te metody "turnOn"/"turnOff" w tym miejscu co zaznaczyłeś komentarzem w kodzie. Tylko one również spróbują ustawić odpowiedni stan na GPIO. Z reguły w niczym to nie przeszkadza, ale piszę, aby nie było niespodzianek :)
Najlepsze suple dla Twojego domu :mrgreen:
PawelM
Posts: 14
Joined: Thu Dec 29, 2022 2:25 pm

Post

Czyli tak jak się domyślałem żeby przerobić wszystko tak jak podpowiadasz.

To teraz drugie pytanie:
Czy zmieniając

Code: Select all

relay1->turnOn();
gdy nie mamy połączenia z supla cloud (załóżmy czysto teoretycznie, że zerwało połączenie z internetem) to po ponownym połączeniem z supla cloud będzie widoczny poprawny stan włączonego/wyłączonego relay1 ?
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

PawelM wrote: Fri Dec 30, 2022 9:20 am Czyli tak jak się domyślałem żeby przerobić wszystko tak jak podpowiadasz.

To teraz drugie pytanie:
Czy zmieniając

Code: Select all

relay1->turnOn();
gdy nie mamy połączenia z supla cloud (załóżmy czysto teoretycznie, że zerwało połączenie z internetem) to po ponownym połączeniem z supla cloud będzie widoczny poprawny stan włączonego/wyłączonego relay1 ?
Tak, jeśli będziesz używał tylko tych metod do ustawiania stanu z biblioteki supla-device, to biblioteka się odwdzięczy i zadba o to, aby wszystkie dane były poprawnie przekazywane do Clouda :)
Najlepsze suple dla Twojego domu :mrgreen:
PawelM
Posts: 14
Joined: Thu Dec 29, 2022 2:25 pm

Post

Okej, ciężko mi z tym ale przepiszę.
Pozdrawiam, wszystkiego najlepszego w nadchodzącym nowym roku :D
PawelM
Posts: 14
Joined: Thu Dec 29, 2022 2:25 pm

Post

Przepisuje kod i naszła mnie myśl - jak sprawdzić czy z aplikacji supla ktoś zmienił stan relay-a? Mamy taką możliwość?
Kiedyś znalazłem kod tutaj na forum i dopisałem swoje wypociny w sumie trochę dla sprawdzenia tylko pytanie czy nie wyważam otwartych drzwi w ten sposób?

Code: Select all

    
for (auto element = Supla::Element::begin(); element != nullptr; element = element->next()) { // iterujemy po wszystkich elementach dodanych do programu
    if (element->getChannel()) { // sprawdzamy, czy do elementu jest przypisany kanał. Niektóre elementy (np. button) nie posiadają kanału.
      auto channel = element->getChannel();
      auto numer = element->getChannelNumber();
        //Serial.println(channel->getChannelNumber());
      if (channel->getChannelType() == SUPLA_CHANNELTYPE_RELAY) {
        auto rilej = channel->getValueBool();
        if(numer == 7 && rilej == 1){
          Serial.println("przekaznik nr 7 wlaczony");
        }
      }
    }
  }

petione
Posts: 121
Joined: Sat Jul 21, 2018 4:26 pm

Post

Przeczytaj sobie wątek o relayach w bibliotece
https://forum.supla.org/viewtopic.php?t=7263
PawelM
Posts: 14
Joined: Thu Dec 29, 2022 2:25 pm

Post

petione wrote: Fri Dec 30, 2022 8:37 pm Przeczytaj sobie wątek o relayach w bibliotece
https://forum.supla.org/viewtopic.php?t=7263
Uwielbiam takie odpowiedzi odsyłające do ogólnej globalnej dyskusji na zasadzie: "masz to, doucz się łamago" bez wskazania co autor miał na myśli rodem z elektrody ;) . Dlatego lubię czytać odpowiedzi Klew oraz kilku innych osób z tego forum bo widać, że chce im się pomóc.
Czytałem ten temat niemalże do końca wielokrotnie ale fakt - pomogło mi to co napisałeś czyli przeczytałem jeszcze raz a prościej by było napisać:

użyj:

Code: Select all

r1->isOn(); // zwraca true/false w zależności od tego czy przekaźnik jest włączony czy nie

jest to opisane w tym wątku: viewtopic.php?t=7263

Mimo wszystko dzięki. Rozpisałem w tym czasie po swojemu jak wyżej wskazałem i też działa :P Ale już widzę, że to zmienię.
PawelM
Posts: 14
Joined: Thu Dec 29, 2022 2:25 pm

Post

Code: Select all

r1->isOn(); // zwraca true/false w zależności od tego czy przekaźnik jest włączony czy nie

Niestety albo nie ma tego w bibliotece(najnowsza) albo nie potrafię tego użyć.

Code: Select all

if(relay0->isOn()){

	K0status = 0;
}

kompiluje z błędem, że nie odnaleziono isOn().
PawelM
Posts: 14
Joined: Thu Dec 29, 2022 2:25 pm

Post

Sam sobie odpowiem :P

kompilator wywalał mi błąd, że nie odnaleziono isON()... ale miałem wpisane mimo wszystko poprawnie isOn(). Bzdura jakich mało, zrobiłem na odwrót celowo z błędem a później poprawiłem i zadziałało. Normalnie cyrk :shock:

Return to “Pomoc”