diff --git a/pyasic/miners/backends/vnish.py b/pyasic/miners/backends/vnish.py index b8adc30fb..2d192bd1c 100644 --- a/pyasic/miners/backends/vnish.py +++ b/pyasic/miners/backends/vnish.py @@ -14,7 +14,7 @@ # limitations under the License. - # ------------------------------------------------------------------------------ -from typing import Optional +from typing import Optional, List from pyasic import MinerConfig from pyasic.data import AlgoHashRate, HashUnit @@ -29,6 +29,7 @@ ) from pyasic.miners.device.firmware import VNishFirmware from pyasic.web.vnish import VNishWebAPI +from pyasic.data.pools import PoolMetrics, PoolUrl VNISH_DATA_LOC = DataLocations( **{ @@ -80,6 +81,10 @@ "_is_mining", [WebAPICommand("web_summary", "summary")], ), + str(DataOptions.POOLS): DataFunction( + "_get_pools", + [RPCAPICommand("rpc_pools", "pools")], + ), } ) @@ -256,3 +261,33 @@ async def get_config(self) -> MinerConfig: return self.config self.config = MinerConfig.from_vnish(web_settings) return self.config + + async def _get_pools(self, rpc_pools: dict = None) -> List[PoolMetrics]: + if rpc_pools is None: + try: + rpc_pools = await self.rpc.pools() + except APIError: + pass + + pools_data = [] + if rpc_pools is not None: + try: + pools = rpc_pools.get("POOLS", []) + for pool_info in pools: + url = pool_info.get("URL") + pool_url = PoolUrl.from_str(url) if url else None + pool_data = PoolMetrics( + accepted=pool_info.get("Accepted"), + rejected=pool_info.get("Rejected"), + get_failures=pool_info.get("Get Failures"), + remote_failures=pool_info.get("Remote Failures"), + active=pool_info.get("Stratum Active"), + alive=pool_info.get("Status") == "Alive", + url=pool_url, + user=pool_info.get("User"), + index=pool_info.get("POOL"), + ) + pools_data.append(pool_data) + except LookupError: + pass + return pools_data