feature: add support for elphapex pools

This commit is contained in:
Upstream Data
2025-02-05 08:28:28 -07:00
parent 1021f200ec
commit 7797023689
6 changed files with 153 additions and 3 deletions

View File

@@ -18,6 +18,7 @@ from typing import List, Optional
from pyasic import APIError
from pyasic.data import Fan, HashBoard, X19Error
from pyasic.data.error_codes import MinerErrorData
from pyasic.data.pools import PoolMetrics, PoolUrl
from pyasic.device.algorithm import AlgoHashRate
from pyasic.miners.data import (
DataFunction,
@@ -74,6 +75,10 @@ ELPHAPEX_DATA_LOC = DataLocations(
"_get_uptime",
[WebAPICommand("web_summary", "summary")],
),
str(DataOptions.POOLS): DataFunction(
"_get_pools",
[WebAPICommand("web_pools", "pools")],
),
}
)
@@ -317,3 +322,43 @@ class ElphapexMiner(StockFirmware):
pass
return fans
async def _get_pools(self, web_pools: list = None) -> List[PoolMetrics]:
if web_pools is None:
try:
web_pools = await self.web.pools()
except APIError:
return []
active_pool_index = None
highest_priority = float("inf")
for pool_info in web_pools["POOLS"]:
if (
pool_info.get("status") == "Alive"
and pool_info.get("priority", float("inf")) < highest_priority
):
highest_priority = pool_info["priority"]
active_pool_index = pool_info["index"]
pools_data = []
if web_pools is not None:
try:
for pool_info in web_pools["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("stale"),
remote_failures=pool_info.get("discarded"),
active=pool_info.get("index") == active_pool_index,
alive=pool_info.get("status") == "Alive",
url=pool_url,
user=pool_info.get("user"),
index=pool_info.get("index"),
)
pools_data.append(pool_data)
except LookupError:
pass
return pools_data

View File

@@ -214,3 +214,11 @@ class ElphapexWebAPI(BaseWebAPI):
dict: A dictionary indicating whether the LED is currently blinking.
"""
return await self.send_command("get_blink_status")
async def pools(self) -> dict:
"""Check the status of the miner's pools.
Returns:
dict: A dictionary containing the pool status as information.
"""
return await self.send_command("pools")

View File

@@ -1,2 +1,2 @@
from .alphapex_tests import *
from .elphapex_tests import *
from .hammer_tests import *

View File

@@ -9,6 +9,25 @@ from pyasic.data import Fan, HashBoard
from pyasic.device.algorithm.hashrate.unit.scrypt import ScryptUnit
from pyasic.miners.elphapex import ElphapexDG1Plus
POOLS = [
{
"url": "stratum+tcp://stratum.pool.io:3333",
"user": "pool_username.real_worker",
"pwd": "123",
},
{
"url": "stratum+tcp://stratum.pool.io:3334",
"user": "pool_username.real_worker",
"pwd": "123",
},
{
"url": "stratum+tcp://stratum.pool.io:3335",
"user": "pool_username.real_worker",
"pwd": "123",
},
]
data = {
ElphapexDG1Plus: {
"web_get_system_info": {
@@ -190,6 +209,81 @@ data = {
"fc-work-mode": 0,
"fc-freq": "1850",
},
"web_pools": {
"STATUS": {
"STATUS": "S",
"when": 5411762,
"timestamp": 1738768594,
"api_version": "1.0.0",
"Msg": "pools",
},
"Device Total Rejected": 8888,
"POOLS": [
{
"diffs": 0,
"diffr": 524288,
"index": 0,
"user": "pool_username.real_worker",
"lsdiff": 524288,
"lstime": "00:00:18",
"diffa": 524288,
"accepted": 798704,
"diff1": 0,
"stale": 0,
"diff": "",
"rejected": 3320,
"status": "Unreachable",
"getworks": 802024,
"priority": 0,
"url": "stratum+tcp://stratum.pool.io:3333",
},
{
"diffs": 0,
"diffr": 524288,
"index": 1,
"user": "pool_username.real_worker",
"lsdiff": 524288,
"lstime": "00:00:00",
"diffa": 524288,
"accepted": 604803,
"diff1": 0,
"stale": 0,
"diff": "",
"rejected": 2492,
"status": "Alive",
"getworks": 607295,
"priority": 1,
"url": "stratum+tcp://stratum.pool.io:3334",
},
{
"diffs": 0,
"diffr": 524288,
"index": 2,
"user": "pool_username.real_worker",
"lsdiff": 524288,
"lstime": "00:00:05",
"diffa": 524288,
"accepted": 691522,
"diff1": 0,
"stale": 0,
"diff": "",
"rejected": 3076,
"status": "Unreachable",
"getworks": 694598,
"priority": 2,
"url": "stratum+tcp://stratum.pool.io:3335",
},
],
"Device Rejected%": 0.41999999999999998,
"Device Total Work": 2103917,
"INFO": {
"miner_version": "DG1+_SW_V1.0.2",
"CompileTime": "",
"dev_sn": "28HY245192N000245C23B",
"type": "DG1+",
"hw_version": "DG1+_HW_V1.0",
},
},
}
}
@@ -240,3 +334,6 @@ class TestElphapexMiners(unittest.IsolatedAsyncioTestCase):
[Fan(speed=5340), Fan(speed=5400), Fan(speed=5400), Fan(speed=5400)],
)
self.assertEqual(result.total_chips, result.expected_chips)
self.assertEqual(
set([str(p.url) for p in result.pools]), set(p["url"] for p in POOLS)
)

View File

@@ -16,12 +16,12 @@ POOLS = [
"pwd": "123",
},
{
"url": "stratum+tcp://stratum.pool.io:3333",
"url": "stratum+tcp://stratum.pool.io:3334",
"user": "pool_username.real_worker",
"pwd": "123",
},
{
"url": "stratum+tcp://stratum.pool.io:3333",
"url": "stratum+tcp://stratum.pool.io:3335",
"user": "pool_username.real_worker",
"pwd": "123",
},