diff --git a/pyasic/config/__init__.py b/pyasic/config/__init__.py index 77aa43ae..20badd15 100644 --- a/pyasic/config/__init__.py +++ b/pyasic/config/__init__.py @@ -286,7 +286,13 @@ class MinerConfig(BaseModel): @classmethod def from_luxos( - cls, rpc_tempctrl: dict, rpc_fans: dict, rpc_pools: dict, rpc_groups: dict + cls, + rpc_tempctrl: dict, + rpc_fans: dict, + rpc_pools: dict, + rpc_groups: dict, + rpc_config: dict, + rpc_profiles: dict, ) -> "MinerConfig": return cls( temperature=TemperatureConfig.from_luxos(rpc_tempctrl=rpc_tempctrl), @@ -294,6 +300,9 @@ class MinerConfig(BaseModel): rpc_tempctrl=rpc_tempctrl, rpc_fans=rpc_fans ), pools=PoolConfig.from_luxos(rpc_pools=rpc_pools, rpc_groups=rpc_groups), + mining_mode=MiningModeConfig.from_luxos( + rpc_config=rpc_config, rpc_profiles=rpc_profiles + ), ) @classmethod diff --git a/pyasic/config/mining/__init__.py b/pyasic/config/mining/__init__.py index c3b780c2..f1d549ea 100644 --- a/pyasic/config/mining/__init__.py +++ b/pyasic/config/mining/__init__.py @@ -367,6 +367,22 @@ class MiningModePreset(MinerConfigValue): available_presets=[MiningPreset.from_vnish(p) for p in web_presets], ) + @classmethod + def from_luxos( + cls, rpc_config: dict, rpc_profiles: list[dict] + ) -> "MiningModePreset": + active_preset = None + active_profile = rpc_config["CONFIG"][0]["Profile"] + for profile in rpc_profiles["PROFILES"]: + if profile["Profile Name"] == active_profile: + active_preset = profile + return cls( + active_preset=MiningPreset.from_luxos(active_preset), + available_presets=[ + MiningPreset.from_luxos(p) for p in rpc_profiles["PROFILES"] + ], + ) + class ManualBoardSettings(MinerConfigValue): freq: float @@ -687,6 +703,10 @@ class MiningModeConfig(MinerConfigOption): pass return cls.default() + @classmethod + def from_luxos(cls, rpc_config: dict, rpc_profiles: dict): + return MiningModePreset.from_luxos(rpc_config, rpc_profiles) + MiningMode = TypeVar( "MiningMode", diff --git a/pyasic/config/mining/presets.py b/pyasic/config/mining/presets.py index c41afe6f..ba12ed88 100644 --- a/pyasic/config/mining/presets.py +++ b/pyasic/config/mining/presets.py @@ -6,7 +6,9 @@ class MiningPreset(MinerConfigValue): power: int | None = None hashrate: int | None = None tuned: bool | None = None - modded_psu: bool = False + modded_psu: bool | None = None + frequency: int | None = None + voltage: float | None = None def as_vnish(self) -> dict: if self.name is not None: @@ -32,3 +34,14 @@ class MiningPreset(MinerConfigValue): tuned=tuned, modded_psu=modded_psu, ) + + @classmethod + def from_luxos(cls, profile: dict): + return cls( + name=profile["Profile Name"], + power=profile["Watts"], + hashrate=round(profile["Hashrate"]), + tuned=profile["IsTuned"], + frequency=profile["Frequency"], + voltage=profile["Voltage"], + ) diff --git a/pyasic/miners/backends/luxminer.py b/pyasic/miners/backends/luxminer.py index bd709e85..2336ec4b 100644 --- a/pyasic/miners/backends/luxminer.py +++ b/pyasic/miners/backends/luxminer.py @@ -77,6 +77,7 @@ class LUXMiner(LuxOSFirmware): rpc: LUXMinerRPCAPI supports_shutdown = True + supports_presets = True data_locations = LUXMINER_DATA_LOC @@ -131,12 +132,16 @@ class LUXMiner(LuxOSFirmware): return False async def get_config(self) -> MinerConfig: - data = await self.rpc.multicommand("tempctrl", "fans", "pools", "groups") + data = await self.rpc.multicommand( + "tempctrl", "fans", "pools", "groups", "config", "profiles" + ) return MinerConfig.from_luxos( rpc_tempctrl=data.get("tempctrl", [{}])[0], rpc_fans=data.get("fans", [{}])[0], rpc_pools=data.get("pools", [{}])[0], rpc_groups=data.get("groups", [{}])[0], + rpc_config=data.get("config", [{}])[0], + rpc_profiles=data.get("profiles", [{}])[0], ) async def upgrade_firmware(self) -> bool: