Termostat supla device

Maciek663
Posts: 217
Joined: Thu Jan 11, 2024 6:33 am
Has thanked: 1 time
Been thanked: 1 time

Post

Cześć,

Bazując na przykładzie i wiedzy z forum napisałem prosty kod:

Code: Select all

#include <SuplaDevice.h>
#include <supla/storage/eeprom.h>
#include <supla/network/esp_wifi.h>
#include <supla/device/status_led.h>
#include <supla/storage/littlefs_config.h>
#include <supla/network/esp_web_server.h>
#include <supla/network/html/device_info.h>
#include <supla/network/html/protocol_parameters.h>
#include <supla/network/html/status_led_parameters.h>
#include <supla/network/html/wifi_parameters.h>
#include <supla/device/supla_ca_cert.h>
#include <supla/control/hvac_base.h>
#include <supla/clock/clock.h>
#include <supla/network/html/time_parameters.h>
#include <supla/network/html/hvac_parameters.h>
#include <supla/control/internal_pin_output.h>
#include <supla/events.h>
#include <supla/actions.h>
#include <supla/sensor/virtual_thermometer.h>
#include <supla/control/button.h>
#include <supla/control/virtual_relay.h>

#define CFG_BUTTON_GPIO 0
#define STATUS_LED_GPIO 2
#define OUTPUT_GPIO 14

Supla::ESPWifi wifi;
Supla::Eeprom eeprom;
Supla::LittleFsConfig configSupla;
Supla::Device::StatusLed statusLed(STATUS_LED_GPIO, true); // inverted state
Supla::EspWebServer suplaServer;

Supla::Control::HvacBase *hvac = nullptr;
Supla::Sensor::VirtualThermometer *t1 = nullptr;


void setup() {
  Serial.begin(115200);

  new Supla::Clock;
  new Supla::Html::DeviceInfo(&SuplaDevice);
  new Supla::Html::WifiParameters;
  new Supla::Html::ProtocolParameters;
  new Supla::Html::StatusLedParameters;
  new Supla::Html::TimeParameters(&SuplaDevice);

  new Supla::Device::StatusLed(STATUS_LED_GPIO, true);
  eeprom.setStateSavePeriod(5000);

  auto output = new Supla::Control::InternalPinOutput(OUTPUT_GPIO);

  // Channel 0
  auto hvac = new Supla::Control::HvacBase(output);
  hvac = new Supla::Control::HvacBase(output);

  auto t1 = new Supla::Sensor::VirtualThermometer;


  // Configure thermostat parameters
  hvac->setMainThermometerChannelNo(2);     
  hvac->setTemperatureHisteresisMin(20);  // 0.2 degree
  hvac->setTemperatureHisteresisMax(1000);  // 10 degree
  hvac->setTemperatureAuxMin(1500);  // 15 degrees
  hvac->setTemperatureAuxMax(3000);  // 30 degrees
  hvac->setTemperatureHisteresis(40);
  hvac->setButtonTemperatureStep(100);

  auto cfgButton = new Supla::Control::Button(CFG_BUTTON_GPIO, true, true);
  cfgButton->configureAsConfigButton(&SuplaDevice);

// configure defualt Supla CA certificate
  SuplaDevice.setSuplaCACert(suplaCACert);
  SuplaDevice.setSupla3rdPartyCACert(supla3rdCACert);

  SuplaDevice.setName("basic_termo_11");
  SuplaDevice.begin(21); // Thermostat requires proto version >= 21
}

void loop() {
  SuplaDevice.iterate();

  int16_t currentHeatSetpoint = hvac->getTemperatureSetpointHeat();
  double liczba_double = (double)currentHeatSetpoint;
  t1->setValue(liczba_double/100);
}

Pytanie co robię źle, bo jak dodam do loop te 3 linijki które mają przepisywać temperaturę to moduł przestaje rozgłaszać sieć. Jak je zakomentuję to rozgłasza poprawnie (no ale wtedy nie robi tego co bym chciał ;)).

Code: Select all

 int16_t currentHeatSetpoint = hvac->getTemperatureSetpointHeat();
  double liczba_double = (double)currentHeatSetpoint;
  t1->setValue(liczba_double/100);
User avatar
vajera
Posts: 7290
Joined: Wed Oct 31, 2018 7:58 am
Location: Biedrusko
Has thanked: 289 times
Been thanked: 161 times

Post

Maciek663 wrote: Sun Nov 17, 2024 7:48 pm Cześć,

Bazując na przykładzie i wiedzy z forum napisałem prosty kod:

Code: Select all

#include <SuplaDevice.h>
#include <supla/storage/eeprom.h>
#include <supla/network/esp_wifi.h>
#include <supla/device/status_led.h>
#include <supla/storage/littlefs_config.h>
#include <supla/network/esp_web_server.h>
#include <supla/network/html/device_info.h>
#include <supla/network/html/protocol_parameters.h>
#include <supla/network/html/status_led_parameters.h>
#include <supla/network/html/wifi_parameters.h>
#include <supla/device/supla_ca_cert.h>
#include <supla/control/hvac_base.h>
#include <supla/clock/clock.h>
#include <supla/network/html/time_parameters.h>
#include <supla/network/html/hvac_parameters.h>
#include <supla/control/internal_pin_output.h>
#include <supla/events.h>
#include <supla/actions.h>
#include <supla/sensor/virtual_thermometer.h>
#include <supla/control/button.h>
#include <supla/control/virtual_relay.h>

#define CFG_BUTTON_GPIO 0
#define STATUS_LED_GPIO 2
#define OUTPUT_GPIO 14

Supla::ESPWifi wifi;
Supla::Eeprom eeprom;
Supla::LittleFsConfig configSupla;
Supla::Device::StatusLed statusLed(STATUS_LED_GPIO, true); // inverted state
Supla::EspWebServer suplaServer;

Supla::Control::HvacBase *hvac = nullptr;
Supla::Sensor::VirtualThermometer *t1 = nullptr;


void setup() {
  Serial.begin(115200);

  new Supla::Clock;
  new Supla::Html::DeviceInfo(&SuplaDevice);
  new Supla::Html::WifiParameters;
  new Supla::Html::ProtocolParameters;
  new Supla::Html::StatusLedParameters;
  new Supla::Html::TimeParameters(&SuplaDevice);

  new Supla::Device::StatusLed(STATUS_LED_GPIO, true);
  eeprom.setStateSavePeriod(5000);

  auto output = new Supla::Control::InternalPinOutput(OUTPUT_GPIO);

  // Channel 0
  auto hvac = new Supla::Control::HvacBase(output);
  hvac = new Supla::Control::HvacBase(output);

  auto t1 = new Supla::Sensor::VirtualThermometer;


  // Configure thermostat parameters
  hvac->setMainThermometerChannelNo(2);     
  hvac->setTemperatureHisteresisMin(20);  // 0.2 degree
  hvac->setTemperatureHisteresisMax(1000);  // 10 degree
  hvac->setTemperatureAuxMin(1500);  // 15 degrees
  hvac->setTemperatureAuxMax(3000);  // 30 degrees
  hvac->setTemperatureHisteresis(40);
  hvac->setButtonTemperatureStep(100);

  auto cfgButton = new Supla::Control::Button(CFG_BUTTON_GPIO, true, true);
  cfgButton->configureAsConfigButton(&SuplaDevice);

// configure defualt Supla CA certificate
  SuplaDevice.setSuplaCACert(suplaCACert);
  SuplaDevice.setSupla3rdPartyCACert(supla3rdCACert);

  SuplaDevice.setName("basic_termo_11");
  SuplaDevice.begin(21); // Thermostat requires proto version >= 21
}

void loop() {
  SuplaDevice.iterate();

  int16_t currentHeatSetpoint = hvac->getTemperatureSetpointHeat();
  double liczba_double = (double)currentHeatSetpoint;
  t1->setValue(liczba_double/100);
}

Pytanie co robię źle, bo jak dodam do loop te 3 linijki które mają przepisywać temperaturę to moduł przestaje rozgłaszać sieć. Jak je zakomentuję to rozgłasza poprawnie (no ale wtedy nie robi tego co bym chciał ;)).

Code: Select all

 int16_t currentHeatSetpoint = hvac->getTemperatureSetpointHeat();
  double liczba_double = (double)currentHeatSetpoint;
  t1->setValue(liczba_double/100);
Przy takiej konstrukcji kodu odczyt i zapis tej temperatury odbywa się kilkadziesiąt/kilkaset razy na sekundę - procesor nie ma już czasu na nic innego. Zrób jakiś warunek z millis() żeby ten kod wykonywał się np. 1x/5 sekund albo 1x/10 sekund.
Bramka Zigbee <=> SUPLA
Więcej informacji tutaj:
https://forum.supla.org/viewforum.php?f=127
FAQ https://forum.supla.org/viewtopic.php?t=17277
Maciek663
Posts: 217
Joined: Thu Jan 11, 2024 6:33 am
Has thanked: 1 time
Been thanked: 1 time

Post

Dzięki za odpowiedź.

To niby logiczne, ale w dalszym ciągu nie pomaga. Za każdym razem kiedy wchodzi w "if" to przerywa rozgłaszanie sieci, nawet jak pętlę ustawię na 10 sekund (a docelowo do działania programu potrzebuje max 2 sekundy). Jak to inaczej ogarnąć?

Code: Select all

void loop() {
  SuplaDevice.iterate();

  aktualny_czas = millis();

  if ( aktualny_czas -  zapamietany_czas >= opoznienie ) {
      aktualny_czas = zapamietany_czas;
      int16_t currentHeatSetpoint = hvac->getTemperatureSetpointHeat();
      double liczba_double = (double)currentHeatSetpoint;
      t1->setValue(liczba_double/100);
   }
     
}
User avatar
vajera
Posts: 7290
Joined: Wed Oct 31, 2018 7:58 am
Location: Biedrusko
Has thanked: 289 times
Been thanked: 161 times

Post

Maciek663 wrote: Mon Nov 18, 2024 6:10 am Dzięki za odpowiedź.

To niby logiczne, ale w dalszym ciągu nie pomaga. Za każdym razem kiedy wchodzi w "if" to przerywa rozgłaszanie sieci, nawet jak pętlę ustawię na 10 sekund (a docelowo do działania programu potrzebuje max 2 sekundy). Jak to inaczej ogarnąć?

Code: Select all

void loop() {
  SuplaDevice.iterate();

  aktualny_czas = millis();

  if ( aktualny_czas -  zapamietany_czas >= opoznienie ) {
      aktualny_czas = zapamietany_czas;
      int16_t currentHeatSetpoint = hvac->getTemperatureSetpointHeat();
      double liczba_double = (double)currentHeatSetpoint;
      t1->setValue(liczba_double/100);
   }
     
}
Przy tym kodzie to, co napisałem wcześniej, nadal jest aktualne 😉
Zmień:

Code: Select all

aktualny_czas = zapamietany_czas;
na

Code: Select all

zapamietany_czas = aktualny_czas;
Bramka Zigbee <=> SUPLA
Więcej informacji tutaj:
https://forum.supla.org/viewforum.php?f=127
FAQ https://forum.supla.org/viewtopic.php?t=17277
Maciek663
Posts: 217
Joined: Thu Jan 11, 2024 6:33 am
Has thanked: 1 time
Been thanked: 1 time

Post

Zauważyłem ten błąd i poprawiłem, ale problem był jeszcze tutaj:

Code: Select all

  auto hvac = new Supla::Control::HvacBase(output);
  hvac = new Supla::Control::HvacBase(output);

  auto t1 = new Supla::Sensor::VirtualThermometer;
Jeśli mam przed setup:

Code: Select all

Supla::Control::HvacBase *hvac = nullptr;
Supla::Sensor::VirtualThermometer *t1 = nullptr;
to w samym setup powinno być:

Code: Select all

  hvac = new Supla::Control::HvacBase(output);
  t1 = new Supla::Sensor::VirtualThermometer;
I teraz działa prawie wszystko, bo w dalszym ciągu nie konfiguruje mi termostatu, czyszczę Wemosa przez flash download tools przyciskiem ERASE, w Arduino IDE też mam zaznaczone czyszczenie wszystkiego, a parametry termostatu są jakby randomowe:

