feature: add support for elphapex pools
This commit is contained in:
@@ -18,6 +18,7 @@ from typing import List, Optional
|
|||||||
from pyasic import APIError
|
from pyasic import APIError
|
||||||
from pyasic.data import Fan, HashBoard, X19Error
|
from pyasic.data import Fan, HashBoard, X19Error
|
||||||
from pyasic.data.error_codes import MinerErrorData
|
from pyasic.data.error_codes import MinerErrorData
|
||||||
|
from pyasic.data.pools import PoolMetrics, PoolUrl
|
||||||
from pyasic.device.algorithm import AlgoHashRate
|
from pyasic.device.algorithm import AlgoHashRate
|
||||||
from pyasic.miners.data import (
|
from pyasic.miners.data import (
|
||||||
DataFunction,
|
DataFunction,
|
||||||
@@ -74,6 +75,10 @@ ELPHAPEX_DATA_LOC = DataLocations(
|
|||||||
"_get_uptime",
|
"_get_uptime",
|
||||||
[WebAPICommand("web_summary", "summary")],
|
[WebAPICommand("web_summary", "summary")],
|
||||||
),
|
),
|
||||||
|
str(DataOptions.POOLS): DataFunction(
|
||||||
|
"_get_pools",
|
||||||
|
[WebAPICommand("web_pools", "pools")],
|
||||||
|
),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -317,3 +322,43 @@ class ElphapexMiner(StockFirmware):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
return fans
|
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
|
||||||
|
|||||||
@@ -214,3 +214,11 @@ class ElphapexWebAPI(BaseWebAPI):
|
|||||||
dict: A dictionary indicating whether the LED is currently blinking.
|
dict: A dictionary indicating whether the LED is currently blinking.
|
||||||
"""
|
"""
|
||||||
return await self.send_command("get_blink_status")
|
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")
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
from .alphapex_tests import *
|
from .elphapex_tests import *
|
||||||
from .hammer_tests import *
|
from .hammer_tests import *
|
||||||
|
|||||||
@@ -9,6 +9,25 @@ from pyasic.data import Fan, HashBoard
|
|||||||
from pyasic.device.algorithm.hashrate.unit.scrypt import ScryptUnit
|
from pyasic.device.algorithm.hashrate.unit.scrypt import ScryptUnit
|
||||||
from pyasic.miners.elphapex import ElphapexDG1Plus
|
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 = {
|
data = {
|
||||||
ElphapexDG1Plus: {
|
ElphapexDG1Plus: {
|
||||||
"web_get_system_info": {
|
"web_get_system_info": {
|
||||||
@@ -190,6 +209,81 @@ data = {
|
|||||||
"fc-work-mode": 0,
|
"fc-work-mode": 0,
|
||||||
"fc-freq": "1850",
|
"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)],
|
[Fan(speed=5340), Fan(speed=5400), Fan(speed=5400), Fan(speed=5400)],
|
||||||
)
|
)
|
||||||
self.assertEqual(result.total_chips, result.expected_chips)
|
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)
|
||||||
|
)
|
||||||
@@ -16,12 +16,12 @@ POOLS = [
|
|||||||
"pwd": "123",
|
"pwd": "123",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"url": "stratum+tcp://stratum.pool.io:3333",
|
"url": "stratum+tcp://stratum.pool.io:3334",
|
||||||
"user": "pool_username.real_worker",
|
"user": "pool_username.real_worker",
|
||||||
"pwd": "123",
|
"pwd": "123",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"url": "stratum+tcp://stratum.pool.io:3333",
|
"url": "stratum+tcp://stratum.pool.io:3335",
|
||||||
"user": "pool_username.real_worker",
|
"user": "pool_username.real_worker",
|
||||||
"pwd": "123",
|
"pwd": "123",
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user