Termostat DIY do testowania :)

User avatar
klew
Posts: 9638
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

vajera wrote: Fri May 17, 2024 10:06 am To może jeszcze raz - chcę na urządzeniu wyświetlać stan countdown timer-a dla termostatu - czy jest aktywny i ile czasu pozostało. Opcjonalnie z możliwością pauzy/przerwania odliczania. Jak dobrać się do tych funkcji?
Na HvacBase masz metodę:

Code: Select all

  bool isCountdownEnabled();
która zwaraca true, gdy w danej chwili termostat pracuje z timerem.

Przed chwilą dorzuciłem też gettera do pobrania czasu, kiedy timer się kończy:

Code: Select all

  // returns Linux timestamp in seconds when current countdown timer will end.
  // It return 1 if countdown timer is not set
  time_t getCountDownTimerEnds() const;
Czas to linux timestamp końca odliczania. Obecny czas, w tym samym formacie, możesz pobrać z klasy Clock:

Code: Select all

    Supla::Clock::GetTimeStamp();
Odejmując od siebie te wartości, otrzymasz ilość sekund do końca odliczania.

Aby to dobrze działało, to oczywiście urządzenie musi znać aktualny czas, więc zegarek z podtrzymaniem bateryjnym jest jak najbardziej wskazany.

PS: dobrze, że podbiłeś temat, bo poprzednią wiadomość przeczytałem, gdy nie miałem czasu odpisać i potem zapomniałem :)
Kiedy będzie Supla Offline Party / SOP#2025 ?
vajera
Posts: 472
Joined: Wed Oct 31, 2018 7:58 am

Post

klew wrote: Fri May 17, 2024 10:19 am
vajera wrote: Fri May 17, 2024 10:06 am To może jeszcze raz - chcę na urządzeniu wyświetlać stan countdown timer-a dla termostatu - czy jest aktywny i ile czasu pozostało. Opcjonalnie z możliwością pauzy/przerwania odliczania. Jak dobrać się do tych funkcji?
Na HvacBase masz metodę:

Code: Select all

  bool isCountdownEnabled();
która zwaraca true, gdy w danej chwili termostat pracuje z timerem.

Przed chwilą dorzuciłem też gettera do pobrania czasu, kiedy timer się kończy:

Code: Select all

  // returns Linux timestamp in seconds when current countdown timer will end.
  // It return 1 if countdown timer is not set
  time_t getCountDownTimerEnds() const;
Czas to linux timestamp końca odliczania. Obecny czas, w tym samym formacie, możesz pobrać z klasy Clock:

Code: Select all

    Supla::Clock::GetTimeStamp();
Odejmując od siebie te wartości, otrzymasz ilość sekund do końca odliczania.

Aby to dobrze działało, to oczywiście urządzenie musi znać aktualny czas, więc zegarek z podtrzymaniem bateryjnym jest jak najbardziej wskazany.

PS: dobrze, że podbiłeś temat, bo poprzednią wiadomość przeczytałem, gdy nie miałem czasu odpisać i potem zapomniałem :)
Wow, dzięki! Zasadniczo nie lubię podbijać i zawracać głowę, ale tym bardziej dziękuję.

To ostatnie pytanie - jak uruchomić ten timer z urządzenia i ustawić czas odliczania? Z tego, co widzę w kodzie to opcji pauzy raczej nie da się zrobić.
User avatar
klew
Posts: 9638
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

vajera wrote: Fri May 17, 2024 10:26 am To ostatnie pytanie - jak uruchomić ten timer z urządzenia i ustawić czas odliczania? Z tego, co widzę w kodzie to opcji pauzy raczej nie da się zrobić.
Wystartować timer możesz tymi metodami:

Code: Select all

  bool applyNewRuntimeSettings(int mode,
                               int16_t tHeat,
                               int16_t tCool,
                               int32_t durationSec = 0);
                               
  // keeps the temperature setpoints
  bool applyNewRuntimeSettings(int mode,
                               int32_t durationSec = 0);
W pierwszej ustawiasz tryb, temperaturę grzania i/lub chłodzenia oraz czas trwania w sekundach.
W drugiej ustawiasz tylko tryb i czas trwania (temperatury zachowuje aktualne).

