DirectLink remote control for Supla Thermostat

elmaya
Posts: 1482
Joined: Wed Jun 27, 2018 5:48 pm
Location: El Saucejo - Sevilla

Remote control for Supla Thermostat based on DirectLink

Image

With Oled display and buttons for Automatic/Manual, Manual On/Off, thermostat setting -0.5º and + 0.5º

operation with both the thermostat with or without OLED

without OLED:
viewtopic.php?f=10&t=5294

with OLED
viewtopic.php?f=10&t=5320

the display shows the status of the thermostat the same as the Oled version.
the screen automatically dims after 15 seconds and the first press on one of the buttons makes it bright again.
if any button is pressed while the screen is dimmed, it will glow and the following presses will acruate according to the button pressed.
After 15 seconds without pressing any button the screen dims.

In wificonfig you will have to setup the suplaserver and DirectLink data:
D_Link_1 --- paste the DirectLink corresponding to the Auto/Man channel.
D_Link_2 --- paste the DirectLink corresponding to the Manual On/Off channel.
D_Link_3 --- paste the DirectLink corresponding to the thermostat setting channel.
Link Temp -- paste the DirectLink corresponding to the temperature channel.
Link Ther -- paste the DirectLink corresponding to the thermostat channel.

Image

Gpio:
Gpio 0 ; //D3-SDA
Gpio 2 ; //D4-SCL
Gpio 5 ; //D1 // triger Link 1 and wifi config
Gpio 4 ; //D2 // triger Link 2
Gpio 14; //D5 // triger Link 3
Gpio 12; //D6 // triger Link 4

Image

Code: Select all

#include <FS.h>       // ---- esp board manager 2.4.2 --- iwip Variant V2 higher Bandwidth
#include <WiFiClientSecure.h>
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <WiFiManager.h>     //--------- https://github.com/tzapu/WiFiManager/tree/0.14 -------------
#include <ArduinoJson.h>     //--------- https://github.com/bblanchon/ArduinoJson/tree/v5.13.2 ------

//#define D0 16  //no internal pullup resistor
//#define D1  5
//#define D2  4
//#define D3  0  //must not be pulled low during power on/reset, toggles value during boot
//#define D4  2  //must not be pulled low during power on/reset, toggles value during boot
//#define D5 14
//#define D6 12
//#define D7 13
//#define D8 15  //must not be pulled high during power on/reset

int button_1 = 5 ; //D1     // triger Link 1  and wifi config 
int button_2 = 4 ; //D2     // triger Link 2
int button_3 = 14; //D5     // triger Link 3
int button_4 = 12; //D6     // triger Link 4
#define BTN_COUNT 4
//#include "SSD1306Wire.h" //----- 0.96 Oled --- https://github.com/ThingPulse/esp8266-oled-ssd1306
//SSD1306Wire  display(0x3c, 0, 2);  // D3-SDA  D4-SCL ----- 0.96 Oled ---
#include "SH1106Wire.h" //----- 1.3 Oled ---
SH1106Wire display(0x3c, 0, 2);  // D3-SDA  D4-SCL ----- 1.3 Oled ---

const char* host = ".org";
const int httpsPort = 443;
const char* fingerprint = "CF 05 98 89 CA FF 8E D8 5E 5C E0 C2 E4 F7 E6 C3 C7 50 DD 5C";
char Supla_server[20];
char D_Link_1[61];
char D_Link_2[61];
char D_Link_3[61];
char Link_T[61];
char Link_T2[61];
byte mac[6];
String url = "/direct";
bool shouldSaveConfig = false;
bool initialConfig = false;
bool dimm = false;         
unsigned long dimm_milis ;
bool Read1on = false;
bool Read2on = false;
bool onsend = false;
bool pr_wifi = false;
bool can1 = false;
bool can2 = false;
int Temp_mtbs = 5000;                //Temperature update interval 5 seconds
unsigned long Temp_lasttime; 
int TempDisp_mtbs = 2500;                //Temperature display interval 2.5 seconds
unsigned long TempDisp_lasttime; 
int lcd_n = 0;
int up_n = 0;
double Temp = -127.0;
double Temp2 = -127.0;
unsigned long wifi_checkDelay = 20000;  // wifi reconnect delay tray to reconnect every 20 seconds ------------ Wi-Fi podłącz tacę opóźniającą, aby ponownie połączyć się co 20 sekund
unsigned long wifimilis;   // 
int C_W_state = HIGH;            
int last_C_W_state = HIGH;       
unsigned long time_last_C_W_change = 0;   
long C_W_delay = 10000;               // config delay 10 seconds  ------------ opóźnienie konfiguracji 10 sekund
int row = 0;
int timeout  = 180; // seconds to run for

