Aktualizacja SuplaDevice

User avatar
lukfud
Posts: 2480
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa
Has thanked: 13 times
Been thanked: 11 times

Post

Przeklejam z priva do @klew
lukfud wrote: Wed Feb 19, 2020 8:08 am Źle się wyraziłem ;)

Chodziło mi o to, że nie znam się na metodach, klasach (jeszcze) i trudno mi ogarnąć, gdzie mogę użyć ten kawałek kodu. Co mogę dzięki niemu osiągnąć?

Code: Select all

#include <supla/io.h>

class MyDigitalRead : public Supla::Io {
  public:
    int customDigitalRead(int channelNumber, uint8_t pin) {
      if (channelNumber == MY_EXTRA_VIRTUAL_CHANNEL) {
        return someCustomSourceOfData.getValue();
      } else {
        return ::digitalRead(pin);
      }
    }
}

MyDigitalRead instanceMyDigitalRead;
Znalazłem przykład zastosowania https://es-forum.supla.org/viewtopic.php?p=61190#p61190, ale niestety nie wiem co tam się wydarza.

To co udało mi się ogarnąć, to różnica między

Code: Select all

SuplaDevice.relayOn(channel, value);
a

Code: Select all

turnOn()
gdzie przekazujemy dane np. z utworzonej naszej zmiennej dla przekaźnika.
RSSI można wrzucić do klasy jakiegoś sensora (zamiast czytania wirtualnego pinu). Będzie zgrabniej. Do jakiego typu kanału chciałbyś to wrzucić?
a napiszesz mi jak i jak po nowemu ogarnąć bme280?
https://www.facebook.com/groups/supladiy
https://www.facebook.com/groups/suplazamel
https://www.facebook.com/groups/suplaauraton
https://smartnerzeczy.pl
User avatar
klew
Posts: 13911
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 135 times
Been thanked: 137 times

Post

To ja też przeklejam priva ;)

SuplaDevice po staremu była napisana bardzo w stylu tzw. programowania strukturalnego. Jest ono na pierwszy rzut oka łatwiejsze do zrozumienia, bo widać wszystko co się dzieje.
Niestety im bardziej złożony program, tym kod zaczyna być mniej czytelny, wprowadzanie zmian dla jednego czujnika, może wysadzić inną funkcjonalność i ogólnie robi bałagan trudny do rozbudowy i ogarnięcia.

SuplaDevice po nowemu jest napisana w stylu Object Oriented. Czyli wszystko co jest, to w miarę odizolowane od siebie obiekty.
W pliku readme.md powoli nadrabiam zaległości dokumentacyjne i tam opiszę jak to działa, ale w skrócie, każdy "Element" (i wszystkie klasy, które dziedizczą po Element) same się rejestrują w odpowiedniej liście i SuplaDevice w kółko odpala różne metody na każdym z tych elementów. Każdy element jest oddzielny, więc bez problemu można dodać 4 czujniki DHT22 bez ingerencji w kod. W programowaniu strukturalnym trafialiśmy w jedną metodę, którą trzeba było rozbudowywać na każdy przypadek (u nas były to callbacki).

Wszystkie klasy dziedziczące po Element, mają cechy tej klasy bazowej. Dzięki temu SuplaDevice nie zna szczegółów tego co się dzieje w każdym elemencie, ale każdy z nich zainicjalizuje (metoda onInit) i każdy będzie iterowała w loop() - np metoda "iterateAlways" oraz "iterateConnected" (wywoływana tylko gdy mamy połączenie z serwerem Supli).

Tyle tytułem wstępu ;)

MyDigitalRead - jak dla mnie to stary wytrych na trudne elementy starej biblioteki. Pozwalał wpiąć różne rzeczy w miarę prosty sposób. Aktualnie ta klasa wg mnie powinna być używana tylko gdy mamy jakieś ekspandery portów - ale i to może nie działać bardzo dobrze, bo jeszcze trochę brakuje :)

Odnośnie RSSI - czytać można np. do klasy termometru (dopóki nie mamy kanału general purpose). Np:

Code: Select all

#include <supla/sensor/thermometer.h>

class RssiChannel : public Supla::Sensor::Thermometer {
  RssiChannel() {}
  
  onInit() {
    channel.setNewValue(getValue() ));
  }
  
  double getValue() {
     return rssiValueTakenFromSomewhere();
  }
}

// w setup:
new RssiChannel;
BME będę niedługo robił u siebie. Też to trudne nie będzie, ale będą do ogarnięcia dwa kanały (bo dochodzi ciśnienie). Także najlepiej chwilę poczekać
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
lukfud
Posts: 2480
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa
Has thanked: 13 times
Been thanked: 11 times

Post

Dziękuję za obszerną odpowiedź! :)
klew wrote: Wed Feb 19, 2020 9:22 am Odnośnie RSSI - czytać można np. do klasy termometru (dopóki nie mamy kanału general purpose). Np:

Code: Select all

#include <supla/sensor/thermometer.h>

class RssiChannel : public Supla::Sensor::Thermometer {
  RssiChannel() {}
  
