from miners.cgminer import CGMiner import re class CGMinerAvalon8(CGMiner): def __init__(self, ip: str) -> None: super().__init__(ip) self.model = "Avalon 8" self.api_type = "CGMiner" self.pattern = re.compile( r"Ver\[(?P[-0-9A-Fa-f+]+)\]\s" "DNA\[(?P[0-9A-Fa-f]+)\]\s" "Elapsed\[(?P[-0-9]+)\]\s" "MW\[(?P[-\s0-9]+)\]\s" "LW\[(?P[-0-9]+)\]\s" "MH\[(?P[-\s0-9]+)\]\s" "HW\[(?P[-0-9]+)\]\s" "Temp\[(?P[0-9]+)\]\s" "TMax\[(?P[0-9]+)\]\s" "Fan\[(?P[0-9]+)\]\s" "FanR\[(?P[0-9]+)%\]\s" "Vi\[(?P[-\s0-9]+)\]\s" "Vo\[(?P[-\s0-9]+)\]\s" "(" "PLL0\[(?P[-\s0-9]+)\]\s" "PLL1\[(?P[-\s0-9]+)\]\s" "PLL2\[(?P[-\s0-9]+)\]\s" "PLL3\[(?P[-\s0-9]+)\]\s" ")?" "GHSmm\[(?P[-.0-9]+)\]\s" "WU\[(?P[-.0-9]+)\]\s" "Freq\[(?P[.0-9]+)\]\s" "PG\[(?P[0-9]+)\]\s" "Led\[(?P0|1)\]\s" "MW0\[(?P[0-9\s]+)\]\s" "MW1\[(?P[0-9\s]+)\]\s" "MW2\[(?P[0-9\s]+)\]\s" "MW3\[(?P[0-9\s]+)\]\s" "TA\[(?P[0-9]+)\]\s" "ECHU\[(?P[0-9\s]+)\]\s" "ECMM\[(?P[0-9]+)\]\s.*" "FAC0\[(?P[-0-9]+)\]\s" "OC\[(?P[0-9]+)\]\s" "SF0\[(?P[-\s0-9]+)\]\s" "SF1\[(?P[-\s0-9]+)\]\s" "SF2\[(?P[-\s0-9]+)\]\s" "SF3\[(?P[-\s0-9]+)\]\s" "PMUV\[(?P[-\s\S*]+)\]\s" "PVT_T0\[(?P[-0-9\s]+)\]\s" "PVT_T1\[(?P[-0-9\s]+)\]\s" "PVT_T2\[(?P[-0-9\s]+)\]\s" "PVT_T3\[(?P[-0-9\s]+)\]\s" "PVT_V0_0\[(?P[-0-9\s]+)\]\s" "PVT_V0_1\[(?P[-0-9\s]+)\]\s" "PVT_V0_2\[(?P[-0-9\s]+)\]\s" "PVT_V0_3\[(?P[-0-9\s]+)\]\s" "PVT_V0_4\[(?P[-0-9\s]+)\]\s" "PVT_V0_5\[(?P[-0-9\s]+)\]\s" "PVT_V0_6\[(?P[-0-9\s]+)\]\s" "PVT_V0_7\[(?P[-0-9\s]+)\]\s" "PVT_V0_8\[(?P[-0-9\s]+)\]\s" "PVT_V0_9\[(?P[-0-9\s]+)\]\s" "PVT_V0_10\[(?P[-0-9\s]+)\]\s" "PVT_V0_11\[(?P[-0-9\s]+)\]\s" "PVT_V0_12\[(?P[-0-9\s]+)\]\s" "PVT_V0_13\[(?P[-0-9\s]+)\]\s" "PVT_V0_14\[(?P[-0-9\s]+)\]\s" "PVT_V0_15\[(?P[-0-9\s]+)\]\s" "PVT_V0_16\[(?P[-0-9\s]+)\]\s" "PVT_V0_17\[(?P[-0-9\s]+)\]\s" "PVT_V0_18\[(?P[-0-9\s]+)\]\s" "PVT_V0_19\[(?P[-0-9\s]+)\]\s" "PVT_V0_20\[(?P[-0-9\s]+)\]\s" "PVT_V0_21\[(?P[-0-9\s]+)\]\s" "PVT_V0_22\[(?P[-0-9\s]+)\]\s" "PVT_V0_23\[(?P[-0-9\s]+)\]\s" "PVT_V0_24\[(?P[-0-9\s]+)\]\s" "PVT_V0_25\[(?P[-0-9\s]+)\]\s" "PVT_V1_0\[(?P[-0-9\s]+)\]\s" "PVT_V1_1\[(?P[-0-9\s]+)\]\s" "PVT_V1_2\[(?P[-0-9\s]+)\]\s" "PVT_V1_3\[(?P[-0-9\s]+)\]\s" "PVT_V1_4\[(?P[-0-9\s]+)\]\s" "PVT_V1_5\[(?P[-0-9\s]+)\]\s" "PVT_V1_6\[(?P[-0-9\s]+)\]\s" "PVT_V1_7\[(?P[-0-9\s]+)\]\s" "PVT_V1_8\[(?P[-0-9\s]+)\]\s" "PVT_V1_9\[(?P[-0-9\s]+)\]\s" "PVT_V1_10\[(?P[-0-9\s]+)\]\s" "PVT_V1_11\[(?P[-0-9\s]+)\]\s" "PVT_V1_12\[(?P[-0-9\s]+)\]\s" "PVT_V1_13\[(?P[-0-9\s]+)\]\s" "PVT_V1_14\[(?P[-0-9\s]+)\]\s" "PVT_V1_15\[(?P[-0-9\s]+)\]\s" "PVT_V1_16\[(?P[-0-9\s]+)\]\s" "PVT_V1_17\[(?P[-0-9\s]+)\]\s" "PVT_V1_18\[(?P[-0-9\s]+)\]\s" "PVT_V1_19\[(?P[-0-9\s]+)\]\s" "PVT_V1_20\[(?P[-0-9\s]+)\]\s" "PVT_V1_21\[(?P[-0-9\s]+)\]\s" "PVT_V1_22\[(?P[-0-9\s]+)\]\s" "PVT_V1_23\[(?P[-0-9\s]+)\]\s" "PVT_V1_24\[(?P[-0-9\s]+)\]\s" "PVT_V1_25\[(?P[-0-9\s]+)\]\s" "PVT_V2_0\[(?P[-0-9\s]+)\]\s" "PVT_V2_1\[(?P[-0-9\s]+)\]\s" "PVT_V2_2\[(?P[-0-9\s]+)\]\s" "PVT_V2_3\[(?P[-0-9\s]+)\]\s" "PVT_V2_4\[(?P[-0-9\s]+)\]\s" "PVT_V2_5\[(?P[-0-9\s]+)\]\s" "PVT_V2_6\[(?P[-0-9\s]+)\]\s" "PVT_V2_7\[(?P[-0-9\s]+)\]\s" "PVT_V2_8\[(?P[-0-9\s]+)\]\s" "PVT_V2_9\[(?P[-0-9\s]+)\]\s" "PVT_V2_10\[(?P[-0-9\s]+)\]\s" "PVT_V2_11\[(?P[-0-9\s]+)\]\s" "PVT_V2_12\[(?P[-0-9\s]+)\]\s" "PVT_V2_13\[(?P[-0-9\s]+)\]\s" "PVT_V2_14\[(?P[-0-9\s]+)\]\s" "PVT_V2_15\[(?P[-0-9\s]+)\]\s" "PVT_V2_16\[(?P[-0-9\s]+)\]\s" "PVT_V2_17\[(?P[-0-9\s]+)\]\s" "PVT_V2_18\[(?P[-0-9\s]+)\]\s" "PVT_V2_19\[(?P[-0-9\s]+)\]\s" "PVT_V2_20\[(?P[-0-9\s]+)\]\s" "PVT_V2_21\[(?P[-0-9\s]+)\]\s" "PVT_V2_22\[(?P[-0-9\s]+)\]\s" "PVT_V2_23\[(?P[-0-9\s]+)\]\s" "PVT_V2_24\[(?P[-0-9\s]+)\]\s" "PVT_V2_25\[(?P[-0-9\s]+)\]\s" "PVT_V3_0\[(?P[-0-9\s]+)\]\s" "PVT_V3_1\[(?P[-0-9\s]+)\]\s" "PVT_V3_2\[(?P[-0-9\s]+)\]\s" "PVT_V3_3\[(?P[-0-9\s]+)\]\s" "PVT_V3_4\[(?P[-0-9\s]+)\]\s" "PVT_V3_5\[(?P[-0-9\s]+)\]\s" "PVT_V3_6\[(?P[-0-9\s]+)\]\s" "PVT_V3_7\[(?P[-0-9\s]+)\]\s" "PVT_V3_8\[(?P[-0-9\s]+)\]\s" "PVT_V3_9\[(?P[-0-9\s]+)\]\s" "PVT_V3_10\[(?P[-0-9\s]+)\]\s" "PVT_V3_11\[(?P[-0-9\s]+)\]\s" "PVT_V3_12\[(?P[-0-9\s]+)\]\s" "PVT_V3_13\[(?P[-0-9\s]+)\]\s" "PVT_V3_14\[(?P[-0-9\s]+)\]\s" "PVT_V3_15\[(?P[-0-9\s]+)\]\s" "PVT_V3_16\[(?P[-0-9\s]+)\]\s" "PVT_V3_17\[(?P[-0-9\s]+)\]\s" "PVT_V3_18\[(?P[-0-9\s]+)\]\s" "PVT_V3_19\[(?P[-0-9\s]+)\]\s" "PVT_V3_20\[(?P[-0-9\s]+)\]\s" "PVT_V3_21\[(?P[-0-9\s]+)\]\s" "PVT_V3_22\[(?P[-0-9\s]+)\]\s" "PVT_V3_23\[(?P[-0-9\s]+)\]\s" "PVT_V3_24\[(?P[-0-9\s]+)\]\s" "PVT_V3_25\[(?P[-0-9\s]+)\]\s" "FM\[(?P[0-9]+)\]\s" "CRC\[(?P[0-9\s]+)\]", re.X, ) def __repr__(self) -> str: return f"CGMinerAvalon8: {str(self.ip)}" def parse_estats(self, estats): for estat in estats: for key in estat: if key[:5] == "MM ID": self._parse_estat(estat, key) def _parse_estat(self, estat, key): module = estat[key] module_info = re.match(self.pattern, module) if not module_info: return None module_info = module_info.groupdict() print(module_info)