mirror of https://github.com/lumapu/ahoy.git
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.
612 lines
29 KiB
612 lines
29 KiB
<!doctype html>
|
|
<html>
|
|
<head>
|
|
<title>Setup</title>
|
|
<link rel="stylesheet" type="text/css" href="style.css"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<script type="text/javascript" src="api.js"></script>
|
|
<script type="text/javascript">
|
|
function load() {
|
|
for(it of document.getElementsByClassName("s_collapsible")) {
|
|
it.addEventListener("click", function() {
|
|
this.classList.toggle("active");
|
|
var content = this.nextElementSibling;
|
|
content.style.display = (content.style.display === "block") ? "none" : "block";
|
|
});
|
|
}
|
|
}
|
|
</script>
|
|
</head>
|
|
<body onload="load()">
|
|
<div class="topnav">
|
|
<a href="/" class="title">AhoyDTU</a>
|
|
<a href="javascript:void(0);" class="icon" onclick="topnav()">
|
|
<span></span>
|
|
<span></span>
|
|
<span></span>
|
|
</a>
|
|
<div id="topnav" class="hide"></div>
|
|
<div id="wifiicon" class="info"></div>
|
|
</div>
|
|
<div id="wrapper">
|
|
<div id="content">
|
|
<form method="post" action="/save">
|
|
<fieldset>
|
|
<legend class="des">Device Host Name</legend>
|
|
<label for="device">Device Name</label>
|
|
<input type="text" name="device" class="text"/>
|
|
</fieldset>
|
|
|
|
<button type="button" class="s_collapsible">Network</button>
|
|
<div class="s_content">
|
|
<fieldset>
|
|
<legend class="des">WiFi</legend>
|
|
<p>Enter the credentials to your prefered WiFi station. After rebooting the device tries to connect with this information.</p>
|
|
<label for="scanbtn">Search Networks</label>
|
|
<input type="button" name="scanbtn" id="scanbtn" class="btn" value="scan" onclick="scan()"/><br/>
|
|
<label for="networks">Avail Networks</label>
|
|
<select name="networks" id="networks" onChange="selNet()">
|
|
<option value="-1" selected disabled hidden>not scanned</option>
|
|
</select>
|
|
<label for="ssid">SSID</label>
|
|
<input type="text" name="ssid" class="text"/>
|
|
<label for="pwd">Password</label>
|
|
<input type="password" class="text" name="pwd" value="{PWD}"/>
|
|
</fieldset>
|
|
<fieldset>
|
|
<legend class="des">Static IP (optional)</legend>
|
|
<p>
|
|
Leave fields blank for DHCP<br/>
|
|
The following fields are parsed in this format: 192.168.1.1
|
|
</p>
|
|
<label for="ipAddr">IP Address</label>
|
|
<input type="text" name="ipAddr" class="text" maxlength="15" />
|
|
<label for="ipMask">Submask</label>
|
|
<input type="text" name="ipMask" class="text" maxlength="15" />
|
|
<label for="ipDns1">DNS 1</label>
|
|
<input type="text" name="ipDns1" class="text" maxlength="15" />
|
|
<label for="ipDns2">DNS 2</label>
|
|
<input type="text" name="ipDns2" class="text" maxlength="15" />
|
|
<label for="ipGateway">Gateway</label>
|
|
<input type="text" name="ipGateway" class="text" maxlength="15" />
|
|
</fieldset>
|
|
</div>
|
|
|
|
<button type="button" class="s_collapsible">Protection</button>
|
|
<div class="s_content">
|
|
<fieldset>
|
|
<legend class="des">Protection</legend>
|
|
<label for="adminpwd">Admin Password</label>
|
|
<input type="password" name="adminpwd" class="text" value="{PWD}"/>
|
|
<input type="hidden" name="disclaimer" value="false" id="disclaimer">
|
|
<p>Select pages which should be protected by password</p>
|
|
<div id="prot_mask"></div>
|
|
</fieldset>
|
|
</div>
|
|
|
|
<button type="button" class="s_collapsible">Inverter</button>
|
|
<div class="s_content">
|
|
<fieldset>
|
|
<legend class="des">Inverter</legend>
|
|
<div id="inverter"></div><br/>
|
|
<input type="button" id="btnAdd" class="btn" value="Add Inverter"/>
|
|
<p class="subdes">General</p>
|
|
<label for="invInterval">Interval [s]</label>
|
|
<input type="text" class="text" name="invInterval" pattern="[0-9]+" title="Invalid input"/>
|
|
<label for="invRetry">Max retries per Payload</label>
|
|
<input type="text" class="text" name="invRetry"/>
|
|
</fieldset>
|
|
</div>
|
|
|
|
<button type="button" class="s_collapsible">NTP Server</button>
|
|
<div class="s_content">
|
|
<fieldset>
|
|
<legend class="des">NTP Server</legend>
|
|
<label for="ntpAddr">NTP Server / IP</label>
|
|
<input type="text" class="text" name="ntpAddr"/>
|
|
<label for="ntpPort">NTP Port</label>
|
|
<input type="text" class="text" name="ntpPort"/>
|
|
<label for="ntpBtn">set system time</label>
|
|
<input type="button" name="ntpBtn" id="ntpBtn" class="btn" value="from browser" onclick="setTime()"/>
|
|
<input type="button" name="ntpSync" id="ntpSync" class="btn" value="sync NTP" onclick="syncTime()"/>
|
|
<span id="apiResultNtp"></span>
|
|
</fieldset>
|
|
</div>
|
|
|
|
<button type="button" class="s_collapsible">Sunrise & Sunset</button>
|
|
<div class="s_content">
|
|
<fieldset>
|
|
<legend class="des">Sunrise & Sunset</legend>
|
|
<p>
|
|
Latitude and Longitude must be set to be stored! decimal separator: '.' (dot)
|
|
</p>
|
|
<label for="sunLat">Latitude (decimal)</label>
|
|
<input type="text" class="text" name="sunLat"/>
|
|
<label for="sunLon">Longitude (decimal)</label>
|
|
<input type="text" class="text" name="sunLon"/>
|
|
<label for="sunOffs">Offset (pre sunrise, post sunset)</label>
|
|
<select name="sunOffs"></select>
|
|
<br>
|
|
<label for="sunDisNightCom">disable night communication</label>
|
|
<input type="checkbox" class="cb" name="sunDisNightCom"/><br/>
|
|
</fieldset>
|
|
</div>
|
|
|
|
<button type="button" class="s_collapsible">MQTT</button>
|
|
<div class="s_content">
|
|
<fieldset>
|
|
<legend class="des">MQTT</legend>
|
|
<label for="mqttAddr">Broker / Server IP</label>
|
|
<input type="text" class="text" name="mqttAddr"/>
|
|
<label for="mqttPort">Port</label>
|
|
<input type="text" class="text" name="mqttPort"/>
|
|
<label for="mqttUser">Username (optional)</label>
|
|
<input type="text" class="text" name="mqttUser"/>
|
|
<label for="mqttPwd">Password (optional)</label>
|
|
<input type="password" class="text" name="mqttPwd"/>
|
|
<label for="mqttTopic">Topic</label>
|
|
<input type="text" class="text" name="mqttTopic" pattern="[A-Za-z0-9./#$%&=+_-]+" title="Invalid input" />
|
|
<label for="mqttRstMid">Reset YieldDay at Midnight</label>
|
|
<input type="checkbox" class="cb" name="mqttRstMid"/><br/>
|
|
<label for="mqttRstComStop">Reset Values at Communication stop</label>
|
|
<input type="checkbox" class="cb" name="mqttRstComStop"/><br/>
|
|
<label for="mqttRstNotAvail">Reset Values on 'not available'</label>
|
|
<input type="checkbox" class="cb" name="mqttRstNotAvail"/><br/>
|
|
<p class="des">Send Inverter data in a fixed interval, even if there is no change. A value of '0' disables the fixed interval. The data is published once it was successfully received from inverter. (default: 0)</p>
|
|
<label for="mqttIntvl">Interval [s]</label>
|
|
<input type="text" class="text" name="mqttInterval" pattern="[0-9]+" title="Invalid input" />
|
|
<label for="mqttBtn">Discovery Config (homeassistant)</label>
|
|
<input type="button" name="mqttDiscovery" id="mqttDiscovery" class="btn" value="send" onclick="sendDiscoveryConfig()"/>
|
|
<span id="apiResultMqtt"></span>
|
|
</fieldset>
|
|
</div>
|
|
|
|
<button type="button" class="s_collapsible">System Config</button>
|
|
<div class="s_content">
|
|
<fieldset>
|
|
<legend class="des">System Config</legend>
|
|
<p class="des">Pinout</p>
|
|
<div id="pinout"></div>
|
|
|
|
<p class="des">Radio (NRF24L01+)</p>
|
|
<div id="rf24"></div>
|
|
|
|
<p class="des">Serial Console</p>
|
|
<label for="serEn">print inverter data</label>
|
|
<input type="checkbox" class="cb" name="serEn"/><br/>
|
|
<label for="serDbg">Serial Debug</label>
|
|
<input type="checkbox" class="cb" name="serDbg"/><br/>
|
|
<label for="serIntvl">Interval [s]</label>
|
|
<input type="text" class="text" name="serIntvl" pattern="[0-9]+" title="Invalid input"/>
|
|
</fieldset>
|
|
</div>
|
|
|
|
<button type="button" class="s_collapsible">Display Config</button>
|
|
<div class="s_content">
|
|
<fieldset>
|
|
<legend class="des">Display Config</legend>
|
|
<div id="dispType"></div>
|
|
<label for="logoEn">Show Logo</label>
|
|
<input type="checkbox" class="cb" name="logoEn"/><br/>
|
|
<label for="dispPwr">Turn off while inverters are offline</label>
|
|
<input type="checkbox" class="cb" name="dispPwr"/><br/>
|
|
<label for="dispPxSh">Enable pixel shifting</label>
|
|
<input type="checkbox" class="cb" name="dispPxSh"/><br/>
|
|
<label for="disp180">Rotate 180 degree</label>
|
|
<input type="checkbox" class="cb" name="disp180"/><br/>
|
|
|
|
<label for="dispCont">Contrast</label>
|
|
<select name="dispCont" id="contrast"></select>
|
|
<p class="des">Pinout</p>
|
|
<div id="dispPins"></div>
|
|
</fieldset>
|
|
</div>
|
|
|
|
<div class="mt-3">
|
|
<label for="reboot">Reboot device after successful save</label>
|
|
<input type="checkbox" class="cb" name="reboot" checked />
|
|
<input type="submit" value="save" class="btn right"/>
|
|
</div>
|
|
<div class="hr mb-3 mt-3"></div>
|
|
<div class="mb-4">
|
|
<a class="btn" href="/erase">ERASE SETTINGS (not WiFi)</a>
|
|
<fieldset>
|
|
<legend class="des">Upload / Store JSON Settings</legend>
|
|
<form id="form" method="POST" action="/upload" enctype="multipart/form-data" accept-charset="utf-8">
|
|
<input type="file" name="upload">
|
|
<input type="button" class="btn" value="Upload" onclick="hide()">
|
|
</form>
|
|
</fieldset>
|
|
<a class="btn" href="/get_setup" target="_blank">Download settings (JSON file)</a> (only saved values, passwords will be removed!)
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
<div id="footer">
|
|
<div class="left">
|
|
<a href="https://ahoydtu.de" target="_blank">AhoyDTU © 2023</a>
|
|
<ul>
|
|
<li><a href="https://discord.gg/WzhxEY62mB" target="_blank">Discord</a></li>
|
|
<li><a href="https://github.com/lumapu/ahoy" target="_blank">Github</a></li>
|
|
</ul>
|
|
</div>
|
|
<div class="right">
|
|
<ul>
|
|
<li><span id="version"></span></li>
|
|
<li><span id="esp_type"></span></li>
|
|
<li><a href="https://creativecommons.org/licenses/by-nc-sa/3.0/de" target="_blank" >CC BY-NC-SA 3.0</a></li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<script type="text/javascript">
|
|
var highestId = 0;
|
|
var maxInv = 0;
|
|
|
|
var esp8266pins = [
|
|
[255, "off / default"],
|
|
[0, "D3 (GPIO0)"],
|
|
[1, "TX (GPIO1)"],
|
|
[2, "D4 (GPIO2)"],
|
|
[3, "RX (GPIO3)"],
|
|
[4, "D2 (GPIO4, SDA)"],
|
|
[5, "D1 (GPIO5, SCL)"],
|
|
[6, "GPIO6"],
|
|
[7, "GPIO7"],
|
|
[8, "GPIO8"],
|
|
[9, "GPIO9"],
|
|
[10, "GPIO10"],
|
|
[11, "GPIO11"],
|
|
[12, "D6 (GPIO12)"],
|
|
[13, "D7 (GPIO13)"],
|
|
[14, "D5 (GPIO14)"],
|
|
[15, "D8 (GPIO15)"],
|
|
[16, "D0 (GPIO16 - no IRQ!)"]
|
|
];
|
|
var esp32pins = [
|
|
[255, "off / default"],
|
|
[0, "GPIO0"],
|
|
[1, "TX (GPIO1)"],
|
|
[2, "GPIO2 (LED)"],
|
|
[3, "RX (GPIO3)"],
|
|
[4, "GPIO4"],
|
|
[5, "GPIO5"],
|
|
[12, "GPIO12"],
|
|
[13, "GPIO13"],
|
|
[14, "GPIO14"],
|
|
[15, "GPIO15"],
|
|
[16, "GPIO16"],
|
|
[17, "GPIO17"],
|
|
[18, "GPIO18"],
|
|
[19, "GPIO19"],
|
|
[21, "GPIO21 (SDA)"],
|
|
[22, "GPIO22 (SCL)"],
|
|
[23, "GPIO23"],
|
|
[25, "GPIO25"],
|
|
[26, "GPIO26"],
|
|
[27, "GPIO27"],
|
|
[32, "GPIO32"],
|
|
[33, "GPIO33"],
|
|
[34, "GPIO34"],
|
|
[35, "GPIO35"],
|
|
[36, "VP (GPIO36)"],
|
|
[39, "VN (GPIO39)"]
|
|
];
|
|
|
|
const re = /11[2,4,6]1.*/;
|
|
|
|
document.getElementById("btnAdd").addEventListener("click", function() {
|
|
if(highestId <= (maxInv-1)) {
|
|
ivHtml(JSON.parse('{"enabled":true,"name":"","serial":"","channels":4,"ch_max_power":[0,0,0,0],"ch_name":["","","",""]}'), highestId);
|
|
}
|
|
});
|
|
|
|
function apiCbWifi(obj) {
|
|
var e = document.getElementById("networks");
|
|
selDelAllOpt(e);
|
|
if(obj["success"])
|
|
e.appendChild(opt("-1", "scanning ..."))
|
|
else
|
|
e.appendChild(opt("-1", "Error: " + obj["error"]));
|
|
}
|
|
|
|
function apiCbNtp(obj) {
|
|
var e = document.getElementById("apiResultNtp");
|
|
if(obj["success"])
|
|
e.innerHTML = "command excuted";
|
|
else
|
|
e.innerHTML = "Error: " + obj["error"];
|
|
}
|
|
|
|
function apiCbMqtt(obj) {
|
|
var e = document.getElementById("apiResultMqtt");
|
|
if(obj["success"])
|
|
e.innerHTML = "command excuted";
|
|
else
|
|
e.innerHTML = "Error: " + obj["error"];
|
|
}
|
|
|
|
function setTime() {
|
|
var date = new Date();
|
|
var obj = new Object();
|
|
obj.cmd = "set_time";
|
|
obj.val = parseInt(date.getTime() / 1000);
|
|
getAjax("/api/setup", apiCbNtp, "POST", JSON.stringify(obj));
|
|
}
|
|
|
|
function scan() {
|
|
var obj = new Object();
|
|
obj.cmd = "scan_wifi";
|
|
getAjax("/api/setup", apiCbWifi, "POST", JSON.stringify(obj));
|
|
setTimeout(function() {getAjax('/api/setup/networks', listNetworks)}, 5000);
|
|
}
|
|
|
|
function syncTime() {
|
|
var obj = new Object();
|
|
obj.cmd = "sync_ntp";
|
|
getAjax("/api/setup", apiCbNtp, "POST", JSON.stringify(obj));
|
|
}
|
|
|
|
function sendDiscoveryConfig() {
|
|
var obj = new Object();
|
|
obj.cmd = "discovery_cfg";
|
|
getAjax("/api/setup", apiCbMqtt, "POST", JSON.stringify(obj));
|
|
}
|
|
|
|
function hide() {
|
|
document.getElementById("form").submit();
|
|
var e = document.getElementById("content");
|
|
e.replaceChildren(span("upload started"));
|
|
}
|
|
|
|
function delIv() {
|
|
var id = this.id.substring(0,4);
|
|
var e = document.getElementsByName(id + "Addr")[0];
|
|
e.value = "";
|
|
e.dispatchEvent(new Event("keyup"));
|
|
e.dispatchEvent(new Event("change"));
|
|
document.getElementsByName(id + "Name")[0].value = "";
|
|
}
|
|
|
|
function ivHtml(obj, id) {
|
|
highestId = id + 1;
|
|
if(highestId == maxInv)
|
|
setHide("btnAdd", true);
|
|
iv = document.getElementById("inverter");
|
|
iv.appendChild(des("Inverter " + id));
|
|
id = "inv" + id;
|
|
|
|
iv.appendChild(lbl(id + "Enable", "Communication Enable"));
|
|
var en = inp(id + "Enable", null, null, ["cb"], id + "Enable", "checkbox");
|
|
en.checked = obj["enabled"];
|
|
iv.appendChild(en);
|
|
iv.appendChild(br());
|
|
|
|
iv.appendChild(lbl(id + "Addr", "Serial Number (12 digits)*"));
|
|
var addr = inp(id + "Addr", obj["serial"], 12, ["text"], null, "text", "[0-9]+", "Invalid input");
|
|
iv.appendChild(addr);
|
|
['keyup', 'change'].forEach(function(evt) {
|
|
addr.addEventListener(evt, (e) => {
|
|
var serial = addr.value.substring(0,4);
|
|
var max = 0;
|
|
for(var i=0;i<4;i++) {
|
|
setHide(id+"ModPwr"+i, true);
|
|
setHide(id+"ModName"+i, true);
|
|
}
|
|
setHide("lbl"+id+"ModPwr", true);
|
|
setHide("lbl"+id+"ModName", true);
|
|
|
|
if(serial.charAt(0) == 1) {
|
|
if((serial.charAt(1) == 0) || (serial.charAt(1) == 1)) {
|
|
if((serial.charAt(3) == 1) || (serial.charAt(3) == 2)) {
|
|
switch(serial.charAt(2)) {
|
|
case "2": max = 1; break;
|
|
case "4": max = 2; break;
|
|
case "6": max = 4; break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if(max != 0) {
|
|
for(var i=0;i<max;i++) {
|
|
setHide(id+"ModPwr"+i, false);
|
|
setHide(id+"ModName"+i, false);
|
|
}
|
|
setHide("lbl"+id+"ModPwr", false);
|
|
setHide("lbl"+id+"ModName", false);
|
|
}
|
|
})
|
|
});
|
|
|
|
iv.append(
|
|
lbl(id + "Name", "Name*"),
|
|
inp(id + "Name", obj["name"], 32, ["text"], null, "text", "[A-Za-z0-9./#$%&=+_-]+", "Invalid input")
|
|
);
|
|
|
|
for(var j of [["ModPwr", "ch_max_power", "Max Module Power (Wp)", 4, "[0-9]+"], ["ModName", "ch_name", "Module Name", 16, null]]) {
|
|
var cl = (re.test(obj["serial"])) ? null : ["hide"];
|
|
iv.appendChild(lbl(null, j[2], cl, "lbl" + id + j[0]));
|
|
d = div([j[0]]);
|
|
i = 0;
|
|
cl = (re.test(obj["serial"])) ? ["text", "sh"] : ["text", "sh", "hide"];
|
|
for(it of obj[j[1]]) {
|
|
d.appendChild(inp(id + j[0] + i, it, j[3], cl, id + j[0] + i, "text", j[4], "Invalid input"));
|
|
i++;
|
|
}
|
|
iv.appendChild(d);
|
|
}
|
|
|
|
iv.append(
|
|
br(),
|
|
lbl(id + "YieldCor", "Yield Total Correction (will be subtracted) [kWh]"),
|
|
inp(id + "YieldCor", obj["yieldCor"], 32, ["text"], null, "text", "[0-9]+", "Invalid input")
|
|
);
|
|
|
|
var del = inp(id+"del", "X", 0, ["btn", "btnDel"], id+"del", "button");
|
|
del.addEventListener("click", delIv);
|
|
iv.append(
|
|
lbl(id + "lbldel", "Delete"),
|
|
del
|
|
);
|
|
}
|
|
|
|
function ivGlob(obj) {
|
|
for(var i of [["invInterval", "interval"], ["invRetry", "retries"]])
|
|
document.getElementsByName(i[0])[0].value = obj[i[1]];
|
|
}
|
|
|
|
function parseSys(obj) {
|
|
for(var i of [["device", "device_name"], ["ssid", "ssid"]])
|
|
document.getElementsByName(i[0])[0].value = obj[i[1]];
|
|
var e = document.getElementsByName("adminpwd")[0];
|
|
if(!obj["pwd_set"])
|
|
e.value = "";
|
|
var d = document.getElementById("prot_mask");
|
|
var a = ["Index", "Live", "Serial / Console", "Settings", "Update", "System"]
|
|
for(var i = 0; i < 6; i++) {
|
|
var chkd = ((obj["prot_mask"] & (1 << i)) == (1 << i));
|
|
var sp = lbl("protMask" + i, a[i]);
|
|
var cb = inp("protMask" + i, null, null, ["cb"], "protMask" + i, "checkbox", null, null, chkd);
|
|
if(0 == i)
|
|
d.replaceChildren(sp, cb, br());
|
|
else
|
|
d.append(sp, cb, br());
|
|
}
|
|
}
|
|
|
|
function parseGeneric(obj) {
|
|
parseVersion(obj);
|
|
parseESP(obj);
|
|
parseRssi(obj);
|
|
}
|
|
|
|
function parseStaticIp(obj) {
|
|
for(var i of [["ipAddr", "ip"], ["ipMask", "mask"], ["ipDns1", "dns1"], ["ipDns2", "dns2"], ["ipGateway", "gateway"]])
|
|
if(null != obj[i[1]])
|
|
document.getElementsByName(i[0])[0].value = obj[i[1]];
|
|
}
|
|
|
|
function parseIv(obj) {
|
|
for(var i = 0; i < obj.inverter.length; i++)
|
|
ivHtml(obj.inverter[i], i);
|
|
ivGlob(obj);
|
|
maxInv = obj["max_num_inverters"];
|
|
}
|
|
|
|
function parseMqtt(obj) {
|
|
for(var i of [["Addr", "broker"], ["Port", "port"], ["User", "user"], ["Pwd", "pwd"], ["Topic", "topic"], ["Interval", "interval"]])
|
|
document.getElementsByName("mqtt"+i[0])[0].value = obj[i[1]];
|
|
|
|
for(var i of [["Mid", "rstMid"], ["ComStop", "rstNAvail"], ["NotAvail", "rstComStop"]])
|
|
document.getElementsByName("mqttRst"+i[0])[0].checked = obj[i[1]];
|
|
}
|
|
|
|
function parseNtp(obj) {
|
|
for(var i of [["ntpAddr", "addr"], ["ntpPort", "port"]])
|
|
document.getElementsByName(i[0])[0].value = obj[i[1]];
|
|
}
|
|
|
|
function parseSun(obj) {
|
|
document.getElementsByName("sunLat")[0].value = obj["lat"];
|
|
document.getElementsByName("sunLon")[0].value = obj["lon"];
|
|
document.getElementsByName("sunDisNightCom")[0].checked = obj["disnightcom"];
|
|
const sel = document.getElementsByName("sunOffs")[0];
|
|
for(var i = 0; i <= 60; i++) {
|
|
sel.appendChild(opt(i, i + " minutes", (i == (obj["offs"] / 60))));
|
|
}
|
|
}
|
|
|
|
function parsePinout(obj, type) {
|
|
var e = document.getElementById("pinout");
|
|
pins = [['cs', 'pinCs'], ['ce', 'pinCe'], ['irq', 'pinIrq'], ['led0', 'pinLed0'], ['led1', 'pinLed1']];
|
|
for(p of pins) {
|
|
e.appendChild(lbl(p[1], p[0].toUpperCase()));
|
|
e.appendChild(sel(p[1], ("ESP8266" == type) ? esp8266pins : esp32pins, obj[p[0]]));
|
|
}
|
|
}
|
|
|
|
function parseRadio(obj) {
|
|
var e = document.getElementById("rf24");
|
|
e.appendChild(lbl("rf24Power", "Amplifier Power Level"));
|
|
e.appendChild(sel("rf24Power", [
|
|
[0, "MIN"],
|
|
[1, "LOW"],
|
|
[2, "HIGH"],
|
|
[3, "MAX"]
|
|
], obj["power_level"]));
|
|
}
|
|
|
|
function parseSerial(obj) {
|
|
for(var i of [["serEn", "show_live_data"], ["serDbg", "debug"]])
|
|
document.getElementsByName(i[0])[0].checked = obj[i[1]];
|
|
document.getElementsByName("serIntvl")[0].value = obj["interval"];
|
|
}
|
|
|
|
function parseDisplay(obj, type) {
|
|
for(var i of [["logoEn", "logo_en"], ["dispPwr", "disp_pwr"], ["dispPxSh", "px_shift"], ["disp180", "rot180"]])
|
|
document.getElementsByName(i[0])[0].checked = obj[i[1]];
|
|
|
|
var e = document.getElementById("dispPins");
|
|
pins = [['SCL / CS', 'pinDisp0'], ['SDA / DC', 'pinDisp1']];
|
|
for(p of pins) {
|
|
e.appendChild(lbl(p[1], p[0].toUpperCase()));
|
|
e.appendChild(sel(p[1], ("ESP8266" == type) ? esp8266pins : esp32pins, obj[p[1]]));
|
|
}
|
|
|
|
var opts = [[0, "None"], [1, "Nokia5110"], [2, "SSD1306 0.96\""], [3, "SH1106 1.3\""]];
|
|
document.getElementById("dispType").append(
|
|
lbl("dispType", "Type"),
|
|
sel("dispType", opts, obj["disp_type"])
|
|
);
|
|
|
|
e = document.getElementById("contrast");
|
|
for(var i = 30; i < 101; i += 2) {
|
|
e.appendChild(opt(i, i, (i == obj["contrast"])));
|
|
}
|
|
}
|
|
|
|
function parse(root) {
|
|
if(null != root) {
|
|
parseMenu(root["menu"]);
|
|
parseSys(root["system"]);
|
|
parseGeneric(root["generic"]);
|
|
parseStaticIp(root["static_ip"]);
|
|
parseIv(root["inverter"]);
|
|
parseMqtt(root["mqtt"]);
|
|
parseNtp(root["ntp"]);
|
|
parseSun(root["sun"]);
|
|
parsePinout(root["pinout"], root["system"]["esp_type"]);
|
|
parseRadio(root["radio"]);
|
|
parseSerial(root["serial"]);
|
|
parseDisplay(root["display"], root["system"]["esp_type"]);
|
|
}
|
|
}
|
|
|
|
function listNetworks(root) {
|
|
var s = document.getElementById("networks");
|
|
selDelAllOpt(s);
|
|
if(root["networks"].length > 0) {
|
|
s.appendChild(opt("-1", "please select network"));
|
|
for(i = 0; i < root["networks"].length; i++) {
|
|
s.appendChild(opt(root["networks"][i]["ssid"], root["networks"][i]["ssid"] + " (" + root["networks"][i]["rssi"] + " dBm)"));
|
|
}
|
|
}
|
|
else
|
|
s.appendChild(opt("-1", "no network found"));
|
|
}
|
|
|
|
function selNet() {
|
|
var s = document.getElementById("networks");
|
|
var e = document.getElementsByName("ssid")[0];
|
|
if(-1 != s.value)
|
|
e.value = s.value;
|
|
}
|
|
|
|
hiddenInput = document.getElementById("disclaimer")
|
|
hiddenInput.value = sessionStorage.getItem("gDisclaimer");
|
|
|
|
getAjax("/api/setup", parse);
|
|
|
|
</script>
|
|
</body>
|
|
</html>
|
|
|