improved X19 miner scan speed and implemented miner data in miners

This commit is contained in:
UpstreamData
2022-05-25 14:44:23 -06:00
parent 3b702aac2c
commit 568f86700b
18 changed files with 145 additions and 152 deletions

View File

@@ -1,8 +1,13 @@
import ipaddress
import logging
from API.bmminer import BMMinerAPI from API.bmminer import BMMinerAPI
from miners import BaseMiner from miners import BaseMiner
import logging
from data import MinerData
from settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES from settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES
import ipaddress
class BMMiner(BaseMiner): class BMMiner(BaseMiner):
@@ -122,36 +127,17 @@ class BMMiner(BaseMiner):
return True return True
return False return False
async def get_data(self): async def get_data(self) -> MinerData:
data = { data = MinerData(ip=str(self.ip), ideal_chips=self.nominal_chips * 3)
"IP": str(self.ip),
"Model": "Unknown",
"Hostname": "Unknown",
"Hashrate": 0,
"Temp": 0,
"Pool User": "Unknown",
"Wattage": 0,
"Total": 0,
"Ideal": self.nominal_chips * 3,
"Left Board": 0,
"Center Board": 0,
"Right Board": 0,
"Nominal": False,
"Split": "0",
"Pool 1": "Unknown",
"Pool 1 User": "Unknown",
"Pool 2": "",
"Pool 2 User": "",
}
model = await self.get_model() model = await self.get_model()
hostname = await self.get_hostname() hostname = await self.get_hostname()
if model: if model:
data["Model"] = model data.model = model
if hostname: if hostname:
data["Hostname"] = hostname data.hostname = hostname
miner_data = None miner_data = None
for i in range(DATA_RETRIES): for i in range(DATA_RETRIES):
@@ -172,19 +158,15 @@ class BMMiner(BaseMiner):
if len(hr) > 0: if len(hr) > 0:
hr = hr[0].get("GHS av") hr = hr[0].get("GHS av")
if hr: if hr:
data["Hashrate"] = round(hr / 1000, 2) data.hashrate = round(hr / 1000, 2)
if stats: if stats:
boards = stats.get("STATS") boards = stats.get("STATS")
if boards: if boards:
if len(boards) > 0: if len(boards) > 0:
data["Left Board"] = boards[1].get("chain_acn1") data.left_chips = boards[1].get("chain_acn1")
data["Center Board"] = boards[1].get("chain_acn2") data.center_chips = boards[1].get("chain_acn2")
data["Right Board"] = boards[1].get("chain_acn3") data.right_chips = boards[1].get("chain_acn3")
data["Total"] = boards[1].get("total_acn")
if data["Total"] == data["Ideal"]:
data["Nominal"] = True
if stats: if stats:
temp = stats.get("STATS") temp = stats.get("STATS")
@@ -193,7 +175,7 @@ class BMMiner(BaseMiner):
for item in ["temp2", "temp1", "temp3"]: for item in ["temp2", "temp1", "temp3"]:
temperature = temp[1].get(item) temperature = temp[1].get(item)
if temperature and not temperature == 0.0: if temperature and not temperature == 0.0:
data["Temp"] = round(temperature) data.temperature = round(temperature)
if pools: if pools:
pool_1 = None pool_1 = None
@@ -225,23 +207,22 @@ class BMMiner(BaseMiner):
pool_1.replace("stratum+tcp://", "") pool_1.replace("stratum+tcp://", "")
if pool_1.startswith("stratum2+tcp://"): if pool_1.startswith("stratum2+tcp://"):
pool_1.replace("stratum2+tcp://", "") pool_1.replace("stratum2+tcp://", "")
data["Pool 1"] = pool_1 data.pool_1_url = pool_1
if pool_1_user: if pool_1_user:
data["Pool 1 User"] = pool_1_user data.pool_1_user = pool_1_user
data["Pool User"] = pool_1_user
if pool_2: if pool_2:
if pool_2.startswith("stratum+tcp://"): if pool_2.startswith("stratum+tcp://"):
pool_2.replace("stratum+tcp://", "") pool_2.replace("stratum+tcp://", "")
if pool_2.startswith("stratum2+tcp://"): if pool_2.startswith("stratum2+tcp://"):
pool_2.replace("stratum2+tcp://", "") pool_2.replace("stratum2+tcp://", "")
data["Pool 2"] = pool_2 data.pool_2_url = pool_2
if pool_2_user: if pool_2_user:
data["Pool 2 User"] = pool_2_user data.pool_2_user = pool_2_user
if quota: if quota:
data["Split"] = str(quota) data.pool_split = str(quota)
return data return data

