360 lines
14 KiB
HTML
360 lines
14 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
|
<meta name="description" content="">
|
|
<title>Beer Gravity Monitor</title>
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
|
|
<style>
|
|
.row-margin-10 { margin-top: 1.0em; }
|
|
</style>
|
|
</head>
|
|
|
|
<body class="py-4">
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
|
|
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
|
|
|
|
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
|
<div class="container">
|
|
<a class="navbar-brand" href="/index.htm">Beer Gravity Monitor</a>
|
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
|
|
<span class="navbar-toggler-icon"></span>
|
|
</button>
|
|
<div class="collapse navbar-collapse" id="navbarNav">
|
|
<ul class="navbar-nav">
|
|
<li class="nav-item">
|
|
<a class="nav-link active" href="#">Home</a>
|
|
</li>
|
|
<li class="nav-item dropdown">
|
|
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
|
Configuration
|
|
</a>
|
|
<ul class="dropdown-menu">
|
|
<li><a class="dropdown-item" href="/config.htm">Configuration</a></li>
|
|
<li><a class="dropdown-item" href="/format.htm">Format editor</a></li>
|
|
<li><a class="dropdown-item" href="/test.htm">Test push</a></li>
|
|
<li><a class="dropdown-item" href="/firmware.htm">Upload firmware</a></li>
|
|
</ul>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a class="nav-link" href="/calibration.htm">Calibration</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a class="nav-link" href="/about.htm">About</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
<div class="spinner-border text-light" id="spinner" role="status"></div>
|
|
</div>
|
|
</nav>
|
|
|
|
|
|
<!-- START MAIN INDEX -->
|
|
|
|
<div class="container row-margin-10">
|
|
|
|
<div class="alert alert-success alert-dismissible hide fade d-none" role="alert">
|
|
<div id="alert"></div>
|
|
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
|
</div>
|
|
|
|
<script type="text/javascript">
|
|
function showError( msg ) {
|
|
console.log("Error:" + msg);
|
|
$('.alert').removeClass('alert-success').addClass('alert-danger').removeClass('hide').addClass('show').removeClass('d-none');
|
|
$('#alert').text( msg );
|
|
}
|
|
|
|
function showSuccess( msg ) {
|
|
console.log("Success:" + msg);
|
|
$('.alert').addClass('alert-success').removeClass('alert-danger').removeClass('hide').addClass('show').removeClass('d-none');
|
|
$('#alert').text( msg );
|
|
}
|
|
|
|
$("#alert-btn").click(function(e){
|
|
console.log("Disable");
|
|
$('.alert').addClass('hide').removeClass('show').addClass('d-none');
|
|
});
|
|
</script>
|
|
|
|
<div class="accordion" id="accordion">
|
|
|
|
<h2 class="accordion-header" id="headingData">
|
|
<button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#collapseData" aria-expanded="true" aria-controls="collapseData">
|
|
<b>Measurement</b>
|
|
</button>
|
|
</h2>
|
|
<div id="collapseData" class="accordion-collapse collapse show" aria-labelledby="headingData" data-bs-parent="#accordion">
|
|
<div class="accordion-body">
|
|
|
|
<div class="row mb-3">
|
|
<div class="col-md-4 bg-light">Gravity:</div>
|
|
<div class="col-md-4 bg-light" id="gravity">Loading...</div>
|
|
</div>
|
|
<div class="row mb-3">
|
|
<div class="col-md-4 bg-light">Temperature:</div>
|
|
<div class="col-md-4 bg-light" id="temp">Loading...</div>
|
|
</div>
|
|
<div class="row mb-3">
|
|
<div class="col-md-4 bg-light">Angle/Tilt:</div>
|
|
<div class="col-md-4 bg-light" id="angle">Loading...</div>
|
|
</div>
|
|
<div class="row mb-3">
|
|
<div class="col-md-4 bg-light">Battery:</div>
|
|
<div class="col-md-4 bg-light" id="battery">Loading...</div>
|
|
</div>
|
|
|
|
<div class="row mb-3">
|
|
<div class="col-md-4 bg-light">Average runtime:</div>
|
|
<div class="col-md-4 bg-light" id="runtime">Loading...</div>
|
|
</div>
|
|
|
|
<div class="row mb-3">
|
|
<div class="col-md-8 bg-light custom-control custom-checkbox">
|
|
<input type="checkbox" class="custom-control-input" name="sleep-mode" id="sleep-mode" disabled>
|
|
<label class="custom-control-label" for="sleep-mode">Do not enter sleep mode when floating (check this if you are collecting angles/tilt for calibration).</label>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<div class="accordion-item">
|
|
<h2 class="accordion-header" id="headingSoftware">
|
|
<button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#collapseSoftware" aria-expanded="true" aria-controls="collapseSoftware">
|
|
<b>Device</b>
|
|
</button>
|
|
</h2>
|
|
<div id="collapseSoftware" class="accordion-collapse collapse show" aria-labelledby="headingSoftware" data-bs-parent="#accordion">
|
|
<div class="accordion-body">
|
|
<div class="row mb-3">
|
|
<div class="col-md-4 bg-light">Current version:</div>
|
|
<div class="col-md-4 bg-light" id="app-ver">Loading...</div>
|
|
</div>
|
|
<div class="row mb-3" id="h-app-ver-new" hidden>
|
|
<div class="col-md-4 bg-light">New version:</div>
|
|
<div class="col-md-4 bg-light" id="app-ver-new">Loading...</div>
|
|
</div>
|
|
<div class="row mb-3">
|
|
<div class="col-md-4 bg-light">Host name:</div>
|
|
<div class="col-md-4 bg-light" id="mdns">Loading...</div>
|
|
</div>
|
|
<div class="row mb-3">
|
|
<div class="col-md-4 bg-light">Device ID:</div>
|
|
<div class="col-md-4 bg-light" id="id">Loading...</div>
|
|
</div>
|
|
<div class="row mb-3">
|
|
<div class="col-md-4 bg-light">Platform:</div>
|
|
<div class="col-md-4 bg-light" id="platform">Loading...</div>
|
|
</div>
|
|
<div class="row mb-3">
|
|
<div class="col-md-4 bg-light">SSID:</div>
|
|
<div class="col-md-4 bg-light" id="wifi-ssid">Loading...</div>
|
|
</div>
|
|
|
|
<script>
|
|
$("#log-btn").click(function(e){
|
|
loadLog();
|
|
});
|
|
setInterval(function() {
|
|
loadLog();
|
|
}, 5000);
|
|
|
|
function loadLog() {
|
|
$("#logContent").load("/log");
|
|
//$("#logContent").load("/test/log");
|
|
};
|
|
</script>
|
|
|
|
<button class="btn btn-primary btn-sm" type="button" data-bs-toggle="collapse" data-bs-target="#collapseLog" aria-expanded="false" aria-controls="collapseLog" data-bs-toggle="tooltip" title="Load and show the last 10 errors that has occured on the device">
|
|
View error log
|
|
</button>
|
|
|
|
<button class="btn btn-secondary btn-sm" type="button" data-bs-toggle="tooltip" name="github-btn" id="github-btn" title="Go to github and place a issue">
|
|
Submit a issue on github
|
|
</button>
|
|
|
|
<button class="btn btn-secondary btn-sm" type="button" data-bs-toggle="collapse" data-bs-target="#collapseSupport" aria-expanded="false" aria-controls="collapseSupport" data-bs-toggle="tooltip" name="support-btn" id="support-btn" title="Collect data relevant for a support case">
|
|
Gather support information
|
|
</button>
|
|
|
|
<div class="collapse row-margin-10" id="collapseLog">
|
|
<div class="card card-body">
|
|
<pre><code class="card-text" id="logContent"></code></pre>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="collapse row-margin-10" id="collapseSupport">
|
|
<div class="card card-body">
|
|
<pre><code class="card-text" id="supportContent"></code></pre>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<script type="text/javascript">
|
|
var debug = {};
|
|
|
|
window.onload = start;
|
|
|
|
$("#github-btn").click(function(e){
|
|
window.location.href = "https://github.com/mp-se/gravitymon/issues";
|
|
});
|
|
|
|
$("#support-btn").click(function(e){
|
|
$('#spinner').show();
|
|
|
|
var url = "/api/config";
|
|
//var url = "/test/config.json";
|
|
$.getJSON(url, function (cfg) {
|
|
debug = {};
|
|
debug["mdns"] = cfg["mdns"];
|
|
debug["id"] = cfg["id"];
|
|
|
|
debug["sleep-interval"] = cfg["sleep-interval"];
|
|
debug["temp-format"] = cfg["temp-format"];
|
|
|
|
debug["gravity-format"] = cfg["gravity-format"];
|
|
debug["gravity-temp-adjustment"] = cfg["gravity-temp-adjustment"];
|
|
|
|
debug["voltage-factor"] = cfg["voltage-factor"];
|
|
debug["platform"] = cfg["platform"];
|
|
debug["ble"] = cfg["ble"];
|
|
debug["gyro-temp"] = cfg["gyro-temp"];
|
|
debug["gyro-calibration-data"] = cfg["gyro-calibration-data"];
|
|
debug["temp-adjustment-value"] = cfg["temp-adjustment-value"];
|
|
|
|
var url = "/api/status";
|
|
//var url = "/test/status.json";
|
|
$.getJSON(url, function (cfg) {
|
|
debug["runtime-average"] = cfg["runtime-average"];
|
|
debug["rssi"] = cfg["rssi"];
|
|
debug["app-ver"] = cfg["app-ver"];
|
|
debug["app-build"] = cfg["app-build"];
|
|
});
|
|
|
|
var url = "/api/config/format";
|
|
//var url = "/test/format.json";
|
|
$.getJSON(url, function (cfg) {
|
|
debug["formats"] = cfg;
|
|
|
|
var url = "/api/config/advanced";
|
|
//var url = "/test/adv.json";
|
|
$.getJSON(url, function (cfg) {
|
|
debug["advanced"] = cfg;
|
|
|
|
var url = "/api/upload";
|
|
//var url = "/test/upload.json";
|
|
$.getJSON(url, function (cfg) {
|
|
debug["files"] = cfg;
|
|
|
|
var url = "/log";
|
|
//var url = "/test/log";
|
|
$.ajax({url: url, method: 'get', success: function (data) {
|
|
debug["log"] = data.split("\n");
|
|
var s = JSON.stringify(debug, null, 2);
|
|
$("#supportContent").text( s );
|
|
$('#spinner').hide();
|
|
//navigator.clipboard.writeText(s);
|
|
//alert("Support information copied to clipboard");
|
|
}
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
$("#sleep-mode").click(function(e){
|
|
console.log( "Blocking sleep mode = " + $("#sleep-mode").is(":checked"));
|
|
$.ajax( {
|
|
type: "POST",
|
|
url: "/api/status/sleepmode",
|
|
data: { "id": $("#id").text(), "sleep-mode": $("#sleep-mode").is(":checked") },
|
|
success: function(result) { },
|
|
error: function(result) { showError('Could not update sleep mode for device.'); },
|
|
} );
|
|
});
|
|
|
|
function getStatus() {
|
|
var url = "/api/status";
|
|
//var url = "/test/status.json";
|
|
$('#spinner').show();
|
|
|
|
$.getJSON(url, function (cfg) {
|
|
console.log( cfg );
|
|
|
|
$("#app-ver").text(cfg["app-ver"] + " (" + cfg["app-build"] + ")");
|
|
$("#mdns").text(cfg["mdns"]);
|
|
$("#id").text(cfg["id"]);
|
|
$("#platform").text(cfg["platform"]);
|
|
$("#wifi-ssid").text(cfg["wifi-ssid"]);
|
|
$("#runtime").text(cfg["runtime-average"] + " seconds");
|
|
|
|
var angle = cfg["angle"];
|
|
|
|
if(angle==0) {
|
|
$("#angle").text("Gyro moving");
|
|
$("#gravity").text("Gyro moving");
|
|
} else {
|
|
$("#angle").text(cfg["angle"]);
|
|
|
|
if( cfg["gravity-format"] == "G")
|
|
$("#gravity").text(cfg["gravity"] + " SG");
|
|
else
|
|
$("#gravity").text(cfg["gravity"] + " °P");
|
|
}
|
|
|
|
var batt = cfg["battery"];
|
|
var charge = 0;
|
|
|
|
if(batt>4.15) charge = 100;
|
|
else if(batt>4.05) charge = 90;
|
|
else if(batt>3.97) charge = 80;
|
|
else if(batt>3.91) charge = 70;
|
|
else if(batt>3.86) charge = 60;
|
|
else if(batt>3.81) charge = 50;
|
|
else if(batt>3.78) charge = 40;
|
|
else if(batt>3.76) charge = 30;
|
|
else if(batt>3.73) charge = 20;
|
|
else if(batt>3.67) charge = 10;
|
|
else if(batt>3.44) charge = 5;
|
|
|
|
$("#battery").text(batt + " V (" + charge + "%)" );
|
|
|
|
if( cfg["temp-format"] == "C")
|
|
$("#temp").text(cfg["temp-c"] + " C");
|
|
else
|
|
$("#temp").text(cfg["temp-f"] + " F");
|
|
|
|
if( cfg["sleep-mode"] )
|
|
$("#sleep-mode").attr("checked", true );
|
|
else
|
|
$("#sleep-mode").attr("checked", false );
|
|
$("#sleep-mode").removeAttr("disabled");
|
|
})
|
|
.fail(function () {
|
|
showError('Unable to get data from the device.');
|
|
})
|
|
.always(function() {
|
|
$('#spinner').hide();
|
|
});
|
|
}
|
|
|
|
function start() {
|
|
setInterval(getStatus, 3000);
|
|
}
|
|
</script>
|
|
|
|
<!-- START FOOTER -->
|
|
|
|
<div class="container themed-container bg-primary text-light row-margin-10">(C) Copyright 2021-22 Magnus Persson</div>
|
|
</body>
|
|
</html> |