refactor: use protocol for BaseMiner and update attributes to be part of the class rather than a __init__ method.

This commit is contained in:
UpstreamData
2024-01-16 14:47:43 -07:00
parent 10293ae24a
commit 307926afbb
135 changed files with 1469 additions and 3262 deletions

View File

@@ -36,7 +36,7 @@ class Pool(MinerConfigValue):
}
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:
return {
f"pool_{idx}": self.url,
@@ -49,7 +49,7 @@ class Pool(MinerConfigValue):
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:
return {
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, 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:
return {
f"Pool{idx}": self.url,

View File

@@ -59,18 +59,17 @@ class TemperatureConfig(MinerConfigValue):
@classmethod
def from_epic(cls, web_conf: dict) -> "TemperatureConfig":
dangerous_temp = None
try:
hot_temp = web_conf["Misc"]["Shutdown Temp"]
dangerous_temp = web_conf["Misc"]["Shutdown Temp"]
except KeyError:
hot_temp = None
dangerous_temp = None
# Need to do this in two blocks to avoid KeyError if one is missing
try:
target_temp = web_conf["Fans"]["Fan Mode"]["Auto"]["Target Temperature"]
except KeyError:
target_temp = None
return cls(target=target_temp, hot=hot_temp, danger=dangerous_temp)
return cls(target=target_temp, danger=dangerous_temp)
@classmethod
def from_vnish(cls, web_settings: dict):

View File

@@ -16,7 +16,6 @@
import copy
import json
import logging
import time
from dataclasses import asdict, dataclass, field, fields
from datetime import datetime, timezone

View File

@@ -17,8 +17,6 @@
from pyasic.miners.backends import AntminerModern
from pyasic.miners.types import T19
# noqa - Ignore access to _module
class BMMinerT19(AntminerModern, T19):
pass

View File

@@ -19,6 +19,4 @@ from pyasic.miners.types import HS3
class BMMinerHS3(AntminerModern, HS3):
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.supports_shutdown = False
supports_shutdown = False

View File

@@ -18,6 +18,4 @@ from pyasic.miners.types import L7
class BMMinerL7(AntminerModern, L7):
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.supports_shutdown = False
supports_shutdown = False

View File

@@ -19,6 +19,4 @@ from pyasic.miners.types import E9Pro
class BMMinerE9Pro(AntminerModern, E9Pro):
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.supports_shutdown = False
supports_shutdown = False

View File

@@ -19,6 +19,4 @@ from pyasic.miners.types import Z15
class CGMinerZ15(AntminerOld, Z15):
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.supports_shutdown = False
supports_shutdown = False

View File

@@ -18,6 +18,4 @@ from pyasic.miners.types import D3
class CGMinerD3(AntminerOld, D3):
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.supports_shutdown = False
supports_shutdown = False

View File

@@ -19,6 +19,4 @@ from pyasic.miners.types import DR5
class CGMinerDR5(AntminerOld, DR5):
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.supports_shutdown = False
supports_shutdown = False

View File

@@ -21,10 +21,53 @@ import asyncssh
from pyasic.data import HashBoard
from pyasic.errors import APIError
from pyasic.miners.backends import Hiveon
from pyasic.miners.base import DataFunction, DataLocations, DataOptions, RPCAPICommand
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):
data_locations = HIVEON_T9_DATA_LOC
##################################################
### DATA GATHERING FUNCTIONS (get_{some_data}) ###

View File

@@ -19,5 +19,4 @@ from pyasic.miners.types import L3Plus
class VnishL3Plus(VNish, L3Plus):
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
pass

View File

@@ -14,9 +14,9 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.backends import CGMinerAvalon
from pyasic.miners.backends import AvalonMiner
from pyasic.miners.types import Avalon1026
class CGMinerAvalon1026(CGMinerAvalon, Avalon1026):
class CGMinerAvalon1026(AvalonMiner, Avalon1026):
pass

View File

@@ -14,9 +14,9 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.backends import CGMinerAvalon
from pyasic.miners.backends import AvalonMiner
from pyasic.miners.types import Avalon1047
class CGMinerAvalon1047(CGMinerAvalon, Avalon1047):
class CGMinerAvalon1047(AvalonMiner, Avalon1047):
pass

View File

@@ -14,9 +14,9 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.backends import CGMinerAvalon
from pyasic.miners.backends import AvalonMiner
from pyasic.miners.types import Avalon1066
class CGMinerAvalon1066(CGMinerAvalon, Avalon1066):
class CGMinerAvalon1066(AvalonMiner, Avalon1066):
pass

View File

@@ -14,9 +14,9 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.backends import CGMinerAvalon
from pyasic.miners.backends import AvalonMiner
from pyasic.miners.types import Avalon1166Pro
class CGMinerAvalon1166Pro(CGMinerAvalon, Avalon1166Pro):
class CGMinerAvalon1166Pro(AvalonMiner, Avalon1166Pro):
pass

View File

@@ -14,9 +14,9 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.backends import CGMinerAvalon
from pyasic.miners.backends import AvalonMiner
from pyasic.miners.types import Avalon1246
class CGMinerAvalon1246(CGMinerAvalon, Avalon1246):
class CGMinerAvalon1246(AvalonMiner, Avalon1246):
pass

View File

@@ -14,9 +14,9 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.backends import CGMinerAvalon
from pyasic.miners.backends import AvalonMiner
from pyasic.miners.types import Avalon721
class CGMinerAvalon721(CGMinerAvalon, Avalon721):
class CGMinerAvalon721(AvalonMiner, Avalon721):
pass

View File

@@ -14,9 +14,9 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.backends import CGMinerAvalon
from pyasic.miners.backends import AvalonMiner
from pyasic.miners.types import Avalon741
class CGMinerAvalon741(CGMinerAvalon, Avalon741):
class CGMinerAvalon741(AvalonMiner, Avalon741):
pass

View File

@@ -14,9 +14,9 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.backends import CGMinerAvalon
from pyasic.miners.backends import AvalonMiner
from pyasic.miners.types import Avalon761
class CGMinerAvalon761(CGMinerAvalon, Avalon761):
class CGMinerAvalon761(AvalonMiner, Avalon761):
pass

View File

@@ -14,9 +14,9 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.backends import CGMinerAvalon
from pyasic.miners.backends import AvalonMiner
from pyasic.miners.types import Avalon821
class CGMinerAvalon821(CGMinerAvalon, Avalon821):
class CGMinerAvalon821(AvalonMiner, Avalon821):
pass

View File

@@ -14,9 +14,9 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.backends import CGMinerAvalon
from pyasic.miners.backends import AvalonMiner
from pyasic.miners.types import Avalon841
class CGMinerAvalon841(CGMinerAvalon, Avalon841):
class CGMinerAvalon841(AvalonMiner, Avalon841):
pass

View File

@@ -14,9 +14,9 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.backends import CGMinerAvalon
from pyasic.miners.backends import AvalonMiner
from pyasic.miners.types import Avalon851
class CGMinerAvalon851(CGMinerAvalon, Avalon851):
class CGMinerAvalon851(AvalonMiner, Avalon851):
pass

View File

@@ -14,9 +14,9 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.backends import CGMinerAvalon
from pyasic.miners.backends import AvalonMiner
from pyasic.miners.types import Avalon921
class CGMinerAvalon921(CGMinerAvalon, Avalon921):
class CGMinerAvalon921(AvalonMiner, Avalon921):
pass

View File

@@ -14,14 +14,14 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from .antminer import AntminerModern, AntminerOld
from .avalonminer import AvalonMiner
from .bfgminer import BFGMiner
from .bfgminer_goldshell import BFGMinerGoldshell
from .bmminer import BMMiner
from .braiins_os import BOSer, BOSMiner
from .btminer import BTMiner
from .cgminer import CGMiner
from .cgminer_avalon import CGMinerAvalon
from .epic import ePIC
from .goldshell import GoldshellMiner
from .hiveon import Hiveon
from .luxminer import LUXMiner
from .vnish import VNish

View File

@@ -82,16 +82,13 @@ ANTMINER_MODERN_DATA_LOC = DataLocations(
class AntminerModern(BMMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
super().__init__(ip, api_ver)
# interfaces
self.web = AntminerModernWebAPI(ip)
"""Handler for AntMiners with the modern web interface, such as S19"""
# static data
# data gathering locations
self.data_locations = ANTMINER_MODERN_DATA_LOC
# autotuning/shutdown support
self.supports_shutdown = True
_web_cls = AntminerModernWebAPI
data_locations = ANTMINER_MODERN_DATA_LOC
supports_shutdown = True
async def get_config(self) -> MinerConfig:
data = await self.web.get_miner_conf()
@@ -233,7 +230,9 @@ class AntminerModern(BMMiner):
pass
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:
return self.light
@@ -364,10 +363,6 @@ ANTMINER_OLD_DATA_LOC = DataLocations(
"_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")],
@@ -393,14 +388,11 @@ ANTMINER_OLD_DATA_LOC = DataLocations(
class AntminerOld(CGMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
super().__init__(ip, api_ver)
# interfaces
self.web = AntminerOldWebAPI(ip)
"""Handler for AntMiners with the old web interface, such as S17"""
# static data
# data gathering locations
self.data_locations = ANTMINER_OLD_DATA_LOC
_web_cls = AntminerOldWebAPI
data_locations = ANTMINER_OLD_DATA_LOC
async def get_config(self) -> MinerConfig:
data = await self.web.get_miner_conf()
@@ -449,7 +441,9 @@ class AntminerOld(CGMiner):
return True
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:
return self.light

View File

@@ -17,11 +17,9 @@
import re
from typing import List, Optional
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.miners.backends import CGMiner
from pyasic.miners.backends.cgminer import CGMiner
from pyasic.miners.base import DataFunction, DataLocations, DataOptions, RPCAPICommand
AVALON_DATA_LOC = DataLocations(
@@ -70,12 +68,10 @@ AVALON_DATA_LOC = DataLocations(
)
class CGMinerAvalon(CGMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
super().__init__(ip, api_ver)
class AvalonMiner(CGMiner):
"""Handler for Avalon Miners"""
# data gathering locations
self.data_locations = AVALON_DATA_LOC
data_locations = AVALON_DATA_LOC
async def fault_light_on(self) -> bool:
try:
@@ -108,26 +104,6 @@ class CGMinerAvalon(CGMiner):
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
def parse_stats(stats):
_stats_items = re.findall(".+?\\[*?]", stats)
@@ -193,14 +169,6 @@ class CGMinerAvalon(CGMiner):
except (KeyError, ValueError):
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]:
if api_devs is None:
try:
@@ -292,9 +260,6 @@ class CGMinerAvalon(CGMiner):
except (IndexError, KeyError, ValueError, TypeError):
pass
async def _get_wattage(self) -> Optional[int]:
return None
async def _get_wattage_limit(self, api_stats: dict = None) -> Optional[int]:
if api_stats is None:
try:
@@ -332,10 +297,7 @@ class CGMinerAvalon(CGMiner):
pass
return fans_data
async def _get_errors(self) -> List[MinerErrorData]:
return []
async def _get_fault_light(self, api_stats: dict = None) -> bool: # noqa
async def _get_fault_light(self, api_stats: dict = None) -> Optional[bool]:
if self.light:
return self.light
if api_stats is None:
@@ -363,9 +325,3 @@ class CGMinerAvalon(CGMiner):
except LookupError:
pass
return False
async def _is_mining(self, *args, **kwargs) -> Optional[bool]:
return None
async def _get_uptime(self) -> Optional[int]:
return None

View File

@@ -18,7 +18,6 @@ from typing import List, Optional
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.miners.base import (
BaseMiner,
@@ -62,18 +61,9 @@ BFGMINER_DATA_LOC = DataLocations(
class BFGMiner(BaseMiner):
"""Base handler for BFGMiner based miners."""
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
super().__init__(ip)
# interfaces
self.api = BFGMinerRPCAPI(ip, api_ver)
_api_cls = BFGMinerRPCAPI
# static data
self.api_type = "BFGMiner"
# data gathering locations
self.data_locations = BFGMINER_DATA_LOC
# data storage
self.api_ver = api_ver
data_locations = BFGMINER_DATA_LOC
async def get_config(self) -> MinerConfig:
# get pool data
@@ -85,34 +75,10 @@ class BFGMiner(BaseMiner):
self.config = MinerConfig.from_api(pools)
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}) ###
##################################################
async def _get_mac(self) -> Optional[str]:
return None
async def _get_api_ver(self, api_version: dict = None) -> Optional[str]:
if api_version is None:
try:
@@ -143,15 +109,6 @@ class BFGMiner(BaseMiner):
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]:
# get hr from API
if api_summary is None:
@@ -220,15 +177,6 @@ class BFGMiner(BaseMiner):
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:
@@ -259,12 +207,6 @@ class BFGMiner(BaseMiner):
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]:
# X19 method, not sure compatibility
if api_stats is None:
@@ -288,9 +230,3 @@ class BFGMiner(BaseMiner):
return round(expected_rate, 2)
except LookupError:
pass
async def _is_mining(self, *args, **kwargs) -> Optional[bool]:
return None
async def _get_uptime(self, *args, **kwargs) -> Optional[int]:
return None

View File

@@ -19,7 +19,6 @@ from typing import List, Optional
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.miners.base import (
BaseMiner,
@@ -67,46 +66,9 @@ BMMINER_DATA_LOC = DataLocations(
class BMMiner(BaseMiner):
"""Base handler for BMMiner based miners."""
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
super().__init__(ip)
# interfaces
self.api = BMMinerRPCAPI(ip, api_ver)
_api_cls = BMMinerRPCAPI
# static data
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
data_locations = BMMINER_DATA_LOC
async def get_config(self) -> MinerConfig:
# get pool data
@@ -126,34 +88,10 @@ class BMMiner(BaseMiner):
return False
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}) ###
##################################################
async def _get_mac(self) -> Optional[str]:
return None
async def _get_api_ver(self, api_version: dict = None) -> Optional[str]:
if api_version is None:
try:
@@ -184,9 +122,6 @@ class BMMiner(BaseMiner):
return self.fw_ver
async def _get_fan_psu(self):
return None
async def _get_hostname(self) -> Optional[str]:
hn = await self.send_ssh_command("cat /proc/sys/kernel/hostname")
return hn
@@ -272,15 +207,6 @@ class BMMiner(BaseMiner):
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:
@@ -310,12 +236,6 @@ class BMMiner(BaseMiner):
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]:
# X19 method, not sure compatibility
if api_stats is None:
@@ -340,9 +260,6 @@ class BMMiner(BaseMiner):
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]:
if api_stats is None:
try:

View File

@@ -13,7 +13,6 @@
# See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import asyncio
import logging
import time
from typing import List, Optional, Union
@@ -96,69 +95,29 @@ BOSMINER_DATA_LOC = DataLocations(
class BOSMiner(BaseMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
super().__init__(ip)
# interfaces
self.api = BOSMinerRPCAPI(ip, api_ver)
self.web = BOSMinerWebAPI(ip)
"""Handler for old versions of BraiinsOS+ (pre-gRPC)"""
# static data
self.api_type = "BOSMiner"
# data gathering locations
self.data_locations = BOSMINER_DATA_LOC
# autotuning/shutdown support
self.supports_autotuning = True
self.supports_shutdown = True
_api_cls = BOSMinerRPCAPI
_web_cls = BOSMinerWebAPI
# data storage
self.api_ver = api_ver
firmware = "BOS+"
async def send_ssh_command(self, cmd: str) -> Optional[str]:
result = None
data_locations = BOSMINER_DATA_LOC
try:
conn = await asyncio.wait_for(self._get_ssh_connection(), timeout=10)
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
supports_shutdown = True
supports_autotuning = True
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")
logging.debug(f"{self}: fault_light on command completed.")
if isinstance(ret, str):
self.light = True
return self.light
return False
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")
logging.debug(f"{self}: fault_light off command completed.")
if isinstance(ret, str):
self.light = False
return True
@@ -168,9 +127,8 @@ class BOSMiner(BaseMiner):
return await self.restart_bosminer()
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")
logging.debug(f"{self}: bosminer restart command completed.")
if isinstance(ret, str):
return True
return False
@@ -180,6 +138,7 @@ class BOSMiner(BaseMiner):
data = await self.api.pause()
except APIError:
return False
if data.get("PAUSE"):
if data["PAUSE"][0]:
return True
@@ -190,40 +149,32 @@ class BOSMiner(BaseMiner):
data = await self.api.resume()
except APIError:
return False
if data.get("RESUME"):
if data["RESUME"][0]:
return True
return False
async def reboot(self) -> bool:
logging.debug(f"{self}: Sending reboot command.")
ret = await self.send_ssh_command("/sbin/reboot")
logging.debug(f"{self}: Reboot command completed.")
if isinstance(ret, str):
return True
return False
async def get_config(self) -> MinerConfig:
logging.debug(f"{self}: Getting config.")
raw_data = await self.send_ssh_command("cat /etc/bosminer.toml")
try:
conn = await self._get_ssh_connection()
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.")
toml_data = toml.loads(raw_data)
cfg = MinerConfig.from_bosminer(toml_data)
self.config = cfg
except toml.TomlDecodeError as e:
raise APIError("Failed to decode toml when getting config.") from e
return self.config
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
logging.debug(f"{self}: Sending config.")
self.config = config
toml_conf = toml.dumps(
@@ -241,6 +192,7 @@ class BOSMiner(BaseMiner):
conn = await self._get_ssh_connection()
except ConnectionError as e:
raise APIError("SSH connection failed when sending config.") from e
async with conn:
# BBB check because bitmain suxx
bbb_check = await conn.run(
@@ -251,20 +203,13 @@ class BOSMiner(BaseMiner):
if not bbb:
await conn.run("/etc/init.d/bosminer stop")
logging.debug(f"{self}: Opening SFTP connection.")
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:
await file.write(toml_conf)
logging.debug(f"{self}: Restarting BOSMiner")
await conn.run("/etc/init.d/bosminer start")
# I really hate BBB, please get rid of it if you have it
else:
await conn.run("/etc/init.d/S99bosminer stop")
logging.debug(f"{self}: BBB sending config")
await conn.run("echo '" + toml_conf + "' > /etc/bosminer.toml")
logging.debug(f"{self}: BBB restarting bosminer.")
await conn.run("/etc/init.d/S99bosminer start")
async def set_power_limit(self, wattage: int) -> bool:
@@ -274,8 +219,10 @@ class BOSMiner(BaseMiner):
return False
cfg.mining_mode = MiningModePowerTune(wattage)
await self.send_config(cfg)
except APIError:
raise
except Exception as e:
logging.warning(f"{self} set_power_limit: {e}")
logging.warning(f"{self} - Failed to set power limit: {e}")
return False
else:
return True
@@ -377,7 +324,7 @@ class BOSMiner(BaseMiner):
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:
try:
web_bos_info = await self.web.luci.get_bos_info()
@@ -392,7 +339,6 @@ class BOSMiner(BaseMiner):
ver = web_bos_info["version"].split("-")[5]
if "." in ver:
self.fw_ver = ver
logging.debug(f"Found version for {self.ip}: {self.fw_ver}")
except (LookupError, AttributeError):
return None
@@ -404,7 +350,7 @@ class BOSMiner(BaseMiner):
await self.send_ssh_command("cat /proc/sys/kernel/hostname")
).strip()
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 hostname
@@ -426,7 +372,7 @@ class BOSMiner(BaseMiner):
api_temps: dict = None,
api_devdetails: dict = None,
api_devs: dict = None,
):
) -> List[HashBoard]:
hashboards = [
HashBoard(slot=i, expected_chips=self.expected_chips)
for i in range(self.expected_hashboards)
@@ -494,9 +440,6 @@ class BOSMiner(BaseMiner):
return hashboards
async def _get_env_temp(self) -> Optional[float]:
return None
async def _get_wattage(self, api_tunerstatus: dict = None) -> Optional[int]:
if api_tunerstatus is None:
try:
@@ -542,9 +485,6 @@ class BOSMiner(BaseMiner):
return 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]:
if api_tunerstatus is None:
try:
@@ -709,22 +649,15 @@ BOSER_DATA_LOC = DataLocations(
class BOSer(BaseMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
super().__init__(ip)
# interfaces
self.api = BOSMinerRPCAPI(ip, api_ver)
self.web = BOSerWebAPI(ip)
"""Handler for new versions of BraiinsOS+ (post-gRPC)"""
# static data
self.api_type = "BOSMiner"
# data gathering locations
self.data_locations = BOSER_DATA_LOC
# autotuning/shutdown support
self.supports_autotuning = True
self.supports_shutdown = True
_api_cls = BOSMinerRPCAPI
_web_cls = BOSerWebAPI
# data storage
self.api_ver = api_ver
data_locations = BOSER_DATA_LOC
supports_autotuning = True
supports_shutdown = True
async def fault_light_on(self) -> bool:
resp = await self.web.grpc.set_locate_device_status(True)
@@ -770,11 +703,6 @@ class BOSer(BaseMiner):
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:
try:
result = await self.web.grpc.set_power_target(wattage)
@@ -812,7 +740,6 @@ class BOSer(BaseMiner):
except APIError:
pass
# Now get the API version
if api_version is not None:
try:
api_ver = api_version["VERSION"][0]["API"]
@@ -843,11 +770,10 @@ class BOSer(BaseMiner):
ver = fw_ver.split("-")[5]
if "." in ver:
self.fw_ver = ver
logging.debug(f"Found version for {self.ip}: {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:
try:
grpc_miner_details = await self.web.grpc.get_miner_details()
@@ -888,7 +814,7 @@ class BOSer(BaseMiner):
except LookupError:
pass
async def _get_hashboards(self, grpc_hashboards: dict = None):
async def _get_hashboards(self, grpc_hashboards: dict = None) -> List[HashBoard]:
hashboards = [
HashBoard(slot=i, expected_chips=self.expected_chips)
for i in range(self.expected_hashboards)
@@ -924,9 +850,6 @@ class BOSer(BaseMiner):
return hashboards
async def _get_env_temp(self) -> Optional[float]:
return None
async def _get_wattage(self, grpc_miner_stats: dict = None) -> Optional[int]:
if grpc_miner_stats is None:
try:
@@ -976,9 +899,6 @@ class BOSer(BaseMiner):
return 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]:
if api_tunerstatus is None:
try:

View File

@@ -116,20 +116,11 @@ BTMINER_DATA_LOC = DataLocations(
class BTMiner(BaseMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
super().__init__(ip)
# interfaces
self.api = BTMinerRPCAPI(ip, api_ver)
_api_cls = BTMinerRPCAPI
# static data
self.api_type = "BTMiner"
# data gathering locations
self.data_locations = BTMINER_DATA_LOC
# autotuning/shutdown support
self.supports_shutdown = True
data_locations = BTMINER_DATA_LOC
# data storage
self.api_ver = api_ver
supports_shutdown = True
async def _reset_api_pwd_to_admin(self, pwd: str):
try:
@@ -397,7 +388,6 @@ class BTMiner(BaseMiner):
return hostname
async def _get_hashrate(self, api_summary: dict = None) -> Optional[float]:
# get hr from API
if api_summary is None:
try:
api_summary = await self.api.summary()
@@ -545,12 +535,15 @@ class BTMiner(BaseMiner):
pass
if api_get_error_code is not None:
for err in api_get_error_code["Msg"]["error_code"]:
if isinstance(err, dict):
for code in err:
errors.append(WhatsminerError(error_code=int(code)))
else:
errors.append(WhatsminerError(error_code=int(err)))
try:
for err in api_get_error_code["Msg"]["error_code"]:
if isinstance(err, dict):
for code in err:
errors.append(WhatsminerError(error_code=int(code)))
else:
errors.append(WhatsminerError(error_code=int(err)))
except KeyError:
pass
if api_summary is None:
try:
@@ -568,7 +561,7 @@ class BTMiner(BaseMiner):
pass
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:
try:
api_summary = await self.api.summary()
@@ -583,7 +576,7 @@ class BTMiner(BaseMiner):
except LookupError:
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:
try:
api_get_miner_info = await self.api.get_miner_info()

View File

@@ -14,12 +14,9 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
import logging
from typing import List, Optional
from typing import Optional
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.miners.base import (
BaseMiner,
@@ -65,91 +62,18 @@ CGMINER_DATA_LOC = DataLocations(
class CGMiner(BaseMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
super().__init__(ip)
# interfaces
self.api = CGMinerRPCAPI(ip, api_ver)
"""Base handler for CGMiner based miners"""
# static data
self.api_type = "CGMiner"
# data gathering locations
self.data_locations = CGMINER_DATA_LOC
_api_cls = CGMinerRPCAPI
# 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 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
data_locations = CGMINER_DATA_LOC
async def reboot(self) -> bool:
logging.debug(f"{self}: Sending reboot command.")
ret = await self.send_ssh_command("reboot")
if ret is None:
return False
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:
# get pool data
try:
@@ -160,25 +84,10 @@ class CGMiner(BaseMiner):
self.config = MinerConfig.from_api(pools)
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}) ###
##################################################
async def _get_mac(self) -> Optional[str]:
return None
async def _get_api_ver(self, api_version: dict = None) -> Optional[str]:
if api_version is None:
try:
@@ -209,12 +118,7 @@ class CGMiner(BaseMiner):
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]:
# get hr from API
if api_summary is None:
try:
api_summary = await self.api.summary()
@@ -229,133 +133,6 @@ class CGMiner(BaseMiner):
except (LookupError, ValueError, TypeError):
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]:
if api_stats is None:
try:

View File

@@ -84,16 +84,13 @@ EPIC_DATA_LOC = DataLocations(
class ePIC(BaseMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
super().__init__(ip, api_ver)
# interfaces
self.web = ePICWebAPI(ip)
_web_cls = ePICWebAPI
# static data
self.api_type = "ePIC"
self.fw_str = "ePIC"
# data gathering locations
self.data_locations = EPIC_DATA_LOC
firmware = "ePIC"
data_locations = EPIC_DATA_LOC
supports_shutdown = True
async def get_config(self) -> MinerConfig:
summary = None
@@ -148,7 +145,7 @@ class ePIC(BaseMiner):
pass
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:
try:
web_network = await self.web.network()
@@ -163,7 +160,7 @@ class ePIC(BaseMiner):
except KeyError:
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:
try:
web_summary = await self.web.summary()
@@ -314,7 +311,7 @@ class ePIC(BaseMiner):
pass
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:
try:
web_summary = await self.web.summary()
@@ -346,27 +343,3 @@ class ePIC(BaseMiner):
except KeyError:
pass
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

View File

@@ -13,7 +13,7 @@
# See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from typing import List, Optional
from typing import List
from pyasic.config import MinerConfig
from pyasic.data import HashBoard
@@ -66,15 +66,10 @@ GOLDSHELL_DATA_LOC = DataLocations(
)
class BFGMinerGoldshell(BFGMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
super().__init__(ip, api_ver)
# interfaces
self.web = GoldshellWebAPI(ip)
class GoldshellMiner(BFGMiner):
_web_cls = GoldshellWebAPI
# static data
# data gathering locations
self.data_locations = GOLDSHELL_DATA_LOC
data_locations = GOLDSHELL_DATA_LOC
async def get_config(self) -> MinerConfig:
# get pool data
@@ -180,9 +175,3 @@ class BFGMinerGoldshell(BFGMiner):
logger.error(self, api_devdetails)
return hashboards
async def _is_mining(self, *args, **kwargs) -> Optional[bool]:
return None
async def _get_uptime(self, *args, **kwargs) -> Optional[int]:
return None

View File

@@ -14,69 +14,8 @@
# 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.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):
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
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
firmware = "Hive"

View File

@@ -80,7 +80,6 @@ INNOSILICON_DATA_LOC = DataLocations(
WebAPICommand("web_get_all", "getAll"),
],
),
str(DataOptions.FAN_PSU): DataFunction("_get_fan_psu"),
str(DataOptions.ERRORS): DataFunction(
"_get_errors",
[
@@ -96,25 +95,13 @@ INNOSILICON_DATA_LOC = DataLocations(
class Innosilicon(CGMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
super().__init__(ip, api_ver=api_ver)
# interfaces
self.web = InnosiliconWebAPI(ip)
"""Base handler for Innosilicon miners"""
# static data
# data gathering locations
self.data_locations = INNOSILICON_DATA_LOC
# autotuning/shutdown support
self.supports_shutdown = True
_web_cls = InnosiliconWebAPI
# data storage
self.api_ver = api_ver
data_locations = INNOSILICON_DATA_LOC
async def fault_light_on(self) -> bool:
return False
async def fault_light_off(self) -> bool:
return False
supports_shutdown = True
async def get_config(self) -> MinerConfig:
# get pool data
@@ -145,23 +132,6 @@ class Innosilicon(CGMiner):
async def restart_backend(self) -> bool:
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:
self.config = config
await self.web.update_pools(config.as_inno(user_suffix=user_suffix))
@@ -393,6 +363,3 @@ class Innosilicon(CGMiner):
level = int(level)
limit = 1250 + (250 * level)
return limit
async def _get_expected_hashrate(self) -> Optional[float]:
pass

View File

@@ -13,11 +13,10 @@
# See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from typing import List, Optional, Tuple, Union
from typing import List, Optional
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.miners.base import (
BaseMiner,
@@ -62,23 +61,11 @@ LUXMINER_DATA_LOC = DataLocations(
class LUXMiner(BaseMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
super().__init__(ip)
# interfaces
self.api = LUXMinerRPCAPI(ip, api_ver)
# self.web = BOSMinerWebAPI(ip)
_api_cls = LUXMinerRPCAPI
# static data
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
firmware = "LuxOS"
# data storage
self.api_ver = api_ver
data_locations = LUXMINER_DATA_LOC
async def _get_session(self) -> Optional[str]:
try:
@@ -159,12 +146,6 @@ class LUXMiner(BaseMiner):
async def get_config(self) -> MinerConfig:
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}) ###
##################################################
@@ -185,18 +166,6 @@ class LUXMiner(BaseMiner):
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]:
if api_summary is None:
try:
@@ -264,10 +233,7 @@ class LUXMiner(BaseMiner):
return hashboards
async def _get_env_temp(self) -> Optional[float]:
return None
async def _get_wattage(self, api_power: dict) -> Optional[int]:
async def _get_wattage(self, api_power: dict = None) -> Optional[int]:
if api_power is None:
try:
api_power = await self.api.power()
@@ -280,9 +246,6 @@ class LUXMiner(BaseMiner):
except (LookupError, ValueError, TypeError):
pass
async def _get_wattage_limit(self) -> Optional[int]:
return None
async def _get_fans(self, api_fans: dict = None) -> List[Fan]:
if api_fans is None:
try:
@@ -300,15 +263,6 @@ class LUXMiner(BaseMiner):
fans.append(Fan())
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]:
if api_stats is None:
try:
@@ -332,9 +286,6 @@ class LUXMiner(BaseMiner):
except LookupError:
pass
async def _is_mining(self) -> Optional[bool]:
pass
async def _get_uptime(self, api_stats: dict = None) -> Optional[int]:
if api_stats is None:
try:

View File

@@ -75,16 +75,11 @@ VNISH_DATA_LOC = DataLocations(
class VNish(BMMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
super().__init__(ip, api_ver)
# interfaces
self.web = VNishWebAPI(ip)
_web_cls = VNishWebAPI
# static data
self.api_type = "VNish"
self.fw_str = "VNish"
# data gathering locations
self.data_locations = VNISH_DATA_LOC
firmware = "VNish"
data_locations = VNISH_DATA_LOC
async def restart_backend(self) -> bool:
data = await self.web.restart_vnish()
@@ -211,12 +206,6 @@ class VNish(BMMiner):
except KeyError:
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:
try:
web_settings = await self.web.settings()

View File

@@ -17,21 +17,15 @@ from pyasic.miners.backends.btminer import BTMiner
class M6X(BTMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.supports_autotuning = True
supports_autotuning = True
class M5X(BTMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.supports_autotuning = True
supports_autotuning = True
class M3X(BTMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.supports_autotuning = True
supports_autotuning = True
class M2X(BTMiner):

View File

@@ -16,10 +16,10 @@
import asyncio
import ipaddress
import logging
from abc import ABC, abstractmethod
import warnings
from dataclasses import dataclass, field, make_dataclass
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
@@ -88,7 +88,7 @@ class GraphQLCommand(WebAPICommand):
@dataclass
class DataFunction:
cmd: str
kwargs: list[
kwargs: List[
Union[RPCAPICommand, WebAPICommand, GRPCCommand, GraphQLCommand]
] = field(default_factory=list)
@@ -106,39 +106,30 @@ DataLocations = make_dataclass(
)
class BaseMiner(ABC):
def __init__(self, ip: str, *args, **kwargs) -> None:
# interfaces
self.api = None
self.web = None
class MinerProtocol(Protocol):
_api_cls: Type = None
_web_cls: Type = None
# static data
self.ip = ip
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
api = None
web = None
# data storage
self.api_ver = None
self.fw_ver = None
self.light = None
self.config = None
make: str = None
raw_model: str = None
firmware: str = None
def __new__(cls, *args, **kwargs):
if cls is BaseMiner:
raise TypeError(f"Only children of '{cls.__name__}' may be instantiated")
return object.__new__(cls)
expected_hashboards: int = 3
expected_chips: int = None
expected_fans: int = 2
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):
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)
@property
def model(self):
def model(self) -> str:
model_data = [self.raw_model if self.raw_model is not None else "Unknown"]
if self.fw_str is not None:
model_data.append(f"({self.fw_str})")
if self.firmware is not None:
model_data.append(f"({self.firmware})")
return " ".join(model_data)
@property
def pwd(self): # noqa - Skip PyCharm inspection
data = []
try:
if self.web is not None:
data.append(f"web={self.web.pwd}")
except TypeError:
pass
try:
if self.api is not None:
data.append(f"api={self.api.pwd}")
except TypeError:
pass
return ",".join(data)
def pwd(self) -> Dict[str, str]:
data = {}
if self.web is not None:
data["web"] = self.web.pwd
if self.api is not None:
data["api"] = self.api.pwd
return data
@pwd.setter
def pwd(self, val):
try:
if self.web is not None:
self.web.pwd = val
except TypeError:
pass
try:
if self.api is not None:
self.api.pwd = val
except TypeError:
pass
def pwd(self, val: str) -> None:
if self.web is not None:
self.web.pwd = val
if self.api is not None:
self.api.pwd = val
@property
def username(self): # noqa - Skip PyCharm inspection
data = []
try:
if self.web is not None:
data.append(f"web={self.web.username}")
except TypeError:
pass
return ",".join(data)
def username(self) -> Dict[str, str]:
data = {}
if self.web is not None:
data["web"] = self.web.pwd
if self.api is not None:
data["api"] = self.api.pwd
return data
@username.setter
def username(self, val):
try:
if self.web is not None:
self.web.username = val
except TypeError:
pass
def username(self, val) -> None:
if self.web is not None:
self.web.username = val
async def _get_ssh_connection(self) -> asyncssh.connect:
"""Create a new asyncssh connection"""
@@ -216,44 +191,47 @@ class BaseMiner(ABC):
server_host_key_algs=["ssh-rsa"],
)
return conn
except asyncssh.misc.PermissionDenied:
try:
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 asyncssh.misc.PermissionDenied as e:
raise ConnectionRefusedError from e
except Exception as 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:
return await self.get_fault_light()
@abstractmethod
async def fault_light_on(self) -> bool:
"""Turn the fault light of the miner on and return success as a boolean.
Returns:
A boolean value of the success of turning the light on.
"""
return False
@abstractmethod
async def fault_light_off(self) -> bool:
"""Turn the fault light of the miner off and return success as a boolean.
Returns:
A boolean value of the success of turning the light off.
"""
return False
@abstractmethod
async def get_config(self) -> MinerConfig:
# 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].
@@ -261,24 +239,24 @@ class BaseMiner(ABC):
Returns:
A [`MinerConfig`][pyasic.config.MinerConfig] containing the pool information and mining configuration.
"""
return MinerConfig()
@abstractmethod
async def reboot(self) -> bool:
"""Reboot the miner and return success as a boolean.
Returns:
A boolean value of the success of rebooting the miner.
"""
return False
@abstractmethod
async def restart_backend(self) -> bool:
"""Restart the mining process of the miner (bosminer, bmminer, cgminer, etc) and return success as a boolean.
Returns:
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:
"""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.
user_suffix: A suffix to append to the username when sending to the miner.
"""
pass
@abstractmethod
async def stop_mining(self) -> bool:
"""Stop the mining process of the miner.
Returns:
A boolean value of the success of stopping the mining process.
"""
return False
@abstractmethod
async def resume_mining(self) -> bool:
"""Resume the mining process of the miner.
Returns:
A boolean value of the success of resuming the mining process.
"""
return False
@abstractmethod
async def set_power_limit(self, wattage: int) -> bool:
"""Set the power limit to be used by the miner.
@@ -313,6 +291,7 @@ class BaseMiner(ABC):
Returns:
A boolean value of the success of setting the power limit.
"""
return False
##################################################
### DATA GATHERING FUNCTIONS (get_{some_data}) ###
@@ -464,68 +443,52 @@ class BaseMiner(ABC):
"""
return await self._get_uptime()
@abstractmethod
async def _get_mac(self, *args, **kwargs) -> Optional[str]:
async def _get_mac(self) -> Optional[str]:
pass
@abstractmethod
async def _get_api_ver(self, *args, **kwargs) -> Optional[str]:
async def _get_api_ver(self) -> Optional[str]:
pass
@abstractmethod
async def _get_fw_ver(self, *args, **kwargs) -> Optional[str]:
async def _get_fw_ver(self) -> Optional[str]:
pass
@abstractmethod
async def _get_hostname(self, *args, **kwargs) -> Optional[str]:
async def _get_hostname(self) -> Optional[str]:
pass
@abstractmethod
async def _get_hashrate(self, *args, **kwargs) -> Optional[float]:
async def _get_hashrate(self) -> Optional[float]:
pass
@abstractmethod
async def _get_hashboards(self, *args, **kwargs) -> List[HashBoard]:
async def _get_hashboards(self) -> List[HashBoard]:
return []
async def _get_env_temp(self) -> Optional[float]:
pass
@abstractmethod
async def _get_env_temp(self, *args, **kwargs) -> Optional[float]:
async def _get_wattage(self) -> Optional[int]:
pass
@abstractmethod
async def _get_wattage(self, *args, **kwargs) -> Optional[int]:
async def _get_wattage_limit(self) -> Optional[int]:
pass
@abstractmethod
async def _get_wattage_limit(self, *args, **kwargs) -> Optional[int]:
async def _get_fans(self) -> List[Fan]:
return []
async def _get_fan_psu(self) -> Optional[int]:
pass
@abstractmethod
async def _get_fans(self, *args, **kwargs) -> List[Fan]:
async def _get_errors(self) -> List[MinerErrorData]:
return []
async def _get_fault_light(self) -> Optional[bool]:
pass
@abstractmethod
async def _get_fan_psu(self, *args, **kwargs) -> Optional[int]:
async def _get_expected_hashrate(self) -> Optional[float]:
pass
@abstractmethod
async def _get_errors(self, *args, **kwargs) -> List[MinerErrorData]:
async def _is_mining(self) -> Optional[bool]:
pass
@abstractmethod
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]:
async def _get_uptime(self) -> Optional[int]:
pass
async def _get_data(
@@ -652,4 +615,21 @@ class BaseMiner(ABC):
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)

View File

@@ -13,9 +13,9 @@
# See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.backends import BFGMinerGoldshell
from pyasic.miners.backends import GoldshellMiner
from pyasic.miners.types import CK5
class BFGMinerCK5(BFGMinerGoldshell, CK5):
class GoldshellCK5(GoldshellMiner, CK5):
pass

View File

@@ -13,9 +13,9 @@
# See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.backends import BFGMinerGoldshell
from pyasic.miners.backends import GoldshellMiner
from pyasic.miners.types import HS5
class BFGMinerHS5(BFGMinerGoldshell, HS5):
class GoldshellHS5(GoldshellMiner, HS5):
pass

View File

@@ -13,9 +13,9 @@
# See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.backends import BFGMinerGoldshell
from pyasic.miners.backends import GoldshellMiner
from pyasic.miners.types import KD5
class BFGMinerKD5(BFGMinerGoldshell, KD5):
class GoldshellKD5(GoldshellMiner, KD5):
pass

View File

@@ -13,6 +13,6 @@
# See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from .CK5 import BFGMinerCK5
from .HS5 import BFGMinerHS5
from .KD5 import BFGMinerKD5
from .CK5 import GoldshellCK5
from .HS5 import GoldshellHS5
from .KD5 import GoldshellKD5

View File

@@ -13,9 +13,9 @@
# See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.backends import BFGMinerGoldshell
from pyasic.miners.backends import GoldshellMiner
from pyasic.miners.types import KDMax
class BFGMinerKDMax(BFGMinerGoldshell, KDMax):
class BFGMinerGoldshellKDMax(GoldshellMiner, KDMax):
pass

View File

@@ -13,4 +13,4 @@
# See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from .KDMax import BFGMinerKDMax
from .KDMax import BFGMinerGoldshellKDMax

View File

@@ -17,31 +17,21 @@
from pyasic.miners.base import BaseMiner
class WhatsMiner(BaseMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.make = "WhatsMiner"
class WhatsMinerMake(BaseMiner):
make = "WhatsMiner"
class AntMiner(BaseMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.make = "AntMiner"
class AntMinerMake(BaseMiner):
make = "AntMiner"
class AvalonMiner(BaseMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.make = "AvalonMiner"
class AvalonMinerMake(BaseMiner):
make = "AvalonMiner"
class InnosiliconMiner(BaseMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.make = "Innosilicon"
class InnosiliconMake(BaseMiner):
make = "Innosilicon"
class GoldshellMiner(BaseMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.make = "Goldshell"
class GoldshellMake(BaseMiner):
make = "Goldshell"

View File

@@ -28,17 +28,17 @@ from pyasic.logger import logger
from pyasic.miners.antminer import *
from pyasic.miners.avalonminer import *
from pyasic.miners.backends import (
BFGMiner,
AvalonMiner,
BMMiner,
BOSMiner,
BTMiner,
CGMiner,
CGMinerAvalon,
GoldshellMiner,
Hiveon,
LUXMiner,
VNish,
ePIC,
)
from pyasic.miners.backends.innosilicon import Innosilicon
from pyasic.miners.base import AnyMiner
from pyasic.miners.goldshell import *
from pyasic.miners.innosilicon import *
@@ -310,7 +310,7 @@ MINER_CLASSES = {
"M66SVK40": BTMinerM66SVK40,
},
MinerTypes.AVALONMINER: {
None: CGMinerAvalon,
None: AvalonMiner,
"AVALONMINER 721": CGMinerAvalon721,
"AVALONMINER 741": CGMinerAvalon741,
"AVALONMINER 761": CGMinerAvalon761,
@@ -325,16 +325,16 @@ MINER_CLASSES = {
"AVALONMINER 1246": CGMinerAvalon1246,
},
MinerTypes.INNOSILICON: {
None: CGMiner,
None: Innosilicon,
"T3H+": InnosiliconT3HPlus,
"A10X": InnosiliconA10X,
},
MinerTypes.GOLDSHELL: {
None: BFGMiner,
"GOLDSHELL CK5": BFGMinerCK5,
"GOLDSHELL HS5": BFGMinerHS5,
"GOLDSHELL KD5": BFGMinerKD5,
"GOLDSHELL KDMAX": BFGMinerKDMax,
None: GoldshellMiner,
"GOLDSHELL CK5": GoldshellCK5,
"GOLDSHELL HS5": GoldshellHS5,
"GOLDSHELL KD5": GoldshellKD5,
"GOLDSHELL KDMAX": BFGMinerGoldshellKDMax,
},
MinerTypes.BRAIINS_OS: {
None: BOSMiner,
@@ -761,7 +761,7 @@ class MinerFactory:
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
if re.search(r"\"error_code\":\[\".+\"\]", str_data):
if re.search(r"\"error_code\":\[\".+\"]", str_data):
str_data = str_data.replace("[", "{").replace("]", "}")
return str_data

View File

@@ -14,13 +14,10 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AntMiner
from pyasic.miners.makes import AntMinerMake
class Z15(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "Z15"
self.expected_chips = 3
self.fan_count = 2
class Z15(AntMinerMake):
raw_model = "Z15"
expected_chips = 3
expected_fans = 2

View File

@@ -14,39 +14,28 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AntMiner
from pyasic.miners.makes import AntMinerMake
class S17(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "S17"
self.expected_chips = 48
self.fan_count = 4
class S17(AntMinerMake):
raw_model = "S17"
expected_chips = 48
expected_fans = 4
class S17Plus(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.raw_model = "S17+"
self.expected_chips = 65
self.fan_count = 4
class S17Plus(AntMinerMake):
raw_model = "S17+"
expected_chips = 65
expected_fans = 4
class S17Pro(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "S17 Pro"
self.expected_chips = 48
self.fan_count = 4
class S17Pro(AntMinerMake):
raw_model = "S17 Pro"
expected_chips = 48
expected_fans = 4
class S17e(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "S17e"
self.expected_chips = 135
self.fan_count = 4
class S17e(AntMinerMake):
raw_model = "S17e"
expected_chips = 135
expected_fans = 4

View File

@@ -14,31 +14,22 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AntMiner
from pyasic.miners.makes import AntMinerMake
class T17(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "T17"
self.expected_chips = 30
self.fan_count = 4
class T17(AntMinerMake):
raw_model = "T17"
expected_chips = 30
expected_fans = 4
class T17Plus(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "T17+"
self.expected_chips = 44
self.fan_count = 4
class T17Plus(AntMinerMake):
raw_model = "T17+"
expected_chips = 44
expected_fans = 4
class T17e(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "T17e"
self.expected_chips = 78
self.fan_count = 4
class T17e(AntMinerMake):
raw_model = "T17e"
expected_chips = 78
expected_fans = 4

View File

@@ -14,158 +14,107 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AntMiner
from pyasic.miners.makes import AntMinerMake
class S19(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "S19"
self.expected_chips = 76
self.fan_count = 4
class S19(AntMinerMake):
raw_model = "S19"
expected_chips = 76
expected_fans = 4
class S19NoPIC(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "S19 No PIC"
self.expected_chips = 88
self.fan_count = 4
class S19NoPIC(AntMinerMake):
raw_model = "S19 No PIC"
expected_chips = 88
expected_fans = 4
class S19Pro(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "S19 Pro"
self.expected_chips = 114
self.fan_count = 4
class S19Pro(AntMinerMake):
raw_model = "S19 Pro"
expected_chips = 114
expected_fans = 4
class S19i(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "S19i"
self.expected_chips = 80
self.fan_count = 4
class S19i(AntMinerMake):
raw_model = "S19i"
expected_chips = 80
expected_fans = 4
class S19Plus(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "S19+"
self.expected_chips = 80
self.fan_count = 4
class S19Plus(AntMinerMake):
raw_model = "S19+"
expected_chips = 80
expected_fans = 4
class S19ProPlus(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "S19 Pro+"
self.expected_chips = 120
self.fan_count = 4
class S19ProPlus(AntMinerMake):
raw_model = "S19 Pro+"
expected_chips = 120
expected_fans = 4
class S19XP(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "S19 XP"
self.expected_chips = 110
self.fan_count = 4
class S19XP(AntMinerMake):
raw_model = "S19 XP"
expected_chips = 110
expected_fans = 4
class S19a(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "S19a"
self.expected_chips = 72
self.fan_count = 4
class S19a(AntMinerMake):
raw_model = "S19a"
expected_chips = 72
expected_fans = 4
class S19aPro(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "S19a Pro"
self.expected_chips = 100
self.fan_count = 4
class S19aPro(AntMinerMake):
raw_model = "S19a Pro"
expected_chips = 100
expected_fans = 4
class S19j(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "S19j"
self.expected_chips = 114
self.fan_count = 4
class S19j(AntMinerMake):
raw_model = "S19j"
expected_chips = 114
expected_fans = 4
class S19jNoPIC(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "S19j No PIC"
self.expected_chips = 88
self.fan_count = 4
class S19jNoPIC(AntMinerMake):
raw_model = "S19j No PIC"
expected_chips = 88
expected_fans = 4
class S19jPro(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "S19j Pro"
self.expected_chips = 126
self.fan_count = 4
class S19jPro(AntMinerMake):
raw_model = "S19j Pro"
expected_chips = 126
expected_fans = 4
class S19jProPlus(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "S19j Pro+"
self.expected_chips = 120
self.fan_count = 4
class S19jProPlus(AntMinerMake):
raw_model = "S19j Pro+"
expected_chips = 120
expected_fans = 4
class S19kPro(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "S19k Pro"
self.expected_chips = 77
self.fan_count = 4
class S19kPro(AntMinerMake):
raw_model = "S19k Pro"
expected_chips = 77
expected_fans = 4
class S19L(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "S19L"
self.expected_chips = 76
self.fan_count = 4
class S19L(AntMinerMake):
raw_model = "S19L"
expected_chips = 76
expected_fans = 4
class S19kProNoPIC(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "S19k Pro No PIC"
self.expected_chips = 77
self.fan_count = 4
class S19kProNoPIC(AntMinerMake):
raw_model = "S19k Pro No PIC"
expected_chips = 77
expected_fans = 4
class S19ProHydro(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "S19 Pro Hydro"
self.expected_chips = 180
self.expected_hashboards = 4
self.fan_count = 0
class S19ProHydro(AntMinerMake):
raw_model = "S19 Pro Hydro"
expected_chips = 180
expected_hashboards = 4
expected_fans = 0

View File

@@ -14,13 +14,10 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AntMiner
from pyasic.miners.makes import AntMinerMake
class T19(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "T19"
self.expected_chips = 76
self.fan_count = 4
class T19(AntMinerMake):
raw_model = "T19"
expected_chips = 76
expected_fans = 4

View File

@@ -14,14 +14,12 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AntMiner
from pyasic.miners.makes import AntMinerMake
class D3(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "D3"
self.expected_chips = 60
self.expected_hashboards = 3
self.fan_count = 2
class D3(AntMinerMake):
raw_model = "D3"
expected_chips = 60
expected_hashboards = 3
expected_fans = 2

View File

@@ -14,14 +14,12 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AntMiner
from pyasic.miners.makes import AntMinerMake
class HS3(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "HS3"
self.expected_chips = 92
self.expected_hashboards = 3
self.fan_count = 2
class HS3(AntMinerMake):
raw_model = "HS3"
expected_chips = 92
expected_hashboards = 3
expected_fans = 2

View File

@@ -13,13 +13,10 @@
# See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AntMiner
from pyasic.miners.makes import AntMinerMake
class L3Plus(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "L3+"
self.expected_chips = 72
self.fan_count = 2
class L3Plus(AntMinerMake):
raw_model = "L3+"
expected_chips = 72
expected_fans = 2

View File

@@ -14,14 +14,11 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AntMiner
from pyasic.miners.makes import AntMinerMake
class DR5(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "DR5"
self.expected_chips = 72
self.expected_hashboards = 3
self.fan_count = 2
class DR5(AntMinerMake):
raw_model = "DR5"
expected_chips = 72
expected_hashboards = 3
expected_fans = 2

View File

@@ -13,13 +13,10 @@
# See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AntMiner
from pyasic.miners.makes import AntMinerMake
class L7(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "L7"
self.expected_chips = 120
self.fan_count = 4
class L7(AntMinerMake):
raw_model = "L7"
expected_chips = 120
expected_fans = 4

View File

@@ -14,14 +14,11 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AntMiner
from pyasic.miners.makes import AntMinerMake
class E9Pro(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "E9Pro"
self.expected_chips = 8
self.expected_hashboards = 2
self.fan_count = 4
class E9Pro(AntMinerMake):
raw_model = "E9Pro"
expected_chips = 8
expected_hashboards = 2
expected_fans = 4

View File

@@ -14,31 +14,22 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AntMiner
from pyasic.miners.makes import AntMinerMake
class S9(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "S9"
self.expected_chips = 63
self.fan_count = 2
class S9(AntMinerMake):
raw_model = "S9"
expected_chips = 63
expected_fans = 2
class S9i(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "S9i"
self.expected_chips = 63
self.fan_count = 2
class S9i(AntMinerMake):
raw_model = "S9i"
expected_chips = 63
expected_fans = 2
class S9j(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "S9j"
self.expected_chips = 63
self.fan_count = 2
class S9j(AntMinerMake):
raw_model = "S9j"
expected_chips = 63
expected_fans = 2

View File

@@ -14,13 +14,10 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AntMiner
from pyasic.miners.makes import AntMinerMake
class T9(AntMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "T9"
self.expected_chips = 54
self.fan_count = 2
class T9(AntMinerMake):
raw_model = "T9"
expected_chips = 54
expected_fans = 2

View File

@@ -14,13 +14,10 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AvalonMiner
from pyasic.miners.makes import AvalonMinerMake
class Avalon1026(AvalonMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "Avalon 1026"
self.expected_chips = 80
self.fan_count = 2
class Avalon1026(AvalonMinerMake):
raw_model = "Avalon 1026"
expected_chips = 80
expected_fans = 2

View File

@@ -14,13 +14,10 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AvalonMiner
from pyasic.miners.makes import AvalonMinerMake
class Avalon1047(AvalonMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "Avalon 1047"
self.expected_chips = 80
self.fan_count = 2
class Avalon1047(AvalonMinerMake):
raw_model = "Avalon 1047"
expected_chips = 80
expected_fans = 2

View File

@@ -14,13 +14,10 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AvalonMiner
from pyasic.miners.makes import AvalonMinerMake
class Avalon1066(AvalonMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "Avalon 1066"
self.expected_chips = 114
self.fan_count = 4
class Avalon1066(AvalonMinerMake):
raw_model = "Avalon 1066"
expected_chips = 114
expected_fans = 4

View File

@@ -14,13 +14,10 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AvalonMiner
from pyasic.miners.makes import AvalonMinerMake
class Avalon1166Pro(AvalonMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "Avalon 1166 Pro"
self.expected_chips = 120
self.fan_count = 4
class Avalon1166Pro(AvalonMinerMake):
raw_model = "Avalon 1166 Pro"
expected_chips = 120
expected_fans = 4

View File

@@ -14,13 +14,10 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AvalonMiner
from pyasic.miners.makes import AvalonMinerMake
class Avalon1246(AvalonMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "Avalon 1246"
self.expected_chips = 120
self.fan_count = 4
class Avalon1246(AvalonMinerMake):
raw_model = "Avalon 1246"
expected_chips = 120
expected_fans = 4

View File

@@ -14,14 +14,11 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AvalonMiner
from pyasic.miners.makes import AvalonMinerMake
class Avalon721(AvalonMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "Avalon 721"
self.expected_hashboards = 4
self.expected_chips = 18
self.fan_count = 1
class Avalon721(AvalonMinerMake):
raw_model = "Avalon 721"
expected_hashboards = 4
expected_chips = 18
expected_fans = 1

View File

@@ -14,14 +14,11 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AvalonMiner
from pyasic.miners.makes import AvalonMinerMake
class Avalon741(AvalonMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "Avalon 741"
self.expected_hashboards = 4
self.expected_chips = 22
self.fan_count = 1
class Avalon741(AvalonMinerMake):
raw_model = "Avalon 741"
expected_hashboards = 4
expected_chips = 22
expected_fans = 1

View File

@@ -14,14 +14,11 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AvalonMiner
from pyasic.miners.makes import AvalonMinerMake
class Avalon761(AvalonMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "Avalon 761"
self.expected_hashboards = 4
self.expected_chips = 18
self.fan_count = 1
class Avalon761(AvalonMinerMake):
raw_model = "Avalon 761"
expected_hashboards = 4
expected_chips = 18
expected_fans = 1

View File

@@ -14,14 +14,11 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AvalonMiner
from pyasic.miners.makes import AvalonMinerMake
class Avalon821(AvalonMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "Avalon 821"
self.expected_hashboards = 4
self.expected_chips = 26
self.fan_count = 1
class Avalon821(AvalonMinerMake):
raw_model = "Avalon 821"
expected_hashboards = 4
expected_chips = 26
expected_fans = 1

View File

@@ -14,14 +14,11 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AvalonMiner
from pyasic.miners.makes import AvalonMinerMake
class Avalon841(AvalonMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "Avalon 841"
self.expected_hashboards = 4
self.expected_chips = 26
self.fan_count = 1
class Avalon841(AvalonMinerMake):
raw_model = "Avalon 841"
expected_hashboards = 4
expected_chips = 26
expected_fans = 1

View File

@@ -14,14 +14,11 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AvalonMiner
from pyasic.miners.makes import AvalonMinerMake
class Avalon851(AvalonMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "Avalon 851"
self.expected_hashboards = 4
self.expected_chips = 26
self.fan_count = 1
class Avalon851(AvalonMinerMake):
raw_model = "Avalon 851"
expected_hashboards = 4
expected_chips = 26
expected_fans = 1

View File

@@ -14,14 +14,11 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import AvalonMiner
from pyasic.miners.makes import AvalonMinerMake
class Avalon921(AvalonMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "Avalon 921"
self.expected_hashboards = 4
self.expected_chips = 26
self.fan_count = 1
class Avalon921(AvalonMinerMake):
raw_model = "Avalon 921"
expected_hashboards = 4
expected_chips = 26
expected_fans = 1

View File

@@ -13,14 +13,11 @@
# See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import GoldshellMiner
from pyasic.miners.makes import GoldshellMake
class CK5(GoldshellMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "CK5"
self.expected_hashboards = 4
self.expected_chips = 46
self.fan_count = 4
class CK5(GoldshellMake):
raw_model = "CK5"
expected_hashboards = 4
expected_chips = 46
expected_fans = 4

View File

@@ -13,14 +13,11 @@
# See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import GoldshellMiner
from pyasic.miners.makes import GoldshellMake
class HS5(GoldshellMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "HS5"
self.expected_hashboards = 4
self.expected_chips = 46
self.fan_count = 4
class HS5(GoldshellMake):
raw_model = "HS5"
expected_hashboards = 4
expected_chips = 46
expected_fans = 4

View File

@@ -13,14 +13,11 @@
# See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import GoldshellMiner
from pyasic.miners.makes import GoldshellMake
class KD5(GoldshellMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "KD5"
self.expected_hashboards = 4
self.expected_chips = 46
self.fan_count = 4
class KD5(GoldshellMake):
raw_model = "KD5"
expected_hashboards = 4
expected_chips = 46
expected_fans = 4

View File

@@ -13,14 +13,11 @@
# See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import GoldshellMiner
from pyasic.miners.makes import GoldshellMake
class KDMax(GoldshellMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "KD Max"
self.expected_hashboards = 3
self.expected_chips = 84
self.fan_count = 4
class KDMax(GoldshellMake):
raw_model = "KD Max"
expected_hashboards = 3
expected_chips = 84
expected_fans = 4

View File

@@ -13,11 +13,8 @@
# See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import InnosiliconMiner
from pyasic.miners.makes import InnosiliconMake
class A10X(InnosiliconMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "A10X"
class A10X(InnosiliconMake):
raw_model = "A10X"

View File

@@ -14,13 +14,10 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import InnosiliconMiner
from pyasic.miners.makes import InnosiliconMake
class T3HPlus(InnosiliconMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "T3H+"
self.expected_chips = 114
self.fan_count = 4
class T3HPlus(InnosiliconMake):
raw_model = "T3H+"
expected_chips = 114
expected_fans = 4

View File

@@ -14,13 +14,10 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import WhatsMiner
from pyasic.miners.makes import WhatsMinerMake
class M20V10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M20 V10"
self.expected_chips = 70
self.fan_count = 2
class M20V10(WhatsMinerMake):
raw_model = "M20 V10"
expected_chips = 70
expected_fans = 2

View File

@@ -14,22 +14,16 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import WhatsMiner
from pyasic.miners.makes import WhatsMinerMake
class M20PV10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M20P V10"
self.expected_chips = 156
self.fan_count = 2
class M20PV10(WhatsMinerMake):
raw_model = "M20P V10"
expected_chips = 156
expected_fans = 2
class M20PV30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M20P V30"
self.expected_chips = 148
self.fan_count = 2
class M20PV30(WhatsMinerMake):
raw_model = "M20P V30"
expected_chips = 148
expected_fans = 2

View File

@@ -14,31 +14,22 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import WhatsMiner
from pyasic.miners.makes import WhatsMinerMake
class M20SV10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M20S V10"
self.expected_chips = 105
self.fan_count = 2
class M20SV10(WhatsMinerMake):
raw_model = "M20S V10"
expected_chips = 105
expected_fans = 2
class M20SV20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M20S V20"
self.expected_chips = 111
self.fan_count = 2
class M20SV20(WhatsMinerMake):
raw_model = "M20S V20"
expected_chips = 111
expected_fans = 2
class M20SV30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M20S V30"
self.expected_chips = 140
self.fan_count = 2
class M20SV30(WhatsMinerMake):
raw_model = "M20S V30"
expected_chips = 140
expected_fans = 2

View File

@@ -14,18 +14,9 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings
from pyasic.miners.makes import WhatsMiner
from pyasic.miners.makes import WhatsMinerMake
class M20SPlusV30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
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
class M20SPlusV30(WhatsMinerMake):
raw_model = "M20S+ V30"
expected_fans = 2

View File

@@ -14,13 +14,10 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import WhatsMiner
from pyasic.miners.makes import WhatsMinerMake
class M21V10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M21 V10"
self.expected_chips = 33
self.fan_count = 2
class M21V10(WhatsMinerMake):
raw_model = "M21 V10"
expected_chips = 33
expected_fans = 2

View File

@@ -14,31 +14,22 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import WhatsMiner
from pyasic.miners.makes import WhatsMinerMake
class M21SV20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M21S V20"
self.expected_chips = 66
self.fan_count = 2
class M21SV20(WhatsMinerMake):
raw_model = "M21S V20"
expected_chips = 66
expected_fans = 2
class M21SV60(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M21S V60"
self.expected_chips = 105
self.fan_count = 2
class M21SV60(WhatsMinerMake):
raw_model = "M21S V60"
expected_chips = 105
expected_fans = 2
class M21SV70(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M21S V70"
self.expected_chips = 111
self.fan_count = 2
class M21SV70(WhatsMinerMake):
raw_model = "M21S V70"
expected_chips = 111
expected_fans = 2

View File

@@ -14,18 +14,9 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings
from pyasic.miners.makes import WhatsMiner
from pyasic.miners.makes import WhatsMinerMake
class M21SPlusV20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
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
class M21SPlusV20(WhatsMinerMake):
raw_model = "M21S+ V20"
expected_fans = 2

View File

@@ -14,13 +14,10 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import WhatsMiner
from pyasic.miners.makes import WhatsMinerMake
class M29V10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M29 V10"
self.expected_chips = 50
self.fan_count = 2
class M29V10(WhatsMinerMake):
raw_model = "M29 V10"
expected_chips = 50
expected_fans = 2

View File

@@ -14,22 +14,16 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import WhatsMiner
from pyasic.miners.makes import WhatsMinerMake
class M30V10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30 V10"
self.expected_chips = 105
self.fan_count = 2
class M30V10(WhatsMinerMake):
raw_model = "M30 V10"
expected_chips = 105
expected_fans = 2
class M30V20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30 V20"
self.expected_chips = 111
self.fan_count = 2
class M30V20(WhatsMinerMake):
raw_model = "M30 V20"
expected_chips = 111
expected_fans = 2

View File

@@ -14,14 +14,11 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import WhatsMiner
from pyasic.miners.makes import WhatsMinerMake
class M30KV10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30K V10"
self.expected_hashboards = 4
self.expected_chips = 240
self.fan_count = 2
class M30KV10(WhatsMinerMake):
raw_model = "M30K V10"
expected_hashboards = 4
expected_chips = 240
expected_fans = 2

View File

@@ -14,14 +14,11 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import WhatsMiner
from pyasic.miners.makes import WhatsMinerMake
class M30LV10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30L V10"
self.board_num = 4
self.expected_chips = 144
self.fan_count = 2
class M30LV10(WhatsMinerMake):
raw_model = "M30L V10"
board_num = 4
expected_chips = 144
expected_fans = 2

View File

@@ -14,282 +14,173 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings
from pyasic.miners.makes import WhatsMiner
from pyasic.miners.makes import WhatsMinerMake
class M30SV10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S V10"
self.expected_chips = 148
self.fan_count = 2
class M30SV10(WhatsMinerMake):
raw_model = "M30S V10"
expected_chips = 148
expected_fans = 2
class M30SV20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S V20"
self.expected_chips = 156
self.fan_count = 2
class M30SV20(WhatsMinerMake):
raw_model = "M30S V20"
expected_chips = 156
expected_fans = 2
class M30SV30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S V30"
self.expected_chips = 164
self.fan_count = 2
class M30SV30(WhatsMinerMake):
raw_model = "M30S V30"
expected_chips = 164
expected_fans = 2
class M30SV40(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S V40"
self.expected_chips = 172
self.fan_count = 2
class M30SV40(WhatsMinerMake):
raw_model = "M30S V40"
expected_chips = 172
expected_fans = 2
class M30SV50(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S V50"
self.expected_chips = 156
self.fan_count = 2
class M30SV50(WhatsMinerMake):
raw_model = "M30S V50"
expected_chips = 156
expected_fans = 2
class M30SV60(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S V60"
self.expected_chips = 164
self.fan_count = 2
class M30SV60(WhatsMinerMake):
raw_model = "M30S V60"
expected_chips = 164
expected_fans = 2
class M30SV70(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
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 M30SV70(WhatsMinerMake):
raw_model = "M30S V70"
expected_fans = 2
class M30SV80(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S V80"
self.expected_chips = 129
self.fan_count = 2
class M30SV80(WhatsMinerMake):
raw_model = "M30S V80"
expected_chips = 129
expected_fans = 2
class M30SVE10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S VE10"
self.expected_chips = 105
self.fan_count = 2
class M30SVE10(WhatsMinerMake):
raw_model = "M30S VE10"
expected_chips = 105
expected_fans = 2
class M30SVE20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S VE20"
self.expected_chips = 111
self.fan_count = 2
class M30SVE20(WhatsMinerMake):
raw_model = "M30S VE20"
expected_chips = 111
expected_fans = 2
class M30SVE30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S VE30"
self.expected_chips = 117
self.fan_count = 2
class M30SVE30(WhatsMinerMake):
raw_model = "M30S VE30"
expected_chips = 117
expected_fans = 2
class M30SVE40(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S VE40"
self.expected_chips = 123
self.fan_count = 2
class M30SVE40(WhatsMinerMake):
raw_model = "M30S VE40"
expected_chips = 123
expected_fans = 2
class M30SVE50(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S VE50"
self.expected_chips = 129
self.fan_count = 2
class M30SVE50(WhatsMinerMake):
raw_model = "M30S VE50"
expected_chips = 129
expected_fans = 2
class M30SVE60(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
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 M30SVE60(WhatsMinerMake):
raw_model = "M30S VE60"
expected_fans = 2
class M30SVE70(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
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 M30SVE70(WhatsMinerMake):
raw_model = "M30S VE70"
expected_fans = 2
class M30SVF10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S VF10"
self.expected_chips = 70
self.fan_count = 2
class M30SVF10(WhatsMinerMake):
raw_model = "M30S VF10"
expected_chips = 70
expected_fans = 2
class M30SVF20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S VF20"
self.expected_chips = 74
self.fan_count = 2
class M30SVF20(WhatsMinerMake):
raw_model = "M30S VF20"
expected_chips = 74
expected_fans = 2
class M30SVF30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S VF30"
self.expected_chips = 78
self.fan_count = 2
class M30SVF30(WhatsMinerMake):
raw_model = "M30S VF30"
expected_chips = 78
expected_fans = 2
class M30SVG10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S VG10"
self.expected_chips = 66
self.fan_count = 2
class M30SVG10(WhatsMinerMake):
raw_model = "M30S VG10"
expected_chips = 66
expected_fans = 2
class M30SVG20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S VG20"
self.expected_chips = 70
self.fan_count = 2
class M30SVG20(WhatsMinerMake):
raw_model = "M30S VG20"
expected_chips = 70
expected_fans = 2
class M30SVG30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S VG30"
self.expected_chips = 74
self.fan_count = 2
class M30SVG30(WhatsMinerMake):
raw_model = "M30S VG30"
expected_chips = 74
expected_fans = 2
class M30SVG40(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S VG40"
self.expected_chips = 78
self.fan_count = 2
class M30SVG40(WhatsMinerMake):
raw_model = "M30S VG40"
expected_chips = 78
expected_fans = 2
class M30SVH10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S VH10"
self.expected_chips = 64
self.fan_count = 2
class M30SVH10(WhatsMinerMake):
raw_model = "M30S VH10"
expected_chips = 64
expected_fans = 2
class M30SVH20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S VH20"
self.expected_chips = 66
self.fan_count = 2
class M30SVH20(WhatsMinerMake):
raw_model = "M30S VH20"
expected_chips = 66
expected_fans = 2
class M30SVH30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
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 M30SVH30(WhatsMinerMake):
raw_model = "M30S VH30"
expected_fans = 2
class M30SVH40(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S VH40"
self.expected_chips = 64
self.fan_count = 2
class M30SVH40(WhatsMinerMake):
raw_model = "M30S VH40"
expected_chips = 64
expected_fans = 2
class M30SVH50(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S VH50"
self.expected_chips = 66
self.fan_count = 2
class M30SVH50(WhatsMinerMake):
raw_model = "M30S VH50"
expected_chips = 66
expected_fans = 2
class M30SVH60(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
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 M30SVH60(WhatsMinerMake):
raw_model = "M30S VH60"
expected_fans = 2
class M30SVI20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S VI20"
self.expected_chips = 70
self.fan_count = 2
class M30SVI20(WhatsMinerMake):
raw_model = "M30S VI20"
expected_chips = 70
expected_fans = 2

View File

@@ -14,300 +14,185 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings
from pyasic.miners.makes import WhatsMiner
from pyasic.miners.makes import WhatsMinerMake
class M30SPlusV10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ V10"
self.expected_chips = 215
self.fan_count = 2
class M30SPlusV10(WhatsMinerMake):
raw_model = "M30S+ V10"
expected_chips = 215
expected_fans = 2
class M30SPlusV20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ V20"
self.expected_chips = 255
self.fan_count = 2
class M30SPlusV20(WhatsMinerMake):
raw_model = "M30S+ V20"
expected_chips = 255
expected_fans = 2
class M30SPlusV30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
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 M30SPlusV30(WhatsMinerMake):
raw_model = "M30S+ V30"
expected_fans = 2
class M30SPlusV40(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ V40"
self.expected_chips = 235
self.fan_count = 2
class M30SPlusV40(WhatsMinerMake):
raw_model = "M30S+ V40"
expected_chips = 235
expected_fans = 2
class M30SPlusV50(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ V50"
self.expected_chips = 225
self.fan_count = 2
class M30SPlusV50(WhatsMinerMake):
raw_model = "M30S+ V50"
expected_chips = 225
expected_fans = 2
class M30SPlusV60(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ V60"
self.expected_chips = 245
self.fan_count = 2
class M30SPlusV60(WhatsMinerMake):
raw_model = "M30S+ V60"
expected_chips = 245
expected_fans = 2
class M30SPlusV70(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ V70"
self.expected_chips = 235
self.fan_count = 2
class M30SPlusV70(WhatsMinerMake):
raw_model = "M30S+ V70"
expected_chips = 235
expected_fans = 2
class M30SPlusV80(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ V80"
self.expected_chips = 245
self.fan_count = 2
class M30SPlusV80(WhatsMinerMake):
raw_model = "M30S+ V80"
expected_chips = 245
expected_fans = 2
class M30SPlusV90(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ V90"
self.expected_chips = 225
self.fan_count = 2
class M30SPlusV90(WhatsMinerMake):
raw_model = "M30S+ V90"
expected_chips = 225
expected_fans = 2
class M30SPlusV100(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ V100"
self.expected_chips = 215
self.fan_count = 2
class M30SPlusV100(WhatsMinerMake):
raw_model = "M30S+ V100"
expected_chips = 215
expected_fans = 2
class M30SPlusVE30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ VE30"
self.expected_chips = 148
self.fan_count = 2
class M30SPlusVE30(WhatsMinerMake):
raw_model = "M30S+ VE30"
expected_chips = 148
expected_fans = 2
class M30SPlusVE40(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ VE40"
self.expected_chips = 156
self.fan_count = 2
class M30SPlusVE40(WhatsMinerMake):
raw_model = "M30S+ VE40"
expected_chips = 156
expected_fans = 2
class M30SPlusVE50(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ VE50"
self.expected_chips = 164
self.fan_count = 2
class M30SPlusVE50(WhatsMinerMake):
raw_model = "M30S+ VE50"
expected_chips = 164
expected_fans = 2
class M30SPlusVE60(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ VE60"
self.expected_chips = 172
self.fan_count = 2
class M30SPlusVE60(WhatsMinerMake):
raw_model = "M30S+ VE60"
expected_chips = 172
expected_fans = 2
class M30SPlusVE70(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
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 M30SPlusVE70(WhatsMinerMake):
raw_model = "M30S+ VE70"
expected_fans = 2
class M30SPlusVE80(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
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 M30SPlusVE80(WhatsMinerMake):
raw_model = "M30S+ VE80"
expected_fans = 2
class M30SPlusVE90(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
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 M30SPlusVE90(WhatsMinerMake):
raw_model = "M30S+ VE90"
expected_fans = 2
class M30SPlusVE100(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
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 M30SPlusVE100(WhatsMinerMake):
raw_model = "M30S+ VE100"
expected_fans = 2
class M30SPlusVF20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ VF20"
self.expected_chips = 111
self.fan_count = 2
class M30SPlusVF20(WhatsMinerMake):
raw_model = "M30S+ VF20"
expected_chips = 111
expected_fans = 2
class M30SPlusVF30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ VF30"
self.expected_chips = 117
self.fan_count = 2
class M30SPlusVF30(WhatsMinerMake):
raw_model = "M30S+ VF30"
expected_chips = 117
expected_fans = 2
class M30SPlusVG20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ VG20"
self.expected_chips = 82
self.fan_count = 2
class M30SPlusVG20(WhatsMinerMake):
raw_model = "M30S+ VG20"
expected_chips = 82
expected_fans = 2
class M30SPlusVG30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ VG30"
self.expected_chips = 78
self.fan_count = 2
class M30SPlusVG30(WhatsMinerMake):
raw_model = "M30S+ VG30"
expected_chips = 78
expected_fans = 2
class M30SPlusVG40(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ VG40"
self.expected_chips = 105
self.fan_count = 2
class M30SPlusVG40(WhatsMinerMake):
raw_model = "M30S+ VG40"
expected_chips = 105
expected_fans = 2
class M30SPlusVG50(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ VG50"
self.expected_chips = 111
self.fan_count = 2
class M30SPlusVG50(WhatsMinerMake):
raw_model = "M30S+ VG50"
expected_chips = 111
expected_fans = 2
class M30SPlusVG60(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ VG60"
self.expected_chips = 86
self.fan_count = 2
class M30SPlusVG60(WhatsMinerMake):
raw_model = "M30S+ VG60"
expected_chips = 86
expected_fans = 2
class M30SPlusVH10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ VH10"
self.expected_chips = 64
self.fan_count = 2
class M30SPlusVH10(WhatsMinerMake):
raw_model = "M30S+ VH10"
expected_chips = 64
expected_fans = 2
class M30SPlusVH20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ VH20"
self.expected_chips = 66
self.fan_count = 2
class M30SPlusVH20(WhatsMinerMake):
raw_model = "M30S+ VH20"
expected_chips = 66
expected_fans = 2
class M30SPlusVH30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ VH30"
self.expected_chips = 70
self.fan_count = 2
class M30SPlusVH30(WhatsMinerMake):
raw_model = "M30S+ VH30"
expected_chips = 70
expected_fans = 2
class M30SPlusVH40(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ VH40"
self.expected_chips = 74
self.fan_count = 2
class M30SPlusVH40(WhatsMinerMake):
raw_model = "M30S+ VH40"
expected_chips = 74
expected_fans = 2
class M30SPlusVH50(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ VH50"
self.expected_chips = 64
self.fan_count = 2
class M30SPlusVH50(WhatsMinerMake):
raw_model = "M30S+ VH50"
expected_chips = 64
expected_fans = 2
class M30SPlusVH60(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S+ VH60"
self.expected_chips = 66
self.fan_count = 2
class M30SPlusVH60(WhatsMinerMake):
raw_model = "M30S+ VH60"
expected_chips = 66
expected_fans = 2

View File

@@ -14,206 +14,129 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings
from pyasic.miners.makes import WhatsMiner
from pyasic.miners.makes import WhatsMinerMake
class M30SPlusPlusV10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S++ V10"
self.expected_hashboards = 4
self.expected_chips = 255
self.fan_count = 2
class M30SPlusPlusV10(WhatsMinerMake):
raw_model = "M30S++ V10"
expected_hashboards = 4
expected_chips = 255
expected_fans = 2
class M30SPlusPlusV20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S++ V20"
self.expected_hashboards = 4
self.expected_chips = 255
self.fan_count = 2
class M30SPlusPlusV20(WhatsMinerMake):
raw_model = "M30S++ V20"
expected_hashboards = 4
expected_chips = 255
expected_fans = 2
class M30SPlusPlusVE30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S++ VE30"
self.expected_chips = 215
self.fan_count = 2
class M30SPlusPlusVE30(WhatsMinerMake):
raw_model = "M30S++ VE30"
expected_chips = 215
expected_fans = 2
class M30SPlusPlusVE40(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S++ VE40"
self.expected_chips = 225
self.fan_count = 2
class M30SPlusPlusVE40(WhatsMinerMake):
raw_model = "M30S++ VE40"
expected_chips = 225
expected_fans = 2
class M30SPlusPlusVE50(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S++ VE50"
self.expected_chips = 235
self.fan_count = 2
class M30SPlusPlusVE50(WhatsMinerMake):
raw_model = "M30S++ VE50"
expected_chips = 235
expected_fans = 2
class M30SPlusPlusVF40(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S++ VF40"
self.expected_chips = 156
self.fan_count = 2
class M30SPlusPlusVF40(WhatsMinerMake):
raw_model = "M30S++ VF40"
expected_chips = 156
expected_fans = 2
class M30SPlusPlusVG30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S++ VG30"
self.expected_chips = 111
self.fan_count = 2
class M30SPlusPlusVG30(WhatsMinerMake):
raw_model = "M30S++ VG30"
expected_chips = 111
expected_fans = 2
class M30SPlusPlusVG40(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S++ VG40"
self.expected_chips = 117
self.fan_count = 2
class M30SPlusPlusVG40(WhatsMinerMake):
raw_model = "M30S++ VG40"
expected_chips = 117
expected_fans = 2
class M30SPlusPlusVG50(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
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 M30SPlusPlusVG50(WhatsMinerMake):
raw_model = "M30S++ VG50"
expected_fans = 2
class M30SPlusPlusVH10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S++ VH10"
self.expected_chips = 82
self.fan_count = 2
class M30SPlusPlusVH10(WhatsMinerMake):
raw_model = "M30S++ VH10"
expected_chips = 82
expected_fans = 2
class M30SPlusPlusVH20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S++ VH20"
self.expected_chips = 86
self.fan_count = 2
class M30SPlusPlusVH20(WhatsMinerMake):
raw_model = "M30S++ VH20"
expected_chips = 86
expected_fans = 2
class M30SPlusPlusVH30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S++ VH30"
self.expected_chips = 111
self.fan_count = 2
class M30SPlusPlusVH30(WhatsMinerMake):
raw_model = "M30S++ VH30"
expected_chips = 111
expected_fans = 2
class M30SPlusPlusVH40(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S++ VH40"
self.expected_chips = 70
self.fan_count = 2
class M30SPlusPlusVH40(WhatsMinerMake):
raw_model = "M30S++ VH40"
expected_chips = 70
expected_fans = 2
class M30SPlusPlusVH50(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S++ VH50"
self.expected_chips = 74
self.fan_count = 2
class M30SPlusPlusVH50(WhatsMinerMake):
raw_model = "M30S++ VH50"
expected_chips = 74
expected_fans = 2
class M30SPlusPlusVH60(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S++ VH60"
self.expected_chips = 78
self.fan_count = 2
class M30SPlusPlusVH60(WhatsMinerMake):
raw_model = "M30S++ VH60"
expected_chips = 78
expected_fans = 2
class M30SPlusPlusVH70(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S++ VH70"
self.expected_chips = 70
self.fan_count = 2
class M30SPlusPlusVH70(WhatsMinerMake):
raw_model = "M30S++ VH70"
expected_chips = 70
expected_fans = 2
class M30SPlusPlusVH80(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S++ VH80"
self.expected_chips = 74
self.fan_count = 2
class M30SPlusPlusVH80(WhatsMinerMake):
raw_model = "M30S++ VH80"
expected_chips = 74
expected_fans = 2
class M30SPlusPlusVH90(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S++ VH90"
self.expected_chips = 78
self.fan_count = 2
class M30SPlusPlusVH90(WhatsMinerMake):
raw_model = "M30S++ VH90"
expected_chips = 78
expected_fans = 2
class M30SPlusPlusVH100(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M30S++ VH100"
self.expected_chips = 82
self.fan_count = 2
class M30SPlusPlusVH100(WhatsMinerMake):
raw_model = "M30S++ VH100"
expected_chips = 82
expected_fans = 2
class M30SPlusPlusVJ20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
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 M30SPlusPlusVJ20(WhatsMinerMake):
raw_model = "M30S++ VJ20"
expected_fans = 2
class M30SPlusPlusVJ30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
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
class M30SPlusPlusVJ30(WhatsMinerMake):
raw_model = "M30S++ VJ30"
expected_fans = 2

View File

@@ -14,22 +14,16 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import WhatsMiner
from pyasic.miners.makes import WhatsMinerMake
class M31V10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31 V10"
self.expected_chips = 70
self.fan_count = 2
class M31V10(WhatsMinerMake):
raw_model = "M31 V10"
expected_chips = 70
expected_fans = 2
class M31V20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31 V20"
self.expected_chips = 74
self.fan_count = 2
class M31V20(WhatsMinerMake):
raw_model = "M31 V20"
expected_chips = 74
expected_fans = 2

View File

@@ -14,23 +14,17 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import WhatsMiner
from pyasic.miners.makes import WhatsMinerMake
class M31HV10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31H V10"
self.expected_chips = 114
self.fan_count = 0
class M31HV10(WhatsMinerMake):
raw_model = "M31H V10"
expected_chips = 114
expected_fans = 0
class M31HV40(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31H V40"
self.expected_hashboards = 4
self.expected_chips = 136
self.fan_count = 0
class M31HV40(WhatsMinerMake):
raw_model = "M31H V40"
expected_hashboards = 4
expected_chips = 136
expected_fans = 0

View File

@@ -14,13 +14,10 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import WhatsMiner
from pyasic.miners.makes import WhatsMinerMake
class M31LV10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31L V10"
self.expected_chips = 114
self.fan_count = 2
class M31LV10(WhatsMinerMake):
raw_model = "M31L V10"
expected_chips = 114
expected_fans = 2

View File

@@ -14,120 +14,74 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings
from pyasic.miners.makes import WhatsMiner
from pyasic.miners.makes import WhatsMinerMake
class M31SV10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S V10"
self.expected_chips = 105
self.fan_count = 2
class M31SV10(WhatsMinerMake):
raw_model = "M31S V10"
expected_chips = 105
expected_fans = 2
class M31SV20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S V20"
self.expected_chips = 111
self.fan_count = 2
class M31SV20(WhatsMinerMake):
raw_model = "M31S V20"
expected_chips = 111
expected_fans = 2
class M31SV30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S V30"
self.expected_chips = 117
self.fan_count = 2
class M31SV30(WhatsMinerMake):
raw_model = "M31S V30"
expected_chips = 117
expected_fans = 2
class M31SV40(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S V40"
self.expected_chips = 123
self.fan_count = 2
class M31SV40(WhatsMinerMake):
raw_model = "M31S V40"
expected_chips = 123
expected_fans = 2
class M31SV50(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S V50"
self.expected_chips = 78
self.fan_count = 2
class M31SV50(WhatsMinerMake):
raw_model = "M31S V50"
expected_chips = 78
expected_fans = 2
class M31SV60(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S V60"
self.expected_chips = 105
self.fan_count = 2
class M31SV60(WhatsMinerMake):
raw_model = "M31S V60"
expected_chips = 105
expected_fans = 2
class M31SV70(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S V70"
self.expected_chips = 111
self.fan_count = 2
class M31SV70(WhatsMinerMake):
raw_model = "M31S V70"
expected_chips = 111
expected_fans = 2
class M31SV80(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
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 M31SV80(WhatsMinerMake):
raw_model = "M31S V80"
expected_fans = 2
class M31SV90(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S V90"
self.expected_chips = 117
self.fan_count = 2
class M31SV90(WhatsMinerMake):
raw_model = "M31S V90"
expected_chips = 117
expected_fans = 2
class M31SVE10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S VE10"
self.expected_chips = 70
self.fan_count = 2
class M31SVE10(WhatsMinerMake):
raw_model = "M31S VE10"
expected_chips = 70
expected_fans = 2
class M31SVE20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S VE20"
self.expected_chips = 74
self.fan_count = 2
class M31SVE20(WhatsMinerMake):
raw_model = "M31S VE20"
expected_chips = 74
expected_fans = 2
class M31SVE30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
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
class M31SVE30(WhatsMinerMake):
raw_model = "M31S VE30"
expected_fans = 2

View File

@@ -14,31 +14,22 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import WhatsMiner
from pyasic.miners.makes import WhatsMinerMake
class M31SEV10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31SE V10"
self.expected_chips = 82
self.fan_count = 2
class M31SEV10(WhatsMinerMake):
raw_model = "M31SE V10"
expected_chips = 82
expected_fans = 2
class M31SEV20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31SE V20"
self.expected_chips = 78
self.fan_count = 2
class M31SEV20(WhatsMinerMake):
raw_model = "M31SE V20"
expected_chips = 78
expected_fans = 2
class M31SEV30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31SE V30"
self.expected_chips = 78
self.fan_count = 2
class M31SEV30(WhatsMinerMake):
raw_model = "M31SE V30"
expected_chips = 78
expected_fans = 2

View File

@@ -14,195 +14,121 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings
from pyasic.miners.makes import WhatsMiner
from pyasic.miners.makes import WhatsMinerMake
class M31SPlusV10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S+ V10"
self.expected_chips = 105
self.fan_count = 2
class M31SPlusV10(WhatsMinerMake):
raw_model = "M31S+ V10"
expected_chips = 105
expected_fans = 2
class M31SPlusV20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S+ V20"
self.expected_chips = 111
self.fan_count = 2
class M31SPlusV20(WhatsMinerMake):
raw_model = "M31S+ V20"
expected_chips = 111
expected_fans = 2
class M31SPlusV30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S+ V30"
self.expected_chips = 117
self.fan_count = 2
class M31SPlusV30(WhatsMinerMake):
raw_model = "M31S+ V30"
expected_chips = 117
expected_fans = 2
class M31SPlusV40(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S+ V40"
self.expected_chips = 123
self.fan_count = 2
class M31SPlusV40(WhatsMinerMake):
raw_model = "M31S+ V40"
expected_chips = 123
expected_fans = 2
class M31SPlusV50(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S+ V50"
self.expected_chips = 148
self.fan_count = 2
class M31SPlusV50(WhatsMinerMake):
raw_model = "M31S+ V50"
expected_chips = 148
expected_fans = 2
class M31SPlusV60(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S+ V60"
self.expected_chips = 156
self.fan_count = 2
class M31SPlusV60(WhatsMinerMake):
raw_model = "M31S+ V60"
expected_chips = 156
expected_fans = 2
class M31SPlusV80(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S+ V80"
self.expected_chips = 129
self.fan_count = 2
class M31SPlusV80(WhatsMinerMake):
raw_model = "M31S+ V80"
expected_chips = 129
expected_fans = 2
class M31SPlusV90(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S+ V90"
self.expected_chips = 117
self.fan_count = 2
class M31SPlusV90(WhatsMinerMake):
raw_model = "M31S+ V90"
expected_chips = 117
expected_fans = 2
class M31SPlusV100(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S+ V100"
self.expected_chips = 111
self.fan_count = 2
class M31SPlusV100(WhatsMinerMake):
raw_model = "M31S+ V100"
expected_chips = 111
expected_fans = 2
class M31SPlusVE10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S+ VE10"
self.expected_chips = 82
self.fan_count = 2
class M31SPlusVE10(WhatsMinerMake):
raw_model = "M31S+ VE10"
expected_chips = 82
expected_fans = 2
class M31SPlusVE20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S+ VE20"
self.expected_chips = 78
self.fan_count = 2
class M31SPlusVE20(WhatsMinerMake):
raw_model = "M31S+ VE20"
expected_chips = 78
expected_fans = 2
class M31SPlusVE30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S+ VE30"
self.expected_chips = 105
self.fan_count = 2
class M31SPlusVE30(WhatsMinerMake):
raw_model = "M31S+ VE30"
expected_chips = 105
expected_fans = 2
class M31SPlusVE40(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S+ VE40"
self.expected_chips = 111
self.fan_count = 2
class M31SPlusVE40(WhatsMinerMake):
raw_model = "M31S+ VE40"
expected_chips = 111
expected_fans = 2
class M31SPlusVE50(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S+ VE50"
self.expected_chips = 117
self.fan_count = 2
class M31SPlusVE50(WhatsMinerMake):
raw_model = "M31S+ VE50"
expected_chips = 117
expected_fans = 2
class M31SPlusVE60(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
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 M31SPlusVE60(WhatsMinerMake):
raw_model = "M31S+ VE60"
expected_fans = 2
class M31SPlusVE80(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
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 M31SPlusVE80(WhatsMinerMake):
raw_model = "M31S+ VE80"
expected_fans = 2
class M31SPlusVF20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S+ VF20"
self.expected_chips = 66
self.fan_count = 2
class M31SPlusVF20(WhatsMinerMake):
raw_model = "M31S+ VF20"
expected_chips = 66
expected_fans = 2
class M31SPlusVF30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
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 M31SPlusVF30(WhatsMinerMake):
raw_model = "M31S+ VF30"
expected_fans = 2
class M31SPlusVG20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S+ VG20"
self.expected_chips = 66
self.fan_count = 2
class M31SPlusVG20(WhatsMinerMake):
raw_model = "M31S+ VG20"
expected_chips = 66
expected_fans = 2
class M31SPlusVG30(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M31S+ VG30"
self.expected_chips = 70
self.fan_count = 2
class M31SPlusVG30(WhatsMinerMake):
raw_model = "M31S+ VG30"
expected_chips = 70
expected_fans = 2

View File

@@ -14,22 +14,16 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.makes import WhatsMiner
from pyasic.miners.makes import WhatsMinerMake
class M32V10(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M32 V10"
self.expected_chips = 78
self.fan_count = 2
class M32V10(WhatsMinerMake):
raw_model = "M32 V10"
expected_chips = 78
expected_fans = 2
class M32V20(WhatsMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver)
self.ip = ip
self.raw_model = "M32 V20"
self.expected_chips = 74
self.fan_count = 2
class M32V20(WhatsMinerMake):
raw_model = "M32 V20"
expected_chips = 74
expected_fans = 2

Some files were not shown because too many files have changed in this diff Show More