diff --git a/data/__init__.py b/data/__init__.py index 2e03f399..fd221c9d 100644 --- a/data/__init__.py +++ b/data/__init__.py @@ -7,8 +7,18 @@ class MinerData: model: str = "Unknown" hostname: str = "Unknown" hashrate: float = 0 - temperature: float = 0 + temperature_avg: int = field(init=False) + left_board_temp: int = 0 + left_board_chip_temp: int = 0 + center_board_temp: int = 0 + center_board_chip_temp: int = 0 + right_board_temp: int = 0 + right_board_chip_temp: int = 0 wattage: int = 0 + fan_1: int = -1 + fan_2: int = -1 + fan_3: int = -1 + fan_4: int = -1 left_chips: int = 0 center_chips: int = 0 right_chips: int = 0 @@ -46,9 +56,25 @@ class MinerData: def percent_ideal(self, val): pass - def __post_init__(self): - self.total_chips = self.right_chips + self.center_chips + self.left_chips - self.nominal = self.ideal_chips == self.total_chips + @property + def temperature_avg(self): # noqa - Skip PyCharm inspection + total_temp = 0 + temp_count = 0 + for temp in [ + self.left_board_chip_temp, + self.center_board_chip_temp, + self.right_board_chip_temp, + ]: + if not temp == 0: + total_temp += temp + temp_count += 1 + if not temp_count > 0: + return 0 + return round(total_temp / temp_count) + + @temperature_avg.setter + def temperature_avg(self, val): + pass def asdict(self): return asdict(self) diff --git a/miners/__init__.py b/miners/__init__.py index 47b1bcb4..6bfd6b36 100644 --- a/miners/__init__.py +++ b/miners/__init__.py @@ -17,6 +17,7 @@ class BaseMiner: self.hostname = None self.nominal_chips = 1 self.version = None + self.fan_count = 2 def __repr__(self): return f"{'' if not self.api_type else self.api_type} {'' if not self.model else self.model}: {str(self.ip)}" diff --git a/miners/_backends/bosminer.py b/miners/_backends/bosminer.py index 0f00cc82..f33efaa5 100644 --- a/miners/_backends/bosminer.py +++ b/miners/_backends/bosminer.py @@ -262,7 +262,7 @@ class BOSMiner(BaseMiner): miner_data = None for i in range(DATA_RETRIES): miner_data = await self.api.multicommand( - "summary", "temps", "tunerstatus", "pools", "devdetails" + "summary", "temps", "tunerstatus", "pools", "devdetails", "fans" ) if miner_data: break @@ -273,6 +273,7 @@ class BOSMiner(BaseMiner): tunerstatus = miner_data.get("tunerstatus")[0] pools = miner_data.get("pools")[0] devdetails = miner_data.get("devdetails")[0] + fans = miner_data.get("fans")[0] if summary: hr = summary.get("SUMMARY") @@ -286,9 +287,20 @@ class BOSMiner(BaseMiner): temp = temps.get("TEMPS") if temp: if len(temp) > 0: - chip_temp = temp[0].get("Chip") - if chip_temp: - data.temperature = round(chip_temp) + board_map = {0: "left_board", 1: "center_board", 2: "right_board"} + offset = temp[0]["ID"] + for board in temp: + id = board["ID"] - offset + chip_temp = round(board["Chip"]) + board_temp = round(board["Board"]) + setattr(data, f"{board_map[id]}_chip_temp", chip_temp) + setattr(data, f"{board_map[id]}_temp", board_temp) + + if fans: + fan_data = fans.get("FANS") + if fan_data: + for fan in range(self.fan_count): + setattr(data, f"fan_{fan+1}", fan_data[fan]["RPM"]) if pools: pool_1 = None diff --git a/miners/_types/antminer/X17/S17.py b/miners/_types/antminer/X17/S17.py index d5ecfc39..32e79ca2 100644 --- a/miners/_types/antminer/X17/S17.py +++ b/miners/_types/antminer/X17/S17.py @@ -7,3 +7,4 @@ class S17(BaseMiner): self.ip = ip self.model = "S17" self.nominal_chips = 48 + self.fan_count = 4 diff --git a/miners/_types/antminer/X17/S17_Plus.py b/miners/_types/antminer/X17/S17_Plus.py index bf438475..313ba1c4 100644 --- a/miners/_types/antminer/X17/S17_Plus.py +++ b/miners/_types/antminer/X17/S17_Plus.py @@ -7,3 +7,4 @@ class S17Plus(BaseMiner): self.ip = ip self.model = "S17+" self.nominal_chips = 65 + self.fan_count = 4 diff --git a/miners/_types/antminer/X17/S17_Pro.py b/miners/_types/antminer/X17/S17_Pro.py index 3d69e2bf..6b208f36 100644 --- a/miners/_types/antminer/X17/S17_Pro.py +++ b/miners/_types/antminer/X17/S17_Pro.py @@ -7,3 +7,4 @@ class S17Pro(BaseMiner): self.ip = ip self.model = "S17 Pro" self.nominal_chips = 48 + self.fan_count = 4 diff --git a/miners/_types/antminer/X17/S17e.py b/miners/_types/antminer/X17/S17e.py index 0ab54a3f..dfbb573c 100644 --- a/miners/_types/antminer/X17/S17e.py +++ b/miners/_types/antminer/X17/S17e.py @@ -7,3 +7,4 @@ class S17e(BaseMiner): self.ip = ip self.model = "S17e" self.nominal_chips = 135 + self.fan_count = 4 diff --git a/miners/_types/antminer/X17/T17.py b/miners/_types/antminer/X17/T17.py index 4dbe99dc..af4c1526 100644 --- a/miners/_types/antminer/X17/T17.py +++ b/miners/_types/antminer/X17/T17.py @@ -7,3 +7,4 @@ class T17(BaseMiner): self.ip = ip self.model = "T17" self.nominal_chips = 30 + self.fan_count = 4 diff --git a/miners/_types/antminer/X17/T17_Plus.py b/miners/_types/antminer/X17/T17_Plus.py index 2173ab77..8926f7d5 100644 --- a/miners/_types/antminer/X17/T17_Plus.py +++ b/miners/_types/antminer/X17/T17_Plus.py @@ -7,3 +7,4 @@ class T17Plus(BaseMiner): self.ip = ip self.model = "T17+" self.nominal_chips = 44 + self.fan_count = 4 diff --git a/miners/_types/antminer/X17/T17e.py b/miners/_types/antminer/X17/T17e.py index 7b2158a3..71e37461 100644 --- a/miners/_types/antminer/X17/T17e.py +++ b/miners/_types/antminer/X17/T17e.py @@ -7,3 +7,4 @@ class T17e(BaseMiner): self.ip = ip self.model = "T17e" self.nominal_chips = 78 + self.fan_count = 4 diff --git a/miners/_types/antminer/X19/S19.py b/miners/_types/antminer/X19/S19.py index 7628657a..389e06f4 100644 --- a/miners/_types/antminer/X19/S19.py +++ b/miners/_types/antminer/X19/S19.py @@ -7,3 +7,4 @@ class S19(BaseMiner): self.ip = ip self.model = "S19" self.nominal_chips = 76 + self.fan_count = 4 diff --git a/miners/_types/antminer/X19/S19_Pro.py b/miners/_types/antminer/X19/S19_Pro.py index 98fd2d57..34521399 100644 --- a/miners/_types/antminer/X19/S19_Pro.py +++ b/miners/_types/antminer/X19/S19_Pro.py @@ -7,3 +7,4 @@ class S19Pro(BaseMiner): self.ip = ip self.model = "S19 Pro" self.nominal_chips = 114 + self.fan_count = 4 diff --git a/miners/_types/antminer/X19/S19a.py b/miners/_types/antminer/X19/S19a.py index 901fabbe..62efcce2 100644 --- a/miners/_types/antminer/X19/S19a.py +++ b/miners/_types/antminer/X19/S19a.py @@ -7,3 +7,4 @@ class S19a(BaseMiner): self.ip = ip self.model = "S19a" self.nominal_chips = 72 + self.fan_count = 4 diff --git a/miners/_types/antminer/X19/S19j.py b/miners/_types/antminer/X19/S19j.py index 3d27c229..2d099d95 100644 --- a/miners/_types/antminer/X19/S19j.py +++ b/miners/_types/antminer/X19/S19j.py @@ -7,3 +7,4 @@ class S19j(BaseMiner): self.ip = ip self.model = "S19j" self.nominal_chips = 114 + self.fan_count = 4 diff --git a/miners/_types/antminer/X19/S19j_Pro.py b/miners/_types/antminer/X19/S19j_Pro.py index bacba1a6..f820e511 100644 --- a/miners/_types/antminer/X19/S19j_Pro.py +++ b/miners/_types/antminer/X19/S19j_Pro.py @@ -7,3 +7,4 @@ class S19jPro(BaseMiner): self.ip = ip self.model = "S19j Pro" self.nominal_chips = 126 + self.fan_count = 4 diff --git a/miners/_types/antminer/X19/T19.py b/miners/_types/antminer/X19/T19.py index a6944304..f1f7cdeb 100644 --- a/miners/_types/antminer/X19/T19.py +++ b/miners/_types/antminer/X19/T19.py @@ -7,3 +7,4 @@ class T19(BaseMiner): self.ip = ip self.model = "T19" self.nominal_chips = 76 + self.fan_count = 4 diff --git a/miners/_types/antminer/X9/S9.py b/miners/_types/antminer/X9/S9.py index 2efb5fd7..e189f53d 100644 --- a/miners/_types/antminer/X9/S9.py +++ b/miners/_types/antminer/X9/S9.py @@ -7,3 +7,4 @@ class S9(BaseMiner): self.ip = ip self.model = "S9" self.nominal_chips = 63 + self.fan_count = 2 diff --git a/miners/_types/antminer/X9/S9i.py b/miners/_types/antminer/X9/S9i.py index 11f876e9..c861c39f 100644 --- a/miners/_types/antminer/X9/S9i.py +++ b/miners/_types/antminer/X9/S9i.py @@ -7,3 +7,4 @@ class S9i(BaseMiner): self.ip = ip self.model = "S9i" self.nominal_chips = 63 + self.fan_count = 2 diff --git a/miners/_types/antminer/X9/T9.py b/miners/_types/antminer/X9/T9.py index c7b7d0db..60df7604 100644 --- a/miners/_types/antminer/X9/T9.py +++ b/miners/_types/antminer/X9/T9.py @@ -7,3 +7,4 @@ class T9(BaseMiner): self.ip = ip self.model = "T9" self.nominal_chips = 57 + self.fan_count = 2 diff --git a/miners/_types/avalonminer/A10X/A1047.py b/miners/_types/avalonminer/A10X/A1047.py index c8aa2c63..53bb6f04 100644 --- a/miners/_types/avalonminer/A10X/A1047.py +++ b/miners/_types/avalonminer/A10X/A1047.py @@ -7,3 +7,4 @@ class Avalon1047(BaseMiner): self.ip = ip self.model = "Avalon 1047" self.nominal_chips = 114 + self.fan_count = 4 diff --git a/miners/_types/avalonminer/A10X/A1066.py b/miners/_types/avalonminer/A10X/A1066.py index 5cded585..5a7c1d6a 100644 --- a/miners/_types/avalonminer/A10X/A1066.py +++ b/miners/_types/avalonminer/A10X/A1066.py @@ -7,3 +7,4 @@ class Avalon1066(BaseMiner): self.ip = ip self.model = "Avalon 1066" self.nominal_chips = 114 + self.fan_count = 4 diff --git a/miners/_types/avalonminer/A8X/A821.py b/miners/_types/avalonminer/A8X/A821.py index c733932e..3564c5b6 100644 --- a/miners/_types/avalonminer/A8X/A821.py +++ b/miners/_types/avalonminer/A8X/A821.py @@ -6,3 +6,4 @@ class Avalon821(BaseMiner): super().__init__() self.ip = ip self.model = "Avalon 821" + self.fan_count = 2 diff --git a/miners/_types/avalonminer/A8X/A841.py b/miners/_types/avalonminer/A8X/A841.py index 31d04718..7c3e906d 100644 --- a/miners/_types/avalonminer/A8X/A841.py +++ b/miners/_types/avalonminer/A8X/A841.py @@ -6,3 +6,4 @@ class Avalon841(BaseMiner): super().__init__() self.ip = ip self.model = "Avalon 841" + self.fan_count = 2 diff --git a/miners/_types/whatsminer/M2X/M20S.py b/miners/_types/whatsminer/M2X/M20S.py index 20c5fffd..2d46b029 100644 --- a/miners/_types/whatsminer/M2X/M20S.py +++ b/miners/_types/whatsminer/M2X/M20S.py @@ -7,3 +7,4 @@ class M20S(BaseMiner): self.ip = ip self.model = "M20S" self.nominal_chips = 66 + self.fan_count = 2 diff --git a/miners/_types/whatsminer/M2X/M20S_Plus.py b/miners/_types/whatsminer/M2X/M20S_Plus.py index c6294d35..f836b5ea 100644 --- a/miners/_types/whatsminer/M2X/M20S_Plus.py +++ b/miners/_types/whatsminer/M2X/M20S_Plus.py @@ -7,3 +7,4 @@ class M20SPlus(BaseMiner): self.ip = ip self.model = "M20S+" self.nominal_chips = 66 + self.fan_count = 2 diff --git a/miners/_types/whatsminer/M2X/M21.py b/miners/_types/whatsminer/M2X/M21.py index dcff5b06..acfdc594 100644 --- a/miners/_types/whatsminer/M2X/M21.py +++ b/miners/_types/whatsminer/M2X/M21.py @@ -7,3 +7,4 @@ class M21(BaseMiner): self.ip = ip self.model = "M21" self.nominal_chips = 105 + self.fan_count = 2 diff --git a/miners/_types/whatsminer/M2X/M21S.py b/miners/_types/whatsminer/M2X/M21S.py index 16cce782..5e18fbb7 100644 --- a/miners/_types/whatsminer/M2X/M21S.py +++ b/miners/_types/whatsminer/M2X/M21S.py @@ -7,3 +7,4 @@ class M21S(BaseMiner): self.ip = ip self.model = "M21S" self.nominal_chips = 105 + self.fan_count = 2 diff --git a/miners/_types/whatsminer/M2X/M21S_Plus.py b/miners/_types/whatsminer/M2X/M21S_Plus.py index b0814e66..0171437a 100644 --- a/miners/_types/whatsminer/M2X/M21S_Plus.py +++ b/miners/_types/whatsminer/M2X/M21S_Plus.py @@ -7,3 +7,4 @@ class M21SPlus(BaseMiner): self.ip = ip self.model = "M21S+" self.nominal_chips = 105 + self.fan_count = 2 diff --git a/miners/_types/whatsminer/M3X/M30S.py b/miners/_types/whatsminer/M3X/M30S.py index a0d5176a..8dcb7b15 100644 --- a/miners/_types/whatsminer/M3X/M30S.py +++ b/miners/_types/whatsminer/M3X/M30S.py @@ -6,3 +6,5 @@ class M30S(BaseMiner): super().__init__() self.ip = ip self.model = "M30S" + # TODO: Add chip count for this miner (per board) - self.nominal_chips + self.fan_count = 2 diff --git a/miners/_types/whatsminer/M3X/M30S_Plus.py b/miners/_types/whatsminer/M3X/M30S_Plus.py index ded70aca..70882ab9 100644 --- a/miners/_types/whatsminer/M3X/M30S_Plus.py +++ b/miners/_types/whatsminer/M3X/M30S_Plus.py @@ -7,3 +7,4 @@ class M30SPlus(BaseMiner): self.ip = ip self.model = "M30S+" self.nominal_chips = 156 + self.fan_count = 2 diff --git a/miners/_types/whatsminer/M3X/M30S_Plus_Plus.py b/miners/_types/whatsminer/M3X/M30S_Plus_Plus.py index 7a7f2119..484a7df3 100644 --- a/miners/_types/whatsminer/M3X/M30S_Plus_Plus.py +++ b/miners/_types/whatsminer/M3X/M30S_Plus_Plus.py @@ -7,6 +7,4 @@ class M30SPlusPlus(BaseMiner): self.ip = ip self.model = "M30S++" self.nominal_chips = 117 - - -# TODO: handle different chip counts, 111, 117,(128) + self.fan_count = 2 diff --git a/miners/_types/whatsminer/M3X/M31S.py b/miners/_types/whatsminer/M3X/M31S.py index adc755a8..7fc5910b 100644 --- a/miners/_types/whatsminer/M3X/M31S.py +++ b/miners/_types/whatsminer/M3X/M31S.py @@ -6,3 +6,5 @@ class M31S(BaseMiner): super().__init__() self.ip = ip self.model = "M31S" + # TODO: Add chip count for this miner (per board) - self.nominal_chips + self.fan_count = 2 diff --git a/miners/_types/whatsminer/M3X/M31S_Plus.py b/miners/_types/whatsminer/M3X/M31S_Plus.py index a3ac448a..929e2471 100644 --- a/miners/_types/whatsminer/M3X/M31S_Plus.py +++ b/miners/_types/whatsminer/M3X/M31S_Plus.py @@ -7,3 +7,4 @@ class M31SPlus(BaseMiner): self.ip = ip self.model = "M31S+" self.nominal_chips = 78 + self.fan_count = 2 diff --git a/miners/_types/whatsminer/M3X/M32S.py b/miners/_types/whatsminer/M3X/M32S.py index 5b200dc2..b8d9d868 100644 --- a/miners/_types/whatsminer/M3X/M32S.py +++ b/miners/_types/whatsminer/M3X/M32S.py @@ -7,3 +7,4 @@ class M32S(BaseMiner): self.ip = ip self.model = "M32S" self.nominal_chips = 78 + self.fan_count = 2 diff --git a/tools/cfg_util/scan/__init__.py b/tools/cfg_util/scan/__init__.py index 2a54ce95..3c52d3bb 100644 --- a/tools/cfg_util/scan/__init__.py +++ b/tools/cfg_util/scan/__init__.py @@ -13,7 +13,7 @@ DATA_HEADER_MAP = { "model": "Model", "hostname": "Hostname", "hashrate": "Hashrate", - "temperature": "Temp", + "temperature_avg": "Temp", "wattage": "Wattage", "ideal_chips": "Ideal", "left_chips": "Left Board",