View File

@@ -1,10 +1,17 @@
import ipaddress import ipaddress
import logging
import toml
from miners import BaseMiner from miners import BaseMiner
from API.bosminer import BOSMinerAPI from API.bosminer import BOSMinerAPI
import toml
from data import MinerData
from config.bos import bos_config_convert, general_config_convert_bos from config.bos import bos_config_convert, general_config_convert_bos
import logging
from settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES from settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES
@@ -241,35 +248,16 @@ class BOSMiner(BaseMiner):
if not bad > 0: if not bad > 0:
return str(self.ip) return str(self.ip)
async def get_data(self): async def get_data(self) -> MinerData:
data = { data = MinerData(ip=str(self.ip), ideal_chips=self.nominal_chips * 3)
"IP": str(self.ip),
"Model": "Unknown",
"Hostname": "Unknown",
"Hashrate": 0,
"Temp": 0,
"Pool User": "Unknown",
"Wattage": 0,
"Total": 0,
"Ideal": self.nominal_chips * 3,
"Left Board": 0,
"Center Board": 0,
"Right Board": 0,
"Nominal": False,
"Split": "0",
"Pool 1": "Unknown",
"Pool 1 User": "Unknown",
"Pool 2": "",
"Pool 2 User": "",
}
model = await self.get_model() model = await self.get_model()
hostname = await self.get_hostname() hostname = await self.get_hostname()
if model: if model:
data["Model"] = model data.model = model
if hostname: if hostname:
data["Hostname"] = hostname data.hostname = hostname
miner_data = None miner_data = None
for i in range(DATA_RETRIES): for i in range(DATA_RETRIES):
@@ -292,7 +280,7 @@ class BOSMiner(BaseMiner):
if len(hr) > 0: if len(hr) > 0:
hr = hr[0].get("MHS av") hr = hr[0].get("MHS av")
if hr: if hr:
data["Hashrate"] = round(hr / 1000000, 2) data.hashrate = round(hr / 1000000, 2)
if temps: if temps:
temp = temps.get("TEMPS") temp = temps.get("TEMPS")
@@ -300,7 +288,7 @@ class BOSMiner(BaseMiner):
if len(temp) > 0: if len(temp) > 0:
chip_temp = temp[0].get("Chip") chip_temp = temp[0].get("Chip")
if chip_temp: if chip_temp:
data["Temp"] = round(chip_temp) data.temperature = round(chip_temp)
if pools: if pools:
pool_1 = None pool_1 = None
@@ -330,22 +318,21 @@ class BOSMiner(BaseMiner):
if pool_1: if pool_1:
pool_1 = pool_1.replace("stratum+tcp://", "") pool_1 = pool_1.replace("stratum+tcp://", "")
pool_1 = pool_1.replace("stratum2+tcp://", "") pool_1 = pool_1.replace("stratum2+tcp://", "")
data["Pool 1"] = pool_1 data.pool_1_url = pool_1
if pool_1_user: if pool_1_user:
data["Pool 1 User"] = pool_1_user data.pool_1_user = pool_1_user
data["Pool User"] = pool_1_user
if pool_2: if pool_2:
pool_2 = pool_2.replace("stratum+tcp://", "") pool_2 = pool_2.replace("stratum+tcp://", "")
pool_2 = pool_2.replace("stratum2+tcp://", "") pool_2 = pool_2.replace("stratum2+tcp://", "")
data["Pool 2"] = pool_2 data.pool_2_url = pool_2
if pool_2_user: if pool_2_user:
data["Pool 2 User"] = pool_2_user data.pool_2_user = pool_2_user
if quota: if quota:
data["Split"] = str(quota) data.pool_split = str(quota)
if tunerstatus: if tunerstatus:
tuner = tunerstatus.get("TUNERSTATUS") tuner = tunerstatus.get("TUNERSTATUS")
@@ -353,22 +340,18 @@ class BOSMiner(BaseMiner):
if len(tuner) > 0: if len(tuner) > 0:
wattage = tuner[0].get("PowerLimit") wattage = tuner[0].get("PowerLimit")
if wattage: if wattage:
data["Wattage"] = wattage data.wattage = wattage
if devdetails: if devdetails:
boards = devdetails.get("DEVDETAILS") boards = devdetails.get("DEVDETAILS")
if boards: if boards:
if len(boards) > 0: if len(boards) > 0:
board_map = {0: "Left Board", 1: "Center Board", 2: "Right Board"} board_map = {0: "left_chips", 1: "center_chips", 2: "right_chips"}
offset = boards[0]["ID"] offset = boards[0]["ID"]
for board in boards: for board in boards:
id = board["ID"] - offset id = board["ID"] - offset
chips = board["Chips"] chips = board["Chips"]
data["Total"] += chips setattr(data, board_map[id], chips)
data[board_map[id]] = chips
if data["Total"] == data["Ideal"]:
data["Nominal"] = True
return data return data

