<!DOCTYPE html> <html lang="en"> <head> <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport"> <meta charset="utf-8"> <title>Sync Settings</title> <script>var d=document; var loc = false, locip, locproto = "http:"; function gId(s){return d.getElementById(s);} function toggle(el){gId(el).classList.toggle("hide"); gId('No'+el).classList.toggle("hide");} function H(){window.open("https://kno.wled.ge/interfaces/udp-notifier/");} function B(){window.open(getURL("/settings"),"_self");} function adj(){if (d.Sf.DI.value == 6454) {if (d.Sf.EU.value == 1) d.Sf.EU.value = 0;} else if (d.Sf.DI.value == 5568) {if (d.Sf.DA.value == 0) d.Sf.DA.value = 1; if (d.Sf.EU.value == 0) d.Sf.EU.value = 1;} } // https://www.educative.io/edpresso/how-to-dynamically-load-a-js-file-in-javascript function loadJS(FILE_URL, async = true) { let scE = d.createElement("script"); scE.setAttribute("src", FILE_URL); scE.setAttribute("type", "text/javascript"); scE.setAttribute("async", async); d.body.appendChild(scE); // success event scE.addEventListener("load", () => { //console.log("File loaded"); GetV();SetVal(); }); // error event scE.addEventListener("error", (ev) => { console.log("Error on loading file", ev); alert("Loading of configuration script failed.\nIncomplete page data!"); }); } function FC() { for(j=0;j<8;j++) { gId("G"+(j+1)).checked=gId("GS").value>>j&1; gId("R"+(j+1)).checked=gId("GR").value>>j&1; } } function GC() { var a=0, b=0; var m=1; for(j=0;j<8;j++) { a+=gId("G"+(j+1)).checked*m; b+=gId("R"+(j+1)).checked*m; m*=2; } gId("GS").value=a; gId("GR").value=b; } function SP(){var p = d.Sf.DI.value; gId("xp").style.display = (p > 0)?"none":"block"; if (p > 0) d.Sf.EP.value = p;} function SetVal(){switch(parseInt(d.Sf.EP.value)){case 5568: d.Sf.DI.value = 5568; break; case 6454: d.Sf.DI.value = 6454; break; case 4048: d.Sf.DI.value = 4048; break; }; SP();FC();} function S(){ let l = window.location; if (l.protocol == "file:") { loc = true; locip = localStorage.getItem('locIp'); if (!locip) { locip = prompt("File Mode. Please enter WLED IP!"); localStorage.setItem('locIp', locip); } } else { // detect reverse proxy let paths = l.pathname.slice(1,l.pathname.endsWith('/')?-1:undefined).split("/"); if (paths.length > 2) { locproto = l.protocol; loc = true; locip = l.hostname + (l.port ? ":" + l.port : "") + "/" + paths[0]; } } loadJS(getURL('/settings/s.js?p=4'), false); // If we set async false, file is loaded and executed, then next statement is processed if (loc) d.Sf.action = getURL('/settings/sync'); } function getURL(path) { return (loc ? locproto + "//" + locip : "") + path; } </script> <style>@import url("style.css");</style> </head> <body onload="S()"> <form id="form_s" name="Sf" method="post" onsubmit="GC()"> <div class="toprow"> <div class="helpB"><button type="button" onclick="H()">?</button></div> <button type="button" onclick="B()">Back</button><button type="submit">Save</button><hr> </div> <h2>Sync setup</h2> <h3>WLED Broadcast</h3> UDP Port: <input name="UP" type="number" min="1" max="65535" class="d5" required><br> 2nd Port: <input name="U2" type="number" min="1" max="65535" class="d5" required><br> <h3>Sync groups</h3> <input name="GS" id="GS" type="number" style="display: none;"><!-- hidden inputs for bitwise group checkboxes --> <input name="GR" id="GR" type="number" style="display: none;"> <table style="margin: 0 auto;"> <tr> <td></td> <td>1</td> <td>2</td> <td>3</td> <td>4</td> <td>5</td> <td>6</td> <td>7</td> <td>8</td> </tr> <tr> <td>Send:</td> <td><input type="checkbox" id="G1" name="G1"></td> <td><input type="checkbox" id="G2" name="G2"></td> <td><input type="checkbox" id="G3" name="G3"></td> <td><input type="checkbox" id="G4" name="G4"></td> <td><input type="checkbox" id="G5" name="G5"></td> <td><input type="checkbox" id="G6" name="G6"></td> <td><input type="checkbox" id="G7" name="G7"></td> <td><input type="checkbox" id="G8" name="G8"></td> </tr> <tr> <td>Receive:</td> <td><input type="checkbox" id="R1" name="R1"></td> <td><input type="checkbox" id="R2" name="R2"></td> <td><input type="checkbox" id="R3" name="R3"></td> <td><input type="checkbox" id="R4" name="R4"></td> <td><input type="checkbox" id="R5" name="R5"></td> <td><input type="checkbox" id="R6" name="R6"></td> <td><input type="checkbox" id="R7" name="R7"></td> <td><input type="checkbox" id="R8" name="R8"></td> </tr> </table><br> Receive: <nowrap><input type="checkbox" name="RB">Brightness,</nowrap> <nowrap><input type="checkbox" name="RC">Color,</nowrap> <nowrap>and <input type="checkbox" name="RX">Effects</nowrap><br> <input type="checkbox" name="SO"> Segment options, <input type="checkbox" name="SG"> bounds<br> Send notifications on direct change: <input type="checkbox" name="SD"><br> Send notifications on button press or IR: <input type="checkbox" name="SB"><br> Send Alexa notifications: <input type="checkbox" name="SA"><br> Send Philips Hue change notifications: <input type="checkbox" name="SH"><br> Send Macro notifications: <input type="checkbox" name="SM"><br> UDP packet retransmissions: <input name="UR" type="number" min="0" max="30" class="d5" required><br><br> <i>Reboot required to apply changes. </i> <hr class="sml"> <h3>Instance List</h3> Enable instance list: <input type="checkbox" name="NL"><br> Make this instance discoverable: <input type="checkbox" name="NB"> <hr class="sml"> <h3>Realtime</h3> Receive UDP realtime: <input type="checkbox" name="RD"><br> Use main segment only: <input type="checkbox" name="MO"><br><br> <i>Network DMX input</i><br> Type: <select name=DI onchange="SP(); adj();"> <option value=5568>E1.31 (sACN)</option> <option value=6454>Art-Net</option> <option value=0 selected>Custom port</option> </select><br> <div id=xp>Port: <input name="EP" type="number" min="1" max="65535" value="5568" class="d5" required><br></div> Multicast: <input type="checkbox" name="EM"><br> Start universe: <input name="EU" type="number" min="0" max="63999" required><br> <i>Reboot required.</i> Check out <a href="https://github.com/LedFx/LedFx" target="_blank">LedFx</a>!<br> Skip out-of-sequence packets: <input type="checkbox" name="ES"><br> DMX start address: <input name="DA" type="number" min="1" max="510" required><br> DMX segment spacing: <input name="XX" type="number" min="0" max="150" required><br> E1.31 port priority: <input name="PY" type="number" min="0" max="200" required><br> DMX mode: <select name=DM> <option value=0>Disabled</option> <option value=1>Single RGB</option> <option value=2>Single DRGB</option> <option value=3>Effect</option> <option value=7>Effect + White</option> <option value=8>Effect Segment</option> <option value=9>Effect Segment + White</option> <option value=4>Multi RGB</option> <option value=5>Dimmer + Multi RGB</option> <option value=6>Multi RGBW</option> <option value=10>Preset</option> </select><br> <a href="https://kno.wled.ge/interfaces/e1.31-dmx/" target="_blank">E1.31 info</a><br> Timeout: <input name="ET" type="number" min="1" max="65000" required> ms<br> Force max brightness: <input type="checkbox" name="FB"><br> Disable realtime gamma correction: <input type="checkbox" name="RG"><br> Realtime LED offset: <input name="WO" type="number" min="-255" max="255" required> <hr class="sml"> <h3>Alexa Voice Assistant</h3> <div id="NoAlexa" class="hide"> <i class="warn">This firmware build does not include Alexa support.<br></i><br> </div> <div id="Alexa"> Emulate Alexa device: <input type="checkbox" name="AL"><br> Alexa invocation name: <input type="text" name="AI" maxlength="32"><br> Also emulate devices to call the first <input name="AP" type="number" class="s" min="0" max="9" required> presets<br><br> </div> <hr class="sml"> <div class="warn">⚠ <b>MQTT and Hue sync all connect to external hosts!<br> This may impact the responsiveness of WLED.</b><br> </div> For best results, only use one of these services at a time.<br> (alternatively, connect a second ESP to them and use the UDP sync) <hr class="sml"> <h3>MQTT</h3> <div id="NoMQTT" class="hide"> <i class="warn">This firmware build does not include MQTT support.<br></i> </div> <div id="MQTT"> Enable MQTT: <input type="checkbox" name="MQ"><br> Broker: <input type="text" name="MS" maxlength="32"> Port: <input name="MQPORT" type="number" min="1" max="65535" class="d5"><br> <b>The MQTT credentials are sent over an unsecured connection.<br> Never use the MQTT password for another service!</b><br> Username: <input type="text" name="MQUSER" maxlength="40"><br> Password: <input type="password" name="MQPASS" maxlength="64"><br> Client ID: <input type="text" name="MQCID" maxlength="40"><br> Device Topic: <input type="text" name="MD" maxlength="32"><br> Group Topic: <input type="text" name="MG" maxlength="32"><br> Publish on button press: <input type="checkbox" name="BM"><br> Retain brightness & color messages: <input type="checkbox" name="RT"><br> <i>Reboot required to apply changes. </i><a href="https://kno.wled.ge/interfaces/mqtt/" target="_blank">MQTT info</a> </div> <h3>Philips Hue</h3> <div id="NoHue" class="hide"> <em class="warn">This firmware build does not include Philips Hue support.<br></em> </div> <div id="Hue"> <i>You can find the bridge IP and the light number in the 'About' section of the hue app.</i><br> Poll Hue light <input name="HL" type="number" min="1" max="99" > every <input name="HI" type="number" min="100" max="65000"> ms: <input type="checkbox" name="HP"><br> Then, receive <input type="checkbox" name="HO"> On/Off, <input type="checkbox" name="HB"> Brightness, and <input type="checkbox" name="HC"> Color<br> Hue Bridge IP:<br> <input name="H0" type="number" class="s" min="0" max="255" > . <input name="H1" type="number" class="s" min="0" max="255" > . <input name="H2" type="number" class="s" min="0" max="255" > . <input name="H3" type="number" class="s" min="0" max="255" ><br> <b>Press the pushlink button on the bridge, after that save this page!</b><br> (when first connecting)<br> Hue status: <span class="sip"> Disabled in this build </span> </div> <h3>Serial</h3> Baud rate: <select name=BD> <option value=1152>115200</option> <option value=2304>230400</option> <option value=4608>460800</option> <option value=5000>500000</option> <option value=5760>576000</option> <option value=9216>921600</option> <option value=10000>1000000</option> <option value=15000>1500000</option> </select><br> <i>Keep at 115200 to use Improv. Some boards may not support high rates.</i> <hr> <button type="button" onclick="B()">Back</button><button type="submit">Save</button> </form> </body> </html>