const uint8_t logo32_glcd_bmp[] PROGMEM =  //logo supla 32
{
  0x00,0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0xE0,0x7F,0x00,0x00,
  0xF0,0x70,0x00,0x00,0x30,0xE0,0x00,0x00,0x38,0xC0,0x00,0x00,
  0x18,0xC0,0x01,0x00,0x18,0xC0,0x01,0x00,0x38,0xC0,0x00,0x00,
  0x38,0xE0,0x01,0x00,0x70,0xF0,0x07,0x00,0xE0,0x7F,0x0E,0x00,
  0xC0,0x3F,0x38,0x00,0x00,0x1F,0xE0,0x0F,0x00,0x18,0xC0,0x1F,
  0x00,0x18,0xC0,0x30,0x00,0x18,0xC0,0x30,0x00,0x30,0xC0,0x30,
  0x00,0x30,0x80,0x1F,0x00,0x30,0xC0,0x0F,0x00,0x20,0x60,0x00,
  0x00,0x60,0x20,0x00,0x00,0x60,0x30,0x00,0x00,0x40,0x18,0x00,
  0x00,0xC0,0x0D,0x00,0x00,0xC0,0x07,0x00,0x00,0x60,0x04,0x00,
  0x00,0x20,0x0C,0x00,0x00,0x20,0x0C,0x00,0x00,0x60,0x06,0x00,
  0x00,0xC0,0x03,0x00,0x00,0x00,0x00,0x00
};
const uint8_t logo16_wifi_bmp[] PROGMEM =  //logo wifi 16
{
  0x00,0x00,0x00,0x00,0xE0,0x07,0x38,0x1C,0xC4,0x23,0x72,0x4E,
  0x08,0x10,0xE4,0x27,0x10,0x0C,0x90,0x09,0x40,0x02,0x60,0x06,
  0x40,0x02,0x80,0x01,0x00,0x00,0x00,0x00
};
const uint8_t logo16_supla_bmp[] PROGMEM =  //logo supla 16
{
  0x30,0x00,0x7C,0x00,0xC4,0x00,0x86,0x00,0x84,0x00,0xDC,0x03,
  0x78,0x36,0x60,0x78,0x40,0x48,0x40,0x38,0x40,0x04,0x80,0x06,
  0x80,0x03,0x40,0x02,0xC0,0x03,0x00,0x01
};

