Merge pull request #161 from jpcomps/add_board_info
This commit is contained in:
@@ -485,7 +485,7 @@ class MiningModeConfig(MinerConfigOption):
|
|||||||
|
|
||||||
return cls.hashrate_tuning(
|
return cls.hashrate_tuning(
|
||||||
hashrate=algo_info["BoardTune"].get("Target"),
|
hashrate=algo_info["BoardTune"].get("Target"),
|
||||||
algo=TunerAlgo.voltage_optimizer(),
|
algo=TunerAlgo.board_tune(),
|
||||||
scaling=scaling_cfg,
|
scaling=scaling_cfg,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -33,6 +33,9 @@ class HashBoard:
|
|||||||
expected_chips: The expected chip count of the board as an int.
|
expected_chips: The expected chip count of the board as an int.
|
||||||
serial_number: The serial number of the board.
|
serial_number: The serial number of the board.
|
||||||
missing: Whether the board is returned from the miners data as a bool.
|
missing: Whether the board is returned from the miners data as a bool.
|
||||||
|
tuned: Whether the board is tuned as a bool.
|
||||||
|
active: Whether the board is currently tuning as a bool.
|
||||||
|
voltage: Current input voltage of the board as a float.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
slot: int = 0
|
slot: int = 0
|
||||||
@@ -43,6 +46,9 @@ class HashBoard:
|
|||||||
expected_chips: int = None
|
expected_chips: int = None
|
||||||
serial_number: str = None
|
serial_number: str = None
|
||||||
missing: bool = True
|
missing: bool = True
|
||||||
|
tuned: bool = None
|
||||||
|
active: bool = None
|
||||||
|
voltage: float = None
|
||||||
|
|
||||||
def get(self, __key: str, default: Any = None):
|
def get(self, __key: str, default: Any = None):
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ from pyasic.data import AlgoHashRate, Fan, HashBoard, HashUnit
|
|||||||
from pyasic.data.error_codes import MinerErrorData, X19Error
|
from pyasic.data.error_codes import MinerErrorData, X19Error
|
||||||
from pyasic.errors import APIError
|
from pyasic.errors import APIError
|
||||||
from pyasic.logger import logger
|
from pyasic.logger import logger
|
||||||
|
from pyasic.data.pools import PoolMetrics
|
||||||
from pyasic.miners.data import DataFunction, DataLocations, DataOptions, WebAPICommand
|
from pyasic.miners.data import DataFunction, DataLocations, DataOptions, WebAPICommand
|
||||||
from pyasic.miners.device.firmware import ePICFirmware
|
from pyasic.miners.device.firmware import ePICFirmware
|
||||||
from pyasic.web.epic import ePICWebAPI
|
from pyasic.web.epic import ePICWebAPI
|
||||||
@@ -58,10 +59,6 @@ EPIC_DATA_LOC = DataLocations(
|
|||||||
"_get_wattage",
|
"_get_wattage",
|
||||||
[WebAPICommand("web_summary", "summary")],
|
[WebAPICommand("web_summary", "summary")],
|
||||||
),
|
),
|
||||||
str(DataOptions.VOLTAGE): DataFunction(
|
|
||||||
"_get_voltage",
|
|
||||||
[WebAPICommand("web_summary", "summary")],
|
|
||||||
),
|
|
||||||
str(DataOptions.FANS): DataFunction(
|
str(DataOptions.FANS): DataFunction(
|
||||||
"_get_fans",
|
"_get_fans",
|
||||||
[WebAPICommand("web_summary", "summary")],
|
[WebAPICommand("web_summary", "summary")],
|
||||||
@@ -82,6 +79,10 @@ EPIC_DATA_LOC = DataLocations(
|
|||||||
"_is_mining",
|
"_is_mining",
|
||||||
[WebAPICommand("web_summary", "summary")],
|
[WebAPICommand("web_summary", "summary")],
|
||||||
),
|
),
|
||||||
|
str(DataOptions.POOLS): DataFunction(
|
||||||
|
"_get_pools",
|
||||||
|
[WebAPICommand("web_summary", "summary")],
|
||||||
|
),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -219,20 +220,6 @@ class ePIC(ePICFirmware):
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_voltage(self, web_summary: dict = None) -> Optional[float]:
|
|
||||||
if web_summary is None:
|
|
||||||
try:
|
|
||||||
web_summary = await self.web.summary()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if web_summary is not None:
|
|
||||||
try:
|
|
||||||
voltage = web_summary["Power Supply Stats"]["Output Voltage"]
|
|
||||||
return voltage
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_hashrate(self, web_summary: dict = None) -> Optional[float]:
|
async def _get_hashrate(self, web_summary: dict = None) -> Optional[float]:
|
||||||
if web_summary is None:
|
if web_summary is None:
|
||||||
try:
|
try:
|
||||||
@@ -323,6 +310,24 @@ class ePIC(ePICFirmware):
|
|||||||
except APIError:
|
except APIError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
tuned = True
|
||||||
|
active = False
|
||||||
|
if web_summary is not None:
|
||||||
|
tuner_running = web_summary["PerpetualTune"]["Running"]
|
||||||
|
if tuner_running:
|
||||||
|
active = True
|
||||||
|
algo_info = web_summary["PerpetualTune"]["Algorithm"]
|
||||||
|
if algo_info.get("VoltageOptimizer") is not None:
|
||||||
|
tuned = algo_info["VoltageOptimizer"].get("Optimized")
|
||||||
|
elif algo_info.get("BoardTune") is not None:
|
||||||
|
tuned = algo_info["BoardTune"].get("Optimized")
|
||||||
|
else:
|
||||||
|
tuned = algo_info["ChipTune"].get("Optimized")
|
||||||
|
|
||||||
|
# To be extra detailed, also ensure the miner is in "Mining" state
|
||||||
|
tuned = tuned and web_summary["Status"]["Operating State"] == "Mining"
|
||||||
|
active = active and web_summary["Status"]["Operating State"] == "Mining"
|
||||||
|
|
||||||
hb_list = [
|
hb_list = [
|
||||||
HashBoard(slot=i, expected_chips=self.expected_chips)
|
HashBoard(slot=i, expected_chips=self.expected_chips)
|
||||||
for i in range(self.expected_hashboards)
|
for i in range(self.expected_hashboards)
|
||||||
@@ -349,6 +354,9 @@ class ePIC(ePICFirmware):
|
|||||||
).into(self.algo.unit.default)
|
).into(self.algo.unit.default)
|
||||||
hb_list[hb["Index"]].chips = num_of_chips
|
hb_list[hb["Index"]].chips = num_of_chips
|
||||||
hb_list[hb["Index"]].temp = hb["Temperature"]
|
hb_list[hb["Index"]].temp = hb["Temperature"]
|
||||||
|
hb_list[hb["Index"]].tuned = tuned
|
||||||
|
hb_list[hb["Index"]].active = active
|
||||||
|
hb_list[hb["Index"]].voltage = hb["Input Voltage"]
|
||||||
return hb_list
|
return hb_list
|
||||||
|
|
||||||
async def _is_mining(self, web_summary, *args, **kwargs) -> Optional[bool]:
|
async def _is_mining(self, web_summary, *args, **kwargs) -> Optional[bool]:
|
||||||
@@ -411,3 +419,34 @@ class ePIC(ePICFirmware):
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
return errors
|
return errors
|
||||||
|
|
||||||
|
async def _get_pools(self, web_summary: dict = None) -> List[PoolMetrics]:
|
||||||
|
if web_summary is None:
|
||||||
|
try:
|
||||||
|
web_summary = await self.web.summary()
|
||||||
|
except APIError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
pool_data = []
|
||||||
|
try:
|
||||||
|
if web_summary is not None:
|
||||||
|
if (
|
||||||
|
web_summary.get("Session") is not None
|
||||||
|
and web_summary.get("Stratum") is not None
|
||||||
|
):
|
||||||
|
pool_data.append(
|
||||||
|
PoolMetrics(
|
||||||
|
accepted=web_summary["Session"].get("Accepted"),
|
||||||
|
rejected=web_summary["Session"].get("Rejected"),
|
||||||
|
get_failures=0,
|
||||||
|
remote_failures=0,
|
||||||
|
active=web_summary["Stratum"].get("IsPoolConnected"),
|
||||||
|
alive=web_summary["Stratum"].get("IsPoolConnected"),
|
||||||
|
url=web_summary["Stratum"].get("Current Pool"),
|
||||||
|
user=web_summary["Stratum"].get("Current User"),
|
||||||
|
index=web_summary["Stratum"].get("Config Id"),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return pool_data
|
||||||
|
except LookupError:
|
||||||
|
pass
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ class DataOptions(Enum):
|
|||||||
IS_MINING = "is_mining"
|
IS_MINING = "is_mining"
|
||||||
UPTIME = "uptime"
|
UPTIME = "uptime"
|
||||||
CONFIG = "config"
|
CONFIG = "config"
|
||||||
VOLTAGE = "voltage"
|
|
||||||
POOLS = "pools"
|
POOLS = "pools"
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user