diff --git a/pyasic/miners/backends/btminer.py b/pyasic/miners/backends/btminer.py index b78fd195..2a7eadb2 100644 --- a/pyasic/miners/backends/btminer.py +++ b/pyasic/miners/backends/btminer.py @@ -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( diff --git a/tests/miners_tests/backends_tests/__init__.py b/tests/miners_tests/backends_tests/__init__.py index 81b200cd..22fc033c 100644 --- a/tests/miners_tests/backends_tests/__init__.py +++ b/tests/miners_tests/backends_tests/__init__.py @@ -1,3 +1,4 @@ from .avalonminer_tests import * +from .btminer_tests import * from .elphapex_tests import * from .hammer_tests import * diff --git a/tests/miners_tests/backends_tests/btminer_tests/__init__.py b/tests/miners_tests/backends_tests/btminer_tests/__init__.py new file mode 100644 index 00000000..5bbd430d --- /dev/null +++ b/tests/miners_tests/backends_tests/btminer_tests/__init__.py @@ -0,0 +1 @@ +from .test_v3_psu_fans import TestBTMinerV3PSUFans diff --git a/tests/miners_tests/backends_tests/btminer_tests/test_v3_psu_fans.py b/tests/miners_tests/backends_tests/btminer_tests/test_v3_psu_fans.py new file mode 100644 index 00000000..ab51037c --- /dev/null +++ b/tests/miners_tests/backends_tests/btminer_tests/test_v3_psu_fans.py @@ -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, [])