Nie ma opcji pauzowania.
Kiedy będzie Supla Offline Party / SOP#2025 ?
vajera
Posts: 472
Joined: Wed Oct 31, 2018 7:58 am

Post

klew wrote: Fri May 17, 2024 10:30 am
Wystartować timer możesz tymi metodami:

Code: Select all

  bool applyNewRuntimeSettings(int mode,
                               int16_t tHeat,
                               int16_t tCool,
                               int32_t durationSec = 0);
                               
  // keeps the temperature setpoints
  bool applyNewRuntimeSettings(int mode,
                               int32_t durationSec = 0);
W pierwszej ustawiasz tryb, temperaturę grzania i/lub chłodzenia oraz czas trwania w sekundach.
W drugiej ustawiasz tylko tryb i czas trwania (temperatury zachowuje aktualne).

Nie ma opcji pauzowania.
Jeszcze raz wielkie dzięki. Z kodu wynika, że ustawienie durationSec = 0 automatycznie wygasza timer, więc mam komplet.
vajera
Posts: 472
Joined: Wed Oct 31, 2018 7:58 am

Post

I znowu ja ;-)

metoda

Code: Select all

bool HvacBase::setProgram
pozwala ustawić temperaturę dla jednego z 4 programów - tak jak jest to zrobione w

Code: Select all

initWeeklySchedule()
z kolei metoda

Code: Select all

getCurrentProgram
zwraca aktualny program, czyli łącząc te 2 metody mogę zmienić temperaturę dla aktualnego programu z grafika tygodniowego.

A czy jest jakiś prosty sposób żeby odczytać wartości temperatur pozostałych 3 programów? coś w rodzaju getProgrambyId?

EDIT

Teraz patrzę i jest...

Code: Select all

HvacBase::getProgrambyId
vajera
Posts: 472
Joined: Wed Oct 31, 2018 7:58 am

Post

@klew a czy te temperatury comfort/eco w HvacBase są do czegokolwiek używane? podobnie boost? one mają jakiś związek z programami 1-4? Z analizy kodu to nie wynika, ale może znowu coś przeoczyłem?
User avatar
klew
Posts: 9638
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

vajera wrote: Sat Jun 01, 2024 2:59 pm @klew a czy te temperatury comfort/eco w HvacBase są do czegokolwiek używane? podobnie boost? one mają jakiś związek z programami 1-4? Z analizy kodu to nie wynika, ale może znowu coś przeoczyłem?
Nie są używane obecnie do niczego. Początkowo był na nie pomysł, a potem nie zostało to użyte. Ale może kiedyś ;)
Kiedy będzie Supla Offline Party / SOP#2025 ?
nikusv13
Posts: 13
Joined: Fri Apr 14, 2023 7:51 pm

Post

Dzień dobry, nie mogę poradzić sobie z odczytaniem zadanej temperatury z clouda i zapisaniem np. do int. Może ktoś podpowiedzieć jak to zrobić w arduino IDE ?
zzrr
Posts: 525
Joined: Wed Oct 26, 2022 7:35 pm

Post

nikusv13 wrote: Sun Jun 02, 2024 8:49 am Dzień dobry, nie mogę poradzić sobie z odczytaniem zadanej temperatury z clouda i zapisaniem np. do int. Może ktoś podpowiedzieć jak to zrobić w arduino IDE ?
temperaturę to do double
int16_t currentHeatSetpoint = hvac->getTemperatureSetpointHeat();
double liczba_double = (double)currentHeatSetpoint;
vajera
Posts: 472
Joined: Wed Oct 31, 2018 7:58 am

Post

zzrr wrote: Sun Jun 02, 2024 9:43 am temperaturę to do double
int16_t currentHeatSetpoint = hvac->getTemperatureSetpointHeat();
double liczba_double = (double)currentHeatSetpoint;
Wartość zwaracaną przez funkcję getTemperatureSetpointHeat() trzeba jeszcze podzielić przez 10 bo ona zwraca np. 2150 -> 21,5°C.

Return to “Nowości”