fixed a bug with some BOS S17e not returning data frm devdetails and fans
This commit is contained in:
@@ -1,12 +1,13 @@
|
|||||||
import ipaddress
|
import ipaddress
|
||||||
import logging
|
import logging
|
||||||
|
import json
|
||||||
|
|
||||||
import toml
|
import toml
|
||||||
|
|
||||||
|
|
||||||
from miners import BaseMiner
|
from miners import BaseMiner
|
||||||
from API.bosminer import BOSMinerAPI
|
from API.bosminer import BOSMinerAPI
|
||||||
|
from API import APIError
|
||||||
|
|
||||||
from data import MinerData
|
from data import MinerData
|
||||||
|
|
||||||
@@ -137,7 +138,17 @@ class BOSMiner(BaseMiner):
|
|||||||
return self.model + " (BOS)"
|
return self.model + " (BOS)"
|
||||||
|
|
||||||
# get devdetails data
|
# get devdetails data
|
||||||
|
try:
|
||||||
version_data = await self.api.devdetails()
|
version_data = await self.api.devdetails()
|
||||||
|
except APIError as e:
|
||||||
|
version_data = None
|
||||||
|
if e.message == "Not ready":
|
||||||
|
cfg = json.loads(await self.send_ssh_command("bosminer config --data"))
|
||||||
|
model = cfg.get("data").get("format").get("model")
|
||||||
|
if model:
|
||||||
|
model = model.replace("Antminer ", "")
|
||||||
|
self.model = model
|
||||||
|
return self.model + " (BOS)"
|
||||||
|
|
||||||
# if we get data back, parse it for model
|
# if we get data back, parse it for model
|
||||||
if version_data:
|
if version_data:
|
||||||
@@ -262,22 +273,28 @@ class BOSMiner(BaseMiner):
|
|||||||
|
|
||||||
miner_data = None
|
miner_data = None
|
||||||
for i in range(DATA_RETRIES):
|
for i in range(DATA_RETRIES):
|
||||||
|
try:
|
||||||
miner_data = await self.api.multicommand(
|
miner_data = await self.api.multicommand(
|
||||||
"summary", "temps", "tunerstatus", "pools", "devdetails", "fans"
|
"summary", "temps", "tunerstatus", "pools", "devdetails", "fans"
|
||||||
)
|
)
|
||||||
|
except APIError as e:
|
||||||
|
if str(e.message) == "Not ready":
|
||||||
|
miner_data = await self.api.multicommand(
|
||||||
|
"summary", "tunerstatus", "pools", "fans"
|
||||||
|
)
|
||||||
if miner_data:
|
if miner_data:
|
||||||
break
|
break
|
||||||
if not miner_data:
|
if not miner_data:
|
||||||
return data
|
return data
|
||||||
summary = miner_data.get("summary")[0]
|
summary = miner_data.get("summary")
|
||||||
temps = miner_data.get("temps")[0]
|
temps = miner_data.get("temps")
|
||||||
tunerstatus = miner_data.get("tunerstatus")[0]
|
tunerstatus = miner_data.get("tunerstatus")
|
||||||
pools = miner_data.get("pools")[0]
|
pools = miner_data.get("pools")
|
||||||
devdetails = miner_data.get("devdetails")[0]
|
devdetails = miner_data.get("devdetails")
|
||||||
fans = miner_data.get("fans")[0]
|
fans = miner_data.get("fans")
|
||||||
|
|
||||||
if summary:
|
if summary:
|
||||||
hr = summary.get("SUMMARY")
|
hr = summary[0].get("SUMMARY")
|
||||||
if hr:
|
if hr:
|
||||||
if len(hr) > 0:
|
if len(hr) > 0:
|
||||||
hr = hr[0].get("MHS 1m")
|
hr = hr[0].get("MHS 1m")
|
||||||
@@ -285,7 +302,7 @@ class BOSMiner(BaseMiner):
|
|||||||
data.hashrate = round(hr / 1000000, 2)
|
data.hashrate = round(hr / 1000000, 2)
|
||||||
|
|
||||||
if temps:
|
if temps:
|
||||||
temp = temps.get("TEMPS")
|
temp = temps[0].get("TEMPS")
|
||||||
if temp:
|
if temp:
|
||||||
if len(temp) > 0:
|
if len(temp) > 0:
|
||||||
board_map = {0: "left_board", 1: "center_board", 2: "right_board"}
|
board_map = {0: "left_board", 1: "center_board", 2: "right_board"}
|
||||||
@@ -298,7 +315,7 @@ class BOSMiner(BaseMiner):
|
|||||||
setattr(data, f"{board_map[_id]}_temp", board_temp)
|
setattr(data, f"{board_map[_id]}_temp", board_temp)
|
||||||
|
|
||||||
if fans:
|
if fans:
|
||||||
fan_data = fans.get("FANS")
|
fan_data = fans[0].get("FANS")
|
||||||
if fan_data:
|
if fan_data:
|
||||||
for fan in range(self.fan_count):
|
for fan in range(self.fan_count):
|
||||||
setattr(data, f"fan_{fan+1}", fan_data[fan]["RPM"])
|
setattr(data, f"fan_{fan+1}", fan_data[fan]["RPM"])
|
||||||
@@ -311,7 +328,7 @@ class BOSMiner(BaseMiner):
|
|||||||
pool_1_quota = 1
|
pool_1_quota = 1
|
||||||
pool_2_quota = 1
|
pool_2_quota = 1
|
||||||
quota = 0
|
quota = 0
|
||||||
for pool in pools.get("POOLS"):
|
for pool in pools[0].get("POOLS"):
|
||||||
if not pool_1_user:
|
if not pool_1_user:
|
||||||
pool_1_user = pool.get("User")
|
pool_1_user = pool.get("User")
|
||||||
pool_1 = pool["URL"]
|
pool_1 = pool["URL"]
|
||||||
@@ -350,7 +367,7 @@ class BOSMiner(BaseMiner):
|
|||||||
data.pool_split = str(quota)
|
data.pool_split = str(quota)
|
||||||
|
|
||||||
if tunerstatus:
|
if tunerstatus:
|
||||||
tuner = tunerstatus.get("TUNERSTATUS")
|
tuner = tunerstatus[0].get("TUNERSTATUS")
|
||||||
if tuner:
|
if tuner:
|
||||||
if len(tuner) > 0:
|
if len(tuner) > 0:
|
||||||
wattage = tuner[0].get("PowerLimit")
|
wattage = tuner[0].get("PowerLimit")
|
||||||
@@ -358,7 +375,7 @@ class BOSMiner(BaseMiner):
|
|||||||
data.wattage = wattage
|
data.wattage = wattage
|
||||||
|
|
||||||
if devdetails:
|
if devdetails:
|
||||||
boards = devdetails.get("DEVDETAILS")
|
boards = devdetails[0].get("DEVDETAILS")
|
||||||
if boards:
|
if boards:
|
||||||
if len(boards) > 0:
|
if len(boards) > 0:
|
||||||
board_map = {0: "left_chips", 1: "center_chips", 2: "right_chips"}
|
board_map = {0: "left_chips", 1: "center_chips", 2: "right_chips"}
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ from settings import (
|
|||||||
NETWORK_PING_TIMEOUT as PING_TIMEOUT,
|
NETWORK_PING_TIMEOUT as PING_TIMEOUT,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
import asyncssh
|
||||||
|
|
||||||
AnyMiner = TypeVar("AnyMiner", bound=BaseMiner)
|
AnyMiner = TypeVar("AnyMiner", bound=BaseMiner)
|
||||||
|
|
||||||
MINER_CLASSES = {
|
MINER_CLASSES = {
|
||||||
@@ -411,6 +413,20 @@ class MinerFactory(metaclass=Singleton):
|
|||||||
elif "am2-s17" in version["STATUS"][0]["Description"]:
|
elif "am2-s17" in version["STATUS"][0]["Description"]:
|
||||||
model = "Antminer S17"
|
model = "Antminer S17"
|
||||||
|
|
||||||
|
# final try on a braiins OS bug with devdetails not returning
|
||||||
|
else:
|
||||||
|
async with asyncssh.connect(
|
||||||
|
str(ip),
|
||||||
|
known_hosts=None,
|
||||||
|
username="root",
|
||||||
|
password="admin",
|
||||||
|
server_host_key_algs=["ssh-rsa"],
|
||||||
|
) as conn:
|
||||||
|
cfg = await conn.run("bosminer config --data")
|
||||||
|
if cfg:
|
||||||
|
cfg = json.loads(cfg.stdout)
|
||||||
|
model = cfg.get("data").get("format").get("model")
|
||||||
|
|
||||||
if model:
|
if model:
|
||||||
# whatsminer have a V in their version string (M20SV41), remove everything after it
|
# whatsminer have a V in their version string (M20SV41), remove everything after it
|
||||||
if "V" in model:
|
if "V" in model:
|
||||||
|
|||||||
Reference in New Issue
Block a user