fixed some bugs with canaan miners not responding properly and returning empty bytes

This commit is contained in:
UpstreamData
2022-01-08 14:33:05 -07:00
parent 2734caa9da
commit d8bccbccaa
2 changed files with 75 additions and 66 deletions

View File

@@ -192,57 +192,65 @@ async def get_formatted_data(ip: ipaddress.ip_address):
try: try:
miner_data = await miner.api.multicommand("summary", "devs", "temps", "tunerstatus", "pools", "stats") miner_data = await miner.api.multicommand("summary", "devs", "temps", "tunerstatus", "pools", "stats")
except APIError: except APIError:
return {'TH/s': "Unknown", 'IP': str(miner.ip), 'host': "Unknown", 'user': "Unknown", 'wattage': 0} return {'TH/s': 0, 'IP': str(miner.ip), 'model': 'Unknown', 'temp': 0, 'host': 'Unknown', 'user': 'Unknown', 'wattage': 0}
host = await miner.get_hostname() host = await miner.get_hostname()
model = await miner.get_model() model = await miner.get_model()
temps = 0 temps = 0
if "summary" in miner_data.keys(): if miner_data:
if "Temperature" in miner_data['summary'][0]['SUMMARY'][0].keys(): if "summary" in miner_data.keys():
if not round(miner_data['summary'][0]['SUMMARY'][0]["Temperature"]) == 0: if "Temperature" in miner_data['summary'][0]['SUMMARY'][0].keys():
temps = miner_data['summary'][0]['SUMMARY'][0]["Temperature"] if not round(miner_data['summary'][0]['SUMMARY'][0]["Temperature"]) == 0:
if 'MHS av' in miner_data['summary'][0]['SUMMARY'][0].keys(): temps = miner_data['summary'][0]['SUMMARY'][0]["Temperature"]
th5s = round(await safe_parse_api_data(miner_data, 'summary', 0, 'SUMMARY', 0, 'MHS av') / 1000000, 2) if 'MHS av' in miner_data['summary'][0]['SUMMARY'][0].keys():
elif 'GHS av' in miner_data['summary'][0]['SUMMARY'][0].keys(): th5s = round(await safe_parse_api_data(miner_data, 'summary', 0, 'SUMMARY', 0, 'MHS av') / 1000000, 2)
if not miner_data['summary'][0]['SUMMARY'][0]['GHS av'] == "": elif 'GHS av' in miner_data['summary'][0]['SUMMARY'][0].keys():
th5s = round(float(await safe_parse_api_data(miner_data, 'summary', 0, 'SUMMARY', 0, 'GHS av')) / 1000, if not miner_data['summary'][0]['SUMMARY'][0]['GHS av'] == "":
2) th5s = round(float(await safe_parse_api_data(miner_data, 'summary', 0, 'SUMMARY', 0, 'GHS av')) / 1000,
2)
else:
th5s = 0
else: else:
th5s = 0 th5s = 0
else: else:
th5s = 0 th5s = 0
if "temps" in miner_data.keys() and not miner_data["temps"][0]['TEMPS'] == []:
if "Chip" in miner_data["temps"][0]['TEMPS'][0].keys():
for board in miner_data["temps"][0]['TEMPS']:
if board["Chip"] is not None and not board["Chip"] == 0.0:
temps = board["Chip"]
if "devs" in miner_data.keys() and not miner_data["devs"][0]['DEVS'] == []:
if "Chip Temp Avg" in miner_data["devs"][0]['DEVS'][0].keys():
for board in miner_data["devs"][0]['DEVS']:
if board['Chip Temp Avg'] is not None and not board['Chip Temp Avg'] == 0.0:
temps = board['Chip Temp Avg']
if "stats" in miner_data.keys() and not miner_data["stats"][0]['STATS'] == []:
for temp in ["temp2", "temp1", "temp3"]:
if temp in miner_data["stats"][0]['STATS'][1].keys():
if miner_data["stats"][0]['STATS'][1][temp] is not None and not miner_data["stats"][0]['STATS'][1][
temp] == 0.0:
temps = miner_data["stats"][0]['STATS'][1][temp]
if "pools" not in miner_data.keys():
user = "?"
elif not miner_data['pools'][0]['POOLS'] == []:
user = await safe_parse_api_data(miner_data, 'pools', 0, 'POOLS', 0, 'User')
else:
user = "Blank"
if "tunerstatus" in miner_data.keys():
wattage = await safe_parse_api_data(miner_data, "tunerstatus", 0, 'TUNERSTATUS', 0, "PowerLimit")
elif "Power" in miner_data["summary"][0]["SUMMARY"][0].keys():
wattage = await safe_parse_api_data(miner_data, "summary", 0, 'SUMMARY', 0, "Power")
else:
wattage = 0
else: else:
th5s = 0 th5s = 0
if "temps" in miner_data.keys() and not miner_data["temps"][0]['TEMPS'] == []: user = "Unknown"
if "Chip" in miner_data["temps"][0]['TEMPS'][0].keys():
for board in miner_data["temps"][0]['TEMPS']:
if board["Chip"] is not None and not board["Chip"] == 0.0:
temps = board["Chip"]
if "devs" in miner_data.keys() and not miner_data["devs"][0]['DEVS'] == []:
if "Chip Temp Avg" in miner_data["devs"][0]['DEVS'][0].keys():
for board in miner_data["devs"][0]['DEVS']:
if board['Chip Temp Avg'] is not None and not board['Chip Temp Avg'] == 0.0:
temps = board['Chip Temp Avg']
if "stats" in miner_data.keys() and not miner_data["stats"][0]['STATS'] == []:
for temp in ["temp2", "temp1", "temp3"]:
if temp in miner_data["stats"][0]['STATS'][1].keys():
if miner_data["stats"][0]['STATS'][1][temp] is not None and not miner_data["stats"][0]['STATS'][1][
temp] == 0.0:
temps = miner_data["stats"][0]['STATS'][1][temp]
if "pools" not in miner_data.keys():
user = "?"
elif not miner_data['pools'][0]['POOLS'] == []:
user = await safe_parse_api_data(miner_data, 'pools', 0, 'POOLS', 0, 'User')
else:
user = "Blank"
if "tunerstatus" in miner_data.keys():
wattage = await safe_parse_api_data(miner_data, "tunerstatus", 0, 'TUNERSTATUS', 0, "PowerLimit")
elif "Power" in miner_data["summary"][0]["SUMMARY"][0].keys():
wattage = await safe_parse_api_data(miner_data, "summary", 0, 'SUMMARY', 0, "Power")
else:
wattage = 0 wattage = 0
if not model:
model = "Error"
return {'TH/s': th5s, 'IP': str(miner.ip), 'model': model, return {'TH/s': th5s, 'IP': str(miner.ip), 'model': model,
'temp': round(temps), 'host': host, 'user': user, 'temp': round(temps), 'host': host, 'user': user,
'wattage': wattage} 'wattage': wattage}

