NTP server settable

Added segment commands to HTTP api
Removed HA autodiscovery
This commit is contained in:
cschwinne 2019-12-04 02:01:47 +01:00
parent 334783f89a
commit 3b70488828
10 changed files with 77 additions and 336 deletions

Binary file not shown.

View File

@ -142,6 +142,7 @@
<button type="button" onclick="B()">Back</button><button type="submit">Save</button><hr>
<h2>Time setup</h2>
Get time from NTP server: <input type="checkbox" name="NT"><br>
<input name="NS" maxlength="32"><br>
Use 24h format: <input type="checkbox" name="CF"><br>
Time zone:
<select name="TZ">

View File

@ -71,33 +71,18 @@ AP IP: <span class="sip"> Not active </span><hr>
//LED settings
const char PAGE_settings_leds[] PROGMEM = R"=====(<!DOCTYPE html>
<html><head><meta name=viewport content="width=500"><meta charset="utf-8"><title>LED Settings</title>
<script>var f=0,p=0,d=document,laprev=55;function H()
{window.open("https://github.com/Aircoookie/WLED/wiki/Settings#led-settings");}
function B()
{window.open("/settings","_self");}
function S(){GetV();setTimeout(function(){fillfx(0);},200);setTimeout(function(){fillfx(1);},400);setABL();}
function enABL(){var en=d.getElementById('able').checked;d.Sf.LA.value=(en)?laprev:0;d.getElementById('abl').style.display=(en)?'inline':'none';d.getElementById('psu2').style.display=(en)?'inline':'none';if(d.Sf.LA.value>0)setABL();}
function enLA(){var val=d.Sf.LAsel.value;d.Sf.LA.value=val;d.getElementById('LAdis').style.display=(val==50)?'inline':'none';UI();}
function setABL(){d.getElementById('able').checked = true;d.Sf.LAsel.value = 50;switch(parseInt(d.Sf.LA.value)){case 0:d.getElementById('able').checked=false;enABL();break;case 30:d.Sf.LAsel.value=30;break;case 35:d.Sf.LAsel.value=35;break;case 55:d.Sf.LAsel.value=55;break;default:d.getElementById('LAdis').style.display='inline';}
UI();}
function UI(){var myC=d.querySelectorAll('.wc'),l=myC.length;for(i=0;i<l;i++){myC[i].style.display=(d.getElementById('rgbw').checked)?'inline':'none';}
d.getElementById('ledwarning').style.display=(d.Sf.LC.value>1000)?'inline':'none';d.getElementById('ampwarning').style.display=(d.Sf.MA.value>7200)?'inline':'none';if(d.Sf.LA.value>0)laprev=d.Sf.LA.value;var val=Math.ceil((100+d.Sf.LC.value*laprev)/500)/2;val=(val>5)?Math.ceil(val):val;var s="";var is12V=(d.Sf.LAsel.value==30);if(val<1.02&&!is12V)
{s="ESP 5V pin with 1A USB supply";}else
{s+=is12V?"12V ":"5V ";s+=val;s+="A supply connected to LEDs";}
var val2=Math.ceil((100+d.Sf.LC.value*laprev)/1500)/2;val2=(val2>5)?Math.ceil(val2):val2;var s2="(for most effects, ~";s2+=val2;s2+="A is enough)<br>";d.getElementById('psu').innerHTML=s;d.getElementById('psu2').innerHTML=s2;}
function fillfx(pl)
{e="<option>Error loading list!</option>";el=pl?Sf.FP:Sf.FX;fetch(pl?'/json/palettes':'/json/effects').then(res=>{if(!res.ok){el.innerHTML=e;}
return res.json();}).then(json=>{var x="";for(i in json){x+="<option value=\""+i+"\">"+json[i]+" ("+i+")</option>";}
el.innerHTML=x;el.selectedIndex=pl?p:f;}).catch(function(){el.innerHTML=e;})}
function GetV(){%CSS%%SCSS%</head>
<body onload=S()>
<html><head>
<meta charset=utf-8>
<meta name=viewport content="width=500">
<title>LED Settings</title>
<script>var d=document,laprev=55;function H(){window.open("https://github.com/Aircoookie/WLED/wiki/Settings#led-settings")}function B(){window.open("/settings","_self")}function S(){GetV();setABL()}function enABL(){var a=d.getElementById("able").checked;d.Sf.LA.value=(a)?laprev:0;d.getElementById("abl").style.display=(a)?"inline":"none";d.getElementById("psu2").style.display=(a)?"inline":"none";if(d.Sf.LA.value>0){setABL()}}function enLA(){var a=d.Sf.LAsel.value;d.Sf.LA.value=a;d.getElementById("LAdis").style.display=(a==50)?"inline":"none";UI()}function setABL(){d.getElementById("able").checked=true;d.Sf.LAsel.value=50;switch(parseInt(d.Sf.LA.value)){case 0:d.getElementById("able").checked=false;enABL();break;case 30:d.Sf.LAsel.value=30;break;case 35:d.Sf.LAsel.value=35;break;case 55:d.Sf.LAsel.value=55;break;default:d.getElementById("LAdis").style.display="inline"}UI()}function UI(){var b=d.querySelectorAll(".wc"),a=b.length;for(i=0;i<a;i++){b[i].style.display=(d.getElementById("rgbw").checked)?"inline":"none"}d.getElementById("ledwarning").style.display=(d.Sf.LC.value>1000)?"inline":"none";d.getElementById("ampwarning").style.display=(d.Sf.MA.value>7200)?"inline":"none";if(d.Sf.LA.value>0){laprev=d.Sf.LA.value}var j=Math.ceil((100+d.Sf.LC.value*laprev)/500)/2;j=(j>5)?Math.ceil(j):j;var g="";var e=(d.Sf.LAsel.value==30);if(j<1.02&&!e){g="ESP 5V pin with 1A USB supply"}else{g+=e?"12V ":"5V ";g+=j;g+="A supply connected to LEDs"}var h=Math.ceil((100+d.Sf.LC.value*laprev)/1500)/2;h=(h>5)?Math.ceil(h):h;var c="(for most effects, ~";c+=h;c+="A is enough)<br>";d.getElementById("psu").innerHTML=g;d.getElementById("psu2").innerHTML=c}function GetV(){var d=document;
%CSS%%SCSS%</head><body onload=S()>
<form id=form_s name=Sf method=post>
<div class=helpB><button type=button onclick=H()>?</button></div>
<button type=button onclick=B()>Back</button><button type=submit>Save</button><hr>
<h2>LED setup</h2>
LED count: <input name=LC type=number min=1 max=1500 oninput=UI() required><br>
<div id=ledwarning style="color:orange; display: none;">
<div id=ledwarning style=color:orange;display:none>
&#9888; You might run into stability or lag issues.<br>
Use less than 1000 LEDs per ESP for the best experience!<br>
</div>
@ -108,7 +93,7 @@ Use less than 1000 LEDs per ESP for the best experience!<br>
Enable automatic brightness limiter: <input type=checkbox name=ABen onchange=enABL() id=able><br>
<div id=abl>
Maximum Current: <input name=MA type=number min=250 max=65000 oninput=UI() required> mA<br>
<div id=ampwarning style="color:orange; display: none;">
<div id=ampwarning style=color:orange;display:none>
&#9888; Your power supply provides high current.<br>
To improve the safety of your setup,<br>
please use thick cables,<br>
@ -130,49 +115,27 @@ LED voltage (Max. current for a single LED):<br>
</div>
<br>
LEDs are 4-channel type (RGBW): <input type=checkbox name=EW onchange=UI() id=rgbw><br>
<span class=wc>
Auto-calculate white channel from RGB: <input type=checkbox name=AW><br></span>
Color order:
<select name=CO>
<option value=0>GRB</option>
<option value=1>RGB</option>
<option value=2>BRG</option>
<option value=2 disabled>BRG</option>
<option value=3>RBG</option>
</select>
<h3>Defaults</h3>
Turn LEDs on after power up/reset: <input type=checkbox name=BO><br>
Default brightness: <input name=CA type=number min=0 max=255 required> (0-255)<br><br>
Set current color, brightness and effects as boot default: <input type=checkbox name=IS><br>
Set current preset cycle setting as boot default: <input type=checkbox name=PC>
Apply preset <input name=BP type=number min=0 max=16 required> at boot (0 uses defaults)
<br>- <i>or</i> -<br>
Apply preset <input name=BP type=number min=0 max=25 required> at boot (0 uses defaults)
<br>- <i>or</i> -<br>
Default RGB<span class=wc>W</span> color:<br>
<input name=CR type=number min=0 max=255 required>
<input name=CG type=number min=0 max=255 required>
<input name=CB type=number min=0 max=255 required>
<span class=wc><input name=CW type=number min=0 max=255 required><br>
Auto-calculate white from RGB instead: <input type=checkbox name=AW></span><br>
Default secondary RGB<span class=wc>W</span>:<br>
<input name=SR type=number min=0 max=255 required>
<input name=SG type=number min=0 max=255 required>
<input name=SB type=number min=0 max=255 required>
<span class=wc><input name=SW type=number min=0 max=255 required></span><br>
Default effect ID:<br>
<select name=FX>
<option>Loading...</option>
</select>
<br>Default color palette:<br>
<select name=FP>
<option>Loading...</option>
</select><br>
Default effect speed: <input name=SX type=number min=0 max=255 required><br>
Default effect intensity: <input name=IX type=number min=0 max=255 required><br><br>
Set current preset cycle setting as boot default: <input type=checkbox name=PC><br><br>
Use Gamma correction for color: <input type=checkbox name=GC> (strongly recommended)<br>
Use Gamma correction for brightness: <input type=checkbox name=GB> (not recommended)<br><br>
Brightness factor: <input name=BF type=number min=1 max=255 required> %
<h3>Transitions</h3>
Crossfade: <input type=checkbox name=TF><br>
Transition Time: <input name=TD maxlength=5 size=2> ms<br>
Enable transition for secondary color: <input type=checkbox name=T2><br>
Enable Palette transitions: <input type=checkbox name=PF>
<h3>Timed light</h3>
Default Duration: <input name=TL type=number min=1 max=255 required> min<br>
@ -191,8 +154,7 @@ Skip first LED: <input type=checkbox name=SL><br>
Disable repeating N LEDs: <input type=number min=0 max=255 name=DL><br>
(Turns off N LEDs between each lit one, spacing out effects)<hr>
<button type=button onclick=B()>Back</button><button type=submit>Save</button>
</form></body>
</html>)=====";
</form></body></html>)=====";
//User Interface settings
@ -298,6 +260,7 @@ function Wd(){a=[0,0,0,0,0,0,0,0];for(i=0;i<8;i++){m=1;for(j=0;j<8;j++){a[i]+=gI
<button type="button" onclick="B()">Back</button><button type="submit">Save</button><hr>
<h2>Time setup</h2>
Get time from NTP server: <input type="checkbox" name="NT"><br>
<input name="NS" maxlength="32"><br>
Use 24h format: <input type="checkbox" name="CF"><br>
Time zone:
<select name="TZ">

View File

@ -111,7 +111,7 @@ char otaPass[33] = "wledota";
byte auxDefaultState = 0; //0: input 1: high 2: low
byte auxTriggeredState = 0; //0: input 1: high 2: low
char ntpServerName[] = "0.wled.pool.ntp.org"; //NTP server to use
char ntpServerName[33] = "0.wled.pool.ntp.org";//NTP server to use
//WiFi CONFIG (all these can be changed via web UI, no need to set them here)
@ -136,13 +136,9 @@ bool autoRGBtoRGBW = false; //if RGBW enabled, calculate White
bool turnOnAtBoot = true; //turn on LEDs at power-up
byte bootPreset = 0; //save preset to load after power-up
byte colS[]{255, 159, 0, 0}; //default RGB(W) color
byte colSecS[]{0, 0, 0, 0}; //default RGB(W) secondary color
byte briS = 127; //default brightness
byte effectDefault = 0;
byte effectSpeedDefault = 75;
byte effectIntensityDefault = 128; //intensity is supported on some effects as an additional parameter (e.g. for blink you can change the duty cycle)
byte effectPaletteDefault = 0; //palette is supported on the FastLED effects, otherwise it has no effect
byte col[]{255, 160, 0, 0}; //default RGB(W) color
byte colSec[]{0, 0, 0, 0}; //default RGB(W) secondary color
byte briS = 128; //default brightness
byte nightlightTargetBri = 0; //brightness after nightlight is over
byte nightlightDelayMins = 60;
@ -227,7 +223,7 @@ char cronixieDisplay[7] = "HHMMSS"; //Cronixie Display mask. See wled1
bool cronixieBacklight = true; //Allow digits to be back-illuminated
bool countdownMode = false; //Clock will count down towards date
byte countdownYear = 19, countdownMonth = 1; //Countdown target date, year is last two digits
byte countdownYear = 20, countdownMonth = 1; //Countdown target date, year is last two digits
byte countdownDay = 1, countdownHour = 0;
byte countdownMin = 0, countdownSec = 0;
@ -257,11 +253,9 @@ bool interfacesInited = false;
bool wasConnected = false;
//color
byte col[]{255, 159, 0, 0}; //target RGB(W) color
byte colOld[]{0, 0, 0, 0}; //color before transition
byte colT[]{0, 0, 0, 0}; //current color
byte colIT[]{0, 0, 0, 0}; //color that was last sent to LEDs
byte colSec[]{0, 0, 0, 0};
byte colSecT[]{0, 0, 0, 0};
byte colSecOld[]{0, 0, 0, 0};
byte colSecIT[]{0, 0, 0, 0};
@ -291,7 +285,7 @@ byte bri = briS;
byte briOld = 0;
byte briT = 0;
byte briIT = 0;
byte briLast = 127; //brightness before turned off. Used for toggle function
byte briLast = 128; //brightness before turned off. Used for toggle function
//button
bool buttonPressedBefore = false;
@ -307,10 +301,10 @@ byte notificationSentCallMode = 0;
bool notificationTwoRequired = false;
//effects
byte effectCurrent = effectDefault;
byte effectSpeed = effectSpeedDefault;
byte effectIntensity = effectIntensityDefault;
byte effectPalette = effectPaletteDefault;
byte effectCurrent = 0;
byte effectSpeed = 128;
byte effectIntensity = 128;
byte effectPalette = 0;
//network
bool udpConnected = false, udpRgbConnected = false;
@ -423,7 +417,6 @@ byte optionType;
bool doReboot = false; //flag to initiate reboot from async handlers
bool doPublishMqtt = false;
bool doSendHADiscovery = true;
//server library objects
AsyncWebServer server(80);
@ -529,7 +522,6 @@ void loop() {
handleAlexa();
handleOverlays();
if (doSendHADiscovery) sendHADiscoveryMQTT();
yield();
if (doReboot) reset();

View File

@ -6,7 +6,7 @@
#define EEPSIZE 2560
//eeprom Version code, enables default settings instead of 0 init on update
#define EEPVER 12
#define EEPVER 13
//0 -> old version, default
//1 -> 0.4p 1711272 and up
//2 -> 0.4p 1711302 and up
@ -19,7 +19,8 @@
//9 -> 0.8.0
//10-> 0.8.2
//11-> 0.8.5-dev #mqttauth @TimothyBrown
//12-> 0.8.7
//12-> 0.8.7-dev
//13-> 0.9.0
void commit()
{
@ -95,9 +96,6 @@ void saveSettingsToEEPROM()
EEPROM.write(242+i, staticSubnet[i]);
}
EEPROM.write(246, colS[0]);
EEPROM.write(247, colS[1]);
EEPROM.write(248, colS[2]);
EEPROM.write(249, briS);
EEPROM.write(250, receiveNotificationBrightness);
@ -116,10 +114,6 @@ void saveSettingsToEEPROM()
EEPROM.write(291, (udpPort >> 8) & 0xFF);
writeStringToEEPROM(292, serverDescription, 32);
EEPROM.write(324, effectDefault);
EEPROM.write(325, effectSpeedDefault);
EEPROM.write(326, effectIntensityDefault);
EEPROM.write(327, ntpEnabled);
EEPROM.write(328, currentTimezone);
EEPROM.write(329, useAMPM);
@ -134,19 +128,14 @@ void saveSettingsToEEPROM()
EEPROM.write(367, (arlsOffset>=0));
EEPROM.write(368, abs(arlsOffset));
EEPROM.write(369, turnOnAtBoot);
EEPROM.write(371, colS[3]); //white default
EEPROM.write(372, useRGBW);
EEPROM.write(373, effectPaletteDefault);
EEPROM.write(374, strip.paletteFade);
EEPROM.write(375, strip.milliampsPerLed); //was apWaitTimeSecs up to 0.8.5
EEPROM.write(376, apBehavior);
EEPROM.write(377, EEPVER); //eeprom was updated to latest
EEPROM.write(378, colSecS[0]);
EEPROM.write(379, colSecS[1]);
EEPROM.write(380, colSecS[2]);
EEPROM.write(381, colSecS[3]);
EEPROM.write(382, strip.paletteBlend);
EEPROM.write(383, strip.colorOrder);
@ -168,7 +157,8 @@ void saveSettingsToEEPROM()
EEPROM.write(399, !enableSecTransition);
//favorite setting (preset) memory (25 slots/ each 20byte)
//400 - 899 reserved
//400 - 940 reserved
writeStringToEEPROM(990, ntpServerName, 32);
EEPROM.write(2048, huePollingEnabled);
//EEPROM.write(2049, hueUpdatingEnabled);
@ -314,9 +304,6 @@ void loadSettingsFromEEPROM(bool first)
staticSubnet[2] = EEPROM.read(244);
staticSubnet[3] = EEPROM.read(245);
colS[0] = EEPROM.read(246); col[0] = colS[0];
colS[1] = EEPROM.read(247); col[1] = colS[1];
colS[2] = EEPROM.read(248); col[2] = colS[2];
briS = EEPROM.read(249); bri = briS;
if (!EEPROM.read(369) && first)
{
@ -337,8 +324,6 @@ void loadSettingsFromEEPROM(bool first)
readStringFromEEPROM(292, serverDescription, 32);
effectDefault = EEPROM.read(324); effectCurrent = effectDefault;
effectSpeedDefault = EEPROM.read(325); effectSpeed = effectSpeedDefault;
ntpEnabled = EEPROM.read(327);
currentTimezone = EEPROM.read(328);
useAMPM = EEPROM.read(329);
@ -355,32 +340,19 @@ void loadSettingsFromEEPROM(bool first)
arlsOffset = EEPROM.read(368);
if (!EEPROM.read(367)) arlsOffset = -arlsOffset;
turnOnAtBoot = EEPROM.read(369);
colS[3] = EEPROM.read(371); col[3] = colS[3];
useRGBW = EEPROM.read(372);
effectPaletteDefault = EEPROM.read(373); effectPalette = effectPaletteDefault;
//374 - strip.paletteFade
apBehavior = EEPROM.read(376);
//377 = lastEEPROMversion
if (lastEEPROMversion > 1) {
for (byte i=0; i<4; i++)
{
colSecS[i] = EEPROM.read(378+i); colSec[i] = colSecS[i];
}
}
if (lastEEPROMversion > 3) {
effectIntensityDefault = EEPROM.read(326); effectIntensity = effectIntensityDefault;
aOtaEnabled = EEPROM.read(390);
receiveNotificationColor = EEPROM.read(391);
receiveNotificationEffects = EEPROM.read(392);
} else //keep receiving notification behavior from pre0.5.0 after update
{
receiveNotificationColor = receiveNotificationBrightness;
receiveNotificationEffects = receiveNotificationBrightness;
}
receiveNotifications = (receiveNotificationBrightness || receiveNotificationColor || receiveNotificationEffects);
if (lastEEPROMversion > 4) {
huePollingEnabled = EEPROM.read(2048);
//hueUpdatingEnabled = EEPROM.read(2049);
@ -486,6 +458,10 @@ void loadSettingsFromEEPROM(bool first)
strip.ablMilliampsMax = ABL_MILLIAMPS_DEFAULT;
strip.milliampsPerLed = 0; //disable ABL
}
if (lastEEPROMversion > 12)
{
readStringFromEEPROM(990, ntpServerName, 32);
}
receiveDirect = !EEPROM.read(2200);
notifyMacro = EEPROM.read(2201);

View File

@ -3,7 +3,7 @@
*/
//build XML response to HTTP /win API request
char* XML_response(AsyncWebServerRequest *request, bool includeTheme, char* dest = nullptr)
char* XML_response(AsyncWebServerRequest *request, char* dest = nullptr)
{
char sbuf[(dest == nullptr)?1024:1]; //allocate local buffer if none passed
obuf = (dest == nullptr)? sbuf:dest;
@ -216,33 +216,20 @@ void getSettingsJS(byte subPage, char* dest)
oappendi(strip.currentMilliamps);
oappend("mA\";");
}
sappend('v',"CR",colS[0]);
sappend('v',"CG",colS[1]);
sappend('v',"CB",colS[2]);
sappend('v',"CA",briS);
sappend('c',"EW",useRGBW);
sappend('i',"CO",strip.colorOrder);
sappend('c',"AW",autoRGBtoRGBW);
sappend('v',"CW",colS[3]);
sappend('v',"SR",colSecS[0]);
sappend('v',"SG",colSecS[1]);
sappend('v',"SB",colSecS[2]);
sappend('v',"SW",colSecS[3]);
sappend('c',"BO",turnOnAtBoot);
sappend('v',"BP",bootPreset);
oappend("f=");
oappendi(effectDefault);
oappend(";p=");
oappendi(effectPaletteDefault);
oappend(";");
sappend('v',"SX",effectSpeedDefault);
sappend('v',"IX",effectIntensityDefault);
sappend('c',"GB",strip.gammaCorrectBri);
sappend('c',"GC",strip.gammaCorrectCol);
sappend('c',"TF",fadeTransition);
sappend('v',"TD",transitionDelay);
sappend('c',"PF",strip.paletteFade);
sappend('c',"T2",enableSecTransition);
sappend('v',"BF",briMultiplier);
sappend('v',"TB",nightlightTargetBri);
sappend('v',"TL",nightlightDelayMinsDefault);
@ -310,6 +297,7 @@ void getSettingsJS(byte subPage, char* dest)
if (subPage == 5)
{
sappend('c',"NT",ntpEnabled);
sappends('s',"NS",ntpServerName);
sappend('c',"CF",!useAMPM);
sappend('i',"TZ",currentTimezone);
sappend('v',"UO",utcOffsetSecs);

View File

@ -68,34 +68,8 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
strip.colorOrder = request->arg("CO").toInt();
autoRGBtoRGBW = request->hasArg("AW");
//ignore settings and save current brightness, colors and fx as default
if (request->hasArg("IS"))
{
for (byte i=0; i<4; i++)
{
colS[i] = col[i];
colSecS[i] = colSec[i];
}
briS = bri;
effectDefault = effectCurrent;
effectSpeedDefault = effectSpeed;
effectIntensityDefault = effectIntensity;
effectPaletteDefault = effectPalette;
} else {
colS[0] = request->arg("CR").toInt();
colS[1] = request->arg("CG").toInt();
colS[2] = request->arg("CB").toInt();
colS[3] = request->arg("CW").toInt();
colSecS[0] = request->arg("SR").toInt();
colSecS[1] = request->arg("SG").toInt();
colSecS[2] = request->arg("SB").toInt();
colSecS[3] = request->arg("SW").toInt();
briS = request->arg("CA").toInt();
effectDefault = request->arg("FX").toInt();
effectSpeedDefault = request->arg("SX").toInt();
effectIntensityDefault = request->arg("IX").toInt();
effectPaletteDefault = request->arg("FP").toInt();
}
briS = request->arg("CA").toInt();
saveCurrPresetCycConf = request->hasArg("PC");
turnOnAtBoot = request->hasArg("BO");
t = request->arg("BP").toInt();
@ -108,7 +82,6 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
if (t > 0) transitionDelay = t;
transitionDelayDefault = t;
strip.paletteFade = request->hasArg("PF");
enableSecTransition = request->hasArg("T2");
nightlightTargetBri = request->arg("TB").toInt();
t = request->arg("TL").toInt();
@ -200,6 +173,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
if (subPage == 5)
{
ntpEnabled = request->hasArg("NT");
strlcpy(ntpServerName, request->arg("NS").c_str(), 33);
useAMPM = !request->hasArg("CF");
currentTimezone = request->arg("TZ").toInt();
utcOffsetSecs = request->arg("UO").toInt();
@ -366,7 +340,7 @@ bool handleSet(AsyncWebServerRequest *request, const String& req)
}
pos = req.indexOf("IN");
if (pos < 1) XML_response(request, false);
if (pos < 1) XML_response(request);
return true;
//if you save a macro in one request, other commands in that request are ignored due to unwanted behavior otherwise
}
@ -374,15 +348,26 @@ bool handleSet(AsyncWebServerRequest *request, const String& req)
strip.applyToAllSelected = true;
//segment select (sets main segment)
pos = req.indexOf("SS=");
byte prevMain = strip.getMainSegmentId();
pos = req.indexOf("SM=");
if (pos > 0) {
strip.mainSegment = getNumVal(&req, pos);
}
byte main = strip.getMainSegmentId();
if (main != prevMain) setValuesFromMainSeg();
pos = req.indexOf("SS=");
if (pos > 0) {
byte t = getNumVal(&req, pos);
if (t < strip.getMaxSegments()) main = t;
}
pos = req.indexOf("SV="); //segment selected
if (pos > 0) strip.getSegment(main).setOption(0, (req.charAt(pos+3) != '0'));
uint16_t startI = strip.getSegment(main).start;
uint16_t stopI = strip.getSegment(main).stop;
pos = req.indexOf("S="); //segment start
pos = req.indexOf("&S="); //segment start
if (pos > 0) {
startI = getNumVal(&req, pos);
}
@ -429,45 +414,12 @@ bool handleSet(AsyncWebServerRequest *request, const String& req)
colorFromDecOrHexString(colSec, (char*)req.substring(pos + 3).c_str());
}
//set 2nd to white
pos = req.indexOf("SW");
if (pos > 0) {
if(useRGBW) {
colSec[3] = 255;
colSec[0] = 0;
colSec[1] = 0;
colSec[2] = 0;
} else {
colSec[0] = 255;
colSec[1] = 255;
colSec[2] = 255;
}
}
//set 2nd to black
pos = req.indexOf("SB");
if (pos > 0) {
colSec[3] = 0;
colSec[0] = 0;
colSec[1] = 0;
colSec[2] = 0;
}
//set to random hue SR=0->1st SR=1->2nd
pos = req.indexOf("SR");
if (pos > 0) {
_setRandomColor(getNumVal(&req, pos));
}
//set 2nd to 1st
pos = req.indexOf("SP");
if (pos > 0) {
colSec[0] = col[0];
colSec[1] = col[1];
colSec[2] = col[2];
colSec[3] = col[3];
}
//swap 2nd & 1st
pos = req.indexOf("SC");
if (pos > 0) {
@ -486,21 +438,6 @@ bool handleSet(AsyncWebServerRequest *request, const String& req)
updateVal(&req, "IX=", &effectIntensity);
updateVal(&req, "FP=", &effectPalette, 0, strip.getPaletteCount()-1);
//set hue polling light: 0 -off
#ifndef WLED_DISABLE_HUESYNC
pos = req.indexOf("HP=");
if (pos > 0) {
int id = getNumVal(&req, pos);
if (id > 0)
{
if (id < 100) huePollLightId = id;
reconnectHue();
} else {
huePollingEnabled = false;
}
}
#endif
//set advanced overlay
pos = req.indexOf("OL=");
if (pos > 0) {
@ -674,13 +611,10 @@ bool handleSet(AsyncWebServerRequest *request, const String& req)
setCronixie();
}
if (req.indexOf("NB=") > 0) //sets backlight
pos = req.indexOf("NB=");
if (pos > 0) //sets backlight
{
cronixieBacklight = true;
if (req.indexOf("NB=0") > 0)
{
cronixieBacklight = false;
}
presetApplyFx = (req.charAt(pos+3) != '0');
if (overlayCurrent == 3) strip.setCronixieBacklight(cronixieBacklight);
overlayRefreshedTime = 0;
}
@ -702,7 +636,7 @@ bool handleSet(AsyncWebServerRequest *request, const String& req)
//internal call, does not send XML response
pos = req.indexOf("IN");
if (pos < 1) XML_response(request, (req.indexOf("&IT") > 0)); //include theme if firstload
if (pos < 1) XML_response(request);
pos = req.indexOf("&NN"); //do not send UDP notifications this time
colorUpdated((pos > 0) ? 5:1);

View File

@ -75,7 +75,15 @@ void handleNetworkTime()
void sendNTPPacket()
{
WiFi.hostByName(ntpServerName, ntpServerIP);
if (!ntpServerIP.fromString(ntpServerName)) //see if server is IP or domain
{
#ifdef ESP8266
WiFi.hostByName(ntpServerName, ntpServerIP, 750);
#else
WiFi.hostByName(ntpServerName, ntpServerIP);
#endif
}
DEBUG_PRINTLN("send NTP");
byte pbuf[NTP_PACKET_SIZE];
memset(pbuf, 0, NTP_PACKET_SIZE);

View File

@ -42,7 +42,6 @@ void onMqttConnect(bool sessionPresent)
mqtt->subscribe(subuf, 0);
}
doSendHADiscovery = true;
doPublishMqtt = true;
DEBUG_PRINTLN("MQTT ready");
}
@ -93,136 +92,14 @@ void publishMqtt()
mqtt->publish(subuf, 0, true, "online");
char apires[1024];
XML_response(nullptr, false, apires);
XML_response(nullptr, apires);
strcpy(subuf, mqttDeviceTopic);
strcat(subuf, "/v");
mqtt->publish(subuf, 0, true, apires);
}
const char HA_static_JSON[] PROGMEM = R"=====(,"bri_val_tpl":"{{value}}","rgb_cmd_tpl":"{{'#%02x%02x%02x' | format(red, green, blue)}}","rgb_val_tpl":"{{value[1:3]|int(base=16)}},{{value[3:5]|int(base=16)}},{{value[5:7]|int(base=16)}}","qos":0,"opt":true,"pl_on":"ON","pl_off":"OFF","fx_val_tpl":"{{value}}","fx_list":[)=====";
char* buffer;
void sendHADiscoveryMQTT()
{
//TODO: With LwIP 1 the ESP loses MQTT connection and causes memory leak when sending discovery packet
#if ARDUINO_ARCH_ESP32 || LWIP_VERSION_MAJOR > 1
/*
YYYY is device topic
XXXX is device name
Send out HA MQTT Discovery message on MQTT connect (~2.4kB):
{
"name": "XXXX",
"stat_t":"YYYY/c",
"cmd_t":"YYYY",
"rgb_stat_t":"YYYY/c",
"rgb_cmd_t":"YYYY/col",
"bri_cmd_t":"YYYY",
"bri_stat_t":"YYYY/g",
"bri_val_tpl":"{{value}}",
"rgb_cmd_tpl":"{{'#%02x%02x%02x' | format(red, green, blue)}}",
"rgb_val_tpl":"{{value[1:3]|int(base=16)}},{{value[3:5]|int(base=16)}},{{value[5:7]|int(base=16)}}",
"qos": 0,
"opt":true,
"pl_on": "ON",
"pl_off": "OFF",
"fx_cmd_t":"YYYY/api",
"fx_stat_t":"YYYY/api",
"fx_val_tpl":"{{value}}",
"fx_list":[
"[FX=00] Solid",
"[FX=01] Blink",
"[FX=02] ...",
"[FX=79] Ripple"
]
}
*/
doSendHADiscovery = false;
if (mqtt == nullptr || !mqtt->connected()) return;
buffer = new char[2400];
if (!buffer) {delete[] buffer; return;}
char bufc[36], bufcol[38], bufg[36], bufapi[38];
strcpy(bufc, mqttDeviceTopic);
strcpy(bufcol, mqttDeviceTopic);
strcpy(bufg, mqttDeviceTopic);
strcpy(bufapi, mqttDeviceTopic);
strcat(bufc, "/c");
strcat(bufcol, "/col");
strcat(bufg, "/g");
strcat(bufapi, "/api");
StaticJsonDocument<JSON_OBJECT_SIZE(9) +512> root;
root["name"] = serverDescription;
root["stat_t"] = bufc;
root["cmd_t"] = mqttDeviceTopic;
root["rgb_stat_t"] = bufc;
root["rgb_cmd_t"] = bufcol;
root["bri_cmd_t"] = mqttDeviceTopic;
root["bri_stat_t"] = bufg;
root["fx_cmd_t"] = bufapi;
root["fx_stat_t"] = bufapi;
size_t jlen = measureJson(root);
//DEBUG_PRINTLN(jlen);
serializeJson(root, buffer, jlen);
//add values which don't change
strcpy_P(buffer + jlen -1, HA_static_JSON);
olen = 0;
obuf = buffer + jlen -1 + strlen_P(HA_static_JSON);
//add fx_list
uint16_t jmnlen = strlen_P(JSON_mode_names);
uint16_t nameStart = 0, nameEnd = 0;
int i = 0;
bool isNameStart = true;
for (uint16_t j = 0; j < jmnlen; j++)
{
if (pgm_read_byte(JSON_mode_names + j) == '\"' || j == jmnlen -1)
{
if (isNameStart)
{
nameStart = j +1;
}
else
{
nameEnd = j;
char mdnfx[64], mdn[56];
uint16_t namelen = nameEnd - nameStart;
strncpy_P(mdn, JSON_mode_names + nameStart, namelen);
mdn[namelen] = 0;
snprintf(mdnfx, 64, "\"[FX=%02d] %s\",", i, mdn);
oappend(mdnfx);
//DEBUG_PRINTLN(mdnfx);
i++;
}
isNameStart = !isNameStart;
}
}
olen--;
oappend("]}");
DEBUG_PRINT("HA Discovery Sending >>");
DEBUG_PRINTLN(buffer);
char pubt[25 + 12 + 8];
strcpy(pubt, "homeassistant/light/");
strcat(pubt, mqttClientID);
strcat(pubt, "/config");
bool success = mqtt->publish(pubt, 0, true, buffer);
DEBUG_PRINTLN(success);
yield();
delete[] buffer;
#endif
}
//HA autodiscovery was removed in favor of the native integration in HA v0.102.0
bool initMqtt()
{

View File

@ -105,7 +105,9 @@ bool deserializeState(JsonObject root)
int timein = root["time"] | -1;
if (timein != -1) setTime(timein);
strip.mainSegment = root["mainseg"] | strip.mainSegment;
byte prevMain = strip.getMainSegmentId();
strip.mainSegment = root["mainseg"] | prevMain;
if (strip.getMainSegmentId() != prevMain) setValuesFromMainSeg();
int it = 0;
JsonVariant segVar = root["seg"];