const uint8_t logo_Power_off[] PROGMEM =  //Power off
{
  0xe0, 0xff, 0xff, 0xff, 0x03, 0x38, 0xfc, 0xff, 0xff, 0x0f, 0x0c, 0xf0,
   0xff, 0xff, 0x3f, 0x06, 0xe0, 0xff, 0xff, 0x3f, 0x02, 0xc0, 0xcf, 0x43,
   0x78, 0x03, 0xc0, 0x33, 0x43, 0x78, 0x01, 0xc0, 0x7b, 0x7b, 0xff, 0x01,
   0x80, 0xfd, 0x42, 0xf8, 0x01, 0x80, 0xfd, 0x42, 0xf8, 0x01, 0x80, 0x7b,
   0x7b, 0xff, 0x03, 0xc0, 0x33, 0x7b, 0xff, 0x02, 0xc0, 0xcf, 0x7b, 0x7f,
   0x06, 0xe0, 0xff, 0xff, 0x7f, 0x0c, 0xf0, 0xff, 0xff, 0x3f, 0x18, 0xfc,
   0xff, 0xff, 0x1f, 0xf0, 0xff, 0xff, 0xff, 0x07, 
};
const uint8_t logo_Power_on[] PROGMEM =  //Power on
{
   0xe0, 0xff, 0xff, 0xff, 0x07, 0x38, 0x00, 0x00, 0x30, 0x0c, 0x0c, 0x00,
   0x00, 0x18, 0x18, 0x06, 0x00, 0x00, 0x0c, 0x30, 0x02, 0x0e, 0x00, 0x06,
   0x60, 0x03, 0x9f, 0x19, 0x02, 0x40, 0x81, 0xb1, 0x1b, 0x03, 0xc0, 0x81,
   0xa0, 0x1a, 0x01, 0x80, 0x81, 0xa0, 0x1e, 0x01, 0x80, 0x81, 0xb1, 0x1c,
   0x01, 0xc0, 0x03, 0x9b, 0x18, 0x03, 0x40, 0x02, 0x8e, 0x18, 0x02, 0x60,
   0x06, 0x00, 0x00, 0x06, 0x20, 0x0c, 0x00, 0x00, 0x0c, 0x38, 0x38, 0x00,
   0x00, 0x18, 0x0c, 0xe0, 0xff, 0xff, 0xff, 0x07,
};
typedef struct {  //------------------------------------------- BTN ----------------------------------------------------
  int pin;
  char last_val;
  unsigned long last_time;
} _btn_t;

