refactor: use protocol for BaseMiner and update attributes to be part of the class rather than a __init__ method.
This commit is contained in:
@@ -36,7 +36,7 @@ class Pool(MinerConfigValue):
|
|||||||
}
|
}
|
||||||
return {"url": self.url, "user": self.user, "pass": self.password}
|
return {"url": self.url, "user": self.user, "pass": self.password}
|
||||||
|
|
||||||
def as_wm(self, idx: int, user_suffix: str = None):
|
def as_wm(self, idx: int = 1, user_suffix: str = None):
|
||||||
if user_suffix is not None:
|
if user_suffix is not None:
|
||||||
return {
|
return {
|
||||||
f"pool_{idx}": self.url,
|
f"pool_{idx}": self.url,
|
||||||
@@ -49,7 +49,7 @@ class Pool(MinerConfigValue):
|
|||||||
f"passwd_{idx}": self.password,
|
f"passwd_{idx}": self.password,
|
||||||
}
|
}
|
||||||
|
|
||||||
def as_am_old(self, idx: int, user_suffix: str = None):
|
def as_am_old(self, idx: int = 1, user_suffix: str = None):
|
||||||
if user_suffix is not None:
|
if user_suffix is not None:
|
||||||
return {
|
return {
|
||||||
f"_ant_pool{idx}url": self.url,
|
f"_ant_pool{idx}url": self.url,
|
||||||
@@ -76,7 +76,7 @@ class Pool(MinerConfigValue):
|
|||||||
return ",".join([self.url, f"{self.user}{user_suffix}", self.password])
|
return ",".join([self.url, f"{self.user}{user_suffix}", self.password])
|
||||||
return ",".join([self.url, self.user, self.password])
|
return ",".join([self.url, self.user, self.password])
|
||||||
|
|
||||||
def as_inno(self, idx: int, user_suffix: str = None):
|
def as_inno(self, idx: int = 1, user_suffix: str = None):
|
||||||
if user_suffix is not None:
|
if user_suffix is not None:
|
||||||
return {
|
return {
|
||||||
f"Pool{idx}": self.url,
|
f"Pool{idx}": self.url,
|
||||||
|
|||||||
@@ -59,18 +59,17 @@ class TemperatureConfig(MinerConfigValue):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_epic(cls, web_conf: dict) -> "TemperatureConfig":
|
def from_epic(cls, web_conf: dict) -> "TemperatureConfig":
|
||||||
dangerous_temp = None
|
|
||||||
try:
|
try:
|
||||||
hot_temp = web_conf["Misc"]["Shutdown Temp"]
|
dangerous_temp = web_conf["Misc"]["Shutdown Temp"]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
hot_temp = None
|
dangerous_temp = None
|
||||||
# Need to do this in two blocks to avoid KeyError if one is missing
|
# Need to do this in two blocks to avoid KeyError if one is missing
|
||||||
try:
|
try:
|
||||||
target_temp = web_conf["Fans"]["Fan Mode"]["Auto"]["Target Temperature"]
|
target_temp = web_conf["Fans"]["Fan Mode"]["Auto"]["Target Temperature"]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
target_temp = None
|
target_temp = None
|
||||||
|
|
||||||
return cls(target=target_temp, hot=hot_temp, danger=dangerous_temp)
|
return cls(target=target_temp, danger=dangerous_temp)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_vnish(cls, web_settings: dict):
|
def from_vnish(cls, web_settings: dict):
|
||||||
|
|||||||
@@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
import copy
|
import copy
|
||||||
import json
|
import json
|
||||||
import logging
|
|
||||||
import time
|
import time
|
||||||
from dataclasses import asdict, dataclass, field, fields
|
from dataclasses import asdict, dataclass, field, fields
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
|
|||||||
@@ -17,8 +17,6 @@
|
|||||||
from pyasic.miners.backends import AntminerModern
|
from pyasic.miners.backends import AntminerModern
|
||||||
from pyasic.miners.types import T19
|
from pyasic.miners.types import T19
|
||||||
|
|
||||||
# noqa - Ignore access to _module
|
|
||||||
|
|
||||||
|
|
||||||
class BMMinerT19(AntminerModern, T19):
|
class BMMinerT19(AntminerModern, T19):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -19,6 +19,4 @@ from pyasic.miners.types import HS3
|
|||||||
|
|
||||||
|
|
||||||
class BMMinerHS3(AntminerModern, HS3):
|
class BMMinerHS3(AntminerModern, HS3):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
supports_shutdown = False
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
self.supports_shutdown = False
|
|
||||||
|
|||||||
@@ -18,6 +18,4 @@ from pyasic.miners.types import L7
|
|||||||
|
|
||||||
|
|
||||||
class BMMinerL7(AntminerModern, L7):
|
class BMMinerL7(AntminerModern, L7):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
supports_shutdown = False
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
self.supports_shutdown = False
|
|
||||||
|
|||||||
@@ -19,6 +19,4 @@ from pyasic.miners.types import E9Pro
|
|||||||
|
|
||||||
|
|
||||||
class BMMinerE9Pro(AntminerModern, E9Pro):
|
class BMMinerE9Pro(AntminerModern, E9Pro):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
supports_shutdown = False
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
self.supports_shutdown = False
|
|
||||||
|
|||||||
@@ -19,6 +19,4 @@ from pyasic.miners.types import Z15
|
|||||||
|
|
||||||
|
|
||||||
class CGMinerZ15(AntminerOld, Z15):
|
class CGMinerZ15(AntminerOld, Z15):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
supports_shutdown = False
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
self.supports_shutdown = False
|
|
||||||
|
|||||||
@@ -18,6 +18,4 @@ from pyasic.miners.types import D3
|
|||||||
|
|
||||||
|
|
||||||
class CGMinerD3(AntminerOld, D3):
|
class CGMinerD3(AntminerOld, D3):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
supports_shutdown = False
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
self.supports_shutdown = False
|
|
||||||
|
|||||||
@@ -19,6 +19,4 @@ from pyasic.miners.types import DR5
|
|||||||
|
|
||||||
|
|
||||||
class CGMinerDR5(AntminerOld, DR5):
|
class CGMinerDR5(AntminerOld, DR5):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
supports_shutdown = False
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
self.supports_shutdown = False
|
|
||||||
|
|||||||
@@ -21,10 +21,53 @@ import asyncssh
|
|||||||
from pyasic.data import HashBoard
|
from pyasic.data import HashBoard
|
||||||
from pyasic.errors import APIError
|
from pyasic.errors import APIError
|
||||||
from pyasic.miners.backends import Hiveon
|
from pyasic.miners.backends import Hiveon
|
||||||
|
from pyasic.miners.base import DataFunction, DataLocations, DataOptions, RPCAPICommand
|
||||||
from pyasic.miners.types import T9
|
from pyasic.miners.types import T9
|
||||||
|
|
||||||
|
HIVEON_T9_DATA_LOC = DataLocations(
|
||||||
|
**{
|
||||||
|
str(DataOptions.API_VERSION): DataFunction(
|
||||||
|
"_get_api_ver",
|
||||||
|
[RPCAPICommand("api_version", "version")],
|
||||||
|
),
|
||||||
|
str(DataOptions.FW_VERSION): DataFunction(
|
||||||
|
"_get_fw_ver",
|
||||||
|
[RPCAPICommand("api_version", "version")],
|
||||||
|
),
|
||||||
|
str(DataOptions.HASHRATE): DataFunction(
|
||||||
|
"_get_hashrate",
|
||||||
|
[RPCAPICommand("api_summary", "summary")],
|
||||||
|
),
|
||||||
|
str(DataOptions.EXPECTED_HASHRATE): DataFunction(
|
||||||
|
"_get_expected_hashrate",
|
||||||
|
[RPCAPICommand("api_stats", "stats")],
|
||||||
|
),
|
||||||
|
str(DataOptions.HASHBOARDS): DataFunction(
|
||||||
|
"_get_hashboards",
|
||||||
|
[RPCAPICommand("api_stats", "stats")],
|
||||||
|
),
|
||||||
|
str(DataOptions.ENVIRONMENT_TEMP): DataFunction(
|
||||||
|
"_get_env_temp",
|
||||||
|
[RPCAPICommand("api_stats", "stats")],
|
||||||
|
),
|
||||||
|
str(DataOptions.WATTAGE): DataFunction(
|
||||||
|
"_get_wattage",
|
||||||
|
[RPCAPICommand("api_stats", "stats")],
|
||||||
|
),
|
||||||
|
str(DataOptions.FANS): DataFunction(
|
||||||
|
"_get_fans",
|
||||||
|
[RPCAPICommand("api_stats", "stats")],
|
||||||
|
),
|
||||||
|
str(DataOptions.UPTIME): DataFunction(
|
||||||
|
"_get_uptime",
|
||||||
|
[RPCAPICommand("api_stats", "stats")],
|
||||||
|
),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class HiveonT9(Hiveon, T9):
|
class HiveonT9(Hiveon, T9):
|
||||||
|
data_locations = HIVEON_T9_DATA_LOC
|
||||||
|
|
||||||
##################################################
|
##################################################
|
||||||
### DATA GATHERING FUNCTIONS (get_{some_data}) ###
|
### DATA GATHERING FUNCTIONS (get_{some_data}) ###
|
||||||
|
|||||||
@@ -19,5 +19,4 @@ from pyasic.miners.types import L3Plus
|
|||||||
|
|
||||||
|
|
||||||
class VnishL3Plus(VNish, L3Plus):
|
class VnishL3Plus(VNish, L3Plus):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
pass
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
|
|||||||
@@ -14,9 +14,9 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.backends import CGMinerAvalon
|
from pyasic.miners.backends import AvalonMiner
|
||||||
from pyasic.miners.types import Avalon1026
|
from pyasic.miners.types import Avalon1026
|
||||||
|
|
||||||
|
|
||||||
class CGMinerAvalon1026(CGMinerAvalon, Avalon1026):
|
class CGMinerAvalon1026(AvalonMiner, Avalon1026):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -14,9 +14,9 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.backends import CGMinerAvalon
|
from pyasic.miners.backends import AvalonMiner
|
||||||
from pyasic.miners.types import Avalon1047
|
from pyasic.miners.types import Avalon1047
|
||||||
|
|
||||||
|
|
||||||
class CGMinerAvalon1047(CGMinerAvalon, Avalon1047):
|
class CGMinerAvalon1047(AvalonMiner, Avalon1047):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -14,9 +14,9 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.backends import CGMinerAvalon
|
from pyasic.miners.backends import AvalonMiner
|
||||||
from pyasic.miners.types import Avalon1066
|
from pyasic.miners.types import Avalon1066
|
||||||
|
|
||||||
|
|
||||||
class CGMinerAvalon1066(CGMinerAvalon, Avalon1066):
|
class CGMinerAvalon1066(AvalonMiner, Avalon1066):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -14,9 +14,9 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.backends import CGMinerAvalon
|
from pyasic.miners.backends import AvalonMiner
|
||||||
from pyasic.miners.types import Avalon1166Pro
|
from pyasic.miners.types import Avalon1166Pro
|
||||||
|
|
||||||
|
|
||||||
class CGMinerAvalon1166Pro(CGMinerAvalon, Avalon1166Pro):
|
class CGMinerAvalon1166Pro(AvalonMiner, Avalon1166Pro):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -14,9 +14,9 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.backends import CGMinerAvalon
|
from pyasic.miners.backends import AvalonMiner
|
||||||
from pyasic.miners.types import Avalon1246
|
from pyasic.miners.types import Avalon1246
|
||||||
|
|
||||||
|
|
||||||
class CGMinerAvalon1246(CGMinerAvalon, Avalon1246):
|
class CGMinerAvalon1246(AvalonMiner, Avalon1246):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -14,9 +14,9 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.backends import CGMinerAvalon
|
from pyasic.miners.backends import AvalonMiner
|
||||||
from pyasic.miners.types import Avalon721
|
from pyasic.miners.types import Avalon721
|
||||||
|
|
||||||
|
|
||||||
class CGMinerAvalon721(CGMinerAvalon, Avalon721):
|
class CGMinerAvalon721(AvalonMiner, Avalon721):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -14,9 +14,9 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.backends import CGMinerAvalon
|
from pyasic.miners.backends import AvalonMiner
|
||||||
from pyasic.miners.types import Avalon741
|
from pyasic.miners.types import Avalon741
|
||||||
|
|
||||||
|
|
||||||
class CGMinerAvalon741(CGMinerAvalon, Avalon741):
|
class CGMinerAvalon741(AvalonMiner, Avalon741):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -14,9 +14,9 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.backends import CGMinerAvalon
|
from pyasic.miners.backends import AvalonMiner
|
||||||
from pyasic.miners.types import Avalon761
|
from pyasic.miners.types import Avalon761
|
||||||
|
|
||||||
|
|
||||||
class CGMinerAvalon761(CGMinerAvalon, Avalon761):
|
class CGMinerAvalon761(AvalonMiner, Avalon761):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -14,9 +14,9 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.backends import CGMinerAvalon
|
from pyasic.miners.backends import AvalonMiner
|
||||||
from pyasic.miners.types import Avalon821
|
from pyasic.miners.types import Avalon821
|
||||||
|
|
||||||
|
|
||||||
class CGMinerAvalon821(CGMinerAvalon, Avalon821):
|
class CGMinerAvalon821(AvalonMiner, Avalon821):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -14,9 +14,9 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.backends import CGMinerAvalon
|
from pyasic.miners.backends import AvalonMiner
|
||||||
from pyasic.miners.types import Avalon841
|
from pyasic.miners.types import Avalon841
|
||||||
|
|
||||||
|
|
||||||
class CGMinerAvalon841(CGMinerAvalon, Avalon841):
|
class CGMinerAvalon841(AvalonMiner, Avalon841):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -14,9 +14,9 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.backends import CGMinerAvalon
|
from pyasic.miners.backends import AvalonMiner
|
||||||
from pyasic.miners.types import Avalon851
|
from pyasic.miners.types import Avalon851
|
||||||
|
|
||||||
|
|
||||||
class CGMinerAvalon851(CGMinerAvalon, Avalon851):
|
class CGMinerAvalon851(AvalonMiner, Avalon851):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -14,9 +14,9 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.backends import CGMinerAvalon
|
from pyasic.miners.backends import AvalonMiner
|
||||||
from pyasic.miners.types import Avalon921
|
from pyasic.miners.types import Avalon921
|
||||||
|
|
||||||
|
|
||||||
class CGMinerAvalon921(CGMinerAvalon, Avalon921):
|
class CGMinerAvalon921(AvalonMiner, Avalon921):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -14,14 +14,14 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
from .antminer import AntminerModern, AntminerOld
|
from .antminer import AntminerModern, AntminerOld
|
||||||
|
from .avalonminer import AvalonMiner
|
||||||
from .bfgminer import BFGMiner
|
from .bfgminer import BFGMiner
|
||||||
from .bfgminer_goldshell import BFGMinerGoldshell
|
|
||||||
from .bmminer import BMMiner
|
from .bmminer import BMMiner
|
||||||
from .braiins_os import BOSer, BOSMiner
|
from .braiins_os import BOSer, BOSMiner
|
||||||
from .btminer import BTMiner
|
from .btminer import BTMiner
|
||||||
from .cgminer import CGMiner
|
from .cgminer import CGMiner
|
||||||
from .cgminer_avalon import CGMinerAvalon
|
|
||||||
from .epic import ePIC
|
from .epic import ePIC
|
||||||
|
from .goldshell import GoldshellMiner
|
||||||
from .hiveon import Hiveon
|
from .hiveon import Hiveon
|
||||||
from .luxminer import LUXMiner
|
from .luxminer import LUXMiner
|
||||||
from .vnish import VNish
|
from .vnish import VNish
|
||||||
|
|||||||
@@ -82,16 +82,13 @@ ANTMINER_MODERN_DATA_LOC = DataLocations(
|
|||||||
|
|
||||||
|
|
||||||
class AntminerModern(BMMiner):
|
class AntminerModern(BMMiner):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
|
"""Handler for AntMiners with the modern web interface, such as S19"""
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
# interfaces
|
|
||||||
self.web = AntminerModernWebAPI(ip)
|
|
||||||
|
|
||||||
# static data
|
_web_cls = AntminerModernWebAPI
|
||||||
# data gathering locations
|
|
||||||
self.data_locations = ANTMINER_MODERN_DATA_LOC
|
data_locations = ANTMINER_MODERN_DATA_LOC
|
||||||
# autotuning/shutdown support
|
|
||||||
self.supports_shutdown = True
|
supports_shutdown = True
|
||||||
|
|
||||||
async def get_config(self) -> MinerConfig:
|
async def get_config(self) -> MinerConfig:
|
||||||
data = await self.web.get_miner_conf()
|
data = await self.web.get_miner_conf()
|
||||||
@@ -233,7 +230,9 @@ class AntminerModern(BMMiner):
|
|||||||
pass
|
pass
|
||||||
return hashboards
|
return hashboards
|
||||||
|
|
||||||
async def _get_fault_light(self, web_get_blink_status: dict = None) -> bool:
|
async def _get_fault_light(
|
||||||
|
self, web_get_blink_status: dict = None
|
||||||
|
) -> Optional[bool]:
|
||||||
if self.light:
|
if self.light:
|
||||||
return self.light
|
return self.light
|
||||||
|
|
||||||
@@ -364,10 +363,6 @@ ANTMINER_OLD_DATA_LOC = DataLocations(
|
|||||||
"_get_hashrate",
|
"_get_hashrate",
|
||||||
[RPCAPICommand("api_summary", "summary")],
|
[RPCAPICommand("api_summary", "summary")],
|
||||||
),
|
),
|
||||||
str(DataOptions.EXPECTED_HASHRATE): DataFunction(
|
|
||||||
"_get_expected_hashrate",
|
|
||||||
[RPCAPICommand("api_stats", "stats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.HASHBOARDS): DataFunction(
|
str(DataOptions.HASHBOARDS): DataFunction(
|
||||||
"_get_hashboards",
|
"_get_hashboards",
|
||||||
[RPCAPICommand("api_stats", "stats")],
|
[RPCAPICommand("api_stats", "stats")],
|
||||||
@@ -393,14 +388,11 @@ ANTMINER_OLD_DATA_LOC = DataLocations(
|
|||||||
|
|
||||||
|
|
||||||
class AntminerOld(CGMiner):
|
class AntminerOld(CGMiner):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
|
"""Handler for AntMiners with the old web interface, such as S17"""
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
# interfaces
|
|
||||||
self.web = AntminerOldWebAPI(ip)
|
|
||||||
|
|
||||||
# static data
|
_web_cls = AntminerOldWebAPI
|
||||||
# data gathering locations
|
|
||||||
self.data_locations = ANTMINER_OLD_DATA_LOC
|
data_locations = ANTMINER_OLD_DATA_LOC
|
||||||
|
|
||||||
async def get_config(self) -> MinerConfig:
|
async def get_config(self) -> MinerConfig:
|
||||||
data = await self.web.get_miner_conf()
|
data = await self.web.get_miner_conf()
|
||||||
@@ -449,7 +441,9 @@ class AntminerOld(CGMiner):
|
|||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
async def _get_fault_light(self, web_get_blink_status: dict = None) -> bool:
|
async def _get_fault_light(
|
||||||
|
self, web_get_blink_status: dict = None
|
||||||
|
) -> Optional[bool]:
|
||||||
if self.light:
|
if self.light:
|
||||||
return self.light
|
return self.light
|
||||||
|
|
||||||
|
|||||||
@@ -17,11 +17,9 @@
|
|||||||
import re
|
import re
|
||||||
from typing import List, Optional
|
from typing import List, Optional
|
||||||
|
|
||||||
from pyasic.config import MinerConfig
|
|
||||||
from pyasic.data import Fan, HashBoard
|
from pyasic.data import Fan, HashBoard
|
||||||
from pyasic.data.error_codes import MinerErrorData
|
|
||||||
from pyasic.errors import APIError
|
from pyasic.errors import APIError
|
||||||
from pyasic.miners.backends import CGMiner
|
from pyasic.miners.backends.cgminer import CGMiner
|
||||||
from pyasic.miners.base import DataFunction, DataLocations, DataOptions, RPCAPICommand
|
from pyasic.miners.base import DataFunction, DataLocations, DataOptions, RPCAPICommand
|
||||||
|
|
||||||
AVALON_DATA_LOC = DataLocations(
|
AVALON_DATA_LOC = DataLocations(
|
||||||
@@ -70,12 +68,10 @@ AVALON_DATA_LOC = DataLocations(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class CGMinerAvalon(CGMiner):
|
class AvalonMiner(CGMiner):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
|
"""Handler for Avalon Miners"""
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
|
|
||||||
# data gathering locations
|
data_locations = AVALON_DATA_LOC
|
||||||
self.data_locations = AVALON_DATA_LOC
|
|
||||||
|
|
||||||
async def fault_light_on(self) -> bool:
|
async def fault_light_on(self) -> bool:
|
||||||
try:
|
try:
|
||||||
@@ -108,26 +104,6 @@ class CGMinerAvalon(CGMiner):
|
|||||||
return False
|
return False
|
||||||
return False
|
return False
|
||||||
|
|
||||||
async def stop_mining(self) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def resume_mining(self) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
|
|
||||||
pass
|
|
||||||
# self.config = config
|
|
||||||
# return None
|
|
||||||
# logging.debug(f"{self}: Sending config.") # noqa - This doesnt work...
|
|
||||||
# conf = config.as_avalon(user_suffix=user_suffix)
|
|
||||||
# try:
|
|
||||||
# data = await self.api.ascset( # noqa
|
|
||||||
# 0, "setpool", f"root,root,{conf}"
|
|
||||||
# ) # this should work but doesn't
|
|
||||||
# except APIError:
|
|
||||||
# pass
|
|
||||||
# return data
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def parse_stats(stats):
|
def parse_stats(stats):
|
||||||
_stats_items = re.findall(".+?\\[*?]", stats)
|
_stats_items = re.findall(".+?\\[*?]", stats)
|
||||||
@@ -193,14 +169,6 @@ class CGMinerAvalon(CGMiner):
|
|||||||
except (KeyError, ValueError):
|
except (KeyError, ValueError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_hostname(self) -> Optional[str]:
|
|
||||||
return None
|
|
||||||
# if not mac:
|
|
||||||
# mac = await self.get_mac()
|
|
||||||
#
|
|
||||||
# if mac:
|
|
||||||
# return f"Avalon{mac.replace(':', '')[-6:]}"
|
|
||||||
|
|
||||||
async def _get_hashrate(self, api_devs: dict = None) -> Optional[float]:
|
async def _get_hashrate(self, api_devs: dict = None) -> Optional[float]:
|
||||||
if api_devs is None:
|
if api_devs is None:
|
||||||
try:
|
try:
|
||||||
@@ -292,9 +260,6 @@ class CGMinerAvalon(CGMiner):
|
|||||||
except (IndexError, KeyError, ValueError, TypeError):
|
except (IndexError, KeyError, ValueError, TypeError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_wattage(self) -> Optional[int]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_wattage_limit(self, api_stats: dict = None) -> Optional[int]:
|
async def _get_wattage_limit(self, api_stats: dict = None) -> Optional[int]:
|
||||||
if api_stats is None:
|
if api_stats is None:
|
||||||
try:
|
try:
|
||||||
@@ -332,10 +297,7 @@ class CGMinerAvalon(CGMiner):
|
|||||||
pass
|
pass
|
||||||
return fans_data
|
return fans_data
|
||||||
|
|
||||||
async def _get_errors(self) -> List[MinerErrorData]:
|
async def _get_fault_light(self, api_stats: dict = None) -> Optional[bool]:
|
||||||
return []
|
|
||||||
|
|
||||||
async def _get_fault_light(self, api_stats: dict = None) -> bool: # noqa
|
|
||||||
if self.light:
|
if self.light:
|
||||||
return self.light
|
return self.light
|
||||||
if api_stats is None:
|
if api_stats is None:
|
||||||
@@ -363,9 +325,3 @@ class CGMinerAvalon(CGMiner):
|
|||||||
except LookupError:
|
except LookupError:
|
||||||
pass
|
pass
|
||||||
return False
|
return False
|
||||||
|
|
||||||
async def _is_mining(self, *args, **kwargs) -> Optional[bool]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_uptime(self) -> Optional[int]:
|
|
||||||
return None
|
|
||||||
@@ -18,7 +18,6 @@ from typing import List, Optional
|
|||||||
|
|
||||||
from pyasic.config import MinerConfig
|
from pyasic.config import MinerConfig
|
||||||
from pyasic.data import Fan, HashBoard
|
from pyasic.data import Fan, HashBoard
|
||||||
from pyasic.data.error_codes import MinerErrorData
|
|
||||||
from pyasic.errors import APIError
|
from pyasic.errors import APIError
|
||||||
from pyasic.miners.base import (
|
from pyasic.miners.base import (
|
||||||
BaseMiner,
|
BaseMiner,
|
||||||
@@ -62,18 +61,9 @@ BFGMINER_DATA_LOC = DataLocations(
|
|||||||
class BFGMiner(BaseMiner):
|
class BFGMiner(BaseMiner):
|
||||||
"""Base handler for BFGMiner based miners."""
|
"""Base handler for BFGMiner based miners."""
|
||||||
|
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
|
_api_cls = BFGMinerRPCAPI
|
||||||
super().__init__(ip)
|
|
||||||
# interfaces
|
|
||||||
self.api = BFGMinerRPCAPI(ip, api_ver)
|
|
||||||
|
|
||||||
# static data
|
data_locations = BFGMINER_DATA_LOC
|
||||||
self.api_type = "BFGMiner"
|
|
||||||
# data gathering locations
|
|
||||||
self.data_locations = BFGMINER_DATA_LOC
|
|
||||||
|
|
||||||
# data storage
|
|
||||||
self.api_ver = api_ver
|
|
||||||
|
|
||||||
async def get_config(self) -> MinerConfig:
|
async def get_config(self) -> MinerConfig:
|
||||||
# get pool data
|
# get pool data
|
||||||
@@ -85,34 +75,10 @@ class BFGMiner(BaseMiner):
|
|||||||
self.config = MinerConfig.from_api(pools)
|
self.config = MinerConfig.from_api(pools)
|
||||||
return self.config
|
return self.config
|
||||||
|
|
||||||
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def fault_light_off(self) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def fault_light_on(self) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def restart_backend(self) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def stop_mining(self) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def resume_mining(self) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def set_power_limit(self, wattage: int) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
##################################################
|
##################################################
|
||||||
### DATA GATHERING FUNCTIONS (get_{some_data}) ###
|
### DATA GATHERING FUNCTIONS (get_{some_data}) ###
|
||||||
##################################################
|
##################################################
|
||||||
|
|
||||||
async def _get_mac(self) -> Optional[str]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_api_ver(self, api_version: dict = None) -> Optional[str]:
|
async def _get_api_ver(self, api_version: dict = None) -> Optional[str]:
|
||||||
if api_version is None:
|
if api_version is None:
|
||||||
try:
|
try:
|
||||||
@@ -143,15 +109,6 @@ class BFGMiner(BaseMiner):
|
|||||||
|
|
||||||
return self.fw_ver
|
return self.fw_ver
|
||||||
|
|
||||||
async def reboot(self) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def _get_fan_psu(self):
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_hostname(self) -> Optional[str]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_hashrate(self, api_summary: dict = None) -> Optional[float]:
|
async def _get_hashrate(self, api_summary: dict = None) -> Optional[float]:
|
||||||
# get hr from API
|
# get hr from API
|
||||||
if api_summary is None:
|
if api_summary is None:
|
||||||
@@ -220,15 +177,6 @@ class BFGMiner(BaseMiner):
|
|||||||
|
|
||||||
return hashboards
|
return hashboards
|
||||||
|
|
||||||
async def _get_env_temp(self) -> Optional[float]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_wattage(self) -> Optional[int]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_wattage_limit(self) -> Optional[int]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_fans(self, api_stats: dict = None) -> List[Fan]:
|
async def _get_fans(self, api_stats: dict = None) -> List[Fan]:
|
||||||
if api_stats is None:
|
if api_stats is None:
|
||||||
try:
|
try:
|
||||||
@@ -259,12 +207,6 @@ class BFGMiner(BaseMiner):
|
|||||||
|
|
||||||
return fans
|
return fans
|
||||||
|
|
||||||
async def _get_errors(self) -> List[MinerErrorData]:
|
|
||||||
return []
|
|
||||||
|
|
||||||
async def _get_fault_light(self) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def _get_expected_hashrate(self, api_stats: dict = None) -> Optional[float]:
|
async def _get_expected_hashrate(self, api_stats: dict = None) -> Optional[float]:
|
||||||
# X19 method, not sure compatibility
|
# X19 method, not sure compatibility
|
||||||
if api_stats is None:
|
if api_stats is None:
|
||||||
@@ -288,9 +230,3 @@ class BFGMiner(BaseMiner):
|
|||||||
return round(expected_rate, 2)
|
return round(expected_rate, 2)
|
||||||
except LookupError:
|
except LookupError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _is_mining(self, *args, **kwargs) -> Optional[bool]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_uptime(self, *args, **kwargs) -> Optional[int]:
|
|
||||||
return None
|
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ from typing import List, Optional
|
|||||||
|
|
||||||
from pyasic.config import MinerConfig
|
from pyasic.config import MinerConfig
|
||||||
from pyasic.data import Fan, HashBoard
|
from pyasic.data import Fan, HashBoard
|
||||||
from pyasic.data.error_codes import MinerErrorData
|
|
||||||
from pyasic.errors import APIError
|
from pyasic.errors import APIError
|
||||||
from pyasic.miners.base import (
|
from pyasic.miners.base import (
|
||||||
BaseMiner,
|
BaseMiner,
|
||||||
@@ -67,46 +66,9 @@ BMMINER_DATA_LOC = DataLocations(
|
|||||||
class BMMiner(BaseMiner):
|
class BMMiner(BaseMiner):
|
||||||
"""Base handler for BMMiner based miners."""
|
"""Base handler for BMMiner based miners."""
|
||||||
|
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
|
_api_cls = BMMinerRPCAPI
|
||||||
super().__init__(ip)
|
|
||||||
# interfaces
|
|
||||||
self.api = BMMinerRPCAPI(ip, api_ver)
|
|
||||||
|
|
||||||
# static data
|
data_locations = BMMINER_DATA_LOC
|
||||||
self.api_type = "BMMiner"
|
|
||||||
# data gathering locations
|
|
||||||
self.data_locations = BMMINER_DATA_LOC
|
|
||||||
|
|
||||||
# data storage
|
|
||||||
self.api_ver = api_ver
|
|
||||||
|
|
||||||
async def send_ssh_command(self, cmd: str) -> Optional[str]:
|
|
||||||
result = None
|
|
||||||
|
|
||||||
try:
|
|
||||||
conn = await self._get_ssh_connection()
|
|
||||||
except ConnectionError:
|
|
||||||
return None
|
|
||||||
|
|
||||||
# open an ssh connection
|
|
||||||
async with conn:
|
|
||||||
# 3 retries
|
|
||||||
for i in range(3):
|
|
||||||
try:
|
|
||||||
# run the command and get the result
|
|
||||||
result = await conn.run(cmd)
|
|
||||||
result = result.stdout
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
# if the command fails, log it
|
|
||||||
logging.warning(f"{self} command {cmd} error: {e}")
|
|
||||||
|
|
||||||
# on the 3rd retry, return None
|
|
||||||
if i == 3:
|
|
||||||
return
|
|
||||||
continue
|
|
||||||
# return the result, either command output or None
|
|
||||||
return result
|
|
||||||
|
|
||||||
async def get_config(self) -> MinerConfig:
|
async def get_config(self) -> MinerConfig:
|
||||||
# get pool data
|
# get pool data
|
||||||
@@ -126,34 +88,10 @@ class BMMiner(BaseMiner):
|
|||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def fault_light_off(self) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def fault_light_on(self) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def restart_backend(self) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def stop_mining(self) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def resume_mining(self) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def set_power_limit(self, wattage: int) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
##################################################
|
##################################################
|
||||||
### DATA GATHERING FUNCTIONS (get_{some_data}) ###
|
### DATA GATHERING FUNCTIONS (get_{some_data}) ###
|
||||||
##################################################
|
##################################################
|
||||||
|
|
||||||
async def _get_mac(self) -> Optional[str]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_api_ver(self, api_version: dict = None) -> Optional[str]:
|
async def _get_api_ver(self, api_version: dict = None) -> Optional[str]:
|
||||||
if api_version is None:
|
if api_version is None:
|
||||||
try:
|
try:
|
||||||
@@ -184,9 +122,6 @@ class BMMiner(BaseMiner):
|
|||||||
|
|
||||||
return self.fw_ver
|
return self.fw_ver
|
||||||
|
|
||||||
async def _get_fan_psu(self):
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_hostname(self) -> Optional[str]:
|
async def _get_hostname(self) -> Optional[str]:
|
||||||
hn = await self.send_ssh_command("cat /proc/sys/kernel/hostname")
|
hn = await self.send_ssh_command("cat /proc/sys/kernel/hostname")
|
||||||
return hn
|
return hn
|
||||||
@@ -272,15 +207,6 @@ class BMMiner(BaseMiner):
|
|||||||
|
|
||||||
return hashboards
|
return hashboards
|
||||||
|
|
||||||
async def _get_env_temp(self) -> Optional[float]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_wattage(self) -> Optional[int]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_wattage_limit(self) -> Optional[int]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_fans(self, api_stats: dict = None) -> List[Fan]:
|
async def _get_fans(self, api_stats: dict = None) -> List[Fan]:
|
||||||
if api_stats is None:
|
if api_stats is None:
|
||||||
try:
|
try:
|
||||||
@@ -310,12 +236,6 @@ class BMMiner(BaseMiner):
|
|||||||
|
|
||||||
return fans
|
return fans
|
||||||
|
|
||||||
async def _get_errors(self) -> List[MinerErrorData]:
|
|
||||||
return []
|
|
||||||
|
|
||||||
async def _get_fault_light(self) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def _get_expected_hashrate(self, api_stats: dict = None) -> Optional[float]:
|
async def _get_expected_hashrate(self, api_stats: dict = None) -> Optional[float]:
|
||||||
# X19 method, not sure compatibility
|
# X19 method, not sure compatibility
|
||||||
if api_stats is None:
|
if api_stats is None:
|
||||||
@@ -340,9 +260,6 @@ class BMMiner(BaseMiner):
|
|||||||
except LookupError:
|
except LookupError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _is_mining(self, *args, **kwargs) -> Optional[bool]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_uptime(self, api_stats: dict = None) -> Optional[int]:
|
async def _get_uptime(self, api_stats: dict = None) -> Optional[int]:
|
||||||
if api_stats is None:
|
if api_stats is None:
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -13,7 +13,6 @@
|
|||||||
# See the License for the specific language governing permissions and -
|
# See the License for the specific language governing permissions and -
|
||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
import asyncio
|
|
||||||
import logging
|
import logging
|
||||||
import time
|
import time
|
||||||
from typing import List, Optional, Union
|
from typing import List, Optional, Union
|
||||||
@@ -96,69 +95,29 @@ BOSMINER_DATA_LOC = DataLocations(
|
|||||||
|
|
||||||
|
|
||||||
class BOSMiner(BaseMiner):
|
class BOSMiner(BaseMiner):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
|
"""Handler for old versions of BraiinsOS+ (pre-gRPC)"""
|
||||||
super().__init__(ip)
|
|
||||||
# interfaces
|
|
||||||
self.api = BOSMinerRPCAPI(ip, api_ver)
|
|
||||||
self.web = BOSMinerWebAPI(ip)
|
|
||||||
|
|
||||||
# static data
|
_api_cls = BOSMinerRPCAPI
|
||||||
self.api_type = "BOSMiner"
|
_web_cls = BOSMinerWebAPI
|
||||||
# data gathering locations
|
|
||||||
self.data_locations = BOSMINER_DATA_LOC
|
|
||||||
# autotuning/shutdown support
|
|
||||||
self.supports_autotuning = True
|
|
||||||
self.supports_shutdown = True
|
|
||||||
|
|
||||||
# data storage
|
firmware = "BOS+"
|
||||||
self.api_ver = api_ver
|
|
||||||
|
|
||||||
async def send_ssh_command(self, cmd: str) -> Optional[str]:
|
data_locations = BOSMINER_DATA_LOC
|
||||||
result = None
|
|
||||||
|
|
||||||
try:
|
supports_shutdown = True
|
||||||
conn = await asyncio.wait_for(self._get_ssh_connection(), timeout=10)
|
supports_autotuning = True
|
||||||
except (ConnectionError, asyncio.TimeoutError):
|
|
||||||
return None
|
|
||||||
|
|
||||||
# open an ssh connection
|
|
||||||
async with conn:
|
|
||||||
# 3 retries
|
|
||||||
for i in range(3):
|
|
||||||
try:
|
|
||||||
# run the command and get the result
|
|
||||||
result = await conn.run(cmd)
|
|
||||||
stderr = result.stderr
|
|
||||||
result = result.stdout
|
|
||||||
|
|
||||||
if len(stderr) > len(result):
|
|
||||||
result = stderr
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
# if the command fails, log it
|
|
||||||
logging.warning(f"{self} command {cmd} error: {e}")
|
|
||||||
|
|
||||||
# on the 3rd retry, return None
|
|
||||||
if i == 3:
|
|
||||||
return
|
|
||||||
continue
|
|
||||||
# return the result, either command output or None
|
|
||||||
return result
|
|
||||||
|
|
||||||
async def fault_light_on(self) -> bool:
|
async def fault_light_on(self) -> bool:
|
||||||
logging.debug(f"{self}: Sending fault_light on command.")
|
|
||||||
ret = await self.send_ssh_command("miner fault_light on")
|
ret = await self.send_ssh_command("miner fault_light on")
|
||||||
logging.debug(f"{self}: fault_light on command completed.")
|
|
||||||
if isinstance(ret, str):
|
if isinstance(ret, str):
|
||||||
self.light = True
|
self.light = True
|
||||||
return self.light
|
return self.light
|
||||||
return False
|
return False
|
||||||
|
|
||||||
async def fault_light_off(self) -> bool:
|
async def fault_light_off(self) -> bool:
|
||||||
logging.debug(f"{self}: Sending fault_light off command.")
|
|
||||||
self.light = False
|
|
||||||
ret = await self.send_ssh_command("miner fault_light off")
|
ret = await self.send_ssh_command("miner fault_light off")
|
||||||
logging.debug(f"{self}: fault_light off command completed.")
|
|
||||||
if isinstance(ret, str):
|
if isinstance(ret, str):
|
||||||
self.light = False
|
self.light = False
|
||||||
return True
|
return True
|
||||||
@@ -168,9 +127,8 @@ class BOSMiner(BaseMiner):
|
|||||||
return await self.restart_bosminer()
|
return await self.restart_bosminer()
|
||||||
|
|
||||||
async def restart_bosminer(self) -> bool:
|
async def restart_bosminer(self) -> bool:
|
||||||
logging.debug(f"{self}: Sending bosminer restart command.")
|
|
||||||
ret = await self.send_ssh_command("/etc/init.d/bosminer restart")
|
ret = await self.send_ssh_command("/etc/init.d/bosminer restart")
|
||||||
logging.debug(f"{self}: bosminer restart command completed.")
|
|
||||||
if isinstance(ret, str):
|
if isinstance(ret, str):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
@@ -180,6 +138,7 @@ class BOSMiner(BaseMiner):
|
|||||||
data = await self.api.pause()
|
data = await self.api.pause()
|
||||||
except APIError:
|
except APIError:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
if data.get("PAUSE"):
|
if data.get("PAUSE"):
|
||||||
if data["PAUSE"][0]:
|
if data["PAUSE"][0]:
|
||||||
return True
|
return True
|
||||||
@@ -190,40 +149,32 @@ class BOSMiner(BaseMiner):
|
|||||||
data = await self.api.resume()
|
data = await self.api.resume()
|
||||||
except APIError:
|
except APIError:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
if data.get("RESUME"):
|
if data.get("RESUME"):
|
||||||
if data["RESUME"][0]:
|
if data["RESUME"][0]:
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
async def reboot(self) -> bool:
|
async def reboot(self) -> bool:
|
||||||
logging.debug(f"{self}: Sending reboot command.")
|
|
||||||
ret = await self.send_ssh_command("/sbin/reboot")
|
ret = await self.send_ssh_command("/sbin/reboot")
|
||||||
logging.debug(f"{self}: Reboot command completed.")
|
|
||||||
if isinstance(ret, str):
|
if isinstance(ret, str):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
async def get_config(self) -> MinerConfig:
|
async def get_config(self) -> MinerConfig:
|
||||||
logging.debug(f"{self}: Getting config.")
|
raw_data = await self.send_ssh_command("cat /etc/bosminer.toml")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
conn = await self._get_ssh_connection()
|
toml_data = toml.loads(raw_data)
|
||||||
except ConnectionError:
|
|
||||||
conn = None
|
|
||||||
|
|
||||||
if conn:
|
|
||||||
async with conn:
|
|
||||||
# good ol' BBB compatibility :/
|
|
||||||
toml_data = toml.loads(
|
|
||||||
(await conn.run("cat /etc/bosminer.toml")).stdout
|
|
||||||
)
|
|
||||||
logging.debug(f"{self}: Converting config file.")
|
|
||||||
cfg = MinerConfig.from_bosminer(toml_data)
|
cfg = MinerConfig.from_bosminer(toml_data)
|
||||||
self.config = cfg
|
self.config = cfg
|
||||||
|
except toml.TomlDecodeError as e:
|
||||||
|
raise APIError("Failed to decode toml when getting config.") from e
|
||||||
|
|
||||||
return self.config
|
return self.config
|
||||||
|
|
||||||
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
|
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
|
||||||
logging.debug(f"{self}: Sending config.")
|
|
||||||
self.config = config
|
self.config = config
|
||||||
|
|
||||||
toml_conf = toml.dumps(
|
toml_conf = toml.dumps(
|
||||||
@@ -241,6 +192,7 @@ class BOSMiner(BaseMiner):
|
|||||||
conn = await self._get_ssh_connection()
|
conn = await self._get_ssh_connection()
|
||||||
except ConnectionError as e:
|
except ConnectionError as e:
|
||||||
raise APIError("SSH connection failed when sending config.") from e
|
raise APIError("SSH connection failed when sending config.") from e
|
||||||
|
|
||||||
async with conn:
|
async with conn:
|
||||||
# BBB check because bitmain suxx
|
# BBB check because bitmain suxx
|
||||||
bbb_check = await conn.run(
|
bbb_check = await conn.run(
|
||||||
@@ -251,20 +203,13 @@ class BOSMiner(BaseMiner):
|
|||||||
|
|
||||||
if not bbb:
|
if not bbb:
|
||||||
await conn.run("/etc/init.d/bosminer stop")
|
await conn.run("/etc/init.d/bosminer stop")
|
||||||
logging.debug(f"{self}: Opening SFTP connection.")
|
|
||||||
async with conn.start_sftp_client() as sftp:
|
async with conn.start_sftp_client() as sftp:
|
||||||
logging.debug(f"{self}: Opening config file.")
|
|
||||||
async with sftp.open("/etc/bosminer.toml", "w+") as file:
|
async with sftp.open("/etc/bosminer.toml", "w+") as file:
|
||||||
await file.write(toml_conf)
|
await file.write(toml_conf)
|
||||||
logging.debug(f"{self}: Restarting BOSMiner")
|
|
||||||
await conn.run("/etc/init.d/bosminer start")
|
await conn.run("/etc/init.d/bosminer start")
|
||||||
|
|
||||||
# I really hate BBB, please get rid of it if you have it
|
|
||||||
else:
|
else:
|
||||||
await conn.run("/etc/init.d/S99bosminer stop")
|
await conn.run("/etc/init.d/S99bosminer stop")
|
||||||
logging.debug(f"{self}: BBB sending config")
|
|
||||||
await conn.run("echo '" + toml_conf + "' > /etc/bosminer.toml")
|
await conn.run("echo '" + toml_conf + "' > /etc/bosminer.toml")
|
||||||
logging.debug(f"{self}: BBB restarting bosminer.")
|
|
||||||
await conn.run("/etc/init.d/S99bosminer start")
|
await conn.run("/etc/init.d/S99bosminer start")
|
||||||
|
|
||||||
async def set_power_limit(self, wattage: int) -> bool:
|
async def set_power_limit(self, wattage: int) -> bool:
|
||||||
@@ -274,8 +219,10 @@ class BOSMiner(BaseMiner):
|
|||||||
return False
|
return False
|
||||||
cfg.mining_mode = MiningModePowerTune(wattage)
|
cfg.mining_mode = MiningModePowerTune(wattage)
|
||||||
await self.send_config(cfg)
|
await self.send_config(cfg)
|
||||||
|
except APIError:
|
||||||
|
raise
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.warning(f"{self} set_power_limit: {e}")
|
logging.warning(f"{self} - Failed to set power limit: {e}")
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
return True
|
return True
|
||||||
@@ -377,7 +324,7 @@ class BOSMiner(BaseMiner):
|
|||||||
|
|
||||||
return self.api_ver
|
return self.api_ver
|
||||||
|
|
||||||
async def _get_fw_ver(self, web_bos_info: dict) -> Optional[str]:
|
async def _get_fw_ver(self, web_bos_info: dict = None) -> Optional[str]:
|
||||||
if web_bos_info is None:
|
if web_bos_info is None:
|
||||||
try:
|
try:
|
||||||
web_bos_info = await self.web.luci.get_bos_info()
|
web_bos_info = await self.web.luci.get_bos_info()
|
||||||
@@ -392,7 +339,6 @@ class BOSMiner(BaseMiner):
|
|||||||
ver = web_bos_info["version"].split("-")[5]
|
ver = web_bos_info["version"].split("-")[5]
|
||||||
if "." in ver:
|
if "." in ver:
|
||||||
self.fw_ver = ver
|
self.fw_ver = ver
|
||||||
logging.debug(f"Found version for {self.ip}: {self.fw_ver}")
|
|
||||||
except (LookupError, AttributeError):
|
except (LookupError, AttributeError):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@@ -404,7 +350,7 @@ class BOSMiner(BaseMiner):
|
|||||||
await self.send_ssh_command("cat /proc/sys/kernel/hostname")
|
await self.send_ssh_command("cat /proc/sys/kernel/hostname")
|
||||||
).strip()
|
).strip()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error(f"BOSMiner get_hostname failed with error: {e}")
|
logging.error(f"{self} - Getting hostname failed: {e}")
|
||||||
return None
|
return None
|
||||||
return hostname
|
return hostname
|
||||||
|
|
||||||
@@ -426,7 +372,7 @@ class BOSMiner(BaseMiner):
|
|||||||
api_temps: dict = None,
|
api_temps: dict = None,
|
||||||
api_devdetails: dict = None,
|
api_devdetails: dict = None,
|
||||||
api_devs: dict = None,
|
api_devs: dict = None,
|
||||||
):
|
) -> List[HashBoard]:
|
||||||
hashboards = [
|
hashboards = [
|
||||||
HashBoard(slot=i, expected_chips=self.expected_chips)
|
HashBoard(slot=i, expected_chips=self.expected_chips)
|
||||||
for i in range(self.expected_hashboards)
|
for i in range(self.expected_hashboards)
|
||||||
@@ -494,9 +440,6 @@ class BOSMiner(BaseMiner):
|
|||||||
|
|
||||||
return hashboards
|
return hashboards
|
||||||
|
|
||||||
async def _get_env_temp(self) -> Optional[float]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_wattage(self, api_tunerstatus: dict = None) -> Optional[int]:
|
async def _get_wattage(self, api_tunerstatus: dict = None) -> Optional[int]:
|
||||||
if api_tunerstatus is None:
|
if api_tunerstatus is None:
|
||||||
try:
|
try:
|
||||||
@@ -542,9 +485,6 @@ class BOSMiner(BaseMiner):
|
|||||||
return fans
|
return fans
|
||||||
return [Fan() for _ in range(self.expected_fans)]
|
return [Fan() for _ in range(self.expected_fans)]
|
||||||
|
|
||||||
async def _get_fan_psu(self) -> Optional[int]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_errors(self, api_tunerstatus: dict = None) -> List[MinerErrorData]:
|
async def _get_errors(self, api_tunerstatus: dict = None) -> List[MinerErrorData]:
|
||||||
if api_tunerstatus is None:
|
if api_tunerstatus is None:
|
||||||
try:
|
try:
|
||||||
@@ -709,22 +649,15 @@ BOSER_DATA_LOC = DataLocations(
|
|||||||
|
|
||||||
|
|
||||||
class BOSer(BaseMiner):
|
class BOSer(BaseMiner):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
|
"""Handler for new versions of BraiinsOS+ (post-gRPC)"""
|
||||||
super().__init__(ip)
|
|
||||||
# interfaces
|
|
||||||
self.api = BOSMinerRPCAPI(ip, api_ver)
|
|
||||||
self.web = BOSerWebAPI(ip)
|
|
||||||
|
|
||||||
# static data
|
_api_cls = BOSMinerRPCAPI
|
||||||
self.api_type = "BOSMiner"
|
_web_cls = BOSerWebAPI
|
||||||
# data gathering locations
|
|
||||||
self.data_locations = BOSER_DATA_LOC
|
|
||||||
# autotuning/shutdown support
|
|
||||||
self.supports_autotuning = True
|
|
||||||
self.supports_shutdown = True
|
|
||||||
|
|
||||||
# data storage
|
data_locations = BOSER_DATA_LOC
|
||||||
self.api_ver = api_ver
|
|
||||||
|
supports_autotuning = True
|
||||||
|
supports_shutdown = True
|
||||||
|
|
||||||
async def fault_light_on(self) -> bool:
|
async def fault_light_on(self) -> bool:
|
||||||
resp = await self.web.grpc.set_locate_device_status(True)
|
resp = await self.web.grpc.set_locate_device_status(True)
|
||||||
@@ -770,11 +703,6 @@ class BOSer(BaseMiner):
|
|||||||
|
|
||||||
return MinerConfig.from_boser(grpc_conf)
|
return MinerConfig.from_boser(grpc_conf)
|
||||||
|
|
||||||
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
|
|
||||||
raise NotImplementedError
|
|
||||||
logging.debug(f"{self}: Sending config.")
|
|
||||||
self.config = config
|
|
||||||
|
|
||||||
async def set_power_limit(self, wattage: int) -> bool:
|
async def set_power_limit(self, wattage: int) -> bool:
|
||||||
try:
|
try:
|
||||||
result = await self.web.grpc.set_power_target(wattage)
|
result = await self.web.grpc.set_power_target(wattage)
|
||||||
@@ -812,7 +740,6 @@ class BOSer(BaseMiner):
|
|||||||
except APIError:
|
except APIError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# Now get the API version
|
|
||||||
if api_version is not None:
|
if api_version is not None:
|
||||||
try:
|
try:
|
||||||
api_ver = api_version["VERSION"][0]["API"]
|
api_ver = api_version["VERSION"][0]["API"]
|
||||||
@@ -843,11 +770,10 @@ class BOSer(BaseMiner):
|
|||||||
ver = fw_ver.split("-")[5]
|
ver = fw_ver.split("-")[5]
|
||||||
if "." in ver:
|
if "." in ver:
|
||||||
self.fw_ver = ver
|
self.fw_ver = ver
|
||||||
logging.debug(f"Found version for {self.ip}: {self.fw_ver}")
|
|
||||||
|
|
||||||
return self.fw_ver
|
return self.fw_ver
|
||||||
|
|
||||||
async def _get_hostname(self, grpc_miner_details: dict = None) -> Union[str, None]:
|
async def _get_hostname(self, grpc_miner_details: dict = None) -> Optional[str]:
|
||||||
if grpc_miner_details is None:
|
if grpc_miner_details is None:
|
||||||
try:
|
try:
|
||||||
grpc_miner_details = await self.web.grpc.get_miner_details()
|
grpc_miner_details = await self.web.grpc.get_miner_details()
|
||||||
@@ -888,7 +814,7 @@ class BOSer(BaseMiner):
|
|||||||
except LookupError:
|
except LookupError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_hashboards(self, grpc_hashboards: dict = None):
|
async def _get_hashboards(self, grpc_hashboards: dict = None) -> List[HashBoard]:
|
||||||
hashboards = [
|
hashboards = [
|
||||||
HashBoard(slot=i, expected_chips=self.expected_chips)
|
HashBoard(slot=i, expected_chips=self.expected_chips)
|
||||||
for i in range(self.expected_hashboards)
|
for i in range(self.expected_hashboards)
|
||||||
@@ -924,9 +850,6 @@ class BOSer(BaseMiner):
|
|||||||
|
|
||||||
return hashboards
|
return hashboards
|
||||||
|
|
||||||
async def _get_env_temp(self) -> Optional[float]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_wattage(self, grpc_miner_stats: dict = None) -> Optional[int]:
|
async def _get_wattage(self, grpc_miner_stats: dict = None) -> Optional[int]:
|
||||||
if grpc_miner_stats is None:
|
if grpc_miner_stats is None:
|
||||||
try:
|
try:
|
||||||
@@ -976,9 +899,6 @@ class BOSer(BaseMiner):
|
|||||||
return fans
|
return fans
|
||||||
return [Fan() for _ in range(self.expected_fans)]
|
return [Fan() for _ in range(self.expected_fans)]
|
||||||
|
|
||||||
async def _get_fan_psu(self) -> Optional[int]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_errors(self, api_tunerstatus: dict = None) -> List[MinerErrorData]:
|
async def _get_errors(self, api_tunerstatus: dict = None) -> List[MinerErrorData]:
|
||||||
if api_tunerstatus is None:
|
if api_tunerstatus is None:
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -116,20 +116,11 @@ BTMINER_DATA_LOC = DataLocations(
|
|||||||
|
|
||||||
|
|
||||||
class BTMiner(BaseMiner):
|
class BTMiner(BaseMiner):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
|
_api_cls = BTMinerRPCAPI
|
||||||
super().__init__(ip)
|
|
||||||
# interfaces
|
|
||||||
self.api = BTMinerRPCAPI(ip, api_ver)
|
|
||||||
|
|
||||||
# static data
|
data_locations = BTMINER_DATA_LOC
|
||||||
self.api_type = "BTMiner"
|
|
||||||
# data gathering locations
|
|
||||||
self.data_locations = BTMINER_DATA_LOC
|
|
||||||
# autotuning/shutdown support
|
|
||||||
self.supports_shutdown = True
|
|
||||||
|
|
||||||
# data storage
|
supports_shutdown = True
|
||||||
self.api_ver = api_ver
|
|
||||||
|
|
||||||
async def _reset_api_pwd_to_admin(self, pwd: str):
|
async def _reset_api_pwd_to_admin(self, pwd: str):
|
||||||
try:
|
try:
|
||||||
@@ -397,7 +388,6 @@ class BTMiner(BaseMiner):
|
|||||||
return hostname
|
return hostname
|
||||||
|
|
||||||
async def _get_hashrate(self, api_summary: dict = None) -> Optional[float]:
|
async def _get_hashrate(self, api_summary: dict = None) -> Optional[float]:
|
||||||
# get hr from API
|
|
||||||
if api_summary is None:
|
if api_summary is None:
|
||||||
try:
|
try:
|
||||||
api_summary = await self.api.summary()
|
api_summary = await self.api.summary()
|
||||||
@@ -545,12 +535,15 @@ class BTMiner(BaseMiner):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
if api_get_error_code is not None:
|
if api_get_error_code is not None:
|
||||||
for err in api_get_error_code["Msg"]["error_code"]:
|
try:
|
||||||
if isinstance(err, dict):
|
for err in api_get_error_code["Msg"]["error_code"]:
|
||||||
for code in err:
|
if isinstance(err, dict):
|
||||||
errors.append(WhatsminerError(error_code=int(code)))
|
for code in err:
|
||||||
else:
|
errors.append(WhatsminerError(error_code=int(code)))
|
||||||
errors.append(WhatsminerError(error_code=int(err)))
|
else:
|
||||||
|
errors.append(WhatsminerError(error_code=int(err)))
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
if api_summary is None:
|
if api_summary is None:
|
||||||
try:
|
try:
|
||||||
@@ -568,7 +561,7 @@ class BTMiner(BaseMiner):
|
|||||||
pass
|
pass
|
||||||
return errors
|
return errors
|
||||||
|
|
||||||
async def _get_expected_hashrate(self, api_summary: dict = None):
|
async def _get_expected_hashrate(self, api_summary: dict = None) -> Optional[float]:
|
||||||
if api_summary is None:
|
if api_summary is None:
|
||||||
try:
|
try:
|
||||||
api_summary = await self.api.summary()
|
api_summary = await self.api.summary()
|
||||||
@@ -583,7 +576,7 @@ class BTMiner(BaseMiner):
|
|||||||
except LookupError:
|
except LookupError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_fault_light(self, api_get_miner_info: dict = None) -> bool:
|
async def _get_fault_light(self, api_get_miner_info: dict = None) -> Optional[bool]:
|
||||||
if api_get_miner_info is None:
|
if api_get_miner_info is None:
|
||||||
try:
|
try:
|
||||||
api_get_miner_info = await self.api.get_miner_info()
|
api_get_miner_info = await self.api.get_miner_info()
|
||||||
|
|||||||
@@ -14,12 +14,9 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
import logging
|
from typing import Optional
|
||||||
from typing import List, Optional
|
|
||||||
|
|
||||||
from pyasic.config import MinerConfig
|
from pyasic.config import MinerConfig
|
||||||
from pyasic.data import Fan, HashBoard
|
|
||||||
from pyasic.data.error_codes import MinerErrorData
|
|
||||||
from pyasic.errors import APIError
|
from pyasic.errors import APIError
|
||||||
from pyasic.miners.base import (
|
from pyasic.miners.base import (
|
||||||
BaseMiner,
|
BaseMiner,
|
||||||
@@ -65,91 +62,18 @@ CGMINER_DATA_LOC = DataLocations(
|
|||||||
|
|
||||||
|
|
||||||
class CGMiner(BaseMiner):
|
class CGMiner(BaseMiner):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
|
"""Base handler for CGMiner based miners"""
|
||||||
super().__init__(ip)
|
|
||||||
# interfaces
|
|
||||||
self.api = CGMinerRPCAPI(ip, api_ver)
|
|
||||||
|
|
||||||
# static data
|
_api_cls = CGMinerRPCAPI
|
||||||
self.api_type = "CGMiner"
|
|
||||||
# data gathering locations
|
|
||||||
self.data_locations = CGMINER_DATA_LOC
|
|
||||||
|
|
||||||
# data storage
|
data_locations = CGMINER_DATA_LOC
|
||||||
self.api_ver = api_ver
|
|
||||||
|
|
||||||
async def send_ssh_command(self, cmd: str) -> Optional[str]:
|
|
||||||
result = None
|
|
||||||
|
|
||||||
try:
|
|
||||||
conn = await self._get_ssh_connection()
|
|
||||||
except ConnectionError:
|
|
||||||
return None
|
|
||||||
|
|
||||||
# open an ssh connection
|
|
||||||
async with conn:
|
|
||||||
# 3 retries
|
|
||||||
for i in range(3):
|
|
||||||
try:
|
|
||||||
# run the command and get the result
|
|
||||||
result = await conn.run(cmd)
|
|
||||||
result = result.stdout
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
# if the command fails, log it
|
|
||||||
logging.warning(f"{self} command {cmd} error: {e}")
|
|
||||||
|
|
||||||
# on the 3rd retry, return None
|
|
||||||
if i == 3:
|
|
||||||
return
|
|
||||||
continue
|
|
||||||
# return the result, either command output or None
|
|
||||||
return result
|
|
||||||
|
|
||||||
async def restart_backend(self) -> bool:
|
|
||||||
return await self.restart_cgminer()
|
|
||||||
|
|
||||||
async def restart_cgminer(self) -> bool:
|
|
||||||
commands = ["cgminer-api restart", "/usr/bin/cgminer-monitor >/dev/null 2>&1"]
|
|
||||||
commands = ";".join(commands)
|
|
||||||
ret = await self.send_ssh_command(commands)
|
|
||||||
if ret is None:
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
async def reboot(self) -> bool:
|
async def reboot(self) -> bool:
|
||||||
logging.debug(f"{self}: Sending reboot command.")
|
|
||||||
ret = await self.send_ssh_command("reboot")
|
ret = await self.send_ssh_command("reboot")
|
||||||
if ret is None:
|
if ret is None:
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
async def resume_mining(self) -> bool:
|
|
||||||
commands = [
|
|
||||||
"mkdir -p /etc/tmp/",
|
|
||||||
'echo "*/3 * * * * /usr/bin/cgminer-monitor" > /etc/tmp/root',
|
|
||||||
"crontab -u root /etc/tmp/root",
|
|
||||||
"/usr/bin/cgminer-monitor >/dev/null 2>&1",
|
|
||||||
]
|
|
||||||
commands = ";".join(commands)
|
|
||||||
ret = await self.send_ssh_command(commands)
|
|
||||||
if ret is None:
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
async def stop_mining(self) -> bool:
|
|
||||||
commands = [
|
|
||||||
"mkdir -p /etc/tmp/",
|
|
||||||
'echo "" > /etc/tmp/root',
|
|
||||||
"crontab -u root /etc/tmp/root",
|
|
||||||
"killall cgminer",
|
|
||||||
]
|
|
||||||
commands = ";".join(commands)
|
|
||||||
ret = await self.send_ssh_command(commands)
|
|
||||||
if ret is None:
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
async def get_config(self) -> MinerConfig:
|
async def get_config(self) -> MinerConfig:
|
||||||
# get pool data
|
# get pool data
|
||||||
try:
|
try:
|
||||||
@@ -160,25 +84,10 @@ class CGMiner(BaseMiner):
|
|||||||
self.config = MinerConfig.from_api(pools)
|
self.config = MinerConfig.from_api(pools)
|
||||||
return self.config
|
return self.config
|
||||||
|
|
||||||
async def fault_light_off(self) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def fault_light_on(self) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def set_power_limit(self, wattage: int) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
##################################################
|
##################################################
|
||||||
### DATA GATHERING FUNCTIONS (get_{some_data}) ###
|
### DATA GATHERING FUNCTIONS (get_{some_data}) ###
|
||||||
##################################################
|
##################################################
|
||||||
|
|
||||||
async def _get_mac(self) -> Optional[str]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_api_ver(self, api_version: dict = None) -> Optional[str]:
|
async def _get_api_ver(self, api_version: dict = None) -> Optional[str]:
|
||||||
if api_version is None:
|
if api_version is None:
|
||||||
try:
|
try:
|
||||||
@@ -209,12 +118,7 @@ class CGMiner(BaseMiner):
|
|||||||
|
|
||||||
return self.fw_ver
|
return self.fw_ver
|
||||||
|
|
||||||
async def _get_hostname(self) -> Optional[str]:
|
|
||||||
hn = await self.send_ssh_command("cat /proc/sys/kernel/hostname")
|
|
||||||
return hn
|
|
||||||
|
|
||||||
async def _get_hashrate(self, api_summary: dict = None) -> Optional[float]:
|
async def _get_hashrate(self, api_summary: dict = None) -> Optional[float]:
|
||||||
# get hr from API
|
|
||||||
if api_summary is None:
|
if api_summary is None:
|
||||||
try:
|
try:
|
||||||
api_summary = await self.api.summary()
|
api_summary = await self.api.summary()
|
||||||
@@ -229,133 +133,6 @@ class CGMiner(BaseMiner):
|
|||||||
except (LookupError, ValueError, TypeError):
|
except (LookupError, ValueError, TypeError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_hashboards(self, api_stats: dict = None) -> List[HashBoard]:
|
|
||||||
hashboards = []
|
|
||||||
|
|
||||||
if api_stats is None:
|
|
||||||
try:
|
|
||||||
api_stats = await self.api.stats()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if api_stats is not None:
|
|
||||||
try:
|
|
||||||
board_offset = -1
|
|
||||||
boards = api_stats["STATS"]
|
|
||||||
if len(boards) > 1:
|
|
||||||
for board_num in range(1, 16, 5):
|
|
||||||
for _b_num in range(5):
|
|
||||||
b = boards[1].get(f"chain_acn{board_num + _b_num}")
|
|
||||||
|
|
||||||
if b and not b == 0 and board_offset == -1:
|
|
||||||
board_offset = board_num
|
|
||||||
if board_offset == -1:
|
|
||||||
board_offset = 1
|
|
||||||
|
|
||||||
for i in range(
|
|
||||||
board_offset, board_offset + self.expected_hashboards
|
|
||||||
):
|
|
||||||
hashboard = HashBoard(
|
|
||||||
slot=i - board_offset, expected_chips=self.expected_chips
|
|
||||||
)
|
|
||||||
|
|
||||||
chip_temp = boards[1].get(f"temp{i}")
|
|
||||||
if chip_temp:
|
|
||||||
hashboard.chip_temp = round(chip_temp)
|
|
||||||
|
|
||||||
temp = boards[1].get(f"temp2_{i}")
|
|
||||||
if temp:
|
|
||||||
hashboard.temp = round(temp)
|
|
||||||
|
|
||||||
hashrate = boards[1].get(f"chain_rate{i}")
|
|
||||||
if hashrate:
|
|
||||||
hashboard.hashrate = round(float(hashrate) / 1000, 2)
|
|
||||||
|
|
||||||
chips = boards[1].get(f"chain_acn{i}")
|
|
||||||
if chips:
|
|
||||||
hashboard.chips = chips
|
|
||||||
hashboard.missing = False
|
|
||||||
if (not chips) or (not chips > 0):
|
|
||||||
hashboard.missing = True
|
|
||||||
hashboards.append(hashboard)
|
|
||||||
except (LookupError, ValueError, TypeError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
return hashboards
|
|
||||||
|
|
||||||
async def _get_env_temp(self) -> Optional[float]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_wattage(self) -> Optional[int]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_wattage_limit(self) -> Optional[int]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_fans(self, api_stats: dict = None) -> List[Fan]:
|
|
||||||
if api_stats is None:
|
|
||||||
try:
|
|
||||||
api_stats = await self.api.stats()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
fans = [Fan() for _ in range(self.expected_fans)]
|
|
||||||
if api_stats is not None:
|
|
||||||
try:
|
|
||||||
fan_offset = -1
|
|
||||||
|
|
||||||
for fan_num in range(1, 8, 4):
|
|
||||||
for _f_num in range(4):
|
|
||||||
f = api_stats["STATS"][1].get(f"fan{fan_num + _f_num}")
|
|
||||||
if f and not f == 0 and fan_offset == -1:
|
|
||||||
fan_offset = fan_num
|
|
||||||
if fan_offset == -1:
|
|
||||||
fan_offset = 1
|
|
||||||
|
|
||||||
for fan in range(self.expected_fans):
|
|
||||||
fans[fan].speed = api_stats["STATS"][1].get(
|
|
||||||
f"fan{fan_offset+fan}", 0
|
|
||||||
)
|
|
||||||
except LookupError:
|
|
||||||
pass
|
|
||||||
return fans
|
|
||||||
|
|
||||||
async def _get_fan_psu(self) -> Optional[int]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_errors(self) -> List[MinerErrorData]:
|
|
||||||
return []
|
|
||||||
|
|
||||||
async def _get_fault_light(self) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def _get_expected_hashrate(self, api_stats: dict = None) -> Optional[float]:
|
|
||||||
# X19 method, not sure compatibility
|
|
||||||
if api_stats is None:
|
|
||||||
try:
|
|
||||||
api_stats = await self.api.stats()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if api_stats is not None:
|
|
||||||
try:
|
|
||||||
expected_rate = api_stats["STATS"][1]["total_rateideal"]
|
|
||||||
try:
|
|
||||||
rate_unit = api_stats["STATS"][1]["rate_unit"]
|
|
||||||
except KeyError:
|
|
||||||
rate_unit = "GH"
|
|
||||||
if rate_unit == "GH":
|
|
||||||
return round(expected_rate / 1000, 2)
|
|
||||||
if rate_unit == "MH":
|
|
||||||
return round(expected_rate / 1000000, 2)
|
|
||||||
else:
|
|
||||||
return round(expected_rate, 2)
|
|
||||||
except LookupError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _is_mining(self, *args, **kwargs) -> Optional[bool]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_uptime(self, api_stats: dict = None) -> Optional[int]:
|
async def _get_uptime(self, api_stats: dict = None) -> Optional[int]:
|
||||||
if api_stats is None:
|
if api_stats is None:
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -84,16 +84,13 @@ EPIC_DATA_LOC = DataLocations(
|
|||||||
|
|
||||||
|
|
||||||
class ePIC(BaseMiner):
|
class ePIC(BaseMiner):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
|
_web_cls = ePICWebAPI
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
# interfaces
|
|
||||||
self.web = ePICWebAPI(ip)
|
|
||||||
|
|
||||||
# static data
|
firmware = "ePIC"
|
||||||
self.api_type = "ePIC"
|
|
||||||
self.fw_str = "ePIC"
|
data_locations = EPIC_DATA_LOC
|
||||||
# data gathering locations
|
|
||||||
self.data_locations = EPIC_DATA_LOC
|
supports_shutdown = True
|
||||||
|
|
||||||
async def get_config(self) -> MinerConfig:
|
async def get_config(self) -> MinerConfig:
|
||||||
summary = None
|
summary = None
|
||||||
@@ -148,7 +145,7 @@ class ePIC(BaseMiner):
|
|||||||
pass
|
pass
|
||||||
return False
|
return False
|
||||||
|
|
||||||
async def _get_mac(self, web_network: dict = None) -> str:
|
async def _get_mac(self, web_network: dict = None) -> Optional[str]:
|
||||||
if web_network is None:
|
if web_network is None:
|
||||||
try:
|
try:
|
||||||
web_network = await self.web.network()
|
web_network = await self.web.network()
|
||||||
@@ -163,7 +160,7 @@ class ePIC(BaseMiner):
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_hostname(self, web_summary: dict = None) -> str:
|
async def _get_hostname(self, web_summary: dict = None) -> Optional[str]:
|
||||||
if web_summary is None:
|
if web_summary is None:
|
||||||
try:
|
try:
|
||||||
web_summary = await self.web.summary()
|
web_summary = await self.web.summary()
|
||||||
@@ -314,7 +311,7 @@ class ePIC(BaseMiner):
|
|||||||
pass
|
pass
|
||||||
return None
|
return None
|
||||||
|
|
||||||
async def _get_fault_light(self, web_summary: dict = None) -> bool:
|
async def _get_fault_light(self, web_summary: dict = None) -> Optional[bool]:
|
||||||
if web_summary is None:
|
if web_summary is None:
|
||||||
try:
|
try:
|
||||||
web_summary = await self.web.summary()
|
web_summary = await self.web.summary()
|
||||||
@@ -346,27 +343,3 @@ class ePIC(BaseMiner):
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
return errors
|
return errors
|
||||||
|
|
||||||
async def fault_light_off(self) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def fault_light_on(self) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def _get_api_ver(self, *args, **kwargs) -> Optional[str]:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_env_temp(self, *args, **kwargs) -> Optional[float]:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_fan_psu(self, *args, **kwargs) -> Optional[int]:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_wattage_limit(self, *args, **kwargs) -> Optional[int]:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def set_power_limit(self, wattage: int) -> bool:
|
|
||||||
return False
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
# See the License for the specific language governing permissions and -
|
# See the License for the specific language governing permissions and -
|
||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
from typing import List, Optional
|
from typing import List
|
||||||
|
|
||||||
from pyasic.config import MinerConfig
|
from pyasic.config import MinerConfig
|
||||||
from pyasic.data import HashBoard
|
from pyasic.data import HashBoard
|
||||||
@@ -66,15 +66,10 @@ GOLDSHELL_DATA_LOC = DataLocations(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class BFGMinerGoldshell(BFGMiner):
|
class GoldshellMiner(BFGMiner):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
|
_web_cls = GoldshellWebAPI
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
# interfaces
|
|
||||||
self.web = GoldshellWebAPI(ip)
|
|
||||||
|
|
||||||
# static data
|
data_locations = GOLDSHELL_DATA_LOC
|
||||||
# data gathering locations
|
|
||||||
self.data_locations = GOLDSHELL_DATA_LOC
|
|
||||||
|
|
||||||
async def get_config(self) -> MinerConfig:
|
async def get_config(self) -> MinerConfig:
|
||||||
# get pool data
|
# get pool data
|
||||||
@@ -180,9 +175,3 @@ class BFGMinerGoldshell(BFGMiner):
|
|||||||
logger.error(self, api_devdetails)
|
logger.error(self, api_devdetails)
|
||||||
|
|
||||||
return hashboards
|
return hashboards
|
||||||
|
|
||||||
async def _is_mining(self, *args, **kwargs) -> Optional[bool]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_uptime(self, *args, **kwargs) -> Optional[int]:
|
|
||||||
return None
|
|
||||||
@@ -14,69 +14,8 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from typing import List, Optional
|
|
||||||
|
|
||||||
from pyasic import settings
|
|
||||||
from pyasic.data import HashBoard
|
|
||||||
from pyasic.miners.backends import BMMiner
|
from pyasic.miners.backends import BMMiner
|
||||||
from pyasic.miners.base import DataFunction, DataLocations, DataOptions, RPCAPICommand
|
|
||||||
|
|
||||||
HIVEON_DATA_LOC = DataLocations(
|
|
||||||
**{
|
|
||||||
str(DataOptions.API_VERSION): DataFunction(
|
|
||||||
"_get_api_ver",
|
|
||||||
[RPCAPICommand("api_version", "version")],
|
|
||||||
),
|
|
||||||
str(DataOptions.FW_VERSION): DataFunction(
|
|
||||||
"_get_fw_ver",
|
|
||||||
[RPCAPICommand("api_version", "version")],
|
|
||||||
),
|
|
||||||
str(DataOptions.HASHRATE): DataFunction(
|
|
||||||
"_get_hashrate",
|
|
||||||
[RPCAPICommand("api_summary", "summary")],
|
|
||||||
),
|
|
||||||
str(DataOptions.EXPECTED_HASHRATE): DataFunction(
|
|
||||||
"_get_expected_hashrate",
|
|
||||||
[RPCAPICommand("api_stats", "stats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.HASHBOARDS): DataFunction(
|
|
||||||
"_get_hashboards",
|
|
||||||
[RPCAPICommand("api_stats", "stats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.ENVIRONMENT_TEMP): DataFunction(
|
|
||||||
"_get_env_temp",
|
|
||||||
[RPCAPICommand("api_stats", "stats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.WATTAGE): DataFunction(
|
|
||||||
"_get_wattage",
|
|
||||||
[RPCAPICommand("api_stats", "stats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.FANS): DataFunction(
|
|
||||||
"_get_fans",
|
|
||||||
[RPCAPICommand("api_stats", "stats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.UPTIME): DataFunction(
|
|
||||||
"_get_uptime",
|
|
||||||
[RPCAPICommand("api_stats", "stats")],
|
|
||||||
),
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class Hiveon(BMMiner):
|
class Hiveon(BMMiner):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
|
firmware = "Hive"
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
self.pwd = settings.get("default_hive_password", "admin")
|
|
||||||
# static data
|
|
||||||
self.api_type = "Hiveon"
|
|
||||||
# data gathering locations
|
|
||||||
self.data_locations = HIVEON_DATA_LOC
|
|
||||||
|
|
||||||
async def _get_hashboards(self, api_stats: dict = None) -> List[HashBoard]:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_wattage(self, api_stats: dict = None) -> Optional[int]:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_env_temp(self, api_stats: dict = None) -> Optional[float]:
|
|
||||||
pass
|
|
||||||
|
|||||||
@@ -80,7 +80,6 @@ INNOSILICON_DATA_LOC = DataLocations(
|
|||||||
WebAPICommand("web_get_all", "getAll"),
|
WebAPICommand("web_get_all", "getAll"),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
str(DataOptions.FAN_PSU): DataFunction("_get_fan_psu"),
|
|
||||||
str(DataOptions.ERRORS): DataFunction(
|
str(DataOptions.ERRORS): DataFunction(
|
||||||
"_get_errors",
|
"_get_errors",
|
||||||
[
|
[
|
||||||
@@ -96,25 +95,13 @@ INNOSILICON_DATA_LOC = DataLocations(
|
|||||||
|
|
||||||
|
|
||||||
class Innosilicon(CGMiner):
|
class Innosilicon(CGMiner):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
|
"""Base handler for Innosilicon miners"""
|
||||||
super().__init__(ip, api_ver=api_ver)
|
|
||||||
# interfaces
|
|
||||||
self.web = InnosiliconWebAPI(ip)
|
|
||||||
|
|
||||||
# static data
|
_web_cls = InnosiliconWebAPI
|
||||||
# data gathering locations
|
|
||||||
self.data_locations = INNOSILICON_DATA_LOC
|
|
||||||
# autotuning/shutdown support
|
|
||||||
self.supports_shutdown = True
|
|
||||||
|
|
||||||
# data storage
|
data_locations = INNOSILICON_DATA_LOC
|
||||||
self.api_ver = api_ver
|
|
||||||
|
|
||||||
async def fault_light_on(self) -> bool:
|
supports_shutdown = True
|
||||||
return False
|
|
||||||
|
|
||||||
async def fault_light_off(self) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def get_config(self) -> MinerConfig:
|
async def get_config(self) -> MinerConfig:
|
||||||
# get pool data
|
# get pool data
|
||||||
@@ -145,23 +132,6 @@ class Innosilicon(CGMiner):
|
|||||||
async def restart_backend(self) -> bool:
|
async def restart_backend(self) -> bool:
|
||||||
return await self.restart_cgminer()
|
return await self.restart_cgminer()
|
||||||
|
|
||||||
async def stop_mining(self) -> bool:
|
|
||||||
return False
|
|
||||||
# data = await self.web.poweroff()
|
|
||||||
# try:
|
|
||||||
# return data["success"]
|
|
||||||
# except KeyError:
|
|
||||||
# return False
|
|
||||||
|
|
||||||
async def resume_mining(self) -> bool:
|
|
||||||
return False
|
|
||||||
# data = await self.web.restart_cgminer()
|
|
||||||
# print(data)
|
|
||||||
# try:
|
|
||||||
# return data["success"]
|
|
||||||
# except KeyError:
|
|
||||||
# return False
|
|
||||||
|
|
||||||
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
|
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
|
||||||
self.config = config
|
self.config = config
|
||||||
await self.web.update_pools(config.as_inno(user_suffix=user_suffix))
|
await self.web.update_pools(config.as_inno(user_suffix=user_suffix))
|
||||||
@@ -393,6 +363,3 @@ class Innosilicon(CGMiner):
|
|||||||
level = int(level)
|
level = int(level)
|
||||||
limit = 1250 + (250 * level)
|
limit = 1250 + (250 * level)
|
||||||
return limit
|
return limit
|
||||||
|
|
||||||
async def _get_expected_hashrate(self) -> Optional[float]:
|
|
||||||
pass
|
|
||||||
|
|||||||
@@ -13,11 +13,10 @@
|
|||||||
# See the License for the specific language governing permissions and -
|
# See the License for the specific language governing permissions and -
|
||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
from typing import List, Optional, Tuple, Union
|
from typing import List, Optional
|
||||||
|
|
||||||
from pyasic.config import MinerConfig
|
from pyasic.config import MinerConfig
|
||||||
from pyasic.data import Fan, HashBoard
|
from pyasic.data import Fan, HashBoard
|
||||||
from pyasic.data.error_codes import MinerErrorData
|
|
||||||
from pyasic.errors import APIError
|
from pyasic.errors import APIError
|
||||||
from pyasic.miners.base import (
|
from pyasic.miners.base import (
|
||||||
BaseMiner,
|
BaseMiner,
|
||||||
@@ -62,23 +61,11 @@ LUXMINER_DATA_LOC = DataLocations(
|
|||||||
|
|
||||||
|
|
||||||
class LUXMiner(BaseMiner):
|
class LUXMiner(BaseMiner):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
|
_api_cls = LUXMinerRPCAPI
|
||||||
super().__init__(ip)
|
|
||||||
# interfaces
|
|
||||||
self.api = LUXMinerRPCAPI(ip, api_ver)
|
|
||||||
# self.web = BOSMinerWebAPI(ip)
|
|
||||||
|
|
||||||
# static data
|
firmware = "LuxOS"
|
||||||
self.api_type = "LUXMiner"
|
|
||||||
self.fw_str = "LuxOS"
|
|
||||||
# data gathering locations
|
|
||||||
self.data_locations = LUXMINER_DATA_LOC
|
|
||||||
# autotuning/shutdown support
|
|
||||||
# self.supports_autotuning = True
|
|
||||||
# self.supports_shutdown = True
|
|
||||||
|
|
||||||
# data storage
|
data_locations = LUXMINER_DATA_LOC
|
||||||
self.api_ver = api_ver
|
|
||||||
|
|
||||||
async def _get_session(self) -> Optional[str]:
|
async def _get_session(self) -> Optional[str]:
|
||||||
try:
|
try:
|
||||||
@@ -159,12 +146,6 @@ class LUXMiner(BaseMiner):
|
|||||||
async def get_config(self) -> MinerConfig:
|
async def get_config(self) -> MinerConfig:
|
||||||
return self.config
|
return self.config
|
||||||
|
|
||||||
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def set_power_limit(self, wattage: int) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
##################################################
|
##################################################
|
||||||
### DATA GATHERING FUNCTIONS (get_{some_data}) ###
|
### DATA GATHERING FUNCTIONS (get_{some_data}) ###
|
||||||
##################################################
|
##################################################
|
||||||
@@ -185,18 +166,6 @@ class LUXMiner(BaseMiner):
|
|||||||
|
|
||||||
return mac
|
return mac
|
||||||
|
|
||||||
async def get_version(self) -> Tuple[Optional[str], Optional[str]]:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_api_ver(self) -> Optional[str]:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_fw_ver(self) -> Optional[str]:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_hostname(self) -> Union[str, None]:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_hashrate(self, api_summary: dict = None) -> Optional[float]:
|
async def _get_hashrate(self, api_summary: dict = None) -> Optional[float]:
|
||||||
if api_summary is None:
|
if api_summary is None:
|
||||||
try:
|
try:
|
||||||
@@ -264,10 +233,7 @@ class LUXMiner(BaseMiner):
|
|||||||
|
|
||||||
return hashboards
|
return hashboards
|
||||||
|
|
||||||
async def _get_env_temp(self) -> Optional[float]:
|
async def _get_wattage(self, api_power: dict = None) -> Optional[int]:
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_wattage(self, api_power: dict) -> Optional[int]:
|
|
||||||
if api_power is None:
|
if api_power is None:
|
||||||
try:
|
try:
|
||||||
api_power = await self.api.power()
|
api_power = await self.api.power()
|
||||||
@@ -280,9 +246,6 @@ class LUXMiner(BaseMiner):
|
|||||||
except (LookupError, ValueError, TypeError):
|
except (LookupError, ValueError, TypeError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_wattage_limit(self) -> Optional[int]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_fans(self, api_fans: dict = None) -> List[Fan]:
|
async def _get_fans(self, api_fans: dict = None) -> List[Fan]:
|
||||||
if api_fans is None:
|
if api_fans is None:
|
||||||
try:
|
try:
|
||||||
@@ -300,15 +263,6 @@ class LUXMiner(BaseMiner):
|
|||||||
fans.append(Fan())
|
fans.append(Fan())
|
||||||
return fans
|
return fans
|
||||||
|
|
||||||
async def _get_fan_psu(self) -> Optional[int]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_errors(self) -> List[MinerErrorData]:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_fault_light(self) -> bool:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_expected_hashrate(self, api_stats: dict = None) -> Optional[float]:
|
async def _get_expected_hashrate(self, api_stats: dict = None) -> Optional[float]:
|
||||||
if api_stats is None:
|
if api_stats is None:
|
||||||
try:
|
try:
|
||||||
@@ -332,9 +286,6 @@ class LUXMiner(BaseMiner):
|
|||||||
except LookupError:
|
except LookupError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _is_mining(self) -> Optional[bool]:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_uptime(self, api_stats: dict = None) -> Optional[int]:
|
async def _get_uptime(self, api_stats: dict = None) -> Optional[int]:
|
||||||
if api_stats is None:
|
if api_stats is None:
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -75,16 +75,11 @@ VNISH_DATA_LOC = DataLocations(
|
|||||||
|
|
||||||
|
|
||||||
class VNish(BMMiner):
|
class VNish(BMMiner):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
|
_web_cls = VNishWebAPI
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
# interfaces
|
|
||||||
self.web = VNishWebAPI(ip)
|
|
||||||
|
|
||||||
# static data
|
firmware = "VNish"
|
||||||
self.api_type = "VNish"
|
|
||||||
self.fw_str = "VNish"
|
data_locations = VNISH_DATA_LOC
|
||||||
# data gathering locations
|
|
||||||
self.data_locations = VNISH_DATA_LOC
|
|
||||||
|
|
||||||
async def restart_backend(self) -> bool:
|
async def restart_backend(self) -> bool:
|
||||||
data = await self.web.restart_vnish()
|
data = await self.web.restart_vnish()
|
||||||
@@ -211,12 +206,6 @@ class VNish(BMMiner):
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _is_mining(self, *args, **kwargs) -> Optional[bool]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_uptime(self, *args, **kwargs) -> Optional[int]:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def get_config(self) -> MinerConfig:
|
async def get_config(self) -> MinerConfig:
|
||||||
try:
|
try:
|
||||||
web_settings = await self.web.settings()
|
web_settings = await self.web.settings()
|
||||||
|
|||||||
@@ -17,21 +17,15 @@ from pyasic.miners.backends.btminer import BTMiner
|
|||||||
|
|
||||||
|
|
||||||
class M6X(BTMiner):
|
class M6X(BTMiner):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
supports_autotuning = True
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
self.supports_autotuning = True
|
|
||||||
|
|
||||||
|
|
||||||
class M5X(BTMiner):
|
class M5X(BTMiner):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
supports_autotuning = True
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
self.supports_autotuning = True
|
|
||||||
|
|
||||||
|
|
||||||
class M3X(BTMiner):
|
class M3X(BTMiner):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
supports_autotuning = True
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
self.supports_autotuning = True
|
|
||||||
|
|
||||||
|
|
||||||
class M2X(BTMiner):
|
class M2X(BTMiner):
|
||||||
|
|||||||
@@ -16,10 +16,10 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
import ipaddress
|
import ipaddress
|
||||||
import logging
|
import logging
|
||||||
from abc import ABC, abstractmethod
|
import warnings
|
||||||
from dataclasses import dataclass, field, make_dataclass
|
from dataclasses import dataclass, field, make_dataclass
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from typing import List, Optional, Tuple, TypeVar, Union
|
from typing import Dict, List, Optional, Protocol, Tuple, Type, TypeVar, Union
|
||||||
|
|
||||||
import asyncssh
|
import asyncssh
|
||||||
|
|
||||||
@@ -88,7 +88,7 @@ class GraphQLCommand(WebAPICommand):
|
|||||||
@dataclass
|
@dataclass
|
||||||
class DataFunction:
|
class DataFunction:
|
||||||
cmd: str
|
cmd: str
|
||||||
kwargs: list[
|
kwargs: List[
|
||||||
Union[RPCAPICommand, WebAPICommand, GRPCCommand, GraphQLCommand]
|
Union[RPCAPICommand, WebAPICommand, GRPCCommand, GraphQLCommand]
|
||||||
] = field(default_factory=list)
|
] = field(default_factory=list)
|
||||||
|
|
||||||
@@ -106,39 +106,30 @@ DataLocations = make_dataclass(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class BaseMiner(ABC):
|
class MinerProtocol(Protocol):
|
||||||
def __init__(self, ip: str, *args, **kwargs) -> None:
|
_api_cls: Type = None
|
||||||
# interfaces
|
_web_cls: Type = None
|
||||||
self.api = None
|
|
||||||
self.web = None
|
|
||||||
|
|
||||||
# static data
|
api = None
|
||||||
self.ip = ip
|
web = None
|
||||||
self.api_type = None
|
|
||||||
# type
|
|
||||||
self.make = None
|
|
||||||
self.raw_model = None
|
|
||||||
self.fw_str = None
|
|
||||||
# physical attributes
|
|
||||||
self.expected_hashboards = 3
|
|
||||||
self.expected_chips = 0
|
|
||||||
self.expected_fans = 2
|
|
||||||
# data gathering locations
|
|
||||||
self.data_locations: DataLocations = None
|
|
||||||
# autotuning/shutdown support
|
|
||||||
self.supports_autotuning = False
|
|
||||||
self.supports_shutdown = False
|
|
||||||
|
|
||||||
# data storage
|
make: str = None
|
||||||
self.api_ver = None
|
raw_model: str = None
|
||||||
self.fw_ver = None
|
firmware: str = None
|
||||||
self.light = None
|
|
||||||
self.config = None
|
|
||||||
|
|
||||||
def __new__(cls, *args, **kwargs):
|
expected_hashboards: int = 3
|
||||||
if cls is BaseMiner:
|
expected_chips: int = None
|
||||||
raise TypeError(f"Only children of '{cls.__name__}' may be instantiated")
|
expected_fans: int = 2
|
||||||
return object.__new__(cls)
|
|
||||||
|
data_locations: DataLocations = None
|
||||||
|
|
||||||
|
supports_shutdown: bool = False
|
||||||
|
supports_autotuning: bool = False
|
||||||
|
|
||||||
|
api_ver: str = None
|
||||||
|
fw_ver: str = None
|
||||||
|
light: bool = None
|
||||||
|
config: MinerConfig = None
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f"{self.model}: {str(self.ip)}"
|
return f"{self.model}: {str(self.ip)}"
|
||||||
@@ -153,57 +144,41 @@ class BaseMiner(ABC):
|
|||||||
return ipaddress.ip_address(self.ip) == ipaddress.ip_address(other.ip)
|
return ipaddress.ip_address(self.ip) == ipaddress.ip_address(other.ip)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def model(self):
|
def model(self) -> str:
|
||||||
model_data = [self.raw_model if self.raw_model is not None else "Unknown"]
|
model_data = [self.raw_model if self.raw_model is not None else "Unknown"]
|
||||||
if self.fw_str is not None:
|
if self.firmware is not None:
|
||||||
model_data.append(f"({self.fw_str})")
|
model_data.append(f"({self.firmware})")
|
||||||
return " ".join(model_data)
|
return " ".join(model_data)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def pwd(self): # noqa - Skip PyCharm inspection
|
def pwd(self) -> Dict[str, str]:
|
||||||
data = []
|
data = {}
|
||||||
try:
|
if self.web is not None:
|
||||||
if self.web is not None:
|
data["web"] = self.web.pwd
|
||||||
data.append(f"web={self.web.pwd}")
|
if self.api is not None:
|
||||||
except TypeError:
|
data["api"] = self.api.pwd
|
||||||
pass
|
return data
|
||||||
try:
|
|
||||||
if self.api is not None:
|
|
||||||
data.append(f"api={self.api.pwd}")
|
|
||||||
except TypeError:
|
|
||||||
pass
|
|
||||||
return ",".join(data)
|
|
||||||
|
|
||||||
@pwd.setter
|
@pwd.setter
|
||||||
def pwd(self, val):
|
def pwd(self, val: str) -> None:
|
||||||
try:
|
if self.web is not None:
|
||||||
if self.web is not None:
|
self.web.pwd = val
|
||||||
self.web.pwd = val
|
if self.api is not None:
|
||||||
except TypeError:
|
self.api.pwd = val
|
||||||
pass
|
|
||||||
try:
|
|
||||||
if self.api is not None:
|
|
||||||
self.api.pwd = val
|
|
||||||
except TypeError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def username(self): # noqa - Skip PyCharm inspection
|
def username(self) -> Dict[str, str]:
|
||||||
data = []
|
data = {}
|
||||||
try:
|
if self.web is not None:
|
||||||
if self.web is not None:
|
data["web"] = self.web.pwd
|
||||||
data.append(f"web={self.web.username}")
|
if self.api is not None:
|
||||||
except TypeError:
|
data["api"] = self.api.pwd
|
||||||
pass
|
return data
|
||||||
return ",".join(data)
|
|
||||||
|
|
||||||
@username.setter
|
@username.setter
|
||||||
def username(self, val):
|
def username(self, val) -> None:
|
||||||
try:
|
if self.web is not None:
|
||||||
if self.web is not None:
|
self.web.username = val
|
||||||
self.web.username = val
|
|
||||||
except TypeError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_ssh_connection(self) -> asyncssh.connect:
|
async def _get_ssh_connection(self) -> asyncssh.connect:
|
||||||
"""Create a new asyncssh connection"""
|
"""Create a new asyncssh connection"""
|
||||||
@@ -216,44 +191,47 @@ class BaseMiner(ABC):
|
|||||||
server_host_key_algs=["ssh-rsa"],
|
server_host_key_algs=["ssh-rsa"],
|
||||||
)
|
)
|
||||||
return conn
|
return conn
|
||||||
except asyncssh.misc.PermissionDenied:
|
except asyncssh.misc.PermissionDenied as e:
|
||||||
try:
|
raise ConnectionRefusedError from e
|
||||||
conn = await asyncssh.connect(
|
|
||||||
str(self.ip),
|
|
||||||
known_hosts=None,
|
|
||||||
username="root",
|
|
||||||
password="admin",
|
|
||||||
server_host_key_algs=["ssh-rsa"],
|
|
||||||
)
|
|
||||||
return conn
|
|
||||||
except Exception as e:
|
|
||||||
raise ConnectionError from e
|
|
||||||
except OSError as e:
|
|
||||||
logging.warning(f"Connection refused: {self}")
|
|
||||||
raise ConnectionError from e
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ConnectionError from e
|
raise ConnectionError from e
|
||||||
|
|
||||||
|
async def send_ssh_command(self, cmd: str) -> Optional[str]:
|
||||||
|
"""Send an ssh command to the miner"""
|
||||||
|
try:
|
||||||
|
conn = await asyncio.wait_for(self._get_ssh_connection(), timeout=10)
|
||||||
|
except (ConnectionError, asyncio.TimeoutError):
|
||||||
|
return None
|
||||||
|
|
||||||
|
try:
|
||||||
|
async with conn:
|
||||||
|
resp = await conn.run(cmd)
|
||||||
|
result = max(resp.stdout, resp.stderr, key=lambda x: len(x))
|
||||||
|
|
||||||
|
return result
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"{self} command {cmd} error: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
async def check_light(self) -> bool:
|
async def check_light(self) -> bool:
|
||||||
return await self.get_fault_light()
|
return await self.get_fault_light()
|
||||||
|
|
||||||
@abstractmethod
|
|
||||||
async def fault_light_on(self) -> bool:
|
async def fault_light_on(self) -> bool:
|
||||||
"""Turn the fault light of the miner on and return success as a boolean.
|
"""Turn the fault light of the miner on and return success as a boolean.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
A boolean value of the success of turning the light on.
|
A boolean value of the success of turning the light on.
|
||||||
"""
|
"""
|
||||||
|
return False
|
||||||
|
|
||||||
@abstractmethod
|
|
||||||
async def fault_light_off(self) -> bool:
|
async def fault_light_off(self) -> bool:
|
||||||
"""Turn the fault light of the miner off and return success as a boolean.
|
"""Turn the fault light of the miner off and return success as a boolean.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
A boolean value of the success of turning the light off.
|
A boolean value of the success of turning the light off.
|
||||||
"""
|
"""
|
||||||
|
return False
|
||||||
|
|
||||||
@abstractmethod
|
|
||||||
async def get_config(self) -> MinerConfig:
|
async def get_config(self) -> MinerConfig:
|
||||||
# Not a data gathering function, since this is used for configuration
|
# Not a data gathering function, since this is used for configuration
|
||||||
"""Get the mining configuration of the miner and return it as a [`MinerConfig`][pyasic.config.MinerConfig].
|
"""Get the mining configuration of the miner and return it as a [`MinerConfig`][pyasic.config.MinerConfig].
|
||||||
@@ -261,24 +239,24 @@ class BaseMiner(ABC):
|
|||||||
Returns:
|
Returns:
|
||||||
A [`MinerConfig`][pyasic.config.MinerConfig] containing the pool information and mining configuration.
|
A [`MinerConfig`][pyasic.config.MinerConfig] containing the pool information and mining configuration.
|
||||||
"""
|
"""
|
||||||
|
return MinerConfig()
|
||||||
|
|
||||||
@abstractmethod
|
|
||||||
async def reboot(self) -> bool:
|
async def reboot(self) -> bool:
|
||||||
"""Reboot the miner and return success as a boolean.
|
"""Reboot the miner and return success as a boolean.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
A boolean value of the success of rebooting the miner.
|
A boolean value of the success of rebooting the miner.
|
||||||
"""
|
"""
|
||||||
|
return False
|
||||||
|
|
||||||
@abstractmethod
|
|
||||||
async def restart_backend(self) -> bool:
|
async def restart_backend(self) -> bool:
|
||||||
"""Restart the mining process of the miner (bosminer, bmminer, cgminer, etc) and return success as a boolean.
|
"""Restart the mining process of the miner (bosminer, bmminer, cgminer, etc) and return success as a boolean.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
A boolean value of the success of restarting the mining process.
|
A boolean value of the success of restarting the mining process.
|
||||||
"""
|
"""
|
||||||
|
return False
|
||||||
|
|
||||||
@abstractmethod
|
|
||||||
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
|
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
|
||||||
"""Set the mining configuration of the miner.
|
"""Set the mining configuration of the miner.
|
||||||
|
|
||||||
@@ -286,24 +264,24 @@ class BaseMiner(ABC):
|
|||||||
config: A [`MinerConfig`][pyasic.config.MinerConfig] containing the mining config you want to switch the miner to.
|
config: A [`MinerConfig`][pyasic.config.MinerConfig] containing the mining config you want to switch the miner to.
|
||||||
user_suffix: A suffix to append to the username when sending to the miner.
|
user_suffix: A suffix to append to the username when sending to the miner.
|
||||||
"""
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
|
||||||
async def stop_mining(self) -> bool:
|
async def stop_mining(self) -> bool:
|
||||||
"""Stop the mining process of the miner.
|
"""Stop the mining process of the miner.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
A boolean value of the success of stopping the mining process.
|
A boolean value of the success of stopping the mining process.
|
||||||
"""
|
"""
|
||||||
|
return False
|
||||||
|
|
||||||
@abstractmethod
|
|
||||||
async def resume_mining(self) -> bool:
|
async def resume_mining(self) -> bool:
|
||||||
"""Resume the mining process of the miner.
|
"""Resume the mining process of the miner.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
A boolean value of the success of resuming the mining process.
|
A boolean value of the success of resuming the mining process.
|
||||||
"""
|
"""
|
||||||
|
return False
|
||||||
|
|
||||||
@abstractmethod
|
|
||||||
async def set_power_limit(self, wattage: int) -> bool:
|
async def set_power_limit(self, wattage: int) -> bool:
|
||||||
"""Set the power limit to be used by the miner.
|
"""Set the power limit to be used by the miner.
|
||||||
|
|
||||||
@@ -313,6 +291,7 @@ class BaseMiner(ABC):
|
|||||||
Returns:
|
Returns:
|
||||||
A boolean value of the success of setting the power limit.
|
A boolean value of the success of setting the power limit.
|
||||||
"""
|
"""
|
||||||
|
return False
|
||||||
|
|
||||||
##################################################
|
##################################################
|
||||||
### DATA GATHERING FUNCTIONS (get_{some_data}) ###
|
### DATA GATHERING FUNCTIONS (get_{some_data}) ###
|
||||||
@@ -464,68 +443,52 @@ class BaseMiner(ABC):
|
|||||||
"""
|
"""
|
||||||
return await self._get_uptime()
|
return await self._get_uptime()
|
||||||
|
|
||||||
@abstractmethod
|
async def _get_mac(self) -> Optional[str]:
|
||||||
async def _get_mac(self, *args, **kwargs) -> Optional[str]:
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
async def _get_api_ver(self) -> Optional[str]:
|
||||||
async def _get_api_ver(self, *args, **kwargs) -> Optional[str]:
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
async def _get_fw_ver(self) -> Optional[str]:
|
||||||
async def _get_fw_ver(self, *args, **kwargs) -> Optional[str]:
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
async def _get_hostname(self) -> Optional[str]:
|
||||||
async def _get_hostname(self, *args, **kwargs) -> Optional[str]:
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
async def _get_hashrate(self) -> Optional[float]:
|
||||||
async def _get_hashrate(self, *args, **kwargs) -> Optional[float]:
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
async def _get_hashboards(self) -> List[HashBoard]:
|
||||||
async def _get_hashboards(self, *args, **kwargs) -> List[HashBoard]:
|
return []
|
||||||
|
|
||||||
|
async def _get_env_temp(self) -> Optional[float]:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
async def _get_wattage(self) -> Optional[int]:
|
||||||
async def _get_env_temp(self, *args, **kwargs) -> Optional[float]:
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
async def _get_wattage_limit(self) -> Optional[int]:
|
||||||
async def _get_wattage(self, *args, **kwargs) -> Optional[int]:
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
async def _get_fans(self) -> List[Fan]:
|
||||||
async def _get_wattage_limit(self, *args, **kwargs) -> Optional[int]:
|
return []
|
||||||
|
|
||||||
|
async def _get_fan_psu(self) -> Optional[int]:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
async def _get_errors(self) -> List[MinerErrorData]:
|
||||||
async def _get_fans(self, *args, **kwargs) -> List[Fan]:
|
return []
|
||||||
|
|
||||||
|
async def _get_fault_light(self) -> Optional[bool]:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
async def _get_expected_hashrate(self) -> Optional[float]:
|
||||||
async def _get_fan_psu(self, *args, **kwargs) -> Optional[int]:
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
async def _is_mining(self) -> Optional[bool]:
|
||||||
async def _get_errors(self, *args, **kwargs) -> List[MinerErrorData]:
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
async def _get_uptime(self) -> Optional[int]:
|
||||||
async def _get_fault_light(self, *args, **kwargs) -> bool:
|
|
||||||
pass
|
|
||||||
|
|
||||||
@abstractmethod
|
|
||||||
async def _get_expected_hashrate(self, *args, **kwargs) -> Optional[float]:
|
|
||||||
pass
|
|
||||||
|
|
||||||
@abstractmethod
|
|
||||||
async def _is_mining(self, *args, **kwargs) -> Optional[bool]:
|
|
||||||
pass
|
|
||||||
|
|
||||||
@abstractmethod
|
|
||||||
async def _get_uptime(self, *args, **kwargs) -> Optional[int]:
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_data(
|
async def _get_data(
|
||||||
@@ -652,4 +615,21 @@ class BaseMiner(ABC):
|
|||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
class BaseMiner(MinerProtocol):
|
||||||
|
def __init__(self, ip: str) -> None:
|
||||||
|
self.ip = ip
|
||||||
|
|
||||||
|
if self.expected_chips is None:
|
||||||
|
warnings.warn(
|
||||||
|
f"Unknown chip count for miner type {self.raw_model}, "
|
||||||
|
f"please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
|
||||||
|
)
|
||||||
|
|
||||||
|
# interfaces
|
||||||
|
if self._api_cls is not None:
|
||||||
|
self.api = self._api_cls(ip)
|
||||||
|
if self._web_cls is not None:
|
||||||
|
self.web = self._web_cls(ip)
|
||||||
|
|
||||||
|
|
||||||
AnyMiner = TypeVar("AnyMiner", bound=BaseMiner)
|
AnyMiner = TypeVar("AnyMiner", bound=BaseMiner)
|
||||||
|
|||||||
@@ -13,9 +13,9 @@
|
|||||||
# See the License for the specific language governing permissions and -
|
# See the License for the specific language governing permissions and -
|
||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
from pyasic.miners.backends import BFGMinerGoldshell
|
from pyasic.miners.backends import GoldshellMiner
|
||||||
from pyasic.miners.types import CK5
|
from pyasic.miners.types import CK5
|
||||||
|
|
||||||
|
|
||||||
class BFGMinerCK5(BFGMinerGoldshell, CK5):
|
class GoldshellCK5(GoldshellMiner, CK5):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -13,9 +13,9 @@
|
|||||||
# See the License for the specific language governing permissions and -
|
# See the License for the specific language governing permissions and -
|
||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
from pyasic.miners.backends import BFGMinerGoldshell
|
from pyasic.miners.backends import GoldshellMiner
|
||||||
from pyasic.miners.types import HS5
|
from pyasic.miners.types import HS5
|
||||||
|
|
||||||
|
|
||||||
class BFGMinerHS5(BFGMinerGoldshell, HS5):
|
class GoldshellHS5(GoldshellMiner, HS5):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -13,9 +13,9 @@
|
|||||||
# See the License for the specific language governing permissions and -
|
# See the License for the specific language governing permissions and -
|
||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
from pyasic.miners.backends import BFGMinerGoldshell
|
from pyasic.miners.backends import GoldshellMiner
|
||||||
from pyasic.miners.types import KD5
|
from pyasic.miners.types import KD5
|
||||||
|
|
||||||
|
|
||||||
class BFGMinerKD5(BFGMinerGoldshell, KD5):
|
class GoldshellKD5(GoldshellMiner, KD5):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -13,6 +13,6 @@
|
|||||||
# See the License for the specific language governing permissions and -
|
# See the License for the specific language governing permissions and -
|
||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
from .CK5 import BFGMinerCK5
|
from .CK5 import GoldshellCK5
|
||||||
from .HS5 import BFGMinerHS5
|
from .HS5 import GoldshellHS5
|
||||||
from .KD5 import BFGMinerKD5
|
from .KD5 import GoldshellKD5
|
||||||
|
|||||||
@@ -13,9 +13,9 @@
|
|||||||
# See the License for the specific language governing permissions and -
|
# See the License for the specific language governing permissions and -
|
||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
from pyasic.miners.backends import BFGMinerGoldshell
|
from pyasic.miners.backends import GoldshellMiner
|
||||||
from pyasic.miners.types import KDMax
|
from pyasic.miners.types import KDMax
|
||||||
|
|
||||||
|
|
||||||
class BFGMinerKDMax(BFGMinerGoldshell, KDMax):
|
class BFGMinerGoldshellKDMax(GoldshellMiner, KDMax):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -13,4 +13,4 @@
|
|||||||
# See the License for the specific language governing permissions and -
|
# See the License for the specific language governing permissions and -
|
||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
from .KDMax import BFGMinerKDMax
|
from .KDMax import BFGMinerGoldshellKDMax
|
||||||
|
|||||||
@@ -17,31 +17,21 @@
|
|||||||
from pyasic.miners.base import BaseMiner
|
from pyasic.miners.base import BaseMiner
|
||||||
|
|
||||||
|
|
||||||
class WhatsMiner(BaseMiner): # noqa - ignore ABC method implementation
|
class WhatsMinerMake(BaseMiner):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
make = "WhatsMiner"
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
self.make = "WhatsMiner"
|
|
||||||
|
|
||||||
|
|
||||||
class AntMiner(BaseMiner): # noqa - ignore ABC method implementation
|
class AntMinerMake(BaseMiner):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
make = "AntMiner"
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
self.make = "AntMiner"
|
|
||||||
|
|
||||||
|
|
||||||
class AvalonMiner(BaseMiner): # noqa - ignore ABC method implementation
|
class AvalonMinerMake(BaseMiner):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
make = "AvalonMiner"
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
self.make = "AvalonMiner"
|
|
||||||
|
|
||||||
|
|
||||||
class InnosiliconMiner(BaseMiner): # noqa - ignore ABC method implementation
|
class InnosiliconMake(BaseMiner):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
make = "Innosilicon"
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
self.make = "Innosilicon"
|
|
||||||
|
|
||||||
|
|
||||||
class GoldshellMiner(BaseMiner): # noqa - ignore ABC method implementation
|
class GoldshellMake(BaseMiner):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
make = "Goldshell"
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
self.make = "Goldshell"
|
|
||||||
|
|||||||
@@ -28,17 +28,17 @@ from pyasic.logger import logger
|
|||||||
from pyasic.miners.antminer import *
|
from pyasic.miners.antminer import *
|
||||||
from pyasic.miners.avalonminer import *
|
from pyasic.miners.avalonminer import *
|
||||||
from pyasic.miners.backends import (
|
from pyasic.miners.backends import (
|
||||||
BFGMiner,
|
AvalonMiner,
|
||||||
BMMiner,
|
BMMiner,
|
||||||
BOSMiner,
|
BOSMiner,
|
||||||
BTMiner,
|
BTMiner,
|
||||||
CGMiner,
|
GoldshellMiner,
|
||||||
CGMinerAvalon,
|
|
||||||
Hiveon,
|
Hiveon,
|
||||||
LUXMiner,
|
LUXMiner,
|
||||||
VNish,
|
VNish,
|
||||||
ePIC,
|
ePIC,
|
||||||
)
|
)
|
||||||
|
from pyasic.miners.backends.innosilicon import Innosilicon
|
||||||
from pyasic.miners.base import AnyMiner
|
from pyasic.miners.base import AnyMiner
|
||||||
from pyasic.miners.goldshell import *
|
from pyasic.miners.goldshell import *
|
||||||
from pyasic.miners.innosilicon import *
|
from pyasic.miners.innosilicon import *
|
||||||
@@ -310,7 +310,7 @@ MINER_CLASSES = {
|
|||||||
"M66SVK40": BTMinerM66SVK40,
|
"M66SVK40": BTMinerM66SVK40,
|
||||||
},
|
},
|
||||||
MinerTypes.AVALONMINER: {
|
MinerTypes.AVALONMINER: {
|
||||||
None: CGMinerAvalon,
|
None: AvalonMiner,
|
||||||
"AVALONMINER 721": CGMinerAvalon721,
|
"AVALONMINER 721": CGMinerAvalon721,
|
||||||
"AVALONMINER 741": CGMinerAvalon741,
|
"AVALONMINER 741": CGMinerAvalon741,
|
||||||
"AVALONMINER 761": CGMinerAvalon761,
|
"AVALONMINER 761": CGMinerAvalon761,
|
||||||
@@ -325,16 +325,16 @@ MINER_CLASSES = {
|
|||||||
"AVALONMINER 1246": CGMinerAvalon1246,
|
"AVALONMINER 1246": CGMinerAvalon1246,
|
||||||
},
|
},
|
||||||
MinerTypes.INNOSILICON: {
|
MinerTypes.INNOSILICON: {
|
||||||
None: CGMiner,
|
None: Innosilicon,
|
||||||
"T3H+": InnosiliconT3HPlus,
|
"T3H+": InnosiliconT3HPlus,
|
||||||
"A10X": InnosiliconA10X,
|
"A10X": InnosiliconA10X,
|
||||||
},
|
},
|
||||||
MinerTypes.GOLDSHELL: {
|
MinerTypes.GOLDSHELL: {
|
||||||
None: BFGMiner,
|
None: GoldshellMiner,
|
||||||
"GOLDSHELL CK5": BFGMinerCK5,
|
"GOLDSHELL CK5": GoldshellCK5,
|
||||||
"GOLDSHELL HS5": BFGMinerHS5,
|
"GOLDSHELL HS5": GoldshellHS5,
|
||||||
"GOLDSHELL KD5": BFGMinerKD5,
|
"GOLDSHELL KD5": GoldshellKD5,
|
||||||
"GOLDSHELL KDMAX": BFGMinerKDMax,
|
"GOLDSHELL KDMAX": BFGMinerGoldshellKDMax,
|
||||||
},
|
},
|
||||||
MinerTypes.BRAIINS_OS: {
|
MinerTypes.BRAIINS_OS: {
|
||||||
None: BOSMiner,
|
None: BOSMiner,
|
||||||
@@ -761,7 +761,7 @@ class MinerFactory:
|
|||||||
str_data = ",".join(str_data.split(",")[:-1]) + "}"
|
str_data = ",".join(str_data.split(",")[:-1]) + "}"
|
||||||
|
|
||||||
# fix a really nasty bug with whatsminer API v2.0.4 where they return a list structured like a dict
|
# fix a really nasty bug with whatsminer API v2.0.4 where they return a list structured like a dict
|
||||||
if re.search(r"\"error_code\":\[\".+\"\]", str_data):
|
if re.search(r"\"error_code\":\[\".+\"]", str_data):
|
||||||
str_data = str_data.replace("[", "{").replace("]", "}")
|
str_data = str_data.replace("[", "{").replace("]", "}")
|
||||||
|
|
||||||
return str_data
|
return str_data
|
||||||
|
|||||||
@@ -14,13 +14,10 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import AntMiner
|
from pyasic.miners.makes import AntMinerMake
|
||||||
|
|
||||||
|
|
||||||
class Z15(AntMiner): # noqa - ignore ABC method implementation
|
class Z15(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "Z15"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 3
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "Z15"
|
|
||||||
self.expected_chips = 3
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,39 +14,28 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import AntMiner
|
from pyasic.miners.makes import AntMinerMake
|
||||||
|
|
||||||
|
|
||||||
class S17(AntMiner): # noqa - ignore ABC method implementation
|
class S17(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S17"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 48
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "S17"
|
|
||||||
self.expected_chips = 48
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|
||||||
|
|
||||||
class S17Plus(AntMiner): # noqa - ignore ABC method implementation
|
class S17Plus(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S17+"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 65
|
||||||
self.raw_model = "S17+"
|
expected_fans = 4
|
||||||
self.expected_chips = 65
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|
||||||
|
|
||||||
class S17Pro(AntMiner): # noqa - ignore ABC method implementation
|
class S17Pro(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S17 Pro"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 48
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "S17 Pro"
|
|
||||||
self.expected_chips = 48
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|
||||||
|
|
||||||
class S17e(AntMiner): # noqa - ignore ABC method implementation
|
class S17e(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S17e"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 135
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "S17e"
|
|
||||||
self.expected_chips = 135
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|||||||
@@ -14,31 +14,22 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import AntMiner
|
from pyasic.miners.makes import AntMinerMake
|
||||||
|
|
||||||
|
|
||||||
class T17(AntMiner): # noqa - ignore ABC method implementation
|
class T17(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "T17"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 30
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "T17"
|
|
||||||
self.expected_chips = 30
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|
||||||
|
|
||||||
class T17Plus(AntMiner): # noqa - ignore ABC method implementation
|
class T17Plus(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "T17+"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 44
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "T17+"
|
|
||||||
self.expected_chips = 44
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|
||||||
|
|
||||||
class T17e(AntMiner): # noqa - ignore ABC method implementation
|
class T17e(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "T17e"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 78
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "T17e"
|
|
||||||
self.expected_chips = 78
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|||||||
@@ -14,158 +14,107 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import AntMiner
|
from pyasic.miners.makes import AntMinerMake
|
||||||
|
|
||||||
|
|
||||||
class S19(AntMiner): # noqa - ignore ABC method implementation
|
class S19(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S19"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 76
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "S19"
|
|
||||||
self.expected_chips = 76
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|
||||||
|
|
||||||
class S19NoPIC(AntMiner): # noqa - ignore ABC method implementation
|
class S19NoPIC(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S19 No PIC"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 88
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "S19 No PIC"
|
|
||||||
self.expected_chips = 88
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|
||||||
|
|
||||||
class S19Pro(AntMiner): # noqa - ignore ABC method implementation
|
class S19Pro(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S19 Pro"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 114
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "S19 Pro"
|
|
||||||
self.expected_chips = 114
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|
||||||
|
|
||||||
class S19i(AntMiner): # noqa - ignore ABC method implementation
|
class S19i(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S19i"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 80
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "S19i"
|
|
||||||
self.expected_chips = 80
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|
||||||
|
|
||||||
class S19Plus(AntMiner): # noqa - ignore ABC method implementation
|
class S19Plus(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S19+"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 80
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "S19+"
|
|
||||||
self.expected_chips = 80
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|
||||||
|
|
||||||
class S19ProPlus(AntMiner): # noqa - ignore ABC method implementation
|
class S19ProPlus(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S19 Pro+"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 120
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "S19 Pro+"
|
|
||||||
self.expected_chips = 120
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|
||||||
|
|
||||||
class S19XP(AntMiner): # noqa - ignore ABC method implementation
|
class S19XP(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S19 XP"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 110
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "S19 XP"
|
|
||||||
self.expected_chips = 110
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|
||||||
|
|
||||||
class S19a(AntMiner): # noqa - ignore ABC method implementation
|
class S19a(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S19a"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 72
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "S19a"
|
|
||||||
self.expected_chips = 72
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|
||||||
|
|
||||||
class S19aPro(AntMiner): # noqa - ignore ABC method implementation
|
class S19aPro(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S19a Pro"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 100
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "S19a Pro"
|
|
||||||
self.expected_chips = 100
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|
||||||
|
|
||||||
class S19j(AntMiner): # noqa - ignore ABC method implementation
|
class S19j(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S19j"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 114
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "S19j"
|
|
||||||
self.expected_chips = 114
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|
||||||
|
|
||||||
class S19jNoPIC(AntMiner): # noqa - ignore ABC method implementation
|
class S19jNoPIC(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S19j No PIC"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 88
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "S19j No PIC"
|
|
||||||
self.expected_chips = 88
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|
||||||
|
|
||||||
class S19jPro(AntMiner): # noqa - ignore ABC method implementation
|
class S19jPro(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S19j Pro"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 126
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "S19j Pro"
|
|
||||||
self.expected_chips = 126
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|
||||||
|
|
||||||
class S19jProPlus(AntMiner): # noqa - ignore ABC method implementation
|
class S19jProPlus(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S19j Pro+"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 120
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "S19j Pro+"
|
|
||||||
self.expected_chips = 120
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|
||||||
|
|
||||||
class S19kPro(AntMiner): # noqa - ignore ABC method implementation
|
class S19kPro(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S19k Pro"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 77
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "S19k Pro"
|
|
||||||
self.expected_chips = 77
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|
||||||
|
|
||||||
class S19L(AntMiner): # noqa - ignore ABC method implementation
|
class S19L(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S19L"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 76
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "S19L"
|
|
||||||
self.expected_chips = 76
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|
||||||
|
|
||||||
class S19kProNoPIC(AntMiner): # noqa - ignore ABC method implementation
|
class S19kProNoPIC(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S19k Pro No PIC"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 77
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "S19k Pro No PIC"
|
|
||||||
self.expected_chips = 77
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|
||||||
|
|
||||||
class S19ProHydro(AntMiner): # noqa - ignore ABC method implementation
|
class S19ProHydro(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S19 Pro Hydro"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 180
|
||||||
self.ip = ip
|
expected_hashboards = 4
|
||||||
self.raw_model = "S19 Pro Hydro"
|
expected_fans = 0
|
||||||
self.expected_chips = 180
|
|
||||||
self.expected_hashboards = 4
|
|
||||||
self.fan_count = 0
|
|
||||||
|
|||||||
@@ -14,13 +14,10 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import AntMiner
|
from pyasic.miners.makes import AntMinerMake
|
||||||
|
|
||||||
|
|
||||||
class T19(AntMiner): # noqa - ignore ABC method implementation
|
class T19(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "T19"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 76
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "T19"
|
|
||||||
self.expected_chips = 76
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|||||||
@@ -14,14 +14,12 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import AntMiner
|
from pyasic.miners.makes import AntMinerMake
|
||||||
|
|
||||||
|
|
||||||
class D3(AntMiner): # noqa - ignore ABC method implementation
|
class D3(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "D3"
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
self.ip = ip
|
expected_chips = 60
|
||||||
self.raw_model = "D3"
|
expected_hashboards = 3
|
||||||
self.expected_chips = 60
|
expected_fans = 2
|
||||||
self.expected_hashboards = 3
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,14 +14,12 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import AntMiner
|
from pyasic.miners.makes import AntMinerMake
|
||||||
|
|
||||||
|
|
||||||
class HS3(AntMiner): # noqa - ignore ABC method implementation
|
class HS3(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "HS3"
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
self.ip = ip
|
expected_chips = 92
|
||||||
self.raw_model = "HS3"
|
expected_hashboards = 3
|
||||||
self.expected_chips = 92
|
expected_fans = 2
|
||||||
self.expected_hashboards = 3
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -13,13 +13,10 @@
|
|||||||
# See the License for the specific language governing permissions and -
|
# See the License for the specific language governing permissions and -
|
||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
from pyasic.miners.makes import AntMiner
|
from pyasic.miners.makes import AntMinerMake
|
||||||
|
|
||||||
|
|
||||||
class L3Plus(AntMiner): # noqa - ignore ABC method implementation
|
class L3Plus(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "L3+"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 72
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "L3+"
|
|
||||||
self.expected_chips = 72
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,14 +14,11 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import AntMiner
|
from pyasic.miners.makes import AntMinerMake
|
||||||
|
|
||||||
|
|
||||||
class DR5(AntMiner): # noqa - ignore ABC method implementation
|
class DR5(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "DR5"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 72
|
||||||
self.ip = ip
|
expected_hashboards = 3
|
||||||
self.raw_model = "DR5"
|
expected_fans = 2
|
||||||
self.expected_chips = 72
|
|
||||||
self.expected_hashboards = 3
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -13,13 +13,10 @@
|
|||||||
# See the License for the specific language governing permissions and -
|
# See the License for the specific language governing permissions and -
|
||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
from pyasic.miners.makes import AntMiner
|
from pyasic.miners.makes import AntMinerMake
|
||||||
|
|
||||||
|
|
||||||
class L7(AntMiner): # noqa - ignore ABC method implementation
|
class L7(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "L7"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 120
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "L7"
|
|
||||||
self.expected_chips = 120
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|||||||
@@ -14,14 +14,11 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import AntMiner
|
from pyasic.miners.makes import AntMinerMake
|
||||||
|
|
||||||
|
|
||||||
class E9Pro(AntMiner): # noqa - ignore ABC method implementation
|
class E9Pro(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "E9Pro"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 8
|
||||||
self.ip = ip
|
expected_hashboards = 2
|
||||||
self.raw_model = "E9Pro"
|
expected_fans = 4
|
||||||
self.expected_chips = 8
|
|
||||||
self.expected_hashboards = 2
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|||||||
@@ -14,31 +14,22 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import AntMiner
|
from pyasic.miners.makes import AntMinerMake
|
||||||
|
|
||||||
|
|
||||||
class S9(AntMiner): # noqa - ignore ABC method implementation
|
class S9(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S9"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 63
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "S9"
|
|
||||||
self.expected_chips = 63
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class S9i(AntMiner): # noqa - ignore ABC method implementation
|
class S9i(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S9i"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 63
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "S9i"
|
|
||||||
self.expected_chips = 63
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class S9j(AntMiner): # noqa - ignore ABC method implementation
|
class S9j(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "S9j"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 63
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "S9j"
|
|
||||||
self.expected_chips = 63
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,13 +14,10 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import AntMiner
|
from pyasic.miners.makes import AntMinerMake
|
||||||
|
|
||||||
|
|
||||||
class T9(AntMiner): # noqa - ignore ABC method implementation
|
class T9(AntMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "T9"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 54
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "T9"
|
|
||||||
self.expected_chips = 54
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,13 +14,10 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import AvalonMiner
|
from pyasic.miners.makes import AvalonMinerMake
|
||||||
|
|
||||||
|
|
||||||
class Avalon1026(AvalonMiner): # noqa - ignore ABC method implementation
|
class Avalon1026(AvalonMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "Avalon 1026"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 80
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "Avalon 1026"
|
|
||||||
self.expected_chips = 80
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,13 +14,10 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import AvalonMiner
|
from pyasic.miners.makes import AvalonMinerMake
|
||||||
|
|
||||||
|
|
||||||
class Avalon1047(AvalonMiner): # noqa - ignore ABC method implementation
|
class Avalon1047(AvalonMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "Avalon 1047"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 80
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "Avalon 1047"
|
|
||||||
self.expected_chips = 80
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,13 +14,10 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import AvalonMiner
|
from pyasic.miners.makes import AvalonMinerMake
|
||||||
|
|
||||||
|
|
||||||
class Avalon1066(AvalonMiner): # noqa - ignore ABC method implementation
|
class Avalon1066(AvalonMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "Avalon 1066"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 114
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "Avalon 1066"
|
|
||||||
self.expected_chips = 114
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|||||||
@@ -14,13 +14,10 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import AvalonMiner
|
from pyasic.miners.makes import AvalonMinerMake
|
||||||
|
|
||||||
|
|
||||||
class Avalon1166Pro(AvalonMiner): # noqa - ignore ABC method implementation
|
class Avalon1166Pro(AvalonMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "Avalon 1166 Pro"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 120
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "Avalon 1166 Pro"
|
|
||||||
self.expected_chips = 120
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|||||||
@@ -14,13 +14,10 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import AvalonMiner
|
from pyasic.miners.makes import AvalonMinerMake
|
||||||
|
|
||||||
|
|
||||||
class Avalon1246(AvalonMiner): # noqa - ignore ABC method implementation
|
class Avalon1246(AvalonMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "Avalon 1246"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 120
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "Avalon 1246"
|
|
||||||
self.expected_chips = 120
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|||||||
@@ -14,14 +14,11 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import AvalonMiner
|
from pyasic.miners.makes import AvalonMinerMake
|
||||||
|
|
||||||
|
|
||||||
class Avalon721(AvalonMiner): # noqa - ignore ABC method implementation
|
class Avalon721(AvalonMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "Avalon 721"
|
||||||
super().__init__(ip, api_ver)
|
expected_hashboards = 4
|
||||||
self.ip = ip
|
expected_chips = 18
|
||||||
self.raw_model = "Avalon 721"
|
expected_fans = 1
|
||||||
self.expected_hashboards = 4
|
|
||||||
self.expected_chips = 18
|
|
||||||
self.fan_count = 1
|
|
||||||
|
|||||||
@@ -14,14 +14,11 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import AvalonMiner
|
from pyasic.miners.makes import AvalonMinerMake
|
||||||
|
|
||||||
|
|
||||||
class Avalon741(AvalonMiner): # noqa - ignore ABC method implementation
|
class Avalon741(AvalonMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "Avalon 741"
|
||||||
super().__init__(ip, api_ver)
|
expected_hashboards = 4
|
||||||
self.ip = ip
|
expected_chips = 22
|
||||||
self.raw_model = "Avalon 741"
|
expected_fans = 1
|
||||||
self.expected_hashboards = 4
|
|
||||||
self.expected_chips = 22
|
|
||||||
self.fan_count = 1
|
|
||||||
|
|||||||
@@ -14,14 +14,11 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import AvalonMiner
|
from pyasic.miners.makes import AvalonMinerMake
|
||||||
|
|
||||||
|
|
||||||
class Avalon761(AvalonMiner): # noqa - ignore ABC method implementation
|
class Avalon761(AvalonMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "Avalon 761"
|
||||||
super().__init__(ip, api_ver)
|
expected_hashboards = 4
|
||||||
self.ip = ip
|
expected_chips = 18
|
||||||
self.raw_model = "Avalon 761"
|
expected_fans = 1
|
||||||
self.expected_hashboards = 4
|
|
||||||
self.expected_chips = 18
|
|
||||||
self.fan_count = 1
|
|
||||||
|
|||||||
@@ -14,14 +14,11 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import AvalonMiner
|
from pyasic.miners.makes import AvalonMinerMake
|
||||||
|
|
||||||
|
|
||||||
class Avalon821(AvalonMiner): # noqa - ignore ABC method implementation
|
class Avalon821(AvalonMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "Avalon 821"
|
||||||
super().__init__(ip, api_ver)
|
expected_hashboards = 4
|
||||||
self.ip = ip
|
expected_chips = 26
|
||||||
self.raw_model = "Avalon 821"
|
expected_fans = 1
|
||||||
self.expected_hashboards = 4
|
|
||||||
self.expected_chips = 26
|
|
||||||
self.fan_count = 1
|
|
||||||
|
|||||||
@@ -14,14 +14,11 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import AvalonMiner
|
from pyasic.miners.makes import AvalonMinerMake
|
||||||
|
|
||||||
|
|
||||||
class Avalon841(AvalonMiner): # noqa - ignore ABC method implementation
|
class Avalon841(AvalonMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "Avalon 841"
|
||||||
super().__init__(ip, api_ver)
|
expected_hashboards = 4
|
||||||
self.ip = ip
|
expected_chips = 26
|
||||||
self.raw_model = "Avalon 841"
|
expected_fans = 1
|
||||||
self.expected_hashboards = 4
|
|
||||||
self.expected_chips = 26
|
|
||||||
self.fan_count = 1
|
|
||||||
|
|||||||
@@ -14,14 +14,11 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import AvalonMiner
|
from pyasic.miners.makes import AvalonMinerMake
|
||||||
|
|
||||||
|
|
||||||
class Avalon851(AvalonMiner): # noqa - ignore ABC method implementation
|
class Avalon851(AvalonMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "Avalon 851"
|
||||||
super().__init__(ip, api_ver)
|
expected_hashboards = 4
|
||||||
self.ip = ip
|
expected_chips = 26
|
||||||
self.raw_model = "Avalon 851"
|
expected_fans = 1
|
||||||
self.expected_hashboards = 4
|
|
||||||
self.expected_chips = 26
|
|
||||||
self.fan_count = 1
|
|
||||||
|
|||||||
@@ -14,14 +14,11 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import AvalonMiner
|
from pyasic.miners.makes import AvalonMinerMake
|
||||||
|
|
||||||
|
|
||||||
class Avalon921(AvalonMiner): # noqa - ignore ABC method implementation
|
class Avalon921(AvalonMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "Avalon 921"
|
||||||
super().__init__(ip, api_ver)
|
expected_hashboards = 4
|
||||||
self.ip = ip
|
expected_chips = 26
|
||||||
self.raw_model = "Avalon 921"
|
expected_fans = 1
|
||||||
self.expected_hashboards = 4
|
|
||||||
self.expected_chips = 26
|
|
||||||
self.fan_count = 1
|
|
||||||
|
|||||||
@@ -13,14 +13,11 @@
|
|||||||
# See the License for the specific language governing permissions and -
|
# See the License for the specific language governing permissions and -
|
||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
from pyasic.miners.makes import GoldshellMiner
|
from pyasic.miners.makes import GoldshellMake
|
||||||
|
|
||||||
|
|
||||||
class CK5(GoldshellMiner): # noqa - ignore ABC method implementation
|
class CK5(GoldshellMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "CK5"
|
||||||
super().__init__(ip, api_ver)
|
expected_hashboards = 4
|
||||||
self.ip = ip
|
expected_chips = 46
|
||||||
self.raw_model = "CK5"
|
expected_fans = 4
|
||||||
self.expected_hashboards = 4
|
|
||||||
self.expected_chips = 46
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|||||||
@@ -13,14 +13,11 @@
|
|||||||
# See the License for the specific language governing permissions and -
|
# See the License for the specific language governing permissions and -
|
||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
from pyasic.miners.makes import GoldshellMiner
|
from pyasic.miners.makes import GoldshellMake
|
||||||
|
|
||||||
|
|
||||||
class HS5(GoldshellMiner): # noqa - ignore ABC method implementation
|
class HS5(GoldshellMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "HS5"
|
||||||
super().__init__(ip, api_ver)
|
expected_hashboards = 4
|
||||||
self.ip = ip
|
expected_chips = 46
|
||||||
self.raw_model = "HS5"
|
expected_fans = 4
|
||||||
self.expected_hashboards = 4
|
|
||||||
self.expected_chips = 46
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|||||||
@@ -13,14 +13,11 @@
|
|||||||
# See the License for the specific language governing permissions and -
|
# See the License for the specific language governing permissions and -
|
||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
from pyasic.miners.makes import GoldshellMiner
|
from pyasic.miners.makes import GoldshellMake
|
||||||
|
|
||||||
|
|
||||||
class KD5(GoldshellMiner): # noqa - ignore ABC method implementation
|
class KD5(GoldshellMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "KD5"
|
||||||
super().__init__(ip, api_ver)
|
expected_hashboards = 4
|
||||||
self.ip = ip
|
expected_chips = 46
|
||||||
self.raw_model = "KD5"
|
expected_fans = 4
|
||||||
self.expected_hashboards = 4
|
|
||||||
self.expected_chips = 46
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|||||||
@@ -13,14 +13,11 @@
|
|||||||
# See the License for the specific language governing permissions and -
|
# See the License for the specific language governing permissions and -
|
||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
from pyasic.miners.makes import GoldshellMiner
|
from pyasic.miners.makes import GoldshellMake
|
||||||
|
|
||||||
|
|
||||||
class KDMax(GoldshellMiner): # noqa - ignore ABC method implementation
|
class KDMax(GoldshellMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "KD Max"
|
||||||
super().__init__(ip, api_ver)
|
expected_hashboards = 3
|
||||||
self.ip = ip
|
expected_chips = 84
|
||||||
self.raw_model = "KD Max"
|
expected_fans = 4
|
||||||
self.expected_hashboards = 3
|
|
||||||
self.expected_chips = 84
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|||||||
@@ -13,11 +13,8 @@
|
|||||||
# See the License for the specific language governing permissions and -
|
# See the License for the specific language governing permissions and -
|
||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
from pyasic.miners.makes import InnosiliconMiner
|
from pyasic.miners.makes import InnosiliconMake
|
||||||
|
|
||||||
|
|
||||||
class A10X(InnosiliconMiner): # noqa - ignore ABC method implementation
|
class A10X(InnosiliconMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
|
raw_model = "A10X"
|
||||||
super().__init__(ip, api_ver)
|
|
||||||
self.ip = ip
|
|
||||||
self.raw_model = "A10X"
|
|
||||||
|
|||||||
@@ -14,13 +14,10 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import InnosiliconMiner
|
from pyasic.miners.makes import InnosiliconMake
|
||||||
|
|
||||||
|
|
||||||
class T3HPlus(InnosiliconMiner): # noqa - ignore ABC method implementation
|
class T3HPlus(InnosiliconMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
|
raw_model = "T3H+"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 114
|
||||||
self.ip = ip
|
expected_fans = 4
|
||||||
self.raw_model = "T3H+"
|
|
||||||
self.expected_chips = 114
|
|
||||||
self.fan_count = 4
|
|
||||||
|
|||||||
@@ -14,13 +14,10 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import WhatsMiner
|
from pyasic.miners.makes import WhatsMinerMake
|
||||||
|
|
||||||
|
|
||||||
class M20V10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M20V10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M20 V10"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 70
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M20 V10"
|
|
||||||
self.expected_chips = 70
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,22 +14,16 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import WhatsMiner
|
from pyasic.miners.makes import WhatsMinerMake
|
||||||
|
|
||||||
|
|
||||||
class M20PV10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M20PV10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M20P V10"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 156
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M20P V10"
|
|
||||||
self.expected_chips = 156
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M20PV30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M20PV30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M20P V30"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 148
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M20P V30"
|
|
||||||
self.expected_chips = 148
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,31 +14,22 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import WhatsMiner
|
from pyasic.miners.makes import WhatsMinerMake
|
||||||
|
|
||||||
|
|
||||||
class M20SV10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M20SV10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M20S V10"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 105
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M20S V10"
|
|
||||||
self.expected_chips = 105
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M20SV20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M20SV20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M20S V20"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 111
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M20S V20"
|
|
||||||
self.expected_chips = 111
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M20SV30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M20SV30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M20S V30"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 140
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M20S V30"
|
|
||||||
self.expected_chips = 140
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,18 +14,9 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
import warnings
|
from pyasic.miners.makes import WhatsMinerMake
|
||||||
|
|
||||||
from pyasic.miners.makes import WhatsMiner
|
|
||||||
|
|
||||||
|
|
||||||
class M20SPlusV30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M20SPlusV30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M20S+ V30"
|
||||||
super().__init__(ip, api_ver)
|
expected_fans = 2
|
||||||
self.ip = ip
|
|
||||||
self.raw_model = "M20S+ V30"
|
|
||||||
self.expected_chips = 0
|
|
||||||
warnings.warn(
|
|
||||||
"Unknown chip count for miner type M20S+ V30, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
|
|
||||||
)
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,13 +14,10 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import WhatsMiner
|
from pyasic.miners.makes import WhatsMinerMake
|
||||||
|
|
||||||
|
|
||||||
class M21V10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M21V10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M21 V10"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 33
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M21 V10"
|
|
||||||
self.expected_chips = 33
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,31 +14,22 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import WhatsMiner
|
from pyasic.miners.makes import WhatsMinerMake
|
||||||
|
|
||||||
|
|
||||||
class M21SV20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M21SV20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M21S V20"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 66
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M21S V20"
|
|
||||||
self.expected_chips = 66
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M21SV60(WhatsMiner): # noqa - ignore ABC method implementation
|
class M21SV60(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M21S V60"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 105
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M21S V60"
|
|
||||||
self.expected_chips = 105
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M21SV70(WhatsMiner): # noqa - ignore ABC method implementation
|
class M21SV70(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M21S V70"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 111
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M21S V70"
|
|
||||||
self.expected_chips = 111
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,18 +14,9 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
import warnings
|
from pyasic.miners.makes import WhatsMinerMake
|
||||||
|
|
||||||
from pyasic.miners.makes import WhatsMiner
|
|
||||||
|
|
||||||
|
|
||||||
class M21SPlusV20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M21SPlusV20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M21S+ V20"
|
||||||
super().__init__(ip, api_ver)
|
expected_fans = 2
|
||||||
self.ip = ip
|
|
||||||
self.raw_model = "M21S+ V20"
|
|
||||||
self.expected_chips = 0
|
|
||||||
warnings.warn(
|
|
||||||
"Unknown chip count for miner type M21S+ V20, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
|
|
||||||
)
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,13 +14,10 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import WhatsMiner
|
from pyasic.miners.makes import WhatsMinerMake
|
||||||
|
|
||||||
|
|
||||||
class M29V10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M29V10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M29 V10"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 50
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M29 V10"
|
|
||||||
self.expected_chips = 50
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,22 +14,16 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import WhatsMiner
|
from pyasic.miners.makes import WhatsMinerMake
|
||||||
|
|
||||||
|
|
||||||
class M30V10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30V10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30 V10"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 105
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30 V10"
|
|
||||||
self.expected_chips = 105
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30V20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30V20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30 V20"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 111
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30 V20"
|
|
||||||
self.expected_chips = 111
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,14 +14,11 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import WhatsMiner
|
from pyasic.miners.makes import WhatsMinerMake
|
||||||
|
|
||||||
|
|
||||||
class M30KV10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30KV10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30K V10"
|
||||||
super().__init__(ip, api_ver)
|
expected_hashboards = 4
|
||||||
self.ip = ip
|
expected_chips = 240
|
||||||
self.raw_model = "M30K V10"
|
expected_fans = 2
|
||||||
self.expected_hashboards = 4
|
|
||||||
self.expected_chips = 240
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,14 +14,11 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import WhatsMiner
|
from pyasic.miners.makes import WhatsMinerMake
|
||||||
|
|
||||||
|
|
||||||
class M30LV10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30LV10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30L V10"
|
||||||
super().__init__(ip, api_ver)
|
board_num = 4
|
||||||
self.ip = ip
|
expected_chips = 144
|
||||||
self.raw_model = "M30L V10"
|
expected_fans = 2
|
||||||
self.board_num = 4
|
|
||||||
self.expected_chips = 144
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,282 +14,173 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
import warnings
|
from pyasic.miners.makes import WhatsMinerMake
|
||||||
|
|
||||||
from pyasic.miners.makes import WhatsMiner
|
|
||||||
|
|
||||||
|
|
||||||
class M30SV10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SV10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S V10"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 148
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S V10"
|
|
||||||
self.expected_chips = 148
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SV20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SV20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S V20"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 156
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S V20"
|
|
||||||
self.expected_chips = 156
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SV30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SV30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S V30"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 164
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S V30"
|
|
||||||
self.expected_chips = 164
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SV40(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SV40(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S V40"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 172
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S V40"
|
|
||||||
self.expected_chips = 172
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SV50(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SV50(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S V50"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 156
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S V50"
|
|
||||||
self.expected_chips = 156
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SV60(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SV60(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S V60"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 164
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S V60"
|
|
||||||
self.expected_chips = 164
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SV70(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SV70(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S V70"
|
||||||
super().__init__(ip, api_ver)
|
expected_fans = 2
|
||||||
self.ip = ip
|
|
||||||
self.raw_model = "M30S V70"
|
|
||||||
self.expected_chips = 0
|
|
||||||
warnings.warn(
|
|
||||||
"Unknown chip count for miner type M30SV70, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
|
|
||||||
)
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SV80(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SV80(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S V80"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 129
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S V80"
|
|
||||||
self.expected_chips = 129
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SVE10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SVE10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S VE10"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 105
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S VE10"
|
|
||||||
self.expected_chips = 105
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SVE20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SVE20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S VE20"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 111
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S VE20"
|
|
||||||
self.expected_chips = 111
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SVE30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SVE30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S VE30"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 117
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S VE30"
|
|
||||||
self.expected_chips = 117
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SVE40(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SVE40(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S VE40"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 123
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S VE40"
|
|
||||||
self.expected_chips = 123
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SVE50(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SVE50(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S VE50"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 129
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S VE50"
|
|
||||||
self.expected_chips = 129
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SVE60(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SVE60(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S VE60"
|
||||||
super().__init__(ip, api_ver)
|
expected_fans = 2
|
||||||
self.ip = ip
|
|
||||||
self.raw_model = "M30S VE60"
|
|
||||||
self.expected_chips = 0
|
|
||||||
warnings.warn(
|
|
||||||
"Unknown chip count for miner type M30SVE60, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
|
|
||||||
)
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SVE70(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SVE70(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S VE70"
|
||||||
super().__init__(ip, api_ver)
|
expected_fans = 2
|
||||||
self.ip = ip
|
|
||||||
self.raw_model = "M30S VE70"
|
|
||||||
self.expected_chips = 0
|
|
||||||
warnings.warn(
|
|
||||||
"Unknown chip count for miner type M30SVE70, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
|
|
||||||
)
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SVF10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SVF10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S VF10"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 70
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S VF10"
|
|
||||||
self.expected_chips = 70
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SVF20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SVF20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S VF20"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 74
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S VF20"
|
|
||||||
self.expected_chips = 74
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SVF30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SVF30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S VF30"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 78
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S VF30"
|
|
||||||
self.expected_chips = 78
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SVG10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SVG10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S VG10"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 66
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S VG10"
|
|
||||||
self.expected_chips = 66
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SVG20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SVG20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S VG20"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 70
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S VG20"
|
|
||||||
self.expected_chips = 70
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SVG30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SVG30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S VG30"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 74
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S VG30"
|
|
||||||
self.expected_chips = 74
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SVG40(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SVG40(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S VG40"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 78
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S VG40"
|
|
||||||
self.expected_chips = 78
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SVH10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SVH10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S VH10"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 64
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S VH10"
|
|
||||||
self.expected_chips = 64
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SVH20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SVH20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S VH20"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 66
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S VH20"
|
|
||||||
self.expected_chips = 66
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SVH30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SVH30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S VH30"
|
||||||
super().__init__(ip, api_ver)
|
expected_fans = 2
|
||||||
self.ip = ip
|
|
||||||
self.raw_model = "M30S VH30"
|
|
||||||
self.expected_chips = 0
|
|
||||||
warnings.warn(
|
|
||||||
"Unknown chip count for miner type M30SVH30, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
|
|
||||||
)
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SVH40(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SVH40(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S VH40"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 64
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S VH40"
|
|
||||||
self.expected_chips = 64
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SVH50(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SVH50(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S VH50"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 66
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S VH50"
|
|
||||||
self.expected_chips = 66
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SVH60(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SVH60(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S VH60"
|
||||||
super().__init__(ip, api_ver)
|
expected_fans = 2
|
||||||
self.ip = ip
|
|
||||||
self.raw_model = "M30S VH60"
|
|
||||||
self.expected_chips = 0
|
|
||||||
warnings.warn(
|
|
||||||
"Unknown chip count for miner type M30SVH60, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
|
|
||||||
)
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SVI20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SVI20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S VI20"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 70
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S VI20"
|
|
||||||
self.expected_chips = 70
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,300 +14,185 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
import warnings
|
from pyasic.miners.makes import WhatsMinerMake
|
||||||
|
|
||||||
from pyasic.miners.makes import WhatsMiner
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusV10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusV10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ V10"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 215
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ V10"
|
|
||||||
self.expected_chips = 215
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusV20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusV20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ V20"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 255
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ V20"
|
|
||||||
self.expected_chips = 255
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusV30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusV30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ V30"
|
||||||
super().__init__(ip, api_ver)
|
expected_fans = 2
|
||||||
self.ip = ip
|
|
||||||
self.raw_model = "M30S+ V30"
|
|
||||||
self.expected_chips = 0
|
|
||||||
warnings.warn(
|
|
||||||
"Unknown chip count for miner type M30S+ V30, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
|
|
||||||
)
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusV40(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusV40(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ V40"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 235
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ V40"
|
|
||||||
self.expected_chips = 235
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusV50(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusV50(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ V50"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 225
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ V50"
|
|
||||||
self.expected_chips = 225
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusV60(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusV60(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ V60"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 245
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ V60"
|
|
||||||
self.expected_chips = 245
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusV70(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusV70(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ V70"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 235
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ V70"
|
|
||||||
self.expected_chips = 235
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusV80(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusV80(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ V80"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 245
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ V80"
|
|
||||||
self.expected_chips = 245
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusV90(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusV90(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ V90"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 225
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ V90"
|
|
||||||
self.expected_chips = 225
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusV100(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusV100(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ V100"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 215
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ V100"
|
|
||||||
self.expected_chips = 215
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusVE30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusVE30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ VE30"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 148
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ VE30"
|
|
||||||
self.expected_chips = 148
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusVE40(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusVE40(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ VE40"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 156
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ VE40"
|
|
||||||
self.expected_chips = 156
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusVE50(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusVE50(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ VE50"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 164
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ VE50"
|
|
||||||
self.expected_chips = 164
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusVE60(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusVE60(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ VE60"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 172
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ VE60"
|
|
||||||
self.expected_chips = 172
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusVE70(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusVE70(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ VE70"
|
||||||
super().__init__(ip, api_ver)
|
expected_fans = 2
|
||||||
self.ip = ip
|
|
||||||
self.raw_model = "M30S+ VE70"
|
|
||||||
self.expected_chips = 0
|
|
||||||
warnings.warn(
|
|
||||||
"Unknown chip count for miner type M30S+ VE70, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
|
|
||||||
)
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusVE80(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusVE80(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ VE80"
|
||||||
super().__init__(ip, api_ver)
|
expected_fans = 2
|
||||||
self.ip = ip
|
|
||||||
self.raw_model = "M30S+ VE80"
|
|
||||||
self.expected_chips = 0
|
|
||||||
warnings.warn(
|
|
||||||
"Unknown chip count for miner type M30S+ VE80, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
|
|
||||||
)
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusVE90(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusVE90(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ VE90"
|
||||||
super().__init__(ip, api_ver)
|
expected_fans = 2
|
||||||
self.ip = ip
|
|
||||||
self.raw_model = "M30S+ VE90"
|
|
||||||
self.expected_chips = 0
|
|
||||||
warnings.warn(
|
|
||||||
"Unknown chip count for miner type M30S+ VE90, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
|
|
||||||
)
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusVE100(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusVE100(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ VE100"
|
||||||
super().__init__(ip, api_ver)
|
expected_fans = 2
|
||||||
self.ip = ip
|
|
||||||
self.raw_model = "M30S+ VE100"
|
|
||||||
self.expected_chips = 0
|
|
||||||
warnings.warn(
|
|
||||||
"Unknown chip count for miner type M30S+ VE100, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
|
|
||||||
)
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusVF20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusVF20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ VF20"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 111
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ VF20"
|
|
||||||
self.expected_chips = 111
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusVF30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusVF30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ VF30"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 117
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ VF30"
|
|
||||||
self.expected_chips = 117
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusVG20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusVG20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ VG20"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 82
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ VG20"
|
|
||||||
self.expected_chips = 82
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusVG30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusVG30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ VG30"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 78
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ VG30"
|
|
||||||
self.expected_chips = 78
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusVG40(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusVG40(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ VG40"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 105
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ VG40"
|
|
||||||
self.expected_chips = 105
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusVG50(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusVG50(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ VG50"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 111
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ VG50"
|
|
||||||
self.expected_chips = 111
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusVG60(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusVG60(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ VG60"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 86
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ VG60"
|
|
||||||
self.expected_chips = 86
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusVH10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusVH10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ VH10"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 64
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ VH10"
|
|
||||||
self.expected_chips = 64
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusVH20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusVH20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ VH20"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 66
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ VH20"
|
|
||||||
self.expected_chips = 66
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusVH30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusVH30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ VH30"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 70
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ VH30"
|
|
||||||
self.expected_chips = 70
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusVH40(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusVH40(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ VH40"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 74
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ VH40"
|
|
||||||
self.expected_chips = 74
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusVH50(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusVH50(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ VH50"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 64
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ VH50"
|
|
||||||
self.expected_chips = 64
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusVH60(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusVH60(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S+ VH60"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 66
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S+ VH60"
|
|
||||||
self.expected_chips = 66
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,206 +14,129 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
import warnings
|
from pyasic.miners.makes import WhatsMinerMake
|
||||||
|
|
||||||
from pyasic.miners.makes import WhatsMiner
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusPlusV10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusPlusV10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S++ V10"
|
||||||
super().__init__(ip, api_ver)
|
expected_hashboards = 4
|
||||||
self.ip = ip
|
expected_chips = 255
|
||||||
self.raw_model = "M30S++ V10"
|
expected_fans = 2
|
||||||
self.expected_hashboards = 4
|
|
||||||
self.expected_chips = 255
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusPlusV20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusPlusV20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S++ V20"
|
||||||
super().__init__(ip, api_ver)
|
expected_hashboards = 4
|
||||||
self.ip = ip
|
expected_chips = 255
|
||||||
self.raw_model = "M30S++ V20"
|
expected_fans = 2
|
||||||
self.expected_hashboards = 4
|
|
||||||
self.expected_chips = 255
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusPlusVE30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusPlusVE30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S++ VE30"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 215
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S++ VE30"
|
|
||||||
self.expected_chips = 215
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusPlusVE40(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusPlusVE40(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S++ VE40"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 225
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S++ VE40"
|
|
||||||
self.expected_chips = 225
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusPlusVE50(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusPlusVE50(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S++ VE50"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 235
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S++ VE50"
|
|
||||||
self.expected_chips = 235
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusPlusVF40(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusPlusVF40(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S++ VF40"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 156
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S++ VF40"
|
|
||||||
self.expected_chips = 156
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusPlusVG30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusPlusVG30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S++ VG30"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 111
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S++ VG30"
|
|
||||||
self.expected_chips = 111
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusPlusVG40(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusPlusVG40(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S++ VG40"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 117
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S++ VG40"
|
|
||||||
self.expected_chips = 117
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusPlusVG50(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusPlusVG50(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S++ VG50"
|
||||||
super().__init__(ip, api_ver)
|
expected_fans = 2
|
||||||
self.ip = ip
|
|
||||||
self.raw_model = "M30S++ VG50"
|
|
||||||
self.expected_chips = 0
|
|
||||||
warnings.warn(
|
|
||||||
"Unknown chip count for miner type M30S++ VG50, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
|
|
||||||
)
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusPlusVH10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusPlusVH10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S++ VH10"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 82
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S++ VH10"
|
|
||||||
self.expected_chips = 82
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusPlusVH20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusPlusVH20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S++ VH20"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 86
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S++ VH20"
|
|
||||||
self.expected_chips = 86
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusPlusVH30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusPlusVH30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S++ VH30"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 111
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S++ VH30"
|
|
||||||
self.expected_chips = 111
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusPlusVH40(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusPlusVH40(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S++ VH40"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 70
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S++ VH40"
|
|
||||||
self.expected_chips = 70
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusPlusVH50(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusPlusVH50(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S++ VH50"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 74
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S++ VH50"
|
|
||||||
self.expected_chips = 74
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusPlusVH60(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusPlusVH60(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S++ VH60"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 78
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S++ VH60"
|
|
||||||
self.expected_chips = 78
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusPlusVH70(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusPlusVH70(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S++ VH70"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 70
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S++ VH70"
|
|
||||||
self.expected_chips = 70
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusPlusVH80(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusPlusVH80(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S++ VH80"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 74
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S++ VH80"
|
|
||||||
self.expected_chips = 74
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusPlusVH90(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusPlusVH90(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S++ VH90"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 78
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S++ VH90"
|
|
||||||
self.expected_chips = 78
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusPlusVH100(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusPlusVH100(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S++ VH100"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 82
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M30S++ VH100"
|
|
||||||
self.expected_chips = 82
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusPlusVJ20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusPlusVJ20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S++ VJ20"
|
||||||
super().__init__(ip, api_ver)
|
expected_fans = 2
|
||||||
self.ip = ip
|
|
||||||
self.raw_model = "M30S++ VJ20"
|
|
||||||
self.expected_chips = 0
|
|
||||||
warnings.warn(
|
|
||||||
"Unknown chip count for miner type M30S++ VJ20, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
|
|
||||||
)
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M30SPlusPlusVJ30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M30SPlusPlusVJ30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M30S++ VJ30"
|
||||||
super().__init__(ip, api_ver)
|
expected_fans = 2
|
||||||
self.ip = ip
|
|
||||||
self.raw_model = "M30S++ VJ30"
|
|
||||||
self.expected_chips = 0
|
|
||||||
warnings.warn(
|
|
||||||
"Unknown chip count for miner type M30S++ VJ30, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
|
|
||||||
)
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,22 +14,16 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import WhatsMiner
|
from pyasic.miners.makes import WhatsMinerMake
|
||||||
|
|
||||||
|
|
||||||
class M31V10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31V10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31 V10"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 70
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31 V10"
|
|
||||||
self.expected_chips = 70
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31V20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31V20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31 V20"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 74
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31 V20"
|
|
||||||
self.expected_chips = 74
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,23 +14,17 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import WhatsMiner
|
from pyasic.miners.makes import WhatsMinerMake
|
||||||
|
|
||||||
|
|
||||||
class M31HV10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31HV10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31H V10"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 114
|
||||||
self.ip = ip
|
expected_fans = 0
|
||||||
self.raw_model = "M31H V10"
|
|
||||||
self.expected_chips = 114
|
|
||||||
self.fan_count = 0
|
|
||||||
|
|
||||||
|
|
||||||
class M31HV40(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31HV40(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31H V40"
|
||||||
super().__init__(ip, api_ver)
|
expected_hashboards = 4
|
||||||
self.ip = ip
|
expected_chips = 136
|
||||||
self.raw_model = "M31H V40"
|
expected_fans = 0
|
||||||
self.expected_hashboards = 4
|
|
||||||
self.expected_chips = 136
|
|
||||||
self.fan_count = 0
|
|
||||||
|
|||||||
@@ -14,13 +14,10 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import WhatsMiner
|
from pyasic.miners.makes import WhatsMinerMake
|
||||||
|
|
||||||
|
|
||||||
class M31LV10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31LV10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31L V10"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 114
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31L V10"
|
|
||||||
self.expected_chips = 114
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,120 +14,74 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
import warnings
|
from pyasic.miners.makes import WhatsMinerMake
|
||||||
|
|
||||||
from pyasic.miners.makes import WhatsMiner
|
|
||||||
|
|
||||||
|
|
||||||
class M31SV10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SV10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S V10"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 105
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S V10"
|
|
||||||
self.expected_chips = 105
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SV20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SV20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S V20"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 111
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S V20"
|
|
||||||
self.expected_chips = 111
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SV30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SV30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S V30"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 117
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S V30"
|
|
||||||
self.expected_chips = 117
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SV40(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SV40(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S V40"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 123
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S V40"
|
|
||||||
self.expected_chips = 123
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SV50(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SV50(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S V50"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 78
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S V50"
|
|
||||||
self.expected_chips = 78
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SV60(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SV60(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S V60"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 105
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S V60"
|
|
||||||
self.expected_chips = 105
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SV70(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SV70(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S V70"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 111
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S V70"
|
|
||||||
self.expected_chips = 111
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SV80(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SV80(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S V80"
|
||||||
super().__init__(ip, api_ver)
|
expected_fans = 2
|
||||||
self.ip = ip
|
|
||||||
self.raw_model = "M31S V80"
|
|
||||||
self.expected_chips = 0
|
|
||||||
warnings.warn(
|
|
||||||
"Unknown chip count for miner type M31SV80, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
|
|
||||||
)
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SV90(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SV90(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S V90"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 117
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S V90"
|
|
||||||
self.expected_chips = 117
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SVE10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SVE10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S VE10"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 70
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S VE10"
|
|
||||||
self.expected_chips = 70
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SVE20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SVE20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S VE20"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 74
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S VE20"
|
|
||||||
self.expected_chips = 74
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SVE30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SVE30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S VE30"
|
||||||
super().__init__(ip, api_ver)
|
expected_fans = 2
|
||||||
self.ip = ip
|
|
||||||
self.raw_model = "M31S VE30"
|
|
||||||
self.expected_chips = 0
|
|
||||||
warnings.warn(
|
|
||||||
"Unknown chip count for miner type M31SVE30, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
|
|
||||||
)
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,31 +14,22 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import WhatsMiner
|
from pyasic.miners.makes import WhatsMinerMake
|
||||||
|
|
||||||
|
|
||||||
class M31SEV10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SEV10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31SE V10"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 82
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31SE V10"
|
|
||||||
self.expected_chips = 82
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SEV20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SEV20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31SE V20"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 78
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31SE V20"
|
|
||||||
self.expected_chips = 78
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SEV30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SEV30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31SE V30"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 78
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31SE V30"
|
|
||||||
self.expected_chips = 78
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,195 +14,121 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
import warnings
|
from pyasic.miners.makes import WhatsMinerMake
|
||||||
|
|
||||||
from pyasic.miners.makes import WhatsMiner
|
|
||||||
|
|
||||||
|
|
||||||
class M31SPlusV10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SPlusV10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S+ V10"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 105
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S+ V10"
|
|
||||||
self.expected_chips = 105
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SPlusV20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SPlusV20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S+ V20"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 111
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S+ V20"
|
|
||||||
self.expected_chips = 111
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SPlusV30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SPlusV30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S+ V30"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 117
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S+ V30"
|
|
||||||
self.expected_chips = 117
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SPlusV40(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SPlusV40(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S+ V40"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 123
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S+ V40"
|
|
||||||
self.expected_chips = 123
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SPlusV50(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SPlusV50(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S+ V50"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 148
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S+ V50"
|
|
||||||
self.expected_chips = 148
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SPlusV60(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SPlusV60(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S+ V60"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 156
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S+ V60"
|
|
||||||
self.expected_chips = 156
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SPlusV80(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SPlusV80(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S+ V80"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 129
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S+ V80"
|
|
||||||
self.expected_chips = 129
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SPlusV90(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SPlusV90(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S+ V90"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 117
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S+ V90"
|
|
||||||
self.expected_chips = 117
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SPlusV100(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SPlusV100(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S+ V100"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 111
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S+ V100"
|
|
||||||
self.expected_chips = 111
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SPlusVE10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SPlusVE10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S+ VE10"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 82
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S+ VE10"
|
|
||||||
self.expected_chips = 82
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SPlusVE20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SPlusVE20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S+ VE20"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 78
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S+ VE20"
|
|
||||||
self.expected_chips = 78
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SPlusVE30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SPlusVE30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S+ VE30"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 105
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S+ VE30"
|
|
||||||
self.expected_chips = 105
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SPlusVE40(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SPlusVE40(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S+ VE40"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 111
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S+ VE40"
|
|
||||||
self.expected_chips = 111
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SPlusVE50(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SPlusVE50(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S+ VE50"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 117
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S+ VE50"
|
|
||||||
self.expected_chips = 117
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SPlusVE60(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SPlusVE60(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S+ VE60"
|
||||||
super().__init__(ip, api_ver)
|
expected_fans = 2
|
||||||
self.ip = ip
|
|
||||||
self.raw_model = "M31S+ VE60"
|
|
||||||
self.expected_chips = 0
|
|
||||||
warnings.warn(
|
|
||||||
"Unknown chip count for miner type M30S+ VE60, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
|
|
||||||
)
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SPlusVE80(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SPlusVE80(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S+ VE80"
|
||||||
super().__init__(ip, api_ver)
|
expected_fans = 2
|
||||||
self.ip = ip
|
|
||||||
self.raw_model = "M31S+ VE80"
|
|
||||||
self.expected_chips = 0
|
|
||||||
warnings.warn(
|
|
||||||
"Unknown chip count for miner type M30S+ VE80, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
|
|
||||||
)
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SPlusVF20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SPlusVF20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S+ VF20"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 66
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S+ VF20"
|
|
||||||
self.expected_chips = 66
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SPlusVF30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SPlusVF30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S+ VF30"
|
||||||
super().__init__(ip, api_ver)
|
expected_fans = 2
|
||||||
self.ip = ip
|
|
||||||
self.raw_model = "M31S+ VF30"
|
|
||||||
self.expected_chips = 0
|
|
||||||
warnings.warn(
|
|
||||||
"Unknown chip count for miner type M30S+ VF30, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
|
|
||||||
)
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SPlusVG20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SPlusVG20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S+ VG20"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 66
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S+ VG20"
|
|
||||||
self.expected_chips = 66
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M31SPlusVG30(WhatsMiner): # noqa - ignore ABC method implementation
|
class M31SPlusVG30(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M31S+ VG30"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 70
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M31S+ VG30"
|
|
||||||
self.expected_chips = 70
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
@@ -14,22 +14,16 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.makes import WhatsMiner
|
from pyasic.miners.makes import WhatsMinerMake
|
||||||
|
|
||||||
|
|
||||||
class M32V10(WhatsMiner): # noqa - ignore ABC method implementation
|
class M32V10(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M32 V10"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 78
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M32 V10"
|
|
||||||
self.expected_chips = 78
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|
||||||
|
|
||||||
class M32V20(WhatsMiner): # noqa - ignore ABC method implementation
|
class M32V20(WhatsMinerMake):
|
||||||
def __init__(self, ip: str, api_ver: str = "0.0.0"):
|
raw_model = "M32 V20"
|
||||||
super().__init__(ip, api_ver)
|
expected_chips = 74
|
||||||
self.ip = ip
|
expected_fans = 2
|
||||||
self.raw_model = "M32 V20"
|
|
||||||
self.expected_chips = 74
|
|
||||||
self.fan_count = 2
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user