Supla Button 4 direct links

szym3k
Posts: 268
Joined: Mon May 15, 2017 10:32 am

Post

i have 4443 (docker).

192.168.1.9:4443

when i get link in browser:

Image


I modified the code under 4443

Code: Select all

#include <FS.h>  
#include <WiFiClientSecure.h>
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <WiFiManager.h> 
#include <ArduinoJson.h>
#include <Ticker.h>      //for LED status
Ticker ticker;

const char* host = "";
const int httpsPort = 4443;

// Use web browser to view and copy
// SHA1 fingerprint of the certificate
const char* fingerprint = "41 06 13 c7 8d 0c 66 2b 79 32 5d 1e a4 2e dc 7a ae 6d 3c 7b";

//define your default values here, if there are different values in config.json, they are overwritten.
//length should be max size + 1 
char Supla_server[40];
char D_Link_1[40];
char D_Link_2[40];
char D_Link_3[40];
char D_Link_4[40];
byte mac[6];
String url = "/direct/xx/xxxxxxxxx/read";

//flag for saving data
bool shouldSaveConfig = false;
bool initialConfig = false;
#define onboard_led D4  
#define TRIGGER_PIN D3    // wifi config
#define Link_1_PIN D5     // triger Link 1
#define Link_2_PIN D6     // triger Link 2
#define Link_3_PIN D1     // triger Link 3
#define Link_4_PIN D2     // triger Link 4

int timeout           = 120; // seconds to run for
void tick()
{
  //toggle state
  int state = digitalRead(onboard_led);  // get the current state of D4 pin
  digitalWrite(onboard_led, !state);     // set pin to the opposite state
}

//callback notifying us of the need to save config
void saveConfigCallback () {
  Serial.println("Should save config");
  shouldSaveConfig = true;
}
void ondemandwifiCallback () {
  ticker.attach(0.2, tick);
// The extra parameters to be configured (can be either global or just in the setup)
  // After connecting, parameter.getValue() will get you the configured value
  // id/name placeholder/prompt default length
  WiFiManagerParameter custom_Supla_server("server", "supla server", Supla_server, 40);
  WiFiManagerParameter custom_D_Link_1("Link 1", "D_Link_1", D_Link_1, 40);
  WiFiManagerParameter custom_D_Link_2("Link 2", "D_Link_2", D_Link_2, 40);
  WiFiManagerParameter custom_D_Link_3("Link 3", "D_Link_3", D_Link_3, 40);
  WiFiManagerParameter custom_D_Link_4("Link 4", "D_Link_4", D_Link_4, 40);

  //WiFiManager
  //Local intialization. Once its business is done, there is no need to keep it around
  WiFiManager wifiManager;

  //set config save notify callback
  wifiManager.setSaveConfigCallback(saveConfigCallback);
  
  //add all your parameters here
  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_D_Link_4);

  wifiManager.setCustomHeadElement("<style>html{ background-color: #01DF3A;}</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>");

  //set minimu quality of signal so it ignores AP's under that quality
  //defaults to 8%
  wifiManager.setMinimumSignalQuality();

  // set configportal timeout
    wifiManager.setConfigPortalTimeout(timeout);

    if (!wifiManager.startConfigPortal("DirectLink4")) {
      Serial.println("failed to connect and hit timeout");
      delay(3000);
      //reset and try again, or maybe put it to deep sleep
      ESP.restart();
      delay(5000);
    }
    //if you get here you have connected to the WiFi
    Serial.println("connected...yeey :)");
    
    //read updated parameters
    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(D_Link_4, custom_D_Link_4.getValue());
  
}

void setup() {  //------------------------------------------------ Setup ----------------------------------------------

  Serial.begin(115200);
  //sensors.begin();

  pinMode(TRIGGER_PIN, INPUT_PULLUP);
  pinMode(Link_1_PIN, INPUT_PULLUP);
  pinMode(Link_2_PIN, INPUT_PULLUP);
  pinMode(Link_3_PIN, INPUT_PULLUP);
  pinMode(Link_4_PIN, INPUT_PULLUP);
  pinMode(onboard_led, OUTPUT);
  // start ticker with 0.6 
  ticker.attach(0.6, tick);
  
  if (WiFi.SSID()==""){   
    initialConfig = true;
  }
  //read configuration from FS json
  Serial.println("mounting FS...");
  
  if (SPIFFS.begin()) {
    Serial.println("mounted file system");
    if (SPIFFS.exists("/config.json")) {
      //file exists, reading and loading
      Serial.println("reading config file");
      File configFile = SPIFFS.open("/config.json", "r");
      if (configFile) {
        Serial.println("opened config file");
        size_t size = configFile.size();
        // Allocate a buffer to store contents of the file.
        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(D_Link_4, json["D_Link_4"]);

        } else {
          Serial.println("failed to load json config");
          
        }
      }
    }
  } else {
    Serial.println("failed to mount FS");
  } 
  host = Supla_server;
  WiFi.mode(WIFI_STA); // Force to station mode because if device was switched off while in access point mode it will start up next time in access point mode.
}

void loop() { 

 if ( digitalRead(Link_1_PIN) == LOW )  {
    url = D_Link_1;
    direct_Link() ;
    
  }
   if ( digitalRead(Link_2_PIN) == LOW)  {
    url = D_Link_2;
    direct_Link() ;
    
  }
  if ( digitalRead(Link_3_PIN) == LOW )  {
    url = D_Link_3;
    direct_Link() ;
    
  }
   if ( digitalRead(Link_4_PIN) == LOW)  {
    url = D_Link_4;
    direct_Link() ;
    
  }
 
    // is configuration portal requested?
  if ( digitalRead(TRIGGER_PIN) == LOW|| (initialConfig))  {
    ondemandwifiCallback () ;
    initialConfig = false; 
  }
  //save the custom parameters to FS
  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["D_Link_4"] = D_Link_4;

    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;
    //end save
    WiFi.mode(WIFI_STA);
    ticker.detach();
    digitalWrite(onboard_led, HIGH); 
    }
  
  if (WiFi.status() != WL_CONNECTED) 
   {
    ticker.attach(0.6, tick);
    WiFi_up();
   }
  

}

void WiFi_up() 
{
  WiFi.begin(); 

  for (int x = 60; x > 0; x--) 
  {
    if (WiFi.status() == WL_CONNECTED) 
    {
      break;                           
    }
    else                                 
    {
      Serial.print(".");                
      delay(500);                      
    }

  }

  if (WiFi.status() == WL_CONNECTED)
  {
    ticker.detach();
    digitalWrite(onboard_led, HIGH);
    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");
    Serial.print("(Port): ");
    Serial.print(httpsPort);
  }
  else    
  {
    Serial.println("");
    Serial.println("connection failed to wifi");
  }
}
void direct_Link() {
  // Use WiFiClientSecure class to create TLS connection
  WiFiClientSecure client;
  Serial.print("connecting to ");
  Serial.println(host);
  Serial.println(httpsPort);
  if (!client.connect(host, httpsPort)) {
    Serial.println("connection failed");
    Serial.println(host);
    Serial.println(httpsPort);
    return;
  }
  Serial.print("requesting URL: ");
  Serial.println(url);

  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "User-Agent: BuildFailureDetectorESP8266\r\n" +
               "Connection: close\r\n\r\n");

  Serial.println("request sent");
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      Serial.println("headers received");
      break;
    }
  }
  String line = client.readStringUntil('}');
  line = line + "}";
  Serial.println("reply was:");
  Serial.println("==========");
  Serial.println(line);
  Serial.println("==========");
  Serial.println("closing connection");
}

in the serial console i have:

Image


could this be the fault of the certificate?
my domain has a green certificate from let's encrypt, but it doesn't work after port 443 (proxy) :/

you are able to compile for port 4443, maybe I have some other library?
elmaya
Posts: 1482
Joined: Wed Jun 27, 2018 5:48 pm
Location: El Saucejo - Sevilla

Post

compile using:

esp board manager 2.4.2
iwip Variant V2 higher Bandwidth

i think later versions doesn't work
szym3k
Posts: 268
Joined: Mon May 15, 2017 10:32 am

Post

I compiled with these settings and it works. Thank you!

I used 2.5 before.
elmaya
Posts: 1482
Joined: Wed Jun 27, 2018 5:48 pm
Location: El Saucejo - Sevilla

Post

szym3k wrote: Mon Dec 16, 2019 11:59 pm I compiled with these settings and it works. Thank you!

I used 2.5 before.
I'm sorry for the inconveniences.
That is the only one in which it is not spesified.
I will correct.
User avatar
bulek68
Posts: 453
Joined: Thu Feb 08, 2018 6:51 pm
Location: Podkarpackie

Post

My construction concept for SUPLA Direct Link by elmaya. ;)
You do not have the required permissions to view the files attached to this post.
User avatar
ritual
Posts: 80
Joined: Mon Apr 20, 2020 11:47 am

Post

i tried using x4 and x6 direct links softwares and i was not able to send request from it.
i was successful in flashing and connecting it to my wifi but when i connect the specified pin to ground nothing happens.
is there anything specific i need to do, like in links should it be read/toggle or for devices should be turned on or something.
elmaya
Posts: 1482
Joined: Wed Jun 27, 2018 5:48 pm
Location: El Saucejo - Sevilla

Post

directlinks must contain the action "/ toggle, / turn-on, / turn-off" for devices must be disabled.

example:
DirectLink2.png
You do not have the required permissions to view the files attached to this post.
User avatar
ritual
Posts: 80
Joined: Mon Apr 20, 2020 11:47 am

Post

I tried using toggle previous time but it didn't work,tho i will try once again and let you know. Thank you for your help.
arkomp
Posts: 10
Joined: Fri Feb 09, 2018 12:50 pm

Post

Witam
prośba o pomoc w uruchomieniu sterowania z d1mini 8 linkami.
Polutowałem zgodnie z poniższym schematem, wgrałem soft, wpisałem ustawienia do d1mini - łączy się z wifi ponieważ dioda nie mruga ale nie wysyła linków. Już nie mam pomysłu co może być problemem
You do not have the required permissions to view the files attached to this post.
elmaya
Posts: 1482
Joined: Wed Jun 27, 2018 5:48 pm
Location: El Saucejo - Sevilla

Post

have you uploaded the bin file with the correct setting?

flashtool_DIO_32Mbit.png
You do not have the required permissions to view the files attached to this post.

Return to “Ideas and concepts”