Code: Select all

  // Configure thermostat parameters
  hvac->setMainThermometerChannelNo(2);     
  hvac->setTemperatureHisteresisMin(20);  // 0.2 degree
  hvac->setTemperatureHisteresisMax(1000);  // 10 degree
  hvac->setTemperatureAuxMin(1500);  // 15 degrees
  hvac->setTemperatureAuxMax(3000);  // 30 degrees
  hvac->setTemperatureHisteresis(100);
  hvac->setButtonTemperatureStep(100);
Histerezę ustawiło na '1', ale już termometr był nie ustawiony, krok i temperatury aux też (chyba że aux min i max to nie zakres regulacji temp i powinny być tu przypisane inne zmienne?)
User avatar
vajera
Posts: 7290
Joined: Wed Oct 31, 2018 7:58 am
Location: Biedrusko
Has thanked: 289 times
Been thanked: 161 times

Post

Maciek663 wrote: Mon Nov 18, 2024 7:13 am

Code: Select all

  // Configure thermostat parameters
  hvac->setMainThermometerChannelNo(2);     
  hvac->setTemperatureHisteresisMin(20);  // 0.2 degree
  hvac->setTemperatureHisteresisMax(1000);  // 10 degree
  hvac->setTemperatureAuxMin(1500);  // 15 degrees
  hvac->setTemperatureAuxMax(3000);  // 30 degrees
  hvac->setTemperatureHisteresis(100);
  hvac->setButtonTemperatureStep(100);
Histerezę ustawiło na '1', ale już termometr był nie ustawiony, krok i temperatury aux też (chyba że aux min i max to nie zakres regulacji temp i powinny być tu przypisane inne zmienne?)
viewtopic.php?p=190176#p190176
Bramka Zigbee <=> SUPLA
Więcej informacji tutaj:
https://forum.supla.org/viewforum.php?f=127
FAQ https://forum.supla.org/viewtopic.php?t=17277
Maciek663
Posts: 217
Joined: Thu Jan 11, 2024 6:33 am
Has thanked: 1 time
Been thanked: 1 time

Post

Poradziłem sobie tak w loop:

Code: Select all

  if (first_cycle == false) {
  hvac->setTemperatureHisteresisMin(20);  // 0.2 degree
  hvac->setTemperatureHisteresisMax(1000);  // 10 degree
  hvac->setTemperatureRoomMin(1500);  // 15 degrees
  hvac->setTemperatureRoomMax(3000);  // 30 degrees  
  hvac->setTemperatureHisteresis(100);
  hvac->setButtonTemperatureStep(100);
  first_cycle = true;  
  }
i działa wszystko oprócz "setButton", bo to chyba jest skok w przypadku zmiany temperatury przyciskiem. Da się zmienić skok przy zmianie temperatury w aplikacji?
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

Maciek663 wrote: Mon Nov 18, 2024 10:15 am Poradziłem sobie tak w loop:

Code: Select all

  if (first_cycle == false) {
  hvac->setTemperatureHisteresisMin(20);  // 0.2 degree
  hvac->setTemperatureHisteresisMax(1000);  // 10 degree
  hvac->setTemperatureRoomMin(1500);  // 15 degrees
  hvac->setTemperatureRoomMax(3000);  // 30 degrees  
  hvac->setTemperatureHisteresis(100);
  hvac->setButtonTemperatureStep(100);
  first_cycle = true;  
  }
i działa wszystko oprócz "setButton", bo to chyba jest skok w przypadku zmiany temperatury przyciskiem. Da się zmienić skok przy zmianie temperatury w aplikacji?
setButton jest do fizycznego przycisku.
Nie ma opcji zmiany kroku temperatury w apce.
Pamiętaj tylko, że powyższy kod zawsze nadpisze Tobie ustawienie histerezy na "1.00" stopień i jak zmienisz to w Cloud, to urządzenie ponownie ustawi 1.00 po resecie i tak w kółko.
Najlepsze suple dla Twojego domu :mrgreen:
Maciek663
Posts: 217
Joined: Thu Jan 11, 2024 6:33 am
Has thanked: 1 time
Been thanked: 1 time

Post

Rozumiem, dziękuję za odpowiedź. Szkoda, że nie ma takiej opcji.

Nadpisywanie to nie problem, nie będę tego w cloud nigdy ustawiał.

Return to “Pomoc”