View File

@@ -106,22 +106,23 @@ class MinerFactory:
model = None model = None
try: try:
data = await self._send_api_command(str(ip), "devdetails") data = await self._send_api_command(str(ip), "devdetails")
if data.get("STATUS"): if data:
if not isinstance(data["STATUS"], str): if data.get("STATUS"):
if data["STATUS"][0].get("STATUS") not in ["I", "S"]: if not isinstance(data["STATUS"], str):
if data["STATUS"][0].get("STATUS") not in ["I", "S"]:
try:
data = await self._send_api_command(str(ip), "version")
model = data["VERSION"][0]["Type"]
except:
print(f"Get Model Exception: {ip}")
else:
model = data["DEVDETAILS"][0]["Model"]
else:
try: try:
data = await self._send_api_command(str(ip), "version") data = await self._send_api_command(str(ip), "version")
model = data["VERSION"][0]["Type"] model = data["VERSION"][0]["Type"]
except: except:
print(f"Get Model Exception: {ip}") print(f"Get Model Exception: {ip}")
else:
model = data["DEVDETAILS"][0]["Model"]
else:
try:
data = await self._send_api_command(str(ip), "version")
model = data["VERSION"][0]["Type"]
except:
print(f"Get Model Exception: {ip}")
if model: if model:
return model return model
except OSError as e: except OSError as e:
@@ -176,12 +177,11 @@ class MinerFactory:
# fix an error with a bmminer return not having a specific comma that breaks json.loads() # fix an error with a bmminer return not having a specific comma that breaks json.loads()
str_data = str_data.replace("}{", "},{") str_data = str_data.replace("}{", "},{")
# parse the json # parse the json
parsed_data = json.loads(str_data) data = json.loads(str_data)
# handle bad json # handle bad json
except json.decoder.JSONDecodeError as e: except json.decoder.JSONDecodeError as e:
print(e) # raise APIError(f"Decode Error: {data}")
raise APIError(f"Decode Error: {data}") data = None
data = parsed_data
# close the connection # close the connection
writer.close() writer.close()
@@ -195,16 +195,17 @@ class MinerFactory:
api = None api = None
try: try:
data = await self._send_api_command(str(ip), "version") data = await self._send_api_command(str(ip), "version")
if data.get("STATUS") and not data.get("STATUS") == "E": if data:
if data["STATUS"][0].get("STATUS") in ["I", "S"]: if data.get("STATUS") and not data.get("STATUS") == "E":
if any("BMMiner" in string for string in data["VERSION"][0].keys()): if data["STATUS"][0].get("STATUS") in ["I", "S"]:
api = "BMMiner" if any("BMMiner" in string for string in data["VERSION"][0].keys()):
elif any("CGMiner" in string for string in data["VERSION"][0].keys()): api = "BMMiner"
api = "CGMiner" elif any("CGMiner" in string for string in data["VERSION"][0].keys()):
elif any("BOSminer" in string for string in data["VERSION"][0].keys()): api = "CGMiner"
api = "BOSMiner" elif any("BOSminer" in string for string in data["VERSION"][0].keys()):
elif data.get("Description") and "whatsminer" in data.get("Description"): api = "BOSMiner"
api = "BTMiner" elif data.get("Description") and "whatsminer" in data.get("Description"):
api = "BTMiner"
if api: if api:
return api return api
except OSError as e: except OSError as e: