mirror of
https://github.com/wled/WLED.git
synced 2025-07-10 20:36:32 +00:00
Updated Espalexa to 2.4.2
Added UDP realtime 255 as keep state until changed Added "true" and "false" MQTT payloads
This commit is contained in:
parent
3ffb40fafa
commit
b03ff9a48a
@ -10,7 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* @title Espalexa library
|
* @title Espalexa library
|
||||||
* @version 2.4.0
|
* @version 2.4.2
|
||||||
* @author Christian Schwinne
|
* @author Christian Schwinne
|
||||||
* @license MIT
|
* @license MIT
|
||||||
* @contributors d-999
|
* @contributors d-999
|
||||||
@ -49,7 +49,7 @@
|
|||||||
#include <WiFiUdp.h>
|
#include <WiFiUdp.h>
|
||||||
|
|
||||||
#ifdef ESPALEXA_DEBUG
|
#ifdef ESPALEXA_DEBUG
|
||||||
#pragma message "Espalexa 2.4.0 debug mode"
|
#pragma message "Espalexa 2.4.2 debug mode"
|
||||||
#define EA_DEBUG(x) Serial.print (x)
|
#define EA_DEBUG(x) Serial.print (x)
|
||||||
#define EA_DEBUGLN(x) Serial.println (x)
|
#define EA_DEBUGLN(x) Serial.println (x)
|
||||||
#else
|
#else
|
||||||
@ -118,7 +118,7 @@ private:
|
|||||||
case EspalexaDeviceType::color: return "LST001";
|
case EspalexaDeviceType::color: return "LST001";
|
||||||
case EspalexaDeviceType::extendedcolor: return "LCT015";
|
case EspalexaDeviceType::extendedcolor: return "LCT015";
|
||||||
}
|
}
|
||||||
return "Plug 01";
|
return "Plug";
|
||||||
}
|
}
|
||||||
|
|
||||||
//device JSON string: color+temperature device emulates LCT015, dimmable device LWB010, (TODO: on/off Plug 01, color temperature device LWT010, color device LST001)
|
//device JSON string: color+temperature device emulates LCT015, dimmable device LWB010, (TODO: on/off Plug 01, color temperature device LWT010, color device LST001)
|
||||||
@ -148,9 +148,9 @@ private:
|
|||||||
json += "\"type\":\"" + typeString(dev->getType());
|
json += "\"type\":\"" + typeString(dev->getType());
|
||||||
json += "\",\"name\":\"" + dev->getName();
|
json += "\",\"name\":\"" + dev->getName();
|
||||||
json += "\",\"modelid\":\"" + modelidString(dev->getType());
|
json += "\",\"modelid\":\"" + modelidString(dev->getType());
|
||||||
json += "\",\"manufacturername\":\"Espalexa\",\"productname\":\"E" + String(static_cast<uint8_t>(dev->getType()));
|
json += "\",\"manufacturername\":\"Philips\",\"productname\":\"E" + String(static_cast<uint8_t>(dev->getType()));
|
||||||
json += "\",\"uniqueid\":\""+ WiFi.macAddress() +"-"+ (deviceId+1);
|
json += "\",\"uniqueid\":\""+ WiFi.macAddress() +"-"+ (deviceId+1);
|
||||||
json += "\",\"swversion\":\"2.4.0\"}";
|
json += "\",\"swversion\":\"espalexa-2.4.2\"}";
|
||||||
|
|
||||||
return json;
|
return json;
|
||||||
}
|
}
|
||||||
@ -174,7 +174,7 @@ private:
|
|||||||
}
|
}
|
||||||
res += "\r\nFree Heap: " + (String)ESP.getFreeHeap();
|
res += "\r\nFree Heap: " + (String)ESP.getFreeHeap();
|
||||||
res += "\r\nUptime: " + (String)millis();
|
res += "\r\nUptime: " + (String)millis();
|
||||||
res += "\r\n\r\nEspalexa library v2.4.0 by Christian Schwinne 2019";
|
res += "\r\n\r\nEspalexa library v2.4.2 by Christian Schwinne 2019";
|
||||||
server->send(200, "text/plain", res);
|
server->send(200, "text/plain", res);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -386,7 +386,7 @@ public:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//deprecated brightness-only callback
|
//brightness-only callback
|
||||||
bool addDevice(String deviceName, BrightnessCallbackFunction callback, uint8_t initialValue = 0)
|
bool addDevice(String deviceName, BrightnessCallbackFunction callback, uint8_t initialValue = 0)
|
||||||
{
|
{
|
||||||
EA_DEBUG("Constructing device ");
|
EA_DEBUG("Constructing device ");
|
||||||
@ -395,6 +395,17 @@ public:
|
|||||||
EspalexaDevice* d = new EspalexaDevice(deviceName, callback, initialValue);
|
EspalexaDevice* d = new EspalexaDevice(deviceName, callback, initialValue);
|
||||||
return addDevice(d);
|
return addDevice(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//brightness-only callback
|
||||||
|
bool addDevice(String deviceName, ColorCallbackFunction callback, uint8_t initialValue = 0)
|
||||||
|
{
|
||||||
|
EA_DEBUG("Constructing device ");
|
||||||
|
EA_DEBUGLN((currentDeviceCount+1));
|
||||||
|
if (currentDeviceCount >= ESPALEXA_MAXDEVICES) return false;
|
||||||
|
EspalexaDevice* d = new EspalexaDevice(deviceName, callback, initialValue);
|
||||||
|
return addDevice(d);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool addDevice(String deviceName, DeviceCallbackFunction callback, EspalexaDeviceType t = EspalexaDeviceType::dimmable, uint8_t initialValue = 0)
|
bool addDevice(String deviceName, DeviceCallbackFunction callback, EspalexaDeviceType t = EspalexaDeviceType::dimmable, uint8_t initialValue = 0)
|
||||||
{
|
{
|
||||||
@ -546,6 +557,13 @@ public:
|
|||||||
return escapedMac;
|
return escapedMac;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//convert brightness (0-255) to percentage
|
||||||
|
uint8_t toPercent(uint8_t bri)
|
||||||
|
{
|
||||||
|
uint16_t perc = bri * 100;
|
||||||
|
return perc / 255;
|
||||||
|
}
|
||||||
|
|
||||||
~Espalexa(){delete devices;} //note: Espalexa is NOT meant to be destructed
|
~Espalexa(){delete devices;} //note: Espalexa is NOT meant to be destructed
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
EspalexaDevice::EspalexaDevice(){}
|
EspalexaDevice::EspalexaDevice(){}
|
||||||
|
|
||||||
EspalexaDevice::EspalexaDevice(String deviceName, BrightnessCallbackFunction gnCallback, uint8_t initialValue) { //constructor
|
EspalexaDevice::EspalexaDevice(String deviceName, BrightnessCallbackFunction gnCallback, uint8_t initialValue) { //constructor for dimmable device
|
||||||
|
|
||||||
_deviceName = deviceName;
|
_deviceName = deviceName;
|
||||||
_callback = gnCallback;
|
_callback = gnCallback;
|
||||||
@ -13,12 +13,21 @@ EspalexaDevice::EspalexaDevice(String deviceName, BrightnessCallbackFunction gnC
|
|||||||
_type = EspalexaDeviceType::dimmable;
|
_type = EspalexaDeviceType::dimmable;
|
||||||
}
|
}
|
||||||
|
|
||||||
EspalexaDevice::EspalexaDevice(String deviceName, DeviceCallbackFunction gnCallback, EspalexaDeviceType t, uint8_t initialValue) { //constructor for color device
|
EspalexaDevice::EspalexaDevice(String deviceName, ColorCallbackFunction gnCallback, uint8_t initialValue) { //constructor for color device
|
||||||
|
|
||||||
|
_deviceName = deviceName;
|
||||||
|
_callbackCol = gnCallback;
|
||||||
|
_val = initialValue;
|
||||||
|
_val_last = _val;
|
||||||
|
_type = EspalexaDeviceType::extendedcolor;
|
||||||
|
}
|
||||||
|
|
||||||
|
EspalexaDevice::EspalexaDevice(String deviceName, DeviceCallbackFunction gnCallback, EspalexaDeviceType t, uint8_t initialValue) { //constructor for general device
|
||||||
|
|
||||||
_deviceName = deviceName;
|
_deviceName = deviceName;
|
||||||
_callbackDev = gnCallback;
|
_callbackDev = gnCallback;
|
||||||
_callback = nullptr;
|
|
||||||
_type = t;
|
_type = t;
|
||||||
|
if (t == EspalexaDeviceType::onoff) _type = EspalexaDeviceType::dimmable; //on/off is broken, so make dimmable device instead
|
||||||
_val = initialValue;
|
_val = initialValue;
|
||||||
_val_last = _val;
|
_val_last = _val;
|
||||||
}
|
}
|
||||||
@ -305,5 +314,7 @@ void EspalexaDevice::setColor(uint8_t r, uint8_t g, uint8_t b)
|
|||||||
|
|
||||||
void EspalexaDevice::doCallback()
|
void EspalexaDevice::doCallback()
|
||||||
{
|
{
|
||||||
(_callback != nullptr) ? _callback(_val) : _callbackDev(this);
|
if (_callback != nullptr) {_callback(_val); return;}
|
||||||
|
if (_callbackDev != nullptr) {_callbackDev(this); return;}
|
||||||
|
if (_callbackCol != nullptr) _callbackCol(_val, getRGB());
|
||||||
}
|
}
|
@ -7,6 +7,7 @@ typedef class EspalexaDevice;
|
|||||||
|
|
||||||
typedef void (*BrightnessCallbackFunction) (uint8_t b);
|
typedef void (*BrightnessCallbackFunction) (uint8_t b);
|
||||||
typedef void (*DeviceCallbackFunction) (EspalexaDevice* d);
|
typedef void (*DeviceCallbackFunction) (EspalexaDevice* d);
|
||||||
|
typedef void (*ColorCallbackFunction) (uint8_t br, uint32_t col);
|
||||||
|
|
||||||
enum class EspalexaColorMode : uint8_t { none = 0, ct = 1, hs = 2, xy = 3 };
|
enum class EspalexaColorMode : uint8_t { none = 0, ct = 1, hs = 2, xy = 3 };
|
||||||
enum class EspalexaDeviceType : uint8_t { onoff = 0, dimmable = 1, whitespectrum = 2, color = 3, extendedcolor = 4 };
|
enum class EspalexaDeviceType : uint8_t { onoff = 0, dimmable = 1, whitespectrum = 2, color = 3, extendedcolor = 4 };
|
||||||
@ -15,22 +16,24 @@ enum class EspalexaDeviceProperty : uint8_t { none = 0, on = 1, off = 2, bri = 3
|
|||||||
class EspalexaDevice {
|
class EspalexaDevice {
|
||||||
private:
|
private:
|
||||||
String _deviceName;
|
String _deviceName;
|
||||||
BrightnessCallbackFunction _callback;
|
BrightnessCallbackFunction _callback = nullptr;
|
||||||
DeviceCallbackFunction _callbackDev;
|
DeviceCallbackFunction _callbackDev = nullptr;
|
||||||
|
ColorCallbackFunction _callbackCol = nullptr;
|
||||||
uint8_t _val, _val_last, _sat = 0;
|
uint8_t _val, _val_last, _sat = 0;
|
||||||
uint16_t _hue = 0, _ct = 0;
|
uint16_t _hue = 0, _ct = 0;
|
||||||
float _x = 0, _y = 0;
|
float _x = 0.5, _y = 0.5;
|
||||||
uint32_t _rgb = 0;
|
uint32_t _rgb = 0;
|
||||||
uint8_t _id = 0;
|
uint8_t _id = 0;
|
||||||
EspalexaDeviceType _type;
|
EspalexaDeviceType _type;
|
||||||
EspalexaDeviceProperty _changed = EspalexaDeviceProperty::none;
|
EspalexaDeviceProperty _changed = EspalexaDeviceProperty::none;
|
||||||
EspalexaColorMode _mode;
|
EspalexaColorMode _mode = EspalexaColorMode::xy;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
EspalexaDevice();
|
EspalexaDevice();
|
||||||
~EspalexaDevice();
|
~EspalexaDevice();
|
||||||
EspalexaDevice(String deviceName, BrightnessCallbackFunction bcb, uint8_t initialValue =0);
|
EspalexaDevice(String deviceName, BrightnessCallbackFunction bcb, uint8_t initialValue =0);
|
||||||
EspalexaDevice(String deviceName, DeviceCallbackFunction dcb, EspalexaDeviceType t =EspalexaDeviceType::dimmable, uint8_t initialValue =0);
|
EspalexaDevice(String deviceName, DeviceCallbackFunction dcb, EspalexaDeviceType t =EspalexaDeviceType::dimmable, uint8_t initialValue =0);
|
||||||
|
EspalexaDevice(String deviceName, ColorCallbackFunction ccb, uint8_t initialValue =0);
|
||||||
|
|
||||||
String getName();
|
String getName();
|
||||||
uint8_t getId();
|
uint8_t getId();
|
||||||
|
@ -98,7 +98,7 @@
|
|||||||
|
|
||||||
|
|
||||||
//version code in format yymmddb (b = daily build)
|
//version code in format yymmddb (b = daily build)
|
||||||
#define VERSION 1903272
|
#define VERSION 1904141
|
||||||
char versionString[] = "0.8.4";
|
char versionString[] = "0.8.4";
|
||||||
|
|
||||||
|
|
||||||
|
@ -31,7 +31,8 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
|||||||
int t = request->arg("AT").toInt(); if (t > 9 && t <= 255) apWaitTimeSecs = t;
|
int t = request->arg("AT").toInt(); if (t > 9 && t <= 255) apWaitTimeSecs = t;
|
||||||
strcpy(apSSID, request->arg("AS").c_str());
|
strcpy(apSSID, request->arg("AS").c_str());
|
||||||
apHide = request->hasArg("AH");
|
apHide = request->hasArg("AH");
|
||||||
if (request->arg("AP").charAt(0) != '*') strcpy(apPass, request->arg("AP").c_str());
|
int passlen = request->arg("AP").length();
|
||||||
|
if (passlen == 0 || (passlen > 7 && request->arg("AP").charAt(0) != '*')) strcpy(apPass, request->arg("AP").c_str());
|
||||||
t = request->arg("AC").toInt(); if (t > 0 && t < 14) apChannel = t;
|
t = request->arg("AC").toInt(); if (t > 0 && t < 14) apChannel = t;
|
||||||
|
|
||||||
char k[3]; k[2] = 0;
|
char k[3]; k[2] = 0;
|
||||||
|
@ -64,9 +64,10 @@ void arlsLock(uint32_t timeoutMs)
|
|||||||
strip.setPixelColor(i,0,0,0,0);
|
strip.setPixelColor(i,0,0,0,0);
|
||||||
}
|
}
|
||||||
strip.unlockAll();
|
strip.unlockAll();
|
||||||
|
realtimeActive = true;
|
||||||
}
|
}
|
||||||
realtimeActive = true;
|
|
||||||
realtimeTimeout = millis() + timeoutMs;
|
realtimeTimeout = millis() + timeoutMs;
|
||||||
|
if (timeoutMs == 255001 || timeoutMs == 65000) realtimeTimeout = UINT32_MAX;
|
||||||
if (arlsForceMaxBri) strip.setBrightness(255);
|
if (arlsForceMaxBri) strip.setBrightness(255);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -206,10 +207,10 @@ void handleNotifications()
|
|||||||
if (packetSize > 1) {
|
if (packetSize > 1) {
|
||||||
if (udpIn[1] == 0)
|
if (udpIn[1] == 0)
|
||||||
{
|
{
|
||||||
realtimeActive = false;
|
realtimeTimeout = 0;
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
arlsLock(udpIn[1]*1000);
|
arlsLock(udpIn[1]*1000 +1);
|
||||||
}
|
}
|
||||||
if (udpIn[0] == 1) //warls
|
if (udpIn[0] == 1) //warls
|
||||||
{
|
{
|
||||||
|
@ -87,11 +87,16 @@ void colorUpdated(int callMode)
|
|||||||
{
|
{
|
||||||
if (nightlightActive && !nightlightActiveOld && callMode != 3 && callMode != 5)
|
if (nightlightActive && !nightlightActiveOld && callMode != 3 && callMode != 5)
|
||||||
{
|
{
|
||||||
notify(4); return;
|
notify(4); interfaceUpdateCallMode = 4; return;
|
||||||
|
}
|
||||||
|
else if (fxChanged) {
|
||||||
|
notify(6);
|
||||||
|
if (callMode != 8) interfaceUpdateCallMode = 6;
|
||||||
|
if (realtimeTimeout == UINT32_MAX) realtimeTimeout = 0;
|
||||||
}
|
}
|
||||||
else if (fxChanged) notify(6);
|
|
||||||
return; //no change
|
return; //no change
|
||||||
}
|
}
|
||||||
|
if (realtimeTimeout == UINT32_MAX) realtimeTimeout = 0;
|
||||||
if (callMode != 5 && nightlightActive && nightlightFade)
|
if (callMode != 5 && nightlightActive && nightlightFade)
|
||||||
{
|
{
|
||||||
briNlT = bri;
|
briNlT = bri;
|
||||||
@ -134,13 +139,8 @@ void colorUpdated(int callMode)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (callMode == 8) return;
|
if (callMode == 8) return;
|
||||||
//only update Blynk and mqtt every 2 seconds to reduce lag
|
//set flag to update blynk and mqtt
|
||||||
if (millis() - lastInterfaceUpdate <= 2000)
|
interfaceUpdateCallMode = callMode;
|
||||||
{
|
|
||||||
interfaceUpdateCallMode = callMode;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
updateInterfaces(callMode);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
void parseMQTTBriPayload(char* payload)
|
void parseMQTTBriPayload(char* payload)
|
||||||
{
|
{
|
||||||
if (strstr(payload, "ON") || strstr(payload, "on")) {bri = briLast; colorUpdated(1);}
|
if (strstr(payload, "ON") || strstr(payload, "on") || strstr(payload, "true")) {bri = briLast; colorUpdated(1);}
|
||||||
else if (strstr(payload, "T" ) || strstr(payload, "t" )) {toggleOnOff(); colorUpdated(1);}
|
else if (strstr(payload, "T" ) || strstr(payload, "t" )) {toggleOnOff(); colorUpdated(1);}
|
||||||
else {
|
else {
|
||||||
uint8_t in = strtoul(payload, NULL, 10);
|
uint8_t in = strtoul(payload, NULL, 10);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user