added reverse sorting and fixed hashrate sorting
This commit is contained in:
@@ -134,20 +134,23 @@ class BMMiner(BaseMiner):
|
|||||||
"Pool 2 User": "",
|
"Pool 2 User": "",
|
||||||
}
|
}
|
||||||
|
|
||||||
miner_data = await self.api.multicommand("summary", "pools", "stats")
|
|
||||||
model = await self.get_model()
|
model = await self.get_model()
|
||||||
hostname = await self.get_hostname()
|
hostname = await self.get_hostname()
|
||||||
|
|
||||||
summary = miner_data.get("summary")[0]
|
|
||||||
pools = miner_data.get("pools")[0]
|
|
||||||
stats = miner_data.get("stats")[0]
|
|
||||||
|
|
||||||
if model:
|
if model:
|
||||||
data["Model"] = model
|
data["Model"] = model
|
||||||
|
|
||||||
if hostname:
|
if hostname:
|
||||||
data["Hostname"] = hostname
|
data["Hostname"] = hostname
|
||||||
|
|
||||||
|
miner_data = await self.api.multicommand("summary", "pools", "stats")
|
||||||
|
if not miner_data:
|
||||||
|
return data
|
||||||
|
|
||||||
|
summary = miner_data.get("summary")[0]
|
||||||
|
pools = miner_data.get("pools")[0]
|
||||||
|
stats = miner_data.get("stats")[0]
|
||||||
|
|
||||||
if summary:
|
if summary:
|
||||||
hr = summary.get("SUMMARY")
|
hr = summary.get("SUMMARY")
|
||||||
if hr:
|
if hr:
|
||||||
|
|||||||
@@ -250,20 +250,22 @@ class BOSMiner(BaseMiner):
|
|||||||
model = await self.get_model()
|
model = await self.get_model()
|
||||||
hostname = await self.get_hostname()
|
hostname = await self.get_hostname()
|
||||||
|
|
||||||
miner_data = await self.api.multicommand(
|
|
||||||
"summary", "temps", "tunerstatus", "pools"
|
|
||||||
)
|
|
||||||
summary = miner_data.get("summary")[0]
|
|
||||||
temps = miner_data.get("temps")[0]
|
|
||||||
tunerstatus = miner_data.get("tunerstatus")[0]
|
|
||||||
pools = miner_data.get("pools")[0]
|
|
||||||
|
|
||||||
if model:
|
if model:
|
||||||
data["Model"] = model
|
data["Model"] = model
|
||||||
|
|
||||||
if hostname:
|
if hostname:
|
||||||
data["Hostname"] = hostname
|
data["Hostname"] = hostname
|
||||||
|
|
||||||
|
miner_data = await self.api.multicommand(
|
||||||
|
"summary", "temps", "tunerstatus", "pools"
|
||||||
|
)
|
||||||
|
if not miner_data:
|
||||||
|
return data
|
||||||
|
summary = miner_data.get("summary")[0]
|
||||||
|
temps = miner_data.get("temps")[0]
|
||||||
|
tunerstatus = miner_data.get("tunerstatus")[0]
|
||||||
|
pools = miner_data.get("pools")[0]
|
||||||
|
|
||||||
if summary:
|
if summary:
|
||||||
hr = summary.get("SUMMARY")
|
hr = summary.get("SUMMARY")
|
||||||
if hr:
|
if hr:
|
||||||
|
|||||||
@@ -93,17 +93,20 @@ class BTMiner(BaseMiner):
|
|||||||
model = await self.get_model()
|
model = await self.get_model()
|
||||||
hostname = await self.get_hostname()
|
hostname = await self.get_hostname()
|
||||||
|
|
||||||
miner_data = await self.api.multicommand("summary", "devs", "pools")
|
|
||||||
summary = miner_data.get("summary")[0]
|
|
||||||
devs = miner_data.get("devs")[0]
|
|
||||||
pools = miner_data.get("pools")[0]
|
|
||||||
|
|
||||||
if model:
|
if model:
|
||||||
data["Model"] = model
|
data["Model"] = model
|
||||||
|
|
||||||
if hostname:
|
if hostname:
|
||||||
data["Hostname"] = hostname
|
data["Hostname"] = hostname
|
||||||
|
|
||||||
|
miner_data = await self.api.multicommand("summary", "devs", "pools")
|
||||||
|
if not miner_data:
|
||||||
|
return data
|
||||||
|
|
||||||
|
summary = miner_data.get("summary")[0]
|
||||||
|
devs = miner_data.get("devs")[0]
|
||||||
|
pools = miner_data.get("pools")[0]
|
||||||
|
|
||||||
if summary:
|
if summary:
|
||||||
summary_data = summary.get("SUMMARY")
|
summary_data = summary.get("SUMMARY")
|
||||||
if summary_data:
|
if summary_data:
|
||||||
@@ -174,4 +177,4 @@ class BTMiner(BaseMiner):
|
|||||||
if quota:
|
if quota:
|
||||||
data["Split"] = quota
|
data["Split"] = quota
|
||||||
|
|
||||||
print(data)
|
return data
|
||||||
|
|||||||
@@ -109,20 +109,23 @@ class CGMiner(BaseMiner):
|
|||||||
"Pool 2 User": "",
|
"Pool 2 User": "",
|
||||||
}
|
}
|
||||||
|
|
||||||
miner_data = await self.api.multicommand("summary", "pools", "stats")
|
|
||||||
model = await self.get_model()
|
model = await self.get_model()
|
||||||
hostname = await self.get_hostname()
|
hostname = await self.get_hostname()
|
||||||
|
|
||||||
summary = miner_data.get("summary")[0]
|
|
||||||
pools = miner_data.get("pools")[0]
|
|
||||||
stats = miner_data.get("stats")[0]
|
|
||||||
|
|
||||||
if model:
|
if model:
|
||||||
data["Model"] = model
|
data["Model"] = model
|
||||||
|
|
||||||
if hostname:
|
if hostname:
|
||||||
data["Hostname"] = hostname
|
data["Hostname"] = hostname
|
||||||
|
|
||||||
|
miner_data = await self.api.multicommand("summary", "pools", "stats")
|
||||||
|
if not miner_data:
|
||||||
|
return data
|
||||||
|
|
||||||
|
summary = miner_data.get("summary")[0]
|
||||||
|
pools = miner_data.get("pools")[0]
|
||||||
|
stats = miner_data.get("stats")[0]
|
||||||
|
|
||||||
if summary:
|
if summary:
|
||||||
hr = summary.get("SUMMARY")
|
hr = summary.get("SUMMARY")
|
||||||
if hr:
|
if hr:
|
||||||
|
|||||||
@@ -14,11 +14,16 @@ sg.set_options(font=("Liberation Mono", 10))
|
|||||||
|
|
||||||
async def main():
|
async def main():
|
||||||
window.read(0)
|
window.read(0)
|
||||||
|
|
||||||
|
# create images used in the table, they will not show if not saved here
|
||||||
tk_imgs = TkImages()
|
tk_imgs = TkImages()
|
||||||
|
|
||||||
# clear_tables()
|
# left justify hostnames
|
||||||
window["scan_table"].Widget.column(2, anchor=tk.W)
|
window["scan_table"].Widget.column(2, anchor=tk.W)
|
||||||
|
|
||||||
|
# cmd table sort event
|
||||||
|
window["cmd_table"].Widget.bind("<Button-1>", lambda x: print("clicked"))
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
event, value = window.read(0)
|
event, value = window.read(0)
|
||||||
if event in (None, "Close", sg.WIN_CLOSED):
|
if event in (None, "Close", sg.WIN_CLOSED):
|
||||||
@@ -30,10 +35,10 @@ async def main():
|
|||||||
if event[2][0] == -1:
|
if event[2][0] == -1:
|
||||||
mgr = TableManager()
|
mgr = TableManager()
|
||||||
table = window[event[0]].Widget
|
table = window[event[0]].Widget
|
||||||
mgr.sort_key = table.heading(event[2][1])["text"]
|
mgr.update_sort_key(table.heading(event[2][1])["text"])
|
||||||
mgr.update_tables()
|
|
||||||
|
|
||||||
# scan tab
|
# scan tab
|
||||||
|
|
||||||
if event == "scan_all":
|
if event == "scan_all":
|
||||||
_table = "scan_table"
|
_table = "scan_table"
|
||||||
btn_all(_table, value[_table])
|
btn_all(_table, value[_table])
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
|
|
||||||
from tools.cfg_util.cfg_util_qt.tables import clear_tables, update_tables
|
from tools.cfg_util.cfg_util_qt.tables import clear_tables, update_tables, TableManager
|
||||||
from tools.cfg_util.cfg_util_qt.layout import window, update_prog_bar
|
from tools.cfg_util.cfg_util_qt.layout import window, update_prog_bar
|
||||||
from network import MinerNetwork
|
from network import MinerNetwork
|
||||||
from miners.miner_factory import MinerFactory
|
from miners.miner_factory import MinerFactory
|
||||||
|
from datetime import datetime
|
||||||
from API import APIError
|
from API import APIError
|
||||||
|
|
||||||
import warnings
|
import warnings
|
||||||
@@ -71,14 +72,11 @@ async def _scan_miners(network: MinerNetwork):
|
|||||||
async for found_miner in get_miner_genenerator:
|
async for found_miner in get_miner_genenerator:
|
||||||
resolved_miners.append(found_miner)
|
resolved_miners.append(found_miner)
|
||||||
resolved_miners.sort(key=lambda x: x.ip)
|
resolved_miners.sort(key=lambda x: x.ip)
|
||||||
resolved_miners_data = []
|
_data = {}
|
||||||
for miner in resolved_miners:
|
for key in DEFAULT_DATA:
|
||||||
_data = {}
|
_data[key] = ""
|
||||||
for key in DEFAULT_DATA:
|
_data["IP"] = str(found_miner.ip)
|
||||||
_data[key] = ""
|
TableManager().update_item(_data)
|
||||||
_data["IP"] = str(miner.ip)
|
|
||||||
_data["Light"] = False
|
|
||||||
update_tables([_data])
|
|
||||||
progress_bar_len += 1
|
progress_bar_len += 1
|
||||||
await update_prog_bar(progress_bar_len)
|
await update_prog_bar(progress_bar_len)
|
||||||
progress_bar_len += network_size - len(resolved_miners)
|
progress_bar_len += network_size - len(resolved_miners)
|
||||||
@@ -89,13 +87,9 @@ async def _scan_miners(network: MinerNetwork):
|
|||||||
async def _get_miners_data(miners: list):
|
async def _get_miners_data(miners: list):
|
||||||
global progress_bar_len
|
global progress_bar_len
|
||||||
data_generator = asyncio.as_completed([_get_data(miner) for miner in miners])
|
data_generator = asyncio.as_completed([_get_data(miner) for miner in miners])
|
||||||
miner_data = [{"IP": str(miner.ip)} for miner in miners]
|
|
||||||
for all_data in data_generator:
|
for all_data in data_generator:
|
||||||
data = await all_data
|
data = await all_data
|
||||||
for idx, item in enumerate(miner_data):
|
TableManager().update_item(data)
|
||||||
if item["IP"] == data["IP"]:
|
|
||||||
miner_data[idx] = data
|
|
||||||
update_tables(miner_data)
|
|
||||||
progress_bar_len += 1
|
progress_bar_len += 1
|
||||||
await update_prog_bar(progress_bar_len)
|
await update_prog_bar(progress_bar_len)
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ from tools.cfg_util.cfg_util_qt.layout import (
|
|||||||
from tools.cfg_util.cfg_util_qt.imgs import TkImages, LIGHT, FAULT_LIGHT
|
from tools.cfg_util.cfg_util_qt.imgs import TkImages, LIGHT, FAULT_LIGHT
|
||||||
import PySimpleGUI as sg
|
import PySimpleGUI as sg
|
||||||
import ipaddress
|
import ipaddress
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
|
||||||
def update_miner_count(count):
|
def update_miner_count(count):
|
||||||
@@ -46,6 +47,7 @@ class TableManager(metaclass=Singleton):
|
|||||||
self.images = TkImages()
|
self.images = TkImages()
|
||||||
self.data = {}
|
self.data = {}
|
||||||
self.sort_key = "IP"
|
self.sort_key = "IP"
|
||||||
|
self.sort_reverse = False
|
||||||
|
|
||||||
def update_data(self, data: list):
|
def update_data(self, data: list):
|
||||||
if not data:
|
if not data:
|
||||||
@@ -54,10 +56,19 @@ class TableManager(metaclass=Singleton):
|
|||||||
for line in data:
|
for line in data:
|
||||||
self.update_item(line)
|
self.update_item(line)
|
||||||
|
|
||||||
|
def update_sort_key(self, sort_key):
|
||||||
|
if self.sort_key == sort_key:
|
||||||
|
self.sort_reverse = not self.sort_reverse
|
||||||
|
self.sort_key = sort_key
|
||||||
|
self.update_tables()
|
||||||
|
|
||||||
def update_item(self, data: dict):
|
def update_item(self, data: dict):
|
||||||
if not data or data == {} or not data.get("IP"):
|
if not data or data == {} or not data.get("IP"):
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if not data.get("Light"):
|
||||||
|
data["Light"] = False
|
||||||
|
|
||||||
if not data["IP"] in self.data.keys():
|
if not data["IP"] in self.data.keys():
|
||||||
self.data[data["IP"]] = {}
|
self.data[data["IP"]] = {}
|
||||||
|
|
||||||
@@ -73,11 +84,12 @@ class TableManager(metaclass=Singleton):
|
|||||||
"POOLS": [["" for _ in TABLE_HEADERS["POOLS"]] for _ in self.data],
|
"POOLS": [["" for _ in TABLE_HEADERS["POOLS"]] for _ in self.data],
|
||||||
"CONFIG": [["" for _ in TABLE_HEADERS["CONFIG"]] for _ in self.data],
|
"CONFIG": [["" for _ in TABLE_HEADERS["CONFIG"]] for _ in self.data],
|
||||||
}
|
}
|
||||||
sorted_keys = sorted(self.data.keys(), key=lambda x: self._get_sort(x))
|
|
||||||
if sorted_keys == list(self.data.keys()):
|
ip_sorted_keys = sorted(self.data.keys(), key=lambda x: ipaddress.ip_address(x))
|
||||||
sorted_keys = sorted(
|
sorted_keys = sorted(
|
||||||
self.data.keys(), key=lambda x: ipaddress.ip_address(x)
|
ip_sorted_keys, reverse=self.sort_reverse, key=lambda x: self._get_sort(x)
|
||||||
)
|
)
|
||||||
|
|
||||||
for data_idx, key in enumerate(sorted_keys):
|
for data_idx, key in enumerate(sorted_keys):
|
||||||
item = self.data[key]
|
item = self.data[key]
|
||||||
keys = item.keys()
|
keys = item.keys()
|
||||||
@@ -113,7 +125,9 @@ class TableManager(metaclass=Singleton):
|
|||||||
return ipaddress.ip_address(self.data[data_key]["IP"])
|
return ipaddress.ip_address(self.data[data_key]["IP"])
|
||||||
|
|
||||||
if self.sort_key == "Hashrate":
|
if self.sort_key == "Hashrate":
|
||||||
return self.data[data_key]["Hashrate"].replace(" ", "").replace("TH/s", "")
|
return float(
|
||||||
|
self.data[data_key]["Hashrate"].replace(" ", "").replace("TH/s", "")
|
||||||
|
)
|
||||||
|
|
||||||
return self.data[data_key][self.sort_key]
|
return self.data[data_key][self.sort_key]
|
||||||
|
|
||||||
@@ -124,42 +138,3 @@ class TableManager(metaclass=Singleton):
|
|||||||
for tree in TABLE_KEYS["tree"]:
|
for tree in TABLE_KEYS["tree"]:
|
||||||
window[tree].update(sg.TreeData())
|
window[tree].update(sg.TreeData())
|
||||||
update_miner_count(0)
|
update_miner_count(0)
|
||||||
|
|
||||||
def update_tree_by_key(self, data: dict, key: str = "IP"):
|
|
||||||
for idx, item in enumerate(self.data):
|
|
||||||
if key in item.keys():
|
|
||||||
if data[key] == item[key]:
|
|
||||||
self.data[idx] = data
|
|
||||||
|
|
||||||
keys = data.keys()
|
|
||||||
img = None
|
|
||||||
if key not in keys:
|
|
||||||
return
|
|
||||||
_tree = window["cmd_table"].Widget
|
|
||||||
for iid in _tree.get_children():
|
|
||||||
values = _tree.item(iid)["values"]
|
|
||||||
if data.get("Light"):
|
|
||||||
if data["Light"]:
|
|
||||||
img = self.images.fault_light
|
|
||||||
if not data["Light"]:
|
|
||||||
img = self.images.light
|
|
||||||
if values[0] == data["IP"]:
|
|
||||||
if img:
|
|
||||||
_tree.item(
|
|
||||||
iid,
|
|
||||||
image=img,
|
|
||||||
values=[
|
|
||||||
data["IP"],
|
|
||||||
data["Model"] if "Model" in keys else "",
|
|
||||||
data["Command Output"] if "Command Output" in keys else "",
|
|
||||||
],
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
_tree.item(
|
|
||||||
iid,
|
|
||||||
values=[
|
|
||||||
data["IP"],
|
|
||||||
data["Model"] if "Model" in keys else "",
|
|
||||||
data["Command Output"] if "Command Output" in keys else "",
|
|
||||||
],
|
|
||||||
)
|
|
||||||
|
|||||||
Reference in New Issue
Block a user