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} return {"url": self.url, "user": self.user, "pass": self.password}
def as_wm(self, idx: int, user_suffix: str = None): def as_wm(self, idx: int = 1, user_suffix: str = None):
if user_suffix is not None: if user_suffix is not None:
return { return {
f"pool_{idx}": self.url, f"pool_{idx}": self.url,
@@ -49,7 +49,7 @@ class Pool(MinerConfigValue):
f"passwd_{idx}": self.password, f"passwd_{idx}": self.password,
} }
def as_am_old(self, idx: int, user_suffix: str = None): def as_am_old(self, idx: int = 1, user_suffix: str = None):
if user_suffix is not None: if user_suffix is not None:
return { return {
f"_ant_pool{idx}url": self.url, f"_ant_pool{idx}url": self.url,
@@ -76,7 +76,7 @@ class Pool(MinerConfigValue):
return ",".join([self.url, f"{self.user}{user_suffix}", self.password]) return ",".join([self.url, f"{self.user}{user_suffix}", self.password])
return ",".join([self.url, self.user, self.password]) return ",".join([self.url, self.user, self.password])
def as_inno(self, idx: int, user_suffix: str = None): def as_inno(self, idx: int = 1, user_suffix: str = None):
if user_suffix is not None: if user_suffix is not None:
return { return {
f"Pool{idx}": self.url, f"Pool{idx}": self.url,

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -21,10 +21,53 @@ import asyncssh
from pyasic.data import HashBoard from pyasic.data import HashBoard
from pyasic.errors import APIError from pyasic.errors import APIError
from pyasic.miners.backends import Hiveon from pyasic.miners.backends import Hiveon
from pyasic.miners.base import DataFunction, DataLocations, DataOptions, RPCAPICommand
from pyasic.miners.types import T9 from pyasic.miners.types import T9
HIVEON_T9_DATA_LOC = DataLocations(
**{
str(DataOptions.API_VERSION): DataFunction(
"_get_api_ver",
[RPCAPICommand("api_version", "version")],
),
str(DataOptions.FW_VERSION): DataFunction(
"_get_fw_ver",
[RPCAPICommand("api_version", "version")],
),
str(DataOptions.HASHRATE): DataFunction(
"_get_hashrate",
[RPCAPICommand("api_summary", "summary")],
),
str(DataOptions.EXPECTED_HASHRATE): DataFunction(
"_get_expected_hashrate",
[RPCAPICommand("api_stats", "stats")],
),
str(DataOptions.HASHBOARDS): DataFunction(
"_get_hashboards",
[RPCAPICommand("api_stats", "stats")],
),
str(DataOptions.ENVIRONMENT_TEMP): DataFunction(
"_get_env_temp",
[RPCAPICommand("api_stats", "stats")],
),
str(DataOptions.WATTAGE): DataFunction(
"_get_wattage",
[RPCAPICommand("api_stats", "stats")],
),
str(DataOptions.FANS): DataFunction(
"_get_fans",
[RPCAPICommand("api_stats", "stats")],
),
str(DataOptions.UPTIME): DataFunction(
"_get_uptime",
[RPCAPICommand("api_stats", "stats")],
),
}
)
class HiveonT9(Hiveon, T9): class HiveonT9(Hiveon, T9):
data_locations = HIVEON_T9_DATA_LOC
################################################## ##################################################
### DATA GATHERING FUNCTIONS (get_{some_data}) ### ### DATA GATHERING FUNCTIONS (get_{some_data}) ###

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -82,16 +82,13 @@ ANTMINER_MODERN_DATA_LOC = DataLocations(
class AntminerModern(BMMiner): class AntminerModern(BMMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None: """Handler for AntMiners with the modern web interface, such as S19"""
super().__init__(ip, api_ver)
# interfaces
self.web = AntminerModernWebAPI(ip)
# static data _web_cls = AntminerModernWebAPI
# data gathering locations
self.data_locations = ANTMINER_MODERN_DATA_LOC data_locations = ANTMINER_MODERN_DATA_LOC
# autotuning/shutdown support
self.supports_shutdown = True supports_shutdown = True
async def get_config(self) -> MinerConfig: async def get_config(self) -> MinerConfig:
data = await self.web.get_miner_conf() data = await self.web.get_miner_conf()
@@ -233,7 +230,9 @@ class AntminerModern(BMMiner):
pass pass
return hashboards return hashboards
async def _get_fault_light(self, web_get_blink_status: dict = None) -> bool: async def _get_fault_light(
self, web_get_blink_status: dict = None
) -> Optional[bool]:
if self.light: if self.light:
return self.light return self.light
@@ -364,10 +363,6 @@ ANTMINER_OLD_DATA_LOC = DataLocations(
"_get_hashrate", "_get_hashrate",
[RPCAPICommand("api_summary", "summary")], [RPCAPICommand("api_summary", "summary")],
), ),
str(DataOptions.EXPECTED_HASHRATE): DataFunction(
"_get_expected_hashrate",
[RPCAPICommand("api_stats", "stats")],
),
str(DataOptions.HASHBOARDS): DataFunction( str(DataOptions.HASHBOARDS): DataFunction(
"_get_hashboards", "_get_hashboards",
[RPCAPICommand("api_stats", "stats")], [RPCAPICommand("api_stats", "stats")],
@@ -393,14 +388,11 @@ ANTMINER_OLD_DATA_LOC = DataLocations(
class AntminerOld(CGMiner): class AntminerOld(CGMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None: """Handler for AntMiners with the old web interface, such as S17"""
super().__init__(ip, api_ver)
# interfaces
self.web = AntminerOldWebAPI(ip)
# static data _web_cls = AntminerOldWebAPI
# data gathering locations
self.data_locations = ANTMINER_OLD_DATA_LOC data_locations = ANTMINER_OLD_DATA_LOC
async def get_config(self) -> MinerConfig: async def get_config(self) -> MinerConfig:
data = await self.web.get_miner_conf() data = await self.web.get_miner_conf()
@@ -449,7 +441,9 @@ class AntminerOld(CGMiner):
return True return True
return False return False
async def _get_fault_light(self, web_get_blink_status: dict = None) -> bool: async def _get_fault_light(
self, web_get_blink_status: dict = None
) -> Optional[bool]:
if self.light: if self.light:
return self.light return self.light

View File

@@ -17,11 +17,9 @@
import re import re
from typing import List, Optional from typing import List, Optional
from pyasic.config import MinerConfig
from pyasic.data import Fan, HashBoard from pyasic.data import Fan, HashBoard
from pyasic.data.error_codes import MinerErrorData
from pyasic.errors import APIError from pyasic.errors import APIError
from pyasic.miners.backends import CGMiner from pyasic.miners.backends.cgminer import CGMiner
from pyasic.miners.base import DataFunction, DataLocations, DataOptions, RPCAPICommand from pyasic.miners.base import DataFunction, DataLocations, DataOptions, RPCAPICommand
AVALON_DATA_LOC = DataLocations( AVALON_DATA_LOC = DataLocations(
@@ -70,12 +68,10 @@ AVALON_DATA_LOC = DataLocations(
) )
class CGMinerAvalon(CGMiner): class AvalonMiner(CGMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None: """Handler for Avalon Miners"""
super().__init__(ip, api_ver)
# data gathering locations data_locations = AVALON_DATA_LOC
self.data_locations = AVALON_DATA_LOC
async def fault_light_on(self) -> bool: async def fault_light_on(self) -> bool:
try: try:
@@ -108,26 +104,6 @@ class CGMinerAvalon(CGMiner):
return False return False
return False return False
async def stop_mining(self) -> bool:
return False
async def resume_mining(self) -> bool:
return False
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
pass
# self.config = config
# return None
# logging.debug(f"{self}: Sending config.") # noqa - This doesnt work...
# conf = config.as_avalon(user_suffix=user_suffix)
# try:
# data = await self.api.ascset( # noqa
# 0, "setpool", f"root,root,{conf}"
# ) # this should work but doesn't
# except APIError:
# pass
# return data
@staticmethod @staticmethod
def parse_stats(stats): def parse_stats(stats):
_stats_items = re.findall(".+?\\[*?]", stats) _stats_items = re.findall(".+?\\[*?]", stats)
@@ -193,14 +169,6 @@ class CGMinerAvalon(CGMiner):
except (KeyError, ValueError): except (KeyError, ValueError):
pass pass
async def _get_hostname(self) -> Optional[str]:
return None
# if not mac:
# mac = await self.get_mac()
#
# if mac:
# return f"Avalon{mac.replace(':', '')[-6:]}"
async def _get_hashrate(self, api_devs: dict = None) -> Optional[float]: async def _get_hashrate(self, api_devs: dict = None) -> Optional[float]:
if api_devs is None: if api_devs is None:
try: try:
@@ -292,9 +260,6 @@ class CGMinerAvalon(CGMiner):
except (IndexError, KeyError, ValueError, TypeError): except (IndexError, KeyError, ValueError, TypeError):
pass pass
async def _get_wattage(self) -> Optional[int]:
return None
async def _get_wattage_limit(self, api_stats: dict = None) -> Optional[int]: async def _get_wattage_limit(self, api_stats: dict = None) -> Optional[int]:
if api_stats is None: if api_stats is None:
try: try:
@@ -332,10 +297,7 @@ class CGMinerAvalon(CGMiner):
pass pass
return fans_data return fans_data
async def _get_errors(self) -> List[MinerErrorData]: async def _get_fault_light(self, api_stats: dict = None) -> Optional[bool]:
return []
async def _get_fault_light(self, api_stats: dict = None) -> bool: # noqa
if self.light: if self.light:
return self.light return self.light
if api_stats is None: if api_stats is None:
@@ -363,9 +325,3 @@ class CGMinerAvalon(CGMiner):
except LookupError: except LookupError:
pass pass
return False return False
async def _is_mining(self, *args, **kwargs) -> Optional[bool]:
return None
async def _get_uptime(self) -> Optional[int]:
return None

View File

@@ -18,7 +18,6 @@ from typing import List, Optional
from pyasic.config import MinerConfig from pyasic.config import MinerConfig
from pyasic.data import Fan, HashBoard from pyasic.data import Fan, HashBoard
from pyasic.data.error_codes import MinerErrorData
from pyasic.errors import APIError from pyasic.errors import APIError
from pyasic.miners.base import ( from pyasic.miners.base import (
BaseMiner, BaseMiner,
@@ -62,18 +61,9 @@ BFGMINER_DATA_LOC = DataLocations(
class BFGMiner(BaseMiner): class BFGMiner(BaseMiner):
"""Base handler for BFGMiner based miners.""" """Base handler for BFGMiner based miners."""
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None: _api_cls = BFGMinerRPCAPI
super().__init__(ip)
# interfaces
self.api = BFGMinerRPCAPI(ip, api_ver)
# static data data_locations = BFGMINER_DATA_LOC
self.api_type = "BFGMiner"
# data gathering locations
self.data_locations = BFGMINER_DATA_LOC
# data storage
self.api_ver = api_ver
async def get_config(self) -> MinerConfig: async def get_config(self) -> MinerConfig:
# get pool data # get pool data
@@ -85,34 +75,10 @@ class BFGMiner(BaseMiner):
self.config = MinerConfig.from_api(pools) self.config = MinerConfig.from_api(pools)
return self.config return self.config
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
return None
async def fault_light_off(self) -> bool:
return False
async def fault_light_on(self) -> bool:
return False
async def restart_backend(self) -> bool:
return False
async def stop_mining(self) -> bool:
return False
async def resume_mining(self) -> bool:
return False
async def set_power_limit(self, wattage: int) -> bool:
return False
################################################## ##################################################
### DATA GATHERING FUNCTIONS (get_{some_data}) ### ### DATA GATHERING FUNCTIONS (get_{some_data}) ###
################################################## ##################################################
async def _get_mac(self) -> Optional[str]:
return None
async def _get_api_ver(self, api_version: dict = None) -> Optional[str]: async def _get_api_ver(self, api_version: dict = None) -> Optional[str]:
if api_version is None: if api_version is None:
try: try:
@@ -143,15 +109,6 @@ class BFGMiner(BaseMiner):
return self.fw_ver return self.fw_ver
async def reboot(self) -> bool:
return False
async def _get_fan_psu(self):
return None
async def _get_hostname(self) -> Optional[str]:
return None
async def _get_hashrate(self, api_summary: dict = None) -> Optional[float]: async def _get_hashrate(self, api_summary: dict = None) -> Optional[float]:
# get hr from API # get hr from API
if api_summary is None: if api_summary is None:
@@ -220,15 +177,6 @@ class BFGMiner(BaseMiner):
return hashboards return hashboards
async def _get_env_temp(self) -> Optional[float]:
return None
async def _get_wattage(self) -> Optional[int]:
return None
async def _get_wattage_limit(self) -> Optional[int]:
return None
async def _get_fans(self, api_stats: dict = None) -> List[Fan]: async def _get_fans(self, api_stats: dict = None) -> List[Fan]:
if api_stats is None: if api_stats is None:
try: try:
@@ -259,12 +207,6 @@ class BFGMiner(BaseMiner):
return fans return fans
async def _get_errors(self) -> List[MinerErrorData]:
return []
async def _get_fault_light(self) -> bool:
return False
async def _get_expected_hashrate(self, api_stats: dict = None) -> Optional[float]: async def _get_expected_hashrate(self, api_stats: dict = None) -> Optional[float]:
# X19 method, not sure compatibility # X19 method, not sure compatibility
if api_stats is None: if api_stats is None:
@@ -288,9 +230,3 @@ class BFGMiner(BaseMiner):
return round(expected_rate, 2) return round(expected_rate, 2)
except LookupError: except LookupError:
pass pass
async def _is_mining(self, *args, **kwargs) -> Optional[bool]:
return None
async def _get_uptime(self, *args, **kwargs) -> Optional[int]:
return None

View File

@@ -19,7 +19,6 @@ from typing import List, Optional
from pyasic.config import MinerConfig from pyasic.config import MinerConfig
from pyasic.data import Fan, HashBoard from pyasic.data import Fan, HashBoard
from pyasic.data.error_codes import MinerErrorData
from pyasic.errors import APIError from pyasic.errors import APIError
from pyasic.miners.base import ( from pyasic.miners.base import (
BaseMiner, BaseMiner,
@@ -67,46 +66,9 @@ BMMINER_DATA_LOC = DataLocations(
class BMMiner(BaseMiner): class BMMiner(BaseMiner):
"""Base handler for BMMiner based miners.""" """Base handler for BMMiner based miners."""
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None: _api_cls = BMMinerRPCAPI
super().__init__(ip)
# interfaces
self.api = BMMinerRPCAPI(ip, api_ver)
# static data data_locations = BMMINER_DATA_LOC
self.api_type = "BMMiner"
# data gathering locations
self.data_locations = BMMINER_DATA_LOC
# data storage
self.api_ver = api_ver
async def send_ssh_command(self, cmd: str) -> Optional[str]:
result = None
try:
conn = await self._get_ssh_connection()
except ConnectionError:
return None
# open an ssh connection
async with conn:
# 3 retries
for i in range(3):
try:
# run the command and get the result
result = await conn.run(cmd)
result = result.stdout
except Exception as e:
# if the command fails, log it
logging.warning(f"{self} command {cmd} error: {e}")
# on the 3rd retry, return None
if i == 3:
return
continue
# return the result, either command output or None
return result
async def get_config(self) -> MinerConfig: async def get_config(self) -> MinerConfig:
# get pool data # get pool data
@@ -126,34 +88,10 @@ class BMMiner(BaseMiner):
return False return False
return True return True
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
return None
async def fault_light_off(self) -> bool:
return False
async def fault_light_on(self) -> bool:
return False
async def restart_backend(self) -> bool:
return False
async def stop_mining(self) -> bool:
return False
async def resume_mining(self) -> bool:
return False
async def set_power_limit(self, wattage: int) -> bool:
return False
################################################## ##################################################
### DATA GATHERING FUNCTIONS (get_{some_data}) ### ### DATA GATHERING FUNCTIONS (get_{some_data}) ###
################################################## ##################################################
async def _get_mac(self) -> Optional[str]:
return None
async def _get_api_ver(self, api_version: dict = None) -> Optional[str]: async def _get_api_ver(self, api_version: dict = None) -> Optional[str]:
if api_version is None: if api_version is None:
try: try:
@@ -184,9 +122,6 @@ class BMMiner(BaseMiner):
return self.fw_ver return self.fw_ver
async def _get_fan_psu(self):
return None
async def _get_hostname(self) -> Optional[str]: async def _get_hostname(self) -> Optional[str]:
hn = await self.send_ssh_command("cat /proc/sys/kernel/hostname") hn = await self.send_ssh_command("cat /proc/sys/kernel/hostname")
return hn return hn
@@ -272,15 +207,6 @@ class BMMiner(BaseMiner):
return hashboards return hashboards
async def _get_env_temp(self) -> Optional[float]:
return None
async def _get_wattage(self) -> Optional[int]:
return None
async def _get_wattage_limit(self) -> Optional[int]:
return None
async def _get_fans(self, api_stats: dict = None) -> List[Fan]: async def _get_fans(self, api_stats: dict = None) -> List[Fan]:
if api_stats is None: if api_stats is None:
try: try:
@@ -310,12 +236,6 @@ class BMMiner(BaseMiner):
return fans return fans
async def _get_errors(self) -> List[MinerErrorData]:
return []
async def _get_fault_light(self) -> bool:
return False
async def _get_expected_hashrate(self, api_stats: dict = None) -> Optional[float]: async def _get_expected_hashrate(self, api_stats: dict = None) -> Optional[float]:
# X19 method, not sure compatibility # X19 method, not sure compatibility
if api_stats is None: if api_stats is None:
@@ -340,9 +260,6 @@ class BMMiner(BaseMiner):
except LookupError: except LookupError:
pass pass
async def _is_mining(self, *args, **kwargs) -> Optional[bool]:
return None
async def _get_uptime(self, api_stats: dict = None) -> Optional[int]: async def _get_uptime(self, api_stats: dict = None) -> Optional[int]:
if api_stats is None: if api_stats is None:
try: try:

View File

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

View File

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

View File

@@ -14,12 +14,9 @@
# limitations under the License. - # limitations under the License. -
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
import logging from typing import Optional
from typing import List, Optional
from pyasic.config import MinerConfig from pyasic.config import MinerConfig
from pyasic.data import Fan, HashBoard
from pyasic.data.error_codes import MinerErrorData
from pyasic.errors import APIError from pyasic.errors import APIError
from pyasic.miners.base import ( from pyasic.miners.base import (
BaseMiner, BaseMiner,
@@ -65,91 +62,18 @@ CGMINER_DATA_LOC = DataLocations(
class CGMiner(BaseMiner): class CGMiner(BaseMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None: """Base handler for CGMiner based miners"""
super().__init__(ip)
# interfaces
self.api = CGMinerRPCAPI(ip, api_ver)
# static data _api_cls = CGMinerRPCAPI
self.api_type = "CGMiner"
# data gathering locations
self.data_locations = CGMINER_DATA_LOC
# data storage data_locations = CGMINER_DATA_LOC
self.api_ver = api_ver
async def send_ssh_command(self, cmd: str) -> Optional[str]:
result = None
try:
conn = await self._get_ssh_connection()
except ConnectionError:
return None
# open an ssh connection
async with conn:
# 3 retries
for i in range(3):
try:
# run the command and get the result
result = await conn.run(cmd)
result = result.stdout
except Exception as e:
# if the command fails, log it
logging.warning(f"{self} command {cmd} error: {e}")
# on the 3rd retry, return None
if i == 3:
return
continue
# return the result, either command output or None
return result
async def restart_backend(self) -> bool:
return await self.restart_cgminer()
async def restart_cgminer(self) -> bool:
commands = ["cgminer-api restart", "/usr/bin/cgminer-monitor >/dev/null 2>&1"]
commands = ";".join(commands)
ret = await self.send_ssh_command(commands)
if ret is None:
return False
return True
async def reboot(self) -> bool: async def reboot(self) -> bool:
logging.debug(f"{self}: Sending reboot command.")
ret = await self.send_ssh_command("reboot") ret = await self.send_ssh_command("reboot")
if ret is None: if ret is None:
return False return False
return True return True
async def resume_mining(self) -> bool:
commands = [
"mkdir -p /etc/tmp/",
'echo "*/3 * * * * /usr/bin/cgminer-monitor" > /etc/tmp/root',
"crontab -u root /etc/tmp/root",
"/usr/bin/cgminer-monitor >/dev/null 2>&1",
]
commands = ";".join(commands)
ret = await self.send_ssh_command(commands)
if ret is None:
return False
return True
async def stop_mining(self) -> bool:
commands = [
"mkdir -p /etc/tmp/",
'echo "" > /etc/tmp/root',
"crontab -u root /etc/tmp/root",
"killall cgminer",
]
commands = ";".join(commands)
ret = await self.send_ssh_command(commands)
if ret is None:
return False
return True
async def get_config(self) -> MinerConfig: async def get_config(self) -> MinerConfig:
# get pool data # get pool data
try: try:
@@ -160,25 +84,10 @@ class CGMiner(BaseMiner):
self.config = MinerConfig.from_api(pools) self.config = MinerConfig.from_api(pools)
return self.config return self.config
async def fault_light_off(self) -> bool:
return False
async def fault_light_on(self) -> bool:
return False
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
return None
async def set_power_limit(self, wattage: int) -> bool:
return False
################################################## ##################################################
### DATA GATHERING FUNCTIONS (get_{some_data}) ### ### DATA GATHERING FUNCTIONS (get_{some_data}) ###
################################################## ##################################################
async def _get_mac(self) -> Optional[str]:
return None
async def _get_api_ver(self, api_version: dict = None) -> Optional[str]: async def _get_api_ver(self, api_version: dict = None) -> Optional[str]:
if api_version is None: if api_version is None:
try: try:
@@ -209,12 +118,7 @@ class CGMiner(BaseMiner):
return self.fw_ver return self.fw_ver
async def _get_hostname(self) -> Optional[str]:
hn = await self.send_ssh_command("cat /proc/sys/kernel/hostname")
return hn
async def _get_hashrate(self, api_summary: dict = None) -> Optional[float]: async def _get_hashrate(self, api_summary: dict = None) -> Optional[float]:
# get hr from API
if api_summary is None: if api_summary is None:
try: try:
api_summary = await self.api.summary() api_summary = await self.api.summary()
@@ -229,133 +133,6 @@ class CGMiner(BaseMiner):
except (LookupError, ValueError, TypeError): except (LookupError, ValueError, TypeError):
pass pass
async def _get_hashboards(self, api_stats: dict = None) -> List[HashBoard]:
hashboards = []
if api_stats is None:
try:
api_stats = await self.api.stats()
except APIError:
pass
if api_stats is not None:
try:
board_offset = -1
boards = api_stats["STATS"]
if len(boards) > 1:
for board_num in range(1, 16, 5):
for _b_num in range(5):
b = boards[1].get(f"chain_acn{board_num + _b_num}")
if b and not b == 0 and board_offset == -1:
board_offset = board_num
if board_offset == -1:
board_offset = 1
for i in range(
board_offset, board_offset + self.expected_hashboards
):
hashboard = HashBoard(
slot=i - board_offset, expected_chips=self.expected_chips
)
chip_temp = boards[1].get(f"temp{i}")
if chip_temp:
hashboard.chip_temp = round(chip_temp)
temp = boards[1].get(f"temp2_{i}")
if temp:
hashboard.temp = round(temp)
hashrate = boards[1].get(f"chain_rate{i}")
if hashrate:
hashboard.hashrate = round(float(hashrate) / 1000, 2)
chips = boards[1].get(f"chain_acn{i}")
if chips:
hashboard.chips = chips
hashboard.missing = False
if (not chips) or (not chips > 0):
hashboard.missing = True
hashboards.append(hashboard)
except (LookupError, ValueError, TypeError):
pass
return hashboards
async def _get_env_temp(self) -> Optional[float]:
return None
async def _get_wattage(self) -> Optional[int]:
return None
async def _get_wattage_limit(self) -> Optional[int]:
return None
async def _get_fans(self, api_stats: dict = None) -> List[Fan]:
if api_stats is None:
try:
api_stats = await self.api.stats()
except APIError:
pass
fans = [Fan() for _ in range(self.expected_fans)]
if api_stats is not None:
try:
fan_offset = -1
for fan_num in range(1, 8, 4):
for _f_num in range(4):
f = api_stats["STATS"][1].get(f"fan{fan_num + _f_num}")
if f and not f == 0 and fan_offset == -1:
fan_offset = fan_num
if fan_offset == -1:
fan_offset = 1
for fan in range(self.expected_fans):
fans[fan].speed = api_stats["STATS"][1].get(
f"fan{fan_offset+fan}", 0
)
except LookupError:
pass
return fans
async def _get_fan_psu(self) -> Optional[int]:
return None
async def _get_errors(self) -> List[MinerErrorData]:
return []
async def _get_fault_light(self) -> bool:
return False
async def _get_expected_hashrate(self, api_stats: dict = None) -> Optional[float]:
# X19 method, not sure compatibility
if api_stats is None:
try:
api_stats = await self.api.stats()
except APIError:
pass
if api_stats is not None:
try:
expected_rate = api_stats["STATS"][1]["total_rateideal"]
try:
rate_unit = api_stats["STATS"][1]["rate_unit"]
except KeyError:
rate_unit = "GH"
if rate_unit == "GH":
return round(expected_rate / 1000, 2)
if rate_unit == "MH":
return round(expected_rate / 1000000, 2)
else:
return round(expected_rate, 2)
except LookupError:
pass
async def _is_mining(self, *args, **kwargs) -> Optional[bool]:
return None
async def _get_uptime(self, api_stats: dict = None) -> Optional[int]: async def _get_uptime(self, api_stats: dict = None) -> Optional[int]:
if api_stats is None: if api_stats is None:
try: try:

View File

@@ -84,16 +84,13 @@ EPIC_DATA_LOC = DataLocations(
class ePIC(BaseMiner): class ePIC(BaseMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None: _web_cls = ePICWebAPI
super().__init__(ip, api_ver)
# interfaces
self.web = ePICWebAPI(ip)
# static data firmware = "ePIC"
self.api_type = "ePIC"
self.fw_str = "ePIC" data_locations = EPIC_DATA_LOC
# data gathering locations
self.data_locations = EPIC_DATA_LOC supports_shutdown = True
async def get_config(self) -> MinerConfig: async def get_config(self) -> MinerConfig:
summary = None summary = None
@@ -148,7 +145,7 @@ class ePIC(BaseMiner):
pass pass
return False return False
async def _get_mac(self, web_network: dict = None) -> str: async def _get_mac(self, web_network: dict = None) -> Optional[str]:
if web_network is None: if web_network is None:
try: try:
web_network = await self.web.network() web_network = await self.web.network()
@@ -163,7 +160,7 @@ class ePIC(BaseMiner):
except KeyError: except KeyError:
pass pass
async def _get_hostname(self, web_summary: dict = None) -> str: async def _get_hostname(self, web_summary: dict = None) -> Optional[str]:
if web_summary is None: if web_summary is None:
try: try:
web_summary = await self.web.summary() web_summary = await self.web.summary()
@@ -314,7 +311,7 @@ class ePIC(BaseMiner):
pass pass
return None return None
async def _get_fault_light(self, web_summary: dict = None) -> bool: async def _get_fault_light(self, web_summary: dict = None) -> Optional[bool]:
if web_summary is None: if web_summary is None:
try: try:
web_summary = await self.web.summary() web_summary = await self.web.summary()
@@ -346,27 +343,3 @@ class ePIC(BaseMiner):
except KeyError: except KeyError:
pass pass
return errors return errors
async def fault_light_off(self) -> bool:
return False
async def fault_light_on(self) -> bool:
return False
async def _get_api_ver(self, *args, **kwargs) -> Optional[str]:
pass
async def _get_env_temp(self, *args, **kwargs) -> Optional[float]:
pass
async def _get_fan_psu(self, *args, **kwargs) -> Optional[int]:
pass
async def _get_wattage_limit(self, *args, **kwargs) -> Optional[int]:
pass
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
pass
async def set_power_limit(self, wattage: int) -> bool:
return False

View File

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

View File

@@ -14,69 +14,8 @@
# limitations under the License. - # limitations under the License. -
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
from typing import List, Optional
from pyasic import settings
from pyasic.data import HashBoard
from pyasic.miners.backends import BMMiner from pyasic.miners.backends import BMMiner
from pyasic.miners.base import DataFunction, DataLocations, DataOptions, RPCAPICommand
HIVEON_DATA_LOC = DataLocations(
**{
str(DataOptions.API_VERSION): DataFunction(
"_get_api_ver",
[RPCAPICommand("api_version", "version")],
),
str(DataOptions.FW_VERSION): DataFunction(
"_get_fw_ver",
[RPCAPICommand("api_version", "version")],
),
str(DataOptions.HASHRATE): DataFunction(
"_get_hashrate",
[RPCAPICommand("api_summary", "summary")],
),
str(DataOptions.EXPECTED_HASHRATE): DataFunction(
"_get_expected_hashrate",
[RPCAPICommand("api_stats", "stats")],
),
str(DataOptions.HASHBOARDS): DataFunction(
"_get_hashboards",
[RPCAPICommand("api_stats", "stats")],
),
str(DataOptions.ENVIRONMENT_TEMP): DataFunction(
"_get_env_temp",
[RPCAPICommand("api_stats", "stats")],
),
str(DataOptions.WATTAGE): DataFunction(
"_get_wattage",
[RPCAPICommand("api_stats", "stats")],
),
str(DataOptions.FANS): DataFunction(
"_get_fans",
[RPCAPICommand("api_stats", "stats")],
),
str(DataOptions.UPTIME): DataFunction(
"_get_uptime",
[RPCAPICommand("api_stats", "stats")],
),
}
)
class Hiveon(BMMiner): class Hiveon(BMMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None: firmware = "Hive"
super().__init__(ip, api_ver)
self.pwd = settings.get("default_hive_password", "admin")
# static data
self.api_type = "Hiveon"
# data gathering locations
self.data_locations = HIVEON_DATA_LOC
async def _get_hashboards(self, api_stats: dict = None) -> List[HashBoard]:
pass
async def _get_wattage(self, api_stats: dict = None) -> Optional[int]:
pass
async def _get_env_temp(self, api_stats: dict = None) -> Optional[float]:
pass

View File

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

View File

@@ -13,11 +13,10 @@
# See the License for the specific language governing permissions and - # See the License for the specific language governing permissions and -
# limitations under the License. - # limitations under the License. -
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
from typing import List, Optional, Tuple, Union from typing import List, Optional
from pyasic.config import MinerConfig from pyasic.config import MinerConfig
from pyasic.data import Fan, HashBoard from pyasic.data import Fan, HashBoard
from pyasic.data.error_codes import MinerErrorData
from pyasic.errors import APIError from pyasic.errors import APIError
from pyasic.miners.base import ( from pyasic.miners.base import (
BaseMiner, BaseMiner,
@@ -62,23 +61,11 @@ LUXMINER_DATA_LOC = DataLocations(
class LUXMiner(BaseMiner): class LUXMiner(BaseMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None: _api_cls = LUXMinerRPCAPI
super().__init__(ip)
# interfaces
self.api = LUXMinerRPCAPI(ip, api_ver)
# self.web = BOSMinerWebAPI(ip)
# static data firmware = "LuxOS"
self.api_type = "LUXMiner"
self.fw_str = "LuxOS"
# data gathering locations
self.data_locations = LUXMINER_DATA_LOC
# autotuning/shutdown support
# self.supports_autotuning = True
# self.supports_shutdown = True
# data storage data_locations = LUXMINER_DATA_LOC
self.api_ver = api_ver
async def _get_session(self) -> Optional[str]: async def _get_session(self) -> Optional[str]:
try: try:
@@ -159,12 +146,6 @@ class LUXMiner(BaseMiner):
async def get_config(self) -> MinerConfig: async def get_config(self) -> MinerConfig:
return self.config return self.config
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
pass
async def set_power_limit(self, wattage: int) -> bool:
return False
################################################## ##################################################
### DATA GATHERING FUNCTIONS (get_{some_data}) ### ### DATA GATHERING FUNCTIONS (get_{some_data}) ###
################################################## ##################################################
@@ -185,18 +166,6 @@ class LUXMiner(BaseMiner):
return mac return mac
async def get_version(self) -> Tuple[Optional[str], Optional[str]]:
pass
async def _get_api_ver(self) -> Optional[str]:
pass
async def _get_fw_ver(self) -> Optional[str]:
pass
async def _get_hostname(self) -> Union[str, None]:
pass
async def _get_hashrate(self, api_summary: dict = None) -> Optional[float]: async def _get_hashrate(self, api_summary: dict = None) -> Optional[float]:
if api_summary is None: if api_summary is None:
try: try:
@@ -264,10 +233,7 @@ class LUXMiner(BaseMiner):
return hashboards return hashboards
async def _get_env_temp(self) -> Optional[float]: async def _get_wattage(self, api_power: dict = None) -> Optional[int]:
return None
async def _get_wattage(self, api_power: dict) -> Optional[int]:
if api_power is None: if api_power is None:
try: try:
api_power = await self.api.power() api_power = await self.api.power()
@@ -280,9 +246,6 @@ class LUXMiner(BaseMiner):
except (LookupError, ValueError, TypeError): except (LookupError, ValueError, TypeError):
pass pass
async def _get_wattage_limit(self) -> Optional[int]:
return None
async def _get_fans(self, api_fans: dict = None) -> List[Fan]: async def _get_fans(self, api_fans: dict = None) -> List[Fan]:
if api_fans is None: if api_fans is None:
try: try:
@@ -300,15 +263,6 @@ class LUXMiner(BaseMiner):
fans.append(Fan()) fans.append(Fan())
return fans return fans
async def _get_fan_psu(self) -> Optional[int]:
return None
async def _get_errors(self) -> List[MinerErrorData]:
pass
async def _get_fault_light(self) -> bool:
pass
async def _get_expected_hashrate(self, api_stats: dict = None) -> Optional[float]: async def _get_expected_hashrate(self, api_stats: dict = None) -> Optional[float]:
if api_stats is None: if api_stats is None:
try: try:
@@ -332,9 +286,6 @@ class LUXMiner(BaseMiner):
except LookupError: except LookupError:
pass pass
async def _is_mining(self) -> Optional[bool]:
pass
async def _get_uptime(self, api_stats: dict = None) -> Optional[int]: async def _get_uptime(self, api_stats: dict = None) -> Optional[int]:
if api_stats is None: if api_stats is None:
try: try:

View File

@@ -75,16 +75,11 @@ VNISH_DATA_LOC = DataLocations(
class VNish(BMMiner): class VNish(BMMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None: _web_cls = VNishWebAPI
super().__init__(ip, api_ver)
# interfaces
self.web = VNishWebAPI(ip)
# static data firmware = "VNish"
self.api_type = "VNish"
self.fw_str = "VNish" data_locations = VNISH_DATA_LOC
# data gathering locations
self.data_locations = VNISH_DATA_LOC
async def restart_backend(self) -> bool: async def restart_backend(self) -> bool:
data = await self.web.restart_vnish() data = await self.web.restart_vnish()
@@ -211,12 +206,6 @@ class VNish(BMMiner):
except KeyError: except KeyError:
pass pass
async def _is_mining(self, *args, **kwargs) -> Optional[bool]:
return None
async def _get_uptime(self, *args, **kwargs) -> Optional[int]:
return None
async def get_config(self) -> MinerConfig: async def get_config(self) -> MinerConfig:
try: try:
web_settings = await self.web.settings() web_settings = await self.web.settings()

View File

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

View File

@@ -16,10 +16,10 @@
import asyncio import asyncio
import ipaddress import ipaddress
import logging import logging
from abc import ABC, abstractmethod import warnings
from dataclasses import dataclass, field, make_dataclass from dataclasses import dataclass, field, make_dataclass
from enum import Enum from enum import Enum
from typing import List, Optional, Tuple, TypeVar, Union from typing import Dict, List, Optional, Protocol, Tuple, Type, TypeVar, Union
import asyncssh import asyncssh
@@ -88,7 +88,7 @@ class GraphQLCommand(WebAPICommand):
@dataclass @dataclass
class DataFunction: class DataFunction:
cmd: str cmd: str
kwargs: list[ kwargs: List[
Union[RPCAPICommand, WebAPICommand, GRPCCommand, GraphQLCommand] Union[RPCAPICommand, WebAPICommand, GRPCCommand, GraphQLCommand]
] = field(default_factory=list) ] = field(default_factory=list)
@@ -106,39 +106,30 @@ DataLocations = make_dataclass(
) )
class BaseMiner(ABC): class MinerProtocol(Protocol):
def __init__(self, ip: str, *args, **kwargs) -> None: _api_cls: Type = None
# interfaces _web_cls: Type = None
self.api = None
self.web = None
# static data api = None
self.ip = ip web = None
self.api_type = None
# type
self.make = None
self.raw_model = None
self.fw_str = None
# physical attributes
self.expected_hashboards = 3
self.expected_chips = 0
self.expected_fans = 2
# data gathering locations
self.data_locations: DataLocations = None
# autotuning/shutdown support
self.supports_autotuning = False
self.supports_shutdown = False
# data storage make: str = None
self.api_ver = None raw_model: str = None
self.fw_ver = None firmware: str = None
self.light = None
self.config = None
def __new__(cls, *args, **kwargs): expected_hashboards: int = 3
if cls is BaseMiner: expected_chips: int = None
raise TypeError(f"Only children of '{cls.__name__}' may be instantiated") expected_fans: int = 2
return object.__new__(cls)
data_locations: DataLocations = None
supports_shutdown: bool = False
supports_autotuning: bool = False
api_ver: str = None
fw_ver: str = None
light: bool = None
config: MinerConfig = None
def __repr__(self): def __repr__(self):
return f"{self.model}: {str(self.ip)}" return f"{self.model}: {str(self.ip)}"
@@ -153,57 +144,41 @@ class BaseMiner(ABC):
return ipaddress.ip_address(self.ip) == ipaddress.ip_address(other.ip) return ipaddress.ip_address(self.ip) == ipaddress.ip_address(other.ip)
@property @property
def model(self): def model(self) -> str:
model_data = [self.raw_model if self.raw_model is not None else "Unknown"] model_data = [self.raw_model if self.raw_model is not None else "Unknown"]
if self.fw_str is not None: if self.firmware is not None:
model_data.append(f"({self.fw_str})") model_data.append(f"({self.firmware})")
return " ".join(model_data) return " ".join(model_data)
@property @property
def pwd(self): # noqa - Skip PyCharm inspection def pwd(self) -> Dict[str, str]:
data = [] data = {}
try: if self.web is not None:
if self.web is not None: data["web"] = self.web.pwd
data.append(f"web={self.web.pwd}") if self.api is not None:
except TypeError: data["api"] = self.api.pwd
pass return data
try:
if self.api is not None:
data.append(f"api={self.api.pwd}")
except TypeError:
pass
return ",".join(data)
@pwd.setter @pwd.setter
def pwd(self, val): def pwd(self, val: str) -> None:
try: if self.web is not None:
if self.web is not None: self.web.pwd = val
self.web.pwd = val if self.api is not None:
except TypeError: self.api.pwd = val
pass
try:
if self.api is not None:
self.api.pwd = val
except TypeError:
pass
@property @property
def username(self): # noqa - Skip PyCharm inspection def username(self) -> Dict[str, str]:
data = [] data = {}
try: if self.web is not None:
if self.web is not None: data["web"] = self.web.pwd
data.append(f"web={self.web.username}") if self.api is not None:
except TypeError: data["api"] = self.api.pwd
pass return data
return ",".join(data)
@username.setter @username.setter
def username(self, val): def username(self, val) -> None:
try: if self.web is not None:
if self.web is not None: self.web.username = val
self.web.username = val
except TypeError:
pass
async def _get_ssh_connection(self) -> asyncssh.connect: async def _get_ssh_connection(self) -> asyncssh.connect:
"""Create a new asyncssh connection""" """Create a new asyncssh connection"""
@@ -216,44 +191,47 @@ class BaseMiner(ABC):
server_host_key_algs=["ssh-rsa"], server_host_key_algs=["ssh-rsa"],
) )
return conn return conn
except asyncssh.misc.PermissionDenied: except asyncssh.misc.PermissionDenied as e:
try: raise ConnectionRefusedError from e
conn = await asyncssh.connect(
str(self.ip),
known_hosts=None,
username="root",
password="admin",
server_host_key_algs=["ssh-rsa"],
)
return conn
except Exception as e:
raise ConnectionError from e
except OSError as e:
logging.warning(f"Connection refused: {self}")
raise ConnectionError from e
except Exception as e: except Exception as e:
raise ConnectionError from e raise ConnectionError from e
async def send_ssh_command(self, cmd: str) -> Optional[str]:
"""Send an ssh command to the miner"""
try:
conn = await asyncio.wait_for(self._get_ssh_connection(), timeout=10)
except (ConnectionError, asyncio.TimeoutError):
return None
try:
async with conn:
resp = await conn.run(cmd)
result = max(resp.stdout, resp.stderr, key=lambda x: len(x))
return result
except Exception as e:
logging.error(f"{self} command {cmd} error: {e}")
return None
async def check_light(self) -> bool: async def check_light(self) -> bool:
return await self.get_fault_light() return await self.get_fault_light()
@abstractmethod
async def fault_light_on(self) -> bool: async def fault_light_on(self) -> bool:
"""Turn the fault light of the miner on and return success as a boolean. """Turn the fault light of the miner on and return success as a boolean.
Returns: Returns:
A boolean value of the success of turning the light on. A boolean value of the success of turning the light on.
""" """
return False
@abstractmethod
async def fault_light_off(self) -> bool: async def fault_light_off(self) -> bool:
"""Turn the fault light of the miner off and return success as a boolean. """Turn the fault light of the miner off and return success as a boolean.
Returns: Returns:
A boolean value of the success of turning the light off. A boolean value of the success of turning the light off.
""" """
return False
@abstractmethod
async def get_config(self) -> MinerConfig: async def get_config(self) -> MinerConfig:
# Not a data gathering function, since this is used for configuration # Not a data gathering function, since this is used for configuration
"""Get the mining configuration of the miner and return it as a [`MinerConfig`][pyasic.config.MinerConfig]. """Get the mining configuration of the miner and return it as a [`MinerConfig`][pyasic.config.MinerConfig].
@@ -261,24 +239,24 @@ class BaseMiner(ABC):
Returns: Returns:
A [`MinerConfig`][pyasic.config.MinerConfig] containing the pool information and mining configuration. A [`MinerConfig`][pyasic.config.MinerConfig] containing the pool information and mining configuration.
""" """
return MinerConfig()
@abstractmethod
async def reboot(self) -> bool: async def reboot(self) -> bool:
"""Reboot the miner and return success as a boolean. """Reboot the miner and return success as a boolean.
Returns: Returns:
A boolean value of the success of rebooting the miner. A boolean value of the success of rebooting the miner.
""" """
return False
@abstractmethod
async def restart_backend(self) -> bool: async def restart_backend(self) -> bool:
"""Restart the mining process of the miner (bosminer, bmminer, cgminer, etc) and return success as a boolean. """Restart the mining process of the miner (bosminer, bmminer, cgminer, etc) and return success as a boolean.
Returns: Returns:
A boolean value of the success of restarting the mining process. A boolean value of the success of restarting the mining process.
""" """
return False
@abstractmethod
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None: async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
"""Set the mining configuration of the miner. """Set the mining configuration of the miner.
@@ -286,24 +264,24 @@ class BaseMiner(ABC):
config: A [`MinerConfig`][pyasic.config.MinerConfig] containing the mining config you want to switch the miner to. config: A [`MinerConfig`][pyasic.config.MinerConfig] containing the mining config you want to switch the miner to.
user_suffix: A suffix to append to the username when sending to the miner. user_suffix: A suffix to append to the username when sending to the miner.
""" """
pass
@abstractmethod
async def stop_mining(self) -> bool: async def stop_mining(self) -> bool:
"""Stop the mining process of the miner. """Stop the mining process of the miner.
Returns: Returns:
A boolean value of the success of stopping the mining process. A boolean value of the success of stopping the mining process.
""" """
return False
@abstractmethod
async def resume_mining(self) -> bool: async def resume_mining(self) -> bool:
"""Resume the mining process of the miner. """Resume the mining process of the miner.
Returns: Returns:
A boolean value of the success of resuming the mining process. A boolean value of the success of resuming the mining process.
""" """
return False
@abstractmethod
async def set_power_limit(self, wattage: int) -> bool: async def set_power_limit(self, wattage: int) -> bool:
"""Set the power limit to be used by the miner. """Set the power limit to be used by the miner.
@@ -313,6 +291,7 @@ class BaseMiner(ABC):
Returns: Returns:
A boolean value of the success of setting the power limit. A boolean value of the success of setting the power limit.
""" """
return False
################################################## ##################################################
### DATA GATHERING FUNCTIONS (get_{some_data}) ### ### DATA GATHERING FUNCTIONS (get_{some_data}) ###
@@ -464,68 +443,52 @@ class BaseMiner(ABC):
""" """
return await self._get_uptime() return await self._get_uptime()
@abstractmethod async def _get_mac(self) -> Optional[str]:
async def _get_mac(self, *args, **kwargs) -> Optional[str]:
pass pass
@abstractmethod async def _get_api_ver(self) -> Optional[str]:
async def _get_api_ver(self, *args, **kwargs) -> Optional[str]:
pass pass
@abstractmethod async def _get_fw_ver(self) -> Optional[str]:
async def _get_fw_ver(self, *args, **kwargs) -> Optional[str]:
pass pass
@abstractmethod async def _get_hostname(self) -> Optional[str]:
async def _get_hostname(self, *args, **kwargs) -> Optional[str]:
pass pass
@abstractmethod async def _get_hashrate(self) -> Optional[float]:
async def _get_hashrate(self, *args, **kwargs) -> Optional[float]:
pass pass
@abstractmethod async def _get_hashboards(self) -> List[HashBoard]:
async def _get_hashboards(self, *args, **kwargs) -> List[HashBoard]: return []
async def _get_env_temp(self) -> Optional[float]:
pass pass
@abstractmethod async def _get_wattage(self) -> Optional[int]:
async def _get_env_temp(self, *args, **kwargs) -> Optional[float]:
pass pass
@abstractmethod async def _get_wattage_limit(self) -> Optional[int]:
async def _get_wattage(self, *args, **kwargs) -> Optional[int]:
pass pass
@abstractmethod async def _get_fans(self) -> List[Fan]:
async def _get_wattage_limit(self, *args, **kwargs) -> Optional[int]: return []
async def _get_fan_psu(self) -> Optional[int]:
pass pass
@abstractmethod async def _get_errors(self) -> List[MinerErrorData]:
async def _get_fans(self, *args, **kwargs) -> List[Fan]: return []
async def _get_fault_light(self) -> Optional[bool]:
pass pass
@abstractmethod async def _get_expected_hashrate(self) -> Optional[float]:
async def _get_fan_psu(self, *args, **kwargs) -> Optional[int]:
pass pass
@abstractmethod async def _is_mining(self) -> Optional[bool]:
async def _get_errors(self, *args, **kwargs) -> List[MinerErrorData]:
pass pass
@abstractmethod async def _get_uptime(self) -> Optional[int]:
async def _get_fault_light(self, *args, **kwargs) -> bool:
pass
@abstractmethod
async def _get_expected_hashrate(self, *args, **kwargs) -> Optional[float]:
pass
@abstractmethod
async def _is_mining(self, *args, **kwargs) -> Optional[bool]:
pass
@abstractmethod
async def _get_uptime(self, *args, **kwargs) -> Optional[int]:
pass pass
async def _get_data( async def _get_data(
@@ -652,4 +615,21 @@ class BaseMiner(ABC):
return data return data
class BaseMiner(MinerProtocol):
def __init__(self, ip: str) -> None:
self.ip = ip
if self.expected_chips is None:
warnings.warn(
f"Unknown chip count for miner type {self.raw_model}, "
f"please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
)
# interfaces
if self._api_cls is not None:
self.api = self._api_cls(ip)
if self._web_cls is not None:
self.web = self._web_cls(ip)
AnyMiner = TypeVar("AnyMiner", bound=BaseMiner) AnyMiner = TypeVar("AnyMiner", bound=BaseMiner)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -28,17 +28,17 @@ from pyasic.logger import logger
from pyasic.miners.antminer import * from pyasic.miners.antminer import *
from pyasic.miners.avalonminer import * from pyasic.miners.avalonminer import *
from pyasic.miners.backends import ( from pyasic.miners.backends import (
BFGMiner, AvalonMiner,
BMMiner, BMMiner,
BOSMiner, BOSMiner,
BTMiner, BTMiner,
CGMiner, GoldshellMiner,
CGMinerAvalon,
Hiveon, Hiveon,
LUXMiner, LUXMiner,
VNish, VNish,
ePIC, ePIC,
) )
from pyasic.miners.backends.innosilicon import Innosilicon
from pyasic.miners.base import AnyMiner from pyasic.miners.base import AnyMiner
from pyasic.miners.goldshell import * from pyasic.miners.goldshell import *
from pyasic.miners.innosilicon import * from pyasic.miners.innosilicon import *
@@ -310,7 +310,7 @@ MINER_CLASSES = {
"M66SVK40": BTMinerM66SVK40, "M66SVK40": BTMinerM66SVK40,
}, },
MinerTypes.AVALONMINER: { MinerTypes.AVALONMINER: {
None: CGMinerAvalon, None: AvalonMiner,
"AVALONMINER 721": CGMinerAvalon721, "AVALONMINER 721": CGMinerAvalon721,
"AVALONMINER 741": CGMinerAvalon741, "AVALONMINER 741": CGMinerAvalon741,
"AVALONMINER 761": CGMinerAvalon761, "AVALONMINER 761": CGMinerAvalon761,
@@ -325,16 +325,16 @@ MINER_CLASSES = {
"AVALONMINER 1246": CGMinerAvalon1246, "AVALONMINER 1246": CGMinerAvalon1246,
}, },
MinerTypes.INNOSILICON: { MinerTypes.INNOSILICON: {
None: CGMiner, None: Innosilicon,
"T3H+": InnosiliconT3HPlus, "T3H+": InnosiliconT3HPlus,
"A10X": InnosiliconA10X, "A10X": InnosiliconA10X,
}, },
MinerTypes.GOLDSHELL: { MinerTypes.GOLDSHELL: {
None: BFGMiner, None: GoldshellMiner,
"GOLDSHELL CK5": BFGMinerCK5, "GOLDSHELL CK5": GoldshellCK5,
"GOLDSHELL HS5": BFGMinerHS5, "GOLDSHELL HS5": GoldshellHS5,
"GOLDSHELL KD5": BFGMinerKD5, "GOLDSHELL KD5": GoldshellKD5,
"GOLDSHELL KDMAX": BFGMinerKDMax, "GOLDSHELL KDMAX": BFGMinerGoldshellKDMax,
}, },
MinerTypes.BRAIINS_OS: { MinerTypes.BRAIINS_OS: {
None: BOSMiner, None: BOSMiner,
@@ -761,7 +761,7 @@ class MinerFactory:
str_data = ",".join(str_data.split(",")[:-1]) + "}" str_data = ",".join(str_data.split(",")[:-1]) + "}"
# fix a really nasty bug with whatsminer API v2.0.4 where they return a list structured like a dict # fix a really nasty bug with whatsminer API v2.0.4 where they return a list structured like a dict
if re.search(r"\"error_code\":\[\".+\"\]", str_data): if re.search(r"\"error_code\":\[\".+\"]", str_data):
str_data = str_data.replace("[", "{").replace("]", "}") str_data = str_data.replace("[", "{").replace("]", "}")
return str_data return str_data

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -14,18 +14,9 @@
# limitations under the License. - # limitations under the License. -
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
import warnings from pyasic.miners.makes import WhatsMinerMake
from pyasic.miners.makes import WhatsMiner
class M20SPlusV30(WhatsMiner): # noqa - ignore ABC method implementation class M20SPlusV30(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M20S+ V30"
super().__init__(ip, api_ver) expected_fans = 2
self.ip = ip
self.raw_model = "M20S+ V30"
self.expected_chips = 0
warnings.warn(
"Unknown chip count for miner type M20S+ V30, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
)
self.fan_count = 2

View File

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

View File

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

View File

@@ -14,18 +14,9 @@
# limitations under the License. - # limitations under the License. -
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
import warnings from pyasic.miners.makes import WhatsMinerMake
from pyasic.miners.makes import WhatsMiner
class M21SPlusV20(WhatsMiner): # noqa - ignore ABC method implementation class M21SPlusV20(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M21S+ V20"
super().__init__(ip, api_ver) expected_fans = 2
self.ip = ip
self.raw_model = "M21S+ V20"
self.expected_chips = 0
warnings.warn(
"Unknown chip count for miner type M21S+ V20, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
)
self.fan_count = 2

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -14,206 +14,129 @@
# limitations under the License. - # limitations under the License. -
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
import warnings from pyasic.miners.makes import WhatsMinerMake
from pyasic.miners.makes import WhatsMiner
class M30SPlusPlusV10(WhatsMiner): # noqa - ignore ABC method implementation class M30SPlusPlusV10(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M30S++ V10"
super().__init__(ip, api_ver) expected_hashboards = 4
self.ip = ip expected_chips = 255
self.raw_model = "M30S++ V10" expected_fans = 2
self.expected_hashboards = 4
self.expected_chips = 255
self.fan_count = 2
class M30SPlusPlusV20(WhatsMiner): # noqa - ignore ABC method implementation class M30SPlusPlusV20(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M30S++ V20"
super().__init__(ip, api_ver) expected_hashboards = 4
self.ip = ip expected_chips = 255
self.raw_model = "M30S++ V20" expected_fans = 2
self.expected_hashboards = 4
self.expected_chips = 255
self.fan_count = 2
class M30SPlusPlusVE30(WhatsMiner): # noqa - ignore ABC method implementation class M30SPlusPlusVE30(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M30S++ VE30"
super().__init__(ip, api_ver) expected_chips = 215
self.ip = ip expected_fans = 2
self.raw_model = "M30S++ VE30"
self.expected_chips = 215
self.fan_count = 2
class M30SPlusPlusVE40(WhatsMiner): # noqa - ignore ABC method implementation class M30SPlusPlusVE40(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M30S++ VE40"
super().__init__(ip, api_ver) expected_chips = 225
self.ip = ip expected_fans = 2
self.raw_model = "M30S++ VE40"
self.expected_chips = 225
self.fan_count = 2
class M30SPlusPlusVE50(WhatsMiner): # noqa - ignore ABC method implementation class M30SPlusPlusVE50(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M30S++ VE50"
super().__init__(ip, api_ver) expected_chips = 235
self.ip = ip expected_fans = 2
self.raw_model = "M30S++ VE50"
self.expected_chips = 235
self.fan_count = 2
class M30SPlusPlusVF40(WhatsMiner): # noqa - ignore ABC method implementation class M30SPlusPlusVF40(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M30S++ VF40"
super().__init__(ip, api_ver) expected_chips = 156
self.ip = ip expected_fans = 2
self.raw_model = "M30S++ VF40"
self.expected_chips = 156
self.fan_count = 2
class M30SPlusPlusVG30(WhatsMiner): # noqa - ignore ABC method implementation class M30SPlusPlusVG30(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M30S++ VG30"
super().__init__(ip, api_ver) expected_chips = 111
self.ip = ip expected_fans = 2
self.raw_model = "M30S++ VG30"
self.expected_chips = 111
self.fan_count = 2
class M30SPlusPlusVG40(WhatsMiner): # noqa - ignore ABC method implementation class M30SPlusPlusVG40(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M30S++ VG40"
super().__init__(ip, api_ver) expected_chips = 117
self.ip = ip expected_fans = 2
self.raw_model = "M30S++ VG40"
self.expected_chips = 117
self.fan_count = 2
class M30SPlusPlusVG50(WhatsMiner): # noqa - ignore ABC method implementation class M30SPlusPlusVG50(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M30S++ VG50"
super().__init__(ip, api_ver) expected_fans = 2
self.ip = ip
self.raw_model = "M30S++ VG50"
self.expected_chips = 0
warnings.warn(
"Unknown chip count for miner type M30S++ VG50, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
)
self.fan_count = 2
class M30SPlusPlusVH10(WhatsMiner): # noqa - ignore ABC method implementation class M30SPlusPlusVH10(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M30S++ VH10"
super().__init__(ip, api_ver) expected_chips = 82
self.ip = ip expected_fans = 2
self.raw_model = "M30S++ VH10"
self.expected_chips = 82
self.fan_count = 2
class M30SPlusPlusVH20(WhatsMiner): # noqa - ignore ABC method implementation class M30SPlusPlusVH20(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M30S++ VH20"
super().__init__(ip, api_ver) expected_chips = 86
self.ip = ip expected_fans = 2
self.raw_model = "M30S++ VH20"
self.expected_chips = 86
self.fan_count = 2
class M30SPlusPlusVH30(WhatsMiner): # noqa - ignore ABC method implementation class M30SPlusPlusVH30(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M30S++ VH30"
super().__init__(ip, api_ver) expected_chips = 111
self.ip = ip expected_fans = 2
self.raw_model = "M30S++ VH30"
self.expected_chips = 111
self.fan_count = 2
class M30SPlusPlusVH40(WhatsMiner): # noqa - ignore ABC method implementation class M30SPlusPlusVH40(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M30S++ VH40"
super().__init__(ip, api_ver) expected_chips = 70
self.ip = ip expected_fans = 2
self.raw_model = "M30S++ VH40"
self.expected_chips = 70
self.fan_count = 2
class M30SPlusPlusVH50(WhatsMiner): # noqa - ignore ABC method implementation class M30SPlusPlusVH50(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M30S++ VH50"
super().__init__(ip, api_ver) expected_chips = 74
self.ip = ip expected_fans = 2
self.raw_model = "M30S++ VH50"
self.expected_chips = 74
self.fan_count = 2
class M30SPlusPlusVH60(WhatsMiner): # noqa - ignore ABC method implementation class M30SPlusPlusVH60(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M30S++ VH60"
super().__init__(ip, api_ver) expected_chips = 78
self.ip = ip expected_fans = 2
self.raw_model = "M30S++ VH60"
self.expected_chips = 78
self.fan_count = 2
class M30SPlusPlusVH70(WhatsMiner): # noqa - ignore ABC method implementation class M30SPlusPlusVH70(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M30S++ VH70"
super().__init__(ip, api_ver) expected_chips = 70
self.ip = ip expected_fans = 2
self.raw_model = "M30S++ VH70"
self.expected_chips = 70
self.fan_count = 2
class M30SPlusPlusVH80(WhatsMiner): # noqa - ignore ABC method implementation class M30SPlusPlusVH80(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M30S++ VH80"
super().__init__(ip, api_ver) expected_chips = 74
self.ip = ip expected_fans = 2
self.raw_model = "M30S++ VH80"
self.expected_chips = 74
self.fan_count = 2
class M30SPlusPlusVH90(WhatsMiner): # noqa - ignore ABC method implementation class M30SPlusPlusVH90(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M30S++ VH90"
super().__init__(ip, api_ver) expected_chips = 78
self.ip = ip expected_fans = 2
self.raw_model = "M30S++ VH90"
self.expected_chips = 78
self.fan_count = 2
class M30SPlusPlusVH100(WhatsMiner): # noqa - ignore ABC method implementation class M30SPlusPlusVH100(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M30S++ VH100"
super().__init__(ip, api_ver) expected_chips = 82
self.ip = ip expected_fans = 2
self.raw_model = "M30S++ VH100"
self.expected_chips = 82
self.fan_count = 2
class M30SPlusPlusVJ20(WhatsMiner): # noqa - ignore ABC method implementation class M30SPlusPlusVJ20(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M30S++ VJ20"
super().__init__(ip, api_ver) expected_fans = 2
self.ip = ip
self.raw_model = "M30S++ VJ20"
self.expected_chips = 0
warnings.warn(
"Unknown chip count for miner type M30S++ VJ20, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
)
self.fan_count = 2
class M30SPlusPlusVJ30(WhatsMiner): # noqa - ignore ABC method implementation class M30SPlusPlusVJ30(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M30S++ VJ30"
super().__init__(ip, api_ver) expected_fans = 2
self.ip = ip
self.raw_model = "M30S++ VJ30"
self.expected_chips = 0
warnings.warn(
"Unknown chip count for miner type M30S++ VJ30, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
)
self.fan_count = 2

View File

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

View File

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

View File

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

View File

@@ -14,120 +14,74 @@
# limitations under the License. - # limitations under the License. -
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
import warnings from pyasic.miners.makes import WhatsMinerMake
from pyasic.miners.makes import WhatsMiner
class M31SV10(WhatsMiner): # noqa - ignore ABC method implementation class M31SV10(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S V10"
super().__init__(ip, api_ver) expected_chips = 105
self.ip = ip expected_fans = 2
self.raw_model = "M31S V10"
self.expected_chips = 105
self.fan_count = 2
class M31SV20(WhatsMiner): # noqa - ignore ABC method implementation class M31SV20(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S V20"
super().__init__(ip, api_ver) expected_chips = 111
self.ip = ip expected_fans = 2
self.raw_model = "M31S V20"
self.expected_chips = 111
self.fan_count = 2
class M31SV30(WhatsMiner): # noqa - ignore ABC method implementation class M31SV30(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S V30"
super().__init__(ip, api_ver) expected_chips = 117
self.ip = ip expected_fans = 2
self.raw_model = "M31S V30"
self.expected_chips = 117
self.fan_count = 2
class M31SV40(WhatsMiner): # noqa - ignore ABC method implementation class M31SV40(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S V40"
super().__init__(ip, api_ver) expected_chips = 123
self.ip = ip expected_fans = 2
self.raw_model = "M31S V40"
self.expected_chips = 123
self.fan_count = 2
class M31SV50(WhatsMiner): # noqa - ignore ABC method implementation class M31SV50(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S V50"
super().__init__(ip, api_ver) expected_chips = 78
self.ip = ip expected_fans = 2
self.raw_model = "M31S V50"
self.expected_chips = 78
self.fan_count = 2
class M31SV60(WhatsMiner): # noqa - ignore ABC method implementation class M31SV60(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S V60"
super().__init__(ip, api_ver) expected_chips = 105
self.ip = ip expected_fans = 2
self.raw_model = "M31S V60"
self.expected_chips = 105
self.fan_count = 2
class M31SV70(WhatsMiner): # noqa - ignore ABC method implementation class M31SV70(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S V70"
super().__init__(ip, api_ver) expected_chips = 111
self.ip = ip expected_fans = 2
self.raw_model = "M31S V70"
self.expected_chips = 111
self.fan_count = 2
class M31SV80(WhatsMiner): # noqa - ignore ABC method implementation class M31SV80(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S V80"
super().__init__(ip, api_ver) expected_fans = 2
self.ip = ip
self.raw_model = "M31S V80"
self.expected_chips = 0
warnings.warn(
"Unknown chip count for miner type M31SV80, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
)
self.fan_count = 2
class M31SV90(WhatsMiner): # noqa - ignore ABC method implementation class M31SV90(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S V90"
super().__init__(ip, api_ver) expected_chips = 117
self.ip = ip expected_fans = 2
self.raw_model = "M31S V90"
self.expected_chips = 117
self.fan_count = 2
class M31SVE10(WhatsMiner): # noqa - ignore ABC method implementation class M31SVE10(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S VE10"
super().__init__(ip, api_ver) expected_chips = 70
self.ip = ip expected_fans = 2
self.raw_model = "M31S VE10"
self.expected_chips = 70
self.fan_count = 2
class M31SVE20(WhatsMiner): # noqa - ignore ABC method implementation class M31SVE20(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S VE20"
super().__init__(ip, api_ver) expected_chips = 74
self.ip = ip expected_fans = 2
self.raw_model = "M31S VE20"
self.expected_chips = 74
self.fan_count = 2
class M31SVE30(WhatsMiner): # noqa - ignore ABC method implementation class M31SVE30(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S VE30"
super().__init__(ip, api_ver) expected_fans = 2
self.ip = ip
self.raw_model = "M31S VE30"
self.expected_chips = 0
warnings.warn(
"Unknown chip count for miner type M31SVE30, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
)
self.fan_count = 2

View File

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

View File

@@ -14,195 +14,121 @@
# limitations under the License. - # limitations under the License. -
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
import warnings from pyasic.miners.makes import WhatsMinerMake
from pyasic.miners.makes import WhatsMiner
class M31SPlusV10(WhatsMiner): # noqa - ignore ABC method implementation class M31SPlusV10(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S+ V10"
super().__init__(ip, api_ver) expected_chips = 105
self.ip = ip expected_fans = 2
self.raw_model = "M31S+ V10"
self.expected_chips = 105
self.fan_count = 2
class M31SPlusV20(WhatsMiner): # noqa - ignore ABC method implementation class M31SPlusV20(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S+ V20"
super().__init__(ip, api_ver) expected_chips = 111
self.ip = ip expected_fans = 2
self.raw_model = "M31S+ V20"
self.expected_chips = 111
self.fan_count = 2
class M31SPlusV30(WhatsMiner): # noqa - ignore ABC method implementation class M31SPlusV30(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S+ V30"
super().__init__(ip, api_ver) expected_chips = 117
self.ip = ip expected_fans = 2
self.raw_model = "M31S+ V30"
self.expected_chips = 117
self.fan_count = 2
class M31SPlusV40(WhatsMiner): # noqa - ignore ABC method implementation class M31SPlusV40(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S+ V40"
super().__init__(ip, api_ver) expected_chips = 123
self.ip = ip expected_fans = 2
self.raw_model = "M31S+ V40"
self.expected_chips = 123
self.fan_count = 2
class M31SPlusV50(WhatsMiner): # noqa - ignore ABC method implementation class M31SPlusV50(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S+ V50"
super().__init__(ip, api_ver) expected_chips = 148
self.ip = ip expected_fans = 2
self.raw_model = "M31S+ V50"
self.expected_chips = 148
self.fan_count = 2
class M31SPlusV60(WhatsMiner): # noqa - ignore ABC method implementation class M31SPlusV60(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S+ V60"
super().__init__(ip, api_ver) expected_chips = 156
self.ip = ip expected_fans = 2
self.raw_model = "M31S+ V60"
self.expected_chips = 156
self.fan_count = 2
class M31SPlusV80(WhatsMiner): # noqa - ignore ABC method implementation class M31SPlusV80(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S+ V80"
super().__init__(ip, api_ver) expected_chips = 129
self.ip = ip expected_fans = 2
self.raw_model = "M31S+ V80"
self.expected_chips = 129
self.fan_count = 2
class M31SPlusV90(WhatsMiner): # noqa - ignore ABC method implementation class M31SPlusV90(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S+ V90"
super().__init__(ip, api_ver) expected_chips = 117
self.ip = ip expected_fans = 2
self.raw_model = "M31S+ V90"
self.expected_chips = 117
self.fan_count = 2
class M31SPlusV100(WhatsMiner): # noqa - ignore ABC method implementation class M31SPlusV100(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S+ V100"
super().__init__(ip, api_ver) expected_chips = 111
self.ip = ip expected_fans = 2
self.raw_model = "M31S+ V100"
self.expected_chips = 111
self.fan_count = 2
class M31SPlusVE10(WhatsMiner): # noqa - ignore ABC method implementation class M31SPlusVE10(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S+ VE10"
super().__init__(ip, api_ver) expected_chips = 82
self.ip = ip expected_fans = 2
self.raw_model = "M31S+ VE10"
self.expected_chips = 82
self.fan_count = 2
class M31SPlusVE20(WhatsMiner): # noqa - ignore ABC method implementation class M31SPlusVE20(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S+ VE20"
super().__init__(ip, api_ver) expected_chips = 78
self.ip = ip expected_fans = 2
self.raw_model = "M31S+ VE20"
self.expected_chips = 78
self.fan_count = 2
class M31SPlusVE30(WhatsMiner): # noqa - ignore ABC method implementation class M31SPlusVE30(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S+ VE30"
super().__init__(ip, api_ver) expected_chips = 105
self.ip = ip expected_fans = 2
self.raw_model = "M31S+ VE30"
self.expected_chips = 105
self.fan_count = 2
class M31SPlusVE40(WhatsMiner): # noqa - ignore ABC method implementation class M31SPlusVE40(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S+ VE40"
super().__init__(ip, api_ver) expected_chips = 111
self.ip = ip expected_fans = 2
self.raw_model = "M31S+ VE40"
self.expected_chips = 111
self.fan_count = 2
class M31SPlusVE50(WhatsMiner): # noqa - ignore ABC method implementation class M31SPlusVE50(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S+ VE50"
super().__init__(ip, api_ver) expected_chips = 117
self.ip = ip expected_fans = 2
self.raw_model = "M31S+ VE50"
self.expected_chips = 117
self.fan_count = 2
class M31SPlusVE60(WhatsMiner): # noqa - ignore ABC method implementation class M31SPlusVE60(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S+ VE60"
super().__init__(ip, api_ver) expected_fans = 2
self.ip = ip
self.raw_model = "M31S+ VE60"
self.expected_chips = 0
warnings.warn(
"Unknown chip count for miner type M30S+ VE60, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
)
self.fan_count = 2
class M31SPlusVE80(WhatsMiner): # noqa - ignore ABC method implementation class M31SPlusVE80(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S+ VE80"
super().__init__(ip, api_ver) expected_fans = 2
self.ip = ip
self.raw_model = "M31S+ VE80"
self.expected_chips = 0
warnings.warn(
"Unknown chip count for miner type M30S+ VE80, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
)
self.fan_count = 2
class M31SPlusVF20(WhatsMiner): # noqa - ignore ABC method implementation class M31SPlusVF20(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S+ VF20"
super().__init__(ip, api_ver) expected_chips = 66
self.ip = ip expected_fans = 2
self.raw_model = "M31S+ VF20"
self.expected_chips = 66
self.fan_count = 2
class M31SPlusVF30(WhatsMiner): # noqa - ignore ABC method implementation class M31SPlusVF30(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S+ VF30"
super().__init__(ip, api_ver) expected_fans = 2
self.ip = ip
self.raw_model = "M31S+ VF30"
self.expected_chips = 0
warnings.warn(
"Unknown chip count for miner type M30S+ VF30, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
)
self.fan_count = 2
class M31SPlusVG20(WhatsMiner): # noqa - ignore ABC method implementation class M31SPlusVG20(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S+ VG20"
super().__init__(ip, api_ver) expected_chips = 66
self.ip = ip expected_fans = 2
self.raw_model = "M31S+ VG20"
self.expected_chips = 66
self.fan_count = 2
class M31SPlusVG30(WhatsMiner): # noqa - ignore ABC method implementation class M31SPlusVG30(WhatsMinerMake):
def __init__(self, ip: str, api_ver: str = "0.0.0"): raw_model = "M31S+ VG30"
super().__init__(ip, api_ver) expected_chips = 70
self.ip = ip expected_fans = 2
self.raw_model = "M31S+ VG30"
self.expected_chips = 70
self.fan_count = 2

View File

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

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