Firmwares To separed Repo
This commit is contained in:
parent
2a33e070b8
commit
15b0f97971
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,213 +0,0 @@
|
|||||||
; CH341SER.INF
|
|
||||||
; Driver for CH341 (USB=>SERIAL chip) V3.4
|
|
||||||
; WDM&VXD for Windows 98/Me/2000/XP/Server2003/Vista/64bit Vista/Server2008/Win7/64bit Win7
|
|
||||||
; Copyright (C) W.ch 2001-2014
|
|
||||||
;
|
|
||||||
|
|
||||||
[Version]
|
|
||||||
Signature = "$Chicago$"
|
|
||||||
Class = Ports
|
|
||||||
ClassGuid = {4D36E978-E325-11CE-BFC1-08002BE10318}
|
|
||||||
Provider = %WinChipHead%
|
|
||||||
DriverVer = 08/08/2014, 3.4.2014.08
|
|
||||||
CatalogFile = CH341SER.CAT
|
|
||||||
|
|
||||||
[ControlFlags]
|
|
||||||
ExcludeFromSelect = USB\VID_1A86&PID_7523
|
|
||||||
ExcludeFromSelect = USB\VID_1A86&PID_5523
|
|
||||||
ExcludeFromSelect = USB\VID_4348&PID_5523
|
|
||||||
ExcludeFromSelect = USB\VID_4348&PID_5523&REV_0250
|
|
||||||
ExcludeFromSelect = USBSERPORT\SER5523
|
|
||||||
ExcludeFromSelect = CH341PORT\SER5523
|
|
||||||
|
|
||||||
[Manufacturer]
|
|
||||||
%WinChipHead% = WinChipHead,NT,NTamd64,NTia64
|
|
||||||
|
|
||||||
[WinChipHead]
|
|
||||||
%CH340SER.DeviceDesc% = CH341SER_Install, USB\VID_1A86&PID_7523
|
|
||||||
%CH341ASER.DeviceDesc% = CH341SER_Install, USB\VID_1A86&PID_5523
|
|
||||||
%CH341SER.DeviceDesc% = CH341SER_Install, USB\VID_4348&PID_5523
|
|
||||||
%CH340SER.DeviceDesc% = CH341SER_Install, USB\VID_4348&PID_5523&REV_0250
|
|
||||||
%CH341S98.DeviceDesc% = CH341S98_Install, USBSERPORT\SER5523
|
|
||||||
%CH341S98.DeviceDesc% = CH341S98_Install, CH341PORT\SER5523
|
|
||||||
|
|
||||||
[WinChipHead.NT]
|
|
||||||
%CH340SER.DeviceDesc% = CH341SER_Install.NT, USB\VID_1A86&PID_7523
|
|
||||||
%CH341ASER.DeviceDesc% = CH341SER_Install.NT, USB\VID_1A86&PID_5523
|
|
||||||
%CH341SER.DeviceDesc% = CH341SER_Install.NT, USB\VID_4348&PID_5523
|
|
||||||
%CH340SER.DeviceDesc% = CH341SER_Install.NT, USB\VID_4348&PID_5523&REV_0250
|
|
||||||
|
|
||||||
[WinChipHead.NTamd64]
|
|
||||||
%CH340SER.DeviceDesc% = CH341SER_Inst.NTamd64, USB\VID_1A86&PID_7523
|
|
||||||
%CH341ASER.DeviceDesc% = CH341SER_Inst.NTamd64, USB\VID_1A86&PID_5523
|
|
||||||
%CH341SER.DeviceDesc% = CH341SER_Inst.NTamd64, USB\VID_4348&PID_5523
|
|
||||||
%CH340SER.DeviceDesc% = CH341SER_Inst.NTamd64, USB\VID_4348&PID_5523&REV_0250
|
|
||||||
|
|
||||||
[WinChipHead.NTia64]
|
|
||||||
%CH340SER.DeviceDesc% = CH341SER_Inst.NTia64, USB\VID_1A86&PID_7523
|
|
||||||
%CH341ASER.DeviceDesc% = CH341SER_Inst.NTia64, USB\VID_1A86&PID_5523
|
|
||||||
%CH341SER.DeviceDesc% = CH341SER_Inst.NTia64, USB\VID_4348&PID_5523
|
|
||||||
%CH340SER.DeviceDesc% = CH341SER_Inst.NTia64, USB\VID_4348&PID_5523&REV_0250
|
|
||||||
|
|
||||||
[CH341SER_Install]
|
|
||||||
DelFiles = CH341S98.DelFiles.SYS
|
|
||||||
CopyFiles = CH341SER.CopyFiles.SYS, CH341SER.CopyFiles.DLL
|
|
||||||
AddReg = CH341SER.9X.AddReg, CH341SER.AddReg
|
|
||||||
|
|
||||||
[CH341SER_Install.NT]
|
|
||||||
CopyFiles = CH341SER.NT.CopyFiles.SYS, CH341SER.CopyFiles.DLL
|
|
||||||
AddReg = CH341SER.NT.AddReg, CH341SER.AddReg
|
|
||||||
|
|
||||||
[CH341SER_Install.NT.HW]
|
|
||||||
AddReg = CH341SER.NT.HW.AddReg
|
|
||||||
|
|
||||||
[CH341SER_Inst.NTamd64]
|
|
||||||
CopyFiles = CH341SER.NT.CopyFiles.SYSA64
|
|
||||||
AddReg = CH341SER.NT.AddReg, CH341SER.AddReg
|
|
||||||
|
|
||||||
[CH341SER_Inst.NTamd64.HW]
|
|
||||||
AddReg = CH341SER.NT.HW.AddReg
|
|
||||||
|
|
||||||
[CH341SER_Inst.NTia64]
|
|
||||||
CopyFiles = CH341SER.NT.CopyFiles.SYSI64
|
|
||||||
AddReg = CH341SER.NT.AddReg, CH341SER.AddReg
|
|
||||||
|
|
||||||
[CH341SER_Inst.NTia64.HW]
|
|
||||||
AddReg = CH341SER.NT.HW.AddReg
|
|
||||||
|
|
||||||
[CH341S98_Install]
|
|
||||||
DelFiles = CH341S98.DelFiles.SYS
|
|
||||||
CopyFiles = CH341S98.CopyFiles.VXD, CH341SER.CopyFiles.SYS
|
|
||||||
AddReg = CH341S98.9X.AddReg, CH341S98.AddReg
|
|
||||||
|
|
||||||
;[CH341S98_Install.NT]
|
|
||||||
|
|
||||||
[CH341S98.DelFiles.SYS]
|
|
||||||
CH341S98.SYS, , , 1
|
|
||||||
|
|
||||||
[CH341SER.CopyFiles.SYS]
|
|
||||||
CH341S98.SYS, , , 2
|
|
||||||
|
|
||||||
[CH341SER.NT.CopyFiles.SYS]
|
|
||||||
CH341SER.SYS, , , 2
|
|
||||||
|
|
||||||
[CH341SER.NT.CopyFiles.SYSA64]
|
|
||||||
CH341S64.SYS, , , 2
|
|
||||||
|
|
||||||
[CH341SER.NT.CopyFiles.SYSI64]
|
|
||||||
;CH341I64.SYS, , , 2
|
|
||||||
|
|
||||||
[CH341S98.CopyFiles.VXD]
|
|
||||||
CH341SER.VXD, , , 2
|
|
||||||
|
|
||||||
[CH341SER.CopyFiles.DLL]
|
|
||||||
CH341PT.DLL, , , 2
|
|
||||||
;安装DLL是可选的,DLL可以用于识别CH341端口和监视CH341端口的插拔事件
|
|
||||||
|
|
||||||
[CH341SER.9X.AddReg]
|
|
||||||
HKR, , DevLoader, , *NTKERN
|
|
||||||
HKR, , NTMPDriver, , CH341S98.SYS
|
|
||||||
|
|
||||||
[CH341SER.NT.AddReg]
|
|
||||||
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"
|
|
||||||
|
|
||||||
[CH341SER.NT.HW.AddReg]
|
|
||||||
HKR,,"UpperFilters",0x00010000,"serenum"
|
|
||||||
;上面这行用于枚举接在串口的即插即用设备,启动时将产生DTR和RTS信号,如果需要枚举,请将上面这行的分号去掉
|
|
||||||
|
|
||||||
[CH341S98.9X.AddReg]
|
|
||||||
HKR, , DevLoader, , *vcomm
|
|
||||||
HKR, , PortDriver, , CH341SER.VXD
|
|
||||||
HKR, , Contention, , *vcd
|
|
||||||
HKR, , ConfigDialog, , serialui.dll
|
|
||||||
HKR, , DCB, 3, 1C,00,00,00, 80,25,00,00, 11,00,00,00, 00,00,0A,00, 0A,00,08,00, 00,11,13,00, 00,00,00,00
|
|
||||||
HKR, , PortSubClass, 1, 01
|
|
||||||
HKR, , EnumPropPages, , "serialui.dll,EnumPropPages"
|
|
||||||
HKR, , Enumerator, , serenum.vxd
|
|
||||||
;上面这行用于枚举接在串口的即插即用设备,启动时将产生DTR和RTS信号,如果需要枚举,请将上面这行的分号去掉
|
|
||||||
|
|
||||||
[CH341SER.AddReg]
|
|
||||||
HKLM, SOFTWARE\WinChipHead\IC\CH341SER, WDM, 0x00010001, 0x00000034
|
|
||||||
HKLM, SOFTWARE\WinChipHead\IC\CH341PORT, DLL, 0x00010001, 0x00000010
|
|
||||||
HKLM, SOFTWARE\WinChipHead\IC\CH341SER, Function, , "USB=>Serial"
|
|
||||||
;HKLM, SYSTEM\CurrentControlSet\Services\CH341SER, UserRemoval, 0x00010001, 0x00000001
|
|
||||||
;上面这行用于在系统托盘中显示“安全删除USB转SERIAL硬件设备”,便于用户手工删除硬件
|
|
||||||
|
|
||||||
[CH341S98.AddReg]
|
|
||||||
HKLM, SOFTWARE\WinChipHead\IC\CH341SER, VXD, 0x00010001, 0x00000023
|
|
||||||
|
|
||||||
[CH341SER_Install.NT.Services]
|
|
||||||
AddService = CH341SER, 2, CH341SER.Service
|
|
||||||
AddService = Serenum, , Serenum_Service_Inst
|
|
||||||
|
|
||||||
[CH341SER_Inst.NTamd64.Services]
|
|
||||||
AddService = CH341SER_A64, 2, CH341SER.ServiceA64
|
|
||||||
AddService = Serenum, , Serenum_Service_Inst
|
|
||||||
|
|
||||||
[CH341SER_Inst.NTia64.Services]
|
|
||||||
AddService = CH341SER_I64, 2, CH341SER.ServiceI64
|
|
||||||
AddService = Serenum, , Serenum_Service_Inst
|
|
||||||
|
|
||||||
[CH341SER.Service]
|
|
||||||
DisplayName = "CH341SER"
|
|
||||||
ServiceType = 1
|
|
||||||
StartType = 3
|
|
||||||
ErrorControl = 1
|
|
||||||
ServiceBinary = %10%\System32\Drivers\CH341SER.SYS
|
|
||||||
|
|
||||||
[CH341SER.ServiceA64]
|
|
||||||
DisplayName = "CH341SER_A64"
|
|
||||||
ServiceType = 1
|
|
||||||
StartType = 3
|
|
||||||
ErrorControl = 1
|
|
||||||
ServiceBinary = %10%\System32\Drivers\CH341S64.SYS
|
|
||||||
|
|
||||||
[CH341SER.ServiceI64]
|
|
||||||
DisplayName = "CH341SER_I64"
|
|
||||||
ServiceType = 1
|
|
||||||
StartType = 3
|
|
||||||
ErrorControl = 1
|
|
||||||
ServiceBinary = %10%\System32\Drivers\CH341I64.SYS
|
|
||||||
|
|
||||||
[Serenum_Service_Inst]
|
|
||||||
DisplayName = "SerEnum"
|
|
||||||
ServiceType = 1
|
|
||||||
StartType = 3
|
|
||||||
ErrorControl = 1
|
|
||||||
ServiceBinary = %12%\serenum.sys
|
|
||||||
LoadOrderGroup = PNP Filter
|
|
||||||
|
|
||||||
[DestinationDirs]
|
|
||||||
DefaultDestDir = 10, System32\Drivers
|
|
||||||
CH341S98.DelFiles.SYS = 11
|
|
||||||
CH341SER.CopyFiles.SYS = 10, System32\Drivers
|
|
||||||
CH341SER.NT.CopyFiles.SYS = 10, System32\Drivers
|
|
||||||
CH341S98.CopyFiles.VXD = 11
|
|
||||||
CH341SER.CopyFiles.DLL = 11
|
|
||||||
CH341SER.NT.CopyFiles.SYSA64 = 10, System32\Drivers
|
|
||||||
;CH341SER.NT.CopyFiles.SYSI64 = 10, System32\Drivers
|
|
||||||
|
|
||||||
[SourceDisksFiles]
|
|
||||||
CH341SER.SYS = 1
|
|
||||||
CH341S98.SYS = 1
|
|
||||||
CH341SER.VXD = 1
|
|
||||||
CH341PT.DLL = 1
|
|
||||||
CH341S64.SYS = 1
|
|
||||||
;CH341I64.SYS = 1
|
|
||||||
|
|
||||||
[SourceDisksNames]
|
|
||||||
1 = %DISK_NAME%, , ,
|
|
||||||
|
|
||||||
[SourceDisksNames.amd64]
|
|
||||||
1 = %DISK_NAME%, , ,
|
|
||||||
|
|
||||||
[SourceDisksNames.ia64]
|
|
||||||
1 = %DISK_NAME%, , ,
|
|
||||||
|
|
||||||
[Strings]
|
|
||||||
WinChipHead = "wch.cn"
|
|
||||||
CH341SER.DeviceDesc = "USB-SERIAL CH341"
|
|
||||||
CH341S98.DeviceDesc = "USB-SERIAL CH341"
|
|
||||||
CH340SER.DeviceDesc = "USB-SERIAL CH340"
|
|
||||||
CH341ASER.DeviceDesc = "USB-SERIAL CH341A"
|
|
||||||
DISK_NAME = "CH341 Serial Installation Disk"
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,88 +0,0 @@
|
|||||||
//Includes
|
|
||||||
#include <ESP8266WiFi.h>
|
|
||||||
#include <ESP8266HTTPClient.h>
|
|
||||||
#include <ArduinoJson.h>
|
|
||||||
|
|
||||||
//USER CONFIGURATION
|
|
||||||
const char* WIFI_SSID = "";
|
|
||||||
const char* WIFI_PASS = "";
|
|
||||||
const char* HW_TOKEN = "";
|
|
||||||
const char* SERVER_ADRESS = "";
|
|
||||||
|
|
||||||
StaticJsonDocument<250> jsonBuffer;
|
|
||||||
String requestJson = "";
|
|
||||||
ADC_MODE(ADC_VCC);
|
|
||||||
|
|
||||||
//Pins
|
|
||||||
#define SENZORPIN 12 //12
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
Serial.begin(9600);
|
|
||||||
WiFi.persistent(false);
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
|
|
||||||
WiFi.begin(WIFI_SSID, WIFI_PASS);
|
|
||||||
checkConnection();
|
|
||||||
Serial.print("TEST");
|
|
||||||
jsonBuffer = {};
|
|
||||||
jsonBuffer["token"] = HW_TOKEN;
|
|
||||||
jsonBuffer["values"]["door"]["value"] = 0;
|
|
||||||
|
|
||||||
int batteryVoltage = (ESP.getVcc() + 600) / 1000;
|
|
||||||
jsonBuffer["values"]["battery"]["value"] = batteryVoltage;
|
|
||||||
|
|
||||||
serializeJson(jsonBuffer, requestJson);
|
|
||||||
sendHttpRequest(requestJson);
|
|
||||||
|
|
||||||
delay(500);
|
|
||||||
ESP.deepSleep(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
}
|
|
||||||
|
|
||||||
void setStaticIp(String ipAddress, String subnet, String gateway){
|
|
||||||
//Set static ip
|
|
||||||
IPAddress staticIpAddress;
|
|
||||||
IPAddress subnetIpAddress;
|
|
||||||
IPAddress gatewayIpAddress;
|
|
||||||
|
|
||||||
if (
|
|
||||||
staticIpAddress.fromString(ipAddress) &&
|
|
||||||
subnetIpAddress.fromString(subnet) &&
|
|
||||||
gatewayIpAddress.fromString(gateway) &&
|
|
||||||
WiFi.localIP() != staticIpAddress
|
|
||||||
) {
|
|
||||||
WiFi.config(staticIpAddress, subnetIpAddress, gatewayIpAddress);
|
|
||||||
Serial.print("STATIC IP address:");
|
|
||||||
Serial.println(WiFi.localIP());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String sendHttpRequest (String requestJson) {
|
|
||||||
HTTPClient http;
|
|
||||||
http.setReuse(true);
|
|
||||||
http.begin(SERVER_ADRESS);
|
|
||||||
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
|
|
||||||
|
|
||||||
int httpCode = http.POST(requestJson);
|
|
||||||
String payload = http.getString(); //Get the response payload
|
|
||||||
http.end();
|
|
||||||
|
|
||||||
if (httpCode == -1) {
|
|
||||||
ESP.restart();
|
|
||||||
}
|
|
||||||
return payload;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool checkConnection() {
|
|
||||||
int count = 0;
|
|
||||||
while ( count < 30 ) {
|
|
||||||
delay(500);
|
|
||||||
if (WiFi.status() == WL_CONNECTED) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 44 KiB |
Binary file not shown.
Before Width: | Height: | Size: 28 KiB |
Binary file not shown.
Before Width: | Height: | Size: 16 KiB |
Binary file not shown.
@ -1,346 +0,0 @@
|
|||||||
#include <ESP8266WiFi.h>
|
|
||||||
#include <WiFiClient.h>
|
|
||||||
#include <ESP8266WebServer.h>
|
|
||||||
#include <EEPROM.h>
|
|
||||||
#include <ESP8266HTTPClient.h>
|
|
||||||
#include <ArduinoJson.h>
|
|
||||||
#include "DHT.h"
|
|
||||||
|
|
||||||
String ssid = "";
|
|
||||||
String pasw = "";
|
|
||||||
String hwId = "";
|
|
||||||
String url = "";
|
|
||||||
|
|
||||||
//Pins
|
|
||||||
#define LIGHTPIN 13
|
|
||||||
#define DHTPIN 4
|
|
||||||
#define DHTTYPE DHT11
|
|
||||||
#define LED_BUILTIN 16
|
|
||||||
|
|
||||||
//Settings
|
|
||||||
bool deepSleepOn = true;
|
|
||||||
long sleepTime = 4; //in minutes
|
|
||||||
bool lightSensor = true;
|
|
||||||
bool humiditySensor = true;
|
|
||||||
bool temperatureSensor = true;
|
|
||||||
|
|
||||||
ESP8266WebServer server(80);
|
|
||||||
DHT dht(DHTPIN, DHTTYPE);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
Serial.begin(9600);
|
|
||||||
Serial.setDebugOutput(true);
|
|
||||||
EEPROM.begin(512);
|
|
||||||
|
|
||||||
Serial.println("");
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
restorSetting();
|
|
||||||
if (!checkConnection()) {
|
|
||||||
settingMode();
|
|
||||||
while (true){
|
|
||||||
Serial.println("CONECTION SETTING LOOP");
|
|
||||||
server.handleClient();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
httpRequest();
|
|
||||||
sleep();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//webpages
|
|
||||||
void handleRoot() {
|
|
||||||
String s = "<!DOCTYPE html><html><head>";
|
|
||||||
s += "<meta name=\"viewport\" content=\"width=device-width,user-scalable=0\">";
|
|
||||||
s += "<title>";
|
|
||||||
s += "Main";
|
|
||||||
s += "</title>";
|
|
||||||
s += "</head>";
|
|
||||||
s += "<body>";
|
|
||||||
s += "<a href=\"/restart\"><p>Restartovat</p><a/>";
|
|
||||||
s += "<a href=\"/setting\"><p>Refrest WIFI Networks</p><a/>";
|
|
||||||
s += "</body>";
|
|
||||||
s += "</html>";
|
|
||||||
server.send(200, "text/html", s);
|
|
||||||
}
|
|
||||||
|
|
||||||
void handleSetting() {
|
|
||||||
String wifiList = "";
|
|
||||||
int n = WiFi.scanNetworks();
|
|
||||||
Serial.println("scan done");
|
|
||||||
if (n == 0) {
|
|
||||||
Serial.println("no networks found");
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < n; ++i) {
|
|
||||||
//Serial.println("SSID: " + WiFi.SSID(i));
|
|
||||||
wifiList = wifiList + String("<option value=\"");
|
|
||||||
wifiList = wifiList + String(WiFi.SSID(i));
|
|
||||||
wifiList = wifiList + String("\">");
|
|
||||||
wifiList = wifiList + String(WiFi.SSID(i) + "(" + WiFi.RSSI() + ")");
|
|
||||||
wifiList = wifiList + String("</option>");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String s = "<!DOCTYPE html><html><head>";
|
|
||||||
s += "<meta name=\"viewport\" content=\"width=device-width,user-scalable=0\">";
|
|
||||||
s += "<title>";
|
|
||||||
s += "Main";
|
|
||||||
s += "</title>";
|
|
||||||
s += "</head>";
|
|
||||||
s += "<body>";
|
|
||||||
s += "<form method=\"get\" action=\"set\">";
|
|
||||||
s += "<br>SSID: <select name=\"ssid\">";
|
|
||||||
s += wifiList;
|
|
||||||
s += "</select>";
|
|
||||||
s += "<br>Password: <input name=\"pasw\" length=64 type=\"password\">";
|
|
||||||
s += "<br>Token: <input name=\"token\" length=64 type=\"text\">";
|
|
||||||
s += "<br>Api Url: <input name=\"url\" length=64 type=\"url\">";
|
|
||||||
s += "<input type=\"submit\">";
|
|
||||||
s += "</form>";
|
|
||||||
s += "</body>";
|
|
||||||
s += "</html>";
|
|
||||||
server.send(200, "text/html", s);
|
|
||||||
}
|
|
||||||
|
|
||||||
//functions
|
|
||||||
bool restorSetting() {
|
|
||||||
Serial.println("Reading EEPROM");
|
|
||||||
ssid = "";
|
|
||||||
pasw = "";
|
|
||||||
hwId = "";
|
|
||||||
url = "";
|
|
||||||
if (EEPROM.read(0) != 0) {
|
|
||||||
Serial.println("Reading EEPROM");
|
|
||||||
for (int i = 0; i < 64; ++i) {
|
|
||||||
ssid += char(EEPROM.read(i));
|
|
||||||
}
|
|
||||||
Serial.println("SSID: " + String(ssid));
|
|
||||||
for (int i = 64; i < 128; ++i) {
|
|
||||||
pasw += char(EEPROM.read(i));
|
|
||||||
}
|
|
||||||
Serial.println("PASS: " + String(pasw));
|
|
||||||
for (int i = 128; i < 192; ++i) {
|
|
||||||
hwId += char(EEPROM.read(i));
|
|
||||||
}
|
|
||||||
Serial.println("TOKEN: " + String(hwId));
|
|
||||||
for (int i = 192; i < 256; ++i) {
|
|
||||||
url += char(EEPROM.read(i));
|
|
||||||
}
|
|
||||||
Serial.println("URL: " + String(url));
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String urlDecode(String input) {
|
|
||||||
String s = input;
|
|
||||||
s.replace("%20", " ");
|
|
||||||
s.replace("+", " ");
|
|
||||||
s.replace("%21", "!");
|
|
||||||
s.replace("%22", "\"");
|
|
||||||
s.replace("%23", "#");
|
|
||||||
s.replace("%24", "$");
|
|
||||||
s.replace("%25", "%");
|
|
||||||
s.replace("%26", "&");
|
|
||||||
s.replace("%27", "\'");
|
|
||||||
s.replace("%28", "(");
|
|
||||||
s.replace("%29", ")");
|
|
||||||
s.replace("%30", "*");
|
|
||||||
s.replace("%31", "+");
|
|
||||||
s.replace("%2C", ",");
|
|
||||||
s.replace("%2E", ".");
|
|
||||||
s.replace("%2F", "/");
|
|
||||||
s.replace("%2C", ",");
|
|
||||||
s.replace("%3A", ":");
|
|
||||||
s.replace("%3A", ";");
|
|
||||||
s.replace("%3C", "<");
|
|
||||||
s.replace("%3D", "=");
|
|
||||||
s.replace("%3E", ">");
|
|
||||||
s.replace("%3F", "?");
|
|
||||||
s.replace("%40", "@");
|
|
||||||
s.replace("%5B", "[");
|
|
||||||
s.replace("%5C", "\\");
|
|
||||||
s.replace("%5D", "]");
|
|
||||||
s.replace("%5E", "^");
|
|
||||||
s.replace("%5F", "-");
|
|
||||||
s.replace("%60", "`");
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool checkConnection() {
|
|
||||||
int count = 0;
|
|
||||||
WiFi.persistent(false);
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
WiFi.forceSleepWake();
|
|
||||||
WiFi.begin(ssid, pasw);
|
|
||||||
Serial.print("Waiting for Wi-Fi connection");
|
|
||||||
while ( count < 30 ) {
|
|
||||||
if (WiFi.status() == WL_CONNECTED) {
|
|
||||||
Serial.println();
|
|
||||||
Serial.println("Connected!");
|
|
||||||
return (true);
|
|
||||||
}
|
|
||||||
delay(500);
|
|
||||||
Serial.print(".");
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
Serial.println("Timed out.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void settingMode(){
|
|
||||||
WiFi.mode(WIFI_AP);
|
|
||||||
WiFi.softAP("NodeMeter");
|
|
||||||
|
|
||||||
IPAddress myIP = WiFi.softAPIP();
|
|
||||||
Serial.print("HotSpt IP:");
|
|
||||||
Serial.println(myIP);
|
|
||||||
|
|
||||||
server.on("/", handleRoot);
|
|
||||||
server.on("/restart", []() {
|
|
||||||
ESP.restart();
|
|
||||||
});
|
|
||||||
server.on("/setting", handleSetting);
|
|
||||||
server.on("/set", []() {
|
|
||||||
for (int i = 0; i < 96; ++i) {
|
|
||||||
EEPROM.write(i, 'e');
|
|
||||||
}
|
|
||||||
EEPROM.commit();
|
|
||||||
ssid = server.arg("ssid");
|
|
||||||
pasw = server.arg("pasw");
|
|
||||||
hwId = server.arg("token");
|
|
||||||
url = server.arg("url");
|
|
||||||
|
|
||||||
for (int i = 0; i < 256; ++i) {
|
|
||||||
EEPROM.write(i, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
Serial.println("Writing EEPROM...");
|
|
||||||
Serial.println("SSID:" + ssid);
|
|
||||||
for (int i = 0; i < ssid.length(); ++i) {
|
|
||||||
EEPROM.write(i,ssid[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
Serial.println("PASW:" + pasw);
|
|
||||||
for (int i = 0; i < pasw.length(); ++i) {
|
|
||||||
EEPROM.write(64 + i, pasw[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
Serial.println("TOKEN:" + hwId);
|
|
||||||
for (int i = 0; i < hwId.length(); ++i) {
|
|
||||||
EEPROM.write(128 + i, hwId[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
Serial.println("URL:" + url);
|
|
||||||
for (int i = 0; i < url.length(); ++i) {
|
|
||||||
EEPROM.write(192 + i, url[i]);
|
|
||||||
}
|
|
||||||
EEPROM.commit();
|
|
||||||
|
|
||||||
Serial.println("Write EEPROM done!");
|
|
||||||
String s = "<h1>Setup complete.</h1><p>device will be connected to \"";
|
|
||||||
s += ssid;
|
|
||||||
s += "\" after the restart.";
|
|
||||||
server.send(200, "text/html", s);
|
|
||||||
ESP.restart();
|
|
||||||
});
|
|
||||||
|
|
||||||
server.begin();
|
|
||||||
Serial.println("HTTP server started");
|
|
||||||
}
|
|
||||||
|
|
||||||
bool httpRequest(){
|
|
||||||
StaticJsonDocument<1024> sendContent;
|
|
||||||
sendContent["token"] = hwId;
|
|
||||||
if (temperatureSensor){
|
|
||||||
sendContent["values"]["temp"]["value"] = String(getTemperature());
|
|
||||||
sendContent["values"]["temp"]["unit"] = "C";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (humiditySensor){
|
|
||||||
sendContent["values"]["humi"]["value"] = String(getHumidity());
|
|
||||||
sendContent["values"]["humi"]["unit"] = "%";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lightSensor){
|
|
||||||
sendContent["values"]["light"]["value"] = String(getLight());
|
|
||||||
sendContent["values"]["light"]["unit"] = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
String requestJson = "";
|
|
||||||
serializeJson(sendContent, requestJson);
|
|
||||||
Serial.println("JSON: " + requestJson);
|
|
||||||
|
|
||||||
HTTPClient http;
|
|
||||||
http.begin(String(url));
|
|
||||||
http.addHeader("Content-Type", "application/json"); //Specify content-type header
|
|
||||||
|
|
||||||
int httpCode = http.POST(requestJson);
|
|
||||||
String payload = http.getString(); //Get the response payload
|
|
||||||
http.end();
|
|
||||||
|
|
||||||
DynamicJsonDocument doc(1024);
|
|
||||||
deserializeJson(doc, payload);
|
|
||||||
|
|
||||||
String hostname = doc["device"]["hostname"];
|
|
||||||
sleepTime = doc["device"]["sleepTime"];
|
|
||||||
WiFi.hostname(hostname);
|
|
||||||
|
|
||||||
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
|
|
||||||
Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload
|
|
||||||
http.end(); //Close connection
|
|
||||||
}
|
|
||||||
|
|
||||||
void sleep(){
|
|
||||||
Serial.println("DISCONECTED FROM WIFI");
|
|
||||||
WiFi.disconnect();
|
|
||||||
|
|
||||||
if (deepSleepOn) {
|
|
||||||
Serial.println("GOING TO SLEEP FOR " + String(sleepTime));
|
|
||||||
ESP.deepSleep((sleepTime * 60) * 1000000, RF_DEFAULT); // 20e6 is 20 microseconds
|
|
||||||
delay(1000);
|
|
||||||
} else {
|
|
||||||
delay(1000);
|
|
||||||
delay(sleepTime);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//ReadTemperatures
|
|
||||||
float getTemperature() {
|
|
||||||
float t = dht.readTemperature();
|
|
||||||
//Serial.print(dht.readTemperature());
|
|
||||||
//Serial.println(t);
|
|
||||||
if (isnan(t)) {
|
|
||||||
Serial.println( "Failed to read temperature from sensor!") ;
|
|
||||||
return 999;
|
|
||||||
}
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
float getHumidity() {
|
|
||||||
float h = dht.readHumidity();
|
|
||||||
//Serial.println(h);
|
|
||||||
if (isnan(h)) {
|
|
||||||
Serial.println("Failed to read humidity from sensor!");
|
|
||||||
return 999;
|
|
||||||
}
|
|
||||||
return h;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int getLight() {
|
|
||||||
int l = analogRead(LIGHTPIN);
|
|
||||||
if (l > 1000) {
|
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
Serial.println("Failed to read light from sensor!");
|
|
||||||
return 999;
|
|
||||||
}
|
|
@ -1,153 +0,0 @@
|
|||||||
//Includes
|
|
||||||
#include <DHT.h>
|
|
||||||
#include <ESP8266WiFi.h>
|
|
||||||
#include <ESP8266HTTPClient.h>
|
|
||||||
#include <ArduinoJson.h>
|
|
||||||
|
|
||||||
//Variables
|
|
||||||
const char* ssid = "Smart-Home";
|
|
||||||
const char* pasw = "S1pjg3684dcCPTUQ";
|
|
||||||
const char* hwId = "45235sadad";
|
|
||||||
const char* url = "http://dev.steelants.cz/vasek/home/api.php";
|
|
||||||
int unsuccessfulRounds = 0;
|
|
||||||
|
|
||||||
//Pins
|
|
||||||
#define pinDHT 4
|
|
||||||
#define LIGHTPIN 13
|
|
||||||
|
|
||||||
//Inicializations
|
|
||||||
DHT DHTs(pinDHT, DHT11);
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
Serial.begin(9600);
|
|
||||||
while (!Serial) continue;
|
|
||||||
delay(10);
|
|
||||||
Serial.println('\n');
|
|
||||||
//Show start up Configuration
|
|
||||||
Serial.println("HW: " + String(hwId));
|
|
||||||
Serial.print("IP address:\t");
|
|
||||||
Serial.println(WiFi.localIP());
|
|
||||||
Serial.print("MAC address:\t");
|
|
||||||
Serial.println(WiFi.macAddress());
|
|
||||||
pinMode(LIGHTPIN, INPUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
//Start Conection to wifi
|
|
||||||
WiFi.begin(ssid, pasw);
|
|
||||||
checkConnection();
|
|
||||||
|
|
||||||
//HTTP CLIENT
|
|
||||||
HTTPClient http;
|
|
||||||
http.begin(url); //Begun HTTP Request
|
|
||||||
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
|
|
||||||
|
|
||||||
DHTs.begin();
|
|
||||||
|
|
||||||
//JsonDocsDefinition
|
|
||||||
StaticJsonDocument<265> doc;
|
|
||||||
doc["token"] = hwId;
|
|
||||||
|
|
||||||
//Read and Handle DHT values
|
|
||||||
float tem = DHTs.readTemperature();
|
|
||||||
float hum = DHTs.readHumidity();
|
|
||||||
Serial.println("TEMP" + String(tem) + ";HUMI" + String(hum));
|
|
||||||
if (isnan(tem) || isnan(hum)) {
|
|
||||||
Serial.println("Unable to read DHT");
|
|
||||||
} else {
|
|
||||||
doc["values"]["temp"]["value"] = tem;
|
|
||||||
doc["values"]["temp"]["unit"] = "C";
|
|
||||||
doc["values"]["humi"]["value"] = hum;
|
|
||||||
doc["values"]["humi"]["unit"] = "%";
|
|
||||||
}
|
|
||||||
|
|
||||||
//Handle Photo Rezistor Values
|
|
||||||
doc["values"]["light"]["value"] = (String)!digitalRead(LIGHTPIN);
|
|
||||||
doc["values"]["light"]["unit"] = "";
|
|
||||||
|
|
||||||
/*More Senzores to come*/
|
|
||||||
String jsonPayload = "";
|
|
||||||
serializeJson(doc, jsonPayload);
|
|
||||||
Serial.print("JSON: ");
|
|
||||||
Serial.println(jsonPayload);
|
|
||||||
|
|
||||||
int httpCode = http.POST(jsonPayload); //Get Http response code
|
|
||||||
String httpPayload = http.getString(); //Get the response payload
|
|
||||||
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
|
|
||||||
Serial.println("HTTP BODY: " + String(httpPayload) + ""); //Print request response payload
|
|
||||||
|
|
||||||
DeserializationError error = deserializeJson(doc, httpPayload); //Get deserialization Error if exists
|
|
||||||
|
|
||||||
//configuration setup
|
|
||||||
int sleepTime = doc["device"]["sleepTime"];
|
|
||||||
String hostName = doc["device"]["hostname"];
|
|
||||||
String ipAddress = doc["device"]["ipAddress"];
|
|
||||||
String gateway = doc["device"]["gateway"];
|
|
||||||
String subnet = doc["device"]["subnet"];
|
|
||||||
String state = doc["state"];
|
|
||||||
|
|
||||||
if (state != "succes") {
|
|
||||||
unsuccessfulRounds++;
|
|
||||||
Serial.println("UNSUCCESSFUL ROUND NUMBER " + (String)unsuccessfulRounds + "FROM 5");
|
|
||||||
} else if (state == "succes") {
|
|
||||||
unsuccessfulRounds = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Set static ip
|
|
||||||
setStaticIp(ipAddress, gateway, subnet);
|
|
||||||
WiFi.hostname(hostName); //Set HostName
|
|
||||||
|
|
||||||
http.end(); //Close connection
|
|
||||||
WiFi.disconnect(); //Disconect from WIFI
|
|
||||||
Serial.println("DISCONECTED FROM WIFI");
|
|
||||||
|
|
||||||
if(unsuccessfulRounds == 5) { //after 5 unsucessful request restart ESP
|
|
||||||
Serial.println("RESTARTING ESP");
|
|
||||||
ESP.restart();
|
|
||||||
}
|
|
||||||
|
|
||||||
sleep(sleepTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
//checking if connection is working
|
|
||||||
bool checkConnection() {
|
|
||||||
int count = 0;
|
|
||||||
Serial.print("Waiting for Wi-Fi connection");
|
|
||||||
while ( count < 30 ) {
|
|
||||||
if (WiFi.status() == WL_CONNECTED) {
|
|
||||||
Serial.println();
|
|
||||||
Serial.println("Connected!");
|
|
||||||
return (true);
|
|
||||||
}
|
|
||||||
delay(500);
|
|
||||||
Serial.print(".");
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
Serial.println("Timed out.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
void setStaticIp(String IpAddress, String subnet, String gateway){
|
|
||||||
//Set static ip
|
|
||||||
IPAddress staticIpAddress;
|
|
||||||
IPAddress subnetIpAddress;
|
|
||||||
IPAddress gatewayIpAddress;
|
|
||||||
|
|
||||||
if (
|
|
||||||
staticIpAddress.fromString(IpAddress) &&
|
|
||||||
subnetIpAddress.fromString(subnet) &&
|
|
||||||
gatewayIpAddress.fromString(gateway) &&
|
|
||||||
WiFi.localIP() != staticIpAddress
|
|
||||||
) {
|
|
||||||
WiFi.config(staticIpAddress, subnetIpAddress, gatewayIpAddress);
|
|
||||||
Serial.print("STATIC IP address:\t");
|
|
||||||
Serial.println(WiFi.localIP());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void sleep(int sleepTime) {
|
|
||||||
if (sleepTime > 0) { //if deep sleepTime > 0 use deep sleep
|
|
||||||
Serial.println("GOING TO SLEEP FOR " + String(sleepTime));
|
|
||||||
ESP.deepSleep((sleepTime * 60) * 1000000, RF_DEFAULT);
|
|
||||||
} else {
|
|
||||||
delay(5000);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,387 +0,0 @@
|
|||||||
//Includes
|
|
||||||
#include <DHT.h>
|
|
||||||
#include <ESP8266WiFi.h>
|
|
||||||
#include <ESP8266WebServer.h>
|
|
||||||
#include <WiFiClientSecure.h>
|
|
||||||
#include <ESP8266HTTPClient.h>
|
|
||||||
#define ARDUINOJSON_DECODE_UNICODE 1
|
|
||||||
#include <ArduinoJson.h>
|
|
||||||
#include <EEPROM.h>
|
|
||||||
#include "ESP8266httpUpdate.h"
|
|
||||||
|
|
||||||
//Variables
|
|
||||||
const char* ssidServer = "";
|
|
||||||
const char* paswServer = "";
|
|
||||||
String ssid = "";
|
|
||||||
String pasw = "";
|
|
||||||
String apiToken = "";
|
|
||||||
const int httpsPort = 443;
|
|
||||||
const char* host = "http://dev.steelants.cz";
|
|
||||||
const char* url = "/vasek/home/api.php";
|
|
||||||
|
|
||||||
const char* fingerprint = "";
|
|
||||||
const char* host2 = "dev.steelants.cz";
|
|
||||||
const char* url2 = "/vasek/home/update.php";
|
|
||||||
|
|
||||||
String content;
|
|
||||||
String Logs;
|
|
||||||
bool conf = false;
|
|
||||||
bool buttonActive = false;
|
|
||||||
int state = 0;
|
|
||||||
String requestJson = "";
|
|
||||||
int unsuccessfulRounds = 0; //Unsucesful atmpt counter
|
|
||||||
|
|
||||||
ESP8266WebServer server(80);
|
|
||||||
StaticJsonDocument<265> jsonContent;
|
|
||||||
DeserializationError error;
|
|
||||||
|
|
||||||
//Pins
|
|
||||||
#define DHTPIN 2
|
|
||||||
//#define LIGHTPIN 13
|
|
||||||
|
|
||||||
//Inicializations
|
|
||||||
DHT DHTs(DHTPIN, DHT11);
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
Serial.begin(9600);
|
|
||||||
EEPROM.begin(100);
|
|
||||||
while (!Serial) continue;
|
|
||||||
delay(10);
|
|
||||||
//read saved data
|
|
||||||
ssid = ReadEeprom(1, 33);
|
|
||||||
pasw = ReadEeprom(33, 65);
|
|
||||||
apiToken = ReadEeprom(65, 97);
|
|
||||||
#if defined(LIGHTPIN)
|
|
||||||
//set pins
|
|
||||||
pinMode(LIGHTPIN, INPUT);
|
|
||||||
#endif
|
|
||||||
//wifi
|
|
||||||
if (ssid != "") {
|
|
||||||
WiFi.disconnect();
|
|
||||||
WiFi.softAPdisconnect(true);
|
|
||||||
WiFi.persistent(false);
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
WiFi.begin(ssid, pasw);
|
|
||||||
conf = wifiVerify(20);
|
|
||||||
if (conf) {
|
|
||||||
configTime(3 * 3600, 0, "pool.ntp.org");
|
|
||||||
WiFiClientSecure client;
|
|
||||||
Serial.print("connecting to ");
|
|
||||||
Serial.println(host2);
|
|
||||||
client.setInsecure();
|
|
||||||
if (!client.connect(host2, httpsPort)) {
|
|
||||||
addLog("connection failed");
|
|
||||||
Serial.println("connection failed");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (client.verify(fingerprint, host2)) {
|
|
||||||
Serial.println("certificate matches");
|
|
||||||
} else {
|
|
||||||
addLog("certificate doesn't match");
|
|
||||||
Serial.println("certificate doesn't match");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Serial.print("Starting OTA from: ");
|
|
||||||
Serial.println(url2
|
|
||||||
|
|
||||||
);
|
|
||||||
|
|
||||||
auto ret = ESPhttpUpdate.update(client, host2, 80, url2);
|
|
||||||
delay(500);
|
|
||||||
switch(ret) {
|
|
||||||
case HTTP_UPDATE_FAILED:
|
|
||||||
addLog("HTTP_UPDATE_FAILD Error (" + (String)ESPhttpUpdate.getLastError() + ") : " + (String)ESPhttpUpdate.getLastErrorString().c_str());
|
|
||||||
Serial.printf("HTTP_UPDATE_FAILD Error (%d): %s", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str());
|
|
||||||
Serial.println();
|
|
||||||
Serial.println();
|
|
||||||
Serial.println();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HTTP_UPDATE_NO_UPDATES:
|
|
||||||
Serial.println("HTTP_UPDATE_NO_UPDATES");
|
|
||||||
Serial.println();
|
|
||||||
Serial.println();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HTTP_UPDATE_OK:
|
|
||||||
Serial.println("HTTP_UPDATE_OK");
|
|
||||||
Serial.println();
|
|
||||||
Serial.println();
|
|
||||||
Serial.println();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
delay(500);
|
|
||||||
jsonContent = {};
|
|
||||||
jsonContent["token"] = apiToken;
|
|
||||||
jsonContent["settings"]["network"]["ip"] = WiFi.localIP().toString();
|
|
||||||
jsonContent["settings"]["network"]["mac"] = WiFi.macAddress();
|
|
||||||
jsonContent["settings"]["firmware_hash"] = ESP.getSketchMD5();
|
|
||||||
sendDataToWeb();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
setupAP();
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
if (conf) {
|
|
||||||
LogErrors();
|
|
||||||
if (unsuccessfulRounds >= 5) {
|
|
||||||
Serial.println("RESTARTING ESP");
|
|
||||||
ESP.restart();
|
|
||||||
}
|
|
||||||
DHTs.begin();
|
|
||||||
jsonContent = {};
|
|
||||||
jsonContent["token"] = apiToken;
|
|
||||||
requestJson = "";
|
|
||||||
|
|
||||||
//Read and Handle DHT values
|
|
||||||
float tem = DHTs.readTemperature();
|
|
||||||
float hum = DHTs.readHumidity();
|
|
||||||
Serial.println("TEMP" + String(tem) + ";HUMI" + String(hum));
|
|
||||||
if (isnan(tem) || isnan(hum)) {
|
|
||||||
Serial.println("Unable to read DHT");
|
|
||||||
} else {
|
|
||||||
jsonContent["values"]["temp"]["value"] = (String)tem;
|
|
||||||
jsonContent["values"]["temp"]["unit"] = "C";
|
|
||||||
jsonContent["values"]["humi"]["value"] = (String)hum;
|
|
||||||
jsonContent["values"]["humi"]["unit"] = "%";
|
|
||||||
}
|
|
||||||
#if defined(LIGHTPIN)
|
|
||||||
//Handle Photo Rezistor Values
|
|
||||||
jsonContent["values"]["light"]["value"] = (String)!digitalRead(LIGHTPIN);
|
|
||||||
jsonContent["values"]["light"]["unit"] = "";
|
|
||||||
#endif
|
|
||||||
sendDataToWeb();
|
|
||||||
loadDataFromWeb();
|
|
||||||
} else {
|
|
||||||
server.handleClient();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool wifiVerify(int t) {
|
|
||||||
int c = 0;
|
|
||||||
Serial.println("Waiting for Wifi");
|
|
||||||
while (c < t) {
|
|
||||||
if (WiFi.status() == WL_CONNECTED) {
|
|
||||||
c = t;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
delay(500);
|
|
||||||
Serial.print(WiFi.status());
|
|
||||||
c++;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void loadDataFromWeb() {
|
|
||||||
if (error.code() != DeserializationError::Ok) {
|
|
||||||
addLog(error.c_str());
|
|
||||||
Serial.println(error.c_str());
|
|
||||||
unsuccessfulRounds++;
|
|
||||||
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
|
|
||||||
error = DeserializationError::Ok;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//configuration setup
|
|
||||||
int sleepTime = jsonContent["device"]["sleepTime"];
|
|
||||||
String hostName = jsonContent["device"]["hostname"];
|
|
||||||
String requestState = jsonContent["state"];
|
|
||||||
String command = jsonContent["command"];
|
|
||||||
|
|
||||||
if (command == "reset"){
|
|
||||||
command = "";
|
|
||||||
ESP.reset();
|
|
||||||
} else if (command == "config") {
|
|
||||||
command = "";
|
|
||||||
CleanEeprom();
|
|
||||||
EEPROM.commit();
|
|
||||||
ESP.restart();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (requestState != "succes") {
|
|
||||||
unsuccessfulRounds++;
|
|
||||||
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
|
|
||||||
} else if (requestState == "succes") {
|
|
||||||
unsuccessfulRounds = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
WiFi.hostname(hostName);
|
|
||||||
sleep(sleepTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
void sendDataToWeb() {
|
|
||||||
serializeJson(jsonContent, requestJson);
|
|
||||||
Serial.println("JSON: " + requestJson);
|
|
||||||
error = deserializeJson(jsonContent, sendHttpRequest());
|
|
||||||
}
|
|
||||||
|
|
||||||
void sleep(int sleepTime) {
|
|
||||||
if (sleepTime > 0) { //if deep sleepTime > 0 use deep sleep
|
|
||||||
Serial.println("GOING TO SLEEP FOR " + String(sleepTime));
|
|
||||||
ESP.deepSleep((sleepTime * 60) * 1000000, RF_DEFAULT);
|
|
||||||
} else {
|
|
||||||
delay(5000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String sendHttpRequest () {
|
|
||||||
HTTPClient http;
|
|
||||||
http.setReuse(true);
|
|
||||||
Serial.println("HTTP url: " + String(host) + String(url) + ""); //Print HTTP return code
|
|
||||||
http.begin(String(host) + String(url));
|
|
||||||
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
|
|
||||||
Serial.println("HTTP request: " + String(requestJson) + ""); //Print HTTP return code
|
|
||||||
int httpCode = http.POST(requestJson);
|
|
||||||
String payload = http.getString(); //Get the response payload
|
|
||||||
http.end();
|
|
||||||
|
|
||||||
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
|
|
||||||
Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload
|
|
||||||
|
|
||||||
if (httpCode == -1) {
|
|
||||||
unsuccessfulRounds++;
|
|
||||||
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return payload;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LogErrors() {
|
|
||||||
jsonContent = {};
|
|
||||||
error = deserializeJson(jsonContent, "{\"logs\":[" + Logs + "]}");
|
|
||||||
jsonContent["token"] = apiToken;
|
|
||||||
requestJson = "";
|
|
||||||
Logs = "";
|
|
||||||
sendDataToWeb();
|
|
||||||
}
|
|
||||||
|
|
||||||
void addLog(String logText) {
|
|
||||||
if (Logs == "") {
|
|
||||||
Logs = "\"" + logText + "\"";
|
|
||||||
} else {
|
|
||||||
Logs += ",\"" + logText + "\"";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CleanEeprom() {
|
|
||||||
for (int i = 1; i < 100; ++i) {
|
|
||||||
EEPROM.write(i, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void WriteEeprom (String data, int start = 1) {
|
|
||||||
for (int i = 0; i < data.length(); ++i)
|
|
||||||
{
|
|
||||||
EEPROM.write(start + i, data[i]);
|
|
||||||
}
|
|
||||||
EEPROM.commit();
|
|
||||||
}
|
|
||||||
|
|
||||||
String ReadEeprom(int min, int max) {
|
|
||||||
String localString;
|
|
||||||
for (int i = min; i < max; ++i) {
|
|
||||||
localString += char(EEPROM.read(i));
|
|
||||||
}
|
|
||||||
return localString;
|
|
||||||
}
|
|
||||||
|
|
||||||
void createWeb()
|
|
||||||
{
|
|
||||||
server.on("/", []() {
|
|
||||||
if (server.args() == 3) {
|
|
||||||
ssid = server.arg("wifi-ssid");
|
|
||||||
pasw = server.arg("wifi-pasw");
|
|
||||||
apiToken = server.arg("apiToken");
|
|
||||||
if (ssid != "" && pasw != "" && apiToken != "") {
|
|
||||||
CleanEeprom();
|
|
||||||
WriteEeprom(ssid);
|
|
||||||
WriteEeprom(pasw, 33);
|
|
||||||
WriteEeprom(apiToken, 65);
|
|
||||||
server.send(200, "application/json", "Restarting esp");
|
|
||||||
delay(500);
|
|
||||||
ESP.restart();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
content = "<!DOCTYPE HTML><body>";
|
|
||||||
content += "<head><style>";
|
|
||||||
content += "html,body {height: 100%;}";
|
|
||||||
content += "html {display: table;margin: auto;}";
|
|
||||||
content += "body {display: table-cell;vertical-align: middle;}";
|
|
||||||
content += "input {width: 100%;box-sizing: border-box}";
|
|
||||||
content += "</style></head>";
|
|
||||||
content += "<h2>WIFI Configuration</h2>";
|
|
||||||
content += "<h4><b>" + (String)ssidServer + "</b></h4>";
|
|
||||||
content += "<a href='#'>Refresh</a>";
|
|
||||||
content += "<div class=\"wifi-list\">";
|
|
||||||
int n = WiFi.scanNetworks();
|
|
||||||
if (n == 0)
|
|
||||||
content += "<label>No networks found...</label>";
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (int i = 0; i < n; ++i)
|
|
||||||
{
|
|
||||||
content += "<a href=\"#\" onclick=\"fillSSID(this.innerHTML)\">" + WiFi.SSID(i) + "</a><br>";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
content += "</div>";
|
|
||||||
content += "<form method='get' action=''><div class='wifi-form'>";
|
|
||||||
content += "<label>SSID: </label><input name='wifi-ssid' id='wifi-ssid' length=32 type='text'><br>";
|
|
||||||
content += "<label>Heslo: </label><input name='wifi-pasw' length=32 type='password'><br>";
|
|
||||||
content += "<label>Api token: </label><input name='apiToken' length=32 type='password'><br>";
|
|
||||||
content += "<input type='submit' value='Connect'>";
|
|
||||||
content += "</div></form>";
|
|
||||||
content += "<script>";
|
|
||||||
content += "function fillSSID(value) {\r\n";
|
|
||||||
content += "document.getElementById(\"wifi-ssid\").value = value;\r\n";
|
|
||||||
content += "}";
|
|
||||||
content += "</script>";
|
|
||||||
content += "</body>";
|
|
||||||
server.send(200, "text/html", content);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupAP(void) {
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
WiFi.disconnect();
|
|
||||||
WiFi.softAPdisconnect(true);
|
|
||||||
delay(100);
|
|
||||||
int n = WiFi.scanNetworks();
|
|
||||||
Serial.println("scan done");
|
|
||||||
if (n == 0)
|
|
||||||
Serial.println("no networks found");
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Serial.print(n);
|
|
||||||
Serial.println(" networks found");
|
|
||||||
for (int i = 0; i < n; ++i)
|
|
||||||
{
|
|
||||||
// Print SSID and RSSI for each network found
|
|
||||||
Serial.print(i + 1);
|
|
||||||
Serial.print(": ");
|
|
||||||
Serial.print(WiFi.SSID(i));
|
|
||||||
Serial.print(" (");
|
|
||||||
Serial.print(WiFi.RSSI(i));
|
|
||||||
Serial.print(")");
|
|
||||||
Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*");
|
|
||||||
delay(10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
delay(100);
|
|
||||||
WiFi.softAP(ssidServer, paswServer);
|
|
||||||
Serial.println("softap");
|
|
||||||
Serial.println("");
|
|
||||||
Serial.println("WiFi connected");
|
|
||||||
Serial.print("Local IP: ");
|
|
||||||
Serial.println(WiFi.localIP());
|
|
||||||
Serial.print("SoftAP IP: ");
|
|
||||||
Serial.println(WiFi.softAPIP());
|
|
||||||
createWeb();
|
|
||||||
// Start the server
|
|
||||||
server.begin();
|
|
||||||
Serial.println("Server started");
|
|
||||||
Serial.println("over");
|
|
||||||
}
|
|
Binary file not shown.
Before Width: | Height: | Size: 21 KiB |
@ -1,206 +0,0 @@
|
|||||||
//Includes
|
|
||||||
#include <ESP8266WiFi.h>
|
|
||||||
#include <ESP8266HTTPClient.h>
|
|
||||||
#include <ArduinoJson.h>
|
|
||||||
#include <EEPROM.h>
|
|
||||||
|
|
||||||
//Variables
|
|
||||||
const char* ssid = "ssid";
|
|
||||||
const char* pasw = "pasw";
|
|
||||||
const char* hwId = "hwId";
|
|
||||||
const char* server = "http://dev.steelants.cz/vasek/home/api.php";
|
|
||||||
int unsuccessfulRounds = 0; //Unsucesful atmpt counter
|
|
||||||
StaticJsonDocument<250> jsonContent;
|
|
||||||
bool buttonActive = false;
|
|
||||||
int interuptCount = 0;
|
|
||||||
int realState = 0;
|
|
||||||
int state = 0;
|
|
||||||
String requestJson = "";
|
|
||||||
|
|
||||||
//Pins
|
|
||||||
#define RELAY 4 //12
|
|
||||||
#define SWITCH 5 //0
|
|
||||||
|
|
||||||
void ICACHE_RAM_ATTR handleInterrupt ();
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
Serial.begin(9600);
|
|
||||||
EEPROM.begin(1);
|
|
||||||
while (!Serial) continue;
|
|
||||||
delay(10);
|
|
||||||
Serial.println('\n');
|
|
||||||
Serial.println("HW: " + String(hwId));
|
|
||||||
|
|
||||||
pinMode(SWITCH, INPUT);
|
|
||||||
pinMode(RELAY, OUTPUT);
|
|
||||||
state = EEPROM.read(0);
|
|
||||||
digitalWrite(RELAY, state);
|
|
||||||
realState = state;
|
|
||||||
|
|
||||||
attachInterrupt(digitalPinToInterrupt(SWITCH), handleInterrupt, CHANGE);
|
|
||||||
|
|
||||||
|
|
||||||
WiFi.persistent(false);
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
|
|
||||||
WiFi.begin(ssid, pasw);
|
|
||||||
checkConnection();
|
|
||||||
|
|
||||||
Serial.println('\n');
|
|
||||||
Serial.println("Connection established!");
|
|
||||||
Serial.print("IP address:");
|
|
||||||
Serial.println(WiFi.localIP());
|
|
||||||
Serial.print("MAC address:");
|
|
||||||
Serial.println(WiFi.macAddress());
|
|
||||||
|
|
||||||
jsonContent = {};
|
|
||||||
jsonContent["token"] = hwId;
|
|
||||||
jsonContent["values"]["on/off"]["value"] = (String)realState;
|
|
||||||
|
|
||||||
serializeJson(jsonContent, requestJson);
|
|
||||||
Serial.println("JSON: " + requestJson);
|
|
||||||
DeserializationError error = deserializeJson(jsonContent, sendHttpRequest(requestJson));
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
if(unsuccessfulRounds >= 5) {
|
|
||||||
Serial.println("RESTARTING ESP");
|
|
||||||
ESP.restart();
|
|
||||||
}
|
|
||||||
jsonContent = {};
|
|
||||||
jsonContent["token"] = hwId;
|
|
||||||
requestJson = "";
|
|
||||||
if (buttonActive){
|
|
||||||
int realStateLocal = digitalRead(SWITCH);
|
|
||||||
jsonContent["values"]["on/off"]["value"] = (String)realStateLocal;
|
|
||||||
digitalWrite(RELAY, realStateLocal);
|
|
||||||
realState = realStateLocal;
|
|
||||||
EEPROM.write(0, realState);
|
|
||||||
EEPROM.commit();
|
|
||||||
serializeJson(jsonContent, requestJson);
|
|
||||||
Serial.println("JSON: " + requestJson);
|
|
||||||
|
|
||||||
//HTTP CLIENT
|
|
||||||
DeserializationError error = deserializeJson(jsonContent, sendHttpRequest(requestJson));
|
|
||||||
buttonActive = false;
|
|
||||||
}
|
|
||||||
jsonContent = {};
|
|
||||||
jsonContent["token"] = hwId;
|
|
||||||
requestJson = "";
|
|
||||||
serializeJson(jsonContent, requestJson);
|
|
||||||
Serial.println("JSON: " + requestJson);
|
|
||||||
|
|
||||||
//HTTP CLIENT
|
|
||||||
DeserializationError error = deserializeJson(jsonContent, sendHttpRequest(requestJson));
|
|
||||||
|
|
||||||
if (error) {
|
|
||||||
Serial.println(error.c_str());
|
|
||||||
unsuccessfulRounds++;
|
|
||||||
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//configuration setup
|
|
||||||
String hostName = jsonContent["device"]["hostname"];
|
|
||||||
String ipAddress = jsonContent["device"]["ipAddress"];
|
|
||||||
String gateway = jsonContent["device"]["gateway"];
|
|
||||||
String subnet = jsonContent["device"]["subnet"];
|
|
||||||
String requestState = jsonContent["state"];
|
|
||||||
JsonObject object = jsonContent.as<JsonObject>();
|
|
||||||
if (!object["value"].isNull()) {
|
|
||||||
state = (int)jsonContent["value"];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (requestState != "succes") {
|
|
||||||
unsuccessfulRounds++;
|
|
||||||
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
|
|
||||||
} else if (requestState == "succes") {
|
|
||||||
unsuccessfulRounds = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Set static ip
|
|
||||||
setStaticIp(ipAddress, gateway, subnet);
|
|
||||||
WiFi.hostname(hostName);
|
|
||||||
Serial.println("state: " + (String)state + ", realState: " + (String)realState);
|
|
||||||
if (state != realState){
|
|
||||||
if (state == 1 && realState == 0) {
|
|
||||||
Serial.println("ON state: " + (String)state + ", realState: " + (String)realState);
|
|
||||||
digitalWrite(RELAY, HIGH); // Turn the LED on by making the voltage LOW
|
|
||||||
realState = 1;
|
|
||||||
} else {
|
|
||||||
Serial.println("OFF");
|
|
||||||
digitalWrite(RELAY, LOW); // Turn the LED on by making the voltage LOW
|
|
||||||
realState = 0;
|
|
||||||
}
|
|
||||||
EEPROM.write(0, realState);
|
|
||||||
EEPROM.commit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void handleInterrupt() {
|
|
||||||
interuptCount++;
|
|
||||||
buttonActive = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
String sendHttpRequest (String requestJson) {
|
|
||||||
HTTPClient http;
|
|
||||||
http.setReuse(true);
|
|
||||||
http.begin(server);
|
|
||||||
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
|
|
||||||
|
|
||||||
int httpCode = http.POST(requestJson);
|
|
||||||
String payload = http.getString(); //Get the response payload
|
|
||||||
http.end();
|
|
||||||
|
|
||||||
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
|
|
||||||
Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload
|
|
||||||
|
|
||||||
if (httpCode == -1) {
|
|
||||||
unsuccessfulRounds++;
|
|
||||||
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return payload;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool checkConnection() {
|
|
||||||
int count = 0;
|
|
||||||
Serial.print("Waiting for Wi-Fi connection");
|
|
||||||
while ( count < 30 ) {
|
|
||||||
if (buttonActive){
|
|
||||||
int realStateLocal = digitalRead(SWITCH);
|
|
||||||
digitalWrite(RELAY, realStateLocal);
|
|
||||||
realState = realStateLocal;
|
|
||||||
EEPROM.write(0, realState);
|
|
||||||
EEPROM.commit();
|
|
||||||
buttonActive = false;
|
|
||||||
}
|
|
||||||
delay(250);
|
|
||||||
if (WiFi.status() == WL_CONNECTED) {
|
|
||||||
Serial.println();
|
|
||||||
Serial.println("Connected!");
|
|
||||||
return (true);
|
|
||||||
}
|
|
||||||
Serial.print(".");
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
Serial.println("Timed out.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setStaticIp(String ipAddress, String subnet, String gateway){
|
|
||||||
//Set static ip
|
|
||||||
IPAddress staticIpAddress;
|
|
||||||
IPAddress subnetIpAddress;
|
|
||||||
IPAddress gatewayIpAddress;
|
|
||||||
|
|
||||||
if (
|
|
||||||
staticIpAddress.fromString(ipAddress) &&
|
|
||||||
subnetIpAddress.fromString(subnet) &&
|
|
||||||
gatewayIpAddress.fromString(gateway) &&
|
|
||||||
WiFi.localIP() != staticIpAddress
|
|
||||||
) {
|
|
||||||
WiFi.config(staticIpAddress, subnetIpAddress, gatewayIpAddress);
|
|
||||||
Serial.print("STATIC IP address:");
|
|
||||||
Serial.println(WiFi.localIP());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,360 +0,0 @@
|
|||||||
//Includes
|
|
||||||
#include <ESP8266WiFi.h>
|
|
||||||
#include <ESP8266WebServer.h>
|
|
||||||
#include <WiFiClientSecure.h>
|
|
||||||
#include <ESP8266HTTPClient.h>
|
|
||||||
#define ARDUINOJSON_DECODE_UNICODE 1
|
|
||||||
#include <ArduinoJson.h>
|
|
||||||
#include <EEPROM.h>
|
|
||||||
#include "ESP8266httpUpdate.h"
|
|
||||||
|
|
||||||
//Variables
|
|
||||||
const char* ssidServer = "";
|
|
||||||
const char* paswServer = "";
|
|
||||||
String ssid = "";
|
|
||||||
String pasw = "";
|
|
||||||
String apiToken = "";
|
|
||||||
const int httpsPort = 443;
|
|
||||||
const char* host = "http://dev.steelants.cz";
|
|
||||||
const char* url = "/vasek/home/api.php";
|
|
||||||
|
|
||||||
const char* fingerprint = "";
|
|
||||||
const char* host2 = "dev.steelants.cz";
|
|
||||||
const char* url2 = "/vasek/home/update.php";
|
|
||||||
|
|
||||||
String content;
|
|
||||||
bool conf = false;
|
|
||||||
bool buttonActive = false;
|
|
||||||
int state = 0;
|
|
||||||
String requestJson = "";
|
|
||||||
int unsuccessfulRounds = 0; //Unsucesful atmpt counter
|
|
||||||
|
|
||||||
ESP8266WebServer server(80);
|
|
||||||
StaticJsonDocument<250> jsonContent;
|
|
||||||
DeserializationError error;
|
|
||||||
|
|
||||||
//Pins
|
|
||||||
#define RELAY 4 //12
|
|
||||||
#define SWITCH 5 //0
|
|
||||||
|
|
||||||
void ICACHE_RAM_ATTR handleInterrupt ();
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
Serial.begin(115200);
|
|
||||||
EEPROM.begin(100);
|
|
||||||
while (!Serial) continue;
|
|
||||||
delay(10);
|
|
||||||
//read saved data
|
|
||||||
ssid = ReadEeprom(1, 33);
|
|
||||||
pasw = ReadEeprom(33, 65);
|
|
||||||
apiToken = ReadEeprom(65, 97);
|
|
||||||
//set pins
|
|
||||||
pinMode(SWITCH, INPUT);
|
|
||||||
pinMode(RELAY, OUTPUT);
|
|
||||||
state = EEPROM.read(0);
|
|
||||||
digitalWrite(RELAY, state);
|
|
||||||
attachInterrupt(digitalPinToInterrupt(SWITCH), handleInterrupt, CHANGE);
|
|
||||||
//wifi
|
|
||||||
if (ssid != "") {
|
|
||||||
WiFi.disconnect();
|
|
||||||
WiFi.softAPdisconnect(true);
|
|
||||||
WiFi.persistent(false);
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
WiFi.begin(ssid, pasw);
|
|
||||||
conf = wifiVerify(20);
|
|
||||||
if (conf) {
|
|
||||||
configTime(3 * 3600, 0, "pool.ntp.org");
|
|
||||||
WiFiClientSecure client;
|
|
||||||
Serial.print("connecting to ");
|
|
||||||
Serial.println(host2);
|
|
||||||
client.setInsecure();
|
|
||||||
if (!client.connect(host2, httpsPort)) {
|
|
||||||
Serial.println("connection failed");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (client.verify(fingerprint, host2)) {
|
|
||||||
Serial.println("certificate matches");
|
|
||||||
} else {
|
|
||||||
Serial.println("certificate doesn't match");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Serial.print("Starting OTA from: ");
|
|
||||||
Serial.println(url2
|
|
||||||
|
|
||||||
);
|
|
||||||
|
|
||||||
auto ret = ESPhttpUpdate.update(client, host2, 80, url2);
|
|
||||||
delay(500);
|
|
||||||
switch(ret) {
|
|
||||||
case HTTP_UPDATE_FAILED:
|
|
||||||
Serial.printf("HTTP_UPDATE_FAILD Error (%d): %s", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str());
|
|
||||||
Serial.println();
|
|
||||||
Serial.println();
|
|
||||||
Serial.println();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HTTP_UPDATE_NO_UPDATES:
|
|
||||||
Serial.println("HTTP_UPDATE_NO_UPDATES");
|
|
||||||
Serial.println();
|
|
||||||
Serial.println();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HTTP_UPDATE_OK:
|
|
||||||
Serial.println("HTTP_UPDATE_OK");
|
|
||||||
Serial.println();
|
|
||||||
Serial.println();
|
|
||||||
Serial.println();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
delay(500);
|
|
||||||
jsonContent = {};
|
|
||||||
jsonContent["token"] = apiToken;
|
|
||||||
jsonContent["values"]["on/off"]["value"] = (String)state;
|
|
||||||
jsonContent["settings"]["network"]["ip"] = WiFi.localIP().toString();
|
|
||||||
jsonContent["settings"]["network"]["mac"] = WiFi.macAddress();
|
|
||||||
jsonContent["settings"]["firmware_hash"] = ESP.getSketchMD5();
|
|
||||||
sendDataToWeb();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
setupAP();
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
if (conf) {
|
|
||||||
if (unsuccessfulRounds >= 5) {
|
|
||||||
Serial.println("RESTARTING ESP");
|
|
||||||
ESP.restart();
|
|
||||||
}
|
|
||||||
if (buttonActive) {
|
|
||||||
jsonContent = {};
|
|
||||||
jsonContent["token"] = apiToken;
|
|
||||||
requestJson = "";
|
|
||||||
jsonContent["values"]["on/off"]["value"] = (String)state;
|
|
||||||
digitalWrite(RELAY, state);
|
|
||||||
EEPROM.write(0, state);
|
|
||||||
EEPROM.commit();
|
|
||||||
sendDataToWeb();
|
|
||||||
buttonActive = false;
|
|
||||||
delay(500);
|
|
||||||
} else {
|
|
||||||
loadDataFromWeb();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
server.handleClient();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void handleInterrupt() {
|
|
||||||
buttonActive = true;
|
|
||||||
state = !state;
|
|
||||||
digitalWrite(RELAY, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool wifiVerify(int t) {
|
|
||||||
int c = 0;
|
|
||||||
Serial.println("Waiting for Wifi to connect to Shelly1");
|
|
||||||
while (c < t) {
|
|
||||||
if (WiFi.status() == WL_CONNECTED) {
|
|
||||||
c = t;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
delay(500);
|
|
||||||
Serial.print(WiFi.status());
|
|
||||||
c++;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void loadDataFromWeb() {
|
|
||||||
jsonContent = {};
|
|
||||||
jsonContent["token"] = apiToken;
|
|
||||||
requestJson = "";
|
|
||||||
sendDataToWeb();
|
|
||||||
|
|
||||||
if (error.code() != DeserializationError::Ok) {
|
|
||||||
Serial.println(error.c_str());
|
|
||||||
unsuccessfulRounds++;
|
|
||||||
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
|
|
||||||
error = DeserializationError::Ok;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//configuration setup
|
|
||||||
String hostName = jsonContent["device"]["hostname"];
|
|
||||||
String requestState = jsonContent["state"];
|
|
||||||
String command = jsonContent["command"];
|
|
||||||
if (!buttonActive) {
|
|
||||||
state = (int)jsonContent["value"];
|
|
||||||
Serial.println("state: " + (String)state);
|
|
||||||
digitalWrite(RELAY, state);
|
|
||||||
EEPROM.write(0, state);
|
|
||||||
EEPROM.commit();
|
|
||||||
delay(500);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (command == "reset"){
|
|
||||||
ESP.reset();
|
|
||||||
} else if (command == "config") {
|
|
||||||
CleanEeprom();
|
|
||||||
EEPROM.commit();
|
|
||||||
ESP.restart();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (requestState != "succes") {
|
|
||||||
unsuccessfulRounds++;
|
|
||||||
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
|
|
||||||
} else if (requestState == "succes") {
|
|
||||||
unsuccessfulRounds = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
WiFi.hostname(hostName);
|
|
||||||
}
|
|
||||||
|
|
||||||
void sendDataToWeb() {
|
|
||||||
serializeJson(jsonContent, requestJson);
|
|
||||||
Serial.println("JSON: " + requestJson);
|
|
||||||
error = deserializeJson(jsonContent, sendHttpRequest());
|
|
||||||
}
|
|
||||||
|
|
||||||
String sendHttpRequest () {
|
|
||||||
HTTPClient http;
|
|
||||||
http.setReuse(true);
|
|
||||||
Serial.println("HTTP url: " + String(host) + String(url) + ""); //Print HTTP return code
|
|
||||||
http.begin(String(host) + String(url));
|
|
||||||
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
|
|
||||||
Serial.println("HTTP request: " + String(requestJson) + ""); //Print HTTP return code
|
|
||||||
int httpCode = http.POST(requestJson);
|
|
||||||
String payload = http.getString(); //Get the response payload
|
|
||||||
http.end();
|
|
||||||
|
|
||||||
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
|
|
||||||
Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload
|
|
||||||
|
|
||||||
if (httpCode == -1) {
|
|
||||||
unsuccessfulRounds++;
|
|
||||||
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return payload;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CleanEeprom() {
|
|
||||||
for (int i = 1; i < 100; ++i) {
|
|
||||||
EEPROM.write(i, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void WriteEeprom (String data, int start = 1) {
|
|
||||||
for (int i = 0; i < data.length(); ++i)
|
|
||||||
{
|
|
||||||
EEPROM.write(start + i, data[i]);
|
|
||||||
}
|
|
||||||
EEPROM.commit();
|
|
||||||
}
|
|
||||||
|
|
||||||
String ReadEeprom(int min, int max) {
|
|
||||||
String localString;
|
|
||||||
for (int i = min; i < max; ++i) {
|
|
||||||
localString += char(EEPROM.read(i));
|
|
||||||
}
|
|
||||||
return localString;
|
|
||||||
}
|
|
||||||
|
|
||||||
void createWeb()
|
|
||||||
{
|
|
||||||
server.on("/", []() {
|
|
||||||
if (server.args() == 3) {
|
|
||||||
ssid = server.arg("wifi-ssid");
|
|
||||||
pasw = server.arg("wifi-pasw");
|
|
||||||
apiToken = server.arg("apiToken");
|
|
||||||
if (ssid != "" && pasw != "" && apiToken != "") {
|
|
||||||
CleanEeprom();
|
|
||||||
WriteEeprom(ssid);
|
|
||||||
WriteEeprom(pasw, 33);
|
|
||||||
WriteEeprom(apiToken, 65);
|
|
||||||
server.send(200, "application/json", "Restarting esp");
|
|
||||||
delay(500);
|
|
||||||
ESP.restart();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
content = "<!DOCTYPE HTML><body>";
|
|
||||||
content += "<head><style>";
|
|
||||||
content += "html,body {height: 100%;}";
|
|
||||||
content += "html {display: table;margin: auto;}";
|
|
||||||
content += "body {display: table-cell;vertical-align: middle;}";
|
|
||||||
content += "input {width: 100%;box-sizing: border-box}";
|
|
||||||
content += "</style></head>";
|
|
||||||
content += "<h2>WIFI Configuration</h2>";
|
|
||||||
content += "<a href='#'>Refresh</a>";
|
|
||||||
content += "<div class=\"wifi-list\">";
|
|
||||||
int n = WiFi.scanNetworks();
|
|
||||||
if (n == 0)
|
|
||||||
content += "<label>No networks found...</label>";
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (int i = 0; i < n; ++i)
|
|
||||||
{
|
|
||||||
content += "<a href=\"#\" onclick=\"fillSSID(this.innerHTML)\">" + WiFi.SSID(i) + "</a><br>";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
content += "</div>";
|
|
||||||
content += "<form method='get' action=''><div class='wifi-form'>";
|
|
||||||
content += "<label>SSID: </label><input name='wifi-ssid' id='wifi-ssid' length=32 type='text'><br>";
|
|
||||||
content += "<label>Heslo: </label><input name='wifi-pasw' length=32 type='password'><br>";
|
|
||||||
content += "<label>Api token: </label><input name='apiToken' length=32 type='password'><br>";
|
|
||||||
content += "<input type='submit' value='Connect'>";
|
|
||||||
content += "</div></form>";
|
|
||||||
content += "<script>";
|
|
||||||
content += "function fillSSID(value) {\r\n";
|
|
||||||
content += "document.getElementById(\"wifi-ssid\").value = value;\r\n";
|
|
||||||
content += "}";
|
|
||||||
content += "</script>";
|
|
||||||
content += "</body>";
|
|
||||||
server.send(200, "text/html", content);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupAP(void) {
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
WiFi.disconnect();
|
|
||||||
WiFi.softAPdisconnect(true);
|
|
||||||
delay(100);
|
|
||||||
int n = WiFi.scanNetworks();
|
|
||||||
Serial.println("scan done");
|
|
||||||
if (n == 0)
|
|
||||||
Serial.println("no networks found");
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Serial.print(n);
|
|
||||||
Serial.println(" networks found");
|
|
||||||
for (int i = 0; i < n; ++i)
|
|
||||||
{
|
|
||||||
// Print SSID and RSSI for each network found
|
|
||||||
Serial.print(i + 1);
|
|
||||||
Serial.print(": ");
|
|
||||||
Serial.print(WiFi.SSID(i));
|
|
||||||
Serial.print(" (");
|
|
||||||
Serial.print(WiFi.RSSI(i));
|
|
||||||
Serial.print(")");
|
|
||||||
Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*");
|
|
||||||
delay(10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
delay(100);
|
|
||||||
WiFi.softAP(ssidServer, paswServer);
|
|
||||||
Serial.println("softap");
|
|
||||||
Serial.println("");
|
|
||||||
Serial.println("WiFi connected");
|
|
||||||
Serial.print("Local IP: ");
|
|
||||||
Serial.println(WiFi.localIP());
|
|
||||||
Serial.print("SoftAP IP: ");
|
|
||||||
Serial.println(WiFi.softAPIP());
|
|
||||||
createWeb();
|
|
||||||
// Start the server
|
|
||||||
server.begin();
|
|
||||||
Serial.println("Server started");
|
|
||||||
Serial.println("over");
|
|
||||||
}
|
|
Binary file not shown.
Before Width: | Height: | Size: 19 KiB |
@ -1,92 +0,0 @@
|
|||||||
//Includes
|
|
||||||
#include <ESP8266WiFi.h>
|
|
||||||
#include <ESP8266HTTPClient.h>
|
|
||||||
#include <ArduinoJson.h>
|
|
||||||
|
|
||||||
//Variables
|
|
||||||
const char* ssid = "";
|
|
||||||
const char* pasw = "";
|
|
||||||
const char* server = "http://ESP:ESP@dev.steelants.cz/projekty/rest_vasek/api/out.php";
|
|
||||||
const char* hwId = "";
|
|
||||||
int lastState = 0;
|
|
||||||
|
|
||||||
//Constant
|
|
||||||
#define SONOFF 12
|
|
||||||
#define SONOFF_LED 13
|
|
||||||
#define SONOFF_BUT 0
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
Serial.begin(9600);
|
|
||||||
Serial.println("HW: " + String(hwId));
|
|
||||||
pinMode(SONOFF, OUTPUT);
|
|
||||||
pinMode(SONOFF_LED, OUTPUT);
|
|
||||||
pinMode(SONOFF_BUT, OUTPUT);
|
|
||||||
pinMode(SONOFF_BUT, INPUT);
|
|
||||||
// WI-FI CONECTING
|
|
||||||
WiFi.persistent(false);
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
WiFi.begin(ssid, pasw);
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
if(WiFi.status() != WL_CONNECTED){
|
|
||||||
WiFi.begin(ssid, pasw);
|
|
||||||
while (WiFi.status() != WL_CONNECTED) { // Wait for the Wi-Fi to connect
|
|
||||||
digitalWrite(SONOFF_LED, LOW); // LOW will turn on the LED
|
|
||||||
delay(1000);
|
|
||||||
digitalWrite(SONOFF_LED, HIGH); // HIGH will turn off the LED
|
|
||||||
delay(1000);
|
|
||||||
}
|
|
||||||
Serial.println("\nCONECTED TO WIFI");
|
|
||||||
Serial.println("IP: " + String(WiFi.localIP()));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool buttonState = digitalRead(SONOFF_BUT);
|
|
||||||
HTTPClient http;
|
|
||||||
http.begin(server);
|
|
||||||
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
|
|
||||||
String requestJson = "{";
|
|
||||||
requestJson += "\"tocken\":\"" + String(hwId) + "\"";
|
|
||||||
|
|
||||||
if (buttonState == true) {
|
|
||||||
requestJson += ",";
|
|
||||||
requestJson += "\"on/off\":{";
|
|
||||||
requestJson += "\"value\":\"" + String(~lastState) + "\",";
|
|
||||||
requestJson += "\"unit\":\"\"";
|
|
||||||
requestJson += "}";
|
|
||||||
}
|
|
||||||
|
|
||||||
while(buttonState == true) {
|
|
||||||
delay(50); // keeps a small delay
|
|
||||||
}
|
|
||||||
|
|
||||||
requestJson += "}";
|
|
||||||
Serial.println("JSON: " + requestJson);
|
|
||||||
|
|
||||||
int httpCode = http.POST(requestJson);
|
|
||||||
String payload = http.getString(); //Get the response payload
|
|
||||||
|
|
||||||
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
|
|
||||||
Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload
|
|
||||||
|
|
||||||
DynamicJsonDocument doc(1024);
|
|
||||||
deserializeJson(doc, payload);
|
|
||||||
|
|
||||||
string hostname = doc["hostname"];
|
|
||||||
WiFi.hostname(hostname);
|
|
||||||
|
|
||||||
int state = doc["state"];
|
|
||||||
|
|
||||||
if (state == 1 && lastState == 0) {
|
|
||||||
Serial.println("ON");
|
|
||||||
digitalWrite(SONOFF, HIGH); // Turn the LED on by making the voltage LOW
|
|
||||||
digitalWrite(SONOFF_LED, LOW); // Turn the LED on by making the voltage LOW
|
|
||||||
} else {
|
|
||||||
Serial.println("OFF");
|
|
||||||
digitalWrite(SONOFF, LOW); // Turn the LED on by making the voltage LOW
|
|
||||||
digitalWrite(SONOFF_LED, HIGH); // Turn the LED on by making the voltage LOW
|
|
||||||
}
|
|
||||||
|
|
||||||
lastState = state;
|
|
||||||
delay(1000);
|
|
||||||
}
|
|
@ -1,94 +0,0 @@
|
|||||||
//Includes
|
|
||||||
#include <ESP8266WiFi.h>
|
|
||||||
#include <ESP8266HTTPClient.h>
|
|
||||||
#include <ArduinoJson.h>
|
|
||||||
|
|
||||||
//Variables
|
|
||||||
const char* ssid = "";
|
|
||||||
const char* pasw = "";
|
|
||||||
const char* server = "http://ESP:ESP@dev.steelants.cz/projekty/rest_vasek/api/out.php";
|
|
||||||
const char* hwId = "";
|
|
||||||
int lastState = 0;
|
|
||||||
|
|
||||||
//Constant
|
|
||||||
#define SONOFF 12
|
|
||||||
#define SONOFF_LED 13
|
|
||||||
#define SONOFF_BUT 0
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
Serial.begin(9600);
|
|
||||||
Serial.println("HW: " + String(hwId));
|
|
||||||
pinMode(SONOFF, OUTPUT);
|
|
||||||
pinMode(SONOFF_LED, OUTPUT);
|
|
||||||
pinMode(SONOFF_BUT, OUTPUT);
|
|
||||||
pinMode(SONOFF_BUT, INPUT);
|
|
||||||
// WI-FI CONECTING
|
|
||||||
WiFi.persistent(false);
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
WiFi.begin(ssid, pasw);
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
if(WiFi.status() != WL_CONNECTED){
|
|
||||||
WiFi.begin(ssid, pasw);
|
|
||||||
while (WiFi.status() != WL_CONNECTED) { // Wait for the Wi-Fi to connect
|
|
||||||
digitalWrite(SONOFF_LED, LOW); // LOW will turn on the LED
|
|
||||||
delay(1000);
|
|
||||||
digitalWrite(SONOFF_LED, HIGH); // HIGH will turn off the LED
|
|
||||||
delay(1000);
|
|
||||||
}
|
|
||||||
Serial.println("\nCONECTED TO WIFI");
|
|
||||||
Serial.println("IP: " + String(WiFi.localIP()));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool buttonState = digitalRead(SONOFF_BUT);
|
|
||||||
HTTPClient http;
|
|
||||||
http.begin(server);
|
|
||||||
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
|
|
||||||
String requestJson = "{";
|
|
||||||
requestJson += "\"tocken\":\"" + String(hwId) + "\"";
|
|
||||||
|
|
||||||
if (buttonState == true) {
|
|
||||||
requestJson += ",";
|
|
||||||
requestJson += "\"on/off\":{";
|
|
||||||
requestJson += "\"value\":\"" + String(~lastState) + "\",";
|
|
||||||
requestJson += "\"unit\":\"\"";
|
|
||||||
requestJson += "}";
|
|
||||||
}
|
|
||||||
|
|
||||||
while(buttonState == true) {
|
|
||||||
delay(50); // keeps a small delay
|
|
||||||
}
|
|
||||||
|
|
||||||
requestJson += "}";
|
|
||||||
Serial.println("JSON: " + requestJson);
|
|
||||||
|
|
||||||
int httpCode = http.POST(requestJson);
|
|
||||||
String payload = http.getString(); //Get the response payload
|
|
||||||
|
|
||||||
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
|
|
||||||
Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload
|
|
||||||
|
|
||||||
DynamicJsonDocument doc(1024);
|
|
||||||
deserializeJson(doc, payload);
|
|
||||||
|
|
||||||
string hostname = doc["device"]["hostname"];
|
|
||||||
sleepTime = doc["device"]["sleepTime"];
|
|
||||||
|
|
||||||
WiFi.hostname(hostname);
|
|
||||||
|
|
||||||
int state = doc["state"];
|
|
||||||
|
|
||||||
if (state == 1 && lastState == 0) {
|
|
||||||
Serial.println("ON");
|
|
||||||
digitalWrite(SONOFF, HIGH); // Turn the LED on by making the voltage LOW
|
|
||||||
digitalWrite(SONOFF_LED, LOW); // Turn the LED on by making the voltage LOW
|
|
||||||
} else {
|
|
||||||
Serial.println("OFF");
|
|
||||||
digitalWrite(SONOFF, LOW); // Turn the LED on by making the voltage LOW
|
|
||||||
digitalWrite(SONOFF_LED, HIGH); // Turn the LED on by making the voltage LOW
|
|
||||||
}
|
|
||||||
|
|
||||||
lastState = state;
|
|
||||||
delay(1000);
|
|
||||||
}
|
|
@ -1,221 +0,0 @@
|
|||||||
//Includes
|
|
||||||
#include <ESP8266WiFi.h>
|
|
||||||
#include <ESP8266HTTPClient.h>
|
|
||||||
#include <ArduinoJson.h>
|
|
||||||
#include <EEPROM.h>
|
|
||||||
|
|
||||||
//Variables
|
|
||||||
const char* ssid = "Smart-Home";
|
|
||||||
const char* pasw = "S1pjg3684dcCPTUQ";
|
|
||||||
const char* hwId = "452r5s8dad";
|
|
||||||
const char* server = "http://dev.steelants.cz/vasek/home/api.php";
|
|
||||||
int unsuccessfulRounds = 0; //Unsucesful atmpt counter
|
|
||||||
StaticJsonDocument<250> jsonContent;
|
|
||||||
bool buttonActive = false;
|
|
||||||
int interuptCount = 0;
|
|
||||||
int realState = 1;
|
|
||||||
int state = 0;
|
|
||||||
String requestJson = "";
|
|
||||||
|
|
||||||
//Pins
|
|
||||||
#define SONOFF 12 //12
|
|
||||||
#define SONOFF_LED 13
|
|
||||||
#define SONOFF_BUT 0 //0
|
|
||||||
|
|
||||||
void ICACHE_RAM_ATTR handleInterrupt ();
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
Serial.begin(9600);
|
|
||||||
EEPROM.begin(1);
|
|
||||||
while (!Serial) continue;
|
|
||||||
delay(10);
|
|
||||||
Serial.println('\n');
|
|
||||||
Serial.println("HW: " + String(hwId));
|
|
||||||
|
|
||||||
pinMode(SONOFF_LED, OUTPUT);
|
|
||||||
pinMode(SONOFF_BUT, INPUT_PULLUP);
|
|
||||||
pinMode(SONOFF, OUTPUT);
|
|
||||||
state = EEPROM.read(0);
|
|
||||||
digitalWrite(SONOFF, state);
|
|
||||||
realState = state;
|
|
||||||
|
|
||||||
attachInterrupt(digitalPinToInterrupt(SONOFF_BUT), handleInterrupt, FALLING);
|
|
||||||
|
|
||||||
|
|
||||||
WiFi.persistent(false);
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
|
|
||||||
WiFi.begin(ssid, pasw);
|
|
||||||
checkConnection();
|
|
||||||
|
|
||||||
Serial.println('\n');
|
|
||||||
Serial.println("Connection established!");
|
|
||||||
Serial.print("IP address:");
|
|
||||||
Serial.println(WiFi.localIP());
|
|
||||||
Serial.print("MAC address:");
|
|
||||||
Serial.println(WiFi.macAddress());
|
|
||||||
|
|
||||||
jsonContent = {};
|
|
||||||
jsonContent["token"] = hwId;
|
|
||||||
jsonContent["values"]["on/off"]["value"] = (String)realState;
|
|
||||||
|
|
||||||
serializeJson(jsonContent, requestJson);
|
|
||||||
Serial.println("JSON: " + requestJson);
|
|
||||||
DeserializationError error = deserializeJson(jsonContent, sendHttpRequest(requestJson));
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
if(unsuccessfulRounds >= 5) {
|
|
||||||
Serial.println("RESTARTING ESP");
|
|
||||||
ESP.restart();
|
|
||||||
}
|
|
||||||
jsonContent = {};
|
|
||||||
jsonContent["token"] = hwId;
|
|
||||||
requestJson = "";
|
|
||||||
if (buttonActive == true){
|
|
||||||
jsonContent["values"]["on/off"]["value"] = (String)!realState;
|
|
||||||
if (!realState == 1) {
|
|
||||||
digitalWrite(SONOFF, HIGH);
|
|
||||||
realState = 1;
|
|
||||||
} else if (!realState == 0){
|
|
||||||
digitalWrite(SONOFF, LOW);
|
|
||||||
realState = 0;
|
|
||||||
}
|
|
||||||
EEPROM.write(0, 0);
|
|
||||||
EEPROM.commit();
|
|
||||||
serializeJson(jsonContent, requestJson);
|
|
||||||
Serial.println("JSON: " + requestJson);
|
|
||||||
|
|
||||||
//HTTP CLIENT
|
|
||||||
DeserializationError error = deserializeJson(jsonContent, sendHttpRequest(requestJson));
|
|
||||||
buttonActive = false;
|
|
||||||
}
|
|
||||||
jsonContent = {};
|
|
||||||
jsonContent["token"] = hwId;
|
|
||||||
|
|
||||||
requestJson = "";
|
|
||||||
serializeJson(jsonContent, requestJson);
|
|
||||||
Serial.println("JSON: " + requestJson);
|
|
||||||
|
|
||||||
//HTTP CLIENT
|
|
||||||
DeserializationError error = deserializeJson(jsonContent, sendHttpRequest(requestJson));
|
|
||||||
|
|
||||||
if (error) {
|
|
||||||
Serial.println(error.c_str());
|
|
||||||
unsuccessfulRounds++;
|
|
||||||
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//configuration setup
|
|
||||||
String hostName = jsonContent["device"]["hostname"];
|
|
||||||
String ipAddress = jsonContent["device"]["ipAddress"];
|
|
||||||
String gateway = jsonContent["device"]["gateway"];
|
|
||||||
String subnet = jsonContent["device"]["subnet"];
|
|
||||||
String requestState = jsonContent["state"];
|
|
||||||
JsonObject object = jsonContent.as<JsonObject>();
|
|
||||||
if (!object["value"].isNull()) {
|
|
||||||
state = (int)jsonContent["value"];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (requestState != "succes") {
|
|
||||||
unsuccessfulRounds++;
|
|
||||||
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
|
|
||||||
} else if (requestState == "succes") {
|
|
||||||
unsuccessfulRounds = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Set static ip
|
|
||||||
setStaticIp(ipAddress, gateway, subnet);
|
|
||||||
WiFi.hostname(hostName);
|
|
||||||
Serial.println("state: " + (String)state + ", realState: " + (String)realState);
|
|
||||||
if (state != realState){
|
|
||||||
if (state == 1 && realState == 0) {
|
|
||||||
Serial.println("ON state: " + (String)state + ", realState: " + (String)realState);
|
|
||||||
digitalWrite(SONOFF, HIGH); // Turn the LED on by making the voltage LOW
|
|
||||||
realState = 1;
|
|
||||||
} else if (state == 0 && realState == 1) {
|
|
||||||
Serial.println("OFF");
|
|
||||||
digitalWrite(SONOFF, LOW); // Turn the LED on by making the voltage LOW
|
|
||||||
realState = 0;
|
|
||||||
}
|
|
||||||
EEPROM.write(0, realState);
|
|
||||||
EEPROM.commit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void handleInterrupt() {
|
|
||||||
interuptCount++;
|
|
||||||
buttonActive = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
String sendHttpRequest (String requestJson) {
|
|
||||||
HTTPClient http;
|
|
||||||
http.setReuse(true);
|
|
||||||
http.begin(server);
|
|
||||||
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
|
|
||||||
|
|
||||||
int httpCode = http.POST(requestJson);
|
|
||||||
String payload = http.getString(); //Get the response payload
|
|
||||||
http.end();
|
|
||||||
|
|
||||||
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
|
|
||||||
Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload
|
|
||||||
|
|
||||||
if (httpCode == -1) {
|
|
||||||
unsuccessfulRounds++;
|
|
||||||
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return payload;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool checkConnection() {
|
|
||||||
int count = 0;
|
|
||||||
Serial.print("Waiting for Wi-Fi connection");
|
|
||||||
while ( count < 30 ) {
|
|
||||||
if (buttonActive == true){
|
|
||||||
if (!realState == 1) {
|
|
||||||
digitalWrite(SONOFF, HIGH);
|
|
||||||
realState = 1;
|
|
||||||
} else if (!realState == 0){
|
|
||||||
digitalWrite(SONOFF, LOW);
|
|
||||||
realState = 0;
|
|
||||||
}
|
|
||||||
EEPROM.write(0, realState);
|
|
||||||
EEPROM.commit();
|
|
||||||
buttonActive = false;
|
|
||||||
}
|
|
||||||
digitalWrite(SONOFF_LED, HIGH);
|
|
||||||
delay(125);
|
|
||||||
digitalWrite(SONOFF_LED, LOW);
|
|
||||||
delay(125);
|
|
||||||
if (WiFi.status() == WL_CONNECTED) {
|
|
||||||
Serial.println();
|
|
||||||
Serial.println("Connected!");
|
|
||||||
digitalWrite(SONOFF_LED, HIGH);
|
|
||||||
return (true);
|
|
||||||
}
|
|
||||||
Serial.print(".");
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
Serial.println("Timed out.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setStaticIp(String ipAddress, String subnet, String gateway){
|
|
||||||
//Set static ip
|
|
||||||
IPAddress staticIpAddress;
|
|
||||||
IPAddress subnetIpAddress;
|
|
||||||
IPAddress gatewayIpAddress;
|
|
||||||
|
|
||||||
if (
|
|
||||||
staticIpAddress.fromString(ipAddress) &&
|
|
||||||
subnetIpAddress.fromString(subnet) &&
|
|
||||||
gatewayIpAddress.fromString(gateway) &&
|
|
||||||
WiFi.localIP() != staticIpAddress
|
|
||||||
) {
|
|
||||||
WiFi.config(staticIpAddress, subnetIpAddress, gatewayIpAddress);
|
|
||||||
Serial.print("STATIC IP address:");
|
|
||||||
Serial.println(WiFi.localIP());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,373 +0,0 @@
|
|||||||
//Includes
|
|
||||||
#include <ESP8266WiFi.h>
|
|
||||||
#include <ESP8266WebServer.h>
|
|
||||||
#include <WiFiClientSecure.h>
|
|
||||||
#include <ESP8266HTTPClient.h>
|
|
||||||
#define ARDUINOJSON_DECODE_UNICODE 1
|
|
||||||
#include <ArduinoJson.h>
|
|
||||||
#include <EEPROM.h>
|
|
||||||
#include "ESP8266httpUpdate.h"
|
|
||||||
|
|
||||||
//Variables
|
|
||||||
const char* ssidServer = "";
|
|
||||||
const char* paswServer = "";
|
|
||||||
String ssid = "";
|
|
||||||
String pasw = "";
|
|
||||||
String apiToken = "";
|
|
||||||
const int httpsPort = 443;
|
|
||||||
const char* host = "http://dev.steelants.cz";
|
|
||||||
const char* url = "/vasek/home/api.php";
|
|
||||||
|
|
||||||
const char* fingerprint = "";
|
|
||||||
const char* host2 = "dev.steelants.cz";
|
|
||||||
const char* url2 = "/vasek/home/update.php";
|
|
||||||
|
|
||||||
String content;
|
|
||||||
bool conf = false;
|
|
||||||
bool buttonActive = false;
|
|
||||||
int state = 0;
|
|
||||||
String requestJson = "";
|
|
||||||
int unsuccessfulRounds = 0; //Unsucesful atmpt counter
|
|
||||||
|
|
||||||
ESP8266WebServer server(80);
|
|
||||||
StaticJsonDocument<250> jsonContent;
|
|
||||||
DeserializationError error;
|
|
||||||
|
|
||||||
//Pins
|
|
||||||
#define SONOFF 12
|
|
||||||
#define SONOFF_LED 13
|
|
||||||
#define SONOFF_BUT 0 //0
|
|
||||||
|
|
||||||
void ICACHE_RAM_ATTR handleInterrupt ();
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
Serial.begin(9600);
|
|
||||||
EEPROM.begin(100);
|
|
||||||
while (!Serial) continue;
|
|
||||||
delay(10);
|
|
||||||
|
|
||||||
//read saved data
|
|
||||||
ssid = ReadEeprom(1, 33);
|
|
||||||
pasw = ReadEeprom(33, 65);
|
|
||||||
apiToken = ReadEeprom(65, 97);
|
|
||||||
|
|
||||||
//set pins
|
|
||||||
pinMode(SONOFF_LED, OUTPUT);
|
|
||||||
pinMode(SONOFF_BUT, INPUT_PULLUP);
|
|
||||||
pinMode(SONOFF, OUTPUT);
|
|
||||||
state = EEPROM.read(0);
|
|
||||||
digitalWrite(SONOFF, state);
|
|
||||||
|
|
||||||
attachInterrupt(digitalPinToInterrupt(SONOFF_BUT), handleInterrupt, FALLING);
|
|
||||||
|
|
||||||
//wifi
|
|
||||||
if (ssid != "") {
|
|
||||||
WiFi.disconnect();
|
|
||||||
WiFi.softAPdisconnect(true);
|
|
||||||
WiFi.persistent(false);
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
WiFi.begin(ssid, pasw);
|
|
||||||
conf = wifiVerify(20);
|
|
||||||
if (conf) {
|
|
||||||
configTime(3 * 3600, 0, "pool.ntp.org");
|
|
||||||
WiFiClientSecure client;
|
|
||||||
Serial.print("connecting to ");
|
|
||||||
Serial.println(host2);
|
|
||||||
client.setInsecure();
|
|
||||||
if (!client.connect(host2, httpsPort)) {
|
|
||||||
Serial.println("connection failed");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (client.verify(fingerprint, host2)) {
|
|
||||||
Serial.println("certificate matches");
|
|
||||||
} else {
|
|
||||||
Serial.println("certificate doesn't match");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Serial.print("Starting OTA from: ");
|
|
||||||
Serial.println(url2
|
|
||||||
|
|
||||||
);
|
|
||||||
|
|
||||||
auto ret = ESPhttpUpdate.update(client, host2, 80, url2);
|
|
||||||
delay(500);
|
|
||||||
switch(ret) {
|
|
||||||
case HTTP_UPDATE_FAILED:
|
|
||||||
Serial.printf("HTTP_UPDATE_FAILD Error (%d): %s", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str());
|
|
||||||
Serial.println();
|
|
||||||
Serial.println();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HTTP_UPDATE_NO_UPDATES:
|
|
||||||
Serial.println("HTTP_UPDATE_NO_UPDATES");
|
|
||||||
Serial.println();
|
|
||||||
Serial.println();
|
|
||||||
Serial.println();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HTTP_UPDATE_OK:
|
|
||||||
Serial.println("HTTP_UPDATE_OK");
|
|
||||||
Serial.println();
|
|
||||||
Serial.println();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
delay(500);
|
|
||||||
jsonContent = {};
|
|
||||||
jsonContent["token"] = apiToken;
|
|
||||||
jsonContent["values"]["on/off"]["value"] = (String)state;
|
|
||||||
jsonContent["settings"]["network"]["ip"] = WiFi.localIP().toString();
|
|
||||||
jsonContent["settings"]["network"]["mac"] = WiFi.macAddress();
|
|
||||||
jsonContent["settings"]["firmware_hash"] = ESP.getSketchMD5();
|
|
||||||
sendDataToWeb();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
setupAP();
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
if (conf) {
|
|
||||||
if (unsuccessfulRounds >= 5) {
|
|
||||||
Serial.println("RESTARTING ESP");
|
|
||||||
ESP.restart();
|
|
||||||
}
|
|
||||||
jsonContent = {};
|
|
||||||
jsonContent["token"] = apiToken;
|
|
||||||
requestJson = "";
|
|
||||||
if (buttonActive) {
|
|
||||||
jsonContent["values"]["on/off"]["value"] = (String)state;
|
|
||||||
digitalWrite(SONOFF, state);
|
|
||||||
EEPROM.write(0, state);
|
|
||||||
EEPROM.commit();
|
|
||||||
sendDataToWeb();
|
|
||||||
buttonActive = false;
|
|
||||||
delay(500);
|
|
||||||
} else {
|
|
||||||
sendDataToWeb();
|
|
||||||
loadDataFromWeb();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
server.handleClient();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void handleInterrupt() {
|
|
||||||
buttonActive = true;
|
|
||||||
state = !state;
|
|
||||||
digitalWrite(SONOFF, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool wifiVerify(int t) {
|
|
||||||
int c = 0;
|
|
||||||
Serial.println("Waiting for Wifi to connect to Shelly1");
|
|
||||||
while (c < t) {
|
|
||||||
if (WiFi.status() == WL_CONNECTED) {
|
|
||||||
c = t;
|
|
||||||
Serial.println();
|
|
||||||
Serial.println("Connected!");
|
|
||||||
digitalWrite(SONOFF_LED, HIGH);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (buttonActive == true){
|
|
||||||
digitalWrite(SONOFF, state);
|
|
||||||
EEPROM.write(0, state);
|
|
||||||
EEPROM.commit();
|
|
||||||
buttonActive = false;
|
|
||||||
}
|
|
||||||
digitalWrite(SONOFF_LED, HIGH);
|
|
||||||
delay(125);
|
|
||||||
digitalWrite(SONOFF_LED, LOW);
|
|
||||||
delay(375);
|
|
||||||
Serial.print(WiFi.status());
|
|
||||||
c++;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void loadDataFromWeb() {
|
|
||||||
if (error.code() != DeserializationError::Ok) {
|
|
||||||
Serial.println(error.c_str());
|
|
||||||
unsuccessfulRounds++;
|
|
||||||
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
|
|
||||||
error = DeserializationError::Ok;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//configuration setup
|
|
||||||
String hostName = jsonContent["device"]["hostname"];
|
|
||||||
String requestState = jsonContent["state"];
|
|
||||||
String command = jsonContent["command"];
|
|
||||||
if (!buttonActive) {
|
|
||||||
state = (int)jsonContent["value"];
|
|
||||||
Serial.println("state: " + (String)state);
|
|
||||||
digitalWrite(SONOFF, state);
|
|
||||||
EEPROM.write(0, state);
|
|
||||||
EEPROM.commit();
|
|
||||||
delay(500);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (command == "reset"){
|
|
||||||
ESP.reset();
|
|
||||||
} else if (command == "config") {
|
|
||||||
CleanEeprom();
|
|
||||||
EEPROM.commit();
|
|
||||||
ESP.restart();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (requestState != "succes") {
|
|
||||||
unsuccessfulRounds++;
|
|
||||||
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
|
|
||||||
} else if (requestState == "succes") {
|
|
||||||
unsuccessfulRounds = 0;
|
|
||||||
}
|
|
||||||
WiFi.hostname(hostName);
|
|
||||||
}
|
|
||||||
|
|
||||||
void sendDataToWeb() {
|
|
||||||
serializeJson(jsonContent, requestJson);
|
|
||||||
Serial.println("JSON: " + requestJson);
|
|
||||||
error = deserializeJson(jsonContent, sendHttpRequest());
|
|
||||||
}
|
|
||||||
|
|
||||||
String sendHttpRequest () {
|
|
||||||
HTTPClient http;
|
|
||||||
http.setReuse(true);
|
|
||||||
Serial.println("HTTP url: " + String(host) + String(url) + ""); //Print HTTP return code
|
|
||||||
http.begin(String(host) + String(url));
|
|
||||||
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
|
|
||||||
Serial.println("HTTP request: " + String(requestJson) + ""); //Print HTTP return code
|
|
||||||
int httpCode = http.POST(requestJson);
|
|
||||||
String payload = http.getString(); //Get the response payload
|
|
||||||
http.end();
|
|
||||||
|
|
||||||
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
|
|
||||||
Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload
|
|
||||||
|
|
||||||
if (httpCode == -1) {
|
|
||||||
unsuccessfulRounds++;
|
|
||||||
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return payload;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CleanEeprom() {
|
|
||||||
for (int i = 1; i < 100; ++i) {
|
|
||||||
EEPROM.write(i, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void WriteEeprom (String data, int start = 1) {
|
|
||||||
for (int i = 0; i < data.length(); ++i)
|
|
||||||
{
|
|
||||||
EEPROM.write(start + i, data[i]);
|
|
||||||
}
|
|
||||||
EEPROM.commit();
|
|
||||||
}
|
|
||||||
|
|
||||||
String ReadEeprom(int min, int max) {
|
|
||||||
String localString;
|
|
||||||
for (int i = min; i < max; ++i) {
|
|
||||||
localString += char(EEPROM.read(i));
|
|
||||||
}
|
|
||||||
return localString;
|
|
||||||
}
|
|
||||||
|
|
||||||
void createWeb()
|
|
||||||
{
|
|
||||||
server.on("/", []() {
|
|
||||||
if (server.args() == 3) {
|
|
||||||
ssid = server.arg("wifi-ssid");
|
|
||||||
pasw = server.arg("wifi-pasw");
|
|
||||||
apiToken = server.arg("apiToken");
|
|
||||||
if (ssid != "" && pasw != "" && apiToken != "") {
|
|
||||||
CleanEeprom();
|
|
||||||
WriteEeprom(ssid);
|
|
||||||
WriteEeprom(pasw, 33);
|
|
||||||
WriteEeprom(apiToken, 65);
|
|
||||||
server.send(200, "application/json", "Restarting esp");
|
|
||||||
delay(500);
|
|
||||||
ESP.restart();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
content = "<!DOCTYPE HTML><body>";
|
|
||||||
content += "<head><style>";
|
|
||||||
content += "html,body {height: 100%;}";
|
|
||||||
content += "html {display: table;margin: auto;}";
|
|
||||||
content += "body {display: table-cell;vertical-align: middle;}";
|
|
||||||
content += "input {width: 100%;box-sizing: border-box}";
|
|
||||||
content += "</style></head>";
|
|
||||||
content += "<h2>WIFI Configuration</h2>";
|
|
||||||
content += "<h4><b>" + (String)ssidServer + "</b></h4>";
|
|
||||||
content += "<a href='#'>Refresh</a>";
|
|
||||||
content += "<div class=\"wifi-list\">";
|
|
||||||
int n = WiFi.scanNetworks();
|
|
||||||
if (n == 0)
|
|
||||||
content += "<label>No networks found...</label>";
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (int i = 0; i < n; ++i)
|
|
||||||
{
|
|
||||||
content += "<a href=\"#\" onclick=\"fillSSID(this.innerHTML)\">" + WiFi.SSID(i) + "</a><br>";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
content += "</div>";
|
|
||||||
content += "<form method='get' action=''><div class='wifi-form'>";
|
|
||||||
content += "<label>SSID: </label><input name='wifi-ssid' id='wifi-ssid' length=32 type='text'><br>";
|
|
||||||
content += "<label>Heslo: </label><input name='wifi-pasw' length=32 type='password'><br>";
|
|
||||||
content += "<label>Api token: </label><input name='apiToken' length=32 type='password'><br>";
|
|
||||||
content += "<input type='submit' value='Connect'>";
|
|
||||||
content += "</div></form>";
|
|
||||||
content += "<script>";
|
|
||||||
content += "function fillSSID(value) {\r\n";
|
|
||||||
content += "document.getElementById(\"wifi-ssid\").value = value;\r\n";
|
|
||||||
content += "}";
|
|
||||||
content += "</script>";
|
|
||||||
content += "</body>";
|
|
||||||
server.send(200, "text/html", content);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupAP(void) {
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
WiFi.disconnect();
|
|
||||||
WiFi.softAPdisconnect(true);
|
|
||||||
delay(100);
|
|
||||||
int n = WiFi.scanNetworks();
|
|
||||||
Serial.println("scan done");
|
|
||||||
if (n == 0)
|
|
||||||
Serial.println("no networks found");
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Serial.print(n);
|
|
||||||
Serial.println(" networks found");
|
|
||||||
for (int i = 0; i < n; ++i)
|
|
||||||
{
|
|
||||||
// Print SSID and RSSI for each network found
|
|
||||||
Serial.print(i + 1);
|
|
||||||
Serial.print(": ");
|
|
||||||
Serial.print(WiFi.SSID(i));
|
|
||||||
Serial.print(" (");
|
|
||||||
Serial.print(WiFi.RSSI(i));
|
|
||||||
Serial.print(")");
|
|
||||||
Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*");
|
|
||||||
delay(10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
delay(100);
|
|
||||||
WiFi.softAP(ssidServer, paswServer);
|
|
||||||
Serial.println("softap");
|
|
||||||
Serial.println("");
|
|
||||||
Serial.println("WiFi connected");
|
|
||||||
Serial.print("Local IP: ");
|
|
||||||
Serial.println(WiFi.localIP());
|
|
||||||
Serial.print("SoftAP IP: ");
|
|
||||||
Serial.println(WiFi.softAPIP());
|
|
||||||
createWeb();
|
|
||||||
// Start the server
|
|
||||||
server.begin();
|
|
||||||
Serial.println("Server started");
|
|
||||||
Serial.println("over");
|
|
||||||
}
|
|
@ -1,94 +0,0 @@
|
|||||||
//Includes
|
|
||||||
#include <ESP8266WiFi.h>
|
|
||||||
#include <ESP8266HTTPClient.h>
|
|
||||||
#include <ArduinoJson.h>
|
|
||||||
|
|
||||||
//Variables
|
|
||||||
const char* ssid = " ";
|
|
||||||
const char* pasw = "";
|
|
||||||
const char* server = "http://dev.steelants.cz/vasek/home/api.php";
|
|
||||||
const char* hwId = "";
|
|
||||||
int lastState = 0;
|
|
||||||
int reconectAtemptsMax = 10; //time to wait before restart
|
|
||||||
|
|
||||||
//Constant
|
|
||||||
#define SONOFF 12
|
|
||||||
#define SONOFF_LED 13
|
|
||||||
#define SONOFF_BUT 0
|
|
||||||
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
Serial.begin(9600);
|
|
||||||
delay(10);
|
|
||||||
Serial.println('\n');
|
|
||||||
Serial.println("HW: " + String(hwId));
|
|
||||||
|
|
||||||
pinMode(SONOFF, OUTPUT);
|
|
||||||
pinMode(SONOFF_LED, OUTPUT);
|
|
||||||
pinMode(SONOFF_BUT, INPUT);
|
|
||||||
|
|
||||||
WiFi.persistent(false);
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
|
|
||||||
WiFi.begin(ssid, pasw);
|
|
||||||
Serial.print("Connecting to ");
|
|
||||||
Serial.print(ssid); Serial.println(" ...");
|
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
while (WiFi.status() != WL_CONNECTED) { // Wait for the Wi-Fi to connect
|
|
||||||
delay(1000);
|
|
||||||
Serial.print(++i); Serial.print(' ');
|
|
||||||
}
|
|
||||||
|
|
||||||
Serial.println('\n');
|
|
||||||
Serial.println("Connection established!");
|
|
||||||
Serial.print("IP address:\t");
|
|
||||||
Serial.println(WiFi.localIP());
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
StaticJsonDocument<200> jsonContent;
|
|
||||||
jsonContent["token"] = hwId;
|
|
||||||
|
|
||||||
if (!digitalRead(SONOFF_BUT)){
|
|
||||||
jsonContent["values"]["on/off"]["value"] = (int) !lastState;
|
|
||||||
if (!lastState == 1) {
|
|
||||||
digitalWrite(SONOFF, HIGH)
|
|
||||||
} else if (!lastState == 0){
|
|
||||||
digitalWrite(SONOFF, LOW)
|
|
||||||
}
|
|
||||||
while(!digitalRead(SONOFF_BUT)) {
|
|
||||||
delay(100);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String requestJson = "";
|
|
||||||
serializeJson(jsonContent, requestJson);
|
|
||||||
Serial.println("JSON: " + requestJson);
|
|
||||||
|
|
||||||
HTTPClient http;
|
|
||||||
http.begin(server);
|
|
||||||
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
|
|
||||||
int httpCode = http.POST(requestJson);
|
|
||||||
String payload = http.getString(); //Get the response payload
|
|
||||||
http.end();
|
|
||||||
|
|
||||||
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
|
|
||||||
Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload
|
|
||||||
|
|
||||||
deserializeJson(jsonContent, payload);
|
|
||||||
String hostname = jsonContent["device"]["hostname"];
|
|
||||||
int state = jsonContent["value"];
|
|
||||||
WiFi.hostname(hostname);
|
|
||||||
|
|
||||||
if (state != lastState){
|
|
||||||
if (state == 1 && lastState == 0) {
|
|
||||||
Serial.println("ON");
|
|
||||||
digitalWrite(SONOFF, HIGH); // Turn the LED on by making the voltage LOW
|
|
||||||
} else {
|
|
||||||
Serial.println("OFF");
|
|
||||||
digitalWrite(SONOFF, LOW); // Turn the LED on by making the voltage LOW
|
|
||||||
}
|
|
||||||
}
|
|
||||||
lastState = state;
|
|
||||||
}
|
|
@ -1,150 +0,0 @@
|
|||||||
//Includes
|
|
||||||
#include <ESP8266WiFi.h>
|
|
||||||
#include <ESP8266HTTPClient.h>
|
|
||||||
#include <ArduinoJson.h>
|
|
||||||
|
|
||||||
//Variables
|
|
||||||
const char* ssid = "";
|
|
||||||
const char* pasw = "";
|
|
||||||
const char* hwId = "";
|
|
||||||
const char* server = "http://dev.steelants.cz/vasek/home/api.php";
|
|
||||||
int unsuccessfulRounds = 0; //Unsucesful atmpt counter
|
|
||||||
int lastState = 0;
|
|
||||||
|
|
||||||
//Pins
|
|
||||||
#define SONOFF 12
|
|
||||||
#define SONOFF_LED 13
|
|
||||||
#define SONOFF_BUT 0
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
Serial.begin(9600);
|
|
||||||
while (!Serial) continue;
|
|
||||||
delay(10);
|
|
||||||
Serial.println('\n');
|
|
||||||
Serial.println("HW: " + String(hwId));
|
|
||||||
|
|
||||||
pinMode(SONOFF, OUTPUT);
|
|
||||||
pinMode(SONOFF_LED, OUTPUT);
|
|
||||||
pinMode(SONOFF_BUT, INPUT);
|
|
||||||
|
|
||||||
WiFi.persistent(false);
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
|
|
||||||
WiFi.begin(ssid, pasw);
|
|
||||||
checkConnection();
|
|
||||||
|
|
||||||
Serial.println('\n');
|
|
||||||
Serial.println("Connection established!");
|
|
||||||
Serial.print("IP address:");
|
|
||||||
Serial.println(WiFi.localIP());
|
|
||||||
Serial.print("MAC address:");
|
|
||||||
Serial.println(WiFi.macAddress());
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
StaticJsonDocument<250> jsonContent;
|
|
||||||
jsonContent["token"] = hwId;
|
|
||||||
|
|
||||||
if (!digitalRead(SONOFF_BUT)){
|
|
||||||
jsonContent["values"]["on/off"]["value"] = (int) !lastState;
|
|
||||||
if (!lastState == 1) {
|
|
||||||
digitalWrite(SONOFF, HIGH);
|
|
||||||
} else if (!lastState == 0){
|
|
||||||
digitalWrite(SONOFF, LOW);
|
|
||||||
}
|
|
||||||
while(!digitalRead(SONOFF_BUT)) {
|
|
||||||
delay(100);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String requestJson = "";
|
|
||||||
serializeJson(jsonContent, requestJson);
|
|
||||||
Serial.println("JSON: " + requestJson);
|
|
||||||
|
|
||||||
//HTTP CLIENT
|
|
||||||
HTTPClient http;
|
|
||||||
http.begin(server);
|
|
||||||
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
|
|
||||||
|
|
||||||
int httpCode = http.POST(requestJson);
|
|
||||||
String payload = http.getString(); //Get the response payload
|
|
||||||
http.end();
|
|
||||||
|
|
||||||
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
|
|
||||||
Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload
|
|
||||||
|
|
||||||
DeserializationError error = deserializeJson(jsonContent, payload);
|
|
||||||
|
|
||||||
//configuration setup
|
|
||||||
String hostName = jsonContent["device"]["hostname"];
|
|
||||||
String ipAddress = jsonContent["device"]["ipAddress"];
|
|
||||||
String gateway = jsonContent["device"]["gateway"];
|
|
||||||
String subnet = jsonContent["device"]["subnet"];
|
|
||||||
String requestState = jsonContent["state"];
|
|
||||||
int state = jsonContent["value"];
|
|
||||||
|
|
||||||
if (requestState != "succes") {
|
|
||||||
unsuccessfulRounds++;
|
|
||||||
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
|
|
||||||
} else if (requestState == "succes") {
|
|
||||||
unsuccessfulRounds = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Set static ip
|
|
||||||
setStaticIp(ipAddress, gateway, subnet);
|
|
||||||
WiFi.hostname(hostName);
|
|
||||||
|
|
||||||
if(unsuccessfulRounds == 5) {
|
|
||||||
Serial.println("RESTARTING ESP");
|
|
||||||
ESP.restart();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state != lastState){
|
|
||||||
if (state == 1 && lastState == 0) {
|
|
||||||
Serial.println("ON");
|
|
||||||
digitalWrite(SONOFF, HIGH); // Turn the LED on by making the voltage LOW
|
|
||||||
} else {
|
|
||||||
Serial.println("OFF");
|
|
||||||
digitalWrite(SONOFF, LOW); // Turn the LED on by making the voltage LOW
|
|
||||||
}
|
|
||||||
}
|
|
||||||
lastState = state;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool checkConnection() {
|
|
||||||
int count = 0;
|
|
||||||
Serial.print("Waiting for Wi-Fi connection");
|
|
||||||
while ( count < 30 ) {
|
|
||||||
if (WiFi.status() == WL_CONNECTED) {
|
|
||||||
Serial.println();
|
|
||||||
Serial.println("Connected!");
|
|
||||||
return (true);
|
|
||||||
}
|
|
||||||
digitalWrite(SONOFF, HIGH);
|
|
||||||
delay(250);
|
|
||||||
digitalWrite(SONOFF, HIGH);
|
|
||||||
delay(250);
|
|
||||||
Serial.print(".");
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
Serial.println("Timed out.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setStaticIp(String ipAddress, String subnet, String gateway){
|
|
||||||
//Set static ip
|
|
||||||
IPAddress staticIpAddress;
|
|
||||||
IPAddress subnetIpAddress;
|
|
||||||
IPAddress gatewayIpAddress;
|
|
||||||
|
|
||||||
if (
|
|
||||||
staticIpAddress.fromString(ipAddress) &&
|
|
||||||
subnetIpAddress.fromString(subnet) &&
|
|
||||||
gatewayIpAddress.fromString(gateway) &&
|
|
||||||
WiFi.localIP() != staticIpAddress
|
|
||||||
) {
|
|
||||||
WiFi.config(staticIpAddress, subnetIpAddress, gatewayIpAddress);
|
|
||||||
Serial.print("STATIC IP address:");
|
|
||||||
Serial.println(WiFi.localIP());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,221 +0,0 @@
|
|||||||
//Includes
|
|
||||||
#include <ESP8266WiFi.h>
|
|
||||||
#include <ESP8266HTTPClient.h>
|
|
||||||
#include <ArduinoJson.h>
|
|
||||||
#include <EEPROM.h>
|
|
||||||
|
|
||||||
//Variables
|
|
||||||
const char* ssid = "ssid";
|
|
||||||
const char* pasw = "pasw";
|
|
||||||
const char* hwId = "hwId";
|
|
||||||
const char* server = "http://dev.steelants.cz/vasek/home/api.php";
|
|
||||||
int unsuccessfulRounds = 0; //Unsucesful atmpt counter
|
|
||||||
StaticJsonDocument<250> jsonContent;
|
|
||||||
bool buttonActive = false;
|
|
||||||
int interuptCount = 0;
|
|
||||||
int realState = 1;
|
|
||||||
int state = 0;
|
|
||||||
String requestJson = "";
|
|
||||||
|
|
||||||
//Pins
|
|
||||||
#define SONOFF 12 //12
|
|
||||||
#define SONOFF_LED 13
|
|
||||||
#define SONOFF_BUT 0 //0
|
|
||||||
|
|
||||||
void ICACHE_RAM_ATTR handleInterrupt ();
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
Serial.begin(9600);
|
|
||||||
EEPROM.begin(1);
|
|
||||||
while (!Serial) continue;
|
|
||||||
delay(10);
|
|
||||||
Serial.println('\n');
|
|
||||||
Serial.println("HW: " + String(hwId));
|
|
||||||
|
|
||||||
pinMode(SONOFF_LED, OUTPUT);
|
|
||||||
pinMode(SONOFF_BUT, INPUT_PULLUP);
|
|
||||||
pinMode(SONOFF, OUTPUT);
|
|
||||||
state = EEPROM.read(0);
|
|
||||||
digitalWrite(SONOFF, state);
|
|
||||||
realState = state;
|
|
||||||
|
|
||||||
attachInterrupt(digitalPinToInterrupt(SONOFF_BUT), handleInterrupt, FALLING);
|
|
||||||
|
|
||||||
|
|
||||||
WiFi.persistent(false);
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
|
|
||||||
WiFi.begin(ssid, pasw);
|
|
||||||
checkConnection();
|
|
||||||
|
|
||||||
Serial.println('\n');
|
|
||||||
Serial.println("Connection established!");
|
|
||||||
Serial.print("IP address:");
|
|
||||||
Serial.println(WiFi.localIP());
|
|
||||||
Serial.print("MAC address:");
|
|
||||||
Serial.println(WiFi.macAddress());
|
|
||||||
|
|
||||||
jsonContent = {};
|
|
||||||
jsonContent["token"] = hwId;
|
|
||||||
jsonContent["values"]["on/off"]["value"] = (String)realState;
|
|
||||||
|
|
||||||
serializeJson(jsonContent, requestJson);
|
|
||||||
Serial.println("JSON: " + requestJson);
|
|
||||||
DeserializationError error = deserializeJson(jsonContent, sendHttpRequest(requestJson));
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
if(unsuccessfulRounds >= 5) {
|
|
||||||
Serial.println("RESTARTING ESP");
|
|
||||||
ESP.restart();
|
|
||||||
}
|
|
||||||
jsonContent = {};
|
|
||||||
jsonContent["token"] = hwId;
|
|
||||||
requestJson = "";
|
|
||||||
if (buttonActive){
|
|
||||||
jsonContent["values"]["on/off"]["value"] = (String)!realState;
|
|
||||||
if (!realState == 1) {
|
|
||||||
digitalWrite(SONOFF, HIGH);
|
|
||||||
realState = 1;
|
|
||||||
} else if (!realState == 0){
|
|
||||||
digitalWrite(SONOFF, LOW);
|
|
||||||
realState = 0;
|
|
||||||
}
|
|
||||||
EEPROM.write(0, 0);
|
|
||||||
EEPROM.commit();
|
|
||||||
serializeJson(jsonContent, requestJson);
|
|
||||||
Serial.println("JSON: " + requestJson);
|
|
||||||
|
|
||||||
//HTTP CLIENT
|
|
||||||
DeserializationError error = deserializeJson(jsonContent, sendHttpRequest(requestJson));
|
|
||||||
buttonActive = false;
|
|
||||||
}
|
|
||||||
jsonContent = {};
|
|
||||||
jsonContent["token"] = hwId;
|
|
||||||
|
|
||||||
requestJson = "";
|
|
||||||
serializeJson(jsonContent, requestJson);
|
|
||||||
Serial.println("JSON: " + requestJson);
|
|
||||||
|
|
||||||
//HTTP CLIENT
|
|
||||||
DeserializationError error = deserializeJson(jsonContent, sendHttpRequest(requestJson));
|
|
||||||
|
|
||||||
if (error) {
|
|
||||||
Serial.println(error.c_str());
|
|
||||||
unsuccessfulRounds++;
|
|
||||||
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//configuration setup
|
|
||||||
String hostName = jsonContent["device"]["hostname"];
|
|
||||||
String ipAddress = jsonContent["device"]["ipAddress"];
|
|
||||||
String gateway = jsonContent["device"]["gateway"];
|
|
||||||
String subnet = jsonContent["device"]["subnet"];
|
|
||||||
String requestState = jsonContent["state"];
|
|
||||||
JsonObject object = jsonContent.as<JsonObject>();
|
|
||||||
if (!object["value"].isNull()) {
|
|
||||||
state = (int)jsonContent["value"];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (requestState != "succes") {
|
|
||||||
unsuccessfulRounds++;
|
|
||||||
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
|
|
||||||
} else if (requestState == "succes") {
|
|
||||||
unsuccessfulRounds = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Set static ip
|
|
||||||
setStaticIp(ipAddress, gateway, subnet);
|
|
||||||
WiFi.hostname(hostName);
|
|
||||||
Serial.println("state: " + (String)state + ", realState: " + (String)realState);
|
|
||||||
if (state != realState){
|
|
||||||
if (state == 1 && realState == 0) {
|
|
||||||
Serial.println("ON state: " + (String)state + ", realState: " + (String)realState);
|
|
||||||
digitalWrite(SONOFF, HIGH); // Turn the LED on by making the voltage LOW
|
|
||||||
realState = 1;
|
|
||||||
} else {
|
|
||||||
Serial.println("OFF");
|
|
||||||
digitalWrite(SONOFF, LOW); // Turn the LED on by making the voltage LOW
|
|
||||||
realState = 0;
|
|
||||||
}
|
|
||||||
EEPROM.write(0, realState);
|
|
||||||
EEPROM.commit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void handleInterrupt() {
|
|
||||||
interuptCount++;
|
|
||||||
buttonActive = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
String sendHttpRequest (String requestJson) {
|
|
||||||
HTTPClient http;
|
|
||||||
http.setReuse(true);
|
|
||||||
http.begin(server);
|
|
||||||
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
|
|
||||||
|
|
||||||
int httpCode = http.POST(requestJson);
|
|
||||||
String payload = http.getString(); //Get the response payload
|
|
||||||
http.end();
|
|
||||||
|
|
||||||
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
|
|
||||||
Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload
|
|
||||||
|
|
||||||
if (httpCode == -1) {
|
|
||||||
unsuccessfulRounds++;
|
|
||||||
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return payload;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool checkConnection() {
|
|
||||||
int count = 0;
|
|
||||||
Serial.print("Waiting for Wi-Fi connection");
|
|
||||||
while ( count < 30 ) {
|
|
||||||
if (buttonActive){
|
|
||||||
if (!realState == 1) {
|
|
||||||
digitalWrite(SONOFF, HIGH);
|
|
||||||
realState = 1;
|
|
||||||
} else if (!realState == 0){
|
|
||||||
digitalWrite(SONOFF, LOW);
|
|
||||||
realState = 0;
|
|
||||||
}
|
|
||||||
EEPROM.write(0, realState);
|
|
||||||
EEPROM.commit();
|
|
||||||
buttonActive = false;
|
|
||||||
}
|
|
||||||
digitalWrite(SONOFF_LED, HIGH);
|
|
||||||
delay(125);
|
|
||||||
digitalWrite(SONOFF_LED, LOW);
|
|
||||||
delay(125);
|
|
||||||
if (WiFi.status() == WL_CONNECTED) {
|
|
||||||
Serial.println();
|
|
||||||
Serial.println("Connected!");
|
|
||||||
digitalWrite(SONOFF_LED, LOW);
|
|
||||||
return (true);
|
|
||||||
}
|
|
||||||
Serial.print(".");
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
Serial.println("Timed out.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setStaticIp(String ipAddress, String subnet, String gateway){
|
|
||||||
//Set static ip
|
|
||||||
IPAddress staticIpAddress;
|
|
||||||
IPAddress subnetIpAddress;
|
|
||||||
IPAddress gatewayIpAddress;
|
|
||||||
|
|
||||||
if (
|
|
||||||
staticIpAddress.fromString(ipAddress) &&
|
|
||||||
subnetIpAddress.fromString(subnet) &&
|
|
||||||
gatewayIpAddress.fromString(gateway) &&
|
|
||||||
WiFi.localIP() != staticIpAddress
|
|
||||||
) {
|
|
||||||
WiFi.config(staticIpAddress, subnetIpAddress, gatewayIpAddress);
|
|
||||||
Serial.print("STATIC IP address:");
|
|
||||||
Serial.println(WiFi.localIP());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,375 +0,0 @@
|
|||||||
//Includes
|
|
||||||
#include <ESP8266WiFi.h>
|
|
||||||
#include <ESP8266WebServer.h>
|
|
||||||
#include <WiFiClientSecure.h>
|
|
||||||
#include <ESP8266HTTPClient.h>
|
|
||||||
#define ARDUINOJSON_DECODE_UNICODE 1
|
|
||||||
#include <ArduinoJson.h>
|
|
||||||
#include <EEPROM.h>
|
|
||||||
#include "ESP8266httpUpdate.h"
|
|
||||||
|
|
||||||
//Variables
|
|
||||||
const char* ssidServer = "";
|
|
||||||
const char* paswServer = "";
|
|
||||||
String ssid = "";
|
|
||||||
String pasw = "";
|
|
||||||
String apiToken = "";
|
|
||||||
const int httpsPort = 443;
|
|
||||||
const char* host = "http://dev.steelants.cz";
|
|
||||||
const char* url = "/vasek/home/api.php";
|
|
||||||
|
|
||||||
const char* fingerprint = "";
|
|
||||||
const char* host2 = "dev.steelants.cz";
|
|
||||||
const char* url2 = "/vasek/home/update.php";
|
|
||||||
|
|
||||||
String content;
|
|
||||||
bool conf = false;
|
|
||||||
bool buttonActive = false;
|
|
||||||
int state = 0;
|
|
||||||
String requestJson = "";
|
|
||||||
int unsuccessfulRounds = 0; //Unsucesful atmpt counter
|
|
||||||
|
|
||||||
ESP8266WebServer server(80);
|
|
||||||
StaticJsonDocument<250> jsonContent;
|
|
||||||
DeserializationError error;
|
|
||||||
|
|
||||||
//Pins
|
|
||||||
#define SONOFF 12
|
|
||||||
#define SONOFF_LED 13
|
|
||||||
#define SONOFF_BUT 0 //0
|
|
||||||
|
|
||||||
void ICACHE_RAM_ATTR handleInterrupt ();
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
Serial.begin(9600);
|
|
||||||
EEPROM.begin(100);
|
|
||||||
while (!Serial) continue;
|
|
||||||
delay(10);
|
|
||||||
|
|
||||||
//read saved data
|
|
||||||
ssid = ReadEeprom(1, 33);
|
|
||||||
pasw = ReadEeprom(33, 65);
|
|
||||||
apiToken = ReadEeprom(65, 97);
|
|
||||||
|
|
||||||
//set pins
|
|
||||||
pinMode(SONOFF_LED, OUTPUT);
|
|
||||||
pinMode(SONOFF_BUT, INPUT_PULLUP);
|
|
||||||
pinMode(SONOFF, OUTPUT);
|
|
||||||
state = EEPROM.read(0);
|
|
||||||
digitalWrite(SONOFF, state);
|
|
||||||
|
|
||||||
attachInterrupt(digitalPinToInterrupt(SONOFF_BUT), handleInterrupt, FALLING);
|
|
||||||
|
|
||||||
//wifi
|
|
||||||
if (ssid != "") {
|
|
||||||
WiFi.disconnect();
|
|
||||||
WiFi.softAPdisconnect(true);
|
|
||||||
WiFi.persistent(false);
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
WiFi.begin(ssid, pasw);
|
|
||||||
conf = wifiVerify(20);
|
|
||||||
if (conf) {
|
|
||||||
configTime(3 * 3600, 0, "pool.ntp.org");
|
|
||||||
WiFiClientSecure client;
|
|
||||||
Serial.print("connecting to ");
|
|
||||||
Serial.println(host2);
|
|
||||||
client.setInsecure();
|
|
||||||
if (!client.connect(host2, httpsPort)) {
|
|
||||||
Serial.println("connection failed");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (client.verify(fingerprint, host2)) {
|
|
||||||
Serial.println("certificate matches");
|
|
||||||
} else {
|
|
||||||
Serial.println("certificate doesn't match");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Serial.print("Starting OTA from: ");
|
|
||||||
Serial.println(url2
|
|
||||||
|
|
||||||
);
|
|
||||||
|
|
||||||
auto ret = ESPhttpUpdate.update(client, host2, 80, url2);
|
|
||||||
delay(500);
|
|
||||||
switch(ret) {
|
|
||||||
case HTTP_UPDATE_FAILED:
|
|
||||||
Serial.printf("HTTP_UPDATE_FAILD Error (%d): %s", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str());
|
|
||||||
Serial.println();
|
|
||||||
Serial.println();
|
|
||||||
Serial.println();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HTTP_UPDATE_NO_UPDATES:
|
|
||||||
Serial.println("HTTP_UPDATE_NO_UPDATES");
|
|
||||||
Serial.println();
|
|
||||||
Serial.println();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HTTP_UPDATE_OK:
|
|
||||||
Serial.println("HTTP_UPDATE_OK");
|
|
||||||
Serial.println();
|
|
||||||
Serial.println();
|
|
||||||
Serial.println();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
delay(500);
|
|
||||||
jsonContent = {};
|
|
||||||
jsonContent["token"] = apiToken;
|
|
||||||
jsonContent["values"]["on/off"]["value"] = (String)state;
|
|
||||||
jsonContent["settings"]["network"]["ip"] = WiFi.localIP().toString();
|
|
||||||
jsonContent["settings"]["network"]["mac"] = WiFi.macAddress();
|
|
||||||
jsonContent["settings"]["firmware_hash"] = ESP.getSketchMD5();
|
|
||||||
sendDataToWeb();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
setupAP();
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
if (conf) {
|
|
||||||
if (unsuccessfulRounds >= 5) {
|
|
||||||
Serial.println("RESTARTING ESP");
|
|
||||||
ESP.restart();
|
|
||||||
}
|
|
||||||
jsonContent = {};
|
|
||||||
jsonContent["token"] = apiToken;
|
|
||||||
requestJson = "";
|
|
||||||
if (buttonActive) {
|
|
||||||
jsonContent["values"]["on/off"]["value"] = (String)state;
|
|
||||||
digitalWrite(SONOFF, state);
|
|
||||||
EEPROM.write(0, state);
|
|
||||||
EEPROM.commit();
|
|
||||||
sendDataToWeb();
|
|
||||||
buttonActive = false;
|
|
||||||
delay(500);
|
|
||||||
} else {
|
|
||||||
sendDataToWeb();
|
|
||||||
loadDataFromWeb();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
server.handleClient();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void handleInterrupt() {
|
|
||||||
buttonActive = true;
|
|
||||||
state = !state;
|
|
||||||
digitalWrite(SONOFF, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool wifiVerify(int t) {
|
|
||||||
int c = 0;
|
|
||||||
Serial.println("Waiting for Wifi to connect to Shelly1");
|
|
||||||
while (c < t) {
|
|
||||||
if (WiFi.status() == WL_CONNECTED) {
|
|
||||||
c = t;
|
|
||||||
Serial.println();
|
|
||||||
Serial.println("Connected!");
|
|
||||||
digitalWrite(SONOFF_LED, HIGH);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (buttonActive == true){
|
|
||||||
digitalWrite(SONOFF, state);
|
|
||||||
EEPROM.write(0, state);
|
|
||||||
EEPROM.commit();
|
|
||||||
buttonActive = false;
|
|
||||||
}
|
|
||||||
digitalWrite(SONOFF_LED, HIGH);
|
|
||||||
delay(125);
|
|
||||||
digitalWrite(SONOFF_LED, LOW);
|
|
||||||
delay(375);
|
|
||||||
Serial.print(WiFi.status());
|
|
||||||
c++;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void loadDataFromWeb() {
|
|
||||||
if (error.code() != DeserializationError::Ok) {
|
|
||||||
Serial.println(error.c_str());
|
|
||||||
unsuccessfulRounds++;
|
|
||||||
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
|
|
||||||
error = DeserializationError::Ok;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//configuration setup
|
|
||||||
String hostName = jsonContent["device"]["hostname"];
|
|
||||||
String requestState = jsonContent["state"];
|
|
||||||
String command = jsonContent["command"];
|
|
||||||
if (!buttonActive) {
|
|
||||||
state = (int)jsonContent["value"];
|
|
||||||
Serial.println("state: " + (String)state);
|
|
||||||
digitalWrite(SONOFF, state);
|
|
||||||
EEPROM.write(0, state);
|
|
||||||
EEPROM.commit();
|
|
||||||
delay(500);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (command == "reset"){
|
|
||||||
ESP.reset();
|
|
||||||
} else if (command == "config") {
|
|
||||||
CleanEeprom();
|
|
||||||
EEPROM.commit();
|
|
||||||
ESP.restart();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (requestState != "succes") {
|
|
||||||
unsuccessfulRounds++;
|
|
||||||
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
|
|
||||||
} else if (requestState == "succes") {
|
|
||||||
unsuccessfulRounds = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
WiFi.hostname(hostName);
|
|
||||||
}
|
|
||||||
|
|
||||||
void sendDataToWeb() {
|
|
||||||
serializeJson(jsonContent, requestJson);
|
|
||||||
Serial.println("JSON: " + requestJson);
|
|
||||||
error = deserializeJson(jsonContent, sendHttpRequest());
|
|
||||||
}
|
|
||||||
|
|
||||||
String sendHttpRequest () {
|
|
||||||
HTTPClient http;
|
|
||||||
http.setReuse(true);
|
|
||||||
Serial.println("HTTP url: " + String(host) + String(url) + ""); //Print HTTP return code
|
|
||||||
http.begin(String(host) + String(url));
|
|
||||||
http.addHeader("Content-Type", "text/plain"); //Specify content-type header
|
|
||||||
Serial.println("HTTP request: " + String(requestJson) + ""); //Print HTTP return code
|
|
||||||
int httpCode = http.POST(requestJson);
|
|
||||||
String payload = http.getString(); //Get the response payload
|
|
||||||
http.end();
|
|
||||||
|
|
||||||
Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code
|
|
||||||
Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload
|
|
||||||
|
|
||||||
if (httpCode == -1) {
|
|
||||||
unsuccessfulRounds++;
|
|
||||||
Serial.println("UNSUCCESSFUL ROUND NUMBER " + String(unsuccessfulRounds) + "FROM 5");
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return payload;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CleanEeprom() {
|
|
||||||
for (int i = 1; i < 100; ++i) {
|
|
||||||
EEPROM.write(i, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void WriteEeprom (String data, int start = 1) {
|
|
||||||
for (int i = 0; i < data.length(); ++i)
|
|
||||||
{
|
|
||||||
EEPROM.write(start + i, data[i]);
|
|
||||||
}
|
|
||||||
EEPROM.commit();
|
|
||||||
}
|
|
||||||
|
|
||||||
String ReadEeprom(int min, int max) {
|
|
||||||
String localString;
|
|
||||||
for (int i = min; i < max; ++i) {
|
|
||||||
localString += char(EEPROM.read(i));
|
|
||||||
}
|
|
||||||
return localString;
|
|
||||||
}
|
|
||||||
|
|
||||||
void createWeb()
|
|
||||||
{
|
|
||||||
server.on("/", []() {
|
|
||||||
if (server.args() == 3) {
|
|
||||||
ssid = server.arg("wifi-ssid");
|
|
||||||
pasw = server.arg("wifi-pasw");
|
|
||||||
apiToken = server.arg("apiToken");
|
|
||||||
if (ssid != "" && pasw != "" && apiToken != "") {
|
|
||||||
CleanEeprom();
|
|
||||||
WriteEeprom(ssid);
|
|
||||||
WriteEeprom(pasw, 33);
|
|
||||||
WriteEeprom(apiToken, 65);
|
|
||||||
server.send(200, "application/json", "Restarting esp");
|
|
||||||
delay(500);
|
|
||||||
ESP.restart();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
content = "<!DOCTYPE HTML><body>";
|
|
||||||
content += "<head><style>";
|
|
||||||
content += "html,body {height: 100%;}";
|
|
||||||
content += "html {display: table;margin: auto;}";
|
|
||||||
content += "body {display: table-cell;vertical-align: middle;}";
|
|
||||||
content += "input {width: 100%;box-sizing: border-box}";
|
|
||||||
content += "</style></head>";
|
|
||||||
content += "<h2>WIFI Configuration</h2>";
|
|
||||||
content += "<h4><b>" + (String)ssidServer + "</b></h4>";
|
|
||||||
content += "<a href='#'>Refresh</a>";
|
|
||||||
content += "<div class=\"wifi-list\">";
|
|
||||||
int n = WiFi.scanNetworks();
|
|
||||||
if (n == 0)
|
|
||||||
content += "<label>No networks found...</label>";
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (int i = 0; i < n; ++i)
|
|
||||||
{
|
|
||||||
content += "<a href=\"#\" onclick=\"fillSSID(this.innerHTML)\">" + WiFi.SSID(i) + "</a><br>";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
content += "</div>";
|
|
||||||
content += "<form method='get' action=''><div class='wifi-form'>";
|
|
||||||
content += "<label>SSID: </label><input name='wifi-ssid' id='wifi-ssid' length=32 type='text'><br>";
|
|
||||||
content += "<label>Heslo: </label><input name='wifi-pasw' length=32 type='password'><br>";
|
|
||||||
content += "<label>Api token: </label><input name='apiToken' length=32 type='password'><br>";
|
|
||||||
content += "<input type='submit' value='Connect'>";
|
|
||||||
content += "</div></form>";
|
|
||||||
content += "<script>";
|
|
||||||
content += "function fillSSID(value) {\r\n";
|
|
||||||
content += "document.getElementById(\"wifi-ssid\").value = value;\r\n";
|
|
||||||
content += "}";
|
|
||||||
content += "</script>";
|
|
||||||
content += "</body>";
|
|
||||||
server.send(200, "text/html", content);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupAP(void) {
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
WiFi.disconnect();
|
|
||||||
WiFi.softAPdisconnect(true);
|
|
||||||
delay(100);
|
|
||||||
int n = WiFi.scanNetworks();
|
|
||||||
Serial.println("scan done");
|
|
||||||
if (n == 0)
|
|
||||||
Serial.println("no networks found");
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Serial.print(n);
|
|
||||||
Serial.println(" networks found");
|
|
||||||
for (int i = 0; i < n; ++i)
|
|
||||||
{
|
|
||||||
// Print SSID and RSSI for each network found
|
|
||||||
Serial.print(i + 1);
|
|
||||||
Serial.print(": ");
|
|
||||||
Serial.print(WiFi.SSID(i));
|
|
||||||
Serial.print(" (");
|
|
||||||
Serial.print(WiFi.RSSI(i));
|
|
||||||
Serial.print(")");
|
|
||||||
Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*");
|
|
||||||
delay(10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
delay(100);
|
|
||||||
WiFi.softAP(ssidServer, paswServer);
|
|
||||||
Serial.println("softap");
|
|
||||||
Serial.println("");
|
|
||||||
Serial.println("WiFi connected");
|
|
||||||
Serial.print("Local IP: ");
|
|
||||||
Serial.println(WiFi.localIP());
|
|
||||||
Serial.print("SoftAP IP: ");
|
|
||||||
Serial.println(WiFi.softAPIP());
|
|
||||||
createWeb();
|
|
||||||
// Start the server
|
|
||||||
server.begin();
|
|
||||||
Serial.println("Server started");
|
|
||||||
Serial.println("over");
|
|
||||||
}
|
|
@ -1,71 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<style>
|
|
||||||
html,
|
|
||||||
body {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
html {
|
|
||||||
display: table;
|
|
||||||
margin: auto;
|
|
||||||
font-family: "Metropolis", sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
display: table-cell;
|
|
||||||
vertical-align: middle;
|
|
||||||
background: #182239;
|
|
||||||
color: #d4def7;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
input {
|
|
||||||
width: 100%;
|
|
||||||
box-sizing: border-box;
|
|
||||||
line-height: 1.5;
|
|
||||||
background: #121a2b;
|
|
||||||
border-radius: 3px;
|
|
||||||
border: 0px solid transparent;
|
|
||||||
color: #d4def7;
|
|
||||||
padding: 0.5em 0.8em;
|
|
||||||
height: 2.5rem;
|
|
||||||
line-height: 1.5;
|
|
||||||
background: #121a2b;
|
|
||||||
width: 100%;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
a{
|
|
||||||
display: block;
|
|
||||||
color: #DDE7F5;
|
|
||||||
text-decoration:underline;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<h2>WIFI Configuration</h2>
|
|
||||||
<a href="#">Refresh</a>
|
|
||||||
<form>
|
|
||||||
<div class="wifi-list">
|
|
||||||
<a href="#" onclick="fillSSID(this.innerHTML)">WifiName</a><br>
|
|
||||||
<a href="#" onclick="fillSSID(this.innerHTML)">WifiName</a><br>
|
|
||||||
<a href="#" onclick="fillSSID(this.innerHTML)">WifiName</a><br>
|
|
||||||
<a href="#" onclick="fillSSID(this.innerHTML)">WifiName</a><br>
|
|
||||||
<a href="#" onclick="fillSSID(this.innerHTML)">WifiName</a><br>
|
|
||||||
<a href="#" onclick="fillSSID(this.innerHTML)">WifiName</a><br>
|
|
||||||
</div>
|
|
||||||
<div class="wifi-form">
|
|
||||||
<input id="wifi-ssid" type="text"><br>
|
|
||||||
<input id="password" type="text"><br>
|
|
||||||
<input type="submit" value="Connect">
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
<script>
|
|
||||||
function fillSSID(value) {
|
|
||||||
document.getElementById("wifi-ssid").value = value;
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
</body>
|
|
@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"folders": []
|
|
||||||
}
|
|
Binary file not shown.
Loading…
Reference in New Issue
Block a user