fixed a bug with some BOS S17e not returning data frm devdetails and fans

This commit is contained in:
UpstreamData
2022-06-01 10:19:44 -06:00
parent ab964e4c88
commit 7cc7973587
2 changed files with 50 additions and 17 deletions

View File

@@ -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"}

View File

@@ -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: