Compare commits
12 Commits
Author | SHA1 | Date |
---|---|---|
Haitem | 599ef47cd9 | |
JonatanRek | c68c051777 | |
JonatanRek | c381261a01 | |
JonatanRek | e39efd9176 | |
JonatanRek | dec5a9083a | |
JonatanRek | a1337d795d | |
JonatanRek | e22d98cf6a | |
JonatanRek | 0593bf09dd | |
JonatanRek | 4f1d2e18fc | |
JonatanRek | 15b0f97971 | |
JonatanRek | 2a33e070b8 | |
JonatanRek | da01823b00 |
|
@ -9,3 +9,5 @@ app/logs/*.log
|
||||||
.vscode/
|
.vscode/
|
||||||
.vscode/sftp.json
|
.vscode/sftp.json
|
||||||
app/updater/*.bin
|
app/updater/*.bin
|
||||||
|
logs/*
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
Login
|
||||||
|
https://dev.steelants.cz/vasek/home/apiFront.php
|
||||||
|
```json
|
||||||
|
{"username":"username","password":"password"}```
|
2
LICENSE
2
LICENSE
|
@ -1,6 +1,6 @@
|
||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2019 JonatanRek
|
Copyright (c) 2019 JonatanRek<gamerclassn7@gamil.com> :)
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
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.
25
api.php
25
api.php
|
@ -19,15 +19,17 @@ $files = array_diff($files, array(
|
||||||
'Ajax.php',
|
'Ajax.php',
|
||||||
));
|
));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
foreach($files as $file) {
|
foreach($files as $file) {
|
||||||
include './app/class/'. $file;
|
include './app/class/'. $file;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Allow acces only wia Curl, Ajax ETC
|
//Allow acces only wia Curl, Ajax ETC
|
||||||
$restAcess = 'XMLHttpRequest' == ( $_SERVER['HTTP_X_REQUESTED_WITH'] ?? '' );
|
/*$restAcess = 'XMLHttpRequest' == ( $_SERVER['HTTP_X_REQUESTED_WITH'] ?? '' );
|
||||||
if (!$restAcess){
|
if (!$restAcess){
|
||||||
header('Location: ./');
|
header('Location: ./');
|
||||||
}
|
}*/
|
||||||
|
|
||||||
//Log
|
//Log
|
||||||
$logManager = new LogManager();
|
$logManager = new LogManager();
|
||||||
|
@ -126,19 +128,23 @@ if ($token == null || $token == "") {
|
||||||
|
|
||||||
//Vstupní Checky
|
//Vstupní Checky
|
||||||
if (!DeviceManager::registeret($token)) {
|
if (!DeviceManager::registeret($token)) {
|
||||||
|
//Notification data setup
|
||||||
$notificationMng = new NotificationManager;
|
$notificationMng = new NotificationManager;
|
||||||
$notificationData = [];
|
|
||||||
$notificationData = [
|
$notificationData = [
|
||||||
'title' => 'Info',
|
'title' => 'Info',
|
||||||
'body' => 'New device Detected Found',
|
'body' => 'New device Detected Found',
|
||||||
'icon' => BASEDIR . '/app/templates/images/icon-192x192.png',
|
'icon' => BASEDIR . '/app/templates/images/icon-192x192.png',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
//Subdevice Registration
|
||||||
$deviceId = DeviceManager::create($token, $token);
|
$deviceId = DeviceManager::create($token, $token);
|
||||||
foreach ($values as $key => $value) {
|
foreach ($values as $key => $value) {
|
||||||
if (!SubDeviceManager::getSubDeviceByMaster($deviceId, $key)) {
|
if (!SubDeviceManager::getSubDeviceByMaster($deviceId, $key)) {
|
||||||
SubDeviceManager::create($deviceId, $key, UNITS[$key]);
|
SubDeviceManager::create($deviceId, $key, UNITS[$key]);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Notification for newly added Device
|
||||||
if ($notificationData != []) {
|
if ($notificationData != []) {
|
||||||
$subscribers = $notificationMng::getSubscription();
|
$subscribers = $notificationMng::getSubscription();
|
||||||
foreach ($subscribers as $key => $subscriber) {
|
foreach ($subscribers as $key => $subscriber) {
|
||||||
|
@ -146,14 +152,6 @@ if (!DeviceManager::registeret($token)) {
|
||||||
$notificationMng::sendSimpleNotification(SERVERKEY, $subscriber['token'], $notificationData);
|
$notificationMng::sendSimpleNotification(SERVERKEY, $subscriber['token'], $notificationData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
//Notification for newly added Device
|
|
||||||
$subscribers = $notificationMng::getSubscription();
|
|
||||||
foreach ($subscribers as $key => $subscriber) {
|
|
||||||
$logManager->write("[NOTIFICATION] SENDING TO" . $subscriber['id'] . " ", LogRecordType::INFO);
|
|
||||||
$notificationMng::sendSimpleNotification(SERVERKEY, $subscriber['token'], $notificationData);
|
|
||||||
}
|
|
||||||
|
|
||||||
header($_SERVER["SERVER_PROTOCOL"]." 401 Unauthorized");
|
header($_SERVER["SERVER_PROTOCOL"]." 401 Unauthorized");
|
||||||
echo json_encode(array(
|
echo json_encode(array(
|
||||||
|
@ -219,6 +217,11 @@ if ($deviceLogs != null && $deviceLogs != ""){
|
||||||
die();
|
die();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
if (count($values) == 1){
|
||||||
|
unset($values["wifi"]);
|
||||||
|
}
|
||||||
// Subdevices first data!
|
// Subdevices first data!
|
||||||
if ($values != null && $values != "") {
|
if ($values != null && $values != "") {
|
||||||
|
|
||||||
|
|
59
apiFront.php
59
apiFront.php
|
@ -38,6 +38,61 @@ if (API_DEBUGMOD == 1) {
|
||||||
$apiLogManager->write("[API] request body\n" . json_encode($obj, JSON_PRETTY_PRINT), LogRecordType::INFO);
|
$apiLogManager->write("[API] request body\n" . json_encode($obj, JSON_PRETTY_PRINT), LogRecordType::INFO);
|
||||||
}
|
}
|
||||||
|
|
||||||
unset($logManager);
|
$apiManager = new ApiManager();
|
||||||
Db::disconect();
|
echo $apiManager->generateToken($obj['username'],$obj['password']);
|
||||||
die();
|
die();
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (
|
||||||
|
isset($obj['username']) &&
|
||||||
|
$obj['username'] != '' &&
|
||||||
|
isset($obj['password']) &&
|
||||||
|
$obj['password'] != ''
|
||||||
|
){
|
||||||
|
$ota = false;
|
||||||
|
$userName = $_POST['username'];
|
||||||
|
$userPassword = $_POST['password'];
|
||||||
|
$rememberMe = (isset ($_POST['remember']) ? $_POST['remember'] : "");
|
||||||
|
$ota = $userManager->haveOtaEnabled($userName);
|
||||||
|
if ($ota == "") {
|
||||||
|
$landingPage = $userManager->login($userName, $userPassword, $rememberMe);
|
||||||
|
header('Location: ' . BASEDIR . $landingPage);
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
$_SESSION['USERNAME'] = $userName;
|
||||||
|
$_SESSION['PASSWORD'] = $userPassword;
|
||||||
|
$_SESSION['REMEMBER'] = $rememberMe;
|
||||||
|
$_SESSION['OTA'] = $ota;
|
||||||
|
} else if (
|
||||||
|
isset($_POST['otaCode']) &&
|
||||||
|
$_POST['otaCode'] != ''
|
||||||
|
) {
|
||||||
|
|
||||||
|
$otaCode = $_POST['otaCode'];
|
||||||
|
$otaSecret = $_POST['otaSecret'];
|
||||||
|
|
||||||
|
$ga = new PHPGangsta_GoogleAuthenticator();
|
||||||
|
$ota = $_SESSION['OTA'];
|
||||||
|
$userName = $_SESSION['USERNAME'];
|
||||||
|
$userPassword = $_SESSION['PASSWORD'];
|
||||||
|
$rememberMe = $_SESSION['REMEMBER'];
|
||||||
|
unset($_SESSION['OTA']);
|
||||||
|
$checkResult = $ga->verifyCode($otaSecret, $otaCode, 2); // 2 = 2*30sec clock tolerance
|
||||||
|
if ($checkResult) {
|
||||||
|
$landingPage = $userManager->login($userName, $userPassword, $rememberMe);
|
||||||
|
header('Location: ' . BASEDIR . $landingPage);
|
||||||
|
echo 'OK';
|
||||||
|
} else {
|
||||||
|
echo 'FAILED';
|
||||||
|
}
|
||||||
|
//TODO: upravi a ověřit jeslti ja zabezpečené
|
||||||
|
//TODO:
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*unset($logManager);
|
||||||
|
Db::disconect();
|
||||||
|
die();*/
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
class ApiManager {
|
||||||
|
public function generateToken($username, $password){
|
||||||
|
$userManager = new UserManager();
|
||||||
|
if ($username != '' || $password != ''){
|
||||||
|
$userLogedIn = $userManager->loginNew($username, $password);
|
||||||
|
|
||||||
|
if ($userLogedIn != false){
|
||||||
|
// Create token header as a JSON string
|
||||||
|
$header = json_encode(['typ' => 'JWT', 'alg' => 'HS256']);
|
||||||
|
// Create token payload as a JSON string
|
||||||
|
$payload = json_encode(['user_id' => $userLogedIn]);
|
||||||
|
// Encode Header to Base64Url String
|
||||||
|
$base64UrlHeader = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($header));
|
||||||
|
// Encode Payload to Base64Url String
|
||||||
|
$base64UrlPayload = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($payload));
|
||||||
|
// Create Signature Hash
|
||||||
|
$signature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, 'abC123!', true);
|
||||||
|
// Encode Signature to Base64Url String
|
||||||
|
$base64UrlSignature = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($signature));
|
||||||
|
// Create JWT
|
||||||
|
$jwt = $base64UrlHeader . "." . $base64UrlPayload . "." . $base64UrlSignature;
|
||||||
|
|
||||||
|
return $jwt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -76,7 +76,7 @@ class Notification
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->jsonPayload["data"]["notification"]["title"] = $title;
|
$this->jsonPayload["data"]["notification"]["title"] = $title;
|
||||||
$this->jsonPayload["data"]["notification"]["body"] = $body;
|
$this->jsonPayload["data"]["notification"]["body"] = date("h:i") . " - " . $body;
|
||||||
$this->jsonPayload["data"]["notification"]["icon"] = $icon;
|
$this->jsonPayload["data"]["notification"]["icon"] = $icon;
|
||||||
$this->jsonPayload["data"]["notification"]["click_action"] = $action;
|
$this->jsonPayload["data"]["notification"]["click_action"] = $action;
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,6 +65,24 @@ class UserManager
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function loginNew ($username, $password) {
|
||||||
|
try {
|
||||||
|
if ($user = Db::loadOne ('SELECT * FROM users WHERE LOWER(username)=LOWER(?)', array ($username))) {
|
||||||
|
if ($user['password'] == UserManager::getHashPassword($password)) {
|
||||||
|
echo "user loged in";
|
||||||
|
return $user['user_id'];
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} catch(PDOException $error) {
|
||||||
|
echo $error->getMessage();
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function isLogin () {
|
public function isLogin () {
|
||||||
if (isset ($_SESSION['user']) && isset($_SESSION['user']['id'])) {
|
if (isset ($_SESSION['user']) && isset($_SESSION['user']['id'])) {
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -13,6 +13,11 @@ if (isset($_POST) && !empty($_POST)){
|
||||||
UserManager::createUser($userName, $password);
|
UserManager::createUser($userName, $password);
|
||||||
header('Location: ' . BASEDIR . 'setting');
|
header('Location: ' . BASEDIR . 'setting');
|
||||||
die();
|
die();
|
||||||
|
} else if (isset($_POST['submitCreateRoom']) && $_POST['submitCreateRoom'] != "") {
|
||||||
|
$roomName = $_POST['roomName'];
|
||||||
|
RoomManager::create($roomName);
|
||||||
|
header('Location: ' . BASEDIR . 'setting');
|
||||||
|
die();
|
||||||
} else if (isset($_POST['submitEnableOta']) && $_POST['submitEnableOta'] != "") {
|
} else if (isset($_POST['submitEnableOta']) && $_POST['submitEnableOta'] != "") {
|
||||||
echo $otaCode = $_POST['otaCode'];
|
echo $otaCode = $_POST['otaCode'];
|
||||||
echo $otaSecret = $_POST['otaSecret'];
|
echo $otaSecret = $_POST['otaSecret'];
|
||||||
|
|
|
@ -85,5 +85,23 @@
|
||||||
$partial = new Partial('footer');
|
$partial = new Partial('footer');
|
||||||
$partial->render();
|
$partial->render();
|
||||||
?>
|
?>
|
||||||
|
<script>
|
||||||
|
$(document).on('keyup mouseup', '#value_control', function(event) {
|
||||||
|
$.ajax({
|
||||||
|
url: 'ajax',
|
||||||
|
type: 'POST',
|
||||||
|
//TODO: GET Attribute from ID
|
||||||
|
data: { subDevice_id : '13', action : 'set', value: this.value},
|
||||||
|
success: function(msg){
|
||||||
|
console.log("message");
|
||||||
|
console.log(msg);
|
||||||
|
},
|
||||||
|
error: function (request, status, error) {
|
||||||
|
console.log('0');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
console.log(this.value);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -5,6 +5,7 @@ function ajaxPostSimple(path, params, reload = false) {
|
||||||
type: 'POST',
|
type: 'POST',
|
||||||
data: params,
|
data: params,
|
||||||
success: function(msg){
|
success: function(msg){
|
||||||
|
console.log("message");
|
||||||
console.log(msg);
|
console.log(msg);
|
||||||
if (reload){
|
if (reload){
|
||||||
location.reload();
|
location.reload();
|
||||||
|
|
|
@ -15,7 +15,17 @@ if ($SUBDEVICE['type'] == 'on/off') {
|
||||||
<h5 unselectable="on" class="fa">&#x<?php echo $DEVICE['icon'] ?></h5>
|
<h5 unselectable="on" class="fa">&#x<?php echo $DEVICE['icon'] ?></h5>
|
||||||
</div>
|
</div>
|
||||||
<div class="col">
|
<div class="col">
|
||||||
|
<?php if ($SUBDEVICE['type'] == 'temp_cont') { ?>
|
||||||
|
<input type="number" step="5" class="device-button-value text-right" id="value_control" value="<?php echo $SUBDEVICE['lastRecort']['value'] ?>"><?php echo $SUBDEVICE['unit']?>
|
||||||
|
<style>
|
||||||
|
input.device-button-value.text-right {
|
||||||
|
width: inherit;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<?php } else { ?>
|
||||||
<h5 unselectable="on" class="device-button-value text-right" title="<?php echo $SUBDEVICE['lastRecort']['time']; ?>"><?php echo $SUBDEVICE['lastRecort']['value'] . $SUBDEVICE['unit']?></h5>
|
<h5 unselectable="on" class="device-button-value text-right" title="<?php echo $SUBDEVICE['lastRecort']['time']; ?>"><?php echo $SUBDEVICE['lastRecort']['value'] . $SUBDEVICE['unit']?></h5>
|
||||||
|
<?php } ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|
|
@ -183,7 +183,7 @@
|
||||||
<input type="text" class="input" name="roomName" value="">
|
<input type="text" class="input" name="roomName" value="">
|
||||||
</div>
|
</div>
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<input type="submit" name="submitCreateUser" class="button" value="<?php $LANGMNG->echo('b_create') ?>">
|
<input type="submit" name="submitCreateRoom" class="button" value="<?php $LANGMNG->echo('b_create') ?>">
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -84,6 +84,14 @@ class Ajax extends Template
|
||||||
die();
|
die();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'set':
|
||||||
|
$value = $_POST['value'];
|
||||||
|
$subDevice = SubDeviceManager::getSubDevice($subDeviceId);
|
||||||
|
RecordManager::create($subDevice['device_id'], $subDevice['type'], $value);
|
||||||
|
echo 'test id' . $subDevice['device_id'] .$subDevice['type'] . $value ;
|
||||||
|
die();
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
echo 'no action detected';
|
echo 'no action detected';
|
||||||
break;
|
break;
|
||||||
|
@ -125,7 +133,6 @@ class Ajax extends Template
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'sendTest':
|
case 'sendTest':
|
||||||
echo "test";
|
|
||||||
$notificationData = [
|
$notificationData = [
|
||||||
'title' => 'Alert',
|
'title' => 'Alert',
|
||||||
'body' => 'test notification',
|
'body' => 'test notification',
|
||||||
|
|
Loading…
Reference in New Issue