diff --git a/pyasic/config/__init__.py b/pyasic/config/__init__.py index b3cd3372..ee1f7439 100644 --- a/pyasic/config/__init__.py +++ b/pyasic/config/__init__.py @@ -204,3 +204,11 @@ class MinerConfig: fan_mode=FanModeConfig.from_auradine(web_conf["fan"]), mining_mode=MiningModeConfig.from_auradine(web_conf["mode"]), ) + + @classmethod + def from_mara(cls, web_miner_config: dict) -> "MinerConfig": + return cls( + pools=PoolConfig.from_mara(web_miner_config), + fan_mode=FanModeConfig.from_mara(web_miner_config), + mining_mode=MiningModeConfig.from_mara(web_miner_config), + ) diff --git a/pyasic/config/base.py b/pyasic/config/base.py index ac666f8e..d4bbd68b 100644 --- a/pyasic/config/base.py +++ b/pyasic/config/base.py @@ -57,6 +57,9 @@ class MinerConfigOption(Enum): def as_auradine(self) -> dict: return self.value.as_auradine() + def as_mara(self) -> dict: + return self.value.as_mara() + def __call__(self, *args, **kwargs): return self.value(*args, **kwargs) @@ -106,3 +109,6 @@ class MinerConfigValue: def as_auradine(self) -> dict: return {} + + def as_mara(self) -> dict: + return {} diff --git a/pyasic/config/fans.py b/pyasic/config/fans.py index b9970b11..c0521725 100644 --- a/pyasic/config/fans.py +++ b/pyasic/config/fans.py @@ -235,4 +235,18 @@ class FanModeConfig(MinerConfigOption): fan_1_target = fan_data["Target"] return cls.manual(speed=round((fan_1_target / fan_1_max) * 100)) except LookupError: - return cls.default() + pass + return cls.default() + + @classmethod + def from_mara(cls, web_config: dict): + try: + mode = web_config["general-config"]["environment-profile"] + if mode == "AirCooling": + if web_config["advance-config"]["override-fan-control"]: + return cls.manual(web_config["advance-config"]["fan-fixed-percent"]) + return cls.normal() + return cls.immersion() + except LookupError: + pass + return cls.default() diff --git a/pyasic/config/mining.py b/pyasic/config/mining.py index f7ad9f7d..5a14d178 100644 --- a/pyasic/config/mining.py +++ b/pyasic/config/mining.py @@ -468,3 +468,28 @@ class MiningModeConfig(MinerConfigOption): return cls.power_tuning(mode_data["Power"]) except LookupError: return cls.default() + + @classmethod + def from_mara(cls, web_config: dict): + try: + mode = web_config["mode"]["work-mode-selector"] + if mode == "Fixed": + fixed_conf = web_config["mode"]["fixed"] + return cls.manual( + global_freq=fixed_conf["frequency"], + global_volt=fixed_conf["voltage"], + ) + elif mode == "Stock": + return cls.normal() + elif mode == "Sleep": + return cls.sleep() + elif mode == "Auto": + auto_conf = web_config["mode"]["concorde"] + auto_mode = auto_conf["mode-select"] + if auto_mode == "Hashrate": + return cls.hashrate_tuning(hashrate=auto_conf["hash-target"]) + elif auto_mode == "PowerTarget": + return cls.power_tuning(power=auto_conf["power-target"]) + except LookupError: + pass + return cls.default() diff --git a/pyasic/config/pools.py b/pyasic/config/pools.py index a54b6186..eeb341a1 100644 --- a/pyasic/config/pools.py +++ b/pyasic/config/pools.py @@ -177,6 +177,14 @@ class Pool(MinerConfigValue): password=grpc_pool["password"], ) + @classmethod + def from_mara(cls, web_pool: dict) -> "Pool": + return cls( + url=web_pool["url"], + user=web_pool["user"], + password=web_pool["pass"], + ) + @dataclass class PoolGroup(MinerConfigValue): @@ -336,6 +344,10 @@ class PoolGroup(MinerConfigValue): except LookupError: return cls() + @classmethod + def from_mara(cls, web_config_pools: dict) -> "PoolGroup": + return cls(pools=[Pool.from_mara(pool_conf) for pool_conf in web_config_pools]) + @dataclass class PoolConfig(MinerConfigValue): @@ -481,3 +493,7 @@ class PoolConfig(MinerConfigValue): ) except LookupError: return cls() + + @classmethod + def from_mara(cls, web_config: dict) -> "PoolConfig": + return cls(groups=[PoolGroup.from_mara(web_config["pools"])]) diff --git a/pyasic/miners/backends/marathon.py b/pyasic/miners/backends/marathon.py index 50960310..dd66dc9b 100644 --- a/pyasic/miners/backends/marathon.py +++ b/pyasic/miners/backends/marathon.py @@ -1,5 +1,6 @@ from typing import List, Optional +from pyasic import MinerConfig from pyasic.data import Fan, HashBoard from pyasic.errors import APIError from pyasic.miners.base import BaseMiner @@ -72,6 +73,12 @@ class MaraMiner(BaseMiner): res = await self.web.set_locate_miner(blinking=True) return res.get("blinking") is True + async def get_config(self) -> MinerConfig: + data = await self.web.get_miner_config() + if data: + self.config = MinerConfig.from_mara(data) + return self.config + async def _get_wattage(self, web_brief: dict = None) -> Optional[int]: if web_brief is None: try: