diff --git a/pyasic/config/mining.py b/pyasic/config/mining.py index 26975f57..f7ad9f7d 100644 --- a/pyasic/config/mining.py +++ b/pyasic/config/mining.py @@ -126,6 +126,7 @@ class MiningModeHPM(MinerConfigValue): return {"mode": {"mode": "turbo"}} +@dataclass class StandardTuneAlgo(MinerConfigValue): mode: str = field(init=False, default="standard") @@ -133,20 +134,22 @@ class StandardTuneAlgo(MinerConfigValue): return VOptAlgo().as_epic() +@dataclass class VOptAlgo(MinerConfigValue): - mode: str = field(init=False, default="standard") + mode: str = field(init=False, default="voltage_optimizer") def as_epic(self) -> str: return "VoltageOptimizer" class ChipTuneAlgo(MinerConfigValue): - mode: str = field(init=False, default="standard") + mode: str = field(init=False, default="chip_tune") def as_epic(self) -> str: return "ChipTune" +@dataclass class TunerAlgo(MinerConfigOption): standard = StandardTuneAlgo voltage_optimizer = VOptAlgo @@ -156,6 +159,16 @@ class TunerAlgo(MinerConfigOption): def default(cls): return cls.standard() + @classmethod + def from_dict(cls, dict_conf: dict | None): + mode = dict_conf.get("mode") + if mode is None: + return cls.default() + + cls_attr = getattr(cls, mode) + if cls_attr is not None: + return cls_attr().from_dict(dict_conf) + @dataclass class MiningModePowerTune(MinerConfigValue): @@ -169,7 +182,7 @@ class MiningModePowerTune(MinerConfigValue): if dict_conf.get("power"): cls_conf["power"] = dict_conf["power"] if dict_conf.get("algo"): - cls_conf["algo"] = dict_conf["algo"] + cls_conf["algo"] = TunerAlgo.from_dict(dict_conf["algo"]) return cls(**cls_conf) @@ -215,7 +228,13 @@ class MiningModeHashrateTune(MinerConfigValue): @classmethod def from_dict(cls, dict_conf: dict | None) -> "MiningModeHashrateTune": - return cls(dict_conf.get("hashrate")) + cls_conf = {} + if dict_conf.get("hashrate"): + cls_conf["hashrate"] = dict_conf["hashrate"] + if dict_conf.get("algo"): + cls_conf["algo"] = TunerAlgo.from_dict(dict_conf["algo"]) + + return cls(**cls_conf) def as_am_modern(self) -> dict: if settings.get("antminer_mining_mode_as_str", False): diff --git a/pyasic/data/__init__.py b/pyasic/data/__init__.py index eb6d1e4a..8051ea1d 100644 --- a/pyasic/data/__init__.py +++ b/pyasic/data/__init__.py @@ -94,9 +94,14 @@ class MinerData: percent_expected_wattage: float = field(init=False) nominal: bool = field(init=False) config: MinerConfig = None - errors: List[Union[WhatsminerError, BraiinsOSError, X19Error, InnosiliconError]] = ( - field(default_factory=list) - ) + errors: List[ + Union[ + WhatsminerError, + BraiinsOSError, + X19Error, + InnosiliconError, + ] + ] = field(default_factory=list) fault_light: Union[bool, None] = None efficiency: int = field(init=False) is_mining: bool = True diff --git a/tests/config_tests/__init__.py b/tests/config_tests/__init__.py index ca654e91..9c354230 100644 --- a/tests/config_tests/__init__.py +++ b/tests/config_tests/__init__.py @@ -72,7 +72,11 @@ class TestConfig(unittest.TestCase): }, "fan_mode": {"mode": "manual", "speed": 90, "minimum_fans": 2}, "temperature": {"target": 70, "hot": None, "danger": 120}, - "mining_mode": {"mode": "power_tuning", "power": 3000, "algo": {}}, + "mining_mode": { + "mode": "power_tuning", + "power": 3000, + "algo": {"mode": "standard"}, + }, "power_scaling": { "mode": "enabled", "power_step": 100,