View File

@@ -1,9 +1,14 @@
import ipaddress
import logging
from API.btminer import BTMinerAPI from API.btminer import BTMinerAPI
from miners import BaseMiner from miners import BaseMiner
from API import APIError from API import APIError
import logging
from data import MinerData
from settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES from settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES
import ipaddress
class BTMiner(BaseMiner): class BTMiner(BaseMiner):
@@ -83,26 +88,7 @@ class BTMiner(BaseMiner):
return str(mac).upper() return str(mac).upper()
async def get_data(self): async def get_data(self):
data = { data = MinerData(ip=str(self.ip), ideal_chips=self.nominal_chips * 3)
"IP": str(self.ip),
"Model": "Unknown",
"Hostname": "Unknown",
"Hashrate": 0,
"Temp": 0,
"Pool User": "Unknown",
"Wattage": 0,
"Total": 0,
"Ideal": self.nominal_chips * 3,
"Left Board": 0,
"Center Board": 0,
"Right Board": 0,
"Nominal": False,
"Split": "0",
"Pool 1": "Unknown",
"Pool 1 User": "Unknown",
"Pool 2": "",
"Pool 2 User": "",
}
try: try:
model = await self.get_model() model = await self.get_model()
@@ -110,15 +96,15 @@ class BTMiner(BaseMiner):
except APIError: except APIError:
logging.warning(f"Failed to get hostname and model: {self}") logging.warning(f"Failed to get hostname and model: {self}")
model = None model = None
data["Model"] = "Whatsminer" data.model = "Whatsminer"
hostname = None hostname = None
data["Hostname"] = "Whatsminer" data.hostname = "Whatsminer"
if model: if model:
data["Model"] = model data.model = model
if hostname: if hostname:
data["Hostname"] = hostname data.hostname = hostname
miner_data = None miner_data = None
for i in range(DATA_RETRIES): for i in range(DATA_RETRIES):
try: try:
@@ -141,11 +127,11 @@ class BTMiner(BaseMiner):
if len(summary_data) > 0: if len(summary_data) > 0:
hr = summary_data[0].get("MHS av") hr = summary_data[0].get("MHS av")
if hr: if hr:
data["Hashrate"] = round(hr / 1000000, 2) data.hashrate = round(hr / 1000000, 2)
wattage = summary_data[0].get("Power") wattage = summary_data[0].get("Power")
if wattage: if wattage:
data["Wattage"] = round(wattage) data.wattage = round(wattage)
if devs: if devs:
temp_data = devs.get("DEVS") temp_data = devs.get("DEVS")
@@ -153,14 +139,14 @@ class BTMiner(BaseMiner):
for board in temp_data: for board in temp_data:
temp = board.get("Chip Temp Avg") temp = board.get("Chip Temp Avg")
if temp and not temp == 0.0: if temp and not temp == 0.0:
data["Temp"] = round(temp) data.temperature = round(temp)
break break
if devs: if devs:
boards = devs.get("DEVS") boards = devs.get("DEVS")
if boards: if boards:
if len(boards) > 0: if len(boards) > 0:
board_map = {0: "Left Board", 1: "Center Board", 2: "Right Board"} board_map = {0: "left_chips", 1: "center_chips", 2: "right_chips"}
if "ID" in boards[0].keys(): if "ID" in boards[0].keys():
id_key = "ID" id_key = "ID"
else: else:
@@ -169,11 +155,7 @@ class BTMiner(BaseMiner):
for board in boards: for board in boards:
id = board[id_key] - offset id = board[id_key] - offset
chips = board["Effective Chips"] chips = board["Effective Chips"]
data["Total"] += chips setattr(data, board_map[id], chips)
data[board_map[id]] = chips
if data["Total"] == data["Ideal"]:
data["Nominal"] = True
if pools: if pools:
pool_1 = None pool_1 = None
@@ -205,23 +187,22 @@ class BTMiner(BaseMiner):
pool_1.replace("stratum+tcp://", "") pool_1.replace("stratum+tcp://", "")
if pool_1.startswith("stratum2+tcp://"): if pool_1.startswith("stratum2+tcp://"):
pool_1.replace("stratum2+tcp://", "") pool_1.replace("stratum2+tcp://", "")
data["Pool 1"] = pool_1 data.pool_1_url = pool_1
if pool_1_user: if pool_1_user:
data["Pool 1 User"] = pool_1_user data.pool_1_user = pool_1_user
data["Pool User"] = pool_1_user
if pool_2: if pool_2:
if pool_2.startswith("stratum+tcp://"): if pool_2.startswith("stratum+tcp://"):
pool_2.replace("stratum+tcp://", "") pool_2.replace("stratum+tcp://", "")
if pool_2.startswith("stratum2+tcp://"): if pool_2.startswith("stratum2+tcp://"):
pool_2.replace("stratum2+tcp://", "") pool_2.replace("stratum2+tcp://", "")
data["Pool 2"] = pool_2 data.pool_2_url = pool_2
if pool_2_user: if pool_2_user:
data["Pool 2 User"] = pool_2_user data.pool_2_user = pool_2_user
if quota: if quota:
data["Split"] = str(quota) data.pool_split = str(quota)
return data return data

View File

@@ -1,9 +1,14 @@
from miners import BaseMiner
from API.cgminer import CGMinerAPI
from API import APIError
from settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES
import logging
import ipaddress import ipaddress
import logging
from API.cgminer import CGMinerAPI
from miners import BaseMiner
from API import APIError
from data import MinerData
from settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES
class CGMiner(BaseMiner): class CGMiner(BaseMiner):
@@ -103,29 +108,16 @@ class CGMiner(BaseMiner):
print(str(self.config)) print(str(self.config))
async def get_data(self): async def get_data(self):
data = { data = MinerData(ip=str(self.ip), ideal_chips=self.nominal_chips * 3)
"IP": str(self.ip),
"Model": "Unknown",
"Hostname": "Unknown",
"Hashrate": 0,
"Temp": 0,
"Pool User": "Unknown",
"Wattage": 0,
"Split": 0,
"Pool 1": "Unknown",
"Pool 1 User": "Unknown",
"Pool 2": "",
"Pool 2 User": "",
}
model = await self.get_model() model = await self.get_model()
hostname = await self.get_hostname() hostname = await self.get_hostname()
if model: if model:
data["Model"] = model data.model = model
if hostname: if hostname:
data["Hostname"] = hostname data.hostname = hostname
miner_data = None miner_data = None
for i in range(DATA_RETRIES): for i in range(DATA_RETRIES):
miner_data = await self.api.multicommand("summary", "pools", "stats") miner_data = await self.api.multicommand("summary", "pools", "stats")
@@ -145,7 +137,7 @@ class CGMiner(BaseMiner):
if len(hr) > 0: if len(hr) > 0:
hr = hr[0].get("GHS av") hr = hr[0].get("GHS av")
if hr: if hr:
data["Hashrate"] = round(hr / 1000, 2) data.hashrate = round(hr / 1000, 2)
if stats: if stats:
temp = stats.get("STATS") temp = stats.get("STATS")
@@ -154,7 +146,7 @@ class CGMiner(BaseMiner):
for item in ["temp2", "temp1", "temp3"]: for item in ["temp2", "temp1", "temp3"]:
temperature = temp[1].get(item) temperature = temp[1].get(item)
if temperature and not temperature == 0.0: if temperature and not temperature == 0.0:
data["Temp"] = round(temperature) data.temperature = round(temperature)
if pools: if pools:
pool_1 = None pool_1 = None
@@ -186,23 +178,22 @@ class CGMiner(BaseMiner):
pool_1.replace("stratum+tcp://", "") pool_1.replace("stratum+tcp://", "")
if pool_1.startswith("stratum2+tcp://"): if pool_1.startswith("stratum2+tcp://"):
pool_1.replace("stratum2+tcp://", "") pool_1.replace("stratum2+tcp://", "")
data["Pool 1"] = pool_1 data.pool_1_url = pool_1
if pool_1_user: if pool_1_user:
data["Pool 1 User"] = pool_1_user data.pool_1_user = pool_1_user
data["Pool User"] = pool_1_user
if pool_2: if pool_2:
if pool_2.startswith("stratum+tcp://"): if pool_2.startswith("stratum+tcp://"):
pool_2.replace("stratum+tcp://", "") pool_2.replace("stratum+tcp://", "")
if pool_2.startswith("stratum2+tcp://"): if pool_2.startswith("stratum2+tcp://"):
pool_2.replace("stratum2+tcp://", "") pool_2.replace("stratum2+tcp://", "")
data["Pool 2"] = pool_2 data.pool_2_url = pool_2
if pool_2_user: if pool_2_user:
data["Pool 2 User"] = pool_2_user data.pool_2_user = pool_2_user
if quota: if quota:
data["Split"] = str(quota) data.pool_split = str(quota)
return data return data

View File

@@ -6,3 +6,4 @@ class M31SPlus(BaseMiner):
super().__init__() super().__init__()
self.ip = ip self.ip = ip
self.model = "M31S+" self.model = "M31S+"
self.nominal_chips = 78

View File

@@ -6,3 +6,6 @@ class BMMinerS19(BMMiner, S19):
def __init__(self, ip: str) -> None: def __init__(self, ip: str) -> None:
super().__init__(ip) super().__init__(ip)
self.ip = ip self.ip = ip
async def get_hostname(self) -> str:
return "?"

View File

@@ -6,3 +6,6 @@ class BMMinerS19Pro(BMMiner, S19Pro):
def __init__(self, ip: str) -> None: def __init__(self, ip: str) -> None:
super().__init__(ip) super().__init__(ip)
self.ip = ip self.ip = ip
async def get_hostname(self) -> str:
return "?"

View File

@@ -6,3 +6,6 @@ class BMMinerS19a(BMMiner, S19a):
def __init__(self, ip: str) -> None: def __init__(self, ip: str) -> None:
super().__init__(ip) super().__init__(ip)
self.ip = ip self.ip = ip
async def get_hostname(self) -> str:
return "?"

View File

@@ -6,3 +6,6 @@ class BMMinerS19j(BMMiner, S19j):
def __init__(self, ip: str) -> None: def __init__(self, ip: str) -> None:
super().__init__(ip) super().__init__(ip)
self.ip = ip self.ip = ip
async def get_hostname(self) -> str:
return "?"

View File

@@ -6,3 +6,6 @@ class BMMinerS19jPro(BMMiner, S19jPro):
def __init__(self, ip: str) -> None: def __init__(self, ip: str) -> None:
super().__init__(ip) super().__init__(ip)
self.ip = ip self.ip = ip
async def get_hostname(self) -> str:
return "?"

View File

@@ -6,3 +6,6 @@ class BMMinerT19(BMMiner, T19):
def __init__(self, ip: str) -> None: def __init__(self, ip: str) -> None:
super().__init__(ip) super().__init__(ip)
self.ip = ip self.ip = ip
async def get_hostname(self) -> str:
return "?"

View File

@@ -6,3 +6,6 @@ class CGMinerS19(CGMiner, S19):
def __init__(self, ip: str) -> None: def __init__(self, ip: str) -> None:
super().__init__(ip) super().__init__(ip)
self.ip = ip self.ip = ip
async def get_hostname(self) -> str:
return "?"

View File

@@ -6,3 +6,6 @@ class CGMinerS19Pro(CGMiner, S19Pro):
def __init__(self, ip: str) -> None: def __init__(self, ip: str) -> None:
super().__init__(ip) super().__init__(ip)
self.ip = ip self.ip = ip
async def get_hostname(self) -> str:
return "?"

View File

@@ -6,3 +6,6 @@ class CGMinerS19j(CGMiner, S19j):
def __init__(self, ip: str) -> None: def __init__(self, ip: str) -> None:
super().__init__(ip) super().__init__(ip)
self.ip = ip self.ip = ip
async def get_hostname(self) -> str:
return "?"

View File

@@ -6,3 +6,6 @@ class CGMinerS19jPro(CGMiner, S19jPro):
def __init__(self, ip: str) -> None: def __init__(self, ip: str) -> None:
super().__init__(ip) super().__init__(ip)
self.ip = ip self.ip = ip
async def get_hostname(self) -> str:
return "?"

View File

@@ -6,3 +6,6 @@ class CGMinerT19(CGMiner, T19):
def __init__(self, ip: str) -> None: def __init__(self, ip: str) -> None:
super().__init__(ip) super().__init__(ip)
self.ip = ip self.ip = ip
async def get_hostname(self) -> str:
return "?"

View File

@@ -89,7 +89,7 @@ TABLE_HEADERS = {
"Hostname", "Hostname",
"Hashrate", "Hashrate",
"Temp", "Temp",
"Pool User", "Pool 1 User",
"Wattage", "Wattage",
], ],
"BOARDS": [ "BOARDS": [

View File

@@ -8,6 +8,25 @@ from tools.cfg_util.tables import clear_tables, TableManager
progress_bar_len = 0 progress_bar_len = 0
DATA_HEADER_MAP = {
"ip": "IP",
"model": "Model",
"hostname": "Hostname",
"hashrate": "Hashrate",
"temperature": "Temp",
"wattage": "Wattage",
"ideal_chips": "Ideal",
"left_chips": "Left Board",
"center_chips": "Center Board",
"right_chips": "Right Board",
"total_chips": "Total",
"nominal": "Nominal",
"pool_split": "Split",
"pool_1_url": "Pool 1",
"pool_1_user": "Pool 1 User",
"pool_2_url": "Pool 2",
"pool_2_user": "Pool 2 User",
}
DEFAULT_DATA = set() DEFAULT_DATA = set()
@@ -95,4 +114,8 @@ async def _get_miner_data(miner):
async def _get_data(miner): async def _get_data(miner):
return await miner.get_data() _data = (await miner.get_data()).asdict()
data = {}
for item in _data.keys():
data[DATA_HEADER_MAP[item]] = _data[item]
return data