_btn_t btn[BTN_COUNT];
void btn_init() {
  for(int a=0;a<BTN_COUNT;a++)
    if (btn[a].pin > 0) {
        pinMode(btn[a].pin-1, INPUT_PULLUP);
        btn[a].last_val = digitalRead(btn[a].pin-1);
        btn[a].last_time = millis();
    }
}
void saveConfigCallback () {
  Serial.println("Should save config");
  shouldSaveConfig = true;
}
void ondemandwifiCallback () {
          display.clear();
          display.setContrast(100, 241, 64);
          display.setTextAlignment(TEXT_ALIGN_CENTER);
          display.setFont(ArialMT_Plain_10);
          display.drawString(64, 16, "wifi config connect");
          display.drawString(64, 28, "to wifi hotspot");
          display.setFont(ArialMT_Plain_16);
          display.drawString(64, 44, "RemoteThermostat"); 
          display.display();    
  WiFiManagerParameter custom_Supla_server("server", "supla server", Supla_server, 20);
  WiFiManagerParameter custom_D_Link_1("LinkA", "D_Link_1", D_Link_1, 61);
  WiFiManagerParameter custom_D_Link_2("LinkB", "D_Link_2", D_Link_2, 61);
  WiFiManagerParameter custom_D_Link_3("LinkC", "D_Link_3", D_Link_3, 61);
  WiFiManagerParameter custom_Link_T("LinkTemp", "Link Temp..", Link_T, 61);
  WiFiManagerParameter custom_Link_T2("LinkTher", "Link Ther..", Link_T2, 61);
 
  WiFiManager wifiManager;

  wifiManager.setSaveConfigCallback(saveConfigCallback);
  
  wifiManager.addParameter(&custom_Supla_server);
  wifiManager.addParameter(&custom_D_Link_1);
  wifiManager.addParameter(&custom_D_Link_2);
  wifiManager.addParameter(&custom_D_Link_3);
  wifiManager.addParameter(&custom_Link_T);
  wifiManager.addParameter(&custom_Link_T2);

  wifiManager.setCustomHeadElement("<style>html{ background-color: #01DF3A;margin-left: auto; margin-right: auto;width:60%;}</style><div class='s'><svg version='1.1' id='l' x='0' y='0' viewBox='0 0 200 200' xml:space='preserve'><path d='M59.3,2.5c18.1,0.6,31.8,8,40.2,23.5c3.1,5.7,4.3,11.9,4.1,18.3c-0.1,3.6-0.7,7.1-1.9,10.6c-0.2,0.7-0.1,1.1,0.6,1.5c12.8,7.7,25.5,15.4,38.3,23c2.9,1.7,5.8,3.4,8.7,5.3c1,0.6,1.6,0.6,2.5-0.1c4.5-3.6,9.8-5.3,15.7-5.4c12.5-0.1,22.9,7.9,25.2,19c1.9,9.2-2.9,19.2-11.8,23.9c-8.4,4.5-16.9,4.5-25.5,0.2c-0.7-0.3-1-0.2-1.5,0.3c-4.8,4.9-9.7,9.8-14.5,14.6c-5.3,5.3-10.6,10.7-15.9,16c-1.8,1.8-3.6,3.7-5.4,5.4c-0.7,0.6-0.6,1,0,1.6c3.6,3.4,5.8,7.5,6.2,12.2c0.7,7.7-2.2,14-8.8,18.5c-12.3,8.6-30.3,3.5-35-10.4c-2.8-8.4,0.6-17.7,8.6-22.8c0.9-0.6,1.1-1,0.8-2c-2-6.2-4.4-12.4-6.6-18.6c-6.3-17.6-12.7-35.1-19-52.7c-0.2-0.7-0.5-1-1.4-0.9c-12.5,0.7-23.6-2.6-33-10.4c-8-6.6-12.9-15-14.2-25c-1.5-11.5,1.7-21.9,9.6-30.7C32.5,8.9,42.2,4.2,53.7,2.7c0.7-0.1,1.5-0.2,2.2-0.2C57,2.4,58.2,2.5,59.3,2.5z M76.5,81c0,0.1,0.1,0.3,0.1,0.6c1.6,6.3,3.2,12.6,4.7,18.9c4.5,17.7,8.9,35.5,13.3,53.2c0.2,0.9,0.6,1.1,1.6,0.9c5.4-1.2,10.7-0.8,15.7,1.6c0.8,0.4,1.2,0.3,1.7-0.4c11.2-12.9,22.5-25.7,33.4-38.7c0.5-0.6,0.4-1,0-1.6c-5.6-7.9-6.1-16.1-1.3-24.5c0.5-0.8,0.3-1.1-0.5-1.6c-9.1-4.7-18.1-9.3-27.2-14c-6.8-3.5-13.5-7-20.3-10.5c-0.7-0.4-1.1-0.3-1.6,0.4c-1.3,1.8-2.7,3.5-4.3,5.1c-4.2,4.2-9.1,7.4-14.7,9.7C76.9,80.3,76.4,80.3,76.5,81z M89,42.6c0.1-2.5-0.4-5.4-1.5-8.1C83,23.1,74.2,16.9,61.7,15.8c-10-0.9-18.6,2.4-25.3,9.7c-8.4,9-9.3,22.4-2.2,32.4c6.8,9.6,19.1,14.2,31.4,11.9C79.2,67.1,89,55.9,89,42.6z M102.1,188.6c0.6,0.1,1.5-0.1,2.4-0.2c9.5-1.4,15.3-10.9,11.6-19.2c-2.6-5.9-9.4-9.6-16.8-8.6c-8.3,1.2-14.1,8.9-12.4,16.6C88.2,183.9,94.4,188.6,102.1,188.6z M167.7,88.5c-1,0-2.1,0.1-3.1,0.3c-9,1.7-14.2,10.6-10.8,18.6c2.9,6.8,11.4,10.3,19,7.8c7.1-2.3,11.1-9.1,9.6-15.9C180.9,93,174.8,88.5,167.7,88.5z'/></svg>");
  wifiManager.setBreakAfterConfig(true);
  wifiManager.setMinimumSignalQuality();

    wifiManager.setConfigPortalTimeout(timeout);

    if (!wifiManager.startConfigPortal("Remote_Thermostat")) {
      Serial.println("failed to connect and hit timeout");
      delay(3000);
      ESP.restart();
      delay(5000);
    }
    Serial.println("connected...yeey :)");
    
    strcpy(Supla_server, custom_Supla_server.getValue());
    strcpy(D_Link_1, custom_D_Link_1.getValue());
    strcpy(D_Link_2, custom_D_Link_2.getValue());
    strcpy(D_Link_3, custom_D_Link_3.getValue());
    strcpy(Link_T, custom_Link_T.getValue());  
    strcpy(Link_T2, custom_Link_T2.getValue());
    
    WiFi.softAPdisconnect(true);   //  close AP
}
void TH_Overlay() {

  display.clear();
   if (Temp > -100){
         display.setFont(ArialMT_Plain_24);
         display.setTextAlignment(TEXT_ALIGN_CENTER);
         display.drawString(64, 20, String(Temp, 2) + "ºC"); 
   }else{
         display.setFont(ArialMT_Plain_24);
         display.setTextAlignment(TEXT_ALIGN_CENTER);
         display.drawString(64, 20, "-----"); 
   }
 if (Read1on == true){ 
   if (can1 == 1){
         display.setFont(ArialMT_Plain_16);
         display.setTextAlignment(TEXT_ALIGN_CENTER);
         display.drawString(64, 48, "Auto Set " + String(Temp2, 1) + "ºC"); 
   }else{
         display.setFont(ArialMT_Plain_16);
         display.setTextAlignment(TEXT_ALIGN_CENTER);
         display.drawString(64, 48, "Manual mode"); 
  } } 
  if (pr_wifi == true){
               display.drawXbm(1, 0, 16, 16, logo16_wifi_bmp);// -------------------------------------------------- oled wifi ok  -------- 
  }
  if (onsend == true){            
               display.drawXbm(24, 0, 16, 16, logo16_supla_bmp);// ------------------------------------------------ oled supla ok --------                                 
  }
  if (Read2on == true){
     if (can2 == 0){
         display.drawXbm(86, 0, 40, 16, logo_Power_off);// ------------------------------------------------- Relay off  --------   
     }
     if (can2 == 1){
         display.drawXbm(86, 0, 40, 16, logo_Power_on);// -------------------------------------------------- Relay on  --------- 
     }  } 
  display.display();
  yield();
  TempDisp_lasttime = millis();  
}
void iterate_btn() {
  char v;
  unsigned long now = millis();
  {
  for(int a=0;a<4;a++)
    if (btn[a].pin > 0) {
        v = digitalRead(btn[a].pin-1);
        if (v != btn[a].last_val && now - btn[a].last_time ) {
           btn[a].last_val = v;
           btn[a].last_time = now;
           delay(75);
           v = digitalRead(btn[a].pin-1);
           if (v==0)
           if (dimm == true){
            dimm_milis = millis() + 15000 ;
            display.setContrast(100, 230, 60);
            dimm = false;
            TH_Overlay();
             return;  
           }else{  
            if (a == 0){
                  onsend = true;
                  TH_Overlay(); 
                  url = D_Link_1;
                  url = (url  + "/toggle");
                  direct_Link();
                  //delay(100);
                  D_Link_read();
                  dimm_milis = millis() + 15000 ; 
                   return;
           }
             if (a == 1){
                  onsend = true;
                  TH_Overlay(); 
                  url = D_Link_2;
                  url = (url  + "/toggle");
                  direct_Link();
                  //delay(100);
                  D_Link_read2();
                  dimm_milis = millis() + 15000 ; 
                   return;                        
              }
                if (a == 2 ) { 
                  onsend = true;
                  TH_Overlay();  
                  url = D_Link_3;
                  url = (url + "/turn-off");
                  direct_Link(); 
                  Temp2_D_Link();
                  dimm_milis = millis() + 15000 ;
                   return;
                 } 
              if (a == 3 ) {
                  onsend = true;
                  TH_Overlay();  
                  url = D_Link_3;
                  url = (url + "/turn-on");
                  direct_Link();
                  Temp2_D_Link();
                  dimm_milis = millis() + 15000 ;
                   return;
                 }        
             }}
      }
    }
}
void setup() {  //------------------------------------------------ Setup ----------------------------------------------

  Serial.begin(115200);

   memset(btn, 0, sizeof(btn));
  btn[0].pin =button_1 +1;          // pin gpio buton  +1
  btn[1].pin =button_2 +1;          // pin gpio buton  +1
  btn[2].pin =button_3 +1;          // pin gpio buton  +1
  btn[3].pin =button_4 +1;          // pin gpio buton  +1  
  btn_init();
  
 display.init();
  display.flipScreenVertically();
   display.setFont(ArialMT_Plain_10);
     display.clear();
      display.setFont(ArialMT_Plain_24);
       display.drawString(33, 40, "SUPLA");
         display.drawXbm(0, 16, 32, 32,logo32_glcd_bmp );
          display.display();
 
  if (WiFi.SSID()==""){ initialConfig = true;} 
      
  Serial.println("mounting FS...");  
  if (SPIFFS.begin()) {
    Serial.println("mounted file system");
    if (SPIFFS.exists("/config.json")) {
      Serial.println("reading config file");
      File configFile = SPIFFS.open("/config.json", "r");
      if (configFile) {
        Serial.println("opened config file");
        size_t size = configFile.size();
        std::unique_ptr<char[]> buf(new char[size]);
        configFile.readBytes(buf.get(), size);
        DynamicJsonBuffer jsonBuffer;         
        JsonObject& json = jsonBuffer.parseObject(buf.get());
        Serial.println(jsonBuffer.size());
        json.printTo(Serial);
        if (json.success()) {
          Serial.println("\nparsed json");
          strcpy(Supla_server, json["Supla_server"]);
          strcpy(D_Link_1, json["D_Link_1"]);
          strcpy(D_Link_2, json["D_Link_2"]);
          strcpy(D_Link_3, json["D_Link_3"]);
          strcpy(Link_T, json["Link_T"]);
          strcpy(Link_T2, json["Link_T2"]);
        } else {Serial.println("failed to load json config");}                       
      }
    }
  } else {Serial.println("failed to mount FS");}
      
  host = Supla_server;
  WiFi.mode(WIFI_STA);
  dimm_milis = millis() + 15000;
}

