Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions pyasic/miners/backends/btminer.py
Original file line number Diff line number Diff line change
Expand Up @@ -1131,6 +1131,16 @@ async def _get_psu_fans(self, rpc_get_device_info: dict | None = None) -> list[F
if rpc_get_device_info is None:
return []
rpm = rpc_get_device_info.get("msg", {}).get("power", {}).get("fanspeed")
if rpm is None:
return []

# Ensure rpm is an integer, as some models may return it as a string or float
if not isinstance(rpm, int):
try:
rpm = int(round(float(rpm)))
except (TypeError, ValueError):
return []

return [Fan(speed=rpm)] if rpm is not None else []

async def _get_serial_number(
Expand Down
1 change: 1 addition & 0 deletions tests/miners_tests/backends_tests/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from .avalonminer_tests import *
from .btminer_tests import *
from .elphapex_tests import *
from .hammer_tests import *
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .test_v3_psu_fans import TestBTMinerV3PSUFans
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
"""Tests for BTMiner V3 PSU fan speed parsing."""

import unittest

from pyasic.miners.backends.btminer import BTMinerV3


class TestBTMinerV3PSUFans(unittest.IsolatedAsyncioTestCase):
async def test_get_psu_fans_keeps_int_value(self):
miner = BTMinerV3("127.0.0.1")

fans = await miner._get_psu_fans(
rpc_get_device_info={"msg": {"power": {"fanspeed": 6000}}}
)

self.assertEqual(len(fans), 1)
self.assertEqual(fans[0].speed, 6000)

async def test_get_psu_fans_converts_float_value(self):
miner = BTMinerV3("127.0.0.1")

fans = await miner._get_psu_fans(
rpc_get_device_info={"msg": {"power": {"fanspeed": 26.1}}}
)

self.assertEqual(len(fans), 1)
self.assertEqual(fans[0].speed, 26)

async def test_get_psu_fans_converts_string_float_value(self):
miner = BTMinerV3("127.0.0.1")

fans = await miner._get_psu_fans(
rpc_get_device_info={"msg": {"power": {"fanspeed": "25.7"}}}
)

self.assertEqual(len(fans), 1)
self.assertEqual(fans[0].speed, 26)

async def test_get_psu_fans_invalid_value_returns_empty(self):
miner = BTMinerV3("127.0.0.1")

fans = await miner._get_psu_fans(
rpc_get_device_info={"msg": {"power": {"fanspeed": "n/a"}}}
)

self.assertEqual(fans, [])