  onInit() {
    channel.setNewValue(getValue() ));
  }
  
  double getValue() {
     return WiFi.RSSI();
  }
}

// w setup:
new RssiChannel;
dostaje błąd przy wierszu onInit()

Code: Select all

ISO C++ forbids declaration of 'onInit' with no type [-fpermissive]
a jak dodaje w setup: new RssiChannel;

Code: Select all

expected type-specifier before 'RssiChannel'
https://www.facebook.com/groups/supladiy
https://www.facebook.com/groups/suplazamel
https://www.facebook.com/groups/suplaauraton
https://smartnerzeczy.pl
User avatar
klew
Posts: 13911
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 135 times
Been thanked: 137 times

Post

lukfud wrote: Wed Feb 19, 2020 9:42 am Dziękuję za obszerną odpowiedź! :)
klew wrote: Wed Feb 19, 2020 9:22 am Odnośnie RSSI - czytać można np. do klasy termometru (dopóki nie mamy kanału general purpose). Np:

Code: Select all

#include <supla/sensor/thermometer.h>

class RssiChannel : public Supla::Sensor::Thermometer {
  RssiChannel() {}
  
  onInit() {
    channel.setNewValue(getValue() ));
  }
  
  double getValue() {
     return WiFi.RSSI();
  }
}

// w setup:
new RssiChannel;
dostaje błąd przy wierszu onInit()

Code: Select all

ISO C++ forbids declaration of 'onInit' with no type [-fpermissive]
a jak dodaje w setup: new RssiChannel;

Code: Select all

expected type-specifier before 'RssiChannel'
Powinno być

Code: Select all

void onInit()
;)
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
lukfud
Posts: 2480
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa
Has thanked: 13 times
Been thanked: 11 times

Post

klew wrote: Wed Feb 19, 2020 9:56 am

Code: Select all

Powinno być [code]void onInit()
;)

Ok, to poszło, ale nadal jest błąd przy wierszu new RssiChanel:

Code: Select all

expected type-specifier before 'RssiChannel'
EDIT

Poprawiony kod klasy:

Code: Select all

class RssiChannel : public Supla::Sensor::Thermometer {
  public: RssiChannel() {}
  void onInit() { channel.setNewValue(getValue()); }
  double getValue() { return WiFi.RSSI(); }
};
Błędy się już nie pojawiają :)
Last edited by lukfud on Wed Feb 19, 2020 8:32 pm, edited 1 time in total.
https://www.facebook.com/groups/supladiy
https://www.facebook.com/groups/suplazamel
https://www.facebook.com/groups/suplaauraton
https://smartnerzeczy.pl
User avatar
lukfud
Posts: 2480
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa
Has thanked: 13 times
Been thanked: 11 times

Post

klew wrote: Wed Feb 12, 2020 11:58 pm
lukfud wrote: Wed Feb 12, 2020 9:59 pm Testowy wemos leży koło routera. Przed chwilą wgrałem raz jeszcze prosty sketch i niestety to samo..
Po kilku priwach okazało się, że problem nie jest w implementacji przekaźników, tylko trafiliśmy jeszcze raz na pewien drobny błąd po stronie supla-server.

@pzygmunt czy supla-server z poprawkami na odbieranie wiadomości z kolejek jest dostępna w dockerach? lukfud zaktualizował swój prywatny cloud do 2.3.19 i problem występuje nadal.
Testując dalej natknąłem się na następny problem: odczyty kanału termometru nie pokazują się w Cloud własnej instancji (w androidowej app, tak). W oficjalnym Cloud wartości są widoczne.

@pzygmunt
Czy przed 2.4 przewidujecie aktualizację dockera?
https://www.facebook.com/groups/supladiy
https://www.facebook.com/groups/suplazamel
https://www.facebook.com/groups/suplaauraton
https://smartnerzeczy.pl
andrew01
Posts: 163
Joined: Fri May 24, 2019 6:49 am

Post

Jest jakiś problem z serialem z nową biblioteką przy ESP, w sensie przy starcie działa, ale od SuplaDevice.begin już nie ma żadnego komunikatu na porcie szeregowym.
User avatar
klew
Posts: 13911
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 135 times
Been thanked: 137 times

Post

andrew01 wrote: Sat Feb 22, 2020 10:14 pm Jest jakiś problem z serialem z nową biblioteką przy ESP, w sensie przy starcie działa, ale od SuplaDevice.begin już nie ma żadnego komunikatu na porcie szeregowym.
A nie ustawiłeś przypadkiem jakiegoś urządzenia na GPIO TX lub RX?
Najlepsze suple dla Twojego domu :mrgreen:
andrew01
Posts: 163
Joined: Fri May 24, 2019 6:49 am

Post

Aaaa widzisz, mądrego to aż dobrze posłuchać :) ustawiłem GATE_OPEN_PIN 1 - to by wiele tłumaczyło, dzięki bardzo :)
themechanos
Posts: 36
Joined: Tue Oct 01, 2019 10:52 am

Post

@klew A jak idzie przeróbka rolet na nowo ? :D

Return to “Arduino IDE”