finished light functionality
This commit is contained in:
@@ -20,6 +20,7 @@ class BaseMiner:
|
|||||||
self.api = api
|
self.api = api
|
||||||
self.api_type = None
|
self.api_type = None
|
||||||
self.model = None
|
self.model = None
|
||||||
|
self.light = None
|
||||||
|
|
||||||
async def _get_ssh_connection(self) -> asyncssh.connect:
|
async def _get_ssh_connection(self) -> asyncssh.connect:
|
||||||
"""Create a new asyncssh connection"""
|
"""Create a new asyncssh connection"""
|
||||||
@@ -56,6 +57,9 @@ class BaseMiner:
|
|||||||
conn = self._get_ssh_connection()
|
conn = self._get_ssh_connection()
|
||||||
await asyncssh.scp((conn, src), dest)
|
await asyncssh.scp((conn, src), dest)
|
||||||
|
|
||||||
|
async def check_light(self):
|
||||||
|
return self.light
|
||||||
|
|
||||||
async def get_board_info(self):
|
async def get_board_info(self):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|||||||
@@ -41,12 +41,14 @@ class BOSMiner(BaseMiner):
|
|||||||
async def fault_light_on(self) -> None:
|
async def fault_light_on(self) -> None:
|
||||||
"""Sends command to turn on fault light on the miner."""
|
"""Sends command to turn on fault light on the miner."""
|
||||||
logging.debug(f"{self}: Sending fault_light on command.")
|
logging.debug(f"{self}: Sending fault_light on command.")
|
||||||
|
self.light = True
|
||||||
await self.send_ssh_command("miner fault_light on")
|
await self.send_ssh_command("miner fault_light on")
|
||||||
logging.debug(f"{self}: fault_light on command completed.")
|
logging.debug(f"{self}: fault_light on command completed.")
|
||||||
|
|
||||||
async def fault_light_off(self) -> None:
|
async def fault_light_off(self) -> None:
|
||||||
"""Sends command to turn off fault light on the miner."""
|
"""Sends command to turn off fault light on the miner."""
|
||||||
logging.debug(f"{self}: Sending fault_light off command.")
|
logging.debug(f"{self}: Sending fault_light off command.")
|
||||||
|
self.light = False
|
||||||
await self.send_ssh_command("miner fault_light off")
|
await self.send_ssh_command("miner fault_light off")
|
||||||
logging.debug(f"{self}: fault_light off command completed.")
|
logging.debug(f"{self}: fault_light off command completed.")
|
||||||
|
|
||||||
|
|||||||
@@ -17,18 +17,10 @@ CONFIG_FILE = os.path.join(os.path.dirname(__file__), "files", "config.toml")
|
|||||||
(START, UNLOCK, INSTALL, UPDATE, REFERRAL, DONE) = range(6)
|
(START, UNLOCK, INSTALL, UPDATE, REFERRAL, DONE) = range(6)
|
||||||
|
|
||||||
|
|
||||||
class testbenchMiner:
|
class TestbenchMiner:
|
||||||
def __init__(self, host: ip_address):
|
def __init__(self, host: ip_address):
|
||||||
self.host = host
|
self.host = host
|
||||||
self.state = START
|
self.state = START
|
||||||
self.light = False
|
|
||||||
|
|
||||||
async def fault_light(self):
|
|
||||||
miner = await MinerFactory().get_miner(self.host)
|
|
||||||
if self.light:
|
|
||||||
await miner.fault_light_off()
|
|
||||||
else:
|
|
||||||
await miner.fault_light_on()
|
|
||||||
|
|
||||||
async def add_to_output(self, message):
|
async def add_to_output(self, message):
|
||||||
await ConnectionManager().broadcast_json(
|
await ConnectionManager().broadcast_json(
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ from fastapi.templating import Jinja2Templates
|
|||||||
|
|
||||||
from tools.web_testbench._network import miner_network
|
from tools.web_testbench._network import miner_network
|
||||||
from tools.web_testbench.feeds import update_installer_files
|
from tools.web_testbench.feeds import update_installer_files
|
||||||
|
from miners.miner_factory import MinerFactory
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
@@ -51,9 +52,18 @@ class ConnectionManager:
|
|||||||
|
|
||||||
async def connect(self, websocket: WebSocket):
|
async def connect(self, websocket: WebSocket):
|
||||||
await websocket.accept()
|
await websocket.accept()
|
||||||
await websocket.send_json(
|
miners = []
|
||||||
{"miners": [str(miner) for miner in miner_network.hosts()]}
|
for host in miner_network.hosts():
|
||||||
)
|
if host in MinerFactory().miners.keys():
|
||||||
|
miners.append(
|
||||||
|
{
|
||||||
|
"IP": str(host),
|
||||||
|
"Light_On": await MinerFactory().miners[host].get_light(),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
miners.append({"IP": str(host), "Light_On": None})
|
||||||
|
await websocket.send_json({"miners": miners})
|
||||||
ConnectionManager._connections.append(websocket)
|
ConnectionManager._connections.append(websocket)
|
||||||
|
|
||||||
def disconnect(self, websocket: WebSocket):
|
def disconnect(self, websocket: WebSocket):
|
||||||
@@ -73,7 +83,14 @@ async def ws(websocket: WebSocket):
|
|||||||
await ConnectionManager().connect(websocket)
|
await ConnectionManager().connect(websocket)
|
||||||
try:
|
try:
|
||||||
while True:
|
while True:
|
||||||
data = await websocket.receive()
|
data = await websocket.receive_json()
|
||||||
|
if "IP" in data.keys():
|
||||||
|
print(data)
|
||||||
|
miner = await MinerFactory().get_miner(data["IP"])
|
||||||
|
if data["Data"] == "unlight":
|
||||||
|
miner.fault_light_off()
|
||||||
|
if data["Data"] == "light":
|
||||||
|
miner.fault_light_on()
|
||||||
except WebSocketDisconnect:
|
except WebSocketDisconnect:
|
||||||
ConnectionManager().disconnect(websocket)
|
ConnectionManager().disconnect(websocket)
|
||||||
except RuntimeError:
|
except RuntimeError:
|
||||||
|
|||||||
@@ -79,294 +79,308 @@ var options_fans = {
|
|||||||
|
|
||||||
|
|
||||||
var ws = new WebSocket("ws://{{request.url.hostname}}:{% if request.url.port %}{{request.url.port}}{% else %}80{% endif %}/ws");
|
var ws = new WebSocket("ws://{{request.url.hostname}}:{% if request.url.port %}{{request.url.port}}{% else %}80{% endif %}/ws");
|
||||||
ws.onmessage = function(event) {
|
function lightMiner(ip, checkbox) {
|
||||||
var data = JSON.parse(event.data)
|
// if the checkbox is checked turn the light on, otherwise off
|
||||||
if (data.hasOwnProperty("miners")) {
|
if (checkbox.checked){
|
||||||
var container_all = document.getElementById('chart_container');
|
ws.send(JSON.stringify({"IP": ip, "Data": "light"}))
|
||||||
container_all.innerHTML = ""
|
} else if (!(checkbox.check)) {
|
||||||
data["miners"].forEach(function(miner) {
|
ws.send(JSON.stringify({"IP": ip, "Data": "unlight"}))
|
||||||
// create column with ID being the IP for later use
|
|
||||||
var column = document.createElement('div');
|
|
||||||
column.className = "col border border-dark p-3"
|
|
||||||
column.id = miner
|
|
||||||
|
|
||||||
// create IP address header
|
|
||||||
var header = document.createElement('button');
|
|
||||||
header.className = "text-center btn btn-primary w-100"
|
|
||||||
header.onclick = function(){window.open("http://" + miner, '_blank');}
|
|
||||||
header.innerHTML += miner
|
|
||||||
|
|
||||||
column.append(header)
|
|
||||||
|
|
||||||
// create install stdout
|
|
||||||
var row_text = document.createElement('div');
|
|
||||||
row_text.className = "row p-3"
|
|
||||||
row_text.id = miner + "-stdout"
|
|
||||||
|
|
||||||
// create text area for data
|
|
||||||
var text_area = document.createElement('textarea');
|
|
||||||
text_area.id = miner + "-stdout_text"
|
|
||||||
text_area.rows = "15"
|
|
||||||
text_area.className = "form-control"
|
|
||||||
text_area.style = "font-size: 12px"
|
|
||||||
text_area.disabled = true
|
|
||||||
text_area.readonly = true
|
|
||||||
|
|
||||||
row_text.append(text_area)
|
|
||||||
|
|
||||||
column.append(row_text)
|
|
||||||
|
|
||||||
|
|
||||||
// create hr and temp canvas
|
|
||||||
var hr_canvas = document.createElement('canvas');
|
|
||||||
hr_canvas.width = 125
|
|
||||||
hr_canvas.height = 125
|
|
||||||
hr_canvas.id = miner + "-hr"
|
|
||||||
|
|
||||||
var temp_canvas = document.createElement('canvas');
|
|
||||||
temp_canvas.width = 125
|
|
||||||
temp_canvas.height = 125
|
|
||||||
temp_canvas.id = miner + "-temp"
|
|
||||||
|
|
||||||
// create fan 1 title
|
|
||||||
var fan_1_title = document.createElement('p');
|
|
||||||
fan_1_title.innerHTML += "Fan L: 0 RPM";
|
|
||||||
fan_1_title.className = "text-center"
|
|
||||||
fan_1_title.id = miner + "-fan_l"
|
|
||||||
|
|
||||||
// create fan 2 title
|
|
||||||
var fan_2_title = document.createElement('p');
|
|
||||||
fan_2_title.innerHTML += "Fan R: 0 RPM";
|
|
||||||
fan_2_title.className = "text-center"
|
|
||||||
fan_2_title.id = miner + "-fan_r"
|
|
||||||
|
|
||||||
// create fan 1 canvas
|
|
||||||
var fan_1_canvas = document.createElement('canvas');
|
|
||||||
fan_1_canvas.width = 100
|
|
||||||
fan_1_canvas.height = 100
|
|
||||||
fan_1_canvas.id = miner + "-fan-1"
|
|
||||||
|
|
||||||
// create fan 2 canvas
|
|
||||||
var fan_2_canvas = document.createElement('canvas');
|
|
||||||
fan_2_canvas.width = 100
|
|
||||||
fan_2_canvas.height = 100
|
|
||||||
fan_2_canvas.id = miner + "-fan-2"
|
|
||||||
|
|
||||||
|
|
||||||
// create row for hr and temp data
|
|
||||||
var row_hr = document.createElement('div');
|
|
||||||
row_hr.className = "row"
|
|
||||||
|
|
||||||
// create row for titles of fans
|
|
||||||
var row_fan_title = document.createElement('div');
|
|
||||||
row_fan_title.className = "row"
|
|
||||||
|
|
||||||
// create row for fan graphs
|
|
||||||
var row_fan = document.createElement('div');
|
|
||||||
row_fan.className = "row"
|
|
||||||
|
|
||||||
// create hr container
|
|
||||||
var container_col_hr = document.createElement('div');
|
|
||||||
container_col_hr.className = "col w-50 ps-0 pe-4"
|
|
||||||
|
|
||||||
// create temp container
|
|
||||||
var container_col_temp = document.createElement('div');
|
|
||||||
container_col_temp.className = "col w-50 ps-0 pe-4"
|
|
||||||
|
|
||||||
// create fan title 1 container
|
|
||||||
var container_col_title_fan_1 = document.createElement('div');
|
|
||||||
container_col_title_fan_1.className = "col"
|
|
||||||
|
|
||||||
// create fan title 2 container
|
|
||||||
var container_col_title_fan_2 = document.createElement('div');
|
|
||||||
container_col_title_fan_2.className = "col"
|
|
||||||
|
|
||||||
// create fan 1 data container
|
|
||||||
var container_col_fan_1 = document.createElement('div');
|
|
||||||
container_col_fan_1.className = "col w-50 ps-3 pe-1"
|
|
||||||
|
|
||||||
// create fan 2 data container
|
|
||||||
var container_col_fan_2 = document.createElement('div');
|
|
||||||
container_col_fan_2.className = "col w-50 ps-3 pe-1"
|
|
||||||
|
|
||||||
// append canvases to the appropriate container columns
|
|
||||||
container_col_hr.append(hr_canvas)
|
|
||||||
container_col_temp.append(temp_canvas)
|
|
||||||
container_col_title_fan_1.append(fan_1_title)
|
|
||||||
container_col_title_fan_2.append(fan_2_title)
|
|
||||||
container_col_fan_1.append(fan_1_canvas)
|
|
||||||
container_col_fan_2.append(fan_2_canvas)
|
|
||||||
|
|
||||||
// add container columns to the correct rows
|
|
||||||
row_hr.append(container_col_hr)
|
|
||||||
row_hr.append(container_col_temp)
|
|
||||||
row_fan_title.append(container_col_title_fan_1)
|
|
||||||
row_fan_title.append(container_col_title_fan_2)
|
|
||||||
row_fan.append(container_col_fan_1)
|
|
||||||
row_fan.append(container_col_fan_2)
|
|
||||||
|
|
||||||
// create miner graph container
|
|
||||||
var miner_graphs = document.createElement('div');
|
|
||||||
miner_graphs.id = miner + "-graphs"
|
|
||||||
miner_graphs.hidden = true
|
|
||||||
|
|
||||||
// append the rows to the column
|
|
||||||
miner_graphs.append(row_hr)
|
|
||||||
miner_graphs.append(row_fan_title)
|
|
||||||
miner_graphs.append(row_fan)
|
|
||||||
column.append(miner_graphs)
|
|
||||||
|
|
||||||
|
|
||||||
// create light button container
|
|
||||||
var container_light = document.createElement('div');
|
|
||||||
container_light.className = "form-check form-switch d-flex justify-content-evenly"
|
|
||||||
|
|
||||||
// create light button
|
|
||||||
var light_switch = document.createElement('input');
|
|
||||||
light_switch.type = "checkbox"
|
|
||||||
light_switch.id = miner + "-light"
|
|
||||||
light_switch.className = "form-check-input"
|
|
||||||
|
|
||||||
// add a light label to the button
|
|
||||||
var label_light = document.createElement("label");
|
|
||||||
label_light.setAttribute("for", "light_" + miner.IP);
|
|
||||||
label_light.innerHTML = "Light";
|
|
||||||
|
|
||||||
// add the button and label to the container
|
|
||||||
container_light.append(label_light)
|
|
||||||
container_light.append(light_switch)
|
|
||||||
|
|
||||||
column.append(container_light)
|
|
||||||
|
|
||||||
container_all.append(column)
|
|
||||||
|
|
||||||
var chart_hr = new Chart(hr_canvas, {
|
|
||||||
type: "bar",
|
|
||||||
data: {
|
|
||||||
labels: ["Hashrate"],
|
|
||||||
datasets: [],
|
|
||||||
},
|
|
||||||
options: options_hr
|
|
||||||
});
|
|
||||||
|
|
||||||
var chart_temp = new Chart(temp_canvas, {
|
|
||||||
type: "bar",
|
|
||||||
data: {
|
|
||||||
labels: ["Temps"],
|
|
||||||
datasets: [],
|
|
||||||
},
|
|
||||||
options: options_temp,
|
|
||||||
});
|
|
||||||
|
|
||||||
var chart_fan_1 = new Chart(fan_1_canvas, {
|
|
||||||
type: "doughnut",
|
|
||||||
data: {
|
|
||||||
labels: ["Fan L"],
|
|
||||||
datasets: [
|
|
||||||
{
|
|
||||||
data: [],
|
|
||||||
// add colors
|
|
||||||
backgroundColor: [
|
|
||||||
"rgba(103, 0, 221, 1)",
|
|
||||||
"rgba(199, 199, 199, 1)"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
]
|
|
||||||
},
|
|
||||||
options: options_fans
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
// create the fan 2 chart
|
|
||||||
var chart_fan_2 = new Chart(fan_2_canvas, {
|
|
||||||
type: "doughnut",
|
|
||||||
data: {
|
|
||||||
labels: ["Fan R"],
|
|
||||||
datasets: [
|
|
||||||
{
|
|
||||||
data: [],
|
|
||||||
backgroundColor: [
|
|
||||||
"rgba(103, 0, 221, 1)",
|
|
||||||
"rgba(199, 199, 199, 1)"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
]
|
|
||||||
},
|
|
||||||
options: options_fans
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else if (data.hasOwnProperty("HR")) {
|
|
||||||
var miner_stdout = document.getElementById(data["IP"] + "-stdout")
|
|
||||||
miner_stdout.hidden = true
|
|
||||||
var miner_graphs = document.getElementById(data["IP"] + "-graphs")
|
|
||||||
miner_graphs.hidden = false
|
|
||||||
var hr_graph = Chart.getChart(data["IP"] + "-hr")
|
|
||||||
var temp_graph = Chart.getChart(data["IP"] + "-temp")
|
|
||||||
var fan_1_graph = Chart.getChart(data["IP"] + "-fan-1")
|
|
||||||
var fan_2_graph = Chart.getChart(data["IP"] + "-fan-2")
|
|
||||||
|
|
||||||
// update hr graph data and call the Update method
|
|
||||||
var hr_data = []
|
|
||||||
hr_data.push({label: "Board 6", data: [data["HR"]["board_6"]["HR"]], backgroundColor: ["rgba(0, 19, 97, 1)"]});
|
|
||||||
hr_data.push({label: "Board 7", data: [data["HR"]["board_7"]["HR"]], backgroundColor: ["rgba(0, 84, 219, 1)"]});
|
|
||||||
hr_data.push({label: "Board 8", data: [data["HR"]["board_8"]["HR"]], backgroundColor: ["rgba(36, 180, 224, 1)"]});
|
|
||||||
hr_graph.data.datasets = hr_data;
|
|
||||||
hr_graph.update();
|
|
||||||
|
|
||||||
// update temp graph data and call the Update method
|
|
||||||
var temp_data = []
|
|
||||||
temp_data.push({label: "Board 6 Chips", data: [data["Temps"]["board_6"]["Chip"]], backgroundColor: ["rgba(6, 92, 39, 1)"]});
|
|
||||||
temp_data.push({label: "Board 6", data: [data["Temps"]["board_6"]["Board"]], backgroundColor: ["rgba(255, 15, 58, 1)"]});
|
|
||||||
temp_data.push({label: "Board 7 Chips", data: [data["Temps"]["board_7"]["Chip"]], backgroundColor: ["rgba(6, 92, 39, 1)"]});
|
|
||||||
temp_data.push({label: "Board 7", data: [data["Temps"]["board_7"]["Board"]], backgroundColor: ["rgba(255, 15, 58, 1)"]});
|
|
||||||
temp_data.push({label: "Board 8 Chips", data: [data["Temps"]["board_8"]["Chip"]], backgroundColor: ["rgba(6, 92, 39, 1)"]});
|
|
||||||
temp_data.push({label: "Board 8", data: [data["Temps"]["board_8"]["Board"]], backgroundColor: ["rgba(255, 15, 58, 1)"]});
|
|
||||||
temp_graph.data.datasets = temp_data;
|
|
||||||
temp_graph.update();
|
|
||||||
|
|
||||||
// update fan 1 graph data and call the Update method
|
|
||||||
var fan_1_rpm = data["Fans"]["fan_0"]["RPM"]
|
|
||||||
var fan_1_title = document.getElementById(data["IP"] + "-fan_l");
|
|
||||||
fan_1_title.innerHTML = "Fan L: " + fan_1_rpm + " RPM";
|
|
||||||
if (fan_1_rpm == 0){
|
|
||||||
var secondary_col_1 = "rgba(97, 4, 4, 1)"
|
|
||||||
} else {
|
|
||||||
var secondary_col_1 = "rgba(199, 199, 199, 1)"
|
|
||||||
}
|
|
||||||
var fan_1_data = [{label: "Fan Speed", data: [fan_1_rpm, 6000-fan_1_rpm], backgroundColor: ["rgba(103, 0, 221, 1)", secondary_col_1]}]
|
|
||||||
fan_1_graph.data.datasets = fan_1_data;
|
|
||||||
fan_1_graph.update();
|
|
||||||
|
|
||||||
// update fan 2 graph data and call the Update method
|
|
||||||
var fan_2_rpm = data["Fans"]["fan_1"]["RPM"]
|
|
||||||
var fan_2_title = document.getElementById(data["IP"] + "-fan_r");
|
|
||||||
fan_2_title.innerHTML = "Fan R: " + fan_2_rpm + " RPM";
|
|
||||||
if (fan_2_rpm == 0){
|
|
||||||
var secondary_col_2 = "rgba(97, 4, 4, 1)"
|
|
||||||
} else {
|
|
||||||
var secondary_col_2 = "rgba(199, 199, 199, 1)"
|
|
||||||
}
|
|
||||||
var fan_2_data = [{label: "Fan Speed", data: [fan_2_rpm, 6000-fan_2_rpm], backgroundColor: ["rgba(103, 0, 221, 1)", secondary_col_2]}]
|
|
||||||
fan_2_graph.data.datasets = fan_2_data;
|
|
||||||
fan_2_graph.update();
|
|
||||||
} else {
|
|
||||||
var miner_graphs = document.getElementById(data["IP"] + "-graphs")
|
|
||||||
miner_graphs.hidden = true
|
|
||||||
var miner_stdout = document.getElementById(data["IP"] + "-stdout_text")
|
|
||||||
miner_stdout.hidden = false
|
|
||||||
miner_stdout.innerHTML = data["text"] + miner_stdout.innerHTML
|
|
||||||
};
|
|
||||||
if (data.hasOwnProperty("Light")) {
|
|
||||||
if (data["Light"] == "show") {
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
ws.onmessage = function(event) {
|
||||||
|
var data = JSON.parse(event.data)
|
||||||
|
if (data.hasOwnProperty("miners")) {
|
||||||
|
var container_all = document.getElementById('chart_container');
|
||||||
|
container_all.innerHTML = ""
|
||||||
|
data["miners"].forEach(function(miner) {
|
||||||
|
// create column with ID being the IP for later use
|
||||||
|
var column = document.createElement('div');
|
||||||
|
column.className = "col border border-dark p-3"
|
||||||
|
column.id = miner["IP"]
|
||||||
|
|
||||||
|
// create IP address header
|
||||||
|
var header = document.createElement('button');
|
||||||
|
header.className = "text-center btn btn-primary w-100"
|
||||||
|
header.onclick = function(){window.open("http://" + miner["IP"], '_blank');}
|
||||||
|
header.innerHTML += miner["IP"]
|
||||||
|
|
||||||
|
column.append(header)
|
||||||
|
|
||||||
|
// create install stdout
|
||||||
|
var row_text = document.createElement('div');
|
||||||
|
row_text.className = "row p-3"
|
||||||
|
row_text.id = miner["IP"] + "-stdout"
|
||||||
|
|
||||||
|
// create text area for data
|
||||||
|
var text_area = document.createElement('textarea');
|
||||||
|
text_area.id = miner["IP"] + "-stdout_text"
|
||||||
|
text_area.rows = "15"
|
||||||
|
text_area.className = "form-control"
|
||||||
|
text_area.style = "font-size: 12px"
|
||||||
|
text_area.disabled = true
|
||||||
|
text_area.readonly = true
|
||||||
|
|
||||||
|
row_text.append(text_area)
|
||||||
|
|
||||||
|
column.append(row_text)
|
||||||
|
|
||||||
|
|
||||||
|
// create hr and temp canvas
|
||||||
|
var hr_canvas = document.createElement('canvas');
|
||||||
|
hr_canvas.width = 125
|
||||||
|
hr_canvas.height = 125
|
||||||
|
hr_canvas.id = miner["IP"] + "-hr"
|
||||||
|
|
||||||
|
var temp_canvas = document.createElement('canvas');
|
||||||
|
temp_canvas.width = 125
|
||||||
|
temp_canvas.height = 125
|
||||||
|
temp_canvas.id = miner["IP"] + "-temp"
|
||||||
|
|
||||||
|
// create fan 1 title
|
||||||
|
var fan_1_title = document.createElement('p');
|
||||||
|
fan_1_title.innerHTML += "Fan L: 0 RPM";
|
||||||
|
fan_1_title.className = "text-center"
|
||||||
|
fan_1_title.id = miner["IP"] + "-fan_l"
|
||||||
|
|
||||||
|
// create fan 2 title
|
||||||
|
var fan_2_title = document.createElement('p');
|
||||||
|
fan_2_title.innerHTML += "Fan R: 0 RPM";
|
||||||
|
fan_2_title.className = "text-center"
|
||||||
|
fan_2_title.id = miner["IP"] + "-fan_r"
|
||||||
|
|
||||||
|
// create fan 1 canvas
|
||||||
|
var fan_1_canvas = document.createElement('canvas');
|
||||||
|
fan_1_canvas.width = 100
|
||||||
|
fan_1_canvas.height = 100
|
||||||
|
fan_1_canvas.id = miner["IP"] + "-fan-1"
|
||||||
|
|
||||||
|
// create fan 2 canvas
|
||||||
|
var fan_2_canvas = document.createElement('canvas');
|
||||||
|
fan_2_canvas.width = 100
|
||||||
|
fan_2_canvas.height = 100
|
||||||
|
fan_2_canvas.id = miner["IP"] + "-fan-2"
|
||||||
|
|
||||||
|
|
||||||
|
// create row for hr and temp data
|
||||||
|
var row_hr = document.createElement('div');
|
||||||
|
row_hr.className = "row"
|
||||||
|
|
||||||
|
// create row for titles of fans
|
||||||
|
var row_fan_title = document.createElement('div');
|
||||||
|
row_fan_title.className = "row"
|
||||||
|
|
||||||
|
// create row for fan graphs
|
||||||
|
var row_fan = document.createElement('div');
|
||||||
|
row_fan.className = "row mb-4"
|
||||||
|
|
||||||
|
// create hr container
|
||||||
|
var container_col_hr = document.createElement('div');
|
||||||
|
container_col_hr.className = "col w-50 ps-0 pe-4"
|
||||||
|
|
||||||
|
// create temp container
|
||||||
|
var container_col_temp = document.createElement('div');
|
||||||
|
container_col_temp.className = "col w-50 ps-0 pe-4"
|
||||||
|
|
||||||
|
// create fan title 1 container
|
||||||
|
var container_col_title_fan_1 = document.createElement('div');
|
||||||
|
container_col_title_fan_1.className = "col"
|
||||||
|
|
||||||
|
// create fan title 2 container
|
||||||
|
var container_col_title_fan_2 = document.createElement('div');
|
||||||
|
container_col_title_fan_2.className = "col"
|
||||||
|
|
||||||
|
// create fan 1 data container
|
||||||
|
var container_col_fan_1 = document.createElement('div');
|
||||||
|
container_col_fan_1.className = "col w-50 ps-3 pe-1"
|
||||||
|
|
||||||
|
// create fan 2 data container
|
||||||
|
var container_col_fan_2 = document.createElement('div');
|
||||||
|
container_col_fan_2.className = "col w-50 ps-3 pe-1"
|
||||||
|
|
||||||
|
// append canvases to the appropriate container columns
|
||||||
|
container_col_hr.append(hr_canvas)
|
||||||
|
container_col_temp.append(temp_canvas)
|
||||||
|
container_col_title_fan_1.append(fan_1_title)
|
||||||
|
container_col_title_fan_2.append(fan_2_title)
|
||||||
|
container_col_fan_1.append(fan_1_canvas)
|
||||||
|
container_col_fan_2.append(fan_2_canvas)
|
||||||
|
|
||||||
|
// add container columns to the correct rows
|
||||||
|
row_hr.append(container_col_hr)
|
||||||
|
row_hr.append(container_col_temp)
|
||||||
|
row_fan_title.append(container_col_title_fan_1)
|
||||||
|
row_fan_title.append(container_col_title_fan_2)
|
||||||
|
row_fan.append(container_col_fan_1)
|
||||||
|
row_fan.append(container_col_fan_2)
|
||||||
|
|
||||||
|
// create miner graph container
|
||||||
|
var miner_graphs = document.createElement('div');
|
||||||
|
miner_graphs.id = miner["IP"] + "-graphs"
|
||||||
|
miner_graphs.hidden = true
|
||||||
|
|
||||||
|
// append the rows to the column
|
||||||
|
miner_graphs.append(row_hr)
|
||||||
|
miner_graphs.append(row_fan_title)
|
||||||
|
miner_graphs.append(row_fan)
|
||||||
|
column.append(miner_graphs)
|
||||||
|
|
||||||
|
|
||||||
|
// create light button container
|
||||||
|
var container_light = document.createElement('div');
|
||||||
|
container_light.className = "form-check form-switch d-flex justify-content-evenly"
|
||||||
|
container_light.id = miner["IP"] + "-light_container"
|
||||||
|
|
||||||
|
// create light button
|
||||||
|
var light_switch = document.createElement('input');
|
||||||
|
light_switch.type = "checkbox"
|
||||||
|
if (miner["Light_On"] == true) {
|
||||||
|
light_switch.checked = true
|
||||||
|
}
|
||||||
|
light_switch.id = miner["IP"] + "-light"
|
||||||
|
light_switch.className = "form-check-input"
|
||||||
|
light_switch.addEventListener("click", function(){lightMiner(miner, light_switch);}, false);
|
||||||
|
|
||||||
|
|
||||||
|
// add a light label to the button
|
||||||
|
var label_light = document.createElement("label");
|
||||||
|
label_light.setAttribute("for", miner["IP"] + "-light");
|
||||||
|
label_light.innerHTML = "Light";
|
||||||
|
|
||||||
|
// add the button and label to the container
|
||||||
|
container_light.append(light_switch)
|
||||||
|
container_light.append(label_light)
|
||||||
|
|
||||||
|
column.append(container_light)
|
||||||
|
|
||||||
|
container_all.append(column)
|
||||||
|
|
||||||
|
var chart_hr = new Chart(hr_canvas, {
|
||||||
|
type: "bar",
|
||||||
|
data: {
|
||||||
|
labels: ["Hashrate"],
|
||||||
|
datasets: [],
|
||||||
|
},
|
||||||
|
options: options_hr
|
||||||
|
});
|
||||||
|
|
||||||
|
var chart_temp = new Chart(temp_canvas, {
|
||||||
|
type: "bar",
|
||||||
|
data: {
|
||||||
|
labels: ["Temps"],
|
||||||
|
datasets: [],
|
||||||
|
},
|
||||||
|
options: options_temp,
|
||||||
|
});
|
||||||
|
|
||||||
|
var chart_fan_1 = new Chart(fan_1_canvas, {
|
||||||
|
type: "doughnut",
|
||||||
|
data: {
|
||||||
|
labels: ["Fan L"],
|
||||||
|
datasets: [
|
||||||
|
{
|
||||||
|
data: [],
|
||||||
|
// add colors
|
||||||
|
backgroundColor: [
|
||||||
|
"rgba(103, 0, 221, 1)",
|
||||||
|
"rgba(199, 199, 199, 1)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
options: options_fans
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// create the fan 2 chart
|
||||||
|
var chart_fan_2 = new Chart(fan_2_canvas, {
|
||||||
|
type: "doughnut",
|
||||||
|
data: {
|
||||||
|
labels: ["Fan R"],
|
||||||
|
datasets: [
|
||||||
|
{
|
||||||
|
data: [],
|
||||||
|
backgroundColor: [
|
||||||
|
"rgba(103, 0, 221, 1)",
|
||||||
|
"rgba(199, 199, 199, 1)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
options: options_fans
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if (data.hasOwnProperty("HR")) {
|
||||||
|
var miner_stdout = document.getElementById(data["IP"] + "-stdout")
|
||||||
|
miner_stdout.hidden = true
|
||||||
|
var miner_graphs = document.getElementById(data["IP"] + "-graphs")
|
||||||
|
miner_graphs.hidden = false
|
||||||
|
var hr_graph = Chart.getChart(data["IP"] + "-hr")
|
||||||
|
var temp_graph = Chart.getChart(data["IP"] + "-temp")
|
||||||
|
var fan_1_graph = Chart.getChart(data["IP"] + "-fan-1")
|
||||||
|
var fan_2_graph = Chart.getChart(data["IP"] + "-fan-2")
|
||||||
|
|
||||||
|
// update hr graph data and call the Update method
|
||||||
|
var hr_data = []
|
||||||
|
hr_data.push({label: "Board 6", data: [data["HR"]["board_6"]["HR"]], backgroundColor: ["rgba(0, 19, 97, 1)"]});
|
||||||
|
hr_data.push({label: "Board 7", data: [data["HR"]["board_7"]["HR"]], backgroundColor: ["rgba(0, 84, 219, 1)"]});
|
||||||
|
hr_data.push({label: "Board 8", data: [data["HR"]["board_8"]["HR"]], backgroundColor: ["rgba(36, 180, 224, 1)"]});
|
||||||
|
hr_graph.data.datasets = hr_data;
|
||||||
|
hr_graph.update();
|
||||||
|
|
||||||
|
// update temp graph data and call the Update method
|
||||||
|
var temp_data = []
|
||||||
|
temp_data.push({label: "Board 6 Chips", data: [data["Temps"]["board_6"]["Chip"]], backgroundColor: ["rgba(6, 92, 39, 1)"]});
|
||||||
|
temp_data.push({label: "Board 6", data: [data["Temps"]["board_6"]["Board"]], backgroundColor: ["rgba(255, 15, 58, 1)"]});
|
||||||
|
temp_data.push({label: "Board 7 Chips", data: [data["Temps"]["board_7"]["Chip"]], backgroundColor: ["rgba(6, 92, 39, 1)"]});
|
||||||
|
temp_data.push({label: "Board 7", data: [data["Temps"]["board_7"]["Board"]], backgroundColor: ["rgba(255, 15, 58, 1)"]});
|
||||||
|
temp_data.push({label: "Board 8 Chips", data: [data["Temps"]["board_8"]["Chip"]], backgroundColor: ["rgba(6, 92, 39, 1)"]});
|
||||||
|
temp_data.push({label: "Board 8", data: [data["Temps"]["board_8"]["Board"]], backgroundColor: ["rgba(255, 15, 58, 1)"]});
|
||||||
|
temp_graph.data.datasets = temp_data;
|
||||||
|
temp_graph.update();
|
||||||
|
|
||||||
|
// update fan 1 graph data and call the Update method
|
||||||
|
var fan_1_rpm = data["Fans"]["fan_0"]["RPM"]
|
||||||
|
var fan_1_title = document.getElementById(data["IP"] + "-fan_l");
|
||||||
|
fan_1_title.innerHTML = "Fan L: " + fan_1_rpm + " RPM";
|
||||||
|
if (fan_1_rpm == 0){
|
||||||
|
var secondary_col_1 = "rgba(97, 4, 4, 1)"
|
||||||
|
} else {
|
||||||
|
var secondary_col_1 = "rgba(199, 199, 199, 1)"
|
||||||
|
}
|
||||||
|
var fan_1_data = [{label: "Fan Speed", data: [fan_1_rpm, 6000-fan_1_rpm], backgroundColor: ["rgba(103, 0, 221, 1)", secondary_col_1]}]
|
||||||
|
fan_1_graph.data.datasets = fan_1_data;
|
||||||
|
fan_1_graph.update();
|
||||||
|
|
||||||
|
// update fan 2 graph data and call the Update method
|
||||||
|
var fan_2_rpm = data["Fans"]["fan_1"]["RPM"]
|
||||||
|
var fan_2_title = document.getElementById(data["IP"] + "-fan_r");
|
||||||
|
fan_2_title.innerHTML = "Fan R: " + fan_2_rpm + " RPM";
|
||||||
|
if (fan_2_rpm == 0){
|
||||||
|
var secondary_col_2 = "rgba(97, 4, 4, 1)"
|
||||||
|
} else {
|
||||||
|
var secondary_col_2 = "rgba(199, 199, 199, 1)"
|
||||||
|
}
|
||||||
|
var fan_2_data = [{label: "Fan Speed", data: [fan_2_rpm, 6000-fan_2_rpm], backgroundColor: ["rgba(103, 0, 221, 1)", secondary_col_2]}]
|
||||||
|
fan_2_graph.data.datasets = fan_2_data;
|
||||||
|
fan_2_graph.update();
|
||||||
|
} else {
|
||||||
|
var miner_graphs = document.getElementById(data["IP"] + "-graphs")
|
||||||
|
miner_graphs.hidden = true
|
||||||
|
var miner_stdout = document.getElementById(data["IP"] + "-stdout_text")
|
||||||
|
miner_stdout.hidden = false
|
||||||
|
miner_stdout.innerHTML = data["text"] + miner_stdout.innerHTML
|
||||||
|
};
|
||||||
|
if (data.hasOwnProperty("Light")) {
|
||||||
|
light_box = document.getElementById(data["IP"] + "-light_container")
|
||||||
|
if (data["Light"] == "show") {
|
||||||
|
light_box.hidden = false
|
||||||
|
} else {
|
||||||
|
light_box.hidden = true
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user