Compare commits

..

No commits in common. "main" and "v1.13" have entirely different histories.
main ... v1.13

5 changed files with 124 additions and 173 deletions

View File

@ -1,4 +1,4 @@
# ESP-NOW light/led strip controller for ESP8266 # Light/led strip controller for ESP8266
ESP-NOW based light/led strip controller for ESP8266. Alternate firmware for Tuya/SmartLife WiFi light/led strip controllers. ESP-NOW based light/led strip controller for ESP8266. Alternate firmware for Tuya/SmartLife WiFi light/led strip controllers.
@ -28,5 +28,3 @@ See [here](https://github.com/aZholtikov/ESP-NOW-Light-Led-Strip/tree/main/hardw
3. If encryption is used, the key must be set same of all another ESP-NOW devices in network. 3. If encryption is used, the key must be set same of all another ESP-NOW devices in network.
4. Upload the "data" folder (with web interface) into the filesystem before flashing. 4. Upload the "data" folder (with web interface) into the filesystem before flashing.
5. For using this firmware on Tuya/SmartLife WiFi light/led strip controllers, the WiFi module must be replaced with an ESP8266 compatible module (if necessary). 5. For using this firmware on Tuya/SmartLife WiFi light/led strip controllers, the WiFi module must be replaced with an ESP8266 compatible module (if necessary).
Any feedback via [e-mail](mailto:github@zh.com.ru) would be appreciated. Or... [Buy me a coffee](https://paypal.me/aZholtikov).

View File

@ -10,7 +10,7 @@ function createXmlHttpObject() {
function load() { function load() {
if (xmlHttp.readyState == 0 || xmlHttp.readyState == 4) { if (xmlHttp.readyState == 0 || xmlHttp.readyState == 4) {
xmlHttp.open('GET', '/config', true); xmlHttp.open('PUT', '/config.json', true);
xmlHttp.send(null); xmlHttp.send(null);
xmlHttp.onload = function () { xmlHttp.onload = function () {
jsonResponse = JSON.parse(xmlHttp.responseText); jsonResponse = JSON.parse(xmlHttp.responseText);

View File

@ -10,7 +10,7 @@
<body onload="load();"> <body onload="load();">
<form class="box"> <form class="box">
<h1>ESP-NOW Light</h1> <h1>ESP-NOW Light </h1>
<div class="wrapper"> <div class="wrapper">
<p class="text">Firmware:</p> <p class="text">Firmware:</p>
<p class="text" id="version"></p> <p class="text" id="version"></p>

View File

@ -2,26 +2,20 @@
platform = espressif8266 platform = espressif8266
board = esp12e board = esp12e
framework = arduino framework = arduino
build_flags = -D PIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK305
board_build.filesystem = littlefs
board_build.ldscript = eagle.flash.4m1m.ld
lib_deps = lib_deps =
https://github.com/aZholtikov/ZHNetwork https://github.com/aZholtikov/ZHNetwork
https://github.com/aZholtikov/ZHConfig https://github.com/aZholtikov/ZHConfig
https://github.com/aZholtikov/Async-Web-Server bblanchon/ArduinoJson@^6.19.4
https://github.com/bblanchon/ArduinoJson me-no-dev/ESP Async WebServer@^1.2.3
[env:ESP-12E-OTA] [env:ESP-12E-OTA]
platform = espressif8266 platform = espressif8266
board = esp12e board = esp12e
framework = arduino framework = arduino
build_flags = -D PIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK305
board_build.filesystem = littlefs
board_build.ldscript = eagle.flash.4m1m.ld
upload_port = 192.168.4.1 upload_port = 192.168.4.1
upload_protocol = espota upload_protocol = espota
lib_deps = lib_deps =
https://github.com/aZholtikov/ZHNetwork https://github.com/aZholtikov/ZHNetwork
https://github.com/aZholtikov/ZHConfig https://github.com/aZholtikov/ZHConfig
https://github.com/aZholtikov/Async-Web-Server bblanchon/ArduinoJson@^6.19.4
https://github.com/bblanchon/ArduinoJson me-no-dev/ESP Async WebServer@^1.2.3

View File

@ -1,8 +1,6 @@
#include "ArduinoJson.h" #include "ArduinoJson.h"
#include "ArduinoOTA.h" #include "ArduinoOTA.h"
#include "ESPAsyncWebServer.h" // https://github.com/aZholtikov/Async-Web-Server #include "ESPAsyncWebServer.h"
#include "LittleFS.h"
#include "EEPROM.h"
#include "Ticker.h" #include "Ticker.h"
#include "ZHNetwork.h" #include "ZHNetwork.h"
#include "ZHConfig.h" #include "ZHConfig.h"
@ -13,8 +11,6 @@ void onConfirmReceiving(const uint8_t *target, const uint16_t id, const bool sta
void loadConfig(void); void loadConfig(void);
void saveConfig(void); void saveConfig(void);
void loadStatus(void);
void saveStatus(void);
void setupWebServer(void); void setupWebServer(void);
void sendAttributesMessage(void); void sendAttributesMessage(void);
@ -32,23 +28,22 @@ typedef struct
char message[200]{0}; char message[200]{0};
} espnow_message_t; } espnow_message_t;
struct deviceConfig
{
String espnowNetName{"DEFAULT"};
String deviceName = "ESP-NOW light " + String(ESP.getChipId(), HEX);
uint8_t ledType{ENLT_NONE};
uint8_t coldWhitePin{0};
uint8_t warmWhitePin{0};
uint8_t redPin{0};
uint8_t greenPin{0};
uint8_t bluePin{0};
} config;
std::vector<espnow_message_t> espnowMessage; std::vector<espnow_message_t> espnowMessage;
const String firmware{"1.21"}; const String firmware{"1.13"};
String espnowNetName{"DEFAULT"};
String deviceName = "ESP-NOW light " + String(ESP.getChipId(), HEX);
uint8_t ledType{ENLT_NONE};
bool ledStatus{false}; bool ledStatus{false};
uint8_t coldWhitePin{0};
uint8_t warmWhitePin{0};
uint8_t redPin{0};
uint8_t greenPin{0};
uint8_t bluePin{0};
uint8_t brightness{255}; uint8_t brightness{255};
uint16_t temperature{255}; uint16_t temperature{255};
uint8_t red{255}; uint8_t red{255};
@ -59,6 +54,9 @@ bool wasMqttAvailable{false};
uint8_t gatewayMAC[6]{0}; uint8_t gatewayMAC[6]{0};
const String payloadOn{"ON"};
const String payloadOff{"OFF"};
ZHNetwork myNet; ZHNetwork myNet;
AsyncWebServer webServer(80); AsyncWebServer webServer(80);
@ -85,26 +83,25 @@ void setup()
{ {
analogWriteRange(255); analogWriteRange(255);
LittleFS.begin(); SPIFFS.begin();
loadConfig(); loadConfig();
loadStatus();
if (config.coldWhitePin) if (coldWhitePin)
pinMode(config.coldWhitePin, OUTPUT); pinMode(coldWhitePin, OUTPUT);
if (config.warmWhitePin) if (warmWhitePin)
pinMode(config.warmWhitePin, OUTPUT); pinMode(warmWhitePin, OUTPUT);
if (config.redPin) if (redPin)
pinMode(config.redPin, OUTPUT); pinMode(redPin, OUTPUT);
if (config.greenPin) if (greenPin)
pinMode(config.greenPin, OUTPUT); pinMode(greenPin, OUTPUT);
if (config.bluePin) if (bluePin)
pinMode(config.bluePin, OUTPUT); pinMode(bluePin, OUTPUT);
changeLedState(); changeLedState();
WiFi.setSleepMode(WIFI_NONE_SLEEP); WiFi.setSleepMode(WIFI_NONE_SLEEP);
myNet.begin(config.espnowNetName.c_str()); myNet.begin(espnowNetName.c_str());
// myNet.setCryptKey("VERY_LONG_CRYPT_KEY"); // If encryption is used, the key must be set same of all another ESP-NOW devices in network. // myNet.setCryptKey("VERY_LONG_CRYPT_KEY"); // If encryption is used, the key must be set same of all another ESP-NOW devices in network.
myNet.setOnBroadcastReceivingCallback(onBroadcastReceiving); myNet.setOnBroadcastReceivingCallback(onBroadcastReceiving);
@ -147,18 +144,14 @@ void onBroadcastReceiving(const char *data, const uint8_t *sender)
if (myNet.macToString(gatewayMAC) == myNet.macToString(sender) && incomingData.payloadsType == ENPT_KEEP_ALIVE) if (myNet.macToString(gatewayMAC) == myNet.macToString(sender) && incomingData.payloadsType == ENPT_KEEP_ALIVE)
{ {
isGatewayAvailable = true; isGatewayAvailable = true;
DynamicJsonDocument json(sizeof(esp_now_payload_data_t::message)); StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json;
deserializeJson(json, incomingData.message); deserializeJson(json, incomingData.message);
bool temp = json["MQTT"] == "online" ? true : false; bool temp = json["MQTT"] == "online" ? true : false;
if (wasMqttAvailable != temp) if (wasMqttAvailable != temp)
{ {
wasMqttAvailable = temp; wasMqttAvailable = temp;
if (temp) if (temp)
{
sendConfigMessage(); sendConfigMessage();
sendAttributesMessage();
sendStatusMessage();
}
} }
gatewayAvailabilityCheckTimer.once(15, gatewayAvailabilityCheckTimerCallback); gatewayAvailabilityCheckTimer.once(15, gatewayAvailabilityCheckTimerCallback);
} }
@ -170,12 +163,12 @@ void onUnicastReceiving(const char *data, const uint8_t *sender)
memcpy(&incomingData, data, sizeof(esp_now_payload_data_t)); memcpy(&incomingData, data, sizeof(esp_now_payload_data_t));
if (incomingData.deviceType != ENDT_GATEWAY || myNet.macToString(gatewayMAC) != myNet.macToString(sender)) if (incomingData.deviceType != ENDT_GATEWAY || myNet.macToString(gatewayMAC) != myNet.macToString(sender))
return; return;
DynamicJsonDocument json(sizeof(esp_now_payload_data_t::message)); StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json;
if (incomingData.payloadsType == ENPT_SET) if (incomingData.payloadsType == ENPT_SET)
{ {
deserializeJson(json, incomingData.message); deserializeJson(json, incomingData.message);
if (json["set"]) if (json["set"])
ledStatus = json["set"] == "ON" ? true : false; ledStatus = json["set"] == payloadOn ? true : false;
if (json["brightness"]) if (json["brightness"])
brightness = json["brightness"]; brightness = json["brightness"];
if (json["temperature"]) if (json["temperature"])
@ -205,7 +198,6 @@ void onConfirmReceiving(const uint8_t *target, const uint16_t id, const bool sta
{ {
espnow_message_t message = espnowMessage[i]; espnow_message_t message = espnowMessage[i];
if (message.id == id) if (message.id == id)
{
if (status) if (status)
espnowMessage.erase(espnowMessage.begin() + i); espnowMessage.erase(espnowMessage.begin() + i);
else else
@ -213,124 +205,89 @@ void onConfirmReceiving(const uint8_t *target, const uint16_t id, const bool sta
message.id = myNet.sendUnicastMessage(message.message, gatewayMAC, true); message.id = myNet.sendUnicastMessage(message.message, gatewayMAC, true);
espnowMessage.at(i) = message; espnowMessage.at(i) = message;
} }
}
} }
} }
void loadConfig() void loadConfig()
{ {
ETS_GPIO_INTR_DISABLE(); if (!SPIFFS.exists("/config.json"))
EEPROM.begin(4096);
if (EEPROM.read(4095) == 254)
{
EEPROM.get(0, config);
EEPROM.end();
}
else
{
EEPROM.end();
saveConfig(); saveConfig();
} File file = SPIFFS.open("/config.json", "r");
delay(50);
ETS_GPIO_INTR_ENABLE();
}
void saveConfig()
{
ETS_GPIO_INTR_DISABLE();
EEPROM.begin(4096);
EEPROM.write(4095, 254);
EEPROM.put(0, config);
EEPROM.end();
delay(50);
ETS_GPIO_INTR_ENABLE();
}
void loadStatus()
{
ETS_GPIO_INTR_DISABLE();
if (!LittleFS.exists("/status.json"))
saveStatus();
File file = LittleFS.open("/status.json", "r");
String jsonFile = file.readString(); String jsonFile = file.readString();
DynamicJsonDocument json(192); // To calculate the buffer size uses https://arduinojson.org/v6/assistant. StaticJsonDocument<512> json;
deserializeJson(json, jsonFile); deserializeJson(json, jsonFile);
ledStatus = json["status"]; espnowNetName = json["espnowNetName"].as<String>();
deviceName = json["deviceName"].as<String>();
ledType = json["ledType"];
ledStatus = json["ledStatus"];
coldWhitePin = json["coldWhitePin"];
warmWhitePin = json["warmWhitePin"];
redPin = json["redPin"];
greenPin = json["greenPin"];
bluePin = json["bluePin"];
brightness = json["brightness"]; brightness = json["brightness"];
temperature = json["temperature"]; temperature = json["temperature"];
red = json["red"]; red = json["red"];
green = json["green"]; green = json["green"];
blue = json["blue"]; blue = json["blue"];
file.close(); file.close();
delay(50);
ETS_GPIO_INTR_ENABLE();
} }
void saveStatus() void saveConfig()
{ {
ETS_GPIO_INTR_DISABLE(); StaticJsonDocument<512> json;
DynamicJsonDocument json(128); // To calculate the buffer size uses https://arduinojson.org/v6/assistant. json["firmware"] = firmware;
json["status"] = ledStatus; json["espnowNetName"] = espnowNetName;
json["deviceName"] = deviceName;
json["ledType"] = ledType;
json["ledStatus"] = ledStatus;
json["coldWhitePin"] = coldWhitePin;
json["warmWhitePin"] = warmWhitePin;
json["redPin"] = redPin;
json["greenPin"] = greenPin;
json["bluePin"] = bluePin;
json["brightness"] = brightness; json["brightness"] = brightness;
json["temperature"] = temperature; json["temperature"] = temperature;
json["red"] = red; json["red"] = red;
json["green"] = green; json["green"] = green;
json["blue"] = blue; json["blue"] = blue;
json["system"] = "empty"; json["system"] = "empty";
File file = LittleFS.open("/status.json", "w"); File file = SPIFFS.open("/config.json", "w");
serializeJsonPretty(json, file); serializeJsonPretty(json, file);
file.close(); file.close();
delay(50);
ETS_GPIO_INTR_ENABLE();
} }
void setupWebServer() void setupWebServer()
{ {
webServer.on("/", HTTP_GET, [](AsyncWebServerRequest *request) webServer.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
{ request->send(LittleFS, "/index.htm"); }); { request->send(SPIFFS, "/index.htm"); });
webServer.on("/function.js", HTTP_GET, [](AsyncWebServerRequest *request)
{ request->send(LittleFS, "/function.js"); });
webServer.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request)
{ request->send(LittleFS, "/style.css"); });
webServer.on("/setting", HTTP_GET, [](AsyncWebServerRequest *request) webServer.on("/setting", HTTP_GET, [](AsyncWebServerRequest *request)
{ {
config.ledType = request->getParam("ledType")->value().toInt(); ledType = request->getParam("ledType")->value().toInt();
config.coldWhitePin = request->getParam("coldWhitePin")->value().toInt(); coldWhitePin = request->getParam("coldWhitePin")->value().toInt();
config.warmWhitePin = request->getParam("warmWhitePin")->value().toInt(); warmWhitePin = request->getParam("warmWhitePin")->value().toInt();
config.redPin = request->getParam("redPin")->value().toInt(); redPin = request->getParam("redPin")->value().toInt();
config.greenPin = request->getParam("greenPin")->value().toInt(); greenPin = request->getParam("greenPin")->value().toInt();
config.bluePin = request->getParam("bluePin")->value().toInt(); bluePin = request->getParam("bluePin")->value().toInt();
config.deviceName = request->getParam("deviceName")->value(); deviceName = request->getParam("deviceName")->value();
config.espnowNetName = request->getParam("espnowNetName")->value(); espnowNetName = request->getParam("espnowNetName")->value();
request->send(200); request->send(200);
saveConfig(); }); saveConfig(); });
webServer.on("/config", HTTP_GET, [](AsyncWebServerRequest *request)
{
String configJson;
DynamicJsonDocument json(384); // To calculate the buffer size uses https://arduinojson.org/v6/assistant.
json["firmware"] = firmware;
json["espnowNetName"] = config.espnowNetName;
json["deviceName"] = config.deviceName;
json["ledType"] = config.ledType;
json["coldWhitePin"] = config.coldWhitePin;
json["warmWhitePin"] = config.warmWhitePin;
json["redPin"] = config.redPin;
json["greenPin"] = config.greenPin;
json["bluePin"] = config.bluePin;
serializeJsonPretty(json, configJson);
request->send(200, "application/json", configJson); });
webServer.on("/restart", HTTP_GET, [](AsyncWebServerRequest *request) webServer.on("/restart", HTTP_GET, [](AsyncWebServerRequest *request)
{ {
request->send(200); request->send(200);
ESP.restart(); }); ESP.restart(); });
webServer.onNotFound([](AsyncWebServerRequest *request) webServer.onNotFound([](AsyncWebServerRequest *request)
{ request->send(404, "text/plain", "File Not Found"); }); {
if (SPIFFS.exists(request->url()))
request->send(SPIFFS, request->url());
else
{
request->send(404, "text/plain", "File Not Found");
} });
webServer.begin(); webServer.begin();
} }
@ -346,7 +303,7 @@ void sendAttributesMessage()
uint32_t days = hours / 24; uint32_t days = hours / 24;
esp_now_payload_data_t outgoingData{ENDT_LED, ENPT_ATTRIBUTES}; esp_now_payload_data_t outgoingData{ENDT_LED, ENPT_ATTRIBUTES};
espnow_message_t message; espnow_message_t message;
DynamicJsonDocument json(sizeof(esp_now_payload_data_t::message)); StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json;
json["Type"] = "ESP-NOW light"; json["Type"] = "ESP-NOW light";
json["MCU"] = "ESP8266"; json["MCU"] = "ESP8266";
json["MAC"] = myNet.getNodeMac(); json["MAC"] = myNet.getNodeMac();
@ -379,11 +336,13 @@ void sendConfigMessage()
return; return;
esp_now_payload_data_t outgoingData{ENDT_LED, ENPT_CONFIG}; esp_now_payload_data_t outgoingData{ENDT_LED, ENPT_CONFIG};
espnow_message_t message; espnow_message_t message;
DynamicJsonDocument json(sizeof(esp_now_payload_data_t::message)); StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json;
json[MCMT_DEVICE_NAME] = config.deviceName; json["name"] = deviceName;
json[MCMT_DEVICE_UNIT] = 1; json["unit"] = 1;
json[MCMT_COMPONENT_TYPE] = HACT_LIGHT; json["type"] = HACT_LIGHT;
json[MCMT_DEVICE_CLASS] = config.ledType; json["class"] = ledType;
json["payload_on"] = payloadOn;
json["payload_off"] = payloadOff;
serializeJsonPretty(json, outgoingData.message); serializeJsonPretty(json, outgoingData.message);
memcpy(&message.message, &outgoingData, sizeof(esp_now_payload_data_t)); memcpy(&message.message, &outgoingData, sizeof(esp_now_payload_data_t));
message.id = myNet.sendUnicastMessage(message.message, gatewayMAC, true); message.id = myNet.sendUnicastMessage(message.message, gatewayMAC, true);
@ -398,8 +357,8 @@ void sendStatusMessage()
statusMessageTimerSemaphore = false; statusMessageTimerSemaphore = false;
esp_now_payload_data_t outgoingData{ENDT_LED, ENPT_STATE}; esp_now_payload_data_t outgoingData{ENDT_LED, ENPT_STATE};
espnow_message_t message; espnow_message_t message;
DynamicJsonDocument json(sizeof(esp_now_payload_data_t::message)); StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json;
json["state"] = ledStatus ? "ON" : "OFF"; json["state"] = ledStatus ? payloadOn : payloadOff;
json["brightness"] = brightness; json["brightness"] = brightness;
json["temperature"] = temperature; json["temperature"] = temperature;
json["rgb"] = String(red) + "," + String(green) + "," + String(blue); json["rgb"] = String(red) + "," + String(green) + "," + String(blue);
@ -431,61 +390,61 @@ void changeLedState(void)
{ {
if (red == 255 && green == 255 && blue == 255) if (red == 255 && green == 255 && blue == 255)
{ {
if (config.ledType == ENLT_W || config.ledType == ENLT_RGBW) if (ledType == ENLT_W || ledType == ENLT_RGBW)
analogWrite(config.coldWhitePin, brightness); analogWrite(coldWhitePin, brightness);
if (config.ledType == ENLT_WW || config.ledType == ENLT_RGBWW) if (ledType == ENLT_WW || ledType == ENLT_RGBWW)
{ {
analogWrite(config.coldWhitePin, map(brightness, 0, 255, 0, map(temperature, 500, 153, 0, 255))); analogWrite(coldWhitePin, map(brightness, 0, 255, 0, map(temperature, 500, 153, 0, 255)));
analogWrite(config.warmWhitePin, map(brightness, 0, 255, 0, map(temperature, 153, 500, 0, 255))); analogWrite(warmWhitePin, map(brightness, 0, 255, 0, map(temperature, 153, 500, 0, 255)));
} }
if (config.ledType == ENLT_RGB) if (ledType == ENLT_RGB)
{ {
analogWrite(config.redPin, map(red, 0, 255, 0, brightness)); analogWrite(redPin, map(red, 0, 255, 0, brightness));
analogWrite(config.greenPin, map(green, 0, 255, 0, brightness)); analogWrite(greenPin, map(green, 0, 255, 0, brightness));
analogWrite(config.bluePin, map(blue, 0, 255, 0, brightness)); analogWrite(bluePin, map(blue, 0, 255, 0, brightness));
} }
if (config.ledType == ENLT_RGBW || config.ledType == ENLT_RGBWW) if (ledType == ENLT_RGBW || ledType == ENLT_RGBWW)
{ {
digitalWrite(config.redPin, LOW); digitalWrite(redPin, LOW);
digitalWrite(config.greenPin, LOW); digitalWrite(greenPin, LOW);
digitalWrite(config.bluePin, LOW); digitalWrite(bluePin, LOW);
} }
} }
else else
{ {
if (config.ledType == ENLT_W) if (ledType == ENLT_W)
analogWrite(config.coldWhitePin, brightness); analogWrite(coldWhitePin, brightness);
if (config.ledType == ENLT_WW) if (ledType == ENLT_WW)
{ {
analogWrite(config.coldWhitePin, map(brightness, 0, 255, 0, map(temperature, 500, 153, 0, 255))); analogWrite(coldWhitePin, map(brightness, 0, 255, 0, map(temperature, 500, 153, 0, 255)));
analogWrite(config.warmWhitePin, map(brightness, 0, 255, 0, map(temperature, 153, 500, 0, 255))); analogWrite(warmWhitePin, map(brightness, 0, 255, 0, map(temperature, 153, 500, 0, 255)));
} }
if (config.ledType == ENLT_RGBW || config.ledType == ENLT_RGBWW) if (ledType == ENLT_RGBW || ledType == ENLT_RGBWW)
digitalWrite(config.coldWhitePin, LOW); digitalWrite(coldWhitePin, LOW);
if (config.ledType == ENLT_RGBWW) if (ledType == ENLT_RGBWW)
digitalWrite(config.warmWhitePin, LOW); digitalWrite(warmWhitePin, LOW);
if (config.ledType == ENLT_RGB || config.ledType == ENLT_RGBW || config.ledType == ENLT_RGBWW) if (ledType == ENLT_RGB || ledType == ENLT_RGBW || ledType == ENLT_RGBWW)
{ {
analogWrite(config.redPin, map(red, 0, 255, 0, brightness)); analogWrite(redPin, map(red, 0, 255, 0, brightness));
analogWrite(config.greenPin, map(green, 0, 255, 0, brightness)); analogWrite(greenPin, map(green, 0, 255, 0, brightness));
analogWrite(config.bluePin, map(blue, 0, 255, 0, brightness)); analogWrite(bluePin, map(blue, 0, 255, 0, brightness));
} }
} }
} }
else else
{ {
if (config.ledType == ENLT_W || config.ledType == ENLT_WW || config.ledType == ENLT_RGBW || config.ledType == ENLT_RGBWW) if (ledType == ENLT_W || ledType == ENLT_WW || ledType == ENLT_RGBW || ledType == ENLT_RGBWW)
digitalWrite(config.coldWhitePin, LOW); digitalWrite(coldWhitePin, LOW);
if (config.ledType == ENLT_WW || config.ledType == ENLT_RGBWW) if (ledType == ENLT_WW || ledType == ENLT_RGBWW)
digitalWrite(config.warmWhitePin, LOW); digitalWrite(warmWhitePin, LOW);
if (config.ledType == ENLT_RGB || config.ledType == ENLT_RGBW || config.ledType == ENLT_RGBWW) if (ledType == ENLT_RGB || ledType == ENLT_RGBW || ledType == ENLT_RGBWW)
{ {
digitalWrite(config.redPin, LOW); digitalWrite(redPin, LOW);
digitalWrite(config.greenPin, LOW); digitalWrite(greenPin, LOW);
digitalWrite(config.bluePin, LOW); digitalWrite(bluePin, LOW);
} }
} }
saveStatus(); saveConfig();
} }
void gatewayAvailabilityCheckTimerCallback() void gatewayAvailabilityCheckTimerCallback()