Skocz do zawartości

Zagadnienie programistyczne dla kolegi z BB


SOYER

Pomocna odpowiedź

Cześć, jako, że nigdy się nie zawiodłem na niestandardowych rozwiązaniach tego kolegi, pytanie do Niego i innych, jak można(?) to lepiej, prościej napisać.

Założenie:

mamy dwie zmienne, które ustawiamy w innym miejscu szkicu, jedna pokazuje godzinę startu strefy nocnej, a druga godzinę końca tej strefy, 

mamy ustawić zmienną "night" na true jeśli aktualna godzina mieści się w zakresie.

void isNight(){
  if((millis()-prev_minute_millis)> 30000){//sprawdzamy czas co 30s
    if(night_h_start < night_h_stop){//jeśli godzina staru jest po północy
      if((clock1.getHour() >= night_h_start) && (clock1.getHour() < night_h_stop)){
        if(!night){
          tempCounterNight = counter;
          prev_hour_millis=millis();
          night = true;
        }
      }
      else{
        night = false;
      }
    }
    else if(night_h_start > night_h_stop){ //jeśli godzina startu jest przed północą
      if(clock1.getHour() >= night_h_start){
        if(!night){
         tempCounterNight = counter;
         prev_hour_millis=millis();
         night = true;
        }
      }
      else if(clock1.getHour() < night_h_stop){
        if(!night){
          tempCounterNight = counter;
          prev_hour_millis=millis();
          night = true;
        }
      }
      else{
       night = false;
      }
    }
  prev_minute_millis=millis(); 
  }
}

Szkic nie ujmuje sytuacji gdy ktoś przez przypadek(?) ustawi obie zmienne na tą samą godzinę. Nad tym jeszcze myślę;)

Ktoś coś?

 

Edytowano przez SOYER
Link do komentarza
Share on other sites

12 minut temu, ethanak napisał:

Czemu nie wykorzystasz biblioteki?

Jest taka?

Mógłbym chociaż tam zaglądnąć i się czegoś nauczyć.

Choć ja wolę Twoje pomysły, potem trzeba długo główkować aż się kropki połączą:)

Link do komentarza
Share on other sites

Jest taka, ephemeris się nazywa albo podobnie.

Czy naprawdę myślisz, że ja codziennie wprowadzam godzinę wschodu i zachodu słońca?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)

Ephemeris to używam, w esp32 w piwnicy który steruje mi między innymi oświetleniem podjazdu. 

Tylko tu nie chodzi o wschód i zachód słońca, a o to że ktoś ustawia "ręcznie" strefę nocną kiedy pilnowacz wodomierza powiadamia o małych upływach wody w nocy, w tych ustawionych godzinach.

Np. wiem że po 23 do 5 raczej nie idę pod prysznic więc proszę o powiadomienie jeśli w tych godzinach wypływ wody, w ciągu godziny, będzie większy niż 15 litrów, bo mogę iść sikać ze 3 razy na godzinę(po raciborskim), to spłuczka coś tam zużyje;).

Do tego projektu:

https://forum.supla.org/viewtopic.php?t=16642

Edytowano przez SOYER
Link do komentarza
Share on other sites

Cześć @SOYER , skoro temat nie tylko dla osób z BB to pozwól że dołączę do dyskusji.

Mogę trochę źle rozumieć kod, ale wydaje mi się, że chodziło o sprawdzanie, czy aktualnie trwa noc - w Twoim kodzie to mnie więcej te linijki:

    if(night_h_start < night_h_stop){//jeśli godzina staru jest po północy
      if((clock1.getHour() >= night_h_start) && (clock1.getHour() < night_h_stop)){

Skoro musiałeś dodać komentarz, to znaczy że kod jest nieczytelny - najepiej więc przenieść go do nowej funkcji:

static bool is_night_now(void)
{
    if(night_h_start < night_h_stop){//jeśli godzina staru jest po północy
      if((clock1.getHour() >= night_h_start) && (clock1.getHour() < night_h_stop))
      	return true;
      else{
        return false;
      }
    }
    else if(night_h_start > night_h_stop){ //jeśli godzina startu jest przed północą
      if(clock1.getHour() >= night_h_start)
      	return true;      
      else if(clock1.getHour() < night_h_stop)
      	return false;
    }
}

Teraz funkcja isNight będzie o wiele krótsza:

void isNight(){
  if((millis()-prev_minute_millis)> 30000){//sprawdzamy czas co 30s
     if (is_night_now()) {
        if(!night){
          tempCounterNight = counter;
          night = true;
        }
     }
     else {
          night = false;
     }
     prev_minute_millis=millis(); 
  }
}

Nazwa "is_night_now" nie jest piękna, na pewno wymyślisz coś lepszego - pisałem na szybko, więc z góry przepraszam.

Jest pierwsza wersja uproszczonego programu, można iść dalej. Nieeleganckie jest przekazywanie zmiennych globalnych, czyli clock1, night_h_start, night_h_stop.

Nie wiem jakiego typu są te zmienne, więc użyję int, ale zmień typ na poprawny. Nowa funckja is_night_now, która nie używa zmiennych globalnych wygląda następująco:

static bool is_night_now(int now, int night_start, int night_stop)
{
    if (night_start < night_stop)
    	return now >= night_start && now < night_stop;
    else
    	return now >= night_start || now < night_stop;
}

A główna funkcja:

void isNight(){
  if((millis()-prev_minute_millis)> 30000){//sprawdzamy czas co 30s
  
     if (is_night_now(clock1.getHour(), night_h_start, night_h_stop)) {
        if(!night){
          tempCounterNight = counter;
          night = true;
        }
     }
     else {
          night = false;
     }
     
     prev_minute_millis=millis(); 
  }

Teraz można zabrać się za poprawianie isNight. O ile rozumiem chciałeś ustawiać tempCounterNight tylko raz. Proponowałbym to zrealizować następującą wersją:

void isNight(){
  if((millis()-prev_minute_millis)> 30000){//sprawdzamy czas co 30s

     bool nn = is_night_now(clock1.getHour(), night_h_start, night_h_stop);
  
     if (!night && nn)
          tempCounterNight = counter;
          
     night = nn;
     
     prev_minute_millis=millis(); 
  }

Można jeszcze byłoby zamienić millis() oraz 30000 na funkcję, ale to oraz wymyślenie łądniejszych nazw zostawiam Ci jako dodatkowe zadanie 🙂

 

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

O kurczę, zaszczycony jestem, @Elvissię pochylił na moim szkicem. Dziękuję.

Za dużo z tego nie łapię po pierwszym przeczytaniu, ale o to właśnie chodziło w tym temacie. Mam nad czym siedzieć cały weekend.

Funkcja użyta w tym projekcie:

https://forum.supla.org/viewtopic.php?t=16698

a już wcześniej używana w moim esp32 ale ze sztywno przypisanymi zmiennymi.

 

 

Link do komentarza
Share on other sites

23 godziny temu, Elvis napisał:
static bool is_night_now(void)
{
    if(night_h_start < night_h_stop){//jeśli godzina staru jest po północy
      if((clock1.getHour() >= night_h_start) && (clock1.getHour() < night_h_stop))
      	return true;
      else{
        return false;
      }
    }
    else if(night_h_start > night_h_stop){ //jeśli godzina startu jest przed północą
      if(clock1.getHour() >= night_h_start)
      	return true;      
      else if(clock1.getHour() < night_h_stop)
      	return false;
    }
}

@Elvis tam nie zgadzają się linijki:

23 godziny temu, Elvis napisał:
else if(clock1.getHour() < night_h_stop)
      	return false;

jak już powinno być "return true", jeśli godzina jest niższa od ustawionego stopu to jesteśmy w strefie nocnej...

analizuję dalej... 

Link do komentarza
Share on other sites

(edytowany)

Fakt, pisałem to w pośpiechu. Czyli powinno być:

    else if(night_h_start > night_h_stop){ //jeśli godzina startu jest przed północą
      if(clock1.getHour() >= night_h_start)
      	return true;      
      else if(clock1.getHour() < night_h_stop)
      	return true;      
      else
      	return false;
    }

A to już można ładnie skrócić do:

    else if(night_h_start > night_h_stop){ //jeśli godzina startu jest przed północą
      if(clock1.getHour() >= night_h_start || clock1.getHour() < night_h_stop)
      	return true;      
      else
      	return false;
    }

Taki właśnie warunek jest użyty później 🙂

Edytowano przez Elvis
Link do komentarza
Share on other sites

2 minuty temu, Elvis napisał:

Fakt, pisałem to w pośpiechu. Czyli powinno być:

    else if(night_h_start > night_h_stop){ //jeśli godzina startu jest przed północą
      if(clock1.getHour() >= night_h_start)
      	return true;      
      else if(clock1.getHour() < night_h_stop)
      	return true;      
      else
      	return false;
    }

A to już można ładnie skrócić do:

    else if(night_h_start > night_h_stop){ //jeśli godzina startu jest przed północą
      if(clock1.getHour() >= night_h_start || clock1.getHour() < night_h_stop)
      	return true;      
      else
      	return false;
    }

Taki właśnie warunek jest użyte później 🙂

Super, ale nie podpowiadaj na razie, chcę to rozgryźć:))

Faktycznie mogłem mieć to krócej... ale na razie nie robię z tego dwóch funkcji, aktualnie mam:

void isNight(){
  if((millis()-prev_minute_millis)> 30000){
    if(night_h_start < night_h_stop){
      if((clock1.getHour() >= night_h_start) && (clock1.getHour() < night_h_stop)){
        if(!night){
          tempCounterNight = counter;
          prev_hour_millis=millis();
          night = true;
        }
      }
      else{
        night = false;
      }
    }
    else if(night_h_start > night_h_stop){ 
      if((clock1.getHour() >= night_h_start)||(clock1.getHour() < night_h_stop)){
        if(!night){
         tempCounterNight = counter;
         prev_hour_millis=millis();
         night = true;
        }
      }
      else{
       night = false;
      }
    }
  prev_minute_millis=millis(); 
  }
}

Bo zapomniałeś w is_night_now() timera, trudno żeby to sprawdzać w każdej pętli...

analizuję dalej...

Link do komentarza
Share on other sites

(edytowany)
static bool isNight(int32_t tim, int32_t night_start, int32_t night_end){
    if(night_start < night_end){
      return tim >= night_start && tim < night_end;
    }
    else{
    	return tim >= night_start || tim < night_end;
    }
}
void nightReady(){
  if((millis()-prev_minute_millis)> 30000){//sprawdzamy czas co 30s

     bool nn = isNight(clock1.getHour(), night_h_start, night_h_stop);
  
     if (!night && nn){
          tempCounterNight = counter;  
     }   
     night = nn;
     USBSerial.print("NIGHT:.............: ");
     USBSerial.println(night);
     prev_minute_millis=millis(); 
  }
}

Ok, skończyłem, ciekawe doświadczenie, jak zawsze.

Oczywiście to co pisałem o timerze to bzdura, funkcja jest wywoływana w innej funkcji, więc nie potrzebuje swojego timera.

Najciekawsze było to:

return tim >= night_start && tim < night_end;
    }
    else{
    	return tim >= night_start || tim < night_end;

nie wiedziałem, że tak można, na pierwszy rzut oka było to nieczytelne, ale to oczywiste jest przecież.

To też długo analizowałem:

if (!night && nn){
          tempCounterNight = counter;  
     }   
     night = nn;

czy aby na pewno jest dobrze😂, oczywiście, że jest, a o ile prościej napisane, choć dla mnie mało czytelne;), ale ja już tak mam.

Dziękuję, za to co lubię, główkowanie nad logicznością szkicu.

Mam jeszcze pewien pomysł na przerobienie tego całego szkicu, ale kompletnie nie wiem jak. Postaram się zaraz opisać zagwozdkę. To pewnie będzie coś ze strukturami...

Edytowano przez SOYER
Link do komentarza
Share on other sites

const char PARAM1[] = "MQTT server";
const char PARAM2[] = "MQTT user";
const char PARAM3[] = "MQTT password";
const char PARAM4[] = "device ID";
const char PARAM5[] = "channel ID";
const char PARAM6[] = "night_h_start";
const char PARAM7[] = "night_h_end";
const char PARAM8[] = "deviceName in message ";
const char PARAM9[] = "message";
const char PARAM10[] = "level alarm";
const char PARAM11[] = "level alarm night";

int counter = 0;
int tempCounter;
int tempCounterNight;
boolean ResetTempCounterNight= 0;

char mqtt_server[200] ="a";
char mqtt_user[200] ="a";
char mqtt_pass[200] ="a";
int32_t dv_id=1;
int32_t chann_id=1;
int32_t night_h_start=1;
int32_t night_h_stop=1;
char dev_name_message[200] ="a";
char message[200]="a";
int32_t level_alarm = 40;
int32_t level_alarm_night = 10;
String top1 = "xxx";
String tim;

boolean night =0;
unsigned long prev_min_millis;
unsigned long prev_minute_millis;
unsigned long prev_hour_millis;
unsigned long lastReconnectAttempt = 0;

void setup() {
  USBSerial.begin(9600);

  Supla::Storage::Init();
  SuplaDevice.addClock(new Supla::Clock);
  auto clock1 = SuplaDevice.getClock();
  new Supla::Html::CustomTextParameter(PARAM1, "MQTT server", 50);
  new Supla::Html::CustomTextParameter(PARAM2, "MQTT user", 50);
  new Supla::Html::CustomTextParameter(PARAM3, "MQTT password", 50);
  new Supla::Html::CustomParameter(PARAM4, "device ID");
  new Supla::Html::CustomParameter(PARAM5, "channel ID");
  new Supla::Html::CustomParameter(PARAM6, "night_h_start");
  new Supla::Html::CustomParameter(PARAM7, "night_h_end");
  new Supla::Html::CustomTextParameter(PARAM8, "devName message", 25);
  new Supla::Html::CustomTextParameter(PARAM9, "push message", 25);
  new Supla::Html::CustomParameter(PARAM10, "level alarm");
  new Supla::Html::CustomParameter(PARAM11, "level alarm night");
  new Supla::Device::EnterCfgModeAfterPowerCycle(15000, 3, true);
  Supla::Notification::RegisterNotification(-1);
  SuplaDevice.setSuplaCACert(suplaCACert);
  SuplaDevice.setSupla3rdPartyCACert(supla3rdCACert);
  SuplaDevice.begin();
  paramSave();
  prev_min_millis=millis();
  prev_hour_millis=millis();
  lastReconnectAttempt = 0;

  delay(2000);
  top1 = "supla/"+String(mqtt_user)+"/devices/"+String(dv_id)+"/channels/"+String(chann_id)+"/state/calculated_value";
  
  mqttConfig();
}

void loop() {
  SuplaDevice.iterate();
  if (!client.connected()) {
    long now = millis();
    if (now - lastReconnectAttempt > 5000) {
      lastReconnectAttempt = now;
      if (reconnect()) {
        lastReconnectAttempt = 0;
      }
    }
  } else {
    client.loop();
  }
  nightReady();
  waterControl();
}

boolean reconnect() {
  if (WiFi.status() == WL_CONNECTED) {
    String clientId = "ESP32Client-";
    clientId += String(random(0xffff), HEX);
    if (client.connect(clientId.c_str(), mqtt_user, mqtt_pass)) {
      USBSerial.println("!!connected to MQTT!!");
      client.subscribe(top1.c_str());
    } else {
      USBSerial.print("failed, rc=");
      USBSerial.print(client.state());
    }
  }
  return client.connected();
}
void mqttConfig() {
  USBSerial.println("MQTT config...");
  client1.setInsecure();
  client.setServer(mqtt_server, 8883);
  client.setCallback(callback);
}

void callback(char* topic, byte* payload, unsigned int length) {
  USBSerial.print("Message arrived [");
  USBSerial.print(topic);
  USBSerial.print("] ");
  for (int i = 0; i < length; i++) {
    USBSerial.print((char)payload[i]);
  }
  USBSerial.println();
  if (strcmp(topic, top1.c_str()) == 0) {
    payload[length] = '\0';
    counter = atof((char*)payload);
    USBSerial.print("COUNTER:......................");
    USBSerial.println(counter);

  }
}

void paramSave(){
  if (Supla::Storage::ConfigInstance()->getString(PARAM1, mqtt_server, 200)) {
    SUPLA_LOG_DEBUG(" **** Param[%s]: %s", PARAM1, mqtt_server);
  } else {
    SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM1);
  }
  
  if (Supla::Storage::ConfigInstance()->getString(PARAM2, mqtt_user, 200)) {
    SUPLA_LOG_DEBUG(" **** Param[%s]: %s", PARAM2, mqtt_user);
  } else {
    SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM2);
  }
  if (Supla::Storage::ConfigInstance()->getString(PARAM3, mqtt_pass, 200)) {
    SUPLA_LOG_DEBUG(" **** Param[%s]: %s", PARAM3, mqtt_pass);
  } else {
    SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM3);
  }
  if (Supla::Storage::ConfigInstance()->getInt32(PARAM4, &dv_id)) {
    SUPLA_LOG_DEBUG(" **** Param[%s]: %d", PARAM4, dv_id);
  } else {
    SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM4);
  }
  if (Supla::Storage::ConfigInstance()->getInt32(PARAM5, &chann_id)) {
    SUPLA_LOG_DEBUG(" **** Param[%s]: %d", PARAM5, chann_id);
  } else {
    SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM5);
  }
  if (Supla::Storage::ConfigInstance()->getInt32(PARAM6, &night_h_start)) {
    SUPLA_LOG_DEBUG(" **** Param[%s]: %d", PARAM6, night_h_start);
  } else {
    SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM6);
  }
  if (Supla::Storage::ConfigInstance()->getInt32(PARAM7, &night_h_stop)) {
    SUPLA_LOG_DEBUG(" **** Param[%s]: %d", PARAM7, night_h_stop);
  } else {
    SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM7);
  }
  if (Supla::Storage::ConfigInstance()->getString(PARAM8, dev_name_message, 200)) {
    SUPLA_LOG_DEBUG(" **** Param[%s]: %s", PARAM8, dev_name_message);
  } else {
    SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM8);
  }
  if (Supla::Storage::ConfigInstance()->getString(PARAM9, message, 200)) {
    SUPLA_LOG_DEBUG(" **** Param[%s]: %s", PARAM9, message);
  } else {
    SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM9);
  }
  if (Supla::Storage::ConfigInstance()->getInt32(PARAM10, &level_alarm)) {
    SUPLA_LOG_DEBUG(" **** Param[%s]: %d", PARAM10, level_alarm);
  } else {
    SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM10);
  }
  if (Supla::Storage::ConfigInstance()->getInt32(PARAM11, &level_alarm_night)) {
    SUPLA_LOG_DEBUG(" **** Param[%s]: %d", PARAM11, level_alarm_night);
  } else {
    SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM11);
  }
}

void waterControl() {
  if (millis() - prev_min_millis > 60000) {
    if (counter > (tempCounter + level_alarm)) {
      Supla::Notification::Send(-1, dev_name_message, message);
    }
    tempCounter = counter;
    prev_min_millis=millis();
  }
  if ((prev_hour_millis - millis() > 3600000) && night) {
    if (counter > (tempCounterNight + level_alarm_night)) {
      String n = "NIGHT: ";
      String n_message = n + message;
      Supla::Notification::Send(-1, dev_name_message, n_message.c_str());
    }
    tempCounterNight = counter;
    prev_hour_millis=millis();
  }
}

Powyżej mój szkic, którego niektóre z funkcji przed chwilą przerabialiśmy. 

Cały szkic tutaj:

https://github.com/Soyer79/WaterMeterWatcher/blob/main/liw.ino

Szkic oparty na supli, odbiera z serwera mqtt stan licznika, oraz pilnuje czy czasem ten stan nie wzrósł za bardzo w ciągu ostatniej minuty, albo w godzinach nocnych, czy nie wzrósł za bardzo w ciągu ostatniej godziny.

Po pierwszym uruchomieniu user na stronie przeglądarki ustawia sobie godziny nocne, progi przekroczenia dla zliczania minutowego i godzinowego, dane do serwera itp.

Zadanie, chciałbym tak przerobić ten kod by dodać dodatkowy input na stronie dla podania ilości liczników, które mam monitorować soft, maksymalna liczba powiedzmy 3. Pomińmy tu kwestię inputów na stronie cfg.

Jak to najprościej zrobić? Niektóre części kodu(większość) należałoby potroić. 

Czy zrobić osobne funkcje dla 1,2,3 liczników? Mało eleganckie. Pewnie struktury, ale to dość skomplikowane chyba przy takim kodzie. Pewnie cały szkic do napisania na nowo. 

Nie mówię, że poradzę, pewnie nie, ale jako, że aktualnie nie mam nic innego do roboty to mogę pogłówkować.

Poniżej ten sam szkic z zaznaczonymi(//)elementami do "potrojenia":

const char PARAM1[] = "MQTT server";//
const char PARAM2[] = "MQTT user";//
const char PARAM3[] = "MQTT password";//
const char PARAM4[] = "device ID";//
const char PARAM5[] = "channel ID";//
const char PARAM6[] = "night_h_start";//
const char PARAM7[] = "night_h_end";//
const char PARAM8[] = "deviceName in message ";//
const char PARAM9[] = "message";//
const char PARAM10[] = "level alarm";//
const char PARAM11[] = "level alarm night";//

int counter = 0;//
int tempCounter;//
int tempCounterNight;//
boolean ResetTempCounterNight= 0;//

char mqtt_server[200] ="a";
char mqtt_user[200] ="a";
char mqtt_pass[200] ="a";
int32_t dv_id=1;//
int32_t chann_id=1;//
int32_t night_h_start=1;//
int32_t night_h_stop=1;//
char dev_name_message[200] ="a";//
char message[200]="a";//
int32_t level_alarm = 40;//
int32_t level_alarm_night = 10;//
String top1 = "xxx";//
String tim;

boolean night =0;//
unsigned long prev_min_millis;
unsigned long prev_minute_millis;
unsigned long prev_hour_millis;
unsigned long lastReconnectAttempt = 0;

void setup() {
  USBSerial.begin(9600);

  Supla::Storage::Init();
  SuplaDevice.addClock(new Supla::Clock);
  auto clock1 = SuplaDevice.getClock();
  new Supla::Html::CustomTextParameter(PARAM1, "MQTT server", 50);//
  new Supla::Html::CustomTextParameter(PARAM2, "MQTT user", 50);//
  new Supla::Html::CustomTextParameter(PARAM3, "MQTT password", 50);//
  new Supla::Html::CustomParameter(PARAM4, "device ID");//
  new Supla::Html::CustomParameter(PARAM5, "channel ID");//
  new Supla::Html::CustomParameter(PARAM6, "night_h_start");//
  new Supla::Html::CustomParameter(PARAM7, "night_h_end");//
  new Supla::Html::CustomTextParameter(PARAM8, "devName message", 25);//
  new Supla::Html::CustomTextParameter(PARAM9, "push message", 25);//
  new Supla::Html::CustomParameter(PARAM10, "level alarm");//
  new Supla::Html::CustomParameter(PARAM11, "level alarm night");//
  new Supla::Device::EnterCfgModeAfterPowerCycle(15000, 3, true);
  Supla::Notification::RegisterNotification(-1);
  SuplaDevice.setSuplaCACert(suplaCACert);
  SuplaDevice.setSupla3rdPartyCACert(supla3rdCACert);
  SuplaDevice.begin();
  paramSave();
  prev_min_millis=millis();
  prev_hour_millis=millis();
  lastReconnectAttempt = 0;

  delay(2000);
  top1 = "supla/"+String(mqtt_user)+"/devices/"+String(dv_id)+"/channels/"+String(chann_id)+"/state/calculated_value";//
  
  mqttConfig();
}

void loop() {
  SuplaDevice.iterate();
  if (!client.connected()) {
    long now = millis();
    if (now - lastReconnectAttempt > 5000) {
      lastReconnectAttempt = now;
      if (reconnect()) {
        lastReconnectAttempt = 0;
      }
    }
  } else {
    client.loop();
  }
  nightReady();
  waterControl();
}

boolean reconnect() {
  if (WiFi.status() == WL_CONNECTED) {
    String clientId = "ESP32Client-";
    clientId += String(random(0xffff), HEX);
    if (client.connect(clientId.c_str(), mqtt_user, mqtt_pass)) {
      USBSerial.println("!!connected to MQTT!!");
      client.subscribe(top1.c_str());//
    } else {
      USBSerial.print("failed, rc=");
      USBSerial.print(client.state());
    }
  }
  return client.connected();
}
void mqttConfig() {
  USBSerial.println("MQTT config...");
  client1.setInsecure();
  client.setServer(mqtt_server, 8883);
  client.setCallback(callback);
}

void callback(char* topic, byte* payload, unsigned int length) {
  USBSerial.print("Message arrived [");
  USBSerial.print(topic);
  USBSerial.print("] ");
  for (int i = 0; i < length; i++) {
    USBSerial.print((char)payload[i]);
  }
  USBSerial.println();
  if (strcmp(topic, top1.c_str()) == 0) {//
    payload[length] = '\0';//
    counter = atof((char*)payload);//
    USBSerial.print("COUNTER:......................");//
    USBSerial.println(counter);//

  }
}

void paramSave(){//cała funkcja do "potrojenia"
  if (Supla::Storage::ConfigInstance()->getString(PARAM1, mqtt_server, 200)) {
    SUPLA_LOG_DEBUG(" **** Param[%s]: %s", PARAM1, mqtt_server);
  } else {
    SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM1);
  }
  
  if (Supla::Storage::ConfigInstance()->getString(PARAM2, mqtt_user, 200)) {
    SUPLA_LOG_DEBUG(" **** Param[%s]: %s", PARAM2, mqtt_user);
  } else {
    SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM2);
  }
  if (Supla::Storage::ConfigInstance()->getString(PARAM3, mqtt_pass, 200)) {
    SUPLA_LOG_DEBUG(" **** Param[%s]: %s", PARAM3, mqtt_pass);
  } else {
    SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM3);
  }
  if (Supla::Storage::ConfigInstance()->getInt32(PARAM4, &dv_id)) {
    SUPLA_LOG_DEBUG(" **** Param[%s]: %d", PARAM4, dv_id);
  } else {
    SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM4);
  }
  if (Supla::Storage::ConfigInstance()->getInt32(PARAM5, &chann_id)) {
    SUPLA_LOG_DEBUG(" **** Param[%s]: %d", PARAM5, chann_id);
  } else {
    SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM5);
  }
  if (Supla::Storage::ConfigInstance()->getInt32(PARAM6, &night_h_start)) {
    SUPLA_LOG_DEBUG(" **** Param[%s]: %d", PARAM6, night_h_start);
  } else {
    SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM6);
  }
  if (Supla::Storage::ConfigInstance()->getInt32(PARAM7, &night_h_stop)) {
    SUPLA_LOG_DEBUG(" **** Param[%s]: %d", PARAM7, night_h_stop);
  } else {
    SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM7);
  }
  if (Supla::Storage::ConfigInstance()->getString(PARAM8, dev_name_message, 200)) {
    SUPLA_LOG_DEBUG(" **** Param[%s]: %s", PARAM8, dev_name_message);
  } else {
    SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM8);
  }
  if (Supla::Storage::ConfigInstance()->getString(PARAM9, message, 200)) {
    SUPLA_LOG_DEBUG(" **** Param[%s]: %s", PARAM9, message);
  } else {
    SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM9);
  }
  if (Supla::Storage::ConfigInstance()->getInt32(PARAM10, &level_alarm)) {
    SUPLA_LOG_DEBUG(" **** Param[%s]: %d", PARAM10, level_alarm);
  } else {
    SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM10);
  }
  if (Supla::Storage::ConfigInstance()->getInt32(PARAM11, &level_alarm_night)) {
    SUPLA_LOG_DEBUG(" **** Param[%s]: %d", PARAM11, level_alarm_night);
  } else {
    SUPLA_LOG_DEBUG(" **** Param[%s] is not set", PARAM11);
  }
}

void waterControl() {//cała funkcja do "potrojenia"
  if (millis() - prev_min_millis > 60000) {
    if (counter > (tempCounter + level_alarm)) {
      Supla::Notification::Send(-1, dev_name_message, message);
    }
    tempCounter = counter;
    prev_min_millis=millis();
  }
  if ((prev_hour_millis - millis() > 3600000) && night) {
    if (counter > (tempCounterNight + level_alarm_night)) {
      String n = "NIGHT: ";
      String n_message = n + message;
      Supla::Notification::Send(-1, dev_name_message, n_message.c_str());
    }
    tempCounterNight = counter;
    prev_hour_millis=millis();
  }
}

Co myślicie?

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.