Солнышко №5
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1068 lines
57 KiB

#define DEBUG
#include "FastLED.h"
#include "GyverButton.h"
#define VER "5.89"
#include "ESP8266WiFi.h"
#include "PubSubClient.h"
#include <GyverNTP.h>
#include <EEPROM.h>
#include <ESP8266HTTPClient.h>
//#include <WiFiClient.h>
#include "ArduinoJson.h"
#include <GyverPortal.h>
GyverPortal ui;
#define AP_SSID "WT24"
#define AP_PASS "repytwjd"
String ID = "";
const char *mqtt_server = "192.168.121.72"; // Имя сервера MQTT
const int mqtt_port = 1883; // Порт для подключения к серверу MQTT
const char *mqtt_user = "mqtt";
const char *mqtt_pass = "mqtt";
bool valSwitch = false;
int valNum = 2;
bool valLed = false;
String valStr;
// GyverNTP ntp(3);
WiFiClient wclient;
#ifndef DEBUG
IPAddress ipa(192, 168, 121, 161);
#else
IPAddress ipa(192, 168, 121, 166);
#endif
IPAddress server(192,168,121,72);
IPAddress gateway(192, 168, 121, 2);
IPAddress dns(192, 168, 121, 2);
IPAddress subnet(255, 255, 255, 0);
#define BTN_PIN D2
GButton butt1(BTN_PIN, INPUT, HIGH);
StaticJsonDocument<100> parsed;
int value = 0;
volatile bool enable = false;
volatile bool test = false;
byte counter;
#define LED_PIN D4
#define NUM_LEDS 129
#define LED_TYPE WS2812
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
#pragma region Arrays
const byte PROGMEM stage[][129] = {
{105,106,107,108},
{103,104,105,106,107,108,109,110,65,66,67,68},
{101,102,103,104,105,106,107,108,109,110,111,112,63,64,65,66,67,68,69,70,36,37,38},
{16,17,18,34,35,36,37,38,39,40,62,63,64,65,66,67,68,69,70,71,100,101,102,103,104,105,106,107,108,109,110,111,112,113},
{4,5,6,15,16,17,18,19,34,35,36,37,38,39,40,61,62,63,64,65,66,67,68,69,70,71,72,100,101,102,103,104,105,106,107,108,109,110,111,112,113},
{0,3,4,5,6,7,13,14,15,16,17,18,19,20,21,32,33,34,35,36,37,38,39,40,41,42,60,61,62,63,64,65,66,67,68,69,70,71,72,73,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114},
{0,1,2,3,4,5,6,7,8,12,13,14,15,16,17,18,19,20,21,22,31,32,33,34,35,36,37,38,39,40,41,42,43,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115},
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116},
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117},
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118},
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128}
};
const byte l_stage[] = {4,12,23,34,41,56,67,78,91,108,129};
const byte stager[][2] PROGMEM = {{0,0},{1,8},{9,24},{25,48},{49,83},{84,128}};
const byte PROGMEM stagen[][16] = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, //1
{1,2,3,4,5,6,7,8,9,11,13,15,17,19,21,23}, //16
{9,11,13,15,17,19,21,23,25,28,31,34,37,40,43,46}, //16
{25,28,31,34,37,40,43,46,49,54,58,62,67,71,76,80}, //16
{49,54,58,62,67,71,76,80,84,90,95,101,107,112,118,123}, //16
{84,90,95,101,107,112,118,123,123,123,123,123,123,123,123,123} //8
};
const byte l_stagen[] = {1,16,16,16,16,8};
PGM_P s = "<style>body{background-color: #f9e79f;}</style><p><img width='248' height='200' src='data:image/png;base64,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'></p>";
#pragma endregion
#define UPDATES_PER_SECOND 100
#ifndef DEBUG
const char *top_s = "Sunny5/status";
const char *top_c = "Sunny5/config";
const char *topic = "Sunny5/";
#else
const char *top_s = "Sunny5debug/status";
const char *top_c = "Sunny5debug/config";
const char *topic = "Sunny5debug/";
#endif
byte baza = 0;
void btn();
void reconnect();
void mqtt_callback(char* topic, byte* payload, unsigned int length);
void pub_new_set();
int isworkday();
bool allow();
void build();
void action();
PubSubClient mclient(server, 1883, mqtt_callback, wclient);
volatile byte mode = 0;
volatile byte mode2 = 0;
byte vv2 = 0;
uint16_t light = 0;
uint8_t tmp = 0;
String d = String(__DATE__) + " " + String(__TIME__);
String v = VER;
volatile bool enable3 = false;
GPtime valTime_on;
GPtime valTime_off;
GPtime valTime;
Datime dt;
Datime ttt;
String lt = "";
int bri = 250;
bool iswd = false;
bool _allow = false;
byte h_on = 0;
byte m_on = 0;
byte h_off = 0;
byte m_off = 0;
byte rd = 0;
byte vd = 0;
// byte vd = 0;
String clientId = "";
bool flag_one = true;
#pragma region setup
void setup()
{
delay(500); // power-up safety delay
FastLED.clear();
FastLED.show();
FastLED.addLeds <WS2812, LED_PIN, GRB>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(0);
Serial.begin(115200);
randomSeed(analogRead(0));
butt1.setDebounce(20);
for(int i = 0; i < 5; i++)
FastLED.show();
leds[0] = CRGB::Yellow;
FastLED.setBrightness(10);
FastLED.show();
Serial.begin(115200);
Serial.print("\r\n\r\nVersion: ");
Serial.println(v);
Serial.print("Compiled: ");
Serial.println(d);
WiFi.mode(WIFI_STA);
WiFi.config(ipa, gateway, subnet, dns);
WiFi.begin(AP_SSID, AP_PASS);
FastLED.setBrightness(10);
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
leds[0] = CRGB::Red;
FastLED.show();
delay(500);
leds[0] = CRGB::Yellow;
FastLED.show();
delay(500);
}
Serial.println();
Serial.println("WiFi connected");
Serial.print("ip: ");
Serial.println(WiFi.localIP());
ID = "Sunny_05";
Serial.print("Web client ");
Serial.print(ID);
Serial.println(" running.");
clientId = ID + String(random(1000));
if (WiFi.status() == WL_CONNECTED)
{
if (!mclient.connected())
{
Serial.print("Connecting to MQTT server... ");
if (mclient.connect(clientId.c_str(), mqtt_user, mqtt_pass))
{
Serial.println("Connected.");
mclient.subscribe(top_c);
Serial.print("MQTT client ");
Serial.print(clientId);
Serial.println(" running.");
}
else
{
Serial.println("Could not connect to MQTT server");
}
mclient.publish(top_s, "Выключено",true);
valStr = "Выключено";
}
}
leds[0] = CRGB::Green;
FastLED.setBrightness(10);
FastLED.show();
delay(500);
leds[0] = CRGB::Black;
FastLED.setBrightness(10);
FastLED.show();
NTP.onError([]()
{
// Serial.println(NTP.readError());
// Serial.print("online: ");
// Serial.println(NTP.online());
// if (NTP.online() == 0)
// {
// NTP.end();
// NTP.setHost("192.168.121.9");
// NTP.begin(3);
// NTP.updateNow();
// }
});
NTP.onSecond([]()
{
dt = NTP;
valTime.hour = dt.hour;
valTime.minute = dt.minute;
valTime.second = dt.second;
});
NTP.begin(3);
NTP.updateNow();
dt = NTP;
EEPROM.begin(7);
if (EEPROM.read(0) == 255)
{
EEPROM.write(0, 0);
EEPROM.write(1, 0);
EEPROM.write(2, 0);
EEPROM.write(3, 0);
EEPROM.write(4, 1);
EEPROM.write(5, 1);
EEPROM.write(6, 250);
}
h_on = EEPROM.read(0);
m_on = EEPROM.read(1);
h_off = EEPROM.read(2);
m_off = EEPROM.read(3);
rd = EEPROM.read(4);
vd = EEPROM.read(5);
bri = EEPROM.read(6);
valTime_on.hour = EEPROM.read(0);
valTime_on.minute = EEPROM.read(1);
valTime_on.second = 0;
valTime_off.hour = EEPROM.read(2);
valTime_off.minute = EEPROM.read(3);
valTime_off.second = 0;
int ii = isworkday();
if(ii != -1)
{
iswd = ii;
if(iswd == 0)
Serial.println("рабочий день");
else
Serial.println("выходной день");
}
else
iswd = false;
_allow = allow();
ui.attachBuild(build);
ui.attach(action);
ui.start();
ui.enableOTA();
ui.downloadAuto(true);
pub_new_set();
}
char* concat(const char *s1, const char *s2)
{
const size_t len1 = strlen(s1);
const size_t len2 = strlen(s2);
char *result = (char *)malloc(len1 + len2 + 1); // +1 for the null-terminator
// in real code you would check for errors in malloc here
memcpy(result, s1, len1);
memcpy(result + len1, s2, len2 + 1); // +1 to copy the null-terminator
return result;
}
char* newtop(const char *s2)
{
const size_t len2 = strlen(s2);
const size_t len1 = strlen(topic);
char *result = (char *)malloc(len1 + len2 + 1); // +1 for the null-terminator
// in real code you would check for errors in malloc here
memcpy(result, topic, len1);
memcpy(result + len1, s2, len2 + 1); // +1 to copy the null-terminator
return result;
}
void pub_new_set()
{
char s[5] = {0,};
sprintf(s, "%02d:%02d",valTime_on.hour,valTime_on.minute);
mclient.publish(newtop("T_on"), s,true);
sprintf(s, "%02d:%02d",valTime_off.hour,valTime_off.minute);
mclient.publish(newtop("T_off"), s,true);
sprintf(s, "%d",rd);
mclient.publish(newtop("Workday"), s,true);
sprintf(s, "%d",vd);
mclient.publish(newtop("Holyday"), s,true);
sprintf(s, "%03d",bri);
mclient.publish(newtop("Brightness"), s,true);
}
#pragma endregion
void loop()
{
static long dot = 0;
static long update = 0;
static long iwd = 0;
static long voshod = 0;
static long testing = 0;
static byte vvv = 0;
static byte klc = 0;
static byte vv1 = 0;
static byte vv2 = 0;
btn();
if ((millis() - dot) >= 999)
{
lt = String(light);
dt = NTP;
valTime.hour = dt.hour;
valTime.minute = dt.minute;
#ifdef DEBUG
Serial.printf("%02d:%02d:%02d %02d:%02d:%02d %d\r\n", valTime_on.hour,valTime_on.minute,valTime_on.second,dt.hour,dt.minute,dt.second,_allow);
#endif
// if (dt.hour == valTime_on.hour && dt.minute == valTime_on.minute && dt.second == valTime_on.second && _allow)
if (dt.hour == valTime_on.hour && dt.minute == valTime_on.minute && _allow && enable == false)
{
enable = true;
#ifdef DEBUG
Serial.printf("time ON test = %d ena = %d mode = %d %02d:%02d %02d:%02d %d %d %d %d\r\n",test, enable, mode, valTime_on.hour,valTime_on.minute,valTime_off.hour,valTime_off.minute,rd,vd,bri,_allow);
#endif
}
// if (dt.hour == valTime_off.hour && dt.minute == valTime_off.minute && dt.second == valTime_off.second)
if (dt.hour == valTime_off.hour && dt.minute == valTime_off.minute && enable == true)
{
enable = false;
#ifdef DEBUG
Serial.printf("time OFF test = %d ena = %d mode = %d %02d:%02d %02d:%02d %d %d %d %d\r\n",test, enable, mode, valTime_on.hour,valTime_on.minute,valTime_off.hour,valTime_off.minute,rd,vd,bri,_allow);
#endif
}
dot = millis();
}
if ((millis () - update) >= 1000 * 60 * 30)
{
if(int ii = isworkday() != -1)
iswd = ii;
else
iswd = false;
_allow = allow();
update = millis();
}
if((enable) || test)
{
switch (mode)
{
case 0:
if(test)
{
if ((millis () - voshod) >= 40 * 13)
{
if(flag_one)
{
mclient.publish(newtop("status"), "Восход",true);
valStr = "Восход";
flag_one = false;
}
mclient.publish(newtop("status"), "Восход",true);
valStr = "Восход";
voshod2(vvv);
if(vvv++ == 10)
{
vvv = 0;
mode = 1;
voshod = 0;
flag_one = true;
}
voshod = millis();
}
}
else
{
#ifdef DEBUG
if ((millis () - voshod) >= 50 * 13)
#else
if ((millis () - voshod) >= 1000 * 13)
#endif
{
if(flag_one)
{
mclient.publish(newtop("status"), "Восход",true);
valStr = "Восход";
flag_one = false;
}
voshod2(vvv);
if(vvv++ == 10)
{
vvv = 0;
mode = 1;
voshod = 0;
flag_one = true;
}
voshod = millis();
}
}
break;
case 1:
if ((millis() - voshod) >= 100)
{
if(flag_one)
{
mclient.publish(newtop("status"), "Кольца",true);
valStr = "Кольца";
flag_one = false;
}
kolca2(vv1);
if(vv1++ == 26)
{
vv1 = 0;
mode = 2;
voshod = 0;
flag_one = true;
}
voshod = millis();
}
break;
case 2:
if ((millis() - voshod) >= 20)
{
if(flag_one)
{
mclient.publish(newtop("status"), "Циклон 1",true);
valStr = "Циклон 1";
flag_one = false;
}
cyclon(vv1);
if(vv1++ == NUM_LEDS - 1)
{
vv1 = (NUM_LEDS) - 1;
mode = 3;
voshod = 0;
flag_one = true;
}
voshod = millis();
}
break;
case 3:
if ((millis() - voshod) >= 20)
{
if(flag_one)
{
mclient.publish(newtop("status"), "Циклон 2",true);
valStr = "Циклон 2";
flag_one = false;
}
cyclon(vv1);
if(vv1-- == 0)
{
vv1 = 0;
mode = 4;
voshod = 0;
flag_one = true;
}
voshod = millis();
}
break;
case 4:
if ((millis() - voshod) >= 20)
{
if(flag_one)
{
mclient.publish(newtop("status"), "Циклон 1",true);
valStr = "Циклон 1";
flag_one = false;
}
cyclon(vv1);
if(vv1++ == NUM_LEDS - 1)
{
vv1 = (NUM_LEDS) - 1;
mode = 5;
voshod = 0;
flag_one = true;
}
voshod = millis();
}
break;
case 5:
if ((millis() - voshod) >= 20)
{
if(flag_one)
{
mclient.publish(newtop("status"), "Циклон 2",true);
valStr = "Циклон 2";
flag_one = false;
}
cyclon(vv1);
if(vv1-- == 0)
{
vv1 = 0;
mode = 6;
voshod = 0;
flag_one = true;
}
voshod = millis();
}
break;
case 6:
if ((millis() - voshod) >= 30)
{
if(flag_one)
{
mclient.publish(newtop("status"), "Бегунок",true);
valStr = "Бегунок";
flag_one = false;
}
begunok(vv1);
// if(vvv++ == 11)
if(vv1++ == 120)
{
vv1 = 0;
mode = 7;
voshod = 0;
flag_one = true;
}
voshod = millis();
}
break;
case 7:
if ((millis() - voshod) >= 10)
{
if(flag_one)
{
mclient.publish(newtop("status"), "Радуга 1",true);
valStr = "Радуга 1";
flag_one = false;
}
raduga(vv1);
if(vv1++ == 255)
{
vv1 = 0;
mode = 8;
voshod = 0;
flag_one = true;
}
voshod = millis();
}
break;
case 8:
if ((millis() - voshod) >= 100)
{
if(flag_one)
{
mclient.publish(newtop("status"), "Лучи",true);
valStr = "Лучи";
flag_one = false;
}
luchi2(vv1);
// if(vvv++ == 11)
if(vv1++ == 30)
{
vv1 = 0;
mode = 9;
voshod = 0;
flag_one = true;
}
voshod = millis();
}
break;
case 9:
if ((millis() - voshod) >= 10)
{
if(flag_one)
{
mclient.publish(newtop("status"), "Радуга 2",true);
flag_one = false;
valStr = "Радуга 2";
}
raduga(vv1);
if(vv1++ == 255)
{
vv1 = 0;
mode = 10;
voshod = 0;
flag_one = true;
}
voshod = millis();
}
break;
case 10:
if ((millis() - voshod) >= 100)
{
if(flag_one)
{
mclient.publish(newtop("status"), "Кольца 3",true);
valStr = "Кольца 3";
flag_one = false;
}
kolca3(vv1);
if(vv1++ == 26)
{
vv1 = 0;
mode = 1;
voshod = 0;
flag_one = true;
if(test)
{
mode = 0;
test = false;
}
}
voshod = millis();
}
break;
}
}
else
{
if(leds[105] != CRGB::Black || leds[128] != CRGB::Black )
{
#ifdef DEBUG
Serial.printf("test = %d ena = %d ena2 = %d ena3 = %d mode = %d\r\n", test, enable, mode);
#endif
fill_solid(leds, NUM_LEDS, CRGB::Black);
FastLED.show();
FastLED.show();
FastLED.show();
mclient.publish(newtop("status"), "Выключено",true);
valStr = "Выключено";
vvv = 0;
vv1 = 0;
mode = 0;
}
}
delay(1);
}
#pragma region LEDS function
void fadetoblack()
{
for(int i = 0; i < NUM_LEDS; i++)
{
fadeToBlackBy(leds, NUM_LEDS, 10);
FastLED.show();
FastLED.delay(1000 / UPDATES_PER_SECOND);
}
}
void voshod2(int num)
{
for(int c = 0; c < l_stage[num]; c++)
{
byte x = pgm_read_byte(&(stage[num][c]));
leds[x] = HeatColor(num * 13 + 10);
}
FastLED.setBrightness(bri);
FastLED.show();
FastLED.show();
if(leds[105] != HeatColor(num * 13 + 10) && leds[106] != HeatColor(num * 13 + 10))
{
for(int c = 0; c < l_stage[num]; c++)
{
byte x = pgm_read_byte(&(stage[num][c]));
leds[x] = HeatColor(num * 13 + 10);
}
}
}
void kolca2(int num)
{
num = num % 7;
if(num < 6)
{
fill_solid(leds, NUM_LEDS, HeatColor(142));
for(int i = pgm_read_byte_near(&(stager[num][0])); i < pgm_read_byte_near(&(stager[num][1])) + 1; i++)
{
leds[i] = HeatColor(200);
}
}
else
fill_solid(leds, NUM_LEDS, HeatColor(142));
FastLED.setBrightness(bri);
FastLED.show();
FastLED.show();
}
void kolca3(int num)
{
num = num % 7;
if(num < 6)
{
fill_solid(leds, NUM_LEDS, HeatColor(142));
for(int i = pgm_read_byte_near(&(stager[num][0])); i < pgm_read_byte_near(&(stager[num][1])) + 1; i++)
{
leds[i] = HeatColor(200);
}
}
else
fill_solid(leds, NUM_LEDS, HeatColor(142));
FastLED.setBrightness(bri);
fadeToBlackBy(leds, NUM_LEDS, 10);
FastLED.show();
FastLED.show();
}
void luchi2(int num)
{
num = num % 6;
fill_solid(leds, NUM_LEDS, HeatColor(142));
for(int c = 0; c < l_stagen[num]; c++)
{
byte x = pgm_read_byte_near(&(stagen[num][c]));
leds[x] = HeatColor(200);
}
FastLED.setBrightness(bri);
FastLED.show();
FastLED.show();
}
void begunok(int num)
{
int col = 255;
fill_solid(leds, NUM_LEDS, HeatColor(142));
leds[num % 45 + 84] = HeatColor(col);
leds[83 - num % 35] = HeatColor(col);
leds[num % 24 + 25] = HeatColor(col);
leds[24 - num % 16] = HeatColor(col);
leds[num % 8] = HeatColor(col);
FastLED.setBrightness(bri);
FastLED.show();
}
void raduga(int num)
{
for (int i = 0; i < NUM_LEDS; i++ )
{
leds[i] = CHSV(num + i * 2, 255, 255);
}
FastLED.show();
}
void konfetti(int num)
{
fill_solid(leds, NUM_LEDS, HeatColor(0));
for(int ii = 0; ii < num; ii++)
{
fadeToBlackBy(leds, NUM_LEDS, 2);
for (int i = 0; i < 8; i++)
{
leds[beatsin16(i + 7, 0, NUM_LEDS - 1)] |= CHSV(baza+=16, 200, 255);
}
FastLED.setBrightness(bri);
FastLED.show();
delay(20);
}
}
void raduga2(int num)
{
byte gHue = 0;
byte chanceOfGlitter = 100;
if (num == 0)
fill_solid(leds, NUM_LEDS, HeatColor(0));
fill_rainbow( leds, NUM_LEDS, gHue, 2);
if(random8() < chanceOfGlitter)
leds[random16(NUM_LEDS)] += CRGB::White;
gHue++;
FastLED.show();
}
void cyclon3(int num)
{
leds[num] = 0xAAAAAA;
FastLED.show();
leds[num] = CRGB::Black;
leds[num] = CHSV(num, 255, 255);
FastLED.show();
for(int i = 0; i < NUM_LEDS; i++)
leds[i].nscale8(250);
}
void cyclon(int num)
{
leds[num] = CHSV(num, 255, 255);
FastLED.show();
for(int i = 0; i < NUM_LEDS; i++)
leds[i].nscale8(250);
}
#pragma endregion
#pragma region service
void GP_MY_BLOCK()
{
String s;
// s += F("");
// "<img src='http://192.168.121.9/sunny042.png'></p>");
s += F("<style>body{background-color: #f9e79f;}</style><p>");
s += F("<img width='248' height='200' src='data:image/png;base64,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'>");
s += F("</p>");
GP.SEND(s);
}
void GP_MY_BLOCK2()
{
GP.SEND_P(s);
}
void build()
{
GP.BUILD_BEGIN(F("<link rel='icon' href='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAGmSURBVHgBjVNtTsJAEJ3Z1sREIXgCywnkBtgo+ldPAJxAPYFwAuAEwgnEX0bBgDfgBtYTWEETo2zHt1ts+CiGlyxMpzNvZt5siVIgD5kzGWx7yXMve0lroNKcfDrpkt5qSG/3cEZRkEEu90e+EJtUecxUiDlH7neX/a8ACR7paICINonkSThAOaGI3rk0bq4QxCQ7BVLOLbwhAu+I5QXuNk6Ak7Mnoio5vA/SgI8nHU4bwXaj+BqWR+kYItlPOpD7mWCu6yExtiP8s1zMKi+ji5GeETRyoXANgQc20GggUoiHE1qLiPZsaZEwfQSj+HQKPVQjIVwGc42PxvV1BB796C5UN52FtDyGcN2IiC49Xk3GJjQ2EQtoVthBNayTR7A9aNMhJWVynDz7YbhwkaSfKZNWA1gBgn0oXbW6GGhp4XeE2QNocEXTyN7OhECeslgbVZB4blbEpY/hrF2jQcAnkzaS0Q151iYdGq3cOBl71/KKF/6qWFIEScvaysEV10XrLn02aRNgrLeFD6ufuaFNYa72coLd0BzUvwxKQXWnNe+C8sH88y/T07ahJJUsXgAAAABJRU5ErkJggg==' type='image/x-icon' />\n"));
GP.THEME(GP_LIGHT);
GP.UPDATE("sw,led,bri,eff,rst,rd,vd,valTime_off,valTime_on,valTime");
GP.TITLE("Солнышко");
GP.PAGE_TITLE("Солнышко");
GP.ONLINE_CHECK();
GP.HR();
GP_MY_BLOCK2();
GP.HR();
M_BLOCK(
M_BOX(GP.LABEL("Сборка"); GP.LABEL(d, "d", GP_DEFAULT, -5););
M_BOX(GP.LABEL("Версия"); GP.LABEL(v, "v", GP_DEFAULT, -5););
);
M_BLOCK(
M_BOX(GP.LABEL("Включить");GP.SWITCH("sw", enable); GP.LED_GREEN("led", enable););
M_BOX(GP.LABEL("Яркость"); GP.SLIDER("bri", bri, 0, 250, 1, 0, GP_GREEN, 0););
M_BOX(GP.LABEL("Включить&nbsp;&nbsp;"); GP.TIME("valTime_on",valTime_on); );
M_BOX(GP.LABEL("Выключить"); GP.TIME("valTime_off",valTime_off); );
M_BOX(GP.LABEL("Рабочие дни");GP.SWITCH("rd", rd););
M_BOX(GP.LABEL("Выходные дни");GP.SWITCH("vd", vd););
M_BOX(GP.LABEL("Эффект"); GP.TEXT("eff", valStr););
M_BOX(GP.LABEL("Время&nbsp;&nbsp;&nbsp;&nbsp;"); GP.TIME("valTime",valTime); );
);
M_BLOCK(
M_BOX(GP_CENTER, GP.OTA_FIRMWARE("Обновление"););
M_BOX(GP_CENTER, GP.BUTTON_MINI("rst","&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Перезагрузка&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"););
);
GP.BUILD_END();
}
void action()
{
if (ui.update())
{
ui.updateBool("led", enable);
ui.updateBool("sw", enable);
ui.updateString("eff", valStr);
ui.updateTime("valTime", valTime);
ui.updateTime("valTime_off", valTime_off);
}
if (ui.click())
{
if (ui.click("rst"))
{
Serial.println("Reset...");
ESP.reset();
}
if (ui.clickBool("sw", enable))
{
Serial.print("Switch: ");
Serial.println(enable);
}
if (ui.clickInt("bri", bri))
{
Serial.print("Bri: ");
Serial.println(bri);
}
if (ui.clickTime("valTime_off",valTime_off))
{
Serial.printf("on %02d:%02d off %02d:%02d\r\n",valTime_on.hour,valTime_on.minute,valTime_off.hour,valTime_off.minute);
}
if (ui.clickTime("valTime_on",valTime_on))
{
Serial.printf("on %02d:%02d off %02d:%02d\r\n",valTime_on.hour,valTime_on.minute,valTime_off.hour,valTime_off.minute);
Datime d_on, d_off;
d_on.hour = valTime_on.hour;
d_on.minute = valTime_on.minute;
d_off.hour = valTime_off.hour;
d_off.minute = valTime_off.minute;
if(d_off < d_on)
{
d_on.addMinutes(15);
valTime_off.hour = d_on.hour;
valTime_off.minute = d_on.minute;
Serial.printf("on %02d:%02d off %02d:%02d\r\n",valTime_on.hour,valTime_on.minute,valTime_off.hour,valTime_off.minute);
ui.updateTime("valTime_off", valTime_off);
}
}
if (ui.clickBool("rd", rd))
{
Serial.print("rd: ");
Serial.println(rd);
_allow = allow();
}
if (ui.clickBool("vd", vd))
{
Serial.print("vd: ");
Serial.println(vd);
_allow = allow();
}
if (ui.clickInt("bri", bri))
{
Serial.print("bri: ");
Serial.println(bri);
}
EEPROM.write(0, valTime_on.hour);
EEPROM.write(1, valTime_on.minute);
EEPROM.write(2, valTime_off.hour);
EEPROM.write(3, valTime_off.minute);
EEPROM.write(4, rd);
EEPROM.write(5, vd);
EEPROM.write(6, bri);
EEPROM.commit();
if(mclient.connected())
Serial.println("MQTT Connected");
else
Serial.println("MQTT NOT Connected");
pub_new_set();
}
}
void btn()
{
ui.tick();
butt1.tick();
NTP.tick();
if (butt1.isPress())
{
Serial.println("press 0");
if(enable)
{
Serial.println("press 1");
enable = false;
test = false;
#ifdef DEBUG
Serial.printf("test = %d ena = %d mode = %d\r\n", test, enable, mode);
#endif
}
else
{
Serial.println("press 2");
test = true;
#ifdef DEBUG
Serial.printf("test = %d ena = %d mode = %d\r\n", test, enable, mode);
#endif
}
}
mclient.loop();
if(!mclient.connected())
reconnect();
}
void reconnect()
{
mclient.disconnect();
while (!mclient.connected())
{
Serial.print("Attempting MQTT connection...");
if (mclient.connect(clientId.c_str(), mqtt_user, mqtt_pass))
{
Serial.println("connected");
mclient.subscribe(newtop("config"));
}
}
}
void mqtt_callback(char* topic, byte* payload, unsigned int length)
{
payload[length] = 0;
String a = (const char*)payload;
String top = (const char*)topic;
a.toLowerCase();
a.replace("\r","");
a.replace("\n","");
if(top == String(top_c))
{
DeserializationError error = deserializeJson(parsed, a);
if (error)
{
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
else
{
Serial.println(a);
valTime_on.decode(parsed["t_on"]);
valTime_off.decode(parsed["t_off"]);
bri = parsed["bri"];
rd = parsed["rd"];
vd = parsed["vd"];
EEPROM.write(0, valTime_on.hour);
EEPROM.write(1, valTime_on.minute);
EEPROM.write(2, valTime_off.hour);
EEPROM.write(3, valTime_off.minute);
EEPROM.write(4, rd);
EEPROM.write(5, vd);
EEPROM.write(6, bri);
EEPROM.commit();
_allow = allow();
#ifdef DEBUG
Serial.printf("%02d:%02d %02d:%02d %d %d %d %d\r\n", valTime_on.hour,valTime_on.minute,valTime_off.hour,valTime_off.minute,rd,vd,bri,_allow);
#endif
pub_new_set();
}
}
}
bool allow()
{
return (!iswd && rd) || (iswd && vd);
}
int isworkday()
{
if (WiFi.status() == WL_CONNECTED)
{
HTTPClient http;
char buf[8];
Datime dt = NTP;
sprintf(buf, "%04d%02d%02d", dt.year, dt.month, dt.day);
String q = "http://isdayoff.ru/" + String(buf);
String payload = "";
do
{
http.begin(wclient, q.c_str());
int httpCode = http.GET();
if (httpCode > 0)
{
payload = http.getString();
http.end();
// return payload.toInt();
}
// else
// {
// http.end();
// return -1;
// }
} while (payload.length() != 1);
return payload.toInt();
}
else return -1;
// return 1;
}
void reboot()
{
ESP.reset();
}
#pragma endregion