feature: parse vnish presets

This commit is contained in:
Upstream Data
2024-12-04 09:06:00 -07:00
committed by Brett Rowan
parent 7f74b083d3
commit 1ba0f8ed83
4 changed files with 41 additions and 5 deletions

View File

@@ -245,13 +245,13 @@ class MinerConfig(BaseModel):
)
@classmethod
def from_vnish(cls, web_settings: dict) -> "MinerConfig":
def from_vnish(cls, web_settings: dict, web_presets: list[dict]) -> "MinerConfig":
"""Constructs a MinerConfig object from web settings for VNish miners."""
return cls(
pools=PoolConfig.from_vnish(web_settings),
fan_mode=FanModeConfig.from_vnish(web_settings),
temperature=TemperatureConfig.from_vnish(web_settings),
mining_mode=MiningModeConfig.from_vnish(web_settings),
mining_mode=MiningModeConfig.from_vnish(web_settings, web_presets),
)
@classmethod

View File

@@ -346,12 +346,27 @@ class MiningModeHashrateTune(MinerConfigValue):
class MiningModePreset(MinerConfigValue):
mode: str = field(init=False, default="preset")
active_preset: MiningPreset
available_presets: list[MiningPreset] = field(default_factory=list)
def as_vnish(self) -> dict:
return {"overclock": {**self.active_preset.as_vnish()}}
@classmethod
def from_vnish(
cls, web_overclock_settings: dict, web_presets: list[dict]
) -> "MiningModePreset":
active_preset = None
for preset in web_presets:
if preset["name"] == web_overclock_settings["preset"]:
active_preset = preset
return cls(
active_preset=MiningPreset.from_vnish(active_preset),
available_presets=[MiningPreset.from_vnish(p) for p in web_presets],
)
class ManualBoardSettings(MinerConfigValue):
freq: float
@@ -571,7 +586,7 @@ class MiningModeConfig(MinerConfigOption):
)
@classmethod
def from_vnish(cls, web_settings: dict):
def from_vnish(cls, web_settings: dict, web_presets: list[dict]):
try:
mode_settings = web_settings["miner"]["overclock"]
except KeyError:
@@ -580,7 +595,7 @@ class MiningModeConfig(MinerConfigOption):
if mode_settings["preset"] == "disabled":
return MiningModeManual.from_vnish(mode_settings)
else:
return cls.power_tuning(power=int(mode_settings["preset"]))
return MiningModePreset.from_vnish(mode_settings, web_presets)
@classmethod
def from_boser(cls, grpc_miner_conf: dict):

View File

@@ -12,3 +12,23 @@ class MiningPreset(MinerConfigValue):
if self.name is not None:
return {"preset": self.name}
return {}
@classmethod
def from_vnish(cls, web_preset: dict):
name = web_preset["name"]
hr_power_split = web_preset["pretty"].split("~")
if len(hr_power_split) == 1:
power = None
hashrate = None
else:
power = hr_power_split[0].replace("watt", "").strip()
hashrate = hr_power_split[1].replace("TH", "").strip()
tuned = web_preset["status"] == "tuned"
modded_psu = web_preset["modded_psu_required"]
return cls(
name=name,
power=power,
hashrate=hashrate,
tuned=tuned,
modded_psu=modded_psu,
)

View File

@@ -266,7 +266,8 @@ class VNish(VNishFirmware, BMMiner):
async def get_config(self) -> MinerConfig:
try:
web_settings = await self.web.settings()
web_presets = await self.web.autotune_presets()
except APIError:
return self.config
self.config = MinerConfig.from_vnish(web_settings)
self.config = MinerConfig.from_vnish(web_settings, web_presets)
return self.config