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.
		
		
		
		
		
			
		
			
				
					
					
						
							605 lines
						
					
					
						
							29 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							605 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 © 2022</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 === "1161") max = 4; | |
|                         else if(serial === "1141") max = 2; | |
|                         else if(serial === "1121") max = 1; | |
|                         else max = 0; | |
| 
 | |
|                         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>
 | |
| 
 |