2025-06-15 18:39:43 -07:00

2293 lines
85 KiB
HTML

<!--
Written By: Robert Zmrzli robert@zmrinc.com
devices.html
-->
<!DOCTYPE html>
<html>
<head>
<title>WellPlugs Administrator</title>
<style>
html, body {
height: 100%;
margin: 0;
}
div.helper {
position: fixed;
bottom: 0;
left: 0px;
}
.full-height {
height: 150%;
background: yellow;
}
input[type="text"]
{
font-size:12px;
}
select.my_dropdown {
width:100px;
}
/*IE FIX */
select#my_dropdown {
width:100px;
}
select:focus#my_dropdown {
width:100px\9;
}
.small-button {
border: none;
color: white;
padding: 1px 1px;
text-align: center;
display: inline-block;
font-size: 12px;
margin: 1px 1px;
cursor: pointer;
background-color: #00A000;
height:24px;
width:60px;
border-radius: 5px;
box-shadow: 0 2px #999;
}
.small-button:hover {background-color: #808080; font-color: #0000ff}
.small-button:active {
background-color: #00ff00;
box-shadow: 0 4px #666;
transform: translateY(2px);
}
.wider-button {
border: none;
color: white;
padding: 1px 1px;
text-align: center;
display: inline-block;
font-size: 12px;
margin: 1px 1px;
cursor: pointer;
background-color: #00A000;
height:24px;
width:80px;
border-radius: 5px;
box-shadow: 0 2px #999;
}
</style>
<meta charset="UTF-8" />
<!--[if lt IE 9]>
<script src="http://bellacon.com/js/src/excanvas/excanvas_text.js"></script>
<script src="http://bellacon.com/js/src/excanvas/canvas.text.js"></script>
<![endif]-->
<script src="https://eluxnetworks.net/js/src/teechart.js" type="text/javascript"></script>
<script
src="https://eluxnetworks.net/js/src/teechart-extras.js"
type="text/javascript"
></script>
<script src="https://eluxnetworks.net/js/src/jquery-2.1.3.js" type="text/javascript"></script>
<script src="https://eluxnetworks.net/js/src/demo.js" type="text/javascript"></script>
<!-- Bootstrap -->
<link
href="https://eluxnetworks.net/js/3rd_party/bootstrap/dist/css/bootstrap.min.css"
rel="stylesheet"
/>
<!-- Font Awesome -->
<link
href="https://eluxnetworks.net/js/3rd_party/font-awesome-4.6.3/css/font-awesome-4.6.3/css/font-awesome.min.css"
rel="stylesheet"
/>
<!-- NProgress -->
<!-- Custom Theme Style -->
<link href="https://eluxnetworks.net/js/3rd_party/build/css/custom.min.css" rel="stylesheet" />
<link rel="stylesheet" type="text/css" href="https://eluxnetworks.net/js/src/demo.css" />
<script src="https://eluxnetworks.net/js/src/date.format.js" type="text/javascript"></script>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"
/>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.min.js"
type="text/javascript"
></script>
<script src="https://cdn.jsdelivr.net/pako/1.0.3/pako.min.js"></script>
<script type="text/javascript">
var MAXESChart;
var AsChart;
var sensed_value_glob = 0;
var tim_value_glob = 0;
var chart_index_glob = 0;
var MAX_POINTS = 3600;
var start_time = Date.now();
var GLOB_HEIGHT = "100";
var fresh = true;
var secs_in_day = 86400;
var signature = "devices.htm" + start_time.toString();
var Indexes = {
Maximums_RAW_max_val: 0,
Maximums_RAW_a: 1,
Maximums_RAW_b: 2,
Maximums_RAW_c: 3,
};
function sendToBackend(topicl, send_what) {
// Once a connection has been made, make a subscription and send a message.
console.log("sendToBackend "+topicl+":" + send_what);
if (topicl.substr(topicl.length - 4) == "_cmp") {
//var djson = new TextDecoder("utf-8").encode(send_what);
var compressedJSON = pako.deflate(send_what);
//var message.payloadBytes= compressedJSON;
message = new Paho.MQTT.Message(compressedJSON);
message.destinationName = topicl;
}
else {
message = new Paho.MQTT.Message(send_what);
message.destinationName = topicl;
}
client.send(message);
}
function RequestFromDB(group, deployment, location, is_fresh) {
timee = Date.now();
user = document.getElementById("user").value;
key = document.getElementById("ps").value;
var obj = {
function: "request_devices",
group: group,
deployment: deployment,
location: location,
fresh:is_fresh,
time:timee,
user:user,
ps:key,
signature:signature
};
var json = JSON.stringify(obj);
sendToBackend("/wellget_cmp", json);
}
function RequestDeploymentProximity() {
timee = Date.now();
user = document.getElementById("user").value;
key = document.getElementById("ps").value;
deployment = document.getElementById("Deployments").value;
var obj = {
function: "request_proximity",
deployment: deployment,
time:timee,
user:user,
ps:key,
signature:signature
};
var json = JSON.stringify(obj);
sendToBackend("/wellget_cmp", json);
}
function CopyDeploymentProximity() {
$("#Proximity").empty();
var oldSel = $("#Proximity").get(0);
var table = document.getElementById("devices");
var rowCount = table.rows.length;
for (var i = 1; i < rowCount; i++) {
cell = table.rows[i].cells[0];
if(cell.innerText.length > 0) {
var opt = document.createElement('option');
opt.text = cell.innerText;
opt.value = cell.innerText;
oldSel.add(opt, null);
}
}
}
function WriteDeploymentProximity() {
timee = Date.now();
user = document.getElementById("user").value;
key = document.getElementById("ps").value;
deployment = document.getElementById("Deployments").value;
proximity_string = "";
var proximity_list = $("#Proximity").get(0);
if(proximity_list.length > 0){
proximity_string = proximity_list[0].innerText;
for (i = 1; i < proximity_list.length; i++)
{
proximity_string = proximity_string +","+proximity_list[i].innerText;
}
}
var obj = {
function: "write_proximity",
deployment: deployment,
proximity_string: proximity_string,
time:timee,
user:user,
ps:key,
signature:signature
};
var json = JSON.stringify(obj);
sendToBackend("/wellget_cmp", json);
}
function RequestFWsUpdate(device_settings) {
timee = Date.now();
user = document.getElementById("user").value;
key = document.getElementById("ps").value;
group = document.getElementById("group_id").value;
deployment = document.getElementById("Deployments").value;
locationn = document.getElementById("Locations").value;
//lets prevent FW updates to devices lower than 200
var table = document.getElementById("devices");
var rowCount = table.rows.length;
//If all are enabled, request group update, othervise request d
which_tags = [];
all_selected = true;
for (var i = 1; i < rowCount; i++) {
cell = table.rows[i].cells[8];
checkm = cell.children[0];
if (checkm.checked) {
cell = table.rows[i].cells[0];
device_id = parseInt(cell.innerText);
if (device_id >= 200){ //Prevent updates to older devices
MAC = table.rows[i].cells[1].innerText;
//FW = table.rows[i].cells[3].childNodes[0].data;
var tag_info = MAC;
which_tags.push(tag_info);
}
}
else {
all_selected = false;
}
}
var obj = {
function: "update_fws",
group: group,
deployment: deployment,
location: locationn,
time:timee,
user:user,
ps:key,
signature:signature,
device_settings:device_settings,
which_tags: which_tags,
all_selected:all_selected
};
var json = JSON.stringify(obj);
sendToBackend("/wellget_cmp", json);
}
function RequestDevsUpdate(device_settings) {
timee = Date.now();
user = document.getElementById("user").value;
key = document.getElementById("ps").value;
group = document.getElementById("group_id").value;
deployment = document.getElementById("Deployments").value;
locationn = document.getElementById("Locations").value;
var table = document.getElementById("devices");
var rowCount = table.rows.length;
//If all are enabled, request group update, othervise request d
which_tags = [];
all_selected = true;
for (var i = 1; i < rowCount; i++) {
cell = table.rows[i].cells[8];
checkm = cell.children[0];
if (checkm.checked) {
MAC = table.rows[i].cells[1].innerText;
//FW = table.rows[i].cells[3].childNodes[0].data;
var tag_info = MAC;
which_tags.push(tag_info);
}
else {
all_selected = false;
};
}
var obj = {
function: "update_devices",
group: group,
deployment: deployment,
location: locationn,
time:timee,
user:user,
ps:key,
signature:signature,
device_settings:device_settings,
which_tags: which_tags,
all_selected:all_selected
};
var json = JSON.stringify(obj);
sendToBackend("/wellget_cmp", json);
}
function DoRefresh() {
//Lets determine db_file,from_time, to_time from selected options
btn = document.getElementById("set_device_s");
//if (btn.innerText == "Set Devices") { //single
groups = document.getElementById("group_id").value;
deployments = document.getElementById("Deployments").value;
locations = document.getElementById("Locations").value;
RequestFromDB(groups, deployments, locations, fresh);
//}
}
function ShowDeployment(do_show) {
var x = document.getElementById("deployment_info");
var x1 = document.getElementById("deployment_info1");
if (do_show == true) {
x.style.display = "block";
x1.style.display = "block";
} else {
x.style.display = "none";
x1.style.display = "none";
}
}
function DeploymentChange() {
deployments = document.getElementById("Deployments").value;
if(deployments == "0" || deployments == "-1" || deployments == "All" || deployments == "") {
ShowDeployment(false);
}
else {
ShowDeployment(true);
RequestDeploymentProximity();
}
}
function resize() {
var body = document.body;
var count = 0;
//h = Math.min( window.innerHeight, document.body.clientHeight )
h = window.innerHeight;
try {
if (MAXESChart.canvas.clientHeight > 0) count = count + 1;
if (AsChart.canvas.clientHeight > 0) count = count + 1;
} catch (err) {
count = 3;
}
//var devlist = document.getElementById("devslist");
//devlist.offsetHeight = 50;
//how many are visible
GLOB_HEIGHT = (h - 2 * 100) / count;
//var devs_table = document.getElementById("devslist");
//devs_table.height = 100%;
try {
MAXESChart.canvas.height = 100;//GLOB_HEIGHT;
MAXESChart.canvas.width = body.clientWidth;
MAXESChart.bounds.width = MAXESChart.canvas.width - 100;
MAXESChart.bounds.height = MAXESChart.canvas.height;
//changeTheme(MAXESChart, "minimal");
//changeTheme(AsChart, "minimal");
} catch (err) {}
}
function draw() {
console.log("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
ShowDeployment(false);
MAXESChart = new Tee.Chart("canvas1");
console.log(document.getElementById("privilidges").value);
if (parseInt(document.getElementById("privilidges").value) >0) {
document.getElementById("DEVICE_ID").readOnly = true;
document.getElementById("GroupPanel").style.display = 'none';
document.getElementById("firmware").style.display = 'none';
document.getElementById("key_panel").style.display = 'none';
document.getElementById("SSIDSes").style.display = 'none';
document.getElementById("details1").style.display = 'none';
document.getElementById("single_info").style.left = '440px';
document.getElementById("deployment_info").style.left = '960px';
document.getElementById("deployment_info1").style.left = '870px';
}
else {
document.getElementById("DEVICE_ID").readOnly = false;
document.getElementById("GroupPanel").style.visibility = 'visible';
document.getElementById("firmware").style.display = 'visible';
document.getElementById("key_panel").style.display = 'visible';
document.getElementById("SSIDSes").style.display = 'visible';
document.getElementById("details1").style.display = 'visible';
document.getElementById("single_info").style.left = '540px';
document.getElementById("deployment_info").style.left = '1160px';
document.getElementById("deployment_info1").style.left = '1260px';
}
ConnectMQTT();
}
function GraphUpdate(which_Graph, tim_value, sensed_value, series_index) {
//sensed_value_glob =
function newData(now) {
if (!now) now = new Date().getTime();
}
if (document.getElementById("live-check").checked == false) {
which_Graph = "";
}
switch (which_Graph) {
case "PressuresChart":
chart_index_glob = 0;
series = PressuresChart.series.items[series_index];
var d = series.data.values,
x = series.data.x,
t,
l = d.length;
d[l] = sensed_value;
x[l] = 1000 * tim_value;
if (l > MAX_POINTS) {
d.shift();
x.shift();
}
changeTheme(PressuresChart, "minimal");
PressuresChart.draw();
requestAnimFrame(newData, PressuresChart, 1);
break;
case "TemperaturesChart":
chart_index_glob = 2;
series = TemperaturesChart.series.items[series_index];
var d = series.data.values,
x = series.data.x,
t,
l = d.length;
d[l] = sensed_value;
x[l] = 1000 * tim_value;
if (l > MAX_POINTS) {
d.shift();
x.shift();
}
changeTheme(TemperaturesChart, "minimal");
TemperaturesChart.draw();
requestAnimFrame(newData, TemperaturesChart, 1);
break;
case "AirQualsChart":
chart_index_glob = 1;
series = AirQualsChart.series.items[series_index];
var d = series.data.values,
x = series.data.x,
t,
l = d.length;
d[l] = sensed_value;
x[l] = 1000 * tim_value;
if (l > MAX_POINTS) {
d.shift();
x.shift();
}
changeTheme(AirQualsChart, "minimal");
AirQualsChart.draw();
requestAnimFrame(newData, AirQualsChart, 1);
break;
case "HumidChart":
chart_index_glob = 3;
series = HumidChart.series.items[series_index];
var d = series.data.values,
x = series.data.x,
t,
l = d.length;
d[l] = sensed_value;
x[l] = 1000 * tim_value;
if (l > MAX_POINTS) {
d.shift();
x.shift();
}
changeTheme(HumidChart, "minimal");
//HumidChart.draw();
requestAnimFrame(newData, HumidChart, 1);
break;
}
}
function showTutorial(name) {
document.myform.stage.value = name;
}
function ConnectMQTT() {
// Create a client instance
//hostname = "a1f5050e4717b47d69fa4ea4262fb425-1493152587.us-east-2.elb.amazonaws.com"; //"127.0.0.1";
//hostname = "wellnua.com"; //"eluxnetworks.net"; //3.12.6.23";
hostname = "104.168.190.251"; //"99.105.56.85";
port = 9001;
topic = "/wellget";
console.log("Connecting to: ", hostname);
client = new Paho.MQTT.Client(
hostname,
Number(port),
signature
);
// set callback handlers
client.onConnectionLost = onConnectionLost;
client.onMessageArrived = onMessageArrived;
// connect the client
client.connect({
onSuccess: onConnect,
userName: "telegraf",
password: "well18",
});
// called when the client connects
function onConnect() {
// Once a connection has been made, make a subscription and send a message.
console.log("onConnect");
client.subscribe("/well_cmp"+signature);
//client.subscribe("/well");
console.log("Subscribed to: /well_cmp"+signature);
message = new Paho.MQTT.Message("Hello");
message.destinationName = topic;
client.send(message);
var from_time = 0; //dummy, not used with "latest"
var to_time = 0;
db_file = "latest";
if (fresh == true) {
//Request only first time
groups = "0";//document.getElementById("group_id").value;
deployments = "0";//document.getElementById("Deployments").value;
locations = "0";//document.getElementById("Locations").value;
RequestFromDB(groups, deployments, locations, fresh);
fresh = false;
}
}
// called when the client loses its connection
function onConnectionLost(responseObject) {
if (responseObject.errorCode !== 0) {
console.log("onConnectionLost:" + responseObject.errorMessage);
client.connect({
onSuccess: onConnect,
userName: "telegraf",
password: "well18",
});
}
}
function AddOrSet(Version) {
var dropdown = document.getElementById("FWs");
// Check if the option already exists
var existingOption = Array.from(dropdown.options).find(option => option.value === Version);
if (existingOption) {
// If the option exists, select it
existingOption.selected = true;
} else {
// If the option doesn't exist, add it and then select it
var newOption = document.createElement("option");
newOption.value = Version;
newOption.text = Version;
dropdown.add(newOption);
newOption.selected = true;
}
}
// called when a message arrives
// this can be dump of copressed or uncompressed data, or single time / values entry
function onMessageArrived(message) {
json = "";
dest = message.destinationName;
console.log(message);
if (dest.includes("_cmp")){
//compressed
var compressedJSON = message.payloadBytes;
console.log("onMessageArrived:" + compressedJSON.length);
var djson = pako.inflate(compressedJSON);
var json = new TextDecoder("utf-8").decode(djson);
} else {
//uncompressed
var json = message.payloadString;
}
console.log(json);
if (json.substr(json.length - 1)== "}" && json.substr(0,1)== "{"){
var obj = JSON.parse(json);
}
else {
showTutorial(json);
return;
}
if (obj.signature == signature) {
if (json.includes("Function")) {
if (obj.Function == "alert") {
alert(obj.message);
}
showTutorial(obj.Function);
if (obj.Function == "device_report") {
var settings = obj.settings;
//"settings": {"time": 1644384794.273, "group_id": 1, "deployment_id": null, "location_id": null, "description": null, "close_to": null, "owner_id": null, "other": null, "fw_version": "2.0.4", "scan_ble_every": 120, "scan_ble_for": 255, "slow_fast_ratio": 255, "nc_report": 255, "reboot": 0, "wifis": "CBX", "wifi_pass": "69696969", "last_ssids": null, "last_btles": null, "led_schema": "FFFFFFFFFFFFFFFFFFFF"}
MAC = settings["MAC"]
var x = document.getElementById("caption");
var last_reboot = 0;
if (x.innerHTML == "Settings") {
for (const [key, value] of Object.entries(settings)) {
switch (key) {
case "MAC":
break;
case "voc0_min":
case "voc0_max":
case "voc1_min":
case "voc1_max":
case "voc2_min":
case "voc2_max":
case "voc3_min":
case "voc3_max":
case "voc4_min":
case "voc4_max":
case "voc5_min":
case "voc5_max":
case "voc6_min":
case "voc6_max":
case "voc7_min":
case "voc7_max":
case "voc8_min":
case "voc8_max":
case "voc9_min":
case "voc9_max":
case "radar_max":
break;
case "id":
document.getElementById("DEVICE_ID").value = value;
break;
case "led_schema":
document.getElementById("LEDPATTERN").value = value;
break;
case "time":
document.getElementById("naslov").innerHTML = "Parameters as of: "+ new Date(1000*value);
last_time = value;
break;
case "group_id":
document.getElementById("group_id").value = value;
break;
case "deployment_id":
document.getElementById("Deployments").value = value;
break;
case "location_id":
document.getElementById("Locations").value = value;
break;
case "description":
document.getElementById("DESCRIPTION").value = value;
break;
case "close_to":
document.getElementById("CLOSETO").value = value;
break;
case "owner_id":
document.getElementById("Owners").value = value;
break;
case "other":
document.getElementById("OTHER").value = value;
break;
case "fw_version":
document.getElementById("FWs").value = value;
break;
case "scan_ble_every":
document.getElementById("BLEScanPeriod").value = value;
break;
case "scan_ble_for":
document.getElementById("BLEScanDuration").value = value;
break;
case "temperature_offset":
document.getElementById("TemperatureOffset").value = value;
break;
case "radar_threshold":
document.getElementById("RadarThreshold").value = value;
break;
case "slow_fast_ratio":
document.getElementById("S2FSR").value = value;
break;
case "reporting_period_s":
document.getElementById("reporting_period_s").value = value;
break;
case "nc_report":
document.getElementById("NCRE").value = value;
break;
case "reboot":
document.getElementById("LAST_REBOOT").value = value;
last_reboot = value;
break;
case "wifis":
document.getElementById("WIFISSID").value = value;
break;
case "wifi_pass":
document.getElementById("WIFIPASS").value = value;
break;
case "last_ssids":
document.getElementById("WFISS").value = value;
break;
case "last_btles":
document.getElementById("BTISS").value = value;
break;
default:
document.getElementById(key).value = value;
}
//console.log(key,value);
}
//lets update last_time and last_reboot in table row
var table = document.getElementById("devices");
var rowCount = table.rows.length;
now_time = parseInt(Date.now()/1000);
for (var i = 1; i < rowCount; i++) {
if (MAC == table.rows[i].cells[1].innerText) {
age = now_time - last_time;
table.rows[i].cells[2].innerText = ShowAge(age);
if (age < 300)
table.rows[i].style.backgroundColor = "#90D7FF";
else
table.rows[i].style.backgroundColor = "";
age = now_time - last_reboot;
table.rows[i].cells[3].innerText = ShowAge(age);
loc_str = document.getElementById("Locations").options[document.getElementById("Locations").selectedIndex].text;
table.rows[i].cells[5].innerText = loc_str;
break;
}
}
}
else {
if (MAC == x.innerHTML) {
for (const [key, value] of Object.entries(settings)) {
if (value != 'null'){
switch (key) {
case "MAC":
break;
case "voc0_min":
case "voc0_max":
case "voc1_min":
case "voc1_max":
case "voc2_min":
case "voc2_max":
case "voc3_min":
case "voc3_max":
case "voc4_min":
case "voc4_max":
case "voc5_min":
case "voc5_max":
case "voc6_min":
case "voc6_max":
case "voc7_min":
case "voc7_max":
case "voc8_min":
case "voc8_max":
case "voc9_min":
case "voc9_max":
case "radar_max":
break;
case "id":
document.getElementById("DEVICE_ID").value = value;
break;
case "led_schema":
document.getElementById("LEDPATTERN").value = value;
break;
case "time":
document.getElementById("naslov").innerHTML = "Parameters as of: "+ new Date(1000*value);
last_time = value;
break;
case "group_id":
document.getElementById("group_id").value = value;
break;
case "deployment_id":
document.getElementById("Deployments").value = value;
break;
case "location_id":
document.getElementById("Locations").value = value;
break;
case "description":
document.getElementById("DESCRIPTION").value = value;
break;
case "close_to":
document.getElementById("CLOSETO").value = value;
break;
case "owner_id":
document.getElementById("Owners").value = value;
break;
case "other":
document.getElementById("OTHER").value = value;
break;
case "fw_version":
document.getElementById("FWs").value = value;
break;
case "scan_ble_every":
document.getElementById("BLEScanPeriod").value = value;
break;
case "scan_ble_for":
document.getElementById("BLEScanDuration").value = value;
break;
case "temperature_offset":
document.getElementById("TemperatureOffset").value = value;
break;
case "radar_threshold":
document.getElementById("RadarThreshold").value = value;
break;
case "slow_fast_ratio":
document.getElementById("S2FSR").value = value;
break;
case "reporting_period_s":
document.getElementById("reporting_period_s").value = value;
case "nc_report":
document.getElementById("NCRE").value = value;
break;
case "reboot":
document.getElementById("LAST_REBOOT").value = value;
last_reboot = value;
break;
case "wifis":
document.getElementById("WIFISSID").value = value;
break;
case "wifi_pass":
document.getElementById("WIFIPASS").value = value;
break;
case "last_ssids":
document.getElementById("WFISS").value = value;
break;
case "last_btles":
document.getElementById("BTISS").value = value;
break;
default:
try {
document.getElementById(key).value = value;
} catch (error) {
console.log("Field not found: ", key);
}
}
}
//console.log(key,value);
}
//lets update last_time and last_reboot in table row
var table = document.getElementById("devices");
var rowCount = table.rows.length;
now_time = parseInt(Date.now()/1000);
for (var i = 1; i < rowCount; i++) {
if (MAC == table.rows[i].cells[1].innerText) {
age = now_time - last_time;
table.rows[i].cells[2].innerText = ShowAge(age);
if (age < 300)
table.rows[i].style.backgroundColor = "#90D7FF";
else
table.rows[i].style.backgroundColor = "";
age = now_time - last_reboot;
table.rows[i].cells[3].innerText = ShowAge(age);
table.rows[i].cells[4].innerText = settings["fw_version"];
//loc_str = document.getElementById("Locations").text;
if (document.getElementById("Locations").selectedIndex >=0){
loc_str = document.getElementById("Locations").options[document.getElementById("Locations").selectedIndex].text;
table.rows[i].cells[5].innerText = loc_str;
}
}
}
}
}
}
else if (obj.Function == "live_device_report") {
var settings = obj.settings;
//"settings": {"time": 1644384794.273, "group_id": 1, "deployment_id": null, "location_id": null, "description": null, "close_to": null, "owner_id": null, "other": null, "fw_version": "2.0.4", "scan_ble_every": 120, "scan_ble_for": 255, "slow_fast_ratio": 255, "nc_report": 255, "reboot": 0, "wifis": "CBX", "wifi_pass": "69696969", "last_ssids": null, "last_btles": null, "led_schema": "FFFFFFFFFFFFFFFFFFFF"}
MAC = settings["MAC"]
var x = document.getElementById("caption");
var last_reboot = 0;
if (x.innerHTML == "Settings") {
for (const [key, value] of Object.entries(settings)) {
if(value != 'null'){
switch (key) {
case "voc0_min":
case "voc0_max":
case "voc1_min":
case "voc1_max":
case "voc2_min":
case "voc2_max":
case "voc3_min":
case "voc3_max":
case "voc4_min":
case "voc4_max":
case "voc5_min":
case "voc5_max":
case "voc6_min":
case "voc6_max":
case "voc7_min":
case "voc7_max":
case "voc8_min":
case "voc8_max":
case "voc9_min":
case "voc9_max":
case "radar_max": case "MAC": //lets find row that contains this mac, and paint it red
break;
case "id":
//document.getElementById("DEVICE_ID").value = value;
break;
case "led_schema":
//document.getElementById("LEDPATTERN").value = value;
break;
case "time":
document.getElementById("naslov").innerHTML = "Parameters as of: "+ new Date(1000*value);
last_time = value;
break;
case "group_id":
//document.getElementById("group_id").value = value;
break;
case "deployment_id":
//document.getElementById("Deployments").value = value;
break;
case "location_id":
//document.getElementById("Locations").value = value;
document.getElementById("Locations").value = value;
break;
case "description":
document.getElementById("DESCRIPTION").value = value;
break;
case "close_to":
document.getElementById("CLOSETO").value = value;
break;
case "owner_id":
document.getElementById("Owners").value = value;
break;
case "other":
document.getElementById("OTHER").value = value;
break;
case "fw_version":
document.getElementById("FWs").value = value;
break;
case "scan_ble_every":
document.getElementById("BLEScanPeriod").value = value;
break;
case "scan_ble_for":
document.getElementById("BLEScanDuration").value = value;
break;
case "temperature_offset":
document.getElementById("TemperatureOffset").value = value;
break;
case "radar_threshold":
document.getElementById("RadarThreshold").value = value;
break;
case "slow_fast_ratio":
document.getElementById("S2FSR").value = value;
break;
case "reporting_period_s":
document.getElementById("reporting_period_s").value = value;
case "nc_report":
document.getElementById("NCRE").value = value;
break;
case "reboot":
document.getElementById("LAST_REBOOT").value = value;
last_reboot = value;
break;
case "wifis":
document.getElementById("WIFISSID").value = value;
break;
case "wifi_pass":
document.getElementById("WIFIPASS").value = value;
break;
case "last_ssids":
document.getElementById("WFISS").value = value;
break;
case "last_btles":
document.getElementById("BTISS").value = value;
break;
default:
document.getElementById(key).value = value;
}
//console.log(key,value);
}
}
//lets update last_time and last_reboot in table row
var table = document.getElementById("devices");
var rowCount = table.rows.length;
now_time = parseInt(Date.now()/1000);
for (var i = 1; i < rowCount; i++) {
if (MAC == table.rows[i].cells[1].innerText) {
age = now_time - last_time;
table.rows[i].cells[2].innerText = ShowAge(age);
if (age < 300)
table.rows[i].style.backgroundColor = "#90FFD7";
else
table.rows[i].style.backgroundColor = "";
age = now_time - last_reboot;
table.rows[i].cells[3].innerText = ShowAge(age);
table.rows[i].cells[4].innerText = settings["fw_version"];
loc_str = document.getElementById("Locations").options[document.getElementById("Locations").selectedIndex].text;
table.rows[i].cells[5].innerText = loc_str;
if(settings["description"] != 'null'){
table.rows[i].cells[6].innerText = settings["description"];
}
break;
}
}
}
else {
if (MAC == x.innerHTML) {
for (const [key, value] of Object.entries(settings)) {
if (value != 'null'){
switch (key) {
case "MAC":
case "voc0_min":
case "voc0_max":
case "voc1_min":
case "voc1_max":
case "voc2_min":
case "voc2_max":
case "voc3_min":
case "voc3_max":
case "voc4_min":
case "voc4_max":
case "voc5_min":
case "voc5_max":
case "voc6_min":
case "voc6_max":
case "voc7_min":
case "voc7_max":
case "voc8_min":
case "voc8_max":
case "voc9_min":
case "voc9_max":
case "radar_max":
break;
case "id":
//document.getElementById("DEVICE_ID").value = value;
break;
case "led_schema":
document.getElementById("LEDPATTERN").value = value;
break;
case "time":
document.getElementById("naslov").innerHTML = "Parameters as of: "+ new Date(1000*value);
last_time = value;
break;
case "group_id":
//document.getElementById("group_id").value = value;
break;
case "deployment_id":
//document.getElementById("Deployments").value = value;
break;
case "location_id":
//document.getElementById("Locations").value = value;
break;
case "description":
document.getElementById("DESCRIPTION").value = value;
break;
case "close_to":
document.getElementById("CLOSETO").value = value;
break;
case "owner_id":
document.getElementById("Owners").value = value;
break;
case "other":
document.getElementById("OTHER").value = value;
break;
case "fw_version":
AddOrSet(value);
//document.getElementById("FWs").value = value;
break;
case "scan_ble_every":
document.getElementById("BLEScanPeriod").value = value;
break;
case "scan_ble_for":
document.getElementById("BLEScanDuration").value = value;
break;
case "temperature_offset":
document.getElementById("TemperatureOffset").value = value;
break;
case "radar_threshold":
document.getElementById("RadarThreshold").value = value;
break;
case "slow_fast_ratio":
document.getElementById("S2FSR").value = value;
break;
case "reporting_period_s":
document.getElementById("reporting_period_s").value = value;
case "nc_report":
document.getElementById("NCRE").value = value;
break;
case "reboot":
document.getElementById("LAST_REBOOT").value = value;
last_reboot = value;
break;
case "wifis":
document.getElementById("WIFISSID").value = value;
break;
case "wifi_pass":
document.getElementById("WIFIPASS").value = value;
break;
case "last_ssids":
document.getElementById("WFISS").value = value;
break;
case "last_btles":
document.getElementById("BTISS").value = value;
break;
default:
document.getElementById(key).value = value;
}
}
//console.log(key,value);
}
//lets update last_time and last_reboot in table row
var table = document.getElementById("devices");
var rowCount = table.rows.length;
now_time = parseInt(Date.now()/1000);
for (var i = 1; i < rowCount; i++) {
if (MAC == table.rows[i].cells[1].innerText) {
age = now_time - last_time;
table.rows[i].cells[2].innerText = ShowAge(age);
if (age < 300)
table.rows[i].style.backgroundColor = "#90FFD7";
else
table.rows[i].style.backgroundColor = "";
age = now_time - last_reboot;
table.rows[i].cells[3].innerText = ShowAge(age);
if (settings["fw_version"] != "null"){
table.rows[i].cells[4].innerText = settings["fw_version"];
}
if(document.getElementById("Locations").selectedIndex >= 0) {
loc_str = document.getElementById("Locations").options[document.getElementById("Locations").selectedIndex].text;
table.rows[i].cells[5].innerText = loc_str;
}
if (settings["description"] != "null"){
table.rows[i].cells[6].innerText = settings["description"];
}
}
}
}
}
}
else if (obj.Function == "proximity_report") {
//proximity_list = [];
proximity_list = obj.proximity;
user = obj.user;
key = obj.ps;
//Lets create Show Deployment link here
MAC = "308398DF2FC8";
//depl_link = '/?user='+user+'&key='+key+'&MAC='+MAC
depl_link = '/?user='+user+'&key='+key+'&deployment='+deployment
GenerateDeploymentLink(depl_link);
if (proximity_list.length == 0) {
var table = document.getElementById("devices");
var rowCount = table.rows.length;
for (var i = 1; i < rowCount; i++) {
cell = table.rows[i].cells[0];
if(cell.innerText.length > 0) {
proximity_list.push(cell.innerText);
}
}
}
$("#Proximity").empty();
var oldSel = $("#Proximity").get(0);
for (i = 0; i < proximity_list.length; i++)
{
var opt = document.createElement('option');
opt.text = proximity_list[i][0];
opt.value = proximity_list[i][0];
oldSel.add(opt, null);
}
}
else if (obj.Function == "latest_devices") {
var matching_devices = obj.matching_devices;
var doc = document;
//var fragment = doc.createDocumentFragment();
//$("#devices_body").empty();
//var table = doc.createElement("table");
var table = document.getElementById("devices");
var rowCount = table.rows.length;
for (var i = rowCount - 1; i > 0; i--) {
table.deleteRow(i);
}
now_time = parseInt(Date.now()/1000);
for (i = 0; i < matching_devices.length; i++) {
age = now_time - matching_devices[i][2];
var tr = doc.createElement("tr");
if (age < 300)
tr.style.backgroundColor = "#90FFD7";
else
tr.style.backgroundColor = "";
var th = doc.createElement("th");
th.style="text-align:center";
th.innerHTML = matching_devices[i][0];
tr.appendChild(th);
var td = doc.createElement("td");
td.style="text-align:center";
user = document.getElementById("user").value;
key = document.getElementById("ps").value;
mac = matching_devices[i][1];
cell_content = "<a href=\"/?user="+user+"&key="+key+"&MAC="+mac+"\" target=\"_blank\">"+mac+"</a>"
//console.log(td.outerHTML);
//http://192.168.1.22:5002/?user=john&key=mykey&MAC=716798E056AC
td.innerHTML = cell_content;
//td.innerHTML = matching_devices[i][1];
tr.appendChild(td);
var td = doc.createElement("td");
td.style="text-align:center";
age_string = ShowAge(age);
td.innerHTML = age_string;
tr.appendChild(td);
var td = doc.createElement("td");
td.style="text-align:center";
age = now_time - matching_devices[i][3];
age_string = ShowAge(age);
td.innerHTML = age_string;
tr.appendChild(td);
var td = doc.createElement("td");
td.style="text-align:center";
td.innerHTML = matching_devices[i][4];
tr.appendChild(td);
var td = doc.createElement("td");
td.style="text-align:center";
if( matching_devices[i][5] == "All") {
td.innerHTML = "";
}
else {
td.innerHTML = matching_devices[i][5];
}
tr.appendChild(td);
var td = doc.createElement("td");
td.style="text-align:center";
td.innerHTML = matching_devices[i][6];
tr.appendChild(td);
var td = doc.createElement("td");
td.style="text-align:center";
td.innerHTML = matching_devices[i][7];
tr.appendChild(td);
var ch = doc.createElement("input");
ch.type = "checkbox";
ch.onchange=function(){IsItSingle();};
var td = doc.createElement("td");
td.style="text-align:center";
td.appendChild(ch);
tr.appendChild(td);
table.appendChild(tr);
// <td style="text-align:center"><input type="checkbox" onchange="IsItSingle();"></td>
}
IsItSingle();
//doc.getElementById("here_table").appendChild(table);
}
else if (obj.Function == "devices_report") {
var common_settings = obj.common_settings;
var fw_versions = obj.fw_versions;
var led_schemas = obj.led_schemas;
var groups = obj.groups;
var deployments = obj.deployments;
var locations = obj.locations;
var owners = obj.owners;
var matching_devices = obj.matching_devices;
if(deployments.length > 0) {
$("#Deployments").empty();
var oldSel = $("#Deployments").get(0);
var opt = document.createElement('option');
opt.text = "Not deployed";
opt.value = "-1";
oldSel.add(opt, null);
var opt = document.createElement('option');
opt.text = "All";
opt.value = "0";
opt.selected = true;
oldSel.add(opt, null);
}
/* Remove all options from the select list */
$("#FWs").empty();
var oldSel = $("#FWs").get(0);
for (i = 0; i < fw_versions.length; i++)
{
var opt = document.createElement('option');
opt.text = fw_versions[i];
opt.value = fw_versions[i];
oldSel.add(opt, null);
}
$("#LEDSchemas").empty();
var oldSel = $("#LEDSchemas").get(0);
for (i = 0; i < led_schemas.length; i++)
{
var opt = document.createElement('option');
opt.text = led_schemas[i];
opt.value = led_schemas[i];
oldSel.add(opt, null);
}
if (groups.length > 0) {
$("#group_id").empty();
var oldSel = $("#group_id").get(0);
for (i = 0; i < groups.length; i++)
{
var opt = document.createElement('option');
opt.text = groups[i][1];
opt.value = groups[i][0];
oldSel.add(opt, null);
}
}
if (deployments.length > 0) {
var oldSel = $("#Deployments").get(0);
for (i = 0; i < deployments.length; i++)
{
var opt = document.createElement('option');
opt.text = deployments[i][1];
opt.value = deployments[i][0];
oldSel.add(opt, null);
}
}
if (locations.length > 0) {
$("#Locations").empty();
var oldSel = $("#Locations").get(0);
for (i = 0; i < locations.length; i++)
{
var opt = document.createElement('option');
opt.text = locations[i][1];
opt.value = locations[i][0];
oldSel.add(opt, null);
}
}
$("#Owners").empty();
var oldSel = $("#Owners").get(0);
for (i = 0; i < owners.length; i++)
{
var opt = document.createElement('option');
opt.text = owners[i][1];
opt.value = owners[i][0];
oldSel.add(opt, null);
}
for (const [key, value] of Object.entries(common_settings)) {
console.log(key, value)
try{
if ((key !="group_id") && (key !="location_id") && (key !="deployment_id") && (key !="id"))
document.getElementById(key).value = value;
} catch(error) {
//console.log(error);
}
}
var doc = document;
//var fragment = doc.createDocumentFragment();
//$("#devices_body").empty();
//var table = doc.createElement("table");
var table = document.getElementById("devices");
var rowCount = table.rows.length;
for (var i = rowCount - 1; i > 0; i--) {
table.deleteRow(i);
}
now_time = parseInt(Date.now()/1000);
for (i = 0; i < matching_devices.length; i++) {
age = now_time - matching_devices[i][2];
var tr = doc.createElement("tr");
if (age < 300)
tr.style.backgroundColor = "#90FFD7";
else
tr.style.backgroundColor = "";
var th = doc.createElement("th");
th.style="text-align:center";
th.innerHTML = matching_devices[i][0];
tr.appendChild(th);
var td = doc.createElement("td");
td.style="text-align:center";
user = document.getElementById("user").value;
key = document.getElementById("ps").value;
mac = matching_devices[i][1];
cell_content = "<a href=\"/?user="+user+"&key="+key+"&MAC="+mac+"\" target=\"_blank\">"+mac+"</a>"
//console.log(td.outerHTML);
//http://192.168.1.22:5002/?user=john&key=mykey&MAC=716798E056AC
td.innerHTML = cell_content;
tr.appendChild(td);
var td = doc.createElement("td");
td.style="text-align:center";
age_string = ShowAge(age);
td.innerHTML = age_string;
tr.appendChild(td);
var td = doc.createElement("td");
td.style="text-align:center";
age = now_time - matching_devices[i][3];
age_string = ShowAge(age);
td.innerHTML = age_string;
tr.appendChild(td);
var td = doc.createElement("td");
td.style="text-align:center";
td.innerHTML = matching_devices[i][4];
tr.appendChild(td);
var td = doc.createElement("td");
td.style="text-align:center";
if( matching_devices[i][5] == "All") {
td.innerHTML = "";
}
else {
td.innerHTML = matching_devices[i][5];
}
tr.appendChild(td);
var td = doc.createElement("td");
td.style="text-align:center";
td.innerHTML = matching_devices[i][6];
tr.appendChild(td);
var td = doc.createElement("td");
td.style="text-align:center";
td.innerHTML = matching_devices[i][7];
tr.appendChild(td);
var ch = doc.createElement("input");
ch.type = "checkbox";
ch.onchange=function(){IsItSingle();};
var td = doc.createElement("td");
td.style="text-align:center";
td.appendChild(ch);
tr.appendChild(td);
table.appendChild(tr);
// <td style="text-align:center"><input type="checkbox" onchange="IsItSingle();"></td>
}
IsItSingle();
//doc.getElementById("here_table").appendChild(table);
}
}
}
}
}
function ProcessClick(func_name) {
showTutorial("");
switch (func_name) {
case "save":
timee = Date.now();
user = document.getElementById("user").value;
key = document.getElementById("ps").value;
//Lets find name of deployment
sel = document.getElementById("Deployments");
name = sel.options[sel.selectedIndex].text;
proximity_string = "";
var proximity_list = $("#Proximity").get(0);
if(proximity_list.length > 0){
proximity_string = proximity_list[0].innerText;
for (i = 1; i < proximity_list.length; i++)
{
proximity_string = proximity_string +","+proximity_list[i].innerText;
}
}
var obj = {
function: "save_deployments",
time:timee,
user:user,
ps:key,
signature:signature,
deployments:document.getElementById("Deployments").innerHTML,
deployment:document.getElementById("Deployments").value,
deployment_name:name,
deployment_owner_id:"1",
proximity:proximity_string,
visible_to:""
};
var json = JSON.stringify(obj);
sendToBackend("/wellget_cmp", json);
}
}
function moveUp(selectId) {
var selectList = document.getElementById(selectId);
var selectOptions = selectList.getElementsByTagName('option');
for (var i = 1; i < selectOptions.length; i++) {
var opt = selectOptions[i];
if (opt.selected) {
selectList.removeChild(opt);
selectList.insertBefore(opt, selectOptions[i - 1]);
}
}
}
function moveDown(selectId) {
var selectList = document.getElementById(selectId);
var selectOptions = selectList.getElementsByTagName('option');
for (var i = selectOptions.length - 2; i >= 0; i--) {
var opt = selectOptions[i];
if (opt.selected) {
var nextOpt = selectOptions[i + 1];
opt = selectList.removeChild(opt);
nextOpt = selectList.replaceChild(opt, nextOpt);
selectList.insertBefore(nextOpt, opt);
}
}
}
function ShowAge(seconds) {
var minutes = Math.floor(seconds/60);
var hours = Math.floor(minutes/60);
var days = Math.floor(hours/24);
if(seconds >=0) {
hours = hours-(days*24);
minutes = minutes-(days*24*60)-(hours*60);
seconds = seconds-(days*24*60*60)-(hours*60*60)-(minutes*60);
if (days > 0) {
report = days.toString()+" d "+hours.toString()+" h "+minutes.toString()+" m "+parseInt(seconds).toString() +" s";
}
else if(hours > 0) {
report = hours.toString()+" h "+minutes.toString()+" m "+parseInt(seconds).toString() +" s";
}
else if(minutes > 0) {
report = minutes.toString()+" m "+parseInt(seconds).toString() +" s";
}
else{
report = parseInt(seconds).toString() +" s";
}
return(report);
}
else {
return("0 s");
}
}
function AddGroup() {
var x = document.getElementById("group_id");
var old_values = $("#group_id").children('option').map(function(i, e){
return e.value || e.innerText;
}).get();
new_element = $("#NewGroup").val();
if( $.inArray(new_element, old_values) == -1 ) {
$("#group_id").append(
"<option value='" + new_element + "'>" + new_element + "</option>"
);
$("#group_id").val(new_element);
}
else {
alert("Group already exists!");
}
}
function AddDeployment() {
var x = document.getElementById("Deployments");
var old_values = $("#Deployments").children('option').map(function(i, e){
return e.innerText;
}).get();
new_element = $("#NewDeployment").val();
if (new_element == "Change_me"){
alert("Assign new name!");
}
else {
if (new_element.length < 3){
alert("Minimum length of deployment name is 3 characters!");
}
else {
if( $.inArray(new_element, old_values) == -1 ) {
$("#Deployments").append(
"<option value='" + new_element + "'>" + new_element + "</option>"
);
$("#Deployments").val(new_element);
}
else {
alert("Deployment already exists!");
}
}
}
}
function SelDesel() {
var x = document.getElementById("AllSel");
var table = document.getElementById("devices");
var rowCount = table.rows.length;
for (var i = 1; i < rowCount; i++) {
cell = table.rows[i].cells[8];
checkm = cell.children[0];
checkm.checked=x.checked;
}
IsItSingle();
}
function IsItSingle() {
var x = document.getElementById("AllSel");
var table = document.getElementById("devices");
var rowCount = table.rows.length;
var sel_count = 0;
var x = document.getElementById("caption");
for (var i = 1; i < rowCount; i++) {
cell = table.rows[i].cells[8];
MAC = table.rows[i].cells[1].innerText;
checkm = cell.children[0];
if (checkm.checked) {
sel_count +=1;
x.innerHTML = MAC;
}
if (sel_count != 1)
x.innerHTML = "Settings";
}
if (sel_count ==1)
ShowSingle(true);
else
ShowSingle(false);
}
function DeleteCreds(){
var table = document.getElementById("devices");
var rowCount = table.rows.length;
showTutorial("Deleting WiFi Credentials...");
//If all are enabled, request group update, othervise request d
which_tags = [];
all_selected = true;
for (var i = 1; i < rowCount; i++) {
cell = table.rows[i].cells[8];
checkm = cell.children[0];
if (checkm.checked) {
MAC = table.rows[i].cells[1].innerText;
//FW = table.rows[i].cells[4].childNodes[0].data;
var tag_info = MAC;
which_tags.push(tag_info);
}
else {
all_selected = false;
}
}
if (which_tags.length == 1) {
var obj = {
function: "erase_wifi",
time:timee,
user:user,
ps:key,
signature:signature,
which_tags: which_tags,
};
var json = JSON.stringify(obj);
sendToBackend("/wellget_cmp", json);
}
else {
alert("Only 1 device can be selected");
}
}
function ReadDevice() {
var table = document.getElementById("devices");
var rowCount = table.rows.length;
showTutorial("Reading device...");
//If all are enabled, request group update, othervise request d
which_tags = [];
all_selected = true;
for (var i = 1; i < rowCount; i++) {
cell = table.rows[i].cells[8];
checkm = cell.children[0];
if (checkm.checked) {
MAC = table.rows[i].cells[1].innerText;
//FW = table.rows[i].cells[4].childNodes[0].data;
var tag_info = MAC;
which_tags.push(tag_info);
}
else {
all_selected = false;
}
}
if (which_tags.length == 1) {
var obj = {
function: "read_device",
time:timee,
user:user,
ps:key,
signature:signature,
which_tags: which_tags,
};
var json = JSON.stringify(obj);
sendToBackend("/wellget_cmp", json);
}
else {
alert("Only 1 device can be selected");
}
}
function WriteDevice() {
var par_table = document.getElementById("settings");
var par_rowCount = par_table.rows.length;
device_settings = {};
for (var i = 1; i < par_rowCount; i++) {
sensor_settings = {};
sensor_name = par_table.rows[i].cells[0].innerText;
sensor_settings["ut"] = par_table.rows[i].cells[1].childNodes[0].value;
sensor_settings["dt"] = par_table.rows[i].cells[2].childNodes[0].value;
sensor_settings["lp"] = par_table.rows[i].cells[3].childNodes[0].value;
sensor_settings["pn"] = par_table.rows[i].cells[4].childNodes[0].value;
sensor_settings["sn"] = par_table.rows[i].cells[5].childNodes[0].value;
sensor_settings["ee"] = par_table.rows[i].cells[6].childNodes[0].value;
device_settings[sensor_name] = sensor_settings;
}
device_settings["fw_v"] = document.getElementById("FWs").value;
//device_settings["led_s"] = document.getElementById("LEDSchemas").value;
device_settings["BLEScanPeriod"] = document.getElementById("BLEScanPeriod").value;
device_settings["BLEScanDuration"] = document.getElementById("BLEScanDuration").value;
device_settings["TemperatureOffset"] = document.getElementById("TemperatureOffset").value;
device_settings["RadarThreshold"] = document.getElementById("RadarThreshold").value;
device_settings["S2FSR"] = document.getElementById("S2FSR").value;
device_settings["reporting_period_s"] = document.getElementById("reporting_period_s").value;
device_settings["NCRE"] = document.getElementById("NCRE").value;
device_settings["e_key"] = document.getElementById("e_key").value;
device_settings["description"] = document.getElementById("DESCRIPTION").value;
device_settings["close_to"] = document.getElementById("CLOSETO").value;
device_settings["owner_id"] = document.getElementById("Owners").value;
device_settings["wifis"] = document.getElementById("WIFISSID").value;
device_settings["wifi_pass"] = document.getElementById("WIFIPASS").value;
device_settings["led_schema"] = document.getElementById("LEDPATTERN").value;
device_settings["other"] = document.getElementById("OTHER").value;
RequestDevsUpdate(device_settings);
}
function FindDevices() {
showTutorial("Looking for new devices...");
timee = Date.now();
user = document.getElementById("user").value;
key = document.getElementById("ps").value;
var obj = {
function: "find_devices",
time:timee,
user:user,
ps:key,
signature:signature
};
var json = JSON.stringify(obj);
sendToBackend("/wellget_cmp", json);
}
function SetFirmwares(){
showTutorial("Setting firmwares...");
var par_table = document.getElementById("settings");
var par_rowCount = par_table.rows.length;
device_settings = {};
device_settings["fw_v"] = document.getElementById("FWs").value;
RequestFWsUpdate(device_settings);
}
function SetDevices() {
showTutorial("Setting devices...");
var par_table = document.getElementById("settings");
var par_rowCount = par_table.rows.length;
device_settings = {};
for (var i = 1; i < par_rowCount; i++) {
sensor_settings = {};
sensor_name = par_table.rows[i].cells[0].innerText;
sensor_settings["ut"] = par_table.rows[i].cells[1].childNodes[0].value;
sensor_settings["dt"] = par_table.rows[i].cells[2].childNodes[0].value;
sensor_settings["lp"] = par_table.rows[i].cells[3].childNodes[0].value;
sensor_settings["pn"] = par_table.rows[i].cells[4].childNodes[0].value;
sensor_settings["sn"] = par_table.rows[i].cells[5].childNodes[0].value;
sensor_settings["ee"] = par_table.rows[i].cells[6].childNodes[0].value;
device_settings[sensor_name] = sensor_settings;
}
//Dont set FW here, there is separate function for it!
//device_settings["fw_v"] = document.getElementById("FWs").value;
//device_settings["led_s"] = document.getElementById("LEDSchemas").value;
device_settings["BLEScanPeriod"] = document.getElementById("BLEScanPeriod").value;
device_settings["BLEScanDuration"] = document.getElementById("BLEScanDuration").value;
device_settings["TemperatureOffset"] = document.getElementById("TemperatureOffset").value;
device_settings["RadarThreshold"] = document.getElementById("RadarThreshold").value;
device_settings["S2FSR"] = document.getElementById("S2FSR").value;
device_settings["reporting_period_s"] = document.getElementById("reporting_period_s").value;
device_settings["NCRE"] = document.getElementById("NCRE").value;
device_settings["e_key"] = document.getElementById("e_key").value;
device_settings["FWs"] = document.getElementById("FWs").value;
btn = document.getElementById("set_device_s");
if (btn.innerText == "Set Device") { //single
device_settings["id"] = document.getElementById("DEVICE_ID").value;
device_settings["description"] = document.getElementById("DESCRIPTION").value;
device_settings["close_to"] = document.getElementById("CLOSETO").value;
device_settings["owner_id"] = document.getElementById("Owners").value;
device_settings["wifis"] = document.getElementById("WIFISSID").value;
device_settings["wifi_pass"] = document.getElementById("WIFIPASS").value;
device_settings["led_schema"] = document.getElementById("LEDPATTERN").value;
device_settings["other"] = document.getElementById("OTHER").value;
}
RequestDevsUpdate(device_settings);
}
function ShowSingle(do_show) {
var x = document.getElementById("single_info");
btn = document.getElementById("set_device_s");
if (do_show == true) {
x.style.display = "block";
btn.innerText = "Set Device";
} else {
x.style.display = "none";
btn.innerText = "Set Devices";
var x = document.getElementById("caption");
x.innerHTML = "Settings";
}
}
function GenerateDeploymentLink(desiredLink) {
document.getElementById('deployment_link').setAttribute('href',desiredLink);
document.getElementById('deployment_link').setAttribute('target',"_blank");
}
</script>
</head>
<body onload="draw();" onresize="resize()">
<div
class="wrapper"
style="margin: 0 auto; width: 100%; left: 0; top: 0; position: absolute"
></div>
<div class="fixed" role="main">
<div class="row">
<div class="x_panel">
<div class="x_title">
<h2>
Options <span class="smallLetters">Filter by:</span>
</h2>
<ul class="nav navbar-right panel_toolbox">
<li>
<a class="collapse-link" onclick="showHide(this);"
><i class="fa fa-chevron-up"></i
></a>
</li>
<li>
<a class="close-link"><i class="fa fa-close"></i></a>
</li>
</ul>
<div class="clearfix"></div>
</div>
<div class="x_content" id="selectorsDiv">
<button class="small-button" onclick="DoRefresh()">Filter</button>
<div id = "GroupPanel" style="width:20%;Text-align:center;float:left;">
Group:
<select name="group_id" id="group_id" size="1">
<option value="All">All</option>
<option value="0">0</option>
<option value="EyeTech">EyeTech</option>
</select>
<button class="small-button" onclick="AddGroup()">New</button>
<input type="text" id="NewGroup" name="NewGroup" title="New Group #" value="New Group" size="10">
</div>
<div id = "OtherPanel" style="width:50%;Text-align:center;float:left;">
Deployment:
<select name="Deployments" id="Deployments" onchange="DeploymentChange()" size="1">
<option value="All" selected>All</option>
</select>
<button class="small-button" title="Create new Deployment with name specified to the right" onclick="AddDeployment()">New</button>
<input type="text" id="NewDeployment" name="NewDeployment" title="New Deployment (address), mimum 3 characters long" value="Change_me" size="10">
<button class="small-button" title="Save Deployments" onclick="ProcessClick('save')">Save</button>
Location:
<select name="Locations" id="Locations" size="1">
<option value="All">All</option>
<option value="Bathroom">Bathroom</option>
<option value="Kitchen">Kitchen</option>
<option value="Dining Room">Dining Room</option>
<option value="Bedroom">Bedroom</option>
<option value="Living Room">Living Room</option>
<option value="Hallway">Hallway</option>
<option value="Office">Office</option>
<option value="Conference Room">Conference Room</option>
<option value="Outside">Outside</option>
<option value="Attic">Attic</option>
<option value="Basement">Basement</option>
<option value="Garage">Garage</option>
<option value="Other">Other</option>
</select>
</div>
</div>
</div>
</div>
<div class="row">
<div class="x_panel">
<div class="x_title">
<h2><span id="naslov" class="smallLetters">Parameters</span></h2>
<ul class="nav navbar-right panel_toolbox">
<li>
<a class="collapse-link" onclick="showHide(this)"
><i class="fa fa-chevron-up"></i
></a>
</li>
</ul>
<div class="clearfix"></div>
</div>
<div class="x_content">
<table name="settings" id="settings" width="200" border="1" cellspacing="2" cellpadding="2">
<caption id="caption">
Settings
</caption>
<tbody>
<tr>
<th scope="col">Sensor</th>
<th scope="col">Up Threshold</th>
<th scope="col">Down Threshold</th>
<th scope="col">LP Filter</th>
<th scope="col">Pr noise</th>
<th scope="col">Sns noise</th>
<th scope="col">Est error</th>
</tr>
<tr>
<th scope="row">Radar</th>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="rut" id="rut" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="rdt" id="rdt" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="rlp" id="rlp" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="rpn" id="rpn" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="rsn" id="rsn" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="ree" id="ree" size="4"></td>
</tr>
<tr>
<th scope="row">Light</th>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="lut" id="lut" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="ldt" id="ldt" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="llp" id="llp" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="lpn" id="lpn" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="lsn" id="lsn" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="lee" id="lee" size="4"></td>
</tr>
<tr>
<th scope="row">Pressure</th>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="put" id="put" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="pdt" id="pdt" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="plp" id="plp" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="ppn" id="ppn" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="psn" id="psn" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="pee" id="pee" size="4"></td>
</tr>
<tr>
<th scope="row">Temperature</th>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="tut" id="tut" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="tdt" id="tdt" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="tlp" id="tlp" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="tpn" id="tpn" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="tsn" id="tsn" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="tee" id="tee" size="4"></td>
</tr>
<tr>
<th scope="row">Humidity</th>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="hut" id="hut" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="hdt" id="hdt" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="hlp" id="hlp" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="hpn" id="hpn" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="hsn" id="hsn" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="hee" id="hee" size="4"></td>
</tr>
<tr>
<th scope="row">CO2</th>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="cut" id="cut" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="cdt" id="cdt" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="clp" id="clp" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="cpn" id="cpn" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="csn" id="csn" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="cee" id="cee" size="4"></td>
</tr>
<tr>
<th scope="row">VOC</th>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="vut" id="vut" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="vdt" id="vdt" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="vlp" id="vlp" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="vpn" id="vpn" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="vsn" id="vsn" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="vee" id="vee" size="4"></td>
</tr>
</tbody>
</table>
<br>
<div>
<p>
<div id = "firmware">
Firmware version:
<select name="FWs" id="FWs" size="1">
<option value="Latest" selected>Latest</option>
<option value="2.0.0">2.0.0</option>
<option value="EyeTech_2.0.0">EyeTech_2.0.0</option>
</select>
<button class="wider-button" id="set_fws" onclick="SetFirmwares()">Set Firmwares</button>
</div>
<br>
Hardware version:
<input style="text-align:center" type="text" readOnly= true name="hw_version" id="hw_version" size="8">
LED Schema:
<select name="LEDSchemas" id="LEDSchemas" size="1">
<option value="Fred Status">Fred Status</option>
</select>
<br><br>
Scan BLE every [s]:
<input style="text-align:center" type="text" name="BLEScanPeriod" id="BLEScanPeriod" size="3">
for [s]:
<input style="text-align:center" type="text" name="BLEScanDuration" id="BLEScanDuration" size="3">
T offset:
<input style="text-align:center" type="text" name="TemperatureOffset" id="TemperatureOffset" size="3">
R threshold:
<input style="text-align:center" type="text" name="RadarThreshold" id="RadarThreshold" size="3">
<br><br>
Slow to Fast sensing ratio:
<input style="text-align:center" type="text" name="S2FSR" id="S2FSR" size="3">
Reporting period [s]:
<input style="text-align:center" type="text" name="reporting_period_s" id="reporting_period_s" size="3">
<br><br>
No change report every [s]:
<input style="text-align:center" type="text" name="NCRE" id="NCRE" size="4">
</p>
<div id = "key_panel">
<p>KEY:
<input style="text-align:center" type="text" name="e_key" id="e_key" size="20">
</p>
</div>
<button title="Writes device parameters to DB!" class="wider-button" id="set_device_s" onclick="SetDevices()">Set Devices</button>
<button title="Reports data found in DB including latest updates!" class="wider-button" id="find_new_s" onclick="FindDevices()">Received?</button>
</div>
<div id="SSIDSes" style="position: absolute; left: 240px; top: 480px; width: 300px; height: 16px;">
WF SSDS:
<input style="text-align:left" type="text" name="WFISS" id="WFISS" size="30"><br>
BT MACS:
<input style="text-align:left" type="text" name="BTISS" id="BTISS" size="30">
<br><br>
</div>
<div id="single_info" style="position: absolute; left: 440px; top: 310px; width: 460px; height: 16px;">
Device ID:
<input style="text-align:center" type="text" name="DEVICE_ID" id="DEVICE_ID" size="4">
Last Reboot @:
<input style="text-align:center" type="text" name="LAST_REBOOT" id="LAST_REBOOT" size="10">
Time Zone:
<input style="text-align:center" type="text" name="time_zone" id="time_zone" size="6">
<br><br>
<p>Description:
<textarea name="DESCRIPTION" id="DESCRIPTION" rows="2" cols="100"></textarea>
Close to:
<input style="text-align:center" type="text" name="CLOSETO" id="CLOSETO" size="6">
<br>
<div id = "details1">
Owner:
<select name="Owners" id="Owners" size="1">
<option value="All">All</option>
<option value="Robert Zmrzli">Robert Zmrzli</option>
<option value="Ferdinand Zmrzli">Ferdinand Zmrzli</option>1
</select>
<br>
SSID:
<input style="text-align:center" type="text" name="WIFISSID" id="WIFISSID" size="16">
Pass:
<input style="text-align:center" type="text" name="WIFIPASS" id="WIFIPASS" size="26">
<button class="wider-button" id="delete_CR_s" onclick="DeleteCreds()">Delete</button>
<br><br>
</div>
LED pattern:
<input name="LEDPATTERN" type="text" id="LEDPATTERN" style="text-align:center" value="00112233445566778899AA" size="20">
Other:
<input name="OTHER" type="text" id="OTHER" style="text-align:center" value="" size="10">
</p>
<button class="wider-button" id="read_device_s" onclick="ReadDevice()">Read Device</button>
</div>
<div id="deplink" style="position: absolute; left: 1100px; top: 290px; width: 460px; height: 16px;">
<a id="deployment_link" href="https://www.w3schools.com/">Proximity of devices:</a>
</div>
<div id="deployment_info" style="position: absolute; left: 1100px; top: 300px; width: 460px; height: 16px;">
<br>
<select class="my_dropdown" name="Proximity" id="Proximity" size="10" width=150px>
<option value="3">3</option>
<option value="37">37</option>
<option value="42">42</option>1
</select>
<br>
</div>
<div id="deployment_info1" style="position: absolute; left: 1260px; top: 350px; width: 460px; height: 16px;">
<button class="wider-button" id="move_up" title="Move selected item up" onclick="moveUp('Proximity');">Up</button>
<br>
<button class="wider-button" id="move_down" title="Move selected item down" onclick="moveDown('Proximity');">Down</button>
<br>
<button class="wider-button" id="read_proximity" title="Retrieve proximity of devices" onclick="RequestDeploymentProximity();">Read</button>
<br>
<button class="wider-button" id="write_proximity" title="Store proximity of devices" onclick="WriteDeploymentProximity();">Write</button>
<br>
<button class="wider-button" id="copy_proximity" title="Copy all visible devices to proximity list" onclick="CopyDeploymentProximity();">Copy</button>
</div>
<div id="devslist" class="full-height" style="position: absolute; left: -1px; top: 580px; width: 100%; overflow: auto;">
<table name="devices" id="devices" cellspacing="2" cellpadding="2">
<caption>
Devices
</caption>
<tbody name="devices_body" id="devices_body">
<tr>
<th style="text-align:center" scope="col">Id</th>
<th style="text-align:center" scope="col">MAC</th>
<th style="text-align:center" scope="col">Last Message</th>
<th style="text-align:center" scope="col">Last Reboot</th>
<th style="text-align:center" scope="col">Firmware Ver.</th>
<th style="text-align:center" scope="col">Location</th>
<th style="text-align:center" scope="col">Description</th>
<th style="text-align:center" scope="col">Deployment</th>
<th style="text-align:center" scope="col">Enable change <input type="checkbox" id="AllSel" onchange="SelDesel();"></th>
</tr>
<tr>
<th scope="row">1</th>
<td style="text-align:center"><a href="google.com"><input name="mac" type="text" id="mac" style="border:none; text-align:center" value="2333" size="4"></a></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="slrb" id="slrb" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="slms" id="slms" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="fwvr" id="fwvr" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="loc" id="loc" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="desc" id="desc" size="4"></td>
<td style="text-align:center"><input style="border:none; text-align:center" type="text" name="depl" id="depl" size="4"></td>
<td style="text-align:center"><input type="checkbox" onchange="IsItSingle();"></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<input type="hidden" id="user" value="###USER###" size="4">
<input type="hidden" id="ps" value="###PASS###" size="4">
<input type="hidden" id="token" value="###TOKEN###" size="4">
<input type="hidden" id="privilidges" value="###PRIVILIDGES###" size="4">
<div id="helper" style="position: absolute; left: 400px; top: 24px; height: 50px; width: 200px;">
<form name = "myform">
<input type = "text" name = "stage" size = "32" style="border:0"/>
</form>
</div>
</body>
</html>