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.
		
		
		
		
		
			
		
			
				
					
					
						
							211 lines
						
					
					
						
							8.4 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							211 lines
						
					
					
						
							8.4 KiB
						
					
					
				
								<!doctype html>
							 | 
						|
								<html>
							 | 
						|
								    <head>
							 | 
						|
								        <title>Serial Console</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>
							 | 
						|
								    </head>
							 | 
						|
								    <body>
							 | 
						|
								        <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>
							 | 
						|
								        <div id="wrapper">
							 | 
						|
								            <div id="content">
							 | 
						|
								                <div class="serial">
							 | 
						|
								                    <textarea id="serial" cols="80" rows="20" readonly></textarea><br/>
							 | 
						|
								                    connected: <span class="dot" id="connected"></span>
							 | 
						|
								                    Uptime: <span id="uptime"></span>
							 | 
						|
								                    <input type="button" value="clear" class="btn" id="clear"/>
							 | 
						|
								                    <input type="button" value="autoscroll" class="btn" id="scroll"/>
							 | 
						|
								                    <br/>
							 | 
						|
								                    <br/>
							 | 
						|
								                    <br/>
							 | 
						|
								                    <br/>
							 | 
						|
								                    <hr>
							 | 
						|
								                    <h3>Commands</h3>
							 | 
						|
								                    <br/>
							 | 
						|
								                    <label for="iv">Select Inverter:</label>
							 | 
						|
								                    <select name="iv" id="InvID">
							 | 
						|
								                    </select>
							 | 
						|
								                    <br/>
							 | 
						|
								                    <div id="power">
							 | 
						|
								                        <input type="button" value="Restart" class="btn" id="restart"/>
							 | 
						|
								                        <input type="button" value="Turn Off" class="btn" id="power_off"/>
							 | 
						|
								                        <input type="button" value="Turn On" class="btn" id="power_on"/>
							 | 
						|
								                    </div>
							 | 
						|
								                    <br/>
							 | 
						|
								                    <br/>
							 | 
						|
								                    <br/>
							 | 
						|
								                    <br/>
							 | 
						|
								                    <br/>
							 | 
						|
								                    <label>Send Power Limit: </label>
							 | 
						|
								                    <input type="number" class="text" name="pwrlimval" maxlength="4"/>
							 | 
						|
								                    <label> </label>
							 | 
						|
								                    <select name="pwrlimcntrl" id="pwrlimcntrl">
							 | 
						|
								                        <option value="" selected disabled hidden>select the unit and persistence</option>
							 | 
						|
								                        <option value="0">absolute in Watt non persistent</option>
							 | 
						|
								                        <option value="1">relative in percent non persistent</option>
							 | 
						|
								                        <option value="256">absolute in Watt persistent</option>
							 | 
						|
								                        <option value="257">relative in percent persistent</option>
							 | 
						|
								                    </select>
							 | 
						|
								                    <br/>
							 | 
						|
								                    <input type="button" value="Send Power Limit" class="btn" id="sendpwrlim"/>
							 | 
						|
								                    <br/>
							 | 
						|
								                    <p>Ctrl result: <span id="result">n/a</span></p>
							 | 
						|
								                </div>
							 | 
						|
								            </div>
							 | 
						|
								        </div>
							 | 
						|
								        <div id="footer">
							 | 
						|
								            <div class="left">
							 | 
						|
								                AhoyDTU © 2022
							 | 
						|
								                <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">
							 | 
						|
								                <span id="version"></span><br/><br/>
							 | 
						|
								                <a href="https://creativecommons.org/licenses/by-nc-sa/3.0/de" target="_blank" >CC BY-NC-SA 3.0</a>
							 | 
						|
								            </div>
							 | 
						|
								        </div>
							 | 
						|
								        <script type="text/javascript">
							 | 
						|
								            var mAutoScroll = true;
							 | 
						|
								            var con = document.getElementById("serial");
							 | 
						|
								            var exeOnce = true;
							 | 
						|
								
							 | 
						|
								            function parseSys(obj) {
							 | 
						|
								                var up = obj["ts_uptime"];
							 | 
						|
								                var days = parseInt(up / 86400) % 365;
							 | 
						|
								                var hrs  = parseInt(up / 3600) % 24;
							 | 
						|
								                var min  = parseInt(up / 60) % 60;
							 | 
						|
								                var sec  = up % 60;
							 | 
						|
								                document.getElementById("uptime").innerHTML = days + " Days, "
							 | 
						|
								                    + ("0"+hrs).substr(-2) + ":"
							 | 
						|
								                    + ("0"+min).substr(-2) + ":"
							 | 
						|
								                    + ("0"+sec).substr(-2);
							 | 
						|
								
							 | 
						|
								                if(true == exeOnce) {
							 | 
						|
								                    parseVersion(obj);
							 | 
						|
								                    window.setInterval("getAjax('/api/system', parseSys)", 10000);
							 | 
						|
								                    exeOnce = false;
							 | 
						|
								                }
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            function parse(root) {
							 | 
						|
								                parseMenu(root["menu"]);
							 | 
						|
								                select = document.getElementById('InvID');
							 | 
						|
								
							 | 
						|
								                if(null == root) return;
							 | 
						|
								                root = root.inverter;
							 | 
						|
								                for(var i = 0; i < root.inverter.length; i++) {
							 | 
						|
								                    inv = root.inverter[i];
							 | 
						|
								                    var opt = document.createElement('option');
							 | 
						|
								                    opt.value = inv.id;
							 | 
						|
								                    opt.innerHTML = inv.name;
							 | 
						|
								                    select.appendChild(opt);
							 | 
						|
								                }
							 | 
						|
								
							 | 
						|
								                // set time offset for serial console
							 | 
						|
								                var obj = new Object();
							 | 
						|
								                obj.cmd = "serial_utc_offset";
							 | 
						|
								                obj.ts  = new Date().getTimezoneOffset() * -60;
							 | 
						|
								                getAjax("/api/setup", null, "POST", JSON.stringify(obj));
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            document.getElementById("clear").addEventListener("click", function() {
							 | 
						|
								                con.value = "";
							 | 
						|
								            });
							 | 
						|
								            document.getElementById("scroll").addEventListener("click", function() {
							 | 
						|
								                mAutoScroll = !mAutoScroll;
							 | 
						|
								                this.value = (mAutoScroll) ? "autoscroll" : "manual scoll";
							 | 
						|
								            });
							 | 
						|
								
							 | 
						|
								            if (!!window.EventSource) {
							 | 
						|
								                var source = new EventSource('/events');
							 | 
						|
								                source.addEventListener('open', function(e) {
							 | 
						|
								                    document.getElementById("connected").style.backgroundColor = "#0c0";
							 | 
						|
								                }, false);
							 | 
						|
								
							 | 
						|
								                source.addEventListener('error', function(e) {
							 | 
						|
								                    if (e.target.readyState != EventSource.OPEN) {
							 | 
						|
								                        document.getElementById("connected").style.backgroundColor = "#f00";
							 | 
						|
								                    }
							 | 
						|
								                }, false);
							 | 
						|
								
							 | 
						|
								                source.addEventListener('serial', function(e) {
							 | 
						|
								                    con.value += e.data.replace(/\<rn\>/g, '\r\n');
							 | 
						|
								                    if(mAutoScroll)
							 | 
						|
								                        con.scrollTop = con.scrollHeight;
							 | 
						|
								                }, false);
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            getAjax("/api/system", parseSys);
							 | 
						|
								
							 | 
						|
								            // only for test
							 | 
						|
								            function ctrlCb(obj) {
							 | 
						|
								                var e = document.getElementById("result");
							 | 
						|
								                if(obj["success"])
							 | 
						|
								                    e.innerHTML = "ok";
							 | 
						|
								                else
							 | 
						|
								                    e.innerHTML = "Error: " + obj["error"];
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            function get_selected_iv() {
							 | 
						|
								                var e = document.getElementById("InvID");
							 | 
						|
								                return  parseInt(e.value);
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            const wrapper = document.getElementById('power');
							 | 
						|
								
							 | 
						|
								            wrapper.addEventListener('click', (event) => {
							 | 
						|
								                var power = event.target.value;
							 | 
						|
								                var obj = new Object();
							 | 
						|
								
							 | 
						|
								                switch (power)
							 | 
						|
								                {
							 | 
						|
								                    case "Turn On":
							 | 
						|
								                        obj.cmd = 0;
							 | 
						|
								                        break;
							 | 
						|
								                    case "Turn Off":
							 | 
						|
								                        obj.cmd = 1;
							 | 
						|
								                        break;
							 | 
						|
								                    default:
							 | 
						|
								                        obj.cmd = 2;
							 | 
						|
								                }            
							 | 
						|
								
							 | 
						|
								                obj.inverter = get_selected_iv();
							 | 
						|
								                obj.tx_request = 81;
							 | 
						|
								                getAjax("/api/ctrl", ctrlCb, "POST", JSON.stringify(obj));
							 | 
						|
								            });
							 | 
						|
								
							 | 
						|
								            document.getElementById("sendpwrlim").addEventListener("click", function() {
							 | 
						|
								                var val = parseInt(document.getElementsByName('pwrlimval')[0].value);
							 | 
						|
								                var ctrl = parseInt(document.getElementsByName('pwrlimcntrl')[0].value);
							 | 
						|
								                
							 | 
						|
								                if((ctrl == 1 || ctrl == 257) && unit < 2) unit = 2;
							 | 
						|
								                if(isNaN(val) || isNaN(ctrl)) 
							 | 
						|
								                {
							 | 
						|
								                    var tmp = (isNaN(val)) ? "Value" : "Unit";
							 | 
						|
								                    document.getElementById("result").textContent = tmp + " is missing";
							 | 
						|
								                    return;
							 | 
						|
								                }
							 | 
						|
								                
							 | 
						|
								                var obj = new Object();
							 | 
						|
								                obj.inverter = get_selected_iv();
							 | 
						|
								                obj.cmd = 11;
							 | 
						|
								                obj.tx_request = 81;
							 | 
						|
								                obj.payload = [val, ctrl];
							 | 
						|
								                getAjax("/api/ctrl", ctrlCb, "POST", JSON.stringify(obj));
							 | 
						|
								            });
							 | 
						|
								
							 | 
						|
								            getAjax("/api/setup", parse);
							 | 
						|
								        </script>
							 | 
						|
								    </body>
							 | 
						|
								</html>
							 | 
						|
								
							 |