<!doctype html> <html> <head> <title>Live</title> <link rel="stylesheet" type="text/css" href="style.css"/> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="apple-mobile-web-app-capable" content="yes"> <script type="text/javascript" src="api.js"></script> </head> <body> <h1>AHOY</h1> <div id="content" class="content"> <div id="live"></div> <p>Every <span id="refresh"></span> seconds the values are updated</p> </div> <div id="footer"> <p class="left">© 2022</p> <p class="left"><a href="/">Home</a></p> <p class="right" id="version"></p> </div> <script type="text/javascript"> var intervalSet = false; function parseSys(obj) { document.getElementById("version").innerHTML = "Git SHA: " + obj["build"] + " :: " + obj["version"]; } function parseIv(obj, root) { var ivHtml = []; var tDiv = div(["ch-all", "iv"]); tDiv.appendChild(span("Total", ["head"])); var total = new Array(root.ch0_fld_names.length).fill(0); if(obj.length > 1) ivHtml.push(tDiv); for(var iv of obj) { main = div(["iv"]); var ch0 = div(["ch-iv"]); var limit = iv["power_limit_read"] + "%"; if(limit == "65535%") limit = "n/a"; ch0.appendChild(span(iv["name"] + " Limit " + limit + " | last Alarm: " + iv["last_alarm"], ["head"])); for(var j = 0; j < root.ch0_fld_names.length; j++) { var val = Math.round(iv["ch"][0][j] * 100) / 100; if(val > 0) { var sub = div(["subgrp"]); sub.appendChild(span(val + " " + span(root["ch0_fld_units"][j], ["unit"]).innerHTML, ["value"])); sub.appendChild(span(root["ch0_fld_names"][j], ["info"])); ch0.appendChild(sub); switch(j) { case 2: total[j] += val; break; // P_AC case 6: total[j] += val; break; // YieldTotal case 7: total[j] += val; break; // YieldDay case 8: total[j] += val; break; // P_DC case 10: total[j] += val; break; // Q_AC } } } main.appendChild(ch0); for(var i = 1; i < (iv["channels"] + 1); i++) { var ch = div(["ch"]); ch.appendChild(span(("" == iv["ch_names"][i]) ? ("CHANNEL " + i) : iv["ch_names"][i], ["head"])); for(var j = 0; j < root.fld_names.length; j++) { var val = Math.round(iv["ch"][i][j] * 100) / 100; if(val > 0) { ch.appendChild(span(val + " " + span(root["fld_units"][j], ["unit"]).innerHTML, ["value"])); ch.appendChild(span(root["fld_names"][j], ["info"])); } } main.appendChild(ch); } var ts = div(["ts"]); var ageInfo = "Last received data requested at: "; if(iv["ts_last_success"] > 0) { var date = new Date(iv["ts_last_success"] * 1000); ageInfo += date.toLocaleString('de-DE'); } else ageInfo += "nothing received"; ts.innerHTML = ageInfo; main.appendChild(ts); ivHtml.push(main); } // total if(obj.length > 1) { for(var j = 0; j < root.ch0_fld_names.length; j++) { var val = total[j]; if(val > 0) { var sub = div(["subgrp"]); sub.appendChild(span(val + " " + span(root["ch0_fld_units"][j], ["unit"]).innerHTML, ["value"])); sub.appendChild(span(root["ch0_fld_names"][j], ["info"])); tDiv.appendChild(sub); } } } document.getElementById("live").replaceChildren(...ivHtml); } function parse(obj) { if(null != obj) { parseSys(obj["system"]); parseIv(obj["inverter"], obj); document.getElementById("refresh").innerHTML = obj["refresh_interval"]; if(false == intervalSet) { window.setInterval("getAjax('/api/live', parse)", obj["refresh_interval"] * 1000); intervalSet = true; } } else document.getElementById("refresh").innerHTML = "n/a"; } getAjax("/api/live", parse); </script> </body> </html>