Skip to content
This repository was archived by the owner on Jul 6, 2026. It is now read-only.

Commit 324b3ae

Browse files
bugy855jamaalpre-commit-ci[bot]
authored
fix: handle float and string values for BTMiner V3 fan speed (#415)
Co-authored-by: jamaal <jamaal@sustainhash.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent c8e2489 commit 324b3ae

4 files changed

Lines changed: 58 additions & 0 deletions

File tree

pyasic/miners/backends/btminer.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,6 +1137,16 @@ async def _get_psu_fans(self, rpc_get_device_info: dict | None = None) -> list[F
11371137
if rpc_get_device_info is None:
11381138
return []
11391139
rpm = rpc_get_device_info.get("msg", {}).get("power", {}).get("fanspeed")
1140+
if rpm is None:
1141+
return []
1142+
1143+
# Ensure rpm is an integer, as some models may return it as a string or float
1144+
if not isinstance(rpm, int):
1145+
try:
1146+
rpm = int(round(float(rpm)))
1147+
except (TypeError, ValueError):
1148+
return []
1149+
11401150
return [Fan(speed=rpm)] if rpm is not None else []
11411151

11421152
async def _get_errors(
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from .avalonminer_tests import *
2+
from .btminer_tests import *
23
from .elphapex_tests import *
34
from .fluminer_tests import *
45
from .hammer_tests import *
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from .test_v3_psu_fans import TestBTMinerV3PSUFans
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
"""Tests for BTMiner V3 PSU fan speed parsing."""
2+
3+
import unittest
4+
5+
from pyasic.miners.backends.btminer import BTMinerV3
6+
7+
8+
class TestBTMinerV3PSUFans(unittest.IsolatedAsyncioTestCase):
9+
async def test_get_psu_fans_keeps_int_value(self):
10+
miner = BTMinerV3("127.0.0.1")
11+
12+
fans = await miner._get_psu_fans(
13+
rpc_get_device_info={"msg": {"power": {"fanspeed": 6000}}}
14+
)
15+
16+
self.assertEqual(len(fans), 1)
17+
self.assertEqual(fans[0].speed, 6000)
18+
19+
async def test_get_psu_fans_converts_float_value(self):
20+
miner = BTMinerV3("127.0.0.1")
21+
22+
fans = await miner._get_psu_fans(
23+
rpc_get_device_info={"msg": {"power": {"fanspeed": 26.1}}}
24+
)
25+
26+
self.assertEqual(len(fans), 1)
27+
self.assertEqual(fans[0].speed, 26)
28+
29+
async def test_get_psu_fans_converts_string_float_value(self):
30+
miner = BTMinerV3("127.0.0.1")
31+
32+
fans = await miner._get_psu_fans(
33+
rpc_get_device_info={"msg": {"power": {"fanspeed": "25.7"}}}
34+
)
35+
36+
self.assertEqual(len(fans), 1)
37+
self.assertEqual(fans[0].speed, 26)
38+
39+
async def test_get_psu_fans_invalid_value_returns_empty(self):
40+
miner = BTMinerV3("127.0.0.1")
41+
42+
fans = await miner._get_psu_fans(
43+
rpc_get_device_info={"msg": {"power": {"fanspeed": "n/a"}}}
44+
)
45+
46+
self.assertEqual(fans, [])

0 commit comments

Comments
 (0)