void loop() { 
    if  (initialConfig)  {
    ondemandwifiCallback () ;
    initialConfig = false; 
  }
  
  if (millis() > dimm_milis){ 
    if (dimm == false){
    display.setContrast(50, 50, 30);
    display.display();
    dimm = true ;     
    }    
    dimm_milis = millis() + 15000 ;
     } 
    
  if (WiFi.status() != WL_CONNECTED) 
   {
    pr_wifi = false;
    WiFi_up();
   }  
   
   iterate_btn();
   
   int C_W_read = digitalRead(button_1);{    
   if (C_W_read != last_C_W_state) {            
     time_last_C_W_change = millis();
   }
   if ((millis() - time_last_C_W_change) > C_W_delay) {     
     if (C_W_read != C_W_state) {     
       Serial.println("Triger sate changed");
       C_W_state = C_W_read;       
       if (C_W_state == LOW) {
        ondemandwifiCallback () ;
       }
     }
    }
   last_C_W_state = C_W_read;            
   }
   
    if (millis() > Temp_lasttime + Temp_mtbs)  {    //-------------Temp_lasttime--------------------

     if (up_n < 5) { up_n = up_n +1;}
             
     if (up_n == 5) {up_n = 1;}
              
     if (up_n == 1){
      onsend = true;
      TH_Overlay();
      Temp_D_Link();
     }
     if (up_n == 2){
      onsend = true;
      TH_Overlay();
      Temp2_D_Link();
     }
     if (up_n == 3){
      onsend = true;
      TH_Overlay();
      D_Link_read();
     }
     if (up_n == 4){
      onsend = true;
      TH_Overlay();
      D_Link_read2();
     }      
    Temp_lasttime = millis();
  }

  if (shouldSaveConfig) {
    Serial.println("saving config");
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    json["Supla_server"] = Supla_server;
    json["D_Link_1"] = D_Link_1;
    json["D_Link_2"] = D_Link_2;
    json["D_Link_3"] = D_Link_3;
    json["Link_T"] = Link_T;
    json["Link_T2"] = Link_T2;
    File configFile = SPIFFS.open("/config.json", "w");
    if (!configFile) {Serial.println("failed to open config file for writing");}    
    json.prettyPrintTo(Serial);
    json.printTo(configFile);
    configFile.close();
    Serial.println("config saved");
    shouldSaveConfig = false;
    WiFi.mode(WIFI_STA);
    delay(3000);
    ESP.restart();
    delay(5000); 
    }
    
  if (millis() > TempDisp_lasttime + TempDisp_mtbs)  {    //-------------TempDisp_lasttime--------------------
    TH_Overlay();
  }
}
void WiFi_up() { 
  if (millis() > wifimilis)  {
  WiFi.begin(); 
  for (int x = 20; x > 0; x--) 
  {
    if (x == 1){
    wifimilis = (millis() + wifi_checkDelay) ; 
    }           
    if (WiFi.status() == WL_CONNECTED) 
    { 
     pr_wifi = true;
     break;                   
    } else{
     delay(500);   
      Serial.print(".");                                         
    }    
  }
  if (WiFi.status() == WL_CONNECTED)
  {
    pr_wifi = true;
    Serial.println("");
    Serial.println("Connected");
    Serial.println("Adres IP: ");
    Serial.print(WiFi.localIP());
    Serial.print(" / ");
    Serial.print(WiFi.subnetMask());
    Serial.print(" / ");
    Serial.println(WiFi.gatewayIP());
    long rssi = WiFi.RSSI();
    Serial.print("(RSSI): ");
    Serial.print(rssi);
    Serial.println(" dBm");
    onsend = true;
      TH_Overlay();
      Temp_D_Link();
      Temp2_D_Link();
      url = D_Link_1;
      D_Link_read();
      url = D_Link_2;
      D_Link_read2();     
  }
  if (WiFi.status() != WL_CONNECTED) 
  {
    Serial.println("");
    Serial.println("connection failed");
    pr_wifi = false;
  } 
 }
}
void direct_Link() {
  
  WiFiClientSecure client;  
  if (!client.connect(host, httpsPort)) {
    Serial.println("connection failed");
    return;
  }
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "User-Agent: ESP8266\r\n" +
               "Connection: close\r\n\r\n");
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      break;
    }
  }
  String line = client.readStringUntil('}');
  line = line + "}";
  if (line.indexOf("true") >0) {  
  } else {
    Serial.println("failed");
  }
   onsend = false;
   TH_Overlay();      
}
void Temp_D_Link() {
  url = Link_T; 
  WiFiClientSecure client;
  if (!client.connect(host, httpsPort)) {
    Serial.println("connection failed");
    return;
  }
  client.print(String("GET ") + url + "/read" + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "User-Agent: ESP8266\r\n" +
               "Connection: close\r\n\r\n");
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      break;
    }
  }
  String line = client.readStringUntil('}');
  line = line + "}";
  DynamicJsonBuffer  jsonBuffer(200);
    JsonObject& root = jsonBuffer.parseObject(line);
  if (!root.success()) {
    Serial.println("parseObject() failed");
    return;
  }
  Temp = root["temperature"];
  onsend = false;
  TH_Overlay();
}
void Temp2_D_Link() {
  url = Link_T2;
  WiFiClientSecure client;
  if (!client.connect(host, httpsPort)) {
    Serial.println("connection failed");
    return;
  }
  client.print(String("GET ") + url + "/read" + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "User-Agent: ESP8266\r\n" +
               "Connection: close\r\n\r\n");
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      break;
    }
  }
  String line = client.readStringUntil('}');
  line = line + "}";
  DynamicJsonBuffer  jsonBuffer(200);
    JsonObject& root = jsonBuffer.parseObject(line);
  if (!root.success()) {
    Serial.println("parseObject() failed");
    return;
  }
  Temp2 = root["temperature"];
  onsend = false;
  TH_Overlay();
}
void D_Link_read() {
  url = D_Link_1;
  WiFiClientSecure client;
  if (!client.connect(host, httpsPort)) {
    Serial.println("connection failed");
    Read1on = false;
    return;
  }
  client.print(String("GET ") + url + "/read" + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "User-Agent: ESP8266\r\n" +
               "Connection: close\r\n\r\n");
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      break;
    }
  }
  String line = client.readStringUntil('}');
  line = line + "}";
  DynamicJsonBuffer  jsonBuffer(200);
    JsonObject& root = jsonBuffer.parseObject(line);
  if (!root.success()) {
    Serial.println("parseObject() failed");
    Read1on = false;
    return;
  }
  can1 = root["on"];
  Read1on = true;
  onsend = false;
  TH_Overlay();
}
void D_Link_read2() {
  url = D_Link_2;
  WiFiClientSecure client;
  if (!client.connect(host, httpsPort)) {
    Serial.println("connection failed");
    Read2on = false;
    return;
  }
  client.print(String("GET ") + url + "/read" + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "User-Agent: ESP8266\r\n" +
               "Connection: close\r\n\r\n");
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      break;
    }
  }
  String line = client.readStringUntil('}');
  line = line + "}";
  DynamicJsonBuffer  jsonBuffer(200);
    JsonObject& root = jsonBuffer.parseObject(line);
  if (!root.success()) {
    Serial.println("parseObject() failed");
    Read2on = false;
    return;
  }
  can2 = root["on"];
  Read2on = true;
  onsend = false;
  TH_Overlay();
}
D_Link_Termostat_Remote_btn.rar
Arduino & compiled firmware
(751.24 KiB) Downloaded 288 times
User avatar
michael
Posts: 1299
Joined: Wed Nov 09, 2016 8:00 am
Location: Wojkowice

