From ee1eece181798e9ee47e6f23495532b9b6a4eae5 Mon Sep 17 00:00:00 2001 From: upstreamdata Date: Sat, 29 Jun 2024 15:12:33 -0600 Subject: [PATCH] feature: add config sending for bitaxe. --- pyasic/config/__init__.py | 13 ++++++++++--- pyasic/config/base.py | 6 ++++++ pyasic/config/fans.py | 8 +++++++- pyasic/config/pools.py | 19 ++++++++++++++++++- pyasic/miners/backends/bitaxe.py | 3 +++ pyasic/web/bitaxe.py | 11 +++++++++++ 6 files changed, 55 insertions(+), 5 deletions(-) diff --git a/pyasic/config/__init__.py b/pyasic/config/__init__.py index f022dda5..bacf5c38 100644 --- a/pyasic/config/__init__.py +++ b/pyasic/config/__init__.py @@ -140,6 +140,14 @@ class MinerConfig: **self.pools.as_mara(user_suffix=user_suffix), } + def as_bitaxe(self, user_suffix: str = None) -> dict: + return { + **self.fan_mode.as_bitaxe(), + **self.temperature.as_bitaxe(), + **self.mining_mode.as_bitaxe(), + **self.pools.as_bitaxe(user_suffix=user_suffix), + } + @classmethod def from_dict(cls, dict_conf: dict) -> "MinerConfig": """Constructs a MinerConfig object from a dictionary.""" @@ -240,6 +248,5 @@ class MinerConfig: def from_bitaxe(cls, web_system_info: dict) -> "MinerConfig": return cls( pools=PoolConfig.from_bitaxe(web_system_info), - fan_mode=FanModeConfig.from_bitaxe(web_system_info) - - ) \ No newline at end of file + fan_mode=FanModeConfig.from_bitaxe(web_system_info), + ) diff --git a/pyasic/config/base.py b/pyasic/config/base.py index 08834068..c8e55f00 100644 --- a/pyasic/config/base.py +++ b/pyasic/config/base.py @@ -60,6 +60,9 @@ class MinerConfigOption(Enum): def as_mara(self) -> dict: return self.value.as_mara() + def as_bitaxe(self) -> dict: + return self.value.as_bitaxe() + def __call__(self, *args, **kwargs): return self.value(*args, **kwargs) @@ -119,6 +122,9 @@ class MinerConfigValue: def as_mara(self) -> dict: return {} + def as_bitaxe(self) -> dict: + return {} + def __getitem__(self, item): try: return getattr(self, item) diff --git a/pyasic/config/fans.py b/pyasic/config/fans.py index 01b33ee5..6359b2fd 100644 --- a/pyasic/config/fans.py +++ b/pyasic/config/fans.py @@ -80,6 +80,9 @@ class FanModeNormal(MinerConfigValue): }, } + def as_bitaxe(self) -> dict: + return {"autoFanspeed": 1} + @dataclass class FanModeManual(MinerConfigValue): @@ -138,6 +141,9 @@ class FanModeManual(MinerConfigValue): }, } + def as_bitaxe(self) -> dict: + return {"autoFanspeed": 0, "fanspeed": self.speed} + @dataclass class FanModeImmersion(MinerConfigValue): @@ -297,4 +303,4 @@ class FanModeConfig(MinerConfigOption): if web_system_info["autofanspeed"] == 1: return cls.normal() else: - return cls.manual(speed=web_system_info["fanspeed"]) \ No newline at end of file + return cls.manual(speed=web_system_info["fanspeed"]) diff --git a/pyasic/config/pools.py b/pyasic/config/pools.py index 67b0b0ca..e2572cd9 100644 --- a/pyasic/config/pools.py +++ b/pyasic/config/pools.py @@ -127,6 +127,13 @@ class Pool(MinerConfigValue): } return {"url": self.url, "user": self.user, "pass": self.password} + def as_bitaxe(self, user_suffix: str = None) -> dict: + return { + "stratumURL": self.url, + "stratumUser": f"{self.user}{user_suffix}", + "stratumPassword": self.password, + } + @classmethod def from_dict(cls, dict_conf: dict | None) -> "Pool": return cls( @@ -197,7 +204,11 @@ class Pool(MinerConfigValue): @classmethod def from_bitaxe(cls, web_system_info: dict) -> "Pool": url = f"stratum+tcp://{web_system_info['stratumURL']}:{web_system_info['stratumPort']}" - return cls(url=url, user=web_system_info["stratumUser"], password=web_system_info.get("stratumPassword", "")) + return cls( + url=url, + user=web_system_info["stratumUser"], + password=web_system_info.get("stratumPassword", ""), + ) @dataclass @@ -292,6 +303,9 @@ class PoolGroup(MinerConfigValue): def as_mara(self, user_suffix: str = None) -> list: return [p.as_mara(user_suffix=user_suffix) for p in self.pools] + def as_bitaxe(self, user_suffix: str = None) -> dict: + return self.pools[0].as_bitaxe(user_suffix=user_suffix) + @classmethod def from_dict(cls, dict_conf: dict | None) -> "PoolGroup": cls_conf = {} @@ -465,6 +479,9 @@ class PoolConfig(MinerConfigValue): return {"pools": self.groups[0].as_mara(user_suffix=user_suffix)} return {"pools": []} + def as_bitaxe(self, user_suffix: str = None) -> dict: + return self.groups[0].as_bitaxe(user_suffix=user_suffix) + @classmethod def from_api(cls, api_pools: dict) -> "PoolConfig": try: diff --git a/pyasic/miners/backends/bitaxe.py b/pyasic/miners/backends/bitaxe.py index 6b0ed666..33d1bbc5 100644 --- a/pyasic/miners/backends/bitaxe.py +++ b/pyasic/miners/backends/bitaxe.py @@ -56,6 +56,9 @@ class BitAxe(BaseMiner): web_system_info = await self.web.system_info() return MinerConfig.from_bitaxe(web_system_info) + async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None: + await self.web.update_settings(**config.as_bitaxe()) + async def _get_wattage(self, web_system_info: dict = None) -> Optional[int]: if web_system_info is None: try: diff --git a/pyasic/web/bitaxe.py b/pyasic/web/bitaxe.py index ff4eb85b..6f5c5de7 100644 --- a/pyasic/web/bitaxe.py +++ b/pyasic/web/bitaxe.py @@ -25,11 +25,19 @@ class BitAxeWebAPI(BaseWebAPI): transport=settings.transport(), ) as client: if parameters.get("post", False): + parameters.pop("post") data = await client.post( url, timeout=settings.get("api_function_timeout", 3), json=parameters, ) + elif parameters.get("patch", False): + parameters.pop("patch") + data = await client.patch( + url, + timeout=settings.get("api_function_timeout", 3), + json=parameters, + ) else: data = await client.get(url) except httpx.HTTPError: @@ -83,3 +91,6 @@ class BitAxeWebAPI(BaseWebAPI): async def restart(self): return await self.send_command("system/restart", post=True) + + async def update_settings(self, **config): + return await self.send_command("system", patch=True, **config)