From 568f86700bde91c7fd3ede1978e866d7bbd5c8f6 Mon Sep 17 00:00:00 2001 From: UpstreamData Date: Wed, 25 May 2022 14:44:23 -0600 Subject: [PATCH] improved X19 miner scan speed and implemented miner data in miners --- miners/_backends/bmminer.py | 61 ++++++++-------------- miners/_backends/bosminer.py | 63 +++++++++-------------- miners/_backends/btminer.py | 63 ++++++++--------------- miners/_backends/cgminer.py | 49 +++++++----------- miners/_types/whatsminer/M3X/M31S_Plus.py | 1 + miners/antminer/bmminer/X19/S19.py | 3 ++ miners/antminer/bmminer/X19/S19_Pro.py | 3 ++ miners/antminer/bmminer/X19/S19a.py | 3 ++ miners/antminer/bmminer/X19/S19j.py | 3 ++ miners/antminer/bmminer/X19/S19j_Pro.py | 3 ++ miners/antminer/bmminer/X19/T19.py | 3 ++ miners/antminer/cgminer/X19/S19.py | 3 ++ miners/antminer/cgminer/X19/S19_Pro.py | 3 ++ miners/antminer/cgminer/X19/S19j.py | 3 ++ miners/antminer/cgminer/X19/S19j_Pro.py | 3 ++ miners/antminer/cgminer/X19/T19.py | 3 ++ tools/cfg_util/layout.py | 2 +- tools/cfg_util/scan/__init__.py | 25 ++++++++- 18 files changed, 145 insertions(+), 152 deletions(-) diff --git a/miners/_backends/bmminer.py b/miners/_backends/bmminer.py index 490b16a8..c3c8ced4 100644 --- a/miners/_backends/bmminer.py +++ b/miners/_backends/bmminer.py @@ -1,8 +1,13 @@ +import ipaddress +import logging + + from API.bmminer import BMMinerAPI from miners import BaseMiner -import logging + +from data import MinerData + from settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES -import ipaddress class BMMiner(BaseMiner): @@ -122,36 +127,17 @@ class BMMiner(BaseMiner): return True return False - async def get_data(self): - data = { - "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": "", - } + async def get_data(self) -> MinerData: + data = MinerData(ip=str(self.ip), ideal_chips=self.nominal_chips * 3) model = await self.get_model() hostname = await self.get_hostname() if model: - data["Model"] = model + data.model = model if hostname: - data["Hostname"] = hostname + data.hostname = hostname miner_data = None for i in range(DATA_RETRIES): @@ -172,19 +158,15 @@ class BMMiner(BaseMiner): if len(hr) > 0: hr = hr[0].get("GHS av") if hr: - data["Hashrate"] = round(hr / 1000, 2) + data.hashrate = round(hr / 1000, 2) if stats: boards = stats.get("STATS") if boards: if len(boards) > 0: - data["Left Board"] = boards[1].get("chain_acn1") - data["Center Board"] = boards[1].get("chain_acn2") - data["Right Board"] = boards[1].get("chain_acn3") - data["Total"] = boards[1].get("total_acn") - - if data["Total"] == data["Ideal"]: - data["Nominal"] = True + data.left_chips = boards[1].get("chain_acn1") + data.center_chips = boards[1].get("chain_acn2") + data.right_chips = boards[1].get("chain_acn3") if stats: temp = stats.get("STATS") @@ -193,7 +175,7 @@ class BMMiner(BaseMiner): for item in ["temp2", "temp1", "temp3"]: temperature = temp[1].get(item) if temperature and not temperature == 0.0: - data["Temp"] = round(temperature) + data.temperature = round(temperature) if pools: pool_1 = None @@ -225,23 +207,22 @@ class BMMiner(BaseMiner): pool_1.replace("stratum+tcp://", "") if pool_1.startswith("stratum2+tcp://"): pool_1.replace("stratum2+tcp://", "") - data["Pool 1"] = pool_1 + data.pool_1_url = pool_1 if pool_1_user: - data["Pool 1 User"] = pool_1_user - data["Pool User"] = pool_1_user + data.pool_1_user = pool_1_user if pool_2: if pool_2.startswith("stratum+tcp://"): pool_2.replace("stratum+tcp://", "") if pool_2.startswith("stratum2+tcp://"): pool_2.replace("stratum2+tcp://", "") - data["Pool 2"] = pool_2 + data.pool_2_url = pool_2 if pool_2_user: - data["Pool 2 User"] = pool_2_user + data.pool_2_user = pool_2_user if quota: - data["Split"] = str(quota) + data.pool_split = str(quota) return data diff --git a/miners/_backends/bosminer.py b/miners/_backends/bosminer.py index 324e4eee..0f00cc82 100644 --- a/miners/_backends/bosminer.py +++ b/miners/_backends/bosminer.py @@ -1,10 +1,17 @@ import ipaddress +import logging + + +import toml + from miners import BaseMiner from API.bosminer import BOSMinerAPI -import toml + +from data import MinerData + from config.bos import bos_config_convert, general_config_convert_bos -import logging + from settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES @@ -241,35 +248,16 @@ class BOSMiner(BaseMiner): if not bad > 0: return str(self.ip) - async def get_data(self): - data = { - "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": "", - } + async def get_data(self) -> MinerData: + data = MinerData(ip=str(self.ip), ideal_chips=self.nominal_chips * 3) model = await self.get_model() hostname = await self.get_hostname() if model: - data["Model"] = model + data.model = model if hostname: - data["Hostname"] = hostname + data.hostname = hostname miner_data = None for i in range(DATA_RETRIES): @@ -292,7 +280,7 @@ class BOSMiner(BaseMiner): if len(hr) > 0: hr = hr[0].get("MHS av") if hr: - data["Hashrate"] = round(hr / 1000000, 2) + data.hashrate = round(hr / 1000000, 2) if temps: temp = temps.get("TEMPS") @@ -300,7 +288,7 @@ class BOSMiner(BaseMiner): if len(temp) > 0: chip_temp = temp[0].get("Chip") if chip_temp: - data["Temp"] = round(chip_temp) + data.temperature = round(chip_temp) if pools: pool_1 = None @@ -330,22 +318,21 @@ class BOSMiner(BaseMiner): if pool_1: pool_1 = pool_1.replace("stratum+tcp://", "") pool_1 = pool_1.replace("stratum2+tcp://", "") - data["Pool 1"] = pool_1 + data.pool_1_url = pool_1 if pool_1_user: - data["Pool 1 User"] = pool_1_user - data["Pool User"] = pool_1_user + data.pool_1_user = pool_1_user if pool_2: pool_2 = pool_2.replace("stratum+tcp://", "") pool_2 = pool_2.replace("stratum2+tcp://", "") - data["Pool 2"] = pool_2 + data.pool_2_url = pool_2 if pool_2_user: - data["Pool 2 User"] = pool_2_user + data.pool_2_user = pool_2_user if quota: - data["Split"] = str(quota) + data.pool_split = str(quota) if tunerstatus: tuner = tunerstatus.get("TUNERSTATUS") @@ -353,22 +340,18 @@ class BOSMiner(BaseMiner): if len(tuner) > 0: wattage = tuner[0].get("PowerLimit") if wattage: - data["Wattage"] = wattage + data.wattage = wattage if devdetails: boards = devdetails.get("DEVDETAILS") if boards: 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"] for board in boards: id = board["ID"] - offset chips = board["Chips"] - data["Total"] += chips - data[board_map[id]] = chips - - if data["Total"] == data["Ideal"]: - data["Nominal"] = True + setattr(data, board_map[id], chips) return data diff --git a/miners/_backends/btminer.py b/miners/_backends/btminer.py index 6f468dc8..585dc23e 100644 --- a/miners/_backends/btminer.py +++ b/miners/_backends/btminer.py @@ -1,9 +1,14 @@ +import ipaddress +import logging + + from API.btminer import BTMinerAPI from miners import BaseMiner from API import APIError -import logging + +from data import MinerData + from settings import MINER_FACTORY_GET_VERSION_RETRIES as DATA_RETRIES -import ipaddress class BTMiner(BaseMiner): @@ -83,26 +88,7 @@ class BTMiner(BaseMiner): return str(mac).upper() async def get_data(self): - data = { - "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": "", - } + data = MinerData(ip=str(self.ip), ideal_chips=self.nominal_chips * 3) try: model = await self.get_model() @@ -110,15 +96,15 @@ class BTMiner(BaseMiner): except APIError: logging.warning(f"Failed to get hostname and model: {self}") model = None - data["Model"] = "Whatsminer" + data.model = "Whatsminer" hostname = None - data["Hostname"] = "Whatsminer" + data.hostname = "Whatsminer" if model: - data["Model"] = model + data.model = model if hostname: - data["Hostname"] = hostname + data.hostname = hostname miner_data = None for i in range(DATA_RETRIES): try: @@ -141,11 +127,11 @@ class BTMiner(BaseMiner): if len(summary_data) > 0: hr = summary_data[0].get("MHS av") if hr: - data["Hashrate"] = round(hr / 1000000, 2) + data.hashrate = round(hr / 1000000, 2) wattage = summary_data[0].get("Power") if wattage: - data["Wattage"] = round(wattage) + data.wattage = round(wattage) if devs: temp_data = devs.get("DEVS") @@ -153,14 +139,14 @@ class BTMiner(BaseMiner): for board in temp_data: temp = board.get("Chip Temp Avg") if temp and not temp == 0.0: - data["Temp"] = round(temp) + data.temperature = round(temp) break if devs: boards = devs.get("DEVS") if boards: 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(): id_key = "ID" else: @@ -169,11 +155,7 @@ class BTMiner(BaseMiner): for board in boards: id = board[id_key] - offset chips = board["Effective Chips"] - data["Total"] += chips - data[board_map[id]] = chips - - if data["Total"] == data["Ideal"]: - data["Nominal"] = True + setattr(data, board_map[id], chips) if pools: pool_1 = None @@ -205,23 +187,22 @@ class BTMiner(BaseMiner): pool_1.replace("stratum+tcp://", "") if pool_1.startswith("stratum2+tcp://"): pool_1.replace("stratum2+tcp://", "") - data["Pool 1"] = pool_1 + data.pool_1_url = pool_1 if pool_1_user: - data["Pool 1 User"] = pool_1_user - data["Pool User"] = pool_1_user + data.pool_1_user = pool_1_user if pool_2: if pool_2.startswith("stratum+tcp://"): pool_2.replace("stratum+tcp://", "") if pool_2.startswith("stratum2+tcp://"): pool_2.replace("stratum2+tcp://", "") - data["Pool 2"] = pool_2 + data.pool_2_url = pool_2 if pool_2_user: - data["Pool 2 User"] = pool_2_user + data.pool_2_user = pool_2_user if quota: - data["Split"] = str(quota) + data.pool_split = str(quota) return data diff --git a/miners/_backends/cgminer.py b/miners/_backends/cgminer.py index d60660ed..0019d0a3 100644 --- a/miners/_backends/cgminer.py +++ b/miners/_backends/cgminer.py @@ -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 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): @@ -103,29 +108,16 @@ class CGMiner(BaseMiner): print(str(self.config)) async def get_data(self): - data = { - "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": "", - } + data = MinerData(ip=str(self.ip), ideal_chips=self.nominal_chips * 3) model = await self.get_model() hostname = await self.get_hostname() if model: - data["Model"] = model + data.model = model if hostname: - data["Hostname"] = hostname + data.hostname = hostname miner_data = None for i in range(DATA_RETRIES): miner_data = await self.api.multicommand("summary", "pools", "stats") @@ -145,7 +137,7 @@ class CGMiner(BaseMiner): if len(hr) > 0: hr = hr[0].get("GHS av") if hr: - data["Hashrate"] = round(hr / 1000, 2) + data.hashrate = round(hr / 1000, 2) if stats: temp = stats.get("STATS") @@ -154,7 +146,7 @@ class CGMiner(BaseMiner): for item in ["temp2", "temp1", "temp3"]: temperature = temp[1].get(item) if temperature and not temperature == 0.0: - data["Temp"] = round(temperature) + data.temperature = round(temperature) if pools: pool_1 = None @@ -186,23 +178,22 @@ class CGMiner(BaseMiner): pool_1.replace("stratum+tcp://", "") if pool_1.startswith("stratum2+tcp://"): pool_1.replace("stratum2+tcp://", "") - data["Pool 1"] = pool_1 + data.pool_1_url = pool_1 if pool_1_user: - data["Pool 1 User"] = pool_1_user - data["Pool User"] = pool_1_user + data.pool_1_user = pool_1_user if pool_2: if pool_2.startswith("stratum+tcp://"): pool_2.replace("stratum+tcp://", "") if pool_2.startswith("stratum2+tcp://"): pool_2.replace("stratum2+tcp://", "") - data["Pool 2"] = pool_2 + data.pool_2_url = pool_2 if pool_2_user: - data["Pool 2 User"] = pool_2_user + data.pool_2_user = pool_2_user if quota: - data["Split"] = str(quota) + data.pool_split = str(quota) return data diff --git a/miners/_types/whatsminer/M3X/M31S_Plus.py b/miners/_types/whatsminer/M3X/M31S_Plus.py index 0fd51901..a3ac448a 100644 --- a/miners/_types/whatsminer/M3X/M31S_Plus.py +++ b/miners/_types/whatsminer/M3X/M31S_Plus.py @@ -6,3 +6,4 @@ class M31SPlus(BaseMiner): super().__init__() self.ip = ip self.model = "M31S+" + self.nominal_chips = 78 diff --git a/miners/antminer/bmminer/X19/S19.py b/miners/antminer/bmminer/X19/S19.py index eeff4fe9..7287c5f9 100644 --- a/miners/antminer/bmminer/X19/S19.py +++ b/miners/antminer/bmminer/X19/S19.py @@ -6,3 +6,6 @@ class BMMinerS19(BMMiner, S19): def __init__(self, ip: str) -> None: super().__init__(ip) self.ip = ip + + async def get_hostname(self) -> str: + return "?" diff --git a/miners/antminer/bmminer/X19/S19_Pro.py b/miners/antminer/bmminer/X19/S19_Pro.py index 5ea71645..1d06262a 100644 --- a/miners/antminer/bmminer/X19/S19_Pro.py +++ b/miners/antminer/bmminer/X19/S19_Pro.py @@ -6,3 +6,6 @@ class BMMinerS19Pro(BMMiner, S19Pro): def __init__(self, ip: str) -> None: super().__init__(ip) self.ip = ip + + async def get_hostname(self) -> str: + return "?" diff --git a/miners/antminer/bmminer/X19/S19a.py b/miners/antminer/bmminer/X19/S19a.py index 7afffe3b..e85ef1e2 100644 --- a/miners/antminer/bmminer/X19/S19a.py +++ b/miners/antminer/bmminer/X19/S19a.py @@ -6,3 +6,6 @@ class BMMinerS19a(BMMiner, S19a): def __init__(self, ip: str) -> None: super().__init__(ip) self.ip = ip + + async def get_hostname(self) -> str: + return "?" diff --git a/miners/antminer/bmminer/X19/S19j.py b/miners/antminer/bmminer/X19/S19j.py index a8494efd..6956c5e8 100644 --- a/miners/antminer/bmminer/X19/S19j.py +++ b/miners/antminer/bmminer/X19/S19j.py @@ -6,3 +6,6 @@ class BMMinerS19j(BMMiner, S19j): def __init__(self, ip: str) -> None: super().__init__(ip) self.ip = ip + + async def get_hostname(self) -> str: + return "?" diff --git a/miners/antminer/bmminer/X19/S19j_Pro.py b/miners/antminer/bmminer/X19/S19j_Pro.py index c9747a56..37c49e88 100644 --- a/miners/antminer/bmminer/X19/S19j_Pro.py +++ b/miners/antminer/bmminer/X19/S19j_Pro.py @@ -6,3 +6,6 @@ class BMMinerS19jPro(BMMiner, S19jPro): def __init__(self, ip: str) -> None: super().__init__(ip) self.ip = ip + + async def get_hostname(self) -> str: + return "?" diff --git a/miners/antminer/bmminer/X19/T19.py b/miners/antminer/bmminer/X19/T19.py index 43b9b1cd..1860dfdd 100644 --- a/miners/antminer/bmminer/X19/T19.py +++ b/miners/antminer/bmminer/X19/T19.py @@ -6,3 +6,6 @@ class BMMinerT19(BMMiner, T19): def __init__(self, ip: str) -> None: super().__init__(ip) self.ip = ip + + async def get_hostname(self) -> str: + return "?" diff --git a/miners/antminer/cgminer/X19/S19.py b/miners/antminer/cgminer/X19/S19.py index 823bf775..3828ed2f 100644 --- a/miners/antminer/cgminer/X19/S19.py +++ b/miners/antminer/cgminer/X19/S19.py @@ -6,3 +6,6 @@ class CGMinerS19(CGMiner, S19): def __init__(self, ip: str) -> None: super().__init__(ip) self.ip = ip + + async def get_hostname(self) -> str: + return "?" diff --git a/miners/antminer/cgminer/X19/S19_Pro.py b/miners/antminer/cgminer/X19/S19_Pro.py index 814f3021..7c546a5c 100644 --- a/miners/antminer/cgminer/X19/S19_Pro.py +++ b/miners/antminer/cgminer/X19/S19_Pro.py @@ -6,3 +6,6 @@ class CGMinerS19Pro(CGMiner, S19Pro): def __init__(self, ip: str) -> None: super().__init__(ip) self.ip = ip + + async def get_hostname(self) -> str: + return "?" diff --git a/miners/antminer/cgminer/X19/S19j.py b/miners/antminer/cgminer/X19/S19j.py index ec4ec9f9..6abaf2ea 100644 --- a/miners/antminer/cgminer/X19/S19j.py +++ b/miners/antminer/cgminer/X19/S19j.py @@ -6,3 +6,6 @@ class CGMinerS19j(CGMiner, S19j): def __init__(self, ip: str) -> None: super().__init__(ip) self.ip = ip + + async def get_hostname(self) -> str: + return "?" diff --git a/miners/antminer/cgminer/X19/S19j_Pro.py b/miners/antminer/cgminer/X19/S19j_Pro.py index eeea0081..b6bf8ab7 100644 --- a/miners/antminer/cgminer/X19/S19j_Pro.py +++ b/miners/antminer/cgminer/X19/S19j_Pro.py @@ -6,3 +6,6 @@ class CGMinerS19jPro(CGMiner, S19jPro): def __init__(self, ip: str) -> None: super().__init__(ip) self.ip = ip + + async def get_hostname(self) -> str: + return "?" diff --git a/miners/antminer/cgminer/X19/T19.py b/miners/antminer/cgminer/X19/T19.py index fbebe6ec..3e30e9ce 100644 --- a/miners/antminer/cgminer/X19/T19.py +++ b/miners/antminer/cgminer/X19/T19.py @@ -6,3 +6,6 @@ class CGMinerT19(CGMiner, T19): def __init__(self, ip: str) -> None: super().__init__(ip) self.ip = ip + + async def get_hostname(self) -> str: + return "?" diff --git a/tools/cfg_util/layout.py b/tools/cfg_util/layout.py index b9d30ab4..97509aeb 100644 --- a/tools/cfg_util/layout.py +++ b/tools/cfg_util/layout.py @@ -89,7 +89,7 @@ TABLE_HEADERS = { "Hostname", "Hashrate", "Temp", - "Pool User", + "Pool 1 User", "Wattage", ], "BOARDS": [ diff --git a/tools/cfg_util/scan/__init__.py b/tools/cfg_util/scan/__init__.py index badc56da..15e98588 100644 --- a/tools/cfg_util/scan/__init__.py +++ b/tools/cfg_util/scan/__init__.py @@ -8,6 +8,25 @@ from tools.cfg_util.tables import clear_tables, TableManager 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() @@ -95,4 +114,8 @@ async def _get_miner_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