You probably never stop surprising me with your soft ... ... and positively: D
:mrgreen: :mrgreen: :mrgreen:
piomar2
Posts: 369
Joined: Fri Apr 26, 2019 5:32 pm
Location: Bukowice

I'm in the middle of a test. I have some problem with "+" and "-" in D_Link_Termostat_Remote_btn, aut / ma and on / off works ok. I'll try to make links again. I have already exchanged wemosa for another art. There are delays in reaction to both sides. Elmaya Regards.
piomar2
Posts: 369
Joined: Fri Apr 26, 2019 5:32 pm
Location: Bukowice

After correcting the links is ok. Only this delay ...
elmaya
Posts: 1482
Joined: Wed Jun 27, 2018 5:48 pm
Location: El Saucejo - Sevilla

piomar2 wrote: Thu Nov 07, 2019 4:14 pm After correcting the links is ok. Only this delay ...
Direct links are a bit slow but a thermostat usually doesn't have very fast changes.
piomar2
Posts: 369
Joined: Fri Apr 26, 2019 5:32 pm
Location: Bukowice

It's true, but when you sit far from the thermostat and you see the thermostat_Remote, you do not know what the temperature is and the set temperature (worse refreshed) on the photo for several minutes (thermo auto set 27.5 and on remote 20.0 )
piomar2
Posts: 369
Joined: Fri Apr 26, 2019 5:32 pm
Location: Bukowice

And this is also a small detail: on the 1.3 leader, the inscription does not fit (photo)
elmaya
Posts: 1482
Joined: Wed Jun 27, 2018 5:48 pm
Location: El Saucejo - Sevilla

piomar2 wrote: Thu Nov 07, 2019 5:03 pm It's true, but when you sit far from the thermostat and you see the thermostat_Remote, you do not know what the temperature is and the set temperature (worse refreshed) on the photo for several minutes (thermo auto set 27.5 and on remote 20.0 )
the maximum refresh time is 20 seconds for all 4 channels (one every 5 seconds)
the supla logo turns on a moment every 5 seconds (this means that it is connecting with supla to update one of the channels)
piomar2
Posts: 369
Joined: Fri Apr 26, 2019 5:32 pm
Location: Bukowice

temperature equalizes and set not very much (pictures 3 minutes difference)
piomar2
Posts: 369
Joined: Fri Apr 26, 2019 5:32 pm
Location: Bukowice

After changing the "+" or "-" on the thermostat, it updates on the remot, but after about 45 seconds, the setting 20.0 appears on the remot, although I don't move anything ... it stays like that, unless I change to thermo.
Post Reply

Return to “Ideas and concepts”