Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d271e0f9c8 | ||
|
|
8f1408ce17 | ||
|
|
a582ee63a0 | ||
|
|
db7c19c486 | ||
|
|
0995744d90 | ||
|
|
4073a27aba | ||
|
|
bec9c31c97 | ||
|
|
acdd615c53 | ||
|
|
8091617ee2 | ||
|
|
ce288e472f | ||
|
|
02d8f25daf | ||
|
|
a76d1c6149 | ||
|
|
17f5eade19 | ||
|
|
b6a2a5054b |
@@ -9,7 +9,7 @@
|
||||
[](https://github.com/UpstreamData/pyasic/commits/master/)
|
||||
|
||||
[](https://github.com/psf/black)
|
||||
[](https://pyasic.readthedocs.io/en/latest/)
|
||||
[](https://docs.pyasic.org)
|
||||
[](https://github.com/UpstreamData/pyasic/blob/master/LICENSE.txt)
|
||||
|
||||
---
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
Welcome to `pyasic`! `pyasic` uses an asynchronous method of communicating with ASIC miners on your network, which makes it super fast.
|
||||
|
||||
[Click here to view supported miner types](miners/supported_types.md)
|
||||
[Click here to view supported miner types](https://docs.pyasic.org/en/latest/miners/supported_types/)
|
||||
|
||||
---
|
||||
## Getting started
|
||||
|
||||
@@ -40,6 +40,7 @@ nav:
|
||||
- Antminer X15: "miners/antminer/X15.md"
|
||||
- Antminer X17: "miners/antminer/X17.md"
|
||||
- Antminer X19: "miners/antminer/X19.md"
|
||||
- Antminer X21: "miners/antminer/X21.md"
|
||||
- Avalon 7X: "miners/avalonminer/A7X.md"
|
||||
- Avalon 8X: "miners/avalonminer/A8X.md"
|
||||
- Avalon 9X: "miners/avalonminer/A9X.md"
|
||||
|
||||
@@ -54,9 +54,9 @@ class FanModeNormal(MinerConfigValue):
|
||||
return {
|
||||
"fans": {
|
||||
"Auto": {
|
||||
"Idle Speed": self.minimum_speed
|
||||
if not self.minimum_speed == 0
|
||||
else 100
|
||||
"Idle Speed": (
|
||||
self.minimum_speed if not self.minimum_speed == 0 else 100
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -327,9 +327,11 @@ class PoolGroup(MinerConfigValue):
|
||||
return cls(
|
||||
pools=[Pool.from_boser(p) for p in grpc_pool_group["pools"]],
|
||||
name=grpc_pool_group["name"],
|
||||
quota=grpc_pool_group["quota"]["value"]
|
||||
if grpc_pool_group.get("quota") is not None
|
||||
else 1,
|
||||
quota=(
|
||||
grpc_pool_group["quota"]["value"]
|
||||
if grpc_pool_group.get("quota") is not None
|
||||
else 1
|
||||
),
|
||||
)
|
||||
except LookupError:
|
||||
return cls()
|
||||
|
||||
22
pyasic/miners/antminer/epic/X21/S21.py
Normal file
22
pyasic/miners/antminer/epic/X21/S21.py
Normal file
@@ -0,0 +1,22 @@
|
||||
# ------------------------------------------------------------------------------
|
||||
# Copyright 2022 Upstream Data Inc -
|
||||
# -
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); -
|
||||
# you may not use this file except in compliance with the License. -
|
||||
# You may obtain a copy of the License at -
|
||||
# -
|
||||
# http://www.apache.org/licenses/LICENSE-2.0 -
|
||||
# -
|
||||
# Unless required by applicable law or agreed to in writing, software -
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, -
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
|
||||
# See the License for the specific language governing permissions and -
|
||||
# limitations under the License. -
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
from pyasic.miners.backends import ePIC
|
||||
from pyasic.miners.models import S21
|
||||
|
||||
|
||||
class ePICS21(ePIC, S21):
|
||||
pass
|
||||
19
pyasic/miners/antminer/epic/X21/__init__.py
Normal file
19
pyasic/miners/antminer/epic/X21/__init__.py
Normal file
@@ -0,0 +1,19 @@
|
||||
# ------------------------------------------------------------------------------
|
||||
# Copyright 2022 Upstream Data Inc -
|
||||
# -
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); -
|
||||
# you may not use this file except in compliance with the License. -
|
||||
# You may obtain a copy of the License at -
|
||||
# -
|
||||
# http://www.apache.org/licenses/LICENSE-2.0 -
|
||||
# -
|
||||
# Unless required by applicable law or agreed to in writing, software -
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, -
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
|
||||
# See the License for the specific language governing permissions and -
|
||||
# limitations under the License. -
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
from .S21 import (
|
||||
ePICS21,
|
||||
)
|
||||
@@ -15,3 +15,4 @@
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
from .X19 import *
|
||||
from .X21 import *
|
||||
|
||||
22
pyasic/miners/antminer/luxos/X19/S19.py
Normal file
22
pyasic/miners/antminer/luxos/X19/S19.py
Normal file
@@ -0,0 +1,22 @@
|
||||
# ------------------------------------------------------------------------------
|
||||
# Copyright 2022 Upstream Data Inc -
|
||||
# -
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); -
|
||||
# you may not use this file except in compliance with the License. -
|
||||
# You may obtain a copy of the License at -
|
||||
# -
|
||||
# http://www.apache.org/licenses/LICENSE-2.0 -
|
||||
# -
|
||||
# Unless required by applicable law or agreed to in writing, software -
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, -
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
|
||||
# See the License for the specific language governing permissions and -
|
||||
# limitations under the License. -
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
from pyasic.miners.backends import LUXMiner
|
||||
from pyasic.miners.models import S19
|
||||
|
||||
|
||||
class LUXMinerS19(LUXMiner, S19):
|
||||
pass
|
||||
17
pyasic/miners/antminer/luxos/X19/__init__.py
Normal file
17
pyasic/miners/antminer/luxos/X19/__init__.py
Normal file
@@ -0,0 +1,17 @@
|
||||
# ------------------------------------------------------------------------------
|
||||
# Copyright 2022 Upstream Data Inc -
|
||||
# -
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); -
|
||||
# you may not use this file except in compliance with the License. -
|
||||
# You may obtain a copy of the License at -
|
||||
# -
|
||||
# http://www.apache.org/licenses/LICENSE-2.0 -
|
||||
# -
|
||||
# Unless required by applicable law or agreed to in writing, software -
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, -
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
|
||||
# See the License for the specific language governing permissions and -
|
||||
# limitations under the License. -
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
from .S19 import LUXMinerS19
|
||||
@@ -15,3 +15,4 @@
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
from .X9 import *
|
||||
from .X19 import *
|
||||
|
||||
22
pyasic/miners/antminer/vnish/X7/L7.py
Normal file
22
pyasic/miners/antminer/vnish/X7/L7.py
Normal file
@@ -0,0 +1,22 @@
|
||||
# ------------------------------------------------------------------------------
|
||||
# Copyright 2022 Upstream Data Inc -
|
||||
# -
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); -
|
||||
# you may not use this file except in compliance with the License. -
|
||||
# You may obtain a copy of the License at -
|
||||
# -
|
||||
# http://www.apache.org/licenses/LICENSE-2.0 -
|
||||
# -
|
||||
# Unless required by applicable law or agreed to in writing, software -
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, -
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
|
||||
# See the License for the specific language governing permissions and -
|
||||
# limitations under the License. -
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
from pyasic.miners.backends import VNish
|
||||
from pyasic.miners.models import L7
|
||||
|
||||
|
||||
class VnishL7(VNish, L7):
|
||||
pass
|
||||
17
pyasic/miners/antminer/vnish/X7/__init__.py
Normal file
17
pyasic/miners/antminer/vnish/X7/__init__.py
Normal file
@@ -0,0 +1,17 @@
|
||||
# ------------------------------------------------------------------------------
|
||||
# Copyright 2022 Upstream Data Inc -
|
||||
# -
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); -
|
||||
# you may not use this file except in compliance with the License. -
|
||||
# You may obtain a copy of the License at -
|
||||
# -
|
||||
# http://www.apache.org/licenses/LICENSE-2.0 -
|
||||
# -
|
||||
# Unless required by applicable law or agreed to in writing, software -
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, -
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
|
||||
# See the License for the specific language governing permissions and -
|
||||
# limitations under the License. -
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
from .L7 import VnishL7
|
||||
@@ -15,5 +15,6 @@
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
from .X3 import *
|
||||
from .X7 import *
|
||||
from .X17 import *
|
||||
from .X19 import *
|
||||
|
||||
@@ -94,6 +94,7 @@ class AntminerModern(BMMiner):
|
||||
data_locations = ANTMINER_MODERN_DATA_LOC
|
||||
|
||||
supports_shutdown = True
|
||||
supports_power_modes = True
|
||||
|
||||
async def get_config(self) -> MinerConfig:
|
||||
data = await self.web.get_miner_conf()
|
||||
|
||||
@@ -124,6 +124,7 @@ class Auradine(BaseMiner):
|
||||
data_locations = AURADINE_DATA_LOC
|
||||
|
||||
supports_shutdown = True
|
||||
supports_power_modes = True
|
||||
supports_autotuning = True
|
||||
|
||||
async def fault_light_on(self) -> bool:
|
||||
|
||||
@@ -35,6 +35,7 @@ from pyasic.miners.data import (
|
||||
from pyasic.rpc.bosminer import BOSMinerRPCAPI
|
||||
from pyasic.ssh.braiins_os import BOSMinerSSH
|
||||
from pyasic.web.braiins_os import BOSerWebAPI, BOSMinerWebAPI
|
||||
from pyasic.web.braiins_os.proto.braiins.bos.v1 import SaveAction
|
||||
|
||||
BOSMINER_DATA_LOC = DataLocations(
|
||||
**{
|
||||
@@ -691,7 +692,9 @@ class BOSer(BaseMiner):
|
||||
|
||||
async def set_power_limit(self, wattage: int) -> bool:
|
||||
try:
|
||||
result = await self.web.set_power_target(wattage)
|
||||
result = await self.web.set_power_target(
|
||||
wattage, save_action=SaveAction.SAVE_ACTION_SAVE_AND_FORCE_APPLY
|
||||
)
|
||||
except APIError:
|
||||
return False
|
||||
|
||||
|
||||
@@ -119,6 +119,7 @@ class BTMiner(BaseMiner):
|
||||
data_locations = BTMINER_DATA_LOC
|
||||
|
||||
supports_shutdown = True
|
||||
supports_power_modes = True
|
||||
|
||||
async def _reset_rpc_pwd_to_admin(self, pwd: str):
|
||||
try:
|
||||
|
||||
@@ -51,7 +51,7 @@ EPIC_DATA_LOC = DataLocations(
|
||||
"_get_hashboards",
|
||||
[
|
||||
WebAPICommand("web_summary", "summary"),
|
||||
WebAPICommand("web_hashrate", "hashrate"),
|
||||
WebAPICommand("web_capabilities", "capabilities"),
|
||||
],
|
||||
),
|
||||
str(DataOptions.WATTAGE): DataFunction(
|
||||
@@ -284,7 +284,7 @@ class ePIC(BaseMiner):
|
||||
return fans
|
||||
|
||||
async def _get_hashboards(
|
||||
self, web_summary: dict = None, web_hashrate: dict = None
|
||||
self, web_summary: dict = None, web_capabilities: dict = None
|
||||
) -> List[HashBoard]:
|
||||
if web_summary is None:
|
||||
try:
|
||||
@@ -292,28 +292,25 @@ class ePIC(BaseMiner):
|
||||
except APIError:
|
||||
pass
|
||||
|
||||
if web_hashrate is not None:
|
||||
if web_capabilities is not None:
|
||||
try:
|
||||
web_hashrate = await self.web.hashrate()
|
||||
web_capabilities = await self.web.capabilities()
|
||||
except APIError:
|
||||
pass
|
||||
|
||||
hb_list = [
|
||||
HashBoard(slot=i, expected_chips=self.expected_chips)
|
||||
for i in range(self.expected_hashboards)
|
||||
]
|
||||
|
||||
if web_summary.get("HBs") is not None:
|
||||
for hb in web_summary["HBs"]:
|
||||
for hr in web_hashrate:
|
||||
if hr["Index"] == hb["Index"]:
|
||||
num_of_chips = len(hr["Data"])
|
||||
hashrate = hb["Hashrate"][0]
|
||||
# Update the Hashboard object
|
||||
hb_list[hr["Index"]].expected_chips = num_of_chips
|
||||
hb_list[hr["Index"]].missing = False
|
||||
hb_list[hr["Index"]].hashrate = round(hashrate / 1000000, 2)
|
||||
hb_list[hr["Index"]].chips = num_of_chips
|
||||
hb_list[hr["Index"]].temp = hb["Temperature"]
|
||||
num_of_chips = web_capabilities["Performance Estimator"]["Chip Count"]
|
||||
hashrate = hb["Hashrate"][0]
|
||||
# Update the Hashboard object
|
||||
hb_list[hb["Index"]].missing = False
|
||||
hb_list[hb["Index"]].hashrate = round(hashrate / 1000000, 2)
|
||||
hb_list[hb["Index"]].chips = num_of_chips
|
||||
hb_list[hb["Index"]].temp = hb["Temperature"]
|
||||
return hb_list
|
||||
|
||||
async def _is_mining(self, *args, **kwargs) -> Optional[bool]:
|
||||
|
||||
@@ -75,6 +75,7 @@ class GoldshellMiner(BFGMiner):
|
||||
data_locations = GOLDSHELL_DATA_LOC
|
||||
|
||||
supports_shutdown = True
|
||||
supports_power_modes = True
|
||||
|
||||
async def get_config(self) -> MinerConfig:
|
||||
# get pool data
|
||||
@@ -106,7 +107,7 @@ class GoldshellMiner(BFGMiner):
|
||||
)
|
||||
|
||||
settings = await self.web.setting()
|
||||
for idx, plan in settings["powerplans"]:
|
||||
for idx, plan in enumerate(settings["powerplans"]):
|
||||
if plan["level"] == cfg["settings"]["level"]:
|
||||
settings["select"] = idx
|
||||
await self.web.set_setting(settings)
|
||||
@@ -192,7 +193,7 @@ class GoldshellMiner(BFGMiner):
|
||||
mode = MiningModeConfig.sleep()
|
||||
cfg = mode.as_goldshell()
|
||||
level = cfg["settings"]["level"]
|
||||
for idx, plan in settings["powerplans"]:
|
||||
for idx, plan in enumerate(settings["powerplans"]):
|
||||
if plan["level"] == level:
|
||||
settings["select"] = idx
|
||||
await self.web.set_setting(settings)
|
||||
@@ -203,7 +204,7 @@ class GoldshellMiner(BFGMiner):
|
||||
mode = MiningModeConfig.normal()
|
||||
cfg = mode.as_goldshell()
|
||||
level = cfg["settings"]["level"]
|
||||
for idx, plan in settings["powerplans"]:
|
||||
for idx, plan in enumerate(settings["powerplans"]):
|
||||
if plan["level"] == level:
|
||||
settings["select"] = idx
|
||||
await self.web.set_setting(settings)
|
||||
|
||||
@@ -47,6 +47,7 @@ class MinerProtocol(Protocol):
|
||||
data_locations: DataLocations = None
|
||||
|
||||
supports_shutdown: bool = False
|
||||
supports_power_modes: bool = False
|
||||
supports_autotuning: bool = False
|
||||
|
||||
api_ver: str = None
|
||||
@@ -68,7 +69,12 @@ class MinerProtocol(Protocol):
|
||||
|
||||
@property
|
||||
def model(self) -> str:
|
||||
model_data = [self.raw_model if self.raw_model is not None else "Unknown"]
|
||||
if self.raw_model is not None:
|
||||
model_data = [self.raw_model]
|
||||
elif self.make is not None:
|
||||
model_data = [self.make]
|
||||
else:
|
||||
model_data = ["Unknown"]
|
||||
if self.firmware is not None:
|
||||
model_data.append(f"({self.firmware})")
|
||||
return " ".join(model_data)
|
||||
@@ -461,9 +467,11 @@ class MinerProtocol(Protocol):
|
||||
ip=str(self.ip),
|
||||
make=self.make,
|
||||
model=self.model,
|
||||
expected_chips=self.expected_chips * self.expected_hashboards
|
||||
if self.expected_chips is not None
|
||||
else 0,
|
||||
expected_chips=(
|
||||
self.expected_chips * self.expected_hashboards
|
||||
if self.expected_chips is not None
|
||||
else 0
|
||||
),
|
||||
expected_hashboards=self.expected_hashboards,
|
||||
hashboards=[
|
||||
HashBoard(slot=i, expected_chips=self.expected_chips)
|
||||
|
||||
@@ -47,6 +47,7 @@ from pyasic.miners.backends.unknown import UnknownMiner
|
||||
from pyasic.miners.base import AnyMiner
|
||||
from pyasic.miners.goldshell import *
|
||||
from pyasic.miners.innosilicon import *
|
||||
from pyasic.miners.makes import *
|
||||
from pyasic.miners.whatsminer import *
|
||||
|
||||
|
||||
@@ -66,7 +67,7 @@ class MinerTypes(enum.Enum):
|
||||
|
||||
MINER_CLASSES = {
|
||||
MinerTypes.ANTMINER: {
|
||||
None: BMMiner,
|
||||
None: type("AntminerUnknown", (BMMiner, AntMinerMake), {}),
|
||||
"ANTMINER D3": CGMinerD3,
|
||||
"ANTMINER HS3": BMMinerHS3,
|
||||
"ANTMINER L3+": BMMinerL3Plus,
|
||||
@@ -101,7 +102,7 @@ MINER_CLASSES = {
|
||||
"ANTMINER T19": BMMinerT19,
|
||||
},
|
||||
MinerTypes.WHATSMINER: {
|
||||
None: BTMiner,
|
||||
None: type("WhatsminerUnknown", (BTMiner, WhatsMinerMake), {}),
|
||||
"M20V10": BTMinerM20V10,
|
||||
"M20SV10": BTMinerM20SV10,
|
||||
"M20SV20": BTMinerM20SV20,
|
||||
@@ -317,7 +318,7 @@ MINER_CLASSES = {
|
||||
"M66SVK40": BTMinerM66SVK40,
|
||||
},
|
||||
MinerTypes.AVALONMINER: {
|
||||
None: AvalonMiner,
|
||||
None: type("AvalonUnknown", (AvalonMiner, AvalonMinerMake), {}),
|
||||
"AVALONMINER 721": CGMinerAvalon721,
|
||||
"AVALONMINER 741": CGMinerAvalon741,
|
||||
"AVALONMINER 761": CGMinerAvalon761,
|
||||
@@ -332,12 +333,12 @@ MINER_CLASSES = {
|
||||
"AVALONMINER 1246": CGMinerAvalon1246,
|
||||
},
|
||||
MinerTypes.INNOSILICON: {
|
||||
None: Innosilicon,
|
||||
None: type("InnosiliconUnknown", (Innosilicon, InnosiliconMake), {}),
|
||||
"T3H+": InnosiliconT3HPlus,
|
||||
"A10X": InnosiliconA10X,
|
||||
},
|
||||
MinerTypes.GOLDSHELL: {
|
||||
None: GoldshellMiner,
|
||||
None: type("GoldshellUnknown", (GoldshellMiner, GoldshellMake), {}),
|
||||
"GOLDSHELL CK5": GoldshellCK5,
|
||||
"GOLDSHELL HS5": GoldshellHS5,
|
||||
"GOLDSHELL KD5": GoldshellKD5,
|
||||
@@ -371,7 +372,9 @@ MINER_CLASSES = {
|
||||
},
|
||||
MinerTypes.VNISH: {
|
||||
None: VNish,
|
||||
"L3+": VnishL3Plus,
|
||||
"ANTMINER L3+": VnishL3Plus,
|
||||
"ANTMINER L7": VnishL7,
|
||||
"ANTMINER S17+": VNishS17Plus,
|
||||
"ANTMINER S17 PRO": VNishS17Pro,
|
||||
"ANTMINER S19": VNishS19,
|
||||
@@ -392,6 +395,7 @@ MINER_CLASSES = {
|
||||
"ANTMINER S19J PRO+": ePICS19jProPlus,
|
||||
"ANTMINER S19K PRO": ePICS19kPro,
|
||||
"ANTMINER S19 XP": ePICS19XP,
|
||||
"ANTMINER S21": ePICS21,
|
||||
},
|
||||
MinerTypes.HIVEON: {
|
||||
None: Hiveon,
|
||||
@@ -400,9 +404,10 @@ MINER_CLASSES = {
|
||||
MinerTypes.LUX_OS: {
|
||||
None: LUXMiner,
|
||||
"ANTMINER S9": LUXMinerS9,
|
||||
"ANTMINER S19": LUXMinerS19,
|
||||
},
|
||||
MinerTypes.AURADINE: {
|
||||
None: Auradine,
|
||||
None: type("GoldshellUnknown", (Auradine, AuradineMake), {}),
|
||||
"AT1500": AuradineFluxAT1500,
|
||||
"AT2860": AuradineFluxAT2860,
|
||||
"AT2880": AuradineFluxAT2880,
|
||||
@@ -498,7 +503,6 @@ class MinerFactory:
|
||||
)
|
||||
except asyncio.TimeoutError:
|
||||
pass
|
||||
|
||||
miner = self._select_miner_from_classes(
|
||||
ip,
|
||||
miner_type=miner_type,
|
||||
|
||||
23
pyasic/miners/models/antminer/X21/S21.py
Normal file
23
pyasic/miners/models/antminer/X21/S21.py
Normal file
@@ -0,0 +1,23 @@
|
||||
# ------------------------------------------------------------------------------
|
||||
# Copyright 2022 Upstream Data Inc -
|
||||
# -
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); -
|
||||
# you may not use this file except in compliance with the License. -
|
||||
# You may obtain a copy of the License at -
|
||||
# -
|
||||
# http://www.apache.org/licenses/LICENSE-2.0 -
|
||||
# -
|
||||
# Unless required by applicable law or agreed to in writing, software -
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, -
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
|
||||
# See the License for the specific language governing permissions and -
|
||||
# limitations under the License. -
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
from pyasic.miners.makes import AntMinerMake
|
||||
|
||||
|
||||
class S21(AntMinerMake):
|
||||
raw_model = "S21"
|
||||
expected_chips = 108
|
||||
expected_fans = 4
|
||||
19
pyasic/miners/models/antminer/X21/__init__.py
Normal file
19
pyasic/miners/models/antminer/X21/__init__.py
Normal file
@@ -0,0 +1,19 @@
|
||||
# ------------------------------------------------------------------------------
|
||||
# Copyright 2022 Upstream Data Inc -
|
||||
# -
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); -
|
||||
# you may not use this file except in compliance with the License. -
|
||||
# You may obtain a copy of the License at -
|
||||
# -
|
||||
# http://www.apache.org/licenses/LICENSE-2.0 -
|
||||
# -
|
||||
# Unless required by applicable law or agreed to in writing, software -
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, -
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
|
||||
# See the License for the specific language governing permissions and -
|
||||
# limitations under the License. -
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
from .S21 import (
|
||||
S21,
|
||||
)
|
||||
@@ -20,3 +20,4 @@ from .X9 import *
|
||||
from .X15 import *
|
||||
from .X17 import *
|
||||
from .X19 import *
|
||||
from .X21 import *
|
||||
|
||||
@@ -196,6 +196,7 @@ If you are sure you want to use this command please use API.send_command("{comma
|
||||
async def _send_bytes(
|
||||
self,
|
||||
data: bytes,
|
||||
*,
|
||||
port: int = None,
|
||||
timeout: int = 100,
|
||||
) -> bytes:
|
||||
|
||||
@@ -276,7 +276,7 @@ class BTMinerRPCAPI(BaseMinerRPCAPI):
|
||||
|
||||
logging.debug(f"{self} - (Send Privileged Command) - Sending")
|
||||
try:
|
||||
data = await self._send_bytes(enc_command, timeout)
|
||||
data = await self._send_bytes(enc_command, timeout=timeout)
|
||||
except (asyncio.CancelledError, asyncio.TimeoutError):
|
||||
if ignore_errors:
|
||||
return {}
|
||||
|
||||
@@ -73,7 +73,9 @@ class BOSMinerWebAPI(BaseWebAPI):
|
||||
login = {"luci_username": self.username, "luci_password": self.pwd}
|
||||
url = f"http://{self.ip}:{self.port}/cgi-bin/luci"
|
||||
headers = {
|
||||
"User-Agent": "BTC Tools v0.1", # only seems to respond if this user-agent is set
|
||||
"User-Agent": (
|
||||
"BTC Tools v0.1"
|
||||
), # only seems to respond if this user-agent is set
|
||||
"Content-Type": "application/x-www-form-urlencoded",
|
||||
}
|
||||
await session.post(url, headers=headers, data=login)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[tool.poetry]
|
||||
name = "pyasic"
|
||||
version = "0.52.1"
|
||||
version = "0.53.2"
|
||||
description = "A simplified and standardized interface for Bitcoin ASICs."
|
||||
authors = ["UpstreamData <brett@upstreamdata.ca>"]
|
||||
repository = "https://github.com/UpstreamData/pyasic"
|
||||
|
||||
Reference in New Issue
Block a user