Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bd9fd81b17 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -7,4 +7,3 @@ pyvenv.cfg
|
|||||||
bin/
|
bin/
|
||||||
lib/
|
lib/
|
||||||
.idea/
|
.idea/
|
||||||
.vs/
|
|
||||||
@@ -1,11 +1,10 @@
|
|||||||
ci:
|
ci:
|
||||||
skip:
|
skip:
|
||||||
- poetry-lock
|
- poetry-lock
|
||||||
- unittest
|
- pytest
|
||||||
- generate-docs
|
|
||||||
repos:
|
repos:
|
||||||
- repo: https://github.com/python-poetry/poetry
|
- repo: https://github.com/python-poetry/poetry
|
||||||
rev: 2.1.2
|
rev: 2.0.1
|
||||||
hooks:
|
hooks:
|
||||||
- id: poetry-check
|
- id: poetry-check
|
||||||
- id: poetry-lock
|
- id: poetry-lock
|
||||||
@@ -23,11 +22,11 @@ repos:
|
|||||||
exclude: ^mkdocs\.yml$
|
exclude: ^mkdocs\.yml$
|
||||||
- id: check-added-large-files
|
- id: check-added-large-files
|
||||||
- repo: https://github.com/psf/black
|
- repo: https://github.com/psf/black
|
||||||
rev: 25.1.0
|
rev: 24.10.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: black
|
- id: black
|
||||||
- repo: https://github.com/pycqa/isort
|
- repo: https://github.com/pycqa/isort
|
||||||
rev: 6.0.1
|
rev: 5.13.2
|
||||||
hooks:
|
hooks:
|
||||||
- id: isort
|
- id: isort
|
||||||
name: isort (python)
|
name: isort (python)
|
||||||
@@ -38,12 +37,6 @@ repos:
|
|||||||
name: unittest
|
name: unittest
|
||||||
entry: python -m unittest discover
|
entry: python -m unittest discover
|
||||||
language: system
|
language: system
|
||||||
types: [ python ]
|
'types': [python]
|
||||||
args: ["-p '*test.py'"] # Probably this option is absolutely not needed.
|
args: ["-p '*test.py'"] # Probably this option is absolutely not needed.
|
||||||
pass_filenames: false
|
pass_filenames: false
|
||||||
- id: generate-docs
|
|
||||||
name: generate-docs
|
|
||||||
entry: python docs/generate_miners.py
|
|
||||||
language: system
|
|
||||||
types: [ python ]
|
|
||||||
pass_filenames: false
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ Welcome to `pyasic`! `pyasic` uses an asynchronous method of communicating with
|
|||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
It is recommended to install `pyasic` in a [virtual environment](https://realpython.com/python-virtual-environments-a-primer/#what-other-popular-options-exist-aside-from-venv) to isolate it from the rest of your system. Options include:
|
It is recommended to install `pyasic` in a [virtual environment](https://realpython.com/python-virtual-environments-a-primer/#what-other-popular-options-exist-aside-from-venv) to isolate it from the rest of your system. Options include:
|
||||||
- [pypoetry](https://python-poetry.org/): the reccommended way, since pyasic already uses it by default. Use version 2.0+
|
- [pypoetry](https://python-poetry.org/): the reccommended way, since pyasic already uses it by default
|
||||||
|
|
||||||
```
|
```
|
||||||
poetry install
|
poetry install
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import asyncio
|
|||||||
import importlib
|
import importlib
|
||||||
import os
|
import os
|
||||||
import warnings
|
import warnings
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
from pyasic.miners.factory import MINER_CLASSES, MinerTypes
|
from pyasic.miners.factory import MINER_CLASSES, MinerTypes
|
||||||
|
|
||||||
@@ -52,19 +51,12 @@ def backend_str(backend: MinerTypes) -> str:
|
|||||||
return "Mara Firmware Miners"
|
return "Mara Firmware Miners"
|
||||||
case MinerTypes.BITAXE:
|
case MinerTypes.BITAXE:
|
||||||
return "Stock Firmware BitAxe Miners"
|
return "Stock Firmware BitAxe Miners"
|
||||||
case MinerTypes.LUCKYMINER:
|
|
||||||
return "Stock Firmware Lucky Miners"
|
|
||||||
case MinerTypes.ICERIVER:
|
case MinerTypes.ICERIVER:
|
||||||
return "Stock Firmware IceRiver Miners"
|
return "Stock Firmware IceRiver Miners"
|
||||||
case MinerTypes.HAMMER:
|
case MinerTypes.HAMMER:
|
||||||
return "Stock Firmware Hammer Miners"
|
return "Stock Firmware Hammer Miners"
|
||||||
case MinerTypes.VOLCMINER:
|
case MinerTypes.VOLCMINER:
|
||||||
return "Stock Firmware Volcminers"
|
return "Stock Firmware Volcminers"
|
||||||
case MinerTypes.ELPHAPEX:
|
|
||||||
return "Stock Firmware Elphapex Miners"
|
|
||||||
case MinerTypes.MSKMINER:
|
|
||||||
return "MSKMiner Firmware Miners"
|
|
||||||
raise TypeError("Unknown miner backend, cannot generate docs")
|
|
||||||
|
|
||||||
|
|
||||||
def create_url_str(mtype: str):
|
def create_url_str(mtype: str):
|
||||||
@@ -143,14 +135,14 @@ for m in MINER_CLASSES:
|
|||||||
done.append(miner)
|
done.append(miner)
|
||||||
|
|
||||||
|
|
||||||
def create_directory_structure(directory, data):
|
async def create_directory_structure(directory, data):
|
||||||
if not os.path.exists(directory):
|
if not os.path.exists(directory):
|
||||||
os.makedirs(directory)
|
os.makedirs(directory)
|
||||||
|
|
||||||
for key, value in data.items():
|
for key, value in data.items():
|
||||||
subdirectory = os.path.join(directory, key)
|
subdirectory = os.path.join(directory, key)
|
||||||
if isinstance(value, dict):
|
if isinstance(value, dict):
|
||||||
create_directory_structure(subdirectory, value)
|
await create_directory_structure(subdirectory, value)
|
||||||
elif isinstance(value, list):
|
elif isinstance(value, list):
|
||||||
file_path = os.path.join(subdirectory + ".md")
|
file_path = os.path.join(subdirectory + ".md")
|
||||||
|
|
||||||
@@ -171,7 +163,7 @@ def create_directory_structure(directory, data):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def create_supported_types(directory):
|
async def create_supported_types(directory):
|
||||||
with open(os.path.join(directory, "supported_types.md"), "w") as file:
|
with open(os.path.join(directory, "supported_types.md"), "w") as file:
|
||||||
file.write(SUPPORTED_TYPES_HEADER)
|
file.write(SUPPORTED_TYPES_HEADER)
|
||||||
for mback in MINER_CLASSES:
|
for mback in MINER_CLASSES:
|
||||||
@@ -188,7 +180,7 @@ def create_supported_types(directory):
|
|||||||
for mtype in backend_types:
|
for mtype in backend_types:
|
||||||
file.write(MINER_TYPE_HEADER.format(mtype))
|
file.write(MINER_TYPE_HEADER.format(mtype))
|
||||||
for minstance in backend_types[mtype]:
|
for minstance in backend_types[mtype]:
|
||||||
model = minstance("1.1.1.1").model
|
model = await minstance("1.1.1.1").get_model()
|
||||||
file.write(
|
file.write(
|
||||||
MINER_DETAILS.format(
|
MINER_DETAILS.format(
|
||||||
make(minstance), mtype, create_url_str(model), model
|
make(minstance), mtype, create_url_str(model), model
|
||||||
@@ -198,7 +190,6 @@ def create_supported_types(directory):
|
|||||||
file.write(BACKEND_TYPE_CLOSER)
|
file.write(BACKEND_TYPE_CLOSER)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
root_directory = os.path.join(os.getcwd(), "miners")
|
||||||
root_directory = Path(__file__).parent.joinpath("miners")
|
asyncio.run(create_directory_structure(root_directory, m_data))
|
||||||
create_directory_structure(root_directory, m_data)
|
asyncio.run(create_supported_types(root_directory))
|
||||||
create_supported_types(root_directory)
|
|
||||||
|
|||||||
@@ -157,19 +157,6 @@
|
|||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 0
|
heading_level: 0
|
||||||
|
|
||||||
## S19j Pro+ (Stock)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [x] Power Modes
|
|
||||||
- [ ] Setpoints
|
|
||||||
- [ ] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19jProPlus
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## S19j XP (Stock)
|
## S19j XP (Stock)
|
||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
@@ -183,19 +170,6 @@
|
|||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 0
|
heading_level: 0
|
||||||
|
|
||||||
## S19j+ (Stock)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [x] Power Modes
|
|
||||||
- [ ] Setpoints
|
|
||||||
- [ ] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19jPlus
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## S19j No PIC (Stock)
|
## S19j No PIC (Stock)
|
||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
@@ -313,19 +287,6 @@
|
|||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 0
|
heading_level: 0
|
||||||
|
|
||||||
## S19 XP Hydro (BOS+)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [x] Setpoints
|
|
||||||
- [ ] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19XPHydro
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## S19+ (BOS+)
|
## S19+ (BOS+)
|
||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
@@ -482,19 +443,6 @@
|
|||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 0
|
heading_level: 0
|
||||||
|
|
||||||
## S19 Hydro (VNish)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [x] Setpoints
|
|
||||||
- [x] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.vnish.X19.S19.VNishS19Hydro
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## S19 Pro (VNish)
|
## S19 Pro (VNish)
|
||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
@@ -508,19 +456,6 @@
|
|||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 0
|
heading_level: 0
|
||||||
|
|
||||||
## S19 Pro A (VNish)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [x] Setpoints
|
|
||||||
- [x] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.vnish.X19.S19.VNishS19ProA
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## S19 Pro Hydro (VNish)
|
## S19 Pro Hydro (VNish)
|
||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
@@ -534,32 +469,6 @@
|
|||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 0
|
heading_level: 0
|
||||||
|
|
||||||
## S19 XP (VNish)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [x] Setpoints
|
|
||||||
- [x] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.vnish.X19.S19.VNishS19XP
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## S19 XP Hydro (VNish)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [x] Setpoints
|
|
||||||
- [x] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.vnish.X19.S19.VNishS19XPHydro
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## S19a (VNish)
|
## S19a (VNish)
|
||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
@@ -586,19 +495,6 @@
|
|||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 0
|
heading_level: 0
|
||||||
|
|
||||||
## S19i (VNish)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [x] Setpoints
|
|
||||||
- [x] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.vnish.X19.S19.VNishS19i
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## S19j (VNish)
|
## S19j (VNish)
|
||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
@@ -768,19 +664,6 @@
|
|||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 0
|
heading_level: 0
|
||||||
|
|
||||||
## S19k Pro Dual (ePIC)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [ ] Setpoints
|
|
||||||
- [ ] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.epic.X19.S19.ePICS19kProDual
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## S19 (Hive)
|
## S19 (Hive)
|
||||||
|
|
||||||
- [ ] Shutdowns
|
- [ ] Shutdowns
|
||||||
@@ -807,50 +690,11 @@
|
|||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 0
|
heading_level: 0
|
||||||
|
|
||||||
## S19K Pro (Hive)
|
|
||||||
|
|
||||||
- [ ] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [ ] Setpoints
|
|
||||||
- [ ] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.hiveon.X19.S19.HiveonS19kPro
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## S19 No PIC (Hive)
|
|
||||||
|
|
||||||
- [ ] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [ ] Setpoints
|
|
||||||
- [ ] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.hiveon.X19.S19.HiveonS19NoPIC
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## S19 No PIC (Stock)
|
|
||||||
|
|
||||||
- [ ] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [ ] Setpoints
|
|
||||||
- [ ] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.mskminer.X19.S19.MSKMinerS19NoPIC
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## S19 (LuxOS)
|
## S19 (LuxOS)
|
||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [ ] Power Modes
|
- [ ] Power Modes
|
||||||
- [x] Setpoints
|
- [ ] Setpoints
|
||||||
- [x] Presets
|
- [x] Presets
|
||||||
|
|
||||||
::: pyasic.miners.antminer.luxos.X19.S19.LUXMinerS19
|
::: pyasic.miners.antminer.luxos.X19.S19.LUXMinerS19
|
||||||
@@ -863,7 +707,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [ ] Power Modes
|
- [ ] Power Modes
|
||||||
- [x] Setpoints
|
- [ ] Setpoints
|
||||||
- [x] Presets
|
- [x] Presets
|
||||||
|
|
||||||
::: pyasic.miners.antminer.luxos.X19.S19.LUXMinerS19Pro
|
::: pyasic.miners.antminer.luxos.X19.S19.LUXMinerS19Pro
|
||||||
@@ -876,7 +720,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [ ] Power Modes
|
- [ ] Power Modes
|
||||||
- [x] Setpoints
|
- [ ] Setpoints
|
||||||
- [x] Presets
|
- [x] Presets
|
||||||
|
|
||||||
::: pyasic.miners.antminer.luxos.X19.S19.LUXMinerS19XP
|
::: pyasic.miners.antminer.luxos.X19.S19.LUXMinerS19XP
|
||||||
@@ -889,7 +733,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [ ] Power Modes
|
- [ ] Power Modes
|
||||||
- [x] Setpoints
|
- [ ] Setpoints
|
||||||
- [x] Presets
|
- [x] Presets
|
||||||
|
|
||||||
::: pyasic.miners.antminer.luxos.X19.S19.LUXMinerS19jPro
|
::: pyasic.miners.antminer.luxos.X19.S19.LUXMinerS19jPro
|
||||||
@@ -902,7 +746,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [ ] Power Modes
|
- [ ] Power Modes
|
||||||
- [x] Setpoints
|
- [ ] Setpoints
|
||||||
- [x] Presets
|
- [x] Presets
|
||||||
|
|
||||||
::: pyasic.miners.antminer.luxos.X19.S19.LUXMinerS19jProPlus
|
::: pyasic.miners.antminer.luxos.X19.S19.LUXMinerS19jProPlus
|
||||||
@@ -915,7 +759,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [ ] Power Modes
|
- [ ] Power Modes
|
||||||
- [x] Setpoints
|
- [ ] Setpoints
|
||||||
- [x] Presets
|
- [x] Presets
|
||||||
|
|
||||||
::: pyasic.miners.antminer.luxos.X19.S19.LUXMinerS19kPro
|
::: pyasic.miners.antminer.luxos.X19.S19.LUXMinerS19kPro
|
||||||
@@ -928,7 +772,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [ ] Power Modes
|
- [ ] Power Modes
|
||||||
- [x] Setpoints
|
- [ ] Setpoints
|
||||||
- [x] Presets
|
- [x] Presets
|
||||||
|
|
||||||
::: pyasic.miners.antminer.luxos.X19.T19.LUXMinerT19
|
::: pyasic.miners.antminer.luxos.X19.T19.LUXMinerT19
|
||||||
|
|||||||
@@ -14,19 +14,6 @@
|
|||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 0
|
heading_level: 0
|
||||||
|
|
||||||
## S21 Hydro (Stock)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [x] Power Modes
|
|
||||||
- [ ] Setpoints
|
|
||||||
- [ ] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.bmminer.X21.S21.BMMinerS21Hydro
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## S21 Pro (Stock)
|
## S21 Pro (Stock)
|
||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
@@ -40,32 +27,6 @@
|
|||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 0
|
heading_level: 0
|
||||||
|
|
||||||
## S21+ (Stock)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [x] Power Modes
|
|
||||||
- [ ] Setpoints
|
|
||||||
- [ ] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.bmminer.X21.S21.BMMinerS21Plus
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## S21+ Hydro (Stock)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [x] Power Modes
|
|
||||||
- [ ] Setpoints
|
|
||||||
- [ ] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.bmminer.X21.S21.BMMinerS21PlusHydro
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## T21 (Stock)
|
## T21 (Stock)
|
||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
@@ -92,58 +53,6 @@
|
|||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 0
|
heading_level: 0
|
||||||
|
|
||||||
## S21 Hydro (BOS+)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [x] Setpoints
|
|
||||||
- [ ] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.bosminer.X21.S21.BOSMinerS21Hydro
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## S21 Pro (BOS+)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [x] Setpoints
|
|
||||||
- [ ] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.bosminer.X21.S21.BOSMinerS21Pro
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## S21+ (BOS+)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [x] Setpoints
|
|
||||||
- [ ] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.bosminer.X21.S21.BOSMinerS21Plus
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## S21+ Hydro (BOS+)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [x] Setpoints
|
|
||||||
- [ ] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.bosminer.X21.S21.BOSMinerS21PlusHydro
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## T21 (BOS+)
|
## T21 (BOS+)
|
||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
@@ -170,58 +79,6 @@
|
|||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 0
|
heading_level: 0
|
||||||
|
|
||||||
## S21 Hydro (VNish)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [x] Setpoints
|
|
||||||
- [x] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.vnish.X21.S21.VNishS21Hydro
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## S21 Pro (VNish)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [x] Setpoints
|
|
||||||
- [x] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.vnish.X21.S21.VNishS21Pro
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## S21+ (VNish)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [x] Setpoints
|
|
||||||
- [x] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.vnish.X21.S21.VNishS21Plus
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## S21+ Hydro (VNish)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [x] Setpoints
|
|
||||||
- [x] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.vnish.X21.S21.VNishS21PlusHydro
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## T21 (VNish)
|
## T21 (VNish)
|
||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
@@ -278,7 +135,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [ ] Power Modes
|
- [ ] Power Modes
|
||||||
- [x] Setpoints
|
- [ ] Setpoints
|
||||||
- [x] Presets
|
- [x] Presets
|
||||||
|
|
||||||
::: pyasic.miners.antminer.luxos.X21.S21.LUXMinerS21
|
::: pyasic.miners.antminer.luxos.X21.S21.LUXMinerS21
|
||||||
@@ -287,19 +144,6 @@
|
|||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 0
|
heading_level: 0
|
||||||
|
|
||||||
## T21 (LuxOS)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [x] Setpoints
|
|
||||||
- [x] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.luxos.X21.T21.LUXMinerT21
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## S21 (MaraFW)
|
## S21 (MaraFW)
|
||||||
|
|
||||||
- [ ] Shutdowns
|
- [ ] Shutdowns
|
||||||
|
|||||||
@@ -73,7 +73,7 @@
|
|||||||
- [x] Setpoints
|
- [x] Setpoints
|
||||||
- [x] Presets
|
- [x] Presets
|
||||||
|
|
||||||
::: pyasic.miners.antminer.vnish.X3.L3.VNishL3Plus
|
::: pyasic.miners.antminer.vnish.X3.L3.VnishL3Plus
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
|
|||||||
@@ -47,7 +47,7 @@
|
|||||||
- [x] Setpoints
|
- [x] Setpoints
|
||||||
- [x] Presets
|
- [x] Presets
|
||||||
|
|
||||||
::: pyasic.miners.antminer.vnish.X7.L7.VNishL7
|
::: pyasic.miners.antminer.vnish.X7.L7.VnishL7
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
|
|||||||
@@ -105,19 +105,6 @@
|
|||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 0
|
heading_level: 0
|
||||||
|
|
||||||
## L9 (VNish)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [x] Setpoints
|
|
||||||
- [x] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.antminer.vnish.X9.L9.VNishL9
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## T9 (Hive)
|
## T9 (Hive)
|
||||||
|
|
||||||
- [ ] Shutdowns
|
- [ ] Shutdowns
|
||||||
@@ -135,7 +122,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [ ] Power Modes
|
- [ ] Power Modes
|
||||||
- [x] Setpoints
|
- [ ] Setpoints
|
||||||
- [x] Presets
|
- [x] Presets
|
||||||
|
|
||||||
::: pyasic.miners.antminer.luxos.X9.S9.LUXMinerS9
|
::: pyasic.miners.antminer.luxos.X9.S9.LUXMinerS9
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
# pyasic
|
|
||||||
## A15X Models
|
|
||||||
|
|
||||||
## Avalon 1566 (Stock)
|
|
||||||
|
|
||||||
- [ ] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [ ] Setpoints
|
|
||||||
- [ ] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.avalonminer.cgminer.A15X.A1566.CGMinerAvalon1566
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
@@ -1,19 +1,6 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## nano Models
|
## nano Models
|
||||||
|
|
||||||
## Avalon Nano 3s (Stock)
|
|
||||||
|
|
||||||
- [ ] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [ ] Setpoints
|
|
||||||
- [ ] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.avalonminer.cgminer.nano.nano3.CGMinerAvalonNano3s
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## Avalon Nano 3 (Stock)
|
## Avalon Nano 3 (Stock)
|
||||||
|
|
||||||
- [ ] Shutdowns
|
- [ ] Shutdowns
|
||||||
|
|||||||
@@ -27,16 +27,3 @@
|
|||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 0
|
heading_level: 0
|
||||||
|
|
||||||
## BlockMiner eLITE 1.0 (ePIC)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [ ] Setpoints
|
|
||||||
- [ ] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.blockminer.epic.blockminer.blockminer.ePICBlockMinerELITE1
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
# pyasic
|
|
||||||
## DGX Models
|
|
||||||
|
|
||||||
## DG1 (Stock)
|
|
||||||
|
|
||||||
- [ ] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [ ] Setpoints
|
|
||||||
- [ ] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.elphapex.daoge.DGX.DG1.ElphapexDG1
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## DG1+ (Stock)
|
|
||||||
|
|
||||||
- [ ] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [ ] Setpoints
|
|
||||||
- [ ] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.elphapex.daoge.DGX.DG1.ElphapexDG1Plus
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## DG1Home (Stock)
|
|
||||||
|
|
||||||
- [ ] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [ ] Setpoints
|
|
||||||
- [ ] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.elphapex.daoge.DGX.DG1.ElphapexDG1Home
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
# pyasic
|
|
||||||
## Byte Models
|
|
||||||
|
|
||||||
## Byte (Stock)
|
|
||||||
|
|
||||||
- [x] Shutdowns
|
|
||||||
- [x] Power Modes
|
|
||||||
- [ ] Setpoints
|
|
||||||
- [ ] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.goldshell.bfgminer.Byte.Byte.GoldshellByte
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
# pyasic
|
|
||||||
## LV Models
|
|
||||||
|
|
||||||
## LV07 (Stock)
|
|
||||||
|
|
||||||
- [ ] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [ ] Setpoints
|
|
||||||
- [ ] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.luckyminer.espminer.LV.LV07.LuckyMinerLV07
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
## LV08 (Stock)
|
|
||||||
|
|
||||||
- [ ] Shutdowns
|
|
||||||
- [ ] Power Modes
|
|
||||||
- [ ] Setpoints
|
|
||||||
- [ ] Presets
|
|
||||||
|
|
||||||
::: pyasic.miners.luckyminer.espminer.LV.LV08.LuckyMinerLV08
|
|
||||||
handler: python
|
|
||||||
options:
|
|
||||||
show_root_heading: false
|
|
||||||
heading_level: 0
|
|
||||||
|
|
||||||
@@ -53,7 +53,6 @@ details {
|
|||||||
<li><a href="../antminer/X9#s9j-stock">S9j (Stock)</a></li>
|
<li><a href="../antminer/X9#s9j-stock">S9j (Stock)</a></li>
|
||||||
<li><a href="../antminer/X9#t9-stock">T9 (Stock)</a></li>
|
<li><a href="../antminer/X9#t9-stock">T9 (Stock)</a></li>
|
||||||
<li><a href="../antminer/X9#l9-stock">L9 (Stock)</a></li>
|
<li><a href="../antminer/X9#l9-stock">L9 (Stock)</a></li>
|
||||||
<li><a href="../antminer/X9#l9-stock">L9 (Stock)</a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
@@ -87,8 +86,6 @@ details {
|
|||||||
<li><a href="../antminer/X19#s19j-no-pic-stock">S19j No PIC (Stock)</a></li>
|
<li><a href="../antminer/X19#s19j-no-pic-stock">S19j No PIC (Stock)</a></li>
|
||||||
<li><a href="../antminer/X19#s19-pro_1-stock">S19 Pro+ (Stock)</a></li>
|
<li><a href="../antminer/X19#s19-pro_1-stock">S19 Pro+ (Stock)</a></li>
|
||||||
<li><a href="../antminer/X19#s19j-pro-stock">S19j Pro (Stock)</a></li>
|
<li><a href="../antminer/X19#s19j-pro-stock">S19j Pro (Stock)</a></li>
|
||||||
<li><a href="../antminer/X19#s19j_1-stock">S19j+ (Stock)</a></li>
|
|
||||||
<li><a href="../antminer/X19#s19j-pro_1-stock">S19j Pro+ (Stock)</a></li>
|
|
||||||
<li><a href="../antminer/X19#s19-xp-stock">S19 XP (Stock)</a></li>
|
<li><a href="../antminer/X19#s19-xp-stock">S19 XP (Stock)</a></li>
|
||||||
<li><a href="../antminer/X19#s19a-stock">S19a (Stock)</a></li>
|
<li><a href="../antminer/X19#s19a-stock">S19a (Stock)</a></li>
|
||||||
<li><a href="../antminer/X19#s19a-pro-stock">S19a Pro (Stock)</a></li>
|
<li><a href="../antminer/X19#s19a-pro-stock">S19a Pro (Stock)</a></li>
|
||||||
@@ -106,12 +103,8 @@ details {
|
|||||||
<li><a href="../antminer/X21#s21-stock">S21 (Stock)</a></li>
|
<li><a href="../antminer/X21#s21-stock">S21 (Stock)</a></li>
|
||||||
<li><a href="../antminer/X21#s21-stock">S21 (Stock)</a></li>
|
<li><a href="../antminer/X21#s21-stock">S21 (Stock)</a></li>
|
||||||
<li><a href="../antminer/X21#s21-stock">S21 (Stock)</a></li>
|
<li><a href="../antminer/X21#s21-stock">S21 (Stock)</a></li>
|
||||||
<li><a href="../antminer/X21#s21_1-stock">S21+ (Stock)</a></li>
|
|
||||||
<li><a href="../antminer/X21#s21_1-hydro-stock">S21+ Hydro (Stock)</a></li>
|
|
||||||
<li><a href="../antminer/X21#s21_1-hydro-stock">S21+ Hydro (Stock)</a></li>
|
|
||||||
<li><a href="../antminer/X21#s21-pro-stock">S21 Pro (Stock)</a></li>
|
<li><a href="../antminer/X21#s21-pro-stock">S21 Pro (Stock)</a></li>
|
||||||
<li><a href="../antminer/X21#t21-stock">T21 (Stock)</a></li>
|
<li><a href="../antminer/X21#t21-stock">T21 (Stock)</a></li>
|
||||||
<li><a href="../antminer/X21#s21-hydro-stock">S21 Hydro (Stock)</a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -558,19 +551,6 @@ details {
|
|||||||
<summary>nano Series:</summary>
|
<summary>nano Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../avalonminer/nano#avalon-nano-3-stock">Avalon Nano 3 (Stock)</a></li>
|
<li><a href="../avalonminer/nano#avalon-nano-3-stock">Avalon Nano 3 (Stock)</a></li>
|
||||||
<li><a href="../avalonminer/nano#avalon-nano-3s-stock">Avalon Nano 3s (Stock)</a></li>
|
|
||||||
</ul>
|
|
||||||
</details>
|
|
||||||
<details>
|
|
||||||
<summary>A15X Series:</summary>
|
|
||||||
<ul>
|
|
||||||
<li><a href="../avalonminer/A15X#avalon-1566-stock">Avalon 1566 (Stock)</a></li>
|
|
||||||
</ul>
|
|
||||||
</details>
|
|
||||||
<details>
|
|
||||||
<summary>Q Series:</summary>
|
|
||||||
<ul>
|
|
||||||
<li><a href="../avalonminer/Q#avalon-q-home-stock">Avalon Q Home (Stock)</a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -623,12 +603,6 @@ details {
|
|||||||
<li><a href="../goldshell/XBox#kd-box-pro-stock">KD Box Pro (Stock)</a></li>
|
<li><a href="../goldshell/XBox#kd-box-pro-stock">KD Box Pro (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
|
||||||
<summary>Byte Series:</summary>
|
|
||||||
<ul>
|
|
||||||
<li><a href="../goldshell/Byte#byte-stock">Byte (Stock)</a></li>
|
|
||||||
</ul>
|
|
||||||
</details>
|
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
@@ -672,17 +646,12 @@ details {
|
|||||||
<li><a href="../antminer/X19#s19-xp-bos_1">S19 XP (BOS+)</a></li>
|
<li><a href="../antminer/X19#s19-xp-bos_1">S19 XP (BOS+)</a></li>
|
||||||
<li><a href="../antminer/X19#s19-pro_1-hydro-bos_1">S19 Pro+ Hydro (BOS+)</a></li>
|
<li><a href="../antminer/X19#s19-pro_1-hydro-bos_1">S19 Pro+ Hydro (BOS+)</a></li>
|
||||||
<li><a href="../antminer/X19#t19-bos_1">T19 (BOS+)</a></li>
|
<li><a href="../antminer/X19#t19-bos_1">T19 (BOS+)</a></li>
|
||||||
<li><a href="../antminer/X19#s19-xp-hydro-bos_1">S19 XP Hydro (BOS+)</a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>X21 Series:</summary>
|
<summary>X21 Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../antminer/X21#s21-bos_1">S21 (BOS+)</a></li>
|
<li><a href="../antminer/X21#s21-bos_1">S21 (BOS+)</a></li>
|
||||||
<li><a href="../antminer/X21#s21-pro-bos_1">S21 Pro (BOS+)</a></li>
|
|
||||||
<li><a href="../antminer/X21#s21_1-bos_1">S21+ (BOS+)</a></li>
|
|
||||||
<li><a href="../antminer/X21#s21_1-hydro-bos_1">S21+ Hydro (BOS+)</a></li>
|
|
||||||
<li><a href="../antminer/X21#s21-hydro-bos_1">S21 Hydro (BOS+)</a></li>
|
|
||||||
<li><a href="../antminer/X21#t21-bos_1">T21 (BOS+)</a></li>
|
<li><a href="../antminer/X21#t21-bos_1">T21 (BOS+)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
@@ -711,12 +680,6 @@ details {
|
|||||||
<li><a href="../antminer/X7#l7-vnish">L7 (VNish)</a></li>
|
<li><a href="../antminer/X7#l7-vnish">L7 (VNish)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
|
||||||
<summary>X9 Series:</summary>
|
|
||||||
<ul>
|
|
||||||
<li><a href="../antminer/X9#l9-vnish">L9 (VNish)</a></li>
|
|
||||||
</ul>
|
|
||||||
</details>
|
|
||||||
<details>
|
<details>
|
||||||
<summary>X17 Series:</summary>
|
<summary>X17 Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
@@ -731,17 +694,11 @@ details {
|
|||||||
<li><a href="../antminer/X19#s19-no-pic-vnish">S19 No PIC (VNish)</a></li>
|
<li><a href="../antminer/X19#s19-no-pic-vnish">S19 No PIC (VNish)</a></li>
|
||||||
<li><a href="../antminer/X19#s19-pro-vnish">S19 Pro (VNish)</a></li>
|
<li><a href="../antminer/X19#s19-pro-vnish">S19 Pro (VNish)</a></li>
|
||||||
<li><a href="../antminer/X19#s19j-vnish">S19j (VNish)</a></li>
|
<li><a href="../antminer/X19#s19j-vnish">S19j (VNish)</a></li>
|
||||||
<li><a href="../antminer/X19#s19i-vnish">S19i (VNish)</a></li>
|
|
||||||
<li><a href="../antminer/X19#s19-xp-vnish">S19 XP (VNish)</a></li>
|
|
||||||
<li><a href="../antminer/X19#s19-xp-hydro-vnish">S19 XP Hydro (VNish)</a></li>
|
|
||||||
<li><a href="../antminer/X19#s19j-pro-vnish">S19j Pro (VNish)</a></li>
|
<li><a href="../antminer/X19#s19j-pro-vnish">S19j Pro (VNish)</a></li>
|
||||||
<li><a href="../antminer/X19#s19j-pro-vnish">S19j Pro (VNish)</a></li>
|
<li><a href="../antminer/X19#s19j-pro-vnish">S19j Pro (VNish)</a></li>
|
||||||
<li><a href="../antminer/X19#s19j-pro-vnish">S19j Pro (VNish)</a></li>
|
<li><a href="../antminer/X19#s19j-pro-vnish">S19j Pro (VNish)</a></li>
|
||||||
<li><a href="../antminer/X19#s19a-vnish">S19a (VNish)</a></li>
|
<li><a href="../antminer/X19#s19a-vnish">S19a (VNish)</a></li>
|
||||||
<li><a href="../antminer/X19#s19-hydro-vnish">S19 Hydro (VNish)</a></li>
|
|
||||||
<li><a href="../antminer/X19#s19a-pro-vnish">S19a Pro (VNish)</a></li>
|
<li><a href="../antminer/X19#s19a-pro-vnish">S19a Pro (VNish)</a></li>
|
||||||
<li><a href="../antminer/X19#s19-pro-a-vnish">S19 Pro A (VNish)</a></li>
|
|
||||||
<li><a href="../antminer/X19#s19-pro-hydro-vnish">S19 Pro Hydro (VNish)</a></li>
|
|
||||||
<li><a href="../antminer/X19#s19-pro-hydro-vnish">S19 Pro Hydro (VNish)</a></li>
|
<li><a href="../antminer/X19#s19-pro-hydro-vnish">S19 Pro Hydro (VNish)</a></li>
|
||||||
<li><a href="../antminer/X19#s19k-pro-vnish">S19k Pro (VNish)</a></li>
|
<li><a href="../antminer/X19#s19k-pro-vnish">S19k Pro (VNish)</a></li>
|
||||||
<li><a href="../antminer/X19#t19-vnish">T19 (VNish)</a></li>
|
<li><a href="../antminer/X19#t19-vnish">T19 (VNish)</a></li>
|
||||||
@@ -752,10 +709,6 @@ details {
|
|||||||
<ul>
|
<ul>
|
||||||
<li><a href="../antminer/X21#t21-vnish">T21 (VNish)</a></li>
|
<li><a href="../antminer/X21#t21-vnish">T21 (VNish)</a></li>
|
||||||
<li><a href="../antminer/X21#s21-vnish">S21 (VNish)</a></li>
|
<li><a href="../antminer/X21#s21-vnish">S21 (VNish)</a></li>
|
||||||
<li><a href="../antminer/X21#s21_1-vnish">S21+ (VNish)</a></li>
|
|
||||||
<li><a href="../antminer/X21#s21_1-hydro-vnish">S21+ Hydro (VNish)</a></li>
|
|
||||||
<li><a href="../antminer/X21#s21-pro-vnish">S21 Pro (VNish)</a></li>
|
|
||||||
<li><a href="../antminer/X21#s21-hydro-vnish">S21 Hydro (VNish)</a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -774,7 +727,6 @@ details {
|
|||||||
<li><a href="../antminer/X19#s19k-pro-epic">S19k Pro (ePIC)</a></li>
|
<li><a href="../antminer/X19#s19k-pro-epic">S19k Pro (ePIC)</a></li>
|
||||||
<li><a href="../antminer/X19#s19-xp-epic">S19 XP (ePIC)</a></li>
|
<li><a href="../antminer/X19#s19-xp-epic">S19 XP (ePIC)</a></li>
|
||||||
<li><a href="../antminer/X19#s19j-pro-dual-epic">S19j Pro Dual (ePIC)</a></li>
|
<li><a href="../antminer/X19#s19j-pro-dual-epic">S19j Pro Dual (ePIC)</a></li>
|
||||||
<li><a href="../antminer/X19#s19k-pro-dual-epic">S19k Pro Dual (ePIC)</a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
@@ -790,7 +742,6 @@ details {
|
|||||||
<ul>
|
<ul>
|
||||||
<li><a href="../blockminer/blockminer#blockminer-520i-epic">BlockMiner 520i (ePIC)</a></li>
|
<li><a href="../blockminer/blockminer#blockminer-520i-epic">BlockMiner 520i (ePIC)</a></li>
|
||||||
<li><a href="../blockminer/blockminer#blockminer-720i-epic">BlockMiner 720i (ePIC)</a></li>
|
<li><a href="../blockminer/blockminer#blockminer-720i-epic">BlockMiner 720i (ePIC)</a></li>
|
||||||
<li><a href="../blockminer/blockminer#blockminer-elite-1.0-epic">BlockMiner eLITE 1.0 (ePIC)</a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -809,19 +760,6 @@ details {
|
|||||||
<ul>
|
<ul>
|
||||||
<li><a href="../antminer/X19#s19j-pro-hive">S19j Pro (Hive)</a></li>
|
<li><a href="../antminer/X19#s19j-pro-hive">S19j Pro (Hive)</a></li>
|
||||||
<li><a href="../antminer/X19#s19-hive">S19 (Hive)</a></li>
|
<li><a href="../antminer/X19#s19-hive">S19 (Hive)</a></li>
|
||||||
<li><a href="../antminer/X19#s19k-pro-hive">S19K Pro (Hive)</a></li>
|
|
||||||
<li><a href="../antminer/X19#s19-no-pic-hive">S19 No PIC (Hive)</a></li>
|
|
||||||
</ul>
|
|
||||||
</details>
|
|
||||||
</ul>
|
|
||||||
</details>
|
|
||||||
<details>
|
|
||||||
<summary>MSKMiner Firmware Miners:</summary>
|
|
||||||
<ul>
|
|
||||||
<details>
|
|
||||||
<summary>X19 Series:</summary>
|
|
||||||
<ul>
|
|
||||||
<li><a href="../antminer/X19#s19-no-pic-stock">S19 No PIC (Stock)</a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -851,7 +789,6 @@ details {
|
|||||||
<summary>X21 Series:</summary>
|
<summary>X21 Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../antminer/X21#s21-luxos">S21 (LuxOS)</a></li>
|
<li><a href="../antminer/X21#s21-luxos">S21 (LuxOS)</a></li>
|
||||||
<li><a href="../antminer/X21#t21-luxos">T21 (LuxOS)</a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -922,18 +859,6 @@ details {
|
|||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>Stock Firmware Lucky Miners:</summary>
|
|
||||||
<ul>
|
|
||||||
<details>
|
|
||||||
<summary>LV Series:</summary>
|
|
||||||
<ul>
|
|
||||||
<li><a href="../luckyminer/LV#lv08-stock">LV08 (Stock)</a></li>
|
|
||||||
<li><a href="../luckyminer/LV#lv07-stock">LV07 (Stock)</a></li>
|
|
||||||
</ul>
|
|
||||||
</details>
|
|
||||||
</ul>
|
|
||||||
</details>
|
|
||||||
<details>
|
|
||||||
<summary>Stock Firmware IceRiver Miners:</summary>
|
<summary>Stock Firmware IceRiver Miners:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<details>
|
<details>
|
||||||
@@ -950,12 +875,6 @@ details {
|
|||||||
<li><a href="../iceriver/KSX#ks5m-stock">KS5M (Stock)</a></li>
|
<li><a href="../iceriver/KSX#ks5m-stock">KS5M (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
|
||||||
<summary>ALX Series:</summary>
|
|
||||||
<ul>
|
|
||||||
<li><a href="../iceriver/ALX#al3-stock">AL3 (Stock)</a></li>
|
|
||||||
</ul>
|
|
||||||
</details>
|
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
@@ -979,17 +898,4 @@ details {
|
|||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
|
||||||
<details>
|
|
||||||
<summary>Stock Firmware Elphapex Miners:</summary>
|
|
||||||
<ul>
|
|
||||||
<details>
|
|
||||||
<summary>DGX Series:</summary>
|
|
||||||
<ul>
|
|
||||||
<li><a href="../elphapex/DGX#dg1_1-stock">DG1+ (Stock)</a></li>
|
|
||||||
<li><a href="../elphapex/DGX#dg1-stock">DG1 (Stock)</a></li>
|
|
||||||
<li><a href="../elphapex/DGX#dg1home-stock">DG1Home (Stock)</a></li>
|
|
||||||
</ul>
|
|
||||||
</details>
|
|
||||||
</ul>
|
|
||||||
</details>
|
</details>
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVK10
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVK10
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVK20
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVK20
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVK30
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVK30
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVK40
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVK40
|
||||||
@@ -57,7 +57,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVK50
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVK50
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVK60
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVK60
|
||||||
@@ -83,7 +83,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVL20
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVL20
|
||||||
@@ -96,7 +96,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVL30
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVL30
|
||||||
@@ -109,7 +109,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVL40
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVL40
|
||||||
@@ -122,7 +122,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVL50
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVL50
|
||||||
@@ -135,7 +135,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVL60
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVL60
|
||||||
@@ -148,7 +148,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVH30
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVH30
|
||||||
@@ -161,7 +161,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVH40
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVH40
|
||||||
@@ -174,7 +174,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVJ30
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVJ30
|
||||||
@@ -187,7 +187,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVJ40
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVJ40
|
||||||
@@ -200,7 +200,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVJ60
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVJ60
|
||||||
@@ -213,7 +213,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVK10
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVK10
|
||||||
@@ -226,7 +226,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVK20
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVK20
|
||||||
@@ -239,7 +239,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVK30
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVK30
|
||||||
@@ -252,7 +252,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVL10
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVL10
|
||||||
@@ -265,7 +265,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVL20
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVL20
|
||||||
@@ -278,7 +278,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVL30
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVL30
|
||||||
@@ -291,7 +291,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH10
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH10
|
||||||
@@ -304,7 +304,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH20
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH20
|
||||||
@@ -317,7 +317,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH30
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH30
|
||||||
@@ -330,7 +330,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH40
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH40
|
||||||
@@ -343,7 +343,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH50
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH50
|
||||||
@@ -356,7 +356,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVJ10
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVJ10
|
||||||
@@ -369,7 +369,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVJ20
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVJ20
|
||||||
@@ -382,7 +382,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVJ30
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVJ30
|
||||||
@@ -395,7 +395,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVJ40
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVJ40
|
||||||
@@ -408,7 +408,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVJ50
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVJ50
|
||||||
@@ -421,7 +421,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVK10
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVK10
|
||||||
@@ -434,7 +434,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVK20
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVK20
|
||||||
@@ -447,7 +447,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVK30
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVK30
|
||||||
@@ -460,7 +460,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVK50
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVK50
|
||||||
@@ -473,7 +473,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVK60
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVK60
|
||||||
@@ -486,7 +486,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVK70
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVK70
|
||||||
@@ -499,7 +499,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVK80
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVK80
|
||||||
@@ -512,7 +512,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVL20
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVL20
|
||||||
@@ -525,7 +525,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVL30
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVL30
|
||||||
@@ -538,7 +538,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VE30
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VE30
|
||||||
@@ -551,7 +551,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VG30
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VG30
|
||||||
@@ -564,7 +564,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH10
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH10
|
||||||
@@ -577,7 +577,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH20
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH20
|
||||||
@@ -590,7 +590,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH30
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH30
|
||||||
@@ -603,7 +603,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH40
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH40
|
||||||
@@ -616,7 +616,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH50
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH50
|
||||||
@@ -629,7 +629,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH60
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH60
|
||||||
@@ -642,7 +642,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH70
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH70
|
||||||
@@ -655,7 +655,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH80
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH80
|
||||||
@@ -668,7 +668,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH90
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH90
|
||||||
@@ -681,7 +681,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VJ10
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VJ10
|
||||||
@@ -694,7 +694,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VJ20
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VJ20
|
||||||
@@ -707,7 +707,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VJ30
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VJ30
|
||||||
@@ -720,7 +720,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VJ40
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VJ40
|
||||||
@@ -733,7 +733,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VJ60
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VJ60
|
||||||
@@ -746,7 +746,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VK40
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VK40
|
||||||
@@ -759,7 +759,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VK50
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VK50
|
||||||
@@ -772,7 +772,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M52S_Plus_Plus.BTMinerM52SPlusPlusVL10
|
::: pyasic.miners.whatsminer.btminer.M5X.M52S_Plus_Plus.BTMinerM52SPlusPlusVL10
|
||||||
@@ -785,7 +785,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M52S.BTMinerM52SVK30
|
::: pyasic.miners.whatsminer.btminer.M5X.M52S.BTMinerM52SVK30
|
||||||
@@ -798,7 +798,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53H.BTMinerM53HVH10
|
::: pyasic.miners.whatsminer.btminer.M5X.M53H.BTMinerM53HVH10
|
||||||
@@ -811,7 +811,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus_Plus.BTMinerM53SPlusPlusVK10
|
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus_Plus.BTMinerM53SPlusPlusVK10
|
||||||
@@ -824,7 +824,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus_Plus.BTMinerM53SPlusPlusVK20
|
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus_Plus.BTMinerM53SPlusPlusVK20
|
||||||
@@ -837,7 +837,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus_Plus.BTMinerM53SPlusPlusVK30
|
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus_Plus.BTMinerM53SPlusPlusVK30
|
||||||
@@ -850,7 +850,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus_Plus.BTMinerM53SPlusPlusVK50
|
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus_Plus.BTMinerM53SPlusPlusVK50
|
||||||
@@ -863,7 +863,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus_Plus.BTMinerM53SPlusPlusVL10
|
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus_Plus.BTMinerM53SPlusPlusVL10
|
||||||
@@ -876,7 +876,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus_Plus.BTMinerM53SPlusPlusVL30
|
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus_Plus.BTMinerM53SPlusPlusVL30
|
||||||
@@ -889,7 +889,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus.BTMinerM53SPlusVJ30
|
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus.BTMinerM53SPlusVJ30
|
||||||
@@ -902,7 +902,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus.BTMinerM53SPlusVJ40
|
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus.BTMinerM53SPlusVJ40
|
||||||
@@ -915,7 +915,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus.BTMinerM53SPlusVJ50
|
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus.BTMinerM53SPlusVJ50
|
||||||
@@ -928,7 +928,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus.BTMinerM53SPlusVK30
|
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus.BTMinerM53SPlusVK30
|
||||||
@@ -941,7 +941,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53S.BTMinerM53SVH20
|
::: pyasic.miners.whatsminer.btminer.M5X.M53S.BTMinerM53SVH20
|
||||||
@@ -954,7 +954,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53S.BTMinerM53SVH30
|
::: pyasic.miners.whatsminer.btminer.M5X.M53S.BTMinerM53SVH30
|
||||||
@@ -967,7 +967,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53S.BTMinerM53SVJ30
|
::: pyasic.miners.whatsminer.btminer.M5X.M53S.BTMinerM53SVJ30
|
||||||
@@ -980,7 +980,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53S.BTMinerM53SVJ40
|
::: pyasic.miners.whatsminer.btminer.M5X.M53S.BTMinerM53SVJ40
|
||||||
@@ -993,7 +993,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53S.BTMinerM53SVK30
|
::: pyasic.miners.whatsminer.btminer.M5X.M53S.BTMinerM53SVK30
|
||||||
@@ -1006,7 +1006,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53.BTMinerM53VH30
|
::: pyasic.miners.whatsminer.btminer.M5X.M53.BTMinerM53VH30
|
||||||
@@ -1019,7 +1019,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53.BTMinerM53VH40
|
::: pyasic.miners.whatsminer.btminer.M5X.M53.BTMinerM53VH40
|
||||||
@@ -1032,7 +1032,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53.BTMinerM53VH50
|
::: pyasic.miners.whatsminer.btminer.M5X.M53.BTMinerM53VH50
|
||||||
@@ -1045,7 +1045,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53.BTMinerM53VK30
|
::: pyasic.miners.whatsminer.btminer.M5X.M53.BTMinerM53VK30
|
||||||
@@ -1058,7 +1058,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53.BTMinerM53VK60
|
::: pyasic.miners.whatsminer.btminer.M5X.M53.BTMinerM53VK60
|
||||||
@@ -1071,7 +1071,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M54S_Plus_Plus.BTMinerM54SPlusPlusVK30
|
::: pyasic.miners.whatsminer.btminer.M5X.M54S_Plus_Plus.BTMinerM54SPlusPlusVK30
|
||||||
@@ -1084,7 +1084,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M54S_Plus_Plus.BTMinerM54SPlusPlusVL30
|
::: pyasic.miners.whatsminer.btminer.M5X.M54S_Plus_Plus.BTMinerM54SPlusPlusVL30
|
||||||
@@ -1097,7 +1097,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M54S_Plus_Plus.BTMinerM54SPlusPlusVL40
|
::: pyasic.miners.whatsminer.btminer.M5X.M54S_Plus_Plus.BTMinerM54SPlusPlusVL40
|
||||||
@@ -1110,7 +1110,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M56S_Plus_Plus.BTMinerM56SPlusPlusVK10
|
::: pyasic.miners.whatsminer.btminer.M5X.M56S_Plus_Plus.BTMinerM56SPlusPlusVK10
|
||||||
@@ -1123,7 +1123,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M56S_Plus_Plus.BTMinerM56SPlusPlusVK30
|
::: pyasic.miners.whatsminer.btminer.M5X.M56S_Plus_Plus.BTMinerM56SPlusPlusVK30
|
||||||
@@ -1136,7 +1136,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M56S_Plus_Plus.BTMinerM56SPlusPlusVK40
|
::: pyasic.miners.whatsminer.btminer.M5X.M56S_Plus_Plus.BTMinerM56SPlusPlusVK40
|
||||||
@@ -1149,7 +1149,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M56S_Plus_Plus.BTMinerM56SPlusPlusVK50
|
::: pyasic.miners.whatsminer.btminer.M5X.M56S_Plus_Plus.BTMinerM56SPlusPlusVK50
|
||||||
@@ -1162,7 +1162,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M56S_Plus.BTMinerM56SPlusVJ30
|
::: pyasic.miners.whatsminer.btminer.M5X.M56S_Plus.BTMinerM56SPlusVJ30
|
||||||
@@ -1175,7 +1175,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M56S_Plus.BTMinerM56SPlusVK30
|
::: pyasic.miners.whatsminer.btminer.M5X.M56S_Plus.BTMinerM56SPlusVK30
|
||||||
@@ -1188,7 +1188,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M56S_Plus.BTMinerM56SPlusVK40
|
::: pyasic.miners.whatsminer.btminer.M5X.M56S_Plus.BTMinerM56SPlusVK40
|
||||||
@@ -1201,7 +1201,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M56S_Plus.BTMinerM56SPlusVK50
|
::: pyasic.miners.whatsminer.btminer.M5X.M56S_Plus.BTMinerM56SPlusVK50
|
||||||
@@ -1214,7 +1214,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M56S.BTMinerM56SVH30
|
::: pyasic.miners.whatsminer.btminer.M5X.M56S.BTMinerM56SVH30
|
||||||
@@ -1227,7 +1227,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M56S.BTMinerM56SVJ30
|
::: pyasic.miners.whatsminer.btminer.M5X.M56S.BTMinerM56SVJ30
|
||||||
@@ -1240,7 +1240,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M56S.BTMinerM56SVJ40
|
::: pyasic.miners.whatsminer.btminer.M5X.M56S.BTMinerM56SVJ40
|
||||||
@@ -1253,7 +1253,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M56.BTMinerM56VH30
|
::: pyasic.miners.whatsminer.btminer.M5X.M56.BTMinerM56VH30
|
||||||
@@ -1266,7 +1266,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M59.BTMinerM59VH30
|
::: pyasic.miners.whatsminer.btminer.M5X.M59.BTMinerM59VH30
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus_Plus.BTMinerM60SPlusPlusVL30
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus_Plus.BTMinerM60SPlusPlusVL30
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus_Plus.BTMinerM60SPlusPlusVL40
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus_Plus.BTMinerM60SPlusPlusVL40
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus.BTMinerM60SPlusVK30
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus.BTMinerM60SPlusVK30
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus.BTMinerM60SPlusVK40
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus.BTMinerM60SPlusVK40
|
||||||
@@ -57,7 +57,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus.BTMinerM60SPlusVK50
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus.BTMinerM60SPlusVK50
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus.BTMinerM60SPlusVK60
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus.BTMinerM60SPlusVK60
|
||||||
@@ -83,7 +83,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus.BTMinerM60SPlusVK70
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus.BTMinerM60SPlusVK70
|
||||||
@@ -96,7 +96,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus.BTMinerM60SPlusVL10
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus.BTMinerM60SPlusVL10
|
||||||
@@ -109,7 +109,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus.BTMinerM60SPlusVL30
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus.BTMinerM60SPlusVL30
|
||||||
@@ -122,7 +122,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus.BTMinerM60SPlusVL40
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus.BTMinerM60SPlusVL40
|
||||||
@@ -135,7 +135,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus.BTMinerM60SPlusVL50
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus.BTMinerM60SPlusVL50
|
||||||
@@ -148,7 +148,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus.BTMinerM60SPlusVL60
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S_Plus.BTMinerM60SPlusVL60
|
||||||
@@ -161,7 +161,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVK10
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVK10
|
||||||
@@ -174,7 +174,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVK20
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVK20
|
||||||
@@ -187,7 +187,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVK30
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVK30
|
||||||
@@ -200,7 +200,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVK40
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVK40
|
||||||
@@ -213,7 +213,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVL10
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVL10
|
||||||
@@ -226,7 +226,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVL20
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVL20
|
||||||
@@ -239,7 +239,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVL30
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVL30
|
||||||
@@ -252,7 +252,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVL40
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVL40
|
||||||
@@ -265,7 +265,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVL50
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVL50
|
||||||
@@ -278,7 +278,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVL60
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVL60
|
||||||
@@ -291,7 +291,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVL70
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVL70
|
||||||
@@ -304,7 +304,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VK10
|
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VK10
|
||||||
@@ -317,7 +317,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VK20
|
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VK20
|
||||||
@@ -330,7 +330,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VK30
|
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VK30
|
||||||
@@ -343,7 +343,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VK40
|
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VK40
|
||||||
@@ -356,7 +356,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VK6A
|
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VK6A
|
||||||
@@ -369,7 +369,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VL10
|
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VL10
|
||||||
@@ -382,7 +382,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VL20
|
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VL20
|
||||||
@@ -395,7 +395,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VL30
|
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VL30
|
||||||
@@ -408,7 +408,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VL40
|
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VL40
|
||||||
@@ -421,7 +421,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VL50
|
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VL50
|
||||||
@@ -434,7 +434,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M61S_Plus.BTMinerM61SPlusVL30
|
::: pyasic.miners.whatsminer.btminer.M6X.M61S_Plus.BTMinerM61SPlusVL30
|
||||||
@@ -447,7 +447,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M61S.BTMinerM61SVL10
|
::: pyasic.miners.whatsminer.btminer.M6X.M61S.BTMinerM61SVL10
|
||||||
@@ -460,7 +460,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M61S.BTMinerM61SVL20
|
::: pyasic.miners.whatsminer.btminer.M6X.M61S.BTMinerM61SVL20
|
||||||
@@ -473,7 +473,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M61S.BTMinerM61SVL30
|
::: pyasic.miners.whatsminer.btminer.M6X.M61S.BTMinerM61SVL30
|
||||||
@@ -486,7 +486,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M61.BTMinerM61VK10
|
::: pyasic.miners.whatsminer.btminer.M6X.M61.BTMinerM61VK10
|
||||||
@@ -499,7 +499,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M61.BTMinerM61VK20
|
::: pyasic.miners.whatsminer.btminer.M6X.M61.BTMinerM61VK20
|
||||||
@@ -512,7 +512,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M61.BTMinerM61VK30
|
::: pyasic.miners.whatsminer.btminer.M6X.M61.BTMinerM61VK30
|
||||||
@@ -525,7 +525,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M61.BTMinerM61VK40
|
::: pyasic.miners.whatsminer.btminer.M6X.M61.BTMinerM61VK40
|
||||||
@@ -538,7 +538,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M61.BTMinerM61VL10
|
::: pyasic.miners.whatsminer.btminer.M6X.M61.BTMinerM61VL10
|
||||||
@@ -551,7 +551,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M61.BTMinerM61VL30
|
::: pyasic.miners.whatsminer.btminer.M6X.M61.BTMinerM61VL30
|
||||||
@@ -564,7 +564,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M61.BTMinerM61VL40
|
::: pyasic.miners.whatsminer.btminer.M6X.M61.BTMinerM61VL40
|
||||||
@@ -577,7 +577,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M61.BTMinerM61VL50
|
::: pyasic.miners.whatsminer.btminer.M6X.M61.BTMinerM61VL50
|
||||||
@@ -590,7 +590,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M61.BTMinerM61VL60
|
::: pyasic.miners.whatsminer.btminer.M6X.M61.BTMinerM61VL60
|
||||||
@@ -603,7 +603,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M62S_Plus.BTMinerM62SPlusVK30
|
::: pyasic.miners.whatsminer.btminer.M6X.M62S_Plus.BTMinerM62SPlusVK30
|
||||||
@@ -616,7 +616,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63S_Plus_Plus.BTMinerM63SPlusPlusVL20
|
::: pyasic.miners.whatsminer.btminer.M6X.M63S_Plus_Plus.BTMinerM63SPlusPlusVL20
|
||||||
@@ -629,7 +629,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63S_Plus.BTMinerM63SPlusVK30
|
::: pyasic.miners.whatsminer.btminer.M6X.M63S_Plus.BTMinerM63SPlusVK30
|
||||||
@@ -642,7 +642,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63S_Plus.BTMinerM63SPlusVL10
|
::: pyasic.miners.whatsminer.btminer.M6X.M63S_Plus.BTMinerM63SPlusVL10
|
||||||
@@ -655,7 +655,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63S_Plus.BTMinerM63SPlusVL20
|
::: pyasic.miners.whatsminer.btminer.M6X.M63S_Plus.BTMinerM63SPlusVL20
|
||||||
@@ -668,7 +668,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63S_Plus.BTMinerM63SPlusVL30
|
::: pyasic.miners.whatsminer.btminer.M6X.M63S_Plus.BTMinerM63SPlusVL30
|
||||||
@@ -681,7 +681,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63S_Plus.BTMinerM63SPlusVL50
|
::: pyasic.miners.whatsminer.btminer.M6X.M63S_Plus.BTMinerM63SPlusVL50
|
||||||
@@ -694,7 +694,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63S.BTMinerM63SVK10
|
::: pyasic.miners.whatsminer.btminer.M6X.M63S.BTMinerM63SVK10
|
||||||
@@ -707,7 +707,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63S.BTMinerM63SVK20
|
::: pyasic.miners.whatsminer.btminer.M6X.M63S.BTMinerM63SVK20
|
||||||
@@ -720,7 +720,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63S.BTMinerM63SVK30
|
::: pyasic.miners.whatsminer.btminer.M6X.M63S.BTMinerM63SVK30
|
||||||
@@ -733,7 +733,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63S.BTMinerM63SVK60
|
::: pyasic.miners.whatsminer.btminer.M6X.M63S.BTMinerM63SVK60
|
||||||
@@ -746,7 +746,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63S.BTMinerM63SVL10
|
::: pyasic.miners.whatsminer.btminer.M6X.M63S.BTMinerM63SVL10
|
||||||
@@ -759,7 +759,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63S.BTMinerM63SVL50
|
::: pyasic.miners.whatsminer.btminer.M6X.M63S.BTMinerM63SVL50
|
||||||
@@ -772,7 +772,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63S.BTMinerM63SVL60
|
::: pyasic.miners.whatsminer.btminer.M6X.M63S.BTMinerM63SVL60
|
||||||
@@ -785,7 +785,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63.BTMinerM63VK10
|
::: pyasic.miners.whatsminer.btminer.M6X.M63.BTMinerM63VK10
|
||||||
@@ -798,7 +798,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63.BTMinerM63VK20
|
::: pyasic.miners.whatsminer.btminer.M6X.M63.BTMinerM63VK20
|
||||||
@@ -811,7 +811,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63.BTMinerM63VK30
|
::: pyasic.miners.whatsminer.btminer.M6X.M63.BTMinerM63VK30
|
||||||
@@ -824,7 +824,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63.BTMinerM63VL10
|
::: pyasic.miners.whatsminer.btminer.M6X.M63.BTMinerM63VL10
|
||||||
@@ -837,7 +837,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63.BTMinerM63VL30
|
::: pyasic.miners.whatsminer.btminer.M6X.M63.BTMinerM63VL30
|
||||||
@@ -850,7 +850,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M64S.BTMinerM64SVL30
|
::: pyasic.miners.whatsminer.btminer.M6X.M64S.BTMinerM64SVL30
|
||||||
@@ -863,7 +863,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M64.BTMinerM64VL30
|
::: pyasic.miners.whatsminer.btminer.M6X.M64.BTMinerM64VL30
|
||||||
@@ -876,7 +876,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M64.BTMinerM64VL40
|
::: pyasic.miners.whatsminer.btminer.M6X.M64.BTMinerM64VL40
|
||||||
@@ -889,7 +889,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M65S_Plus.BTMinerM65SPlusVK30
|
::: pyasic.miners.whatsminer.btminer.M6X.M65S_Plus.BTMinerM65SPlusVK30
|
||||||
@@ -902,7 +902,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M65S.BTMinerM65SVK20
|
::: pyasic.miners.whatsminer.btminer.M6X.M65S.BTMinerM65SVK20
|
||||||
@@ -915,7 +915,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M65S.BTMinerM65SVL60
|
::: pyasic.miners.whatsminer.btminer.M6X.M65S.BTMinerM65SVL60
|
||||||
@@ -928,7 +928,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66S_Plus_Plus.BTMinerM66SPlusPlusVL20
|
::: pyasic.miners.whatsminer.btminer.M6X.M66S_Plus_Plus.BTMinerM66SPlusPlusVL20
|
||||||
@@ -941,7 +941,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66S_Plus.BTMinerM66SPlusVK30
|
::: pyasic.miners.whatsminer.btminer.M6X.M66S_Plus.BTMinerM66SPlusVK30
|
||||||
@@ -954,7 +954,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66S_Plus.BTMinerM66SPlusVL10
|
::: pyasic.miners.whatsminer.btminer.M6X.M66S_Plus.BTMinerM66SPlusVL10
|
||||||
@@ -967,7 +967,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66S_Plus.BTMinerM66SPlusVL20
|
::: pyasic.miners.whatsminer.btminer.M6X.M66S_Plus.BTMinerM66SPlusVL20
|
||||||
@@ -980,7 +980,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66S_Plus.BTMinerM66SPlusVL30
|
::: pyasic.miners.whatsminer.btminer.M6X.M66S_Plus.BTMinerM66SPlusVL30
|
||||||
@@ -993,7 +993,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66S_Plus.BTMinerM66SPlusVL40
|
::: pyasic.miners.whatsminer.btminer.M6X.M66S_Plus.BTMinerM66SPlusVL40
|
||||||
@@ -1006,7 +1006,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66S_Plus.BTMinerM66SPlusVL60
|
::: pyasic.miners.whatsminer.btminer.M6X.M66S_Plus.BTMinerM66SPlusVL60
|
||||||
@@ -1019,7 +1019,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVK20
|
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVK20
|
||||||
@@ -1032,7 +1032,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVK30
|
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVK30
|
||||||
@@ -1045,7 +1045,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVK40
|
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVK40
|
||||||
@@ -1058,7 +1058,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVK50
|
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVK50
|
||||||
@@ -1071,7 +1071,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVK60
|
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVK60
|
||||||
@@ -1084,7 +1084,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVL10
|
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVL10
|
||||||
@@ -1097,7 +1097,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVL20
|
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVL20
|
||||||
@@ -1110,7 +1110,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVL30
|
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVL30
|
||||||
@@ -1123,7 +1123,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVL40
|
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVL40
|
||||||
@@ -1136,7 +1136,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVL50
|
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVL50
|
||||||
@@ -1149,7 +1149,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66.BTMinerM66VK20
|
::: pyasic.miners.whatsminer.btminer.M6X.M66.BTMinerM66VK20
|
||||||
@@ -1162,7 +1162,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66.BTMinerM66VK30
|
::: pyasic.miners.whatsminer.btminer.M6X.M66.BTMinerM66VK30
|
||||||
@@ -1175,7 +1175,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66.BTMinerM66VL20
|
::: pyasic.miners.whatsminer.btminer.M6X.M66.BTMinerM66VL20
|
||||||
@@ -1188,7 +1188,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66.BTMinerM66VL30
|
::: pyasic.miners.whatsminer.btminer.M6X.M66.BTMinerM66VL30
|
||||||
@@ -1201,7 +1201,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M67S.BTMinerM67SVK30
|
::: pyasic.miners.whatsminer.btminer.M6X.M67S.BTMinerM67SVK30
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
- [x] Shutdowns
|
- [x] Shutdowns
|
||||||
- [x] Power Modes
|
- [x] Power Modes
|
||||||
- [ ] Setpoints
|
- [x] Setpoints
|
||||||
- [ ] Presets
|
- [ ] Presets
|
||||||
|
|
||||||
::: pyasic.miners.whatsminer.btminer.M7X.M70.BTMinerM70VM30
|
::: pyasic.miners.whatsminer.btminer.M7X.M70.BTMinerM70VM30
|
||||||
|
|||||||
@@ -97,7 +97,6 @@ nav:
|
|||||||
- Innosilicon T3X: "miners/innosilicon/T3X.md"
|
- Innosilicon T3X: "miners/innosilicon/T3X.md"
|
||||||
- Innosilicon A10X: "miners/innosilicon/A10X.md"
|
- Innosilicon A10X: "miners/innosilicon/A10X.md"
|
||||||
- Innosilicon A11X: "miners/innosilicon/A11X.md"
|
- Innosilicon A11X: "miners/innosilicon/A11X.md"
|
||||||
- Goldshell Byte: "miners/goldshell/Byte.md"
|
|
||||||
- Goldshell X5: "miners/goldshell/X5.md"
|
- Goldshell X5: "miners/goldshell/X5.md"
|
||||||
- Goldshell XMax: "miners/goldshell/XMax.md"
|
- Goldshell XMax: "miners/goldshell/XMax.md"
|
||||||
- Goldshell XBox: "miners/goldshell/XBox.md"
|
- Goldshell XBox: "miners/goldshell/XBox.md"
|
||||||
|
|||||||
784
poetry.lock
generated
784
poetry.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -56,26 +56,6 @@ class MinerConfig(BaseModel):
|
|||||||
**self.temperature.as_am_modern(),
|
**self.temperature.as_am_modern(),
|
||||||
}
|
}
|
||||||
|
|
||||||
def as_hiveon_modern(self, user_suffix: str | None = None) -> dict:
|
|
||||||
"""Generates the configuration in the format suitable for modern Hiveon."""
|
|
||||||
return {
|
|
||||||
**self.fan_mode.as_hiveon_modern(),
|
|
||||||
"freq-level": "100",
|
|
||||||
**self.mining_mode.as_hiveon_modern(),
|
|
||||||
**self.pools.as_hiveon_modern(user_suffix=user_suffix),
|
|
||||||
**self.temperature.as_hiveon_modern(),
|
|
||||||
}
|
|
||||||
|
|
||||||
def as_elphapex(self, user_suffix: str | None = None) -> dict:
|
|
||||||
"""Generates the configuration in the format suitable for modern Elphapex."""
|
|
||||||
return {
|
|
||||||
**self.fan_mode.as_elphapex(),
|
|
||||||
"fc-freq-level": "100",
|
|
||||||
**self.mining_mode.as_elphapex(),
|
|
||||||
**self.pools.as_elphapex(user_suffix=user_suffix),
|
|
||||||
**self.temperature.as_elphapex(),
|
|
||||||
}
|
|
||||||
|
|
||||||
def as_wm(self, user_suffix: str | None = None) -> dict:
|
def as_wm(self, user_suffix: str | None = None) -> dict:
|
||||||
"""Generates the configuration in the format suitable for Whatsminers."""
|
"""Generates the configuration in the format suitable for Whatsminers."""
|
||||||
return {
|
return {
|
||||||
@@ -85,13 +65,6 @@ class MinerConfig(BaseModel):
|
|||||||
**self.temperature.as_wm(),
|
**self.temperature.as_wm(),
|
||||||
}
|
}
|
||||||
|
|
||||||
def as_btminer_v3(self, user_suffix: str | None = None) -> dict:
|
|
||||||
"""Generates the configuration in the format suitable for Whatsminers running BTMiner V3."""
|
|
||||||
return {
|
|
||||||
"set.miner.pools": self.pools.as_btminer_v3()
|
|
||||||
** self.mining_mode.as_btminer_v3()
|
|
||||||
}
|
|
||||||
|
|
||||||
def as_am_old(self, user_suffix: str | None = None) -> dict:
|
def as_am_old(self, user_suffix: str | None = None) -> dict:
|
||||||
"""Generates the configuration in the format suitable for old versions of Antminers."""
|
"""Generates the configuration in the format suitable for old versions of Antminers."""
|
||||||
return {
|
return {
|
||||||
@@ -170,12 +143,12 @@ class MinerConfig(BaseModel):
|
|||||||
**self.pools.as_mara(user_suffix=user_suffix),
|
**self.pools.as_mara(user_suffix=user_suffix),
|
||||||
}
|
}
|
||||||
|
|
||||||
def as_espminer(self, user_suffix: str | None = None) -> dict:
|
def as_bitaxe(self, user_suffix: str | None = None) -> dict:
|
||||||
return {
|
return {
|
||||||
**self.fan_mode.as_espminer(),
|
**self.fan_mode.as_bitaxe(),
|
||||||
**self.temperature.as_espminer(),
|
**self.temperature.as_bitaxe(),
|
||||||
**self.mining_mode.as_espminer(),
|
**self.mining_mode.as_bitaxe(),
|
||||||
**self.pools.as_espminer(user_suffix=user_suffix),
|
**self.pools.as_bitaxe(user_suffix=user_suffix),
|
||||||
}
|
}
|
||||||
|
|
||||||
def as_luxos(self, user_suffix: str | None = None) -> dict:
|
def as_luxos(self, user_suffix: str | None = None) -> dict:
|
||||||
@@ -226,24 +199,6 @@ class MinerConfig(BaseModel):
|
|||||||
fan_mode=FanModeConfig.from_am_modern(web_conf),
|
fan_mode=FanModeConfig.from_am_modern(web_conf),
|
||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_hiveon_modern(cls, web_conf: dict) -> "MinerConfig":
|
|
||||||
"""Constructs a MinerConfig object from web configuration for Hiveon."""
|
|
||||||
return cls(
|
|
||||||
pools=PoolConfig.from_hiveon_modern(web_conf),
|
|
||||||
mining_mode=MiningModeConfig.from_hiveon_modern(web_conf),
|
|
||||||
fan_mode=FanModeConfig.from_hiveon_modern(web_conf),
|
|
||||||
)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_elphapex(cls, web_conf: dict) -> "MinerConfig":
|
|
||||||
"""Constructs a MinerConfig object from web configuration for modern Antminers."""
|
|
||||||
return cls(
|
|
||||||
pools=PoolConfig.from_elphapex(web_conf),
|
|
||||||
mining_mode=MiningModeConfig.from_elphapex(web_conf),
|
|
||||||
fan_mode=FanModeConfig.from_elphapex(web_conf),
|
|
||||||
)
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_am_old(cls, web_conf: dict) -> "MinerConfig":
|
def from_am_old(cls, web_conf: dict) -> "MinerConfig":
|
||||||
"""Constructs a MinerConfig object from web configuration for old versions of Antminers."""
|
"""Constructs a MinerConfig object from web configuration for old versions of Antminers."""
|
||||||
@@ -254,11 +209,6 @@ class MinerConfig(BaseModel):
|
|||||||
"""Constructs a MinerConfig object from web configuration for Goldshell miners."""
|
"""Constructs a MinerConfig object from web configuration for Goldshell miners."""
|
||||||
return cls(pools=PoolConfig.from_am_modern(web_conf))
|
return cls(pools=PoolConfig.from_am_modern(web_conf))
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_goldshell_byte(cls, web_conf: dict) -> "MinerConfig":
|
|
||||||
"""Constructs a MinerConfig object from web configuration for Goldshell Byte miners."""
|
|
||||||
return cls(pools=PoolConfig.from_goldshell_byte(web_conf))
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_inno(cls, web_pools: list) -> "MinerConfig":
|
def from_inno(cls, web_pools: list) -> "MinerConfig":
|
||||||
"""Constructs a MinerConfig object from web configuration for Innosilicon miners."""
|
"""Constructs a MinerConfig object from web configuration for Innosilicon miners."""
|
||||||
@@ -295,17 +245,13 @@ class MinerConfig(BaseModel):
|
|||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_vnish(
|
def from_vnish(cls, web_settings: dict, web_presets: list[dict]) -> "MinerConfig":
|
||||||
cls, web_settings: dict, web_presets: list[dict], web_perf_summary: dict
|
|
||||||
) -> "MinerConfig":
|
|
||||||
"""Constructs a MinerConfig object from web settings for VNish miners."""
|
"""Constructs a MinerConfig object from web settings for VNish miners."""
|
||||||
return cls(
|
return cls(
|
||||||
pools=PoolConfig.from_vnish(web_settings),
|
pools=PoolConfig.from_vnish(web_settings),
|
||||||
fan_mode=FanModeConfig.from_vnish(web_settings),
|
fan_mode=FanModeConfig.from_vnish(web_settings),
|
||||||
temperature=TemperatureConfig.from_vnish(web_settings),
|
temperature=TemperatureConfig.from_vnish(web_settings),
|
||||||
mining_mode=MiningModeConfig.from_vnish(
|
mining_mode=MiningModeConfig.from_vnish(web_settings, web_presets),
|
||||||
web_settings, web_presets, web_perf_summary
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@@ -326,10 +272,10 @@ class MinerConfig(BaseModel):
|
|||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_espminer(cls, web_system_info: dict) -> "MinerConfig":
|
def from_bitaxe(cls, web_system_info: dict) -> "MinerConfig":
|
||||||
return cls(
|
return cls(
|
||||||
pools=PoolConfig.from_espminer(web_system_info),
|
pools=PoolConfig.from_bitaxe(web_system_info),
|
||||||
fan_mode=FanModeConfig.from_espminer(web_system_info),
|
fan_mode=FanModeConfig.from_bitaxe(web_system_info),
|
||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@@ -364,12 +310,5 @@ class MinerConfig(BaseModel):
|
|||||||
return cls.from_am_modern(*args, **kwargs)
|
return cls.from_am_modern(*args, **kwargs)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_btminer_v3(
|
def from_hiveon_modern(cls, web_conf: dict) -> "MinerConfig":
|
||||||
cls, rpc_pools: dict, rpc_settings: dict, rpc_device_info: dict
|
return cls.from_am_modern(web_conf)
|
||||||
) -> "MinerConfig":
|
|
||||||
return cls(
|
|
||||||
pools=PoolConfig.from_btminer_v3(rpc_pools=rpc_pools["msg"]),
|
|
||||||
mining_mode=MiningModeConfig.from_btminer_v3(
|
|
||||||
rpc_device_info=rpc_device_info, rpc_settings=rpc_settings
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|||||||
@@ -28,9 +28,6 @@ class MinerConfigOption(Enum):
|
|||||||
def as_am_modern(self) -> dict:
|
def as_am_modern(self) -> dict:
|
||||||
return self.value.as_am_modern()
|
return self.value.as_am_modern()
|
||||||
|
|
||||||
def as_hiveon_modern(self) -> dict:
|
|
||||||
return self.value.as_hiveon_modern()
|
|
||||||
|
|
||||||
def as_am_old(self) -> dict:
|
def as_am_old(self) -> dict:
|
||||||
return self.value.as_am_old()
|
return self.value.as_am_old()
|
||||||
|
|
||||||
@@ -64,15 +61,12 @@ class MinerConfigOption(Enum):
|
|||||||
def as_mara(self) -> dict:
|
def as_mara(self) -> dict:
|
||||||
return self.value.as_mara()
|
return self.value.as_mara()
|
||||||
|
|
||||||
def as_espminer(self) -> dict:
|
def as_bitaxe(self) -> dict:
|
||||||
return self.value.as_espminer()
|
return self.value.as_bitaxe()
|
||||||
|
|
||||||
def as_luxos(self) -> dict:
|
def as_luxos(self) -> dict:
|
||||||
return self.value.as_luxos()
|
return self.value.as_luxos()
|
||||||
|
|
||||||
def as_elphapex(self) -> dict:
|
|
||||||
return self.value.as_elphapex()
|
|
||||||
|
|
||||||
def __call__(self, *args, **kwargs):
|
def __call__(self, *args, **kwargs):
|
||||||
return self.value(*args, **kwargs)
|
return self.value(*args, **kwargs)
|
||||||
|
|
||||||
@@ -98,18 +92,12 @@ class MinerConfigValue(BaseModel):
|
|||||||
def as_am_modern(self) -> dict:
|
def as_am_modern(self) -> dict:
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
def as_hiveon_modern(self) -> dict:
|
|
||||||
return {}
|
|
||||||
|
|
||||||
def as_am_old(self) -> dict:
|
def as_am_old(self) -> dict:
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
def as_wm(self) -> dict:
|
def as_wm(self) -> dict:
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
def as_btminer_v3(self) -> dict:
|
|
||||||
return {}
|
|
||||||
|
|
||||||
def as_inno(self) -> dict:
|
def as_inno(self) -> dict:
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
@@ -137,15 +125,12 @@ class MinerConfigValue(BaseModel):
|
|||||||
def as_mara(self) -> dict:
|
def as_mara(self) -> dict:
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
def as_espminer(self) -> dict:
|
def as_bitaxe(self) -> dict:
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
def as_luxos(self) -> dict:
|
def as_luxos(self) -> dict:
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
def as_elphapex(self) -> dict:
|
|
||||||
return {}
|
|
||||||
|
|
||||||
def __getitem__(self, item):
|
def __getitem__(self, item):
|
||||||
try:
|
try:
|
||||||
return getattr(self, item)
|
return getattr(self, item)
|
||||||
|
|||||||
@@ -55,12 +55,6 @@ class FanModeNormal(MinerConfigValue):
|
|||||||
def as_am_modern(self) -> dict:
|
def as_am_modern(self) -> dict:
|
||||||
return {"bitmain-fan-ctrl": False, "bitmain-fan-pwn": "100"}
|
return {"bitmain-fan-ctrl": False, "bitmain-fan-pwn": "100"}
|
||||||
|
|
||||||
def as_hiveon_modern(self) -> dict:
|
|
||||||
return {"bitmain-fan-ctrl": False, "bitmain-fan-pwn": "100"}
|
|
||||||
|
|
||||||
def as_elphapex(self) -> dict:
|
|
||||||
return {"fc-fan-ctrl": False, "fc-fan-pwn": "100"}
|
|
||||||
|
|
||||||
def as_bosminer(self) -> dict:
|
def as_bosminer(self) -> dict:
|
||||||
return {
|
return {
|
||||||
"temp_control": {"mode": "auto"},
|
"temp_control": {"mode": "auto"},
|
||||||
@@ -87,7 +81,7 @@ class FanModeNormal(MinerConfigValue):
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
def as_espminer(self) -> dict:
|
def as_bitaxe(self) -> dict:
|
||||||
return {"autoFanspeed": 1}
|
return {"autoFanspeed": 1}
|
||||||
|
|
||||||
def as_luxos(self) -> dict:
|
def as_luxos(self) -> dict:
|
||||||
@@ -141,12 +135,6 @@ class FanModeManual(MinerConfigValue):
|
|||||||
def as_am_modern(self) -> dict:
|
def as_am_modern(self) -> dict:
|
||||||
return {"bitmain-fan-ctrl": True, "bitmain-fan-pwm": str(self.speed)}
|
return {"bitmain-fan-ctrl": True, "bitmain-fan-pwm": str(self.speed)}
|
||||||
|
|
||||||
def as_hiveon_modern(self) -> dict:
|
|
||||||
return {"bitmain-fan-ctrl": True, "bitmain-fan-pwm": str(self.speed)}
|
|
||||||
|
|
||||||
def as_elphapex(self) -> dict:
|
|
||||||
return {"fc-fan-ctrl": True, "fc-fan-pwm": str(self.speed)}
|
|
||||||
|
|
||||||
def as_bosminer(self) -> dict:
|
def as_bosminer(self) -> dict:
|
||||||
return {
|
return {
|
||||||
"temp_control": {"mode": "manual"},
|
"temp_control": {"mode": "manual"},
|
||||||
@@ -168,7 +156,7 @@ class FanModeManual(MinerConfigValue):
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
def as_espminer(self) -> dict:
|
def as_bitaxe(self) -> dict:
|
||||||
return {"autoFanspeed": 0, "fanspeed": self.speed}
|
return {"autoFanspeed": 0, "fanspeed": self.speed}
|
||||||
|
|
||||||
def as_luxos(self) -> dict:
|
def as_luxos(self) -> dict:
|
||||||
@@ -197,12 +185,6 @@ class FanModeImmersion(MinerConfigValue):
|
|||||||
def as_am_modern(self) -> dict:
|
def as_am_modern(self) -> dict:
|
||||||
return {"bitmain-fan-ctrl": True, "bitmain-fan-pwm": "0"}
|
return {"bitmain-fan-ctrl": True, "bitmain-fan-pwm": "0"}
|
||||||
|
|
||||||
def as_hiveon_modern(self) -> dict:
|
|
||||||
return {"bitmain-fan-ctrl": True, "bitmain-fan-pwm": "0"}
|
|
||||||
|
|
||||||
def as_elphapex(self) -> dict:
|
|
||||||
return {"fc-fan-ctrl": True, "fc-fan-pwm": "0"}
|
|
||||||
|
|
||||||
def as_bosminer(self) -> dict:
|
def as_bosminer(self) -> dict:
|
||||||
return {
|
return {
|
||||||
"fan_control": {"min_fans": 0},
|
"fan_control": {"min_fans": 0},
|
||||||
@@ -257,34 +239,6 @@ class FanModeConfig(MinerConfigOption):
|
|||||||
else:
|
else:
|
||||||
return cls.default()
|
return cls.default()
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_hiveon_modern(cls, web_conf: dict):
|
|
||||||
if web_conf.get("bitmain-fan-ctrl") is not None:
|
|
||||||
fan_manual = web_conf["bitmain-fan-ctrl"]
|
|
||||||
if fan_manual:
|
|
||||||
speed = int(web_conf["bitmain-fan-pwm"])
|
|
||||||
if speed == 0:
|
|
||||||
return cls.immersion()
|
|
||||||
return cls.manual(speed=speed)
|
|
||||||
else:
|
|
||||||
return cls.normal()
|
|
||||||
else:
|
|
||||||
return cls.default()
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_elphapex(cls, web_conf: dict):
|
|
||||||
if web_conf.get("fc-fan-ctrl") is not None:
|
|
||||||
fan_manual = web_conf["fc-fan-ctrl"]
|
|
||||||
if fan_manual:
|
|
||||||
speed = int(web_conf["fc-fan-pwm"])
|
|
||||||
if speed == 0:
|
|
||||||
return cls.immersion()
|
|
||||||
return cls.manual(speed=speed)
|
|
||||||
else:
|
|
||||||
return cls.normal()
|
|
||||||
else:
|
|
||||||
return cls.default()
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_epic(cls, web_conf: dict):
|
def from_epic(cls, web_conf: dict):
|
||||||
try:
|
try:
|
||||||
@@ -388,7 +342,7 @@ class FanModeConfig(MinerConfigOption):
|
|||||||
return cls.default()
|
return cls.default()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_espminer(cls, web_system_info: dict):
|
def from_bitaxe(cls, web_system_info: dict):
|
||||||
if web_system_info["autofanspeed"] == 1:
|
if web_system_info["autofanspeed"] == 1:
|
||||||
return cls.normal()
|
return cls.normal()
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -52,20 +52,9 @@ class MiningModeNormal(MinerConfigValue):
|
|||||||
return {"miner-mode": "0"}
|
return {"miner-mode": "0"}
|
||||||
return {"miner-mode": 0}
|
return {"miner-mode": 0}
|
||||||
|
|
||||||
def as_hiveon_modern(self) -> dict:
|
|
||||||
if settings.get("antminer_mining_mode_as_str", False):
|
|
||||||
return {"miner-mode": "0"}
|
|
||||||
return {"miner-mode": 0}
|
|
||||||
|
|
||||||
def as_elphapex(self) -> dict:
|
|
||||||
return {"miner-mode": 0}
|
|
||||||
|
|
||||||
def as_wm(self) -> dict:
|
def as_wm(self) -> dict:
|
||||||
return {"mode": self.mode}
|
return {"mode": self.mode}
|
||||||
|
|
||||||
def as_btminer_v3(self) -> dict:
|
|
||||||
return {"set.miner.service": "start", "set.miner.power_mode": self.mode}
|
|
||||||
|
|
||||||
def as_auradine(self) -> dict:
|
def as_auradine(self) -> dict:
|
||||||
return {"mode": {"mode": self.mode}}
|
return {"mode": {"mode": self.mode}}
|
||||||
|
|
||||||
@@ -85,9 +74,6 @@ class MiningModeNormal(MinerConfigValue):
|
|||||||
def as_luxos(self) -> dict:
|
def as_luxos(self) -> dict:
|
||||||
return {"autotunerset": {"enabled": False}}
|
return {"autotunerset": {"enabled": False}}
|
||||||
|
|
||||||
def as_bosminer(self) -> dict:
|
|
||||||
return {"autotuning": {"enabled": True}}
|
|
||||||
|
|
||||||
|
|
||||||
class MiningModeSleep(MinerConfigValue):
|
class MiningModeSleep(MinerConfigValue):
|
||||||
mode: str = field(init=False, default="sleep")
|
mode: str = field(init=False, default="sleep")
|
||||||
@@ -101,20 +87,9 @@ class MiningModeSleep(MinerConfigValue):
|
|||||||
return {"miner-mode": "1"}
|
return {"miner-mode": "1"}
|
||||||
return {"miner-mode": 1}
|
return {"miner-mode": 1}
|
||||||
|
|
||||||
def as_hiveon_modern(self) -> dict:
|
|
||||||
if settings.get("antminer_mining_mode_as_str", False):
|
|
||||||
return {"miner-mode": "1"}
|
|
||||||
return {"miner-mode": 1}
|
|
||||||
|
|
||||||
def as_elphapex(self) -> dict:
|
|
||||||
return {"miner-mode": 1}
|
|
||||||
|
|
||||||
def as_wm(self) -> dict:
|
def as_wm(self) -> dict:
|
||||||
return {"mode": self.mode}
|
return {"mode": self.mode}
|
||||||
|
|
||||||
def as_btminer_v3(self) -> dict:
|
|
||||||
return {"set.miner.service": "stop"}
|
|
||||||
|
|
||||||
def as_auradine(self) -> dict:
|
def as_auradine(self) -> dict:
|
||||||
return {"mode": {"sleep": "on"}}
|
return {"mode": {"sleep": "on"}}
|
||||||
|
|
||||||
@@ -144,20 +119,9 @@ class MiningModeLPM(MinerConfigValue):
|
|||||||
return {"miner-mode": "3"}
|
return {"miner-mode": "3"}
|
||||||
return {"miner-mode": 3}
|
return {"miner-mode": 3}
|
||||||
|
|
||||||
def as_hiveon_modern(self) -> dict:
|
|
||||||
if settings.get("antminer_mining_mode_as_str", False):
|
|
||||||
return {"miner-mode": "3"}
|
|
||||||
return {"miner-mode": 3}
|
|
||||||
|
|
||||||
def as_elphapex(self) -> dict:
|
|
||||||
return {"miner-mode": 3}
|
|
||||||
|
|
||||||
def as_wm(self) -> dict:
|
def as_wm(self) -> dict:
|
||||||
return {"mode": self.mode}
|
return {"mode": self.mode}
|
||||||
|
|
||||||
def as_btminer_v3(self) -> dict:
|
|
||||||
return {"set.miner.service": "start", "set.miner.power_mode": self.mode}
|
|
||||||
|
|
||||||
def as_auradine(self) -> dict:
|
def as_auradine(self) -> dict:
|
||||||
return {"mode": {"mode": "eco"}}
|
return {"mode": {"mode": "eco"}}
|
||||||
|
|
||||||
@@ -177,20 +141,9 @@ class MiningModeHPM(MinerConfigValue):
|
|||||||
return {"miner-mode": "0"}
|
return {"miner-mode": "0"}
|
||||||
return {"miner-mode": 0}
|
return {"miner-mode": 0}
|
||||||
|
|
||||||
def as_hiveon_modern(self) -> dict:
|
|
||||||
if settings.get("antminer_mining_mode_as_str", False):
|
|
||||||
return {"miner-mode": "0"}
|
|
||||||
return {"miner-mode": 0}
|
|
||||||
|
|
||||||
def as_elphapex(self) -> dict:
|
|
||||||
return {"miner-mode": 0}
|
|
||||||
|
|
||||||
def as_wm(self) -> dict:
|
def as_wm(self) -> dict:
|
||||||
return {"mode": self.mode}
|
return {"mode": self.mode}
|
||||||
|
|
||||||
def as_btminer_v3(self) -> dict:
|
|
||||||
return {"set.miner.service": "start", "set.miner.power_mode": self.mode}
|
|
||||||
|
|
||||||
def as_auradine(self) -> dict:
|
def as_auradine(self) -> dict:
|
||||||
return {"mode": {"mode": "turbo"}}
|
return {"mode": {"mode": "turbo"}}
|
||||||
|
|
||||||
@@ -221,22 +174,11 @@ class MiningModePowerTune(MinerConfigValue):
|
|||||||
return {"miner-mode": "0"}
|
return {"miner-mode": "0"}
|
||||||
return {"miner-mode": 0}
|
return {"miner-mode": 0}
|
||||||
|
|
||||||
def as_hiveon_modern(self) -> dict:
|
|
||||||
if settings.get("antminer_mining_mode_as_str", False):
|
|
||||||
return {"miner-mode": "0"}
|
|
||||||
return {"miner-mode": 0}
|
|
||||||
|
|
||||||
def as_elphapex(self) -> dict:
|
|
||||||
return {"miner-mode": 0}
|
|
||||||
|
|
||||||
def as_wm(self) -> dict:
|
def as_wm(self) -> dict:
|
||||||
if self.power is not None:
|
if self.power is not None:
|
||||||
return {"mode": self.mode, self.mode: {"wattage": self.power}}
|
return {"mode": self.mode, self.mode: {"wattage": self.power}}
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
def as_btminer_v3(self) -> dict:
|
|
||||||
return {"set.miner.service": "start", "set.miner.power_limit": self.power}
|
|
||||||
|
|
||||||
def as_bosminer(self) -> dict:
|
def as_bosminer(self) -> dict:
|
||||||
tuning_cfg = {"enabled": True, "mode": "power_target"}
|
tuning_cfg = {"enabled": True, "mode": "power_target"}
|
||||||
if self.power is not None:
|
if self.power is not None:
|
||||||
@@ -273,18 +215,18 @@ class MiningModePowerTune(MinerConfigValue):
|
|||||||
sd_cfg = {}
|
sd_cfg = {}
|
||||||
if self.scaling.shutdown is not None:
|
if self.scaling.shutdown is not None:
|
||||||
sd_cfg = self.scaling.shutdown.as_boser()
|
sd_cfg = self.scaling.shutdown.as_boser()
|
||||||
power_target_kwargs = {}
|
cfg["set_dps"] = (
|
||||||
if self.scaling.step is not None:
|
SetDpsRequest(
|
||||||
power_target_kwargs["power_step"] = Power(self.scaling.step)
|
enable=True,
|
||||||
if self.scaling.minimum is not None:
|
**sd_cfg,
|
||||||
power_target_kwargs["min_power_target"] = Power(self.scaling.minimum)
|
target=DpsTarget(
|
||||||
cfg["set_dps"] = SetDpsRequest(
|
power_target=DpsPowerTarget(
|
||||||
save_action=SaveAction.SAVE_AND_APPLY,
|
power_step=Power(self.scaling.step),
|
||||||
enable=True,
|
min_power_target=Power(self.scaling.minimum),
|
||||||
**sd_cfg,
|
)
|
||||||
target=DpsTarget(power_target=DpsPowerTarget(**power_target_kwargs)),
|
),
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
return cfg
|
return cfg
|
||||||
|
|
||||||
def as_auradine(self) -> dict:
|
def as_auradine(self) -> dict:
|
||||||
@@ -331,20 +273,13 @@ class MiningModeHashrateTune(MinerConfigValue):
|
|||||||
return {"miner-mode": "0"}
|
return {"miner-mode": "0"}
|
||||||
return {"miner-mode": 0}
|
return {"miner-mode": 0}
|
||||||
|
|
||||||
def as_hiveon_modern(self) -> dict:
|
|
||||||
if settings.get("antminer_mining_mode_as_str", False):
|
|
||||||
return {"miner-mode": "0"}
|
|
||||||
return {"miner-mode": 0}
|
|
||||||
|
|
||||||
def as_elphapex(self) -> dict:
|
|
||||||
return {"miner-mode": 0}
|
|
||||||
|
|
||||||
def as_bosminer(self) -> dict:
|
def as_bosminer(self) -> dict:
|
||||||
conf = {"enabled": True, "mode": "hashrate_target"}
|
conf = {"enabled": True, "mode": "hashrate_target"}
|
||||||
if self.hashrate is not None:
|
if self.hashrate is not None:
|
||||||
conf["hashrate_target"] = self.hashrate
|
conf["hashrate_target"] = self.hashrate
|
||||||
return {"autotuning": conf}
|
return {"autotuning": conf}
|
||||||
|
|
||||||
|
@property
|
||||||
def as_boser(self) -> dict:
|
def as_boser(self) -> dict:
|
||||||
cfg = {
|
cfg = {
|
||||||
"set_performance_mode": SetPerformanceModeRequest(
|
"set_performance_mode": SetPerformanceModeRequest(
|
||||||
@@ -364,24 +299,18 @@ class MiningModeHashrateTune(MinerConfigValue):
|
|||||||
sd_cfg = {}
|
sd_cfg = {}
|
||||||
if self.scaling.shutdown is not None:
|
if self.scaling.shutdown is not None:
|
||||||
sd_cfg = self.scaling.shutdown.as_boser()
|
sd_cfg = self.scaling.shutdown.as_boser()
|
||||||
hashrate_target_kwargs = {}
|
cfg["set_dps"] = (
|
||||||
if self.scaling.step is not None:
|
SetDpsRequest(
|
||||||
hashrate_target_kwargs["hashrate_step"] = TeraHashrate(
|
enable=True,
|
||||||
self.scaling.step
|
**sd_cfg,
|
||||||
)
|
target=DpsTarget(
|
||||||
if self.scaling.minimum is not None:
|
hashrate_target=DpsHashrateTarget(
|
||||||
hashrate_target_kwargs["min_hashrate_target"] = TeraHashrate(
|
hashrate_step=TeraHashrate(self.scaling.step),
|
||||||
self.scaling.minimum
|
min_hashrate_target=TeraHashrate(self.scaling.minimum),
|
||||||
)
|
)
|
||||||
cfg["set_dps"] = SetDpsRequest(
|
),
|
||||||
save_action=SaveAction.SAVE_AND_APPLY,
|
|
||||||
enable=True,
|
|
||||||
**sd_cfg,
|
|
||||||
target=DpsTarget(
|
|
||||||
hashrate_target=DpsHashrateTarget(**hashrate_target_kwargs)
|
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
return cfg
|
return cfg
|
||||||
|
|
||||||
def as_auradine(self) -> dict:
|
def as_auradine(self) -> dict:
|
||||||
@@ -427,28 +356,24 @@ class MiningModePreset(MinerConfigValue):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_vnish(
|
def from_vnish(
|
||||||
cls,
|
cls, web_overclock_settings: dict, web_presets: list[dict]
|
||||||
web_overclock_settings: dict,
|
|
||||||
web_presets: list[dict],
|
|
||||||
web_perf_summary: dict,
|
|
||||||
) -> "MiningModePreset":
|
) -> "MiningModePreset":
|
||||||
active_preset = web_perf_summary.get("current_preset")
|
active_preset = None
|
||||||
|
for preset in web_presets:
|
||||||
if active_preset is None:
|
if preset["name"] == web_overclock_settings["preset"]:
|
||||||
for preset in web_presets:
|
active_preset = preset
|
||||||
if preset["name"] == web_overclock_settings["preset"]:
|
|
||||||
active_preset = preset
|
|
||||||
|
|
||||||
return cls(
|
return cls(
|
||||||
active_preset=MiningPreset.from_vnish(active_preset),
|
active_preset=MiningPreset.from_vnish(active_preset),
|
||||||
available_presets=[MiningPreset.from_vnish(p) for p in web_presets],
|
available_presets=[MiningPreset.from_vnish(p) for p in web_presets],
|
||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_luxos(cls, rpc_config: dict, rpc_profiles: dict) -> "MiningModePreset":
|
def from_luxos(
|
||||||
|
cls, rpc_config: dict, rpc_profiles: list[dict]
|
||||||
|
) -> "MiningModePreset":
|
||||||
active_preset = cls.get_active_preset_from_luxos(rpc_config, rpc_profiles)
|
active_preset = cls.get_active_preset_from_luxos(rpc_config, rpc_profiles)
|
||||||
return cls(
|
return cls(
|
||||||
active_preset=active_preset,
|
active_preset=MiningPreset.from_luxos(active_preset),
|
||||||
available_presets=[
|
available_presets=[
|
||||||
MiningPreset.from_luxos(p) for p in rpc_profiles["PROFILES"]
|
MiningPreset.from_luxos(p) for p in rpc_profiles["PROFILES"]
|
||||||
],
|
],
|
||||||
@@ -456,14 +381,14 @@ class MiningModePreset(MinerConfigValue):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_active_preset_from_luxos(
|
def get_active_preset_from_luxos(
|
||||||
cls, rpc_config: dict, rpc_profiles: dict
|
cls, rpc_config: dict, rpc_profiles: list[dict]
|
||||||
) -> MiningPreset:
|
) -> dict:
|
||||||
active_preset = None
|
active_preset = None
|
||||||
active_profile = rpc_config["CONFIG"][0]["Profile"]
|
active_profile = rpc_config["CONFIG"][0]["Profile"]
|
||||||
for profile in rpc_profiles["PROFILES"]:
|
for profile in rpc_profiles["PROFILES"]:
|
||||||
if profile["Profile Name"] == active_profile:
|
if profile["Profile Name"] == active_profile:
|
||||||
active_preset = profile
|
active_preset = profile
|
||||||
return MiningPreset.from_luxos(active_preset)
|
return active_preset
|
||||||
|
|
||||||
|
|
||||||
class ManualBoardSettings(MinerConfigValue):
|
class ManualBoardSettings(MinerConfigValue):
|
||||||
@@ -479,14 +404,6 @@ class ManualBoardSettings(MinerConfigValue):
|
|||||||
return {"miner-mode": "0"}
|
return {"miner-mode": "0"}
|
||||||
return {"miner-mode": 0}
|
return {"miner-mode": 0}
|
||||||
|
|
||||||
def as_hiveon_modern(self) -> dict:
|
|
||||||
if settings.get("antminer_mining_mode_as_str", False):
|
|
||||||
return {"miner-mode": "0"}
|
|
||||||
return {"miner-mode": 0}
|
|
||||||
|
|
||||||
def as_elphapex(self) -> dict:
|
|
||||||
return {"miner-mode": 0}
|
|
||||||
|
|
||||||
def as_vnish(self) -> dict:
|
def as_vnish(self) -> dict:
|
||||||
return {"freq": self.freq}
|
return {"freq": self.freq}
|
||||||
|
|
||||||
@@ -511,9 +428,6 @@ class MiningModeManual(MinerConfigValue):
|
|||||||
return {"miner-mode": "0"}
|
return {"miner-mode": "0"}
|
||||||
return {"miner-mode": 0}
|
return {"miner-mode": 0}
|
||||||
|
|
||||||
def as_elphapex(self) -> dict:
|
|
||||||
return {"miner-mode": 0}
|
|
||||||
|
|
||||||
def as_vnish(self) -> dict:
|
def as_vnish(self) -> dict:
|
||||||
chains = [b.as_vnish() for b in self.boards.values() if b.freq != 0]
|
chains = [b.as_vnish() for b in self.boards.values() if b.freq != 0]
|
||||||
return {
|
return {
|
||||||
@@ -611,34 +525,6 @@ class MiningModeConfig(MinerConfigOption):
|
|||||||
return cls.low()
|
return cls.low()
|
||||||
return cls.default()
|
return cls.default()
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_hiveon_modern(cls, web_conf: dict):
|
|
||||||
if web_conf.get("bitmain-work-mode") is not None:
|
|
||||||
work_mode = web_conf["bitmain-work-mode"]
|
|
||||||
if work_mode == "":
|
|
||||||
return cls.default()
|
|
||||||
if int(work_mode) == 0:
|
|
||||||
return cls.normal()
|
|
||||||
elif int(work_mode) == 1:
|
|
||||||
return cls.sleep()
|
|
||||||
elif int(work_mode) == 3:
|
|
||||||
return cls.low()
|
|
||||||
return cls.default()
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_elphapex(cls, web_conf: dict):
|
|
||||||
if web_conf.get("fc-work-mode") is not None:
|
|
||||||
work_mode = web_conf["fc-work-mode"]
|
|
||||||
if work_mode == "":
|
|
||||||
return cls.default()
|
|
||||||
if int(work_mode) == 0:
|
|
||||||
return cls.normal()
|
|
||||||
elif int(work_mode) == 1:
|
|
||||||
return cls.sleep()
|
|
||||||
elif int(work_mode) == 3:
|
|
||||||
return cls.low()
|
|
||||||
return cls.default()
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_epic(cls, web_conf: dict):
|
def from_epic(cls, web_conf: dict):
|
||||||
try:
|
try:
|
||||||
@@ -721,12 +607,9 @@ class MiningModeConfig(MinerConfigOption):
|
|||||||
return cls.hashrate_tuning(
|
return cls.hashrate_tuning(
|
||||||
scaling=ScalingConfig.from_bosminer(toml_conf, mode="hashrate"),
|
scaling=ScalingConfig.from_bosminer(toml_conf, mode="hashrate"),
|
||||||
)
|
)
|
||||||
return cls.default()
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_vnish(
|
def from_vnish(cls, web_settings: dict, web_presets: list[dict]):
|
||||||
cls, web_settings: dict, web_presets: list[dict], web_perf_summary: dict
|
|
||||||
):
|
|
||||||
try:
|
try:
|
||||||
mode_settings = web_settings["miner"]["overclock"]
|
mode_settings = web_settings["miner"]["overclock"]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
@@ -735,9 +618,7 @@ class MiningModeConfig(MinerConfigOption):
|
|||||||
if mode_settings["preset"] == "disabled":
|
if mode_settings["preset"] == "disabled":
|
||||||
return MiningModeManual.from_vnish(mode_settings)
|
return MiningModeManual.from_vnish(mode_settings)
|
||||||
else:
|
else:
|
||||||
return MiningModePreset.from_vnish(
|
return MiningModePreset.from_vnish(mode_settings, web_presets)
|
||||||
mode_settings, web_presets, web_perf_summary
|
|
||||||
)
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_boser(cls, grpc_miner_conf: dict):
|
def from_boser(cls, grpc_miner_conf: dict):
|
||||||
@@ -804,26 +685,6 @@ class MiningModeConfig(MinerConfigOption):
|
|||||||
except LookupError:
|
except LookupError:
|
||||||
return cls.default()
|
return cls.default()
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_btminer_v3(cls, rpc_device_info: dict, rpc_settings: dict):
|
|
||||||
try:
|
|
||||||
is_mining = rpc_device_info["msg"]["miner"]["working"] == "true"
|
|
||||||
if not is_mining:
|
|
||||||
return cls.sleep()
|
|
||||||
power_limit = rpc_settings["msg"]["power-limit"]
|
|
||||||
if not power_limit == 0:
|
|
||||||
return cls.power_tuning(power=power_limit)
|
|
||||||
power_mode = rpc_settings["msg"]["power-mode"]
|
|
||||||
if power_mode == "normal":
|
|
||||||
return cls.normal()
|
|
||||||
if power_mode == "high":
|
|
||||||
return cls.high()
|
|
||||||
if power_mode == "low":
|
|
||||||
return cls.low()
|
|
||||||
|
|
||||||
except LookupError:
|
|
||||||
return cls.default()
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_mara(cls, web_config: dict):
|
def from_mara(cls, web_config: dict):
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from dataclasses import field
|
from dataclasses import dataclass, field
|
||||||
from typing import TypeVar, Union
|
from typing import TypeVar, Union
|
||||||
|
|
||||||
from pyasic.config.base import MinerConfigOption, MinerConfigValue
|
from pyasic.config.base import MinerConfigOption, MinerConfigValue
|
||||||
|
|||||||
@@ -24,14 +24,7 @@ class MiningPreset(MinerConfigValue):
|
|||||||
hashrate = None
|
hashrate = None
|
||||||
else:
|
else:
|
||||||
power = hr_power_split[0].replace("watt", "").strip()
|
power = hr_power_split[0].replace("watt", "").strip()
|
||||||
hashrate = (
|
hashrate = hr_power_split[1].replace("TH", "").replace(" LC", "").strip()
|
||||||
hr_power_split[1]
|
|
||||||
.replace("TH", "")
|
|
||||||
.replace("GH", "")
|
|
||||||
.replace("MH", "")
|
|
||||||
.replace(" LC", "")
|
|
||||||
.strip()
|
|
||||||
)
|
|
||||||
tuned = web_preset["status"] == "tuned"
|
tuned = web_preset["status"] == "tuned"
|
||||||
modded_psu = web_preset["modded_psu_required"]
|
modded_psu = web_preset["modded_psu_required"]
|
||||||
return cls(
|
return cls(
|
||||||
|
|||||||
@@ -15,6 +15,8 @@
|
|||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from dataclasses import dataclass
|
||||||
|
|
||||||
from pyasic.config.base import MinerConfigValue
|
from pyasic.config.base import MinerConfigValue
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -43,20 +43,6 @@ class Pool(MinerConfigValue):
|
|||||||
"pass": self.password,
|
"pass": self.password,
|
||||||
}
|
}
|
||||||
|
|
||||||
def as_hiveon_modern(self, user_suffix: str | None = None) -> dict:
|
|
||||||
return {
|
|
||||||
"url": self.url,
|
|
||||||
"user": f"{self.user}{user_suffix or ''}",
|
|
||||||
"pass": self.password,
|
|
||||||
}
|
|
||||||
|
|
||||||
def as_elphapex(self, user_suffix: str | None = None) -> dict:
|
|
||||||
return {
|
|
||||||
"url": self.url,
|
|
||||||
"user": f"{self.user}{user_suffix or ''}",
|
|
||||||
"pass": self.password,
|
|
||||||
}
|
|
||||||
|
|
||||||
def as_wm(self, idx: int = 1, user_suffix: str | None = None) -> dict:
|
def as_wm(self, idx: int = 1, user_suffix: str | None = None) -> dict:
|
||||||
return {
|
return {
|
||||||
f"pool_{idx}": self.url,
|
f"pool_{idx}": self.url,
|
||||||
@@ -64,13 +50,6 @@ class Pool(MinerConfigValue):
|
|||||||
f"passwd_{idx}": self.password,
|
f"passwd_{idx}": self.password,
|
||||||
}
|
}
|
||||||
|
|
||||||
def as_btminer_v3(self, user_suffix: str | None = None) -> dict:
|
|
||||||
return {
|
|
||||||
f"pool": self.url,
|
|
||||||
f"worker": f"{self.user}{user_suffix or ''}",
|
|
||||||
f"passwd": self.password,
|
|
||||||
}
|
|
||||||
|
|
||||||
def as_am_old(self, idx: int = 1, user_suffix: str | None = None) -> dict:
|
def as_am_old(self, idx: int = 1, user_suffix: str | None = None) -> dict:
|
||||||
return {
|
return {
|
||||||
f"_ant_pool{idx}url": self.url,
|
f"_ant_pool{idx}url": self.url,
|
||||||
@@ -123,7 +102,7 @@ class Pool(MinerConfigValue):
|
|||||||
"pass": self.password,
|
"pass": self.password,
|
||||||
}
|
}
|
||||||
|
|
||||||
def as_espminer(self, user_suffix: str | None = None) -> dict:
|
def as_bitaxe(self, user_suffix: str | None = None) -> dict:
|
||||||
return {
|
return {
|
||||||
"stratumURL": self.url,
|
"stratumURL": self.url,
|
||||||
"stratumUser": f"{self.user}{user_suffix or ''}",
|
"stratumUser": f"{self.user}{user_suffix or ''}",
|
||||||
@@ -155,10 +134,6 @@ class Pool(MinerConfigValue):
|
|||||||
def from_api(cls, api_pool: dict) -> "Pool":
|
def from_api(cls, api_pool: dict) -> "Pool":
|
||||||
return cls(url=api_pool["URL"], user=api_pool["User"], password="x")
|
return cls(url=api_pool["URL"], user=api_pool["User"], password="x")
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_btminer_v3(cls, api_pool: dict) -> "Pool":
|
|
||||||
return cls(url=api_pool["url"], user=api_pool["account"], password="x")
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_epic(cls, api_pool: dict) -> "Pool":
|
def from_epic(cls, api_pool: dict) -> "Pool":
|
||||||
return cls(
|
return cls(
|
||||||
@@ -171,18 +146,6 @@ class Pool(MinerConfigValue):
|
|||||||
url=web_pool["url"], user=web_pool["user"], password=web_pool["pass"]
|
url=web_pool["url"], user=web_pool["user"], password=web_pool["pass"]
|
||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_hiveon_modern(cls, web_pool: dict) -> "Pool":
|
|
||||||
return cls(
|
|
||||||
url=web_pool["url"], user=web_pool["user"], password=web_pool["pass"]
|
|
||||||
)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_elphapex(cls, web_pool: dict) -> "Pool":
|
|
||||||
return cls(
|
|
||||||
url=web_pool["url"], user=web_pool["user"], password=web_pool["pass"]
|
|
||||||
)
|
|
||||||
|
|
||||||
# TODO: check if this is accurate, user/username, pass/password
|
# TODO: check if this is accurate, user/username, pass/password
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_goldshell(cls, web_pool: dict) -> "Pool":
|
def from_goldshell(cls, web_pool: dict) -> "Pool":
|
||||||
@@ -201,7 +164,7 @@ class Pool(MinerConfigValue):
|
|||||||
return cls(
|
return cls(
|
||||||
url=toml_pool_conf["url"],
|
url=toml_pool_conf["url"],
|
||||||
user=toml_pool_conf["user"],
|
user=toml_pool_conf["user"],
|
||||||
password=toml_pool_conf.get("password", ""),
|
password=toml_pool_conf["password"],
|
||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@@ -229,7 +192,7 @@ class Pool(MinerConfigValue):
|
|||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_espminer(cls, web_system_info: dict) -> "Pool":
|
def from_bitaxe(cls, web_system_info: dict) -> "Pool":
|
||||||
url = f"stratum+tcp://{web_system_info['stratumURL']}:{web_system_info['stratumPort']}"
|
url = f"stratum+tcp://{web_system_info['stratumURL']}:{web_system_info['stratumPort']}"
|
||||||
return cls(
|
return cls(
|
||||||
url=url,
|
url=url,
|
||||||
@@ -272,28 +235,6 @@ class PoolGroup(MinerConfigValue):
|
|||||||
idx += 1
|
idx += 1
|
||||||
return pools
|
return pools
|
||||||
|
|
||||||
def as_hiveon_modern(self, user_suffix: str | None = None) -> list:
|
|
||||||
pools = []
|
|
||||||
idx = 0
|
|
||||||
while idx < 3:
|
|
||||||
if len(self.pools) > idx:
|
|
||||||
pools.append(self.pools[idx].as_hiveon_modern(user_suffix=user_suffix))
|
|
||||||
else:
|
|
||||||
pools.append(Pool(url="", user="", password="").as_hiveon_modern())
|
|
||||||
idx += 1
|
|
||||||
return pools
|
|
||||||
|
|
||||||
def as_elphapex(self, user_suffix: str | None = None) -> list:
|
|
||||||
pools = []
|
|
||||||
idx = 0
|
|
||||||
while idx < 3:
|
|
||||||
if len(self.pools) > idx:
|
|
||||||
pools.append(self.pools[idx].as_elphapex(user_suffix=user_suffix))
|
|
||||||
else:
|
|
||||||
pools.append(Pool(url="", user="", password="").as_elphapex())
|
|
||||||
idx += 1
|
|
||||||
return pools
|
|
||||||
|
|
||||||
def as_wm(self, user_suffix: str | None = None) -> dict:
|
def as_wm(self, user_suffix: str | None = None) -> dict:
|
||||||
pools = {}
|
pools = {}
|
||||||
idx = 0
|
idx = 0
|
||||||
@@ -307,9 +248,6 @@ class PoolGroup(MinerConfigValue):
|
|||||||
idx += 1
|
idx += 1
|
||||||
return pools
|
return pools
|
||||||
|
|
||||||
def as_btminer_v3(self, user_suffix: str | None = None) -> list:
|
|
||||||
return [pool.as_btminer_v3(user_suffix) for pool in self.pools[:3]]
|
|
||||||
|
|
||||||
def as_am_old(self, user_suffix: str | None = None) -> dict:
|
def as_am_old(self, user_suffix: str | None = None) -> dict:
|
||||||
pools = {}
|
pools = {}
|
||||||
idx = 0
|
idx = 0
|
||||||
@@ -368,8 +306,8 @@ class PoolGroup(MinerConfigValue):
|
|||||||
def as_mara(self, user_suffix: str | None = None) -> list:
|
def as_mara(self, user_suffix: str | None = None) -> list:
|
||||||
return [p.as_mara(user_suffix=user_suffix) for p in self.pools]
|
return [p.as_mara(user_suffix=user_suffix) for p in self.pools]
|
||||||
|
|
||||||
def as_espminer(self, user_suffix: str | None = None) -> dict:
|
def as_bitaxe(self, user_suffix: str | None = None) -> dict:
|
||||||
return self.pools[0].as_espminer(user_suffix=user_suffix)
|
return self.pools[0].as_bitaxe(user_suffix=user_suffix)
|
||||||
|
|
||||||
def as_boser(self, user_suffix: str | None = None) -> PoolGroupConfiguration:
|
def as_boser(self, user_suffix: str | None = None) -> PoolGroupConfiguration:
|
||||||
return PoolGroupConfiguration(
|
return PoolGroupConfiguration(
|
||||||
@@ -399,13 +337,6 @@ class PoolGroup(MinerConfigValue):
|
|||||||
pools.append(Pool.from_api(pool))
|
pools.append(Pool.from_api(pool))
|
||||||
return cls(pools=pools)
|
return cls(pools=pools)
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_btminer_v3(cls, api_pool_list: list) -> "PoolGroup":
|
|
||||||
pools = []
|
|
||||||
for pool in api_pool_list:
|
|
||||||
pools.append(Pool.from_btminer_v3(pool))
|
|
||||||
return cls(pools=pools)
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_epic(cls, api_pool_list: list) -> "PoolGroup":
|
def from_epic(cls, api_pool_list: list) -> "PoolGroup":
|
||||||
pools = []
|
pools = []
|
||||||
@@ -420,20 +351,6 @@ class PoolGroup(MinerConfigValue):
|
|||||||
pools.append(Pool.from_am_modern(pool))
|
pools.append(Pool.from_am_modern(pool))
|
||||||
return cls(pools=pools)
|
return cls(pools=pools)
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_hiveon_modern(cls, web_pool_list: list) -> "PoolGroup":
|
|
||||||
pools = []
|
|
||||||
for pool in web_pool_list:
|
|
||||||
pools.append(Pool.from_hiveon_modern(pool))
|
|
||||||
return cls(pools=pools)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_elphapex(cls, web_pool_list: list) -> "PoolGroup":
|
|
||||||
pools = []
|
|
||||||
for pool in web_pool_list:
|
|
||||||
pools.append(Pool.from_elphapex(pool))
|
|
||||||
return cls(pools=pools)
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_goldshell(cls, web_pools: list) -> "PoolGroup":
|
def from_goldshell(cls, web_pools: list) -> "PoolGroup":
|
||||||
return cls(pools=[Pool.from_goldshell(p) for p in web_pools])
|
return cls(pools=[Pool.from_goldshell(p) for p in web_pools])
|
||||||
@@ -478,8 +395,8 @@ class PoolGroup(MinerConfigValue):
|
|||||||
return cls(pools=[Pool.from_mara(pool_conf) for pool_conf in web_config_pools])
|
return cls(pools=[Pool.from_mara(pool_conf) for pool_conf in web_config_pools])
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_espminer(cls, web_system_info: dict) -> "PoolGroup":
|
def from_bitaxe(cls, web_system_info: dict) -> "PoolGroup":
|
||||||
return cls(pools=[Pool.from_espminer(web_system_info)])
|
return cls(pools=[Pool.from_bitaxe(web_system_info)])
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_iceriver(cls, web_userpanel: dict) -> "PoolGroup":
|
def from_iceriver(cls, web_userpanel: dict) -> "PoolGroup":
|
||||||
@@ -519,26 +436,11 @@ class PoolConfig(MinerConfigValue):
|
|||||||
return {"pools": self.groups[0].as_am_modern(user_suffix=user_suffix)}
|
return {"pools": self.groups[0].as_am_modern(user_suffix=user_suffix)}
|
||||||
return {"pools": PoolGroup().as_am_modern()}
|
return {"pools": PoolGroup().as_am_modern()}
|
||||||
|
|
||||||
def as_hiveon_modern(self, user_suffix: str | None = None) -> dict:
|
|
||||||
if len(self.groups) > 0:
|
|
||||||
return {"pools": self.groups[0].as_hiveon_modern(user_suffix=user_suffix)}
|
|
||||||
return {"pools": PoolGroup().as_hiveon_modern()}
|
|
||||||
|
|
||||||
def as_elphapex(self, user_suffix: str | None = None) -> dict:
|
|
||||||
if len(self.groups) > 0:
|
|
||||||
return {"pools": self.groups[0].as_elphapex(user_suffix=user_suffix)}
|
|
||||||
return {"pools": PoolGroup().as_elphapex()}
|
|
||||||
|
|
||||||
def as_wm(self, user_suffix: str | None = None) -> dict:
|
def as_wm(self, user_suffix: str | None = None) -> dict:
|
||||||
if len(self.groups) > 0:
|
if len(self.groups) > 0:
|
||||||
return {"pools": self.groups[0].as_wm(user_suffix=user_suffix)}
|
return {"pools": self.groups[0].as_wm(user_suffix=user_suffix)}
|
||||||
return {"pools": PoolGroup().as_wm()}
|
return {"pools": PoolGroup().as_wm()}
|
||||||
|
|
||||||
def as_btminer_v3(self, user_suffix: str | None = None) -> dict:
|
|
||||||
if len(self.groups) > 0:
|
|
||||||
return {"pools": self.groups[0].as_btminer_v3(user_suffix=user_suffix)}
|
|
||||||
return {"pools": PoolGroup().as_btminer_v3()}
|
|
||||||
|
|
||||||
def as_am_old(self, user_suffix: str | None = None) -> dict:
|
def as_am_old(self, user_suffix: str | None = None) -> dict:
|
||||||
if len(self.groups) > 0:
|
if len(self.groups) > 0:
|
||||||
return self.groups[0].as_am_old(user_suffix=user_suffix)
|
return self.groups[0].as_am_old(user_suffix=user_suffix)
|
||||||
@@ -605,8 +507,8 @@ class PoolConfig(MinerConfigValue):
|
|||||||
return {"pools": self.groups[0].as_mara(user_suffix=user_suffix)}
|
return {"pools": self.groups[0].as_mara(user_suffix=user_suffix)}
|
||||||
return {"pools": []}
|
return {"pools": []}
|
||||||
|
|
||||||
def as_espminer(self, user_suffix: str | None = None) -> dict:
|
def as_bitaxe(self, user_suffix: str | None = None) -> dict:
|
||||||
return self.groups[0].as_espminer(user_suffix=user_suffix)
|
return self.groups[0].as_bitaxe(user_suffix=user_suffix)
|
||||||
|
|
||||||
def as_luxos(self, user_suffix: str | None = None) -> dict:
|
def as_luxos(self, user_suffix: str | None = None) -> dict:
|
||||||
return {}
|
return {}
|
||||||
@@ -624,16 +526,6 @@ class PoolConfig(MinerConfigValue):
|
|||||||
|
|
||||||
return cls(groups=[PoolGroup.from_api(pool_data)])
|
return cls(groups=[PoolGroup.from_api(pool_data)])
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_btminer_v3(cls, rpc_pools: dict) -> "PoolConfig":
|
|
||||||
try:
|
|
||||||
pool_data = rpc_pools["pools"]
|
|
||||||
except KeyError:
|
|
||||||
return PoolConfig.default()
|
|
||||||
pool_data = sorted(pool_data, key=lambda x: int(x["id"]))
|
|
||||||
|
|
||||||
return cls(groups=[PoolGroup.from_btminer_v3(pool_data)])
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_epic(cls, web_conf: dict) -> "PoolConfig":
|
def from_epic(cls, web_conf: dict) -> "PoolConfig":
|
||||||
pool_data = web_conf["StratumConfigs"]
|
pool_data = web_conf["StratumConfigs"]
|
||||||
@@ -641,42 +533,14 @@ class PoolConfig(MinerConfigValue):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_am_modern(cls, web_conf: dict) -> "PoolConfig":
|
def from_am_modern(cls, web_conf: dict) -> "PoolConfig":
|
||||||
try:
|
pool_data = web_conf["pools"]
|
||||||
pool_data = web_conf["pools"]
|
|
||||||
except KeyError:
|
|
||||||
return cls(groups=[])
|
|
||||||
|
|
||||||
return cls(groups=[PoolGroup.from_am_modern(pool_data)])
|
return cls(groups=[PoolGroup.from_am_modern(pool_data)])
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_hiveon_modern(cls, web_conf: dict) -> "PoolConfig":
|
|
||||||
try:
|
|
||||||
pool_data = web_conf["pools"]
|
|
||||||
except KeyError:
|
|
||||||
return cls(groups=[])
|
|
||||||
|
|
||||||
return cls(groups=[PoolGroup.from_hiveon_modern(pool_data)])
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_elphapex(cls, web_conf: dict) -> "PoolConfig":
|
|
||||||
pool_data = web_conf["pools"]
|
|
||||||
|
|
||||||
return cls(groups=[PoolGroup.from_elphapex(pool_data)])
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_goldshell(cls, web_pools: list) -> "PoolConfig":
|
def from_goldshell(cls, web_pools: list) -> "PoolConfig":
|
||||||
return cls(groups=[PoolGroup.from_goldshell(web_pools)])
|
return cls(groups=[PoolGroup.from_goldshell(web_pools)])
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_goldshell_byte(cls, web_pools: list) -> "PoolConfig":
|
|
||||||
return cls(
|
|
||||||
groups=[
|
|
||||||
PoolGroup.from_goldshell(g["pools"])
|
|
||||||
for g in web_pools
|
|
||||||
if len(g["pools"]) > 0
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_inno(cls, web_pools: list) -> "PoolConfig":
|
def from_inno(cls, web_pools: list) -> "PoolConfig":
|
||||||
return cls(groups=[PoolGroup.from_inno(web_pools)])
|
return cls(groups=[PoolGroup.from_inno(web_pools)])
|
||||||
@@ -712,8 +576,8 @@ class PoolConfig(MinerConfigValue):
|
|||||||
return cls(groups=[PoolGroup.from_mara(web_config["pools"])])
|
return cls(groups=[PoolGroup.from_mara(web_config["pools"])])
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_espminer(cls, web_system_info: dict) -> "PoolConfig":
|
def from_bitaxe(cls, web_system_info: dict) -> "PoolConfig":
|
||||||
return cls(groups=[PoolGroup.from_espminer(web_system_info)])
|
return cls(groups=[PoolGroup.from_bitaxe(web_system_info)])
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_iceriver(cls, web_userpanel: dict) -> "PoolConfig":
|
def from_iceriver(cls, web_userpanel: dict) -> "PoolConfig":
|
||||||
|
|||||||
@@ -15,6 +15,8 @@
|
|||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from dataclasses import dataclass
|
||||||
|
|
||||||
from pyasic.config.base import MinerConfigValue
|
from pyasic.config.base import MinerConfigValue
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
import copy
|
import copy
|
||||||
import time
|
import time
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
from typing import Any
|
from typing import Any, List, Union
|
||||||
|
|
||||||
from pydantic import BaseModel, Field, computed_field
|
from pydantic import BaseModel, Field, computed_field
|
||||||
|
|
||||||
@@ -24,11 +24,12 @@ from pyasic.config import MinerConfig
|
|||||||
from pyasic.config.mining import MiningModePowerTune
|
from pyasic.config.mining import MiningModePowerTune
|
||||||
from pyasic.data.pools import PoolMetrics, Scheme
|
from pyasic.data.pools import PoolMetrics, Scheme
|
||||||
from pyasic.device.algorithm.hashrate import AlgoHashRateType
|
from pyasic.device.algorithm.hashrate import AlgoHashRateType
|
||||||
|
from pyasic.device.algorithm.hashrate.base import GenericHashrate
|
||||||
|
|
||||||
|
from ..device.algorithm.hashrate.unit.base import GenericUnit
|
||||||
from .boards import HashBoard
|
from .boards import HashBoard
|
||||||
from .device import DeviceInfo
|
from .device import DeviceInfo
|
||||||
from .error_codes import BraiinsOSError, InnosiliconError, WhatsminerError, X19Error
|
from .error_codes import BraiinsOSError, InnosiliconError, WhatsminerError, X19Error
|
||||||
from .error_codes.base import BaseMinerError
|
|
||||||
from .fans import Fan
|
from .fans import Fan
|
||||||
|
|
||||||
|
|
||||||
@@ -70,7 +71,6 @@ class MinerData(BaseModel):
|
|||||||
errors: A list of errors on the miner.
|
errors: A list of errors on the miner.
|
||||||
fault_light: Whether the fault light is on as a boolean.
|
fault_light: Whether the fault light is on as a boolean.
|
||||||
efficiency: Efficiency of the miner in J/TH (Watts per TH/s). Calculated automatically.
|
efficiency: Efficiency of the miner in J/TH (Watts per TH/s). Calculated automatically.
|
||||||
efficiency_fract: Same as efficiency, but is not rounded to integer. Calculated automatically.
|
|
||||||
is_mining: Whether the miner is mining.
|
is_mining: Whether the miner is mining.
|
||||||
pools: A list of PoolMetrics instances, each representing metrics for a pool.
|
pools: A list of PoolMetrics instances, each representing metrics for a pool.
|
||||||
"""
|
"""
|
||||||
@@ -109,18 +109,25 @@ class MinerData(BaseModel):
|
|||||||
raw_wattage_limit: int | None = Field(exclude=True, default=None, repr=False)
|
raw_wattage_limit: int | None = Field(exclude=True, default=None, repr=False)
|
||||||
|
|
||||||
# fans
|
# fans
|
||||||
fans: list[Fan] = Field(default_factory=list)
|
fans: List[Fan] = Field(default_factory=list)
|
||||||
fan_psu: int | None = None
|
fan_psu: int | None = None
|
||||||
|
|
||||||
# boards
|
# boards
|
||||||
hashboards: list[HashBoard] = Field(default_factory=list)
|
hashboards: List[HashBoard] = Field(default_factory=list)
|
||||||
|
|
||||||
# config
|
# config
|
||||||
config: MinerConfig | None = None
|
config: MinerConfig | None = None
|
||||||
fault_light: bool | None = None
|
fault_light: bool | None = None
|
||||||
|
|
||||||
# errors
|
# errors
|
||||||
errors: list[BaseMinerError] = Field(default_factory=list)
|
errors: List[
|
||||||
|
Union[
|
||||||
|
WhatsminerError,
|
||||||
|
BraiinsOSError,
|
||||||
|
X19Error,
|
||||||
|
InnosiliconError,
|
||||||
|
]
|
||||||
|
] = Field(default_factory=list)
|
||||||
|
|
||||||
# mining state
|
# mining state
|
||||||
is_mining: bool = True
|
is_mining: bool = True
|
||||||
@@ -130,10 +137,8 @@ class MinerData(BaseModel):
|
|||||||
pools: list[PoolMetrics] = Field(default_factory=list)
|
pools: list[PoolMetrics] = Field(default_factory=list)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def fields(cls) -> set:
|
def fields(cls):
|
||||||
all_fields = set(cls.model_fields.keys())
|
return list(cls.model_fields.keys())
|
||||||
all_fields.update(set(cls.model_computed_fields.keys()))
|
|
||||||
return all_fields
|
|
||||||
|
|
||||||
def get(self, __key: str, default: Any = None):
|
def get(self, __key: str, default: Any = None):
|
||||||
try:
|
try:
|
||||||
@@ -285,24 +290,12 @@ class MinerData(BaseModel):
|
|||||||
@computed_field # type: ignore[misc]
|
@computed_field # type: ignore[misc]
|
||||||
@property
|
@property
|
||||||
def efficiency(self) -> int | None:
|
def efficiency(self) -> int | None:
|
||||||
efficiency = self._efficiency(0)
|
|
||||||
if efficiency is None:
|
|
||||||
return None
|
|
||||||
else:
|
|
||||||
return int(efficiency)
|
|
||||||
|
|
||||||
@computed_field # type: ignore[misc]
|
|
||||||
@property
|
|
||||||
def efficiency_fract(self) -> float | None:
|
|
||||||
return self._efficiency(2)
|
|
||||||
|
|
||||||
def _efficiency(self, ndigits: int) -> float | None:
|
|
||||||
if self.hashrate is None or self.wattage is None:
|
if self.hashrate is None or self.wattage is None:
|
||||||
return None
|
return None
|
||||||
try:
|
try:
|
||||||
return round(self.wattage / float(self.hashrate), ndigits)
|
return round(self.wattage / float(self.hashrate))
|
||||||
except ZeroDivisionError:
|
except ZeroDivisionError:
|
||||||
return 0.0
|
return 0
|
||||||
|
|
||||||
@computed_field # type: ignore[misc]
|
@computed_field # type: ignore[misc]
|
||||||
@property
|
@property
|
||||||
@@ -316,25 +309,25 @@ class MinerData(BaseModel):
|
|||||||
|
|
||||||
@computed_field # type: ignore[misc]
|
@computed_field # type: ignore[misc]
|
||||||
@property
|
@property
|
||||||
def make(self) -> str | None:
|
def make(self) -> str:
|
||||||
if self.device_info.make is not None:
|
if self.device_info.make is not None:
|
||||||
return str(self.device_info.make)
|
return str(self.device_info.make)
|
||||||
|
|
||||||
@computed_field # type: ignore[misc]
|
@computed_field # type: ignore[misc]
|
||||||
@property
|
@property
|
||||||
def model(self) -> str | None:
|
def model(self) -> str:
|
||||||
if self.device_info.model is not None:
|
if self.device_info.model is not None:
|
||||||
return str(self.device_info.model)
|
return str(self.device_info.model)
|
||||||
|
|
||||||
@computed_field # type: ignore[misc]
|
@computed_field # type: ignore[misc]
|
||||||
@property
|
@property
|
||||||
def firmware(self) -> str | None:
|
def firmware(self) -> str:
|
||||||
if self.device_info.firmware is not None:
|
if self.device_info.firmware is not None:
|
||||||
return str(self.device_info.firmware)
|
return str(self.device_info.firmware)
|
||||||
|
|
||||||
@computed_field # type: ignore[misc]
|
@computed_field # type: ignore[misc]
|
||||||
@property
|
@property
|
||||||
def algo(self) -> str | None:
|
def algo(self) -> str:
|
||||||
if self.device_info.algo is not None:
|
if self.device_info.algo is not None:
|
||||||
return str(self.device_info.algo)
|
return str(self.device_info.algo)
|
||||||
|
|
||||||
@@ -374,9 +367,7 @@ class MinerData(BaseModel):
|
|||||||
data_list = [str(data[item]) for item in data]
|
data_list = [str(data[item]) for item in data]
|
||||||
return ",".join(data_list)
|
return ",".join(data_list)
|
||||||
|
|
||||||
def as_influxdb(
|
def as_influxdb(self, measurement_name: str = "miner_data") -> str:
|
||||||
self, measurement_name: str = "miner_data", level_delimiter: str = "."
|
|
||||||
) -> str:
|
|
||||||
"""Get this dataclass as [influxdb line protocol](https://docs.influxdata.com/influxdb/v2.4/reference/syntax/line-protocol/).
|
"""Get this dataclass as [influxdb line protocol](https://docs.influxdata.com/influxdb/v2.4/reference/syntax/line-protocol/).
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
@@ -385,127 +376,54 @@ class MinerData(BaseModel):
|
|||||||
Returns:
|
Returns:
|
||||||
A influxdb line protocol version of this class.
|
A influxdb line protocol version of this class.
|
||||||
"""
|
"""
|
||||||
|
tag_data = [measurement_name]
|
||||||
def serialize_int(key: str, value: int) -> str:
|
|
||||||
return f"{key}={value}"
|
|
||||||
|
|
||||||
def serialize_float(key: str, value: float) -> str:
|
|
||||||
return f"{key}={value}"
|
|
||||||
|
|
||||||
def serialize_str(key: str, value: str) -> str:
|
|
||||||
return f'{key}="{value}"'
|
|
||||||
|
|
||||||
def serialize_algo_hash_rate(key: str, value: AlgoHashRateType) -> str:
|
|
||||||
return f"{key}={round(float(value), 2)}"
|
|
||||||
|
|
||||||
def serialize_list(key: str, value: list[Any]) -> str | None:
|
|
||||||
if len(value) == 0:
|
|
||||||
return None
|
|
||||||
|
|
||||||
list_field_data = []
|
|
||||||
for idx, list_field_val in enumerate(value):
|
|
||||||
item_serialization_func = serialization_map.get(
|
|
||||||
type(list_field_val), lambda _k, _v: None
|
|
||||||
)
|
|
||||||
item_serialized = item_serialization_func(
|
|
||||||
f"{key}{level_delimiter}{idx}", list_field_val
|
|
||||||
)
|
|
||||||
if item_serialized is not None:
|
|
||||||
list_field_data.append(item_serialized)
|
|
||||||
continue
|
|
||||||
for dt in serialization_map_instance:
|
|
||||||
if item_serialized is None:
|
|
||||||
if isinstance(list_field_val, dt):
|
|
||||||
item_serialized = serialization_map_instance[dt](
|
|
||||||
f"{key}{level_delimiter}{idx}", list_field_val
|
|
||||||
)
|
|
||||||
if item_serialized is not None:
|
|
||||||
list_field_data.append(item_serialized)
|
|
||||||
return ",".join(list_field_data)
|
|
||||||
|
|
||||||
def serialize_miner_error(key: str, value: BaseMinerError):
|
|
||||||
return value.as_influxdb(key, level_delimiter=level_delimiter)
|
|
||||||
|
|
||||||
def serialize_fan(key: str, value: Fan) -> str:
|
|
||||||
return f"{key}{level_delimiter}speed={value.speed}"
|
|
||||||
|
|
||||||
def serialize_hashboard(key: str, value: HashBoard) -> str:
|
|
||||||
return value.as_influxdb(key, level_delimiter=level_delimiter)
|
|
||||||
|
|
||||||
def serialize_bool(key: str, value: bool):
|
|
||||||
return f"{key}={str(value).lower()}"
|
|
||||||
|
|
||||||
def serialize_pool_metrics(key: str, value: PoolMetrics):
|
|
||||||
return value.as_influxdb(key, level_delimiter=level_delimiter)
|
|
||||||
|
|
||||||
include = [
|
|
||||||
"uptime",
|
|
||||||
"expected_hashrate",
|
|
||||||
"hashrate",
|
|
||||||
"hashboards",
|
|
||||||
"temperature_avg",
|
|
||||||
"env_temp",
|
|
||||||
"wattage",
|
|
||||||
"wattage_limit",
|
|
||||||
"voltage",
|
|
||||||
"fans",
|
|
||||||
"expected_fans",
|
|
||||||
"fan_psu",
|
|
||||||
"total_chips",
|
|
||||||
"expected_chips",
|
|
||||||
"efficiency",
|
|
||||||
"fault_light",
|
|
||||||
"is_mining",
|
|
||||||
"errors",
|
|
||||||
"pools",
|
|
||||||
]
|
|
||||||
|
|
||||||
serialization_map_instance = {
|
|
||||||
AlgoHashRateType: serialize_algo_hash_rate,
|
|
||||||
BaseMinerError: serialize_miner_error,
|
|
||||||
}
|
|
||||||
serialization_map = {
|
|
||||||
int: serialize_int,
|
|
||||||
float: serialize_float,
|
|
||||||
str: serialize_str,
|
|
||||||
bool: serialize_bool,
|
|
||||||
list: serialize_list,
|
|
||||||
Fan: serialize_fan,
|
|
||||||
HashBoard: serialize_hashboard,
|
|
||||||
PoolMetrics: serialize_pool_metrics,
|
|
||||||
}
|
|
||||||
|
|
||||||
tag_data = [
|
|
||||||
measurement_name,
|
|
||||||
f"ip={str(self.ip)}",
|
|
||||||
f"mac={str(self.mac)}",
|
|
||||||
f"make={str(self.make)}",
|
|
||||||
f"model={str(self.model)}",
|
|
||||||
f"firmware={str(self.firmware)}",
|
|
||||||
f"algo={str(self.algo)}",
|
|
||||||
]
|
|
||||||
field_data = []
|
field_data = []
|
||||||
|
|
||||||
for field in include:
|
tags = ["ip", "mac", "model", "hostname"]
|
||||||
field_val = getattr(self, field)
|
for attribute in self.fields():
|
||||||
serialization_func = serialization_map.get(
|
if attribute in tags:
|
||||||
type(field_val), lambda _k, _v: None
|
escaped_data = self.get(attribute, "Unknown").replace(" ", "\\ ")
|
||||||
)
|
tag_data.append(f"{attribute}={escaped_data}")
|
||||||
serialized = serialization_func(field, field_val)
|
|
||||||
if serialized is not None:
|
|
||||||
field_data.append(serialized)
|
|
||||||
continue
|
continue
|
||||||
for datatype in serialization_map_instance:
|
elif str(attribute).startswith("_"):
|
||||||
if serialized is None:
|
continue
|
||||||
if isinstance(field_val, datatype):
|
elif isinstance(self[attribute], str):
|
||||||
serialized = serialization_map_instance[datatype](
|
field_data.append(f'{attribute}="{self[attribute]}"')
|
||||||
field, field_val
|
continue
|
||||||
)
|
elif isinstance(self[attribute], bool):
|
||||||
if serialized is not None:
|
field_data.append(f"{attribute}={str(self[attribute]).lower()}")
|
||||||
field_data.append(serialized)
|
continue
|
||||||
|
elif isinstance(self[attribute], int):
|
||||||
|
field_data.append(f"{attribute}={self[attribute]}")
|
||||||
|
continue
|
||||||
|
elif isinstance(self[attribute], float):
|
||||||
|
field_data.append(f"{attribute}={self[attribute]}")
|
||||||
|
continue
|
||||||
|
elif attribute == "errors":
|
||||||
|
for idx, item in enumerate(self[attribute]):
|
||||||
|
field_data.append(f'error_{idx+1}="{item.error_message}"')
|
||||||
|
elif attribute == "hashboards":
|
||||||
|
for idx, item in enumerate(self[attribute]):
|
||||||
|
field_data.append(
|
||||||
|
f"hashboard_{idx+1}_hashrate={item.get('hashrate', 0.0)}"
|
||||||
|
)
|
||||||
|
field_data.append(
|
||||||
|
f"hashboard_{idx+1}_temperature={item.get('temp', 0)}"
|
||||||
|
)
|
||||||
|
field_data.append(
|
||||||
|
f"hashboard_{idx+1}_chip_temperature={item.get('chip_temp', 0)}"
|
||||||
|
)
|
||||||
|
field_data.append(f"hashboard_{idx+1}_chips={item.get('chips', 0)}")
|
||||||
|
field_data.append(
|
||||||
|
f"hashboard_{idx+1}_expected_chips={item.get('expected_chips', 0)}"
|
||||||
|
)
|
||||||
|
elif attribute == "fans":
|
||||||
|
for idx, item in enumerate(self[attribute]):
|
||||||
|
if item.speed is not None:
|
||||||
|
field_data.append(f"fan_{idx+1}={item.speed}")
|
||||||
|
|
||||||
tags_str = ",".join(tag_data).replace(" ", "\\ ")
|
tags_str = ",".join(tag_data)
|
||||||
field_str = ",".join(field_data).replace(" ", "\\ ")
|
field_str = ",".join(field_data)
|
||||||
timestamp = str(self.timestamp * 10**9)
|
timestamp = str(self.timestamp * 1e9)
|
||||||
|
|
||||||
return " ".join([tags_str, field_str, timestamp])
|
return " ".join([tags_str, field_str, timestamp])
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ from __future__ import annotations
|
|||||||
|
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel, field_serializer
|
||||||
|
|
||||||
from pyasic.device.algorithm.hashrate import AlgoHashRateType
|
from pyasic.device.algorithm.hashrate import AlgoHashRateType
|
||||||
|
|
||||||
@@ -28,8 +28,6 @@ class HashBoard(BaseModel):
|
|||||||
Attributes:
|
Attributes:
|
||||||
slot: The slot of the board as an int.
|
slot: The slot of the board as an int.
|
||||||
hashrate: The hashrate of the board in TH/s as a float.
|
hashrate: The hashrate of the board in TH/s as a float.
|
||||||
inlet_temp: Inlet temperature for hydro asics as an int
|
|
||||||
outlet_temp: Outlet temperature for hydro asics as an int
|
|
||||||
temp: The temperature of the PCB as an int.
|
temp: The temperature of the PCB as an int.
|
||||||
chip_temp: The temperature of the chips as an int.
|
chip_temp: The temperature of the chips as an int.
|
||||||
chips: The chip count of the board as an int.
|
chips: The chip count of the board as an int.
|
||||||
@@ -43,8 +41,6 @@ class HashBoard(BaseModel):
|
|||||||
|
|
||||||
slot: int = 0
|
slot: int = 0
|
||||||
hashrate: AlgoHashRateType | None = None
|
hashrate: AlgoHashRateType | None = None
|
||||||
inlet_temp: float | None = None
|
|
||||||
outlet_temp: float | None = None
|
|
||||||
temp: float | None = None
|
temp: float | None = None
|
||||||
chip_temp: float | None = None
|
chip_temp: float | None = None
|
||||||
chips: int | None = None
|
chips: int | None = None
|
||||||
@@ -55,12 +51,6 @@ class HashBoard(BaseModel):
|
|||||||
active: bool | None = None
|
active: bool | None = None
|
||||||
voltage: float | None = None
|
voltage: float | None = None
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def fields(cls) -> set:
|
|
||||||
all_fields = set(cls.model_fields.keys())
|
|
||||||
all_fields.update(set(cls.model_computed_fields.keys()))
|
|
||||||
return all_fields
|
|
||||||
|
|
||||||
def get(self, __key: str, default: Any = None):
|
def get(self, __key: str, default: Any = None):
|
||||||
try:
|
try:
|
||||||
val = self.__getitem__(__key)
|
val = self.__getitem__(__key)
|
||||||
@@ -75,62 +65,3 @@ class HashBoard(BaseModel):
|
|||||||
return getattr(self, item)
|
return getattr(self, item)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
raise KeyError(f"{item}")
|
raise KeyError(f"{item}")
|
||||||
|
|
||||||
def as_influxdb(self, key_root: str, level_delimiter: str = ".") -> str:
|
|
||||||
def serialize_int(key: str, value: int) -> str:
|
|
||||||
return f"{key}={value}"
|
|
||||||
|
|
||||||
def serialize_float(key: str, value: float) -> str:
|
|
||||||
return f"{key}={value}"
|
|
||||||
|
|
||||||
def serialize_str(key: str, value: str) -> str:
|
|
||||||
return f'{key}="{value}"'
|
|
||||||
|
|
||||||
def serialize_algo_hash_rate(key: str, value: AlgoHashRateType) -> str:
|
|
||||||
return f"{key}={round(float(value), 2)}"
|
|
||||||
|
|
||||||
def serialize_bool(key: str, value: bool):
|
|
||||||
return f"{key}={str(value).lower()}"
|
|
||||||
|
|
||||||
serialization_map_instance = {
|
|
||||||
AlgoHashRateType: serialize_algo_hash_rate,
|
|
||||||
}
|
|
||||||
serialization_map = {
|
|
||||||
int: serialize_int,
|
|
||||||
float: serialize_float,
|
|
||||||
str: serialize_str,
|
|
||||||
bool: serialize_bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
include = [
|
|
||||||
"hashrate",
|
|
||||||
"temp",
|
|
||||||
"chip_temp",
|
|
||||||
"chips",
|
|
||||||
"expected_chips",
|
|
||||||
"tuned",
|
|
||||||
"active",
|
|
||||||
"voltage",
|
|
||||||
]
|
|
||||||
|
|
||||||
field_data = []
|
|
||||||
for field in include:
|
|
||||||
field_val = getattr(self, field)
|
|
||||||
serialization_func = serialization_map.get(
|
|
||||||
type(field_val), lambda _k, _v: None
|
|
||||||
)
|
|
||||||
serialized = serialization_func(
|
|
||||||
f"{key_root}{level_delimiter}{field}", field_val
|
|
||||||
)
|
|
||||||
if serialized is not None:
|
|
||||||
field_data.append(serialized)
|
|
||||||
continue
|
|
||||||
for datatype in serialization_map_instance:
|
|
||||||
if serialized is None:
|
|
||||||
if isinstance(field_val, datatype):
|
|
||||||
serialized = serialization_map_instance[datatype](
|
|
||||||
f"{key_root}{level_delimiter}{field}", field_val
|
|
||||||
)
|
|
||||||
if serialized is not None:
|
|
||||||
field_data.append(serialized)
|
|
||||||
return ",".join(field_data)
|
|
||||||
|
|||||||
@@ -18,15 +18,9 @@ from typing import TypeVar
|
|||||||
|
|
||||||
from .bos import BraiinsOSError
|
from .bos import BraiinsOSError
|
||||||
from .innosilicon import InnosiliconError
|
from .innosilicon import InnosiliconError
|
||||||
from .vnish import VnishError
|
|
||||||
from .whatsminer import WhatsminerError
|
from .whatsminer import WhatsminerError
|
||||||
from .X19 import X19Error
|
from .X19 import X19Error
|
||||||
|
|
||||||
MinerErrorData = TypeVar(
|
MinerErrorData = TypeVar(
|
||||||
"MinerErrorData",
|
"MinerErrorData", WhatsminerError, BraiinsOSError, X19Error, InnosiliconError
|
||||||
WhatsminerError,
|
|
||||||
BraiinsOSError,
|
|
||||||
X19Error,
|
|
||||||
InnosiliconError,
|
|
||||||
VnishError,
|
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -16,17 +16,3 @@ class BaseMinerError(BaseModel):
|
|||||||
A dictionary version of this class.
|
A dictionary version of this class.
|
||||||
"""
|
"""
|
||||||
return self.asdict()
|
return self.asdict()
|
||||||
|
|
||||||
def as_influxdb(self, root_key: str, level_delimiter: str = ".") -> str:
|
|
||||||
field_data = []
|
|
||||||
|
|
||||||
if self.error_code is not None:
|
|
||||||
field_data.append(
|
|
||||||
f"{root_key}{level_delimiter}error_code={self.error_code}"
|
|
||||||
)
|
|
||||||
if self.error_message is not None:
|
|
||||||
field_data.append(
|
|
||||||
f'{root_key}{level_delimiter}error_message="{self.error_message}"'
|
|
||||||
)
|
|
||||||
|
|
||||||
return ",".join(field_data)
|
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
# ------------------------------------------------------------------------------
|
|
||||||
# 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.data.error_codes.base import BaseMinerError
|
|
||||||
|
|
||||||
|
|
||||||
class VnishError(BaseMinerError):
|
|
||||||
"""A Dataclass to handle error codes of Vnish miners.
|
|
||||||
|
|
||||||
Attributes:
|
|
||||||
error_message: The error message as a string.
|
|
||||||
error_code: The error code as an int. 0 if the message is not assigned a code.
|
|
||||||
"""
|
|
||||||
|
|
||||||
error_message: str
|
|
||||||
error_code: int = 0
|
|
||||||
@@ -92,50 +92,3 @@ class PoolMetrics(BaseModel):
|
|||||||
if total == 0:
|
if total == 0:
|
||||||
return 0
|
return 0
|
||||||
return (value / total) * 100
|
return (value / total) * 100
|
||||||
|
|
||||||
def as_influxdb(self, key_root: str, level_delimiter: str = ".") -> str:
|
|
||||||
def serialize_int(key: str, value: int) -> str:
|
|
||||||
return f"{key}={value}"
|
|
||||||
|
|
||||||
def serialize_float(key: str, value: float) -> str:
|
|
||||||
return f"{key}={value}"
|
|
||||||
|
|
||||||
def serialize_str(key: str, value: str) -> str:
|
|
||||||
return f'{key}="{value}"'
|
|
||||||
|
|
||||||
def serialize_pool_url(key: str, value: str) -> str:
|
|
||||||
return f'{key}="{str(value)}"'
|
|
||||||
|
|
||||||
def serialize_bool(key: str, value: bool):
|
|
||||||
return f"{key}={str(value).lower()}"
|
|
||||||
|
|
||||||
serialization_map = {
|
|
||||||
int: serialize_int,
|
|
||||||
float: serialize_float,
|
|
||||||
str: serialize_str,
|
|
||||||
bool: serialize_bool,
|
|
||||||
PoolUrl: serialize_pool_url,
|
|
||||||
}
|
|
||||||
|
|
||||||
include = [
|
|
||||||
"url",
|
|
||||||
"accepted",
|
|
||||||
"rejected",
|
|
||||||
"active",
|
|
||||||
"alive",
|
|
||||||
"user",
|
|
||||||
]
|
|
||||||
|
|
||||||
field_data = []
|
|
||||||
for field in include:
|
|
||||||
field_val = getattr(self, field)
|
|
||||||
serialization_func = serialization_map.get(
|
|
||||||
type(field_val), lambda _k, _v: None
|
|
||||||
)
|
|
||||||
serialized = serialization_func(
|
|
||||||
f"{key_root}{level_delimiter}{field}", field_val
|
|
||||||
)
|
|
||||||
if serialized is not None:
|
|
||||||
field_data.append(serialized)
|
|
||||||
|
|
||||||
return ",".join(field_data)
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
from .base import MinerAlgoType
|
from .base import MinerAlgoType
|
||||||
from .blake256 import Blake256Algo
|
from .blake256 import Blake256Algo
|
||||||
from .blockflow import BlockFlowAlgo
|
|
||||||
from .eaglesong import EaglesongAlgo
|
from .eaglesong import EaglesongAlgo
|
||||||
from .equihash import EquihashAlgo
|
from .equihash import EquihashAlgo
|
||||||
from .ethash import EtHashAlgo
|
from .ethash import EtHashAlgo
|
||||||
@@ -12,7 +11,6 @@ from .kheavyhash import KHeavyHashAlgo
|
|||||||
from .scrypt import ScryptAlgo
|
from .scrypt import ScryptAlgo
|
||||||
from .sha256 import SHA256Algo
|
from .sha256 import SHA256Algo
|
||||||
from .x11 import X11Algo
|
from .x11 import X11Algo
|
||||||
from .zksnark import ZkSnarkAlgo
|
|
||||||
|
|
||||||
|
|
||||||
class MinerAlgo:
|
class MinerAlgo:
|
||||||
@@ -26,5 +24,3 @@ class MinerAlgo:
|
|||||||
EAGLESONG = EaglesongAlgo
|
EAGLESONG = EaglesongAlgo
|
||||||
ETHASH = EtHashAlgo
|
ETHASH = EtHashAlgo
|
||||||
EQUIHASH = EquihashAlgo
|
EQUIHASH = EquihashAlgo
|
||||||
BLOCKFLOW = BlockFlowAlgo
|
|
||||||
ZKSNARK = ZkSnarkAlgo
|
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
from __future__ import annotations
|
|
||||||
|
|
||||||
from .base import MinerAlgoType
|
|
||||||
from .hashrate import BlockFlowHashRate
|
|
||||||
from .hashrate.unit import BlockFlowUnit
|
|
||||||
|
|
||||||
|
|
||||||
class BlockFlowAlgo(MinerAlgoType):
|
|
||||||
hashrate: type[BlockFlowHashRate] = BlockFlowHashRate
|
|
||||||
unit: type[BlockFlowUnit] = BlockFlowUnit
|
|
||||||
|
|
||||||
name = "BlockFlow"
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
from .base import AlgoHashRateType
|
from .base import AlgoHashRateType
|
||||||
from .blake256 import Blake256HashRate
|
from .blake256 import Blake256HashRate
|
||||||
from .blockflow import BlockFlowHashRate
|
|
||||||
from .eaglesong import EaglesongHashRate
|
from .eaglesong import EaglesongHashRate
|
||||||
from .equihash import EquihashHashRate
|
from .equihash import EquihashHashRate
|
||||||
from .ethash import EtHashHashRate
|
from .ethash import EtHashHashRate
|
||||||
@@ -10,7 +9,6 @@ from .kheavyhash import KHeavyHashHashRate
|
|||||||
from .scrypt import ScryptHashRate
|
from .scrypt import ScryptHashRate
|
||||||
from .sha256 import SHA256HashRate
|
from .sha256 import SHA256HashRate
|
||||||
from .x11 import X11HashRate
|
from .x11 import X11HashRate
|
||||||
from .zksnark import ZkSnarkHashRate
|
|
||||||
|
|
||||||
|
|
||||||
class AlgoHashRate:
|
class AlgoHashRate:
|
||||||
@@ -24,5 +22,3 @@ class AlgoHashRate:
|
|||||||
EAGLESONG = EaglesongHashRate
|
EAGLESONG = EaglesongHashRate
|
||||||
ETHASH = EtHashHashRate
|
ETHASH = EtHashHashRate
|
||||||
EQUIHASH = EquihashHashRate
|
EQUIHASH = EquihashHashRate
|
||||||
BLOCKFLOW = BlockFlowHashRate
|
|
||||||
ZKSNARK = ZkSnarkHashRate
|
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
from __future__ import annotations
|
|
||||||
|
|
||||||
from typing_extensions import Self
|
|
||||||
|
|
||||||
from pyasic.device.algorithm.hashrate.base import AlgoHashRateType
|
|
||||||
from pyasic.device.algorithm.hashrate.unit.blockflow import BlockFlowUnit
|
|
||||||
|
|
||||||
from .unit import HashUnit
|
|
||||||
|
|
||||||
|
|
||||||
class BlockFlowHashRate(AlgoHashRateType):
|
|
||||||
rate: float
|
|
||||||
unit: BlockFlowUnit = HashUnit.BLOCKFLOW.default
|
|
||||||
|
|
||||||
def into(self, other: BlockFlowUnit) -> Self:
|
|
||||||
return self.__class__(
|
|
||||||
rate=self.rate / (other.value / self.unit.value), unit=other
|
|
||||||
)
|
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
from .blake256 import Blake256Unit
|
from .blake256 import Blake256Unit
|
||||||
from .blockflow import BlockFlowUnit
|
|
||||||
from .eaglesong import EaglesongUnit
|
from .eaglesong import EaglesongUnit
|
||||||
from .equihash import EquihashUnit
|
from .equihash import EquihashUnit
|
||||||
from .ethash import EtHashUnit
|
from .ethash import EtHashUnit
|
||||||
@@ -9,7 +8,6 @@ from .kheavyhash import KHeavyHashUnit
|
|||||||
from .scrypt import ScryptUnit
|
from .scrypt import ScryptUnit
|
||||||
from .sha256 import SHA256Unit
|
from .sha256 import SHA256Unit
|
||||||
from .x11 import X11Unit
|
from .x11 import X11Unit
|
||||||
from .zksnark import ZkSnarkUnit
|
|
||||||
|
|
||||||
|
|
||||||
class HashUnit:
|
class HashUnit:
|
||||||
@@ -23,5 +21,3 @@ class HashUnit:
|
|||||||
EAGLESONG = EaglesongUnit
|
EAGLESONG = EaglesongUnit
|
||||||
ETHASH = EtHashUnit
|
ETHASH = EtHashUnit
|
||||||
EQUIHASH = EquihashUnit
|
EQUIHASH = EquihashUnit
|
||||||
BLOCKFLOW = BlockFlowUnit
|
|
||||||
ZKSNARK = ZkSnarkUnit
|
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
from __future__ import annotations
|
|
||||||
|
|
||||||
from .base import AlgoHashRateUnitType
|
|
||||||
|
|
||||||
|
|
||||||
class BlockFlowUnit(AlgoHashRateUnitType):
|
|
||||||
H = 1
|
|
||||||
KH = int(H) * 1000
|
|
||||||
MH = int(KH) * 1000
|
|
||||||
GH = int(MH) * 1000
|
|
||||||
TH = int(GH) * 1000
|
|
||||||
PH = int(TH) * 1000
|
|
||||||
EH = int(PH) * 1000
|
|
||||||
ZH = int(EH) * 1000
|
|
||||||
|
|
||||||
default = MH
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
from __future__ import annotations
|
|
||||||
|
|
||||||
from .base import AlgoHashRateUnitType
|
|
||||||
|
|
||||||
|
|
||||||
class ZkSnarkUnit(AlgoHashRateUnitType):
|
|
||||||
H = 1
|
|
||||||
KH = int(H) * 1000
|
|
||||||
MH = int(KH) * 1000
|
|
||||||
GH = int(MH) * 1000
|
|
||||||
TH = int(GH) * 1000
|
|
||||||
PH = int(TH) * 1000
|
|
||||||
EH = int(PH) * 1000
|
|
||||||
ZH = int(EH) * 1000
|
|
||||||
|
|
||||||
default = GH
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
from __future__ import annotations
|
|
||||||
|
|
||||||
from typing_extensions import Self
|
|
||||||
|
|
||||||
from pyasic.device.algorithm.hashrate.base import AlgoHashRateType
|
|
||||||
from pyasic.device.algorithm.hashrate.unit.zksnark import ZkSnarkUnit
|
|
||||||
|
|
||||||
from .unit import HashUnit
|
|
||||||
|
|
||||||
|
|
||||||
class ZkSnarkHashRate(AlgoHashRateType):
|
|
||||||
rate: float
|
|
||||||
unit: ZkSnarkUnit = HashUnit.ZKSNARK.default
|
|
||||||
|
|
||||||
def into(self, other: ZkSnarkUnit) -> Self:
|
|
||||||
return self.__class__(
|
|
||||||
rate=self.rate / (other.value / self.unit.value), unit=other
|
|
||||||
)
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
from __future__ import annotations
|
|
||||||
|
|
||||||
from .base import MinerAlgoType
|
|
||||||
from .hashrate import ZkSnarkHashRate
|
|
||||||
from .hashrate.unit import ZkSnarkUnit
|
|
||||||
|
|
||||||
|
|
||||||
class ZkSnarkAlgo(MinerAlgoType):
|
|
||||||
hashrate: type[ZkSnarkHashRate] = ZkSnarkHashRate
|
|
||||||
unit: type[ZkSnarkUnit] = ZkSnarkUnit
|
|
||||||
|
|
||||||
name = "zkSNARK"
|
|
||||||
@@ -26,11 +26,9 @@ class MinerMake(str, Enum):
|
|||||||
AURADINE = "Auradine"
|
AURADINE = "Auradine"
|
||||||
EPIC = "ePIC"
|
EPIC = "ePIC"
|
||||||
BITAXE = "BitAxe"
|
BITAXE = "BitAxe"
|
||||||
LUCKYMINER = "LuckyMiner"
|
|
||||||
ICERIVER = "IceRiver"
|
ICERIVER = "IceRiver"
|
||||||
HAMMER = "Hammer"
|
HAMMER = "Hammer"
|
||||||
VOLCMINER = "VolcMiner"
|
VOLCMINER = "VolcMiner"
|
||||||
ELPHAPEX = "Elphapex"
|
|
||||||
BRAIINS = "Braiins"
|
BRAIINS = "Braiins"
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
|||||||
@@ -43,7 +43,6 @@ class AntminerModels(MinerModelType):
|
|||||||
S19jNoPIC = "S19j No PIC"
|
S19jNoPIC = "S19j No PIC"
|
||||||
S19ProPlus = "S19 Pro+"
|
S19ProPlus = "S19 Pro+"
|
||||||
S19jPro = "S19j Pro"
|
S19jPro = "S19j Pro"
|
||||||
S19jPlus = "S19j+"
|
|
||||||
S19jProNoPIC = "S19j Pro No PIC"
|
S19jProNoPIC = "S19j Pro No PIC"
|
||||||
S19jProPlus = "S19j Pro+"
|
S19jProPlus = "S19j Pro+"
|
||||||
S19jProPlusNoPIC = "S19j Pro+ No PIC"
|
S19jProPlusNoPIC = "S19j Pro+ No PIC"
|
||||||
@@ -55,17 +54,12 @@ class AntminerModels(MinerModelType):
|
|||||||
S19ProPlusHydro = "S19 Pro+ Hydro"
|
S19ProPlusHydro = "S19 Pro+ Hydro"
|
||||||
S19KPro = "S19K Pro"
|
S19KPro = "S19K Pro"
|
||||||
S19kPro = "S19k Pro"
|
S19kPro = "S19k Pro"
|
||||||
S19ProA = "S19 Pro A"
|
|
||||||
S19kProNoPIC = "S19k Pro No PIC"
|
S19kProNoPIC = "S19k Pro No PIC"
|
||||||
S19jXP = "S19j XP"
|
S19jXP = "S19j XP"
|
||||||
T19 = "T19"
|
T19 = "T19"
|
||||||
S21 = "S21"
|
S21 = "S21"
|
||||||
S21Plus = "S21+"
|
|
||||||
S21PlusHydro = "S21+ Hydro"
|
|
||||||
S21Pro = "S21 Pro"
|
S21Pro = "S21 Pro"
|
||||||
S21Hydro = "S21 Hydro"
|
|
||||||
T21 = "T21"
|
T21 = "T21"
|
||||||
S19XPHydro = "S19 XP Hydro"
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.value
|
return self.value
|
||||||
@@ -453,10 +447,7 @@ class AvalonminerModels(MinerModelType):
|
|||||||
Avalon1166Pro = "Avalon 1166 Pro"
|
Avalon1166Pro = "Avalon 1166 Pro"
|
||||||
Avalon1126Pro = "Avalon 1126 Pro"
|
Avalon1126Pro = "Avalon 1126 Pro"
|
||||||
Avalon1246 = "Avalon 1246"
|
Avalon1246 = "Avalon 1246"
|
||||||
Avalon1566 = "Avalon 1566"
|
|
||||||
AvalonNano3 = "Avalon Nano 3"
|
AvalonNano3 = "Avalon Nano 3"
|
||||||
AvalonNano3s = "Avalon Nano 3s"
|
|
||||||
AvalonQHome = "Avalon Q Home"
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.value
|
return self.value
|
||||||
@@ -479,7 +470,6 @@ class GoldshellModels(MinerModelType):
|
|||||||
KDMax = "KD Max"
|
KDMax = "KD Max"
|
||||||
KDBoxII = "KD Box II"
|
KDBoxII = "KD Box II"
|
||||||
KDBoxPro = "KD Box Pro"
|
KDBoxPro = "KD Box Pro"
|
||||||
Byte = "Byte"
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.value
|
return self.value
|
||||||
@@ -488,9 +478,7 @@ class GoldshellModels(MinerModelType):
|
|||||||
class ePICModels(MinerModelType):
|
class ePICModels(MinerModelType):
|
||||||
BM520i = "BlockMiner 520i"
|
BM520i = "BlockMiner 520i"
|
||||||
BM720i = "BlockMiner 720i"
|
BM720i = "BlockMiner 720i"
|
||||||
eLITE1 = "BlockMiner eLITE 1.0"
|
|
||||||
S19jProDual = "S19j Pro Dual"
|
S19jProDual = "S19j Pro Dual"
|
||||||
S19kProDual = "S19k Pro Dual"
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.value
|
return self.value
|
||||||
@@ -519,14 +507,6 @@ class BitAxeModels(MinerModelType):
|
|||||||
return self.value
|
return self.value
|
||||||
|
|
||||||
|
|
||||||
class LuckyMinerModels(MinerModelType):
|
|
||||||
LV07 = "LV07"
|
|
||||||
LV08 = "LV08"
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self.value
|
|
||||||
|
|
||||||
|
|
||||||
class IceRiverModels(MinerModelType):
|
class IceRiverModels(MinerModelType):
|
||||||
KS0 = "KS0"
|
KS0 = "KS0"
|
||||||
KS1 = "KS1"
|
KS1 = "KS1"
|
||||||
@@ -537,7 +517,6 @@ class IceRiverModels(MinerModelType):
|
|||||||
KS5 = "KS5"
|
KS5 = "KS5"
|
||||||
KS5L = "KS5L"
|
KS5L = "KS5L"
|
||||||
KS5M = "KS5M"
|
KS5M = "KS5M"
|
||||||
AL3 = "AL3"
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.value
|
return self.value
|
||||||
@@ -562,12 +541,6 @@ class BraiinsModels(MinerModelType):
|
|||||||
BMM101 = "BMM101"
|
BMM101 = "BMM101"
|
||||||
|
|
||||||
|
|
||||||
class ElphapexModels(MinerModelType):
|
|
||||||
DG1 = "DG1"
|
|
||||||
DG1Plus = "DG1+"
|
|
||||||
DG1Home = "DG1Home"
|
|
||||||
|
|
||||||
|
|
||||||
class MinerModel:
|
class MinerModel:
|
||||||
ANTMINER = AntminerModels
|
ANTMINER = AntminerModels
|
||||||
WHATSMINER = WhatsminerModels
|
WHATSMINER = WhatsminerModels
|
||||||
@@ -577,9 +550,7 @@ class MinerModel:
|
|||||||
AURADINE = AuradineModels
|
AURADINE = AuradineModels
|
||||||
EPIC = ePICModels
|
EPIC = ePICModels
|
||||||
BITAXE = BitAxeModels
|
BITAXE = BitAxeModels
|
||||||
LUCKYMINER = LuckyMinerModels
|
|
||||||
ICERIVER = IceRiverModels
|
ICERIVER = IceRiverModels
|
||||||
HAMMER = HammerModels
|
HAMMER = HammerModels
|
||||||
VOLCMINER = VolcMinerModels
|
VOLCMINER = VolcMinerModels
|
||||||
ELPHAPEX = ElphapexModels
|
|
||||||
BRAIINS = BraiinsModels
|
BRAIINS = BraiinsModels
|
||||||
|
|||||||
@@ -21,5 +21,4 @@ from .epic import *
|
|||||||
from .hiveon import *
|
from .hiveon import *
|
||||||
from .luxos import *
|
from .luxos import *
|
||||||
from .marathon import *
|
from .marathon import *
|
||||||
from .mskminer import *
|
|
||||||
from .vnish import *
|
from .vnish import *
|
||||||
|
|||||||
@@ -25,9 +25,7 @@ from pyasic.miners.device.models import (
|
|||||||
S19i,
|
S19i,
|
||||||
S19j,
|
S19j,
|
||||||
S19jNoPIC,
|
S19jNoPIC,
|
||||||
S19jPlus,
|
|
||||||
S19jPro,
|
S19jPro,
|
||||||
S19jProPlus,
|
|
||||||
S19jXP,
|
S19jXP,
|
||||||
S19KPro,
|
S19KPro,
|
||||||
S19Plus,
|
S19Plus,
|
||||||
@@ -82,10 +80,6 @@ class BMMinerS19jPro(AntminerModern, S19jPro):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class BMMinerS19jPlus(AntminerModern, S19jPlus):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class BMMinerS19L(AntminerModern, S19L):
|
class BMMinerS19L(AntminerModern, S19L):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -108,7 +102,3 @@ class BMMinerS19KPro(AntminerModern, S19KPro):
|
|||||||
|
|
||||||
class BMMinerS19jXP(AntminerModern, S19jXP):
|
class BMMinerS19jXP(AntminerModern, S19jXP):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class BMMinerS19jProPlus(AntminerModern, S19jProPlus):
|
|
||||||
pass
|
|
||||||
|
|||||||
@@ -22,9 +22,7 @@ from .S19 import (
|
|||||||
BMMinerS19i,
|
BMMinerS19i,
|
||||||
BMMinerS19j,
|
BMMinerS19j,
|
||||||
BMMinerS19jNoPIC,
|
BMMinerS19jNoPIC,
|
||||||
BMMinerS19jPlus,
|
|
||||||
BMMinerS19jPro,
|
BMMinerS19jPro,
|
||||||
BMMinerS19jProPlus,
|
|
||||||
BMMinerS19jXP,
|
BMMinerS19jXP,
|
||||||
BMMinerS19KPro,
|
BMMinerS19KPro,
|
||||||
BMMinerS19L,
|
BMMinerS19L,
|
||||||
|
|||||||
@@ -15,24 +15,12 @@
|
|||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.backends import AntminerModern
|
from pyasic.miners.backends import AntminerModern
|
||||||
from pyasic.miners.device.models import S21, S21Hydro, S21Plus, S21PlusHydro, S21Pro
|
from pyasic.miners.device.models import S21, S21Pro
|
||||||
|
|
||||||
|
|
||||||
class BMMinerS21(AntminerModern, S21):
|
class BMMinerS21(AntminerModern, S21):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class BMMinerS21Plus(AntminerModern, S21Plus):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class BMMinerS21PlusHydro(AntminerModern, S21PlusHydro):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class BMMinerS21Pro(AntminerModern, S21Pro):
|
class BMMinerS21Pro(AntminerModern, S21Pro):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class BMMinerS21Hydro(AntminerModern, S21Hydro):
|
|
||||||
pass
|
|
||||||
|
|||||||
@@ -13,11 +13,5 @@
|
|||||||
# 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 .S21 import (
|
from .S21 import BMMinerS21, BMMinerS21Pro
|
||||||
BMMinerS21,
|
|
||||||
BMMinerS21Hydro,
|
|
||||||
BMMinerS21Plus,
|
|
||||||
BMMinerS21PlusHydro,
|
|
||||||
BMMinerS21Pro,
|
|
||||||
)
|
|
||||||
from .T21 import BMMinerT21
|
from .T21 import BMMinerT21
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ from pyasic.miners.device.models import (
|
|||||||
S19Plus,
|
S19Plus,
|
||||||
S19Pro,
|
S19Pro,
|
||||||
S19ProPlusHydro,
|
S19ProPlusHydro,
|
||||||
S19XPHydro,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -88,7 +87,3 @@ class BOSMinerS19XP(BOSer, S19XP):
|
|||||||
|
|
||||||
class BOSMinerS19ProPlusHydro(BOSer, S19ProPlusHydro):
|
class BOSMinerS19ProPlusHydro(BOSer, S19ProPlusHydro):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class BOSMinerS19XPHydro(BOSer, S19XPHydro):
|
|
||||||
pass
|
|
||||||
|
|||||||
@@ -29,6 +29,5 @@ from .S19 import (
|
|||||||
BOSMinerS19Pro,
|
BOSMinerS19Pro,
|
||||||
BOSMinerS19ProPlusHydro,
|
BOSMinerS19ProPlusHydro,
|
||||||
BOSMinerS19XP,
|
BOSMinerS19XP,
|
||||||
BOSMinerS19XPHydro,
|
|
||||||
)
|
)
|
||||||
from .T19 import BOSMinerT19
|
from .T19 import BOSMinerT19
|
||||||
|
|||||||
@@ -15,40 +15,8 @@
|
|||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.backends import BOSer
|
from pyasic.miners.backends import BOSer
|
||||||
from pyasic.miners.device.models import S21, S21Hydro, S21Plus, S21PlusHydro, S21Pro
|
from pyasic.miners.device.models import S21
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
# 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. -
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
class BOSMinerS21(BOSer, S21):
|
class BOSMinerS21(BOSer, S21):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class BOSMinerS21Plus(BOSer, S21Plus):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class BOSMinerS21PlusHydro(BOSer, S21PlusHydro):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class BOSMinerS21Pro(BOSer, S21Pro):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class BOSMinerS21Hydro(BOSer, S21Hydro):
|
|
||||||
pass
|
|
||||||
|
|||||||
@@ -14,11 +14,5 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from .S21 import (
|
from .S21 import BOSMinerS21
|
||||||
BOSMinerS21,
|
|
||||||
BOSMinerS21Hydro,
|
|
||||||
BOSMinerS21Plus,
|
|
||||||
BOSMinerS21PlusHydro,
|
|
||||||
BOSMinerS21Pro,
|
|
||||||
)
|
|
||||||
from .T21 import BOSMinerT21
|
from .T21 import BOSMinerT21
|
||||||
|
|||||||
@@ -59,9 +59,3 @@ class ePICS19jProDual(ePIC, S19jPro):
|
|||||||
raw_model = MinerModel.EPIC.S19jProDual
|
raw_model = MinerModel.EPIC.S19jProDual
|
||||||
expected_fans = S19jPro.expected_fans * 2
|
expected_fans = S19jPro.expected_fans * 2
|
||||||
expected_hashboards = S19jPro.expected_hashboards * 2
|
expected_hashboards = S19jPro.expected_hashboards * 2
|
||||||
|
|
||||||
|
|
||||||
class ePICS19kProDual(ePIC, S19kPro):
|
|
||||||
raw_model = MinerModel.EPIC.S19kProDual
|
|
||||||
expected_fans = S19kPro.expected_fans * 2
|
|
||||||
expected_hashboards = S19kPro.expected_hashboards * 2
|
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ from .S19 import (
|
|||||||
ePICS19jProDual,
|
ePICS19jProDual,
|
||||||
ePICS19jProPlus,
|
ePICS19jProPlus,
|
||||||
ePICS19kPro,
|
ePICS19kPro,
|
||||||
ePICS19kProDual,
|
|
||||||
ePICS19Pro,
|
ePICS19Pro,
|
||||||
ePICS19XP,
|
ePICS19XP,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ from pyasic.miners.device.models import (
|
|||||||
S19jNoPIC,
|
S19jNoPIC,
|
||||||
S19jPro,
|
S19jPro,
|
||||||
S19KPro,
|
S19KPro,
|
||||||
S19NoPIC,
|
|
||||||
S19Plus,
|
S19Plus,
|
||||||
S19Pro,
|
S19Pro,
|
||||||
S19ProHydro,
|
S19ProHydro,
|
||||||
@@ -40,10 +39,6 @@ class HiveonS19(HiveonModern, S19):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class HiveonS19NoPIC(HiveonModern, S19NoPIC):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class HiveonS19Plus(HiveonModern, S19Plus):
|
class HiveonS19Plus(HiveonModern, S19Plus):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -100,5 +95,5 @@ class HiveonS19ProPlusHydro(HiveonModern, S19ProPlusHydro):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class HiveonS19kPro(HiveonModern, S19KPro):
|
class HiveonS19KPro(HiveonModern, S19KPro):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -23,9 +23,8 @@ from .S19 import (
|
|||||||
HiveonS19j,
|
HiveonS19j,
|
||||||
HiveonS19jNoPIC,
|
HiveonS19jNoPIC,
|
||||||
HiveonS19jPro,
|
HiveonS19jPro,
|
||||||
HiveonS19kPro,
|
HiveonS19KPro,
|
||||||
HiveonS19L,
|
HiveonS19L,
|
||||||
HiveonS19NoPIC,
|
|
||||||
HiveonS19Plus,
|
HiveonS19Plus,
|
||||||
HiveonS19Pro,
|
HiveonS19Pro,
|
||||||
HiveonS19ProHydro,
|
HiveonS19ProHydro,
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
from typing import List, Optional
|
from typing import List, Optional
|
||||||
|
|
||||||
|
import asyncssh
|
||||||
|
|
||||||
from pyasic.data import HashBoard
|
from pyasic.data import HashBoard
|
||||||
from pyasic.device.algorithm import AlgoHashRate, HashUnit
|
from pyasic.device.algorithm import AlgoHashRate, HashUnit
|
||||||
from pyasic.errors import APIError
|
from pyasic.errors import APIError
|
||||||
|
|||||||
@@ -1,22 +0,0 @@
|
|||||||
# ------------------------------------------------------------------------------
|
|
||||||
# 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.device.models import S21, T21
|
|
||||||
|
|
||||||
|
|
||||||
class LUXMinerT21(LUXMiner, T21):
|
|
||||||
pass
|
|
||||||
@@ -15,4 +15,3 @@
|
|||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from .S21 import LUXMinerS21
|
from .S21 import LUXMinerS21
|
||||||
from .T21 import LUXMinerT21
|
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
# ------------------------------------------------------------------------------
|
|
||||||
# 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.mskminer import MSKMiner
|
|
||||||
from pyasic.miners.device.models import (
|
|
||||||
S19NoPIC,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class MSKMinerS19NoPIC(MSKMiner, S19NoPIC):
|
|
||||||
pass
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
# ------------------------------------------------------------------------------
|
|
||||||
# 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 MSKMinerS19NoPIC
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
# ------------------------------------------------------------------------------
|
|
||||||
# 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 .X19 import *
|
|
||||||
@@ -20,16 +20,13 @@ from pyasic.miners.device.models import (
|
|||||||
S19XP,
|
S19XP,
|
||||||
S19a,
|
S19a,
|
||||||
S19aPro,
|
S19aPro,
|
||||||
S19Hydro,
|
|
||||||
S19i,
|
S19i,
|
||||||
S19j,
|
S19j,
|
||||||
S19jPro,
|
S19jPro,
|
||||||
S19kPro,
|
S19kPro,
|
||||||
S19NoPIC,
|
S19NoPIC,
|
||||||
S19Pro,
|
S19Pro,
|
||||||
S19ProA,
|
|
||||||
S19ProHydro,
|
S19ProHydro,
|
||||||
S19XPHydro,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -45,18 +42,10 @@ class VNishS19Pro(VNish, S19Pro):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class VNishS19Hydro(VNish, S19Hydro):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class VNishS19XP(VNish, S19XP):
|
class VNishS19XP(VNish, S19XP):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class VNishS19XPHydro(VNish, S19XPHydro):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class VNishS19a(VNish, S19a):
|
class VNishS19a(VNish, S19a):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -65,10 +54,6 @@ class VNishS19aPro(VNish, S19aPro):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class VNishS19ProA(VNish, S19ProA):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class VNishS19i(VNish, S19i):
|
class VNishS19i(VNish, S19i):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -87,7 +72,3 @@ class VNishS19ProHydro(VNish, S19ProHydro):
|
|||||||
|
|
||||||
class VNishS19kPro(VNish, S19kPro):
|
class VNishS19kPro(VNish, S19kPro):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class VNishS19ProA(VNish, S19ProA):
|
|
||||||
pass
|
|
||||||
|
|||||||
@@ -18,16 +18,13 @@ from .S19 import (
|
|||||||
VNishS19,
|
VNishS19,
|
||||||
VNishS19a,
|
VNishS19a,
|
||||||
VNishS19aPro,
|
VNishS19aPro,
|
||||||
VNishS19Hydro,
|
|
||||||
VNishS19i,
|
VNishS19i,
|
||||||
VNishS19j,
|
VNishS19j,
|
||||||
VNishS19jPro,
|
VNishS19jPro,
|
||||||
VNishS19kPro,
|
VNishS19kPro,
|
||||||
VNishS19NoPIC,
|
VNishS19NoPIC,
|
||||||
VNishS19Pro,
|
VNishS19Pro,
|
||||||
VNishS19ProA,
|
|
||||||
VNishS19ProHydro,
|
VNishS19ProHydro,
|
||||||
VNishS19XP,
|
VNishS19XP,
|
||||||
VNishS19XPHydro,
|
|
||||||
)
|
)
|
||||||
from .T19 import VNishT19
|
from .T19 import VNishT19
|
||||||
|
|||||||
@@ -15,24 +15,8 @@
|
|||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from pyasic.miners.backends import VNish
|
from pyasic.miners.backends import VNish
|
||||||
from pyasic.miners.device.models import S21, S21Hydro, S21Plus, S21PlusHydro, S21Pro
|
from pyasic.miners.device.models import S21
|
||||||
|
|
||||||
|
|
||||||
class VNishS21(VNish, S21):
|
class VNishS21(VNish, S21):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class VNishS21Plus(VNish, S21Plus):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class VNishS21PlusHydro(VNish, S21PlusHydro):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class VNishS21Pro(VNish, S21Pro):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class VNishS21Hydro(VNish, S21Hydro):
|
|
||||||
pass
|
|
||||||
|
|||||||
@@ -14,11 +14,5 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from .S21 import (
|
from .S21 import VNishS21
|
||||||
VNishS21,
|
|
||||||
VNishS21Hydro,
|
|
||||||
VNishS21Plus,
|
|
||||||
VNishS21PlusHydro,
|
|
||||||
VNishS21Pro,
|
|
||||||
)
|
|
||||||
from .T21 import VNishT21
|
from .T21 import VNishT21
|
||||||
|
|||||||
@@ -18,5 +18,5 @@ from pyasic.miners.backends import VNish
|
|||||||
from pyasic.miners.device.models import L3Plus
|
from pyasic.miners.device.models import L3Plus
|
||||||
|
|
||||||
|
|
||||||
class VNishL3Plus(VNish, L3Plus):
|
class VnishL3Plus(VNish, L3Plus):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -14,4 +14,4 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from .L3 import VNishL3Plus
|
from .L3 import VnishL3Plus
|
||||||
|
|||||||
@@ -18,5 +18,5 @@ from pyasic.miners.backends import VNish
|
|||||||
from pyasic.miners.device.models import L7
|
from pyasic.miners.device.models import L7
|
||||||
|
|
||||||
|
|
||||||
class VNishL7(VNish, L7):
|
class VnishL7(VNish, L7):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -14,4 +14,4 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from .L7 import VNishL7
|
from .L7 import VnishL7
|
||||||
|
|||||||
@@ -1,22 +0,0 @@
|
|||||||
# ------------------------------------------------------------------------------
|
|
||||||
# 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.device.models import L9
|
|
||||||
|
|
||||||
|
|
||||||
class VNishL9(VNish, L9):
|
|
||||||
pass
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
# ------------------------------------------------------------------------------
|
|
||||||
# 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 .L9 import VNishL9
|
|
||||||
@@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
from .X3 import *
|
from .X3 import *
|
||||||
from .X7 import *
|
from .X7 import *
|
||||||
from .X9 import *
|
|
||||||
from .X17 import *
|
from .X17 import *
|
||||||
from .X19 import *
|
from .X19 import *
|
||||||
from .X21 import *
|
from .X21 import *
|
||||||
|
|||||||
@@ -1,22 +0,0 @@
|
|||||||
# ------------------------------------------------------------------------------
|
|
||||||
# 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 AvalonMiner
|
|
||||||
from pyasic.miners.device.models import Avalon1566
|
|
||||||
|
|
||||||
|
|
||||||
class CGMinerAvalon1566(AvalonMiner, Avalon1566):
|
|
||||||
pass
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
# ------------------------------------------------------------------------------
|
|
||||||
# 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 .A1566 import CGMinerAvalon1566
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
# ------------------------------------------------------------------------------
|
|
||||||
# Copyright 2025 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 AvalonMiner
|
|
||||||
from pyasic.miners.device.models import AvalonQHome
|
|
||||||
|
|
||||||
|
|
||||||
class CGMinerAvalonQHome(AvalonMiner, AvalonQHome):
|
|
||||||
pass
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
from .Q import CGMinerAvalonQHome
|
|
||||||
@@ -20,6 +20,4 @@ from .A9X import *
|
|||||||
from .A10X import *
|
from .A10X import *
|
||||||
from .A11X import *
|
from .A11X import *
|
||||||
from .A12X import *
|
from .A12X import *
|
||||||
from .A15X import *
|
|
||||||
from .nano import *
|
from .nano import *
|
||||||
from .Q import *
|
|
||||||
|
|||||||
@@ -14,4 +14,4 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
from .nano3 import CGMinerAvalonNano3, CGMinerAvalonNano3s
|
from .nano3 import CGMinerAvalonNano3
|
||||||
|
|||||||
@@ -13,217 +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
|
|
||||||
|
|
||||||
from pyasic import APIError
|
|
||||||
from pyasic.data.boards import HashBoard
|
|
||||||
from pyasic.device.algorithm.hashrate import AlgoHashRate
|
|
||||||
from pyasic.miners.backends import AvalonMiner
|
from pyasic.miners.backends import AvalonMiner
|
||||||
from pyasic.miners.data import (
|
from pyasic.miners.device.models import AvalonNano3
|
||||||
DataFunction,
|
|
||||||
DataLocations,
|
|
||||||
DataOptions,
|
|
||||||
RPCAPICommand,
|
|
||||||
WebAPICommand,
|
|
||||||
)
|
|
||||||
from pyasic.miners.device.models import AvalonNano3, AvalonNano3s
|
|
||||||
from pyasic.web.avalonminer import AvalonMinerWebAPI
|
|
||||||
|
|
||||||
AVALON_NANO_DATA_LOC = DataLocations(
|
|
||||||
**{
|
|
||||||
str(DataOptions.MAC): DataFunction(
|
|
||||||
"_get_mac",
|
|
||||||
[WebAPICommand("web_minerinfo", "get_minerinfo")],
|
|
||||||
),
|
|
||||||
str(DataOptions.API_VERSION): DataFunction(
|
|
||||||
"_get_api_ver",
|
|
||||||
[RPCAPICommand("rpc_version", "version")],
|
|
||||||
),
|
|
||||||
str(DataOptions.FW_VERSION): DataFunction(
|
|
||||||
"_get_fw_ver",
|
|
||||||
[RPCAPICommand("rpc_version", "version")],
|
|
||||||
),
|
|
||||||
str(DataOptions.HASHRATE): DataFunction(
|
|
||||||
"_get_hashrate",
|
|
||||||
[RPCAPICommand("rpc_devs", "devs")],
|
|
||||||
),
|
|
||||||
str(DataOptions.EXPECTED_HASHRATE): DataFunction(
|
|
||||||
"_get_expected_hashrate",
|
|
||||||
[RPCAPICommand("rpc_estats", "estats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.HASHBOARDS): DataFunction(
|
|
||||||
"_get_hashboards",
|
|
||||||
[RPCAPICommand("rpc_estats", "estats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.ENVIRONMENT_TEMP): DataFunction(
|
|
||||||
"_get_env_temp",
|
|
||||||
[RPCAPICommand("rpc_estats", "estats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.WATTAGE_LIMIT): DataFunction(
|
|
||||||
"_get_wattage_limit",
|
|
||||||
[RPCAPICommand("rpc_estats", "estats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.WATTAGE): DataFunction(
|
|
||||||
"_get_wattage",
|
|
||||||
[RPCAPICommand("rpc_estats", "estats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.FANS): DataFunction(
|
|
||||||
"_get_fans",
|
|
||||||
[RPCAPICommand("rpc_estats", "estats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.FAULT_LIGHT): DataFunction(
|
|
||||||
"_get_fault_light",
|
|
||||||
[RPCAPICommand("rpc_estats", "estats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.UPTIME): DataFunction(
|
|
||||||
"_get_uptime",
|
|
||||||
[RPCAPICommand("rpc_stats", "stats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.POOLS): DataFunction(
|
|
||||||
"_get_pools",
|
|
||||||
[RPCAPICommand("rpc_pools", "pools")],
|
|
||||||
),
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
AVALON_NANO3S_DATA_LOC = DataLocations(
|
|
||||||
**{
|
|
||||||
str(DataOptions.MAC): DataFunction(
|
|
||||||
"_get_mac",
|
|
||||||
[RPCAPICommand("rpc_version", "version")],
|
|
||||||
),
|
|
||||||
str(DataOptions.API_VERSION): DataFunction(
|
|
||||||
"_get_api_ver",
|
|
||||||
[RPCAPICommand("rpc_version", "version")],
|
|
||||||
),
|
|
||||||
str(DataOptions.FW_VERSION): DataFunction(
|
|
||||||
"_get_fw_ver",
|
|
||||||
[RPCAPICommand("rpc_version", "version")],
|
|
||||||
),
|
|
||||||
str(DataOptions.HASHRATE): DataFunction(
|
|
||||||
"_get_hashrate",
|
|
||||||
[RPCAPICommand("rpc_estats", "estats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.EXPECTED_HASHRATE): DataFunction(
|
|
||||||
"_get_expected_hashrate",
|
|
||||||
[RPCAPICommand("rpc_estats", "estats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.HASHBOARDS): DataFunction(
|
|
||||||
"_get_hashboards",
|
|
||||||
[RPCAPICommand("rpc_estats", "estats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.ENVIRONMENT_TEMP): DataFunction(
|
|
||||||
"_get_env_temp",
|
|
||||||
[RPCAPICommand("rpc_estats", "estats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.WATTAGE_LIMIT): DataFunction(
|
|
||||||
"_get_wattage_limit",
|
|
||||||
[RPCAPICommand("rpc_estats", "estats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.WATTAGE): DataFunction(
|
|
||||||
"_get_wattage",
|
|
||||||
[RPCAPICommand("rpc_estats", "estats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.FANS): DataFunction(
|
|
||||||
"_get_fans",
|
|
||||||
[RPCAPICommand("rpc_estats", "estats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.FAULT_LIGHT): DataFunction(
|
|
||||||
"_get_fault_light",
|
|
||||||
[RPCAPICommand("rpc_estats", "estats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.UPTIME): DataFunction(
|
|
||||||
"_get_uptime",
|
|
||||||
[RPCAPICommand("rpc_stats", "stats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.POOLS): DataFunction(
|
|
||||||
"_get_pools",
|
|
||||||
[RPCAPICommand("rpc_pools", "pools")],
|
|
||||||
),
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class CGMinerAvalonNano3(AvalonMiner, AvalonNano3):
|
class CGMinerAvalonNano3(AvalonMiner, AvalonNano3):
|
||||||
_web_cls = AvalonMinerWebAPI
|
pass
|
||||||
web: AvalonMinerWebAPI
|
|
||||||
|
|
||||||
data_locations = AVALON_NANO_DATA_LOC
|
|
||||||
|
|
||||||
async def _get_mac(self, web_minerinfo: dict) -> Optional[dict]:
|
|
||||||
if web_minerinfo is None:
|
|
||||||
try:
|
|
||||||
web_minerinfo = await self.web.minerinfo()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if web_minerinfo is not None:
|
|
||||||
try:
|
|
||||||
mac = web_minerinfo.get("mac")
|
|
||||||
if mac is not None:
|
|
||||||
return mac.upper()
|
|
||||||
except (KeyError, ValueError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class CGMinerAvalonNano3s(AvalonMiner, AvalonNano3s):
|
|
||||||
data_locations = AVALON_NANO3S_DATA_LOC
|
|
||||||
|
|
||||||
async def _get_wattage(self, rpc_estats: dict = None) -> Optional[int]:
|
|
||||||
if rpc_estats is None:
|
|
||||||
try:
|
|
||||||
rpc_estats = await self.rpc.estats()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if rpc_estats is not None:
|
|
||||||
try:
|
|
||||||
unparsed_estats = rpc_estats["STATS"][0]["MM ID0"]
|
|
||||||
parsed_estats = self.parse_estats(unparsed_estats)
|
|
||||||
return int(parsed_estats["PS"][6])
|
|
||||||
except (IndexError, KeyError, ValueError, TypeError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_hashrate(self, rpc_estats: dict = None) -> Optional[AlgoHashRate]:
|
|
||||||
if rpc_estats is None:
|
|
||||||
try:
|
|
||||||
rpc_estats = await self.rpc.estats()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if rpc_estats is not None:
|
|
||||||
try:
|
|
||||||
unparsed_estats = rpc_estats["STATS"][0]["MM ID0"]
|
|
||||||
parsed_estats = self.parse_estats(unparsed_estats)
|
|
||||||
return self.algo.hashrate(
|
|
||||||
rate=float(parsed_estats["GHSspd"]), unit=self.algo.unit.GH
|
|
||||||
).into(self.algo.unit.default)
|
|
||||||
except (IndexError, KeyError, ValueError, TypeError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_hashboards(self, rpc_estats: dict = None) -> List[HashBoard]:
|
|
||||||
hashboards = await AvalonMiner._get_hashboards(self, rpc_estats)
|
|
||||||
|
|
||||||
if rpc_estats is None:
|
|
||||||
try:
|
|
||||||
rpc_estats = await self.rpc.estats()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if rpc_estats is not None:
|
|
||||||
try:
|
|
||||||
unparsed_estats = rpc_estats["STATS"][0]["MM ID0"]
|
|
||||||
parsed_estats = self.parse_estats(unparsed_estats)
|
|
||||||
except (IndexError, KeyError, ValueError, TypeError):
|
|
||||||
return hashboards
|
|
||||||
|
|
||||||
for board in range(len(hashboards)):
|
|
||||||
try:
|
|
||||||
board_hr = parsed_estats["GHSspd"][board]
|
|
||||||
hashboards[board].hashrate = self.algo.hashrate(
|
|
||||||
rate=float(board_hr), unit=self.algo.unit.GH
|
|
||||||
).into(self.algo.unit.default)
|
|
||||||
except LookupError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
return hashboards
|
|
||||||
|
|||||||
@@ -20,19 +20,16 @@ from .bfgminer import BFGMiner
|
|||||||
from .bitaxe import BitAxe
|
from .bitaxe import BitAxe
|
||||||
from .bmminer import BMMiner
|
from .bmminer import BMMiner
|
||||||
from .braiins_os import BOSer, BOSMiner
|
from .braiins_os import BOSer, BOSMiner
|
||||||
from .btminer import BTMiner, BTMinerV2, BTMinerV3
|
from .btminer import BTMiner
|
||||||
from .cgminer import CGMiner
|
from .cgminer import CGMiner
|
||||||
from .elphapex import ElphapexMiner
|
|
||||||
from .epic import ePIC
|
from .epic import ePIC
|
||||||
from .goldshell import GoldshellMiner
|
from .goldshell import GoldshellMiner
|
||||||
from .hammer import BlackMiner
|
from .hammer import BlackMiner
|
||||||
from .hiveon import HiveonModern, HiveonOld
|
from .hiveon import HiveonModern, HiveonOld
|
||||||
from .iceriver import IceRiver
|
from .iceriver import IceRiver
|
||||||
from .innosilicon import Innosilicon
|
from .innosilicon import Innosilicon
|
||||||
from .luckyminer import LuckyMiner
|
|
||||||
from .luxminer import LUXMiner
|
from .luxminer import LUXMiner
|
||||||
from .marathon import MaraMiner
|
from .marathon import MaraMiner
|
||||||
from .mskminer import MSKMiner
|
|
||||||
from .unknown import UnknownMiner
|
from .unknown import UnknownMiner
|
||||||
from .vnish import VNish
|
from .vnish import VNish
|
||||||
from .whatsminer import M2X, M3X, M5X, M6X, M7X
|
from .whatsminer import M2X, M3X, M5X, M6X, M7X
|
||||||
|
|||||||
@@ -75,10 +75,6 @@ ANTMINER_MODERN_DATA_LOC = DataLocations(
|
|||||||
"_get_fault_light",
|
"_get_fault_light",
|
||||||
[WebAPICommand("web_get_blink_status", "get_blink_status")],
|
[WebAPICommand("web_get_blink_status", "get_blink_status")],
|
||||||
),
|
),
|
||||||
str(DataOptions.HASHBOARDS): DataFunction(
|
|
||||||
"_get_hashboards",
|
|
||||||
[],
|
|
||||||
),
|
|
||||||
str(DataOptions.IS_MINING): DataFunction(
|
str(DataOptions.IS_MINING): DataFunction(
|
||||||
"_is_mining",
|
"_is_mining",
|
||||||
[WebAPICommand("web_get_conf", "get_miner_conf")],
|
[WebAPICommand("web_get_conf", "get_miner_conf")],
|
||||||
@@ -252,9 +248,6 @@ class AntminerModern(BMMiner):
|
|||||||
return errors
|
return errors
|
||||||
|
|
||||||
async def _get_hashboards(self) -> List[HashBoard]:
|
async def _get_hashboards(self) -> List[HashBoard]:
|
||||||
if self.expected_hashboards is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
hashboards = [
|
hashboards = [
|
||||||
HashBoard(slot=idx, expected_chips=self.expected_chips)
|
HashBoard(slot=idx, expected_chips=self.expected_chips)
|
||||||
for idx in range(self.expected_hashboards)
|
for idx in range(self.expected_hashboards)
|
||||||
@@ -272,47 +265,18 @@ class AntminerModern(BMMiner):
|
|||||||
rate=board["rate_real"], unit=self.algo.unit.GH
|
rate=board["rate_real"], unit=self.algo.unit.GH
|
||||||
).into(self.algo.unit.default)
|
).into(self.algo.unit.default)
|
||||||
hashboards[board["index"]].chips = board["asic_num"]
|
hashboards[board["index"]].chips = board["asic_num"]
|
||||||
|
board_temp_data = list(
|
||||||
if "S21+ Hyd" in self.model:
|
filter(lambda x: not x == 0, board["temp_pcb"])
|
||||||
hashboards[board["index"]].inlet_temp = board["temp_pcb"][0]
|
)
|
||||||
hashboards[board["index"]].outlet_temp = board["temp_pcb"][2]
|
hashboards[board["index"]].temp = sum(board_temp_data) / len(
|
||||||
hashboards[board["index"]].chip_temp = board["temp_pic"][0]
|
board_temp_data
|
||||||
board_temp_data = list(
|
)
|
||||||
filter(
|
chip_temp_data = list(
|
||||||
lambda x: not x == 0,
|
filter(lambda x: not x == 0, board["temp_chip"])
|
||||||
[
|
)
|
||||||
board["temp_pic"][1],
|
hashboards[board["index"]].chip_temp = sum(chip_temp_data) / len(
|
||||||
board["temp_pic"][2],
|
chip_temp_data
|
||||||
board["temp_pic"][3],
|
)
|
||||||
board["temp_pcb"][1],
|
|
||||||
board["temp_pcb"][3],
|
|
||||||
],
|
|
||||||
)
|
|
||||||
)
|
|
||||||
hashboards[board["index"]].temp = (
|
|
||||||
sum(board_temp_data) / len(board_temp_data)
|
|
||||||
if len(board_temp_data) > 0
|
|
||||||
else 0
|
|
||||||
)
|
|
||||||
|
|
||||||
else:
|
|
||||||
board_temp_data = list(
|
|
||||||
filter(lambda x: not x == 0, board["temp_pcb"])
|
|
||||||
)
|
|
||||||
hashboards[board["index"]].temp = (
|
|
||||||
sum(board_temp_data) / len(board_temp_data)
|
|
||||||
if len(board_temp_data) > 0
|
|
||||||
else 0
|
|
||||||
)
|
|
||||||
chip_temp_data = list(
|
|
||||||
filter(lambda x: not x == 0, board["temp_chip"])
|
|
||||||
)
|
|
||||||
hashboards[board["index"]].chip_temp = (
|
|
||||||
sum(chip_temp_data) / len(chip_temp_data)
|
|
||||||
if len(chip_temp_data) > 0
|
|
||||||
else 0
|
|
||||||
)
|
|
||||||
|
|
||||||
hashboards[board["index"]].serial_number = board["sn"]
|
hashboards[board["index"]].serial_number = board["sn"]
|
||||||
hashboards[board["index"]].missing = False
|
hashboards[board["index"]].missing = False
|
||||||
except LookupError:
|
except LookupError:
|
||||||
@@ -597,9 +561,6 @@ class AntminerOld(CGMiner):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_fans(self, rpc_stats: dict = None) -> List[Fan]:
|
async def _get_fans(self, rpc_stats: dict = None) -> List[Fan]:
|
||||||
if self.expected_fans is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
if rpc_stats is None:
|
if rpc_stats is None:
|
||||||
try:
|
try:
|
||||||
rpc_stats = await self.rpc.stats()
|
rpc_stats = await self.rpc.stats()
|
||||||
@@ -628,8 +589,6 @@ class AntminerOld(CGMiner):
|
|||||||
return fans_data
|
return fans_data
|
||||||
|
|
||||||
async def _get_hashboards(self, rpc_stats: dict = None) -> List[HashBoard]:
|
async def _get_hashboards(self, rpc_stats: dict = None) -> List[HashBoard]:
|
||||||
if self.expected_hashboards is None:
|
|
||||||
return []
|
|
||||||
hashboards = []
|
hashboards = []
|
||||||
|
|
||||||
if rpc_stats is None:
|
if rpc_stats is None:
|
||||||
|
|||||||
@@ -303,9 +303,6 @@ class Auradine(StockFirmware):
|
|||||||
async def _get_hashboards(
|
async def _get_hashboards(
|
||||||
self, rpc_devs: dict = None, web_ipreport: dict = None
|
self, rpc_devs: dict = None, web_ipreport: dict = None
|
||||||
) -> List[HashBoard]:
|
) -> List[HashBoard]:
|
||||||
if self.expected_hashboards is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
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)
|
||||||
@@ -385,9 +382,6 @@ class Auradine(StockFirmware):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_fans(self, web_fan: dict = None) -> List[Fan]:
|
async def _get_fans(self, web_fan: dict = None) -> List[Fan]:
|
||||||
if self.expected_fans is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
if web_fan is None:
|
if web_fan is None:
|
||||||
try:
|
try:
|
||||||
web_fan = await self.web.get_fan()
|
web_fan = await self.web.get_fan()
|
||||||
|
|||||||
@@ -13,9 +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. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
import copy
|
|
||||||
import re
|
import re
|
||||||
import time
|
|
||||||
from typing import List, Optional
|
from typing import List, Optional
|
||||||
|
|
||||||
from pyasic.data import Fan, HashBoard
|
from pyasic.data import Fan, HashBoard
|
||||||
@@ -23,7 +22,6 @@ from pyasic.device.algorithm import AlgoHashRate
|
|||||||
from pyasic.errors import APIError
|
from pyasic.errors import APIError
|
||||||
from pyasic.miners.backends.cgminer import CGMiner
|
from pyasic.miners.backends.cgminer import CGMiner
|
||||||
from pyasic.miners.data import DataFunction, DataLocations, DataOptions, RPCAPICommand
|
from pyasic.miners.data import DataFunction, DataLocations, DataOptions, RPCAPICommand
|
||||||
from pyasic.rpc.avalonminer import AvalonMinerRPCAPI
|
|
||||||
|
|
||||||
AVALON_DATA_LOC = DataLocations(
|
AVALON_DATA_LOC = DataLocations(
|
||||||
**{
|
**{
|
||||||
@@ -45,31 +43,27 @@ AVALON_DATA_LOC = DataLocations(
|
|||||||
),
|
),
|
||||||
str(DataOptions.EXPECTED_HASHRATE): DataFunction(
|
str(DataOptions.EXPECTED_HASHRATE): DataFunction(
|
||||||
"_get_expected_hashrate",
|
"_get_expected_hashrate",
|
||||||
[RPCAPICommand("rpc_estats", "estats")],
|
[RPCAPICommand("rpc_stats", "stats")],
|
||||||
),
|
),
|
||||||
str(DataOptions.HASHBOARDS): DataFunction(
|
str(DataOptions.HASHBOARDS): DataFunction(
|
||||||
"_get_hashboards",
|
"_get_hashboards",
|
||||||
[RPCAPICommand("rpc_estats", "estats")],
|
[RPCAPICommand("rpc_stats", "stats")],
|
||||||
),
|
),
|
||||||
str(DataOptions.ENVIRONMENT_TEMP): DataFunction(
|
str(DataOptions.ENVIRONMENT_TEMP): DataFunction(
|
||||||
"_get_env_temp",
|
"_get_env_temp",
|
||||||
[RPCAPICommand("rpc_estats", "estats")],
|
[RPCAPICommand("rpc_stats", "stats")],
|
||||||
),
|
),
|
||||||
str(DataOptions.WATTAGE_LIMIT): DataFunction(
|
str(DataOptions.WATTAGE_LIMIT): DataFunction(
|
||||||
"_get_wattage_limit",
|
"_get_wattage_limit",
|
||||||
[RPCAPICommand("rpc_estats", "estats")],
|
[RPCAPICommand("rpc_stats", "stats")],
|
||||||
),
|
|
||||||
str(DataOptions.WATTAGE): DataFunction(
|
|
||||||
"_get_wattage",
|
|
||||||
[RPCAPICommand("rpc_estats", "estats")],
|
|
||||||
),
|
),
|
||||||
str(DataOptions.FANS): DataFunction(
|
str(DataOptions.FANS): DataFunction(
|
||||||
"_get_fans",
|
"_get_fans",
|
||||||
[RPCAPICommand("rpc_estats", "estats")],
|
[RPCAPICommand("rpc_stats", "stats")],
|
||||||
),
|
),
|
||||||
str(DataOptions.FAULT_LIGHT): DataFunction(
|
str(DataOptions.FAULT_LIGHT): DataFunction(
|
||||||
"_get_fault_light",
|
"_get_fault_light",
|
||||||
[RPCAPICommand("rpc_estats", "estats")],
|
[RPCAPICommand("rpc_stats", "stats")],
|
||||||
),
|
),
|
||||||
str(DataOptions.UPTIME): DataFunction(
|
str(DataOptions.UPTIME): DataFunction(
|
||||||
"_get_uptime",
|
"_get_uptime",
|
||||||
@@ -86,9 +80,6 @@ AVALON_DATA_LOC = DataLocations(
|
|||||||
class AvalonMiner(CGMiner):
|
class AvalonMiner(CGMiner):
|
||||||
"""Handler for Avalon Miners"""
|
"""Handler for Avalon Miners"""
|
||||||
|
|
||||||
_rpc_cls = AvalonMinerRPCAPI
|
|
||||||
rpc: AvalonMinerRPCAPI
|
|
||||||
|
|
||||||
data_locations = AVALON_DATA_LOC
|
data_locations = AVALON_DATA_LOC
|
||||||
|
|
||||||
async def fault_light_on(self) -> bool:
|
async def fault_light_on(self) -> bool:
|
||||||
@@ -109,23 +100,6 @@ class AvalonMiner(CGMiner):
|
|||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
async def set_power_limit(self, wattage: int) -> bool:
|
|
||||||
try:
|
|
||||||
if wattage < 3:
|
|
||||||
limit = wattage
|
|
||||||
elif wattage > 100:
|
|
||||||
limit = 2
|
|
||||||
elif wattage > 80:
|
|
||||||
limit = 1
|
|
||||||
else:
|
|
||||||
limit = 0
|
|
||||||
data = await self.rpc.ascset(0, "worklevel,set", 1)
|
|
||||||
except APIError:
|
|
||||||
return False
|
|
||||||
if data["STATUS"][0]["Msg"] == "ASC 0 set OK":
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def reboot(self) -> bool:
|
async def reboot(self) -> bool:
|
||||||
try:
|
try:
|
||||||
data = await self.rpc.restart()
|
data = await self.rpc.restart()
|
||||||
@@ -139,94 +113,45 @@ class AvalonMiner(CGMiner):
|
|||||||
return False
|
return False
|
||||||
return False
|
return False
|
||||||
|
|
||||||
async def stop_mining(self) -> bool:
|
|
||||||
try:
|
|
||||||
# Shut off 5 seconds from now
|
|
||||||
timestamp = int(time.time()) + 5
|
|
||||||
data = await self.rpc.ascset(0, f"softoff", f"1:{timestamp}")
|
|
||||||
except APIError:
|
|
||||||
return False
|
|
||||||
if "success" in data["STATUS"][0]["Msg"]:
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def resume_mining(self) -> bool:
|
|
||||||
try:
|
|
||||||
# Shut off 5 seconds from now
|
|
||||||
timestamp = int(time.time()) + 5
|
|
||||||
data = await self.rpc.ascset(0, f"softon", f"1:{timestamp}")
|
|
||||||
except APIError:
|
|
||||||
return False
|
|
||||||
if "success" in data["STATUS"][0]["Msg"]:
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def parse_estats(data):
|
def parse_stats(stats):
|
||||||
# Deep copy to preserve original structure
|
_stats_items = re.findall(".+?\\[*?]", stats)
|
||||||
new_data = copy.deepcopy(data)
|
stats_items = []
|
||||||
|
stats_dict = {}
|
||||||
def convert_value(val, key):
|
for item in _stats_items:
|
||||||
val = val.strip()
|
if ": " in item:
|
||||||
|
data = item.replace("]", "").split("[")
|
||||||
if key == "SYSTEMSTATU":
|
data_list = [i.split(": ") for i in data[1].strip().split(", ")]
|
||||||
return val
|
data_dict = {}
|
||||||
|
|
||||||
if " " in val:
|
|
||||||
parts = val.split()
|
|
||||||
result = []
|
|
||||||
for part in parts:
|
|
||||||
if part.isdigit():
|
|
||||||
result.append(int(part))
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
result.append(float(part))
|
|
||||||
except ValueError:
|
|
||||||
result.append(part)
|
|
||||||
return result
|
|
||||||
else:
|
|
||||||
if val.isdigit():
|
|
||||||
return int(val)
|
|
||||||
try:
|
try:
|
||||||
return float(val)
|
for key, val in [tuple(item) for item in data_list]:
|
||||||
|
data_dict[key] = val
|
||||||
except ValueError:
|
except ValueError:
|
||||||
return val
|
# --avalon args
|
||||||
|
for arg_item in data_list:
|
||||||
|
item_data = arg_item[0].split(" ")
|
||||||
|
for idx, val in enumerate(item_data):
|
||||||
|
if idx % 2 == 0 or idx == 0:
|
||||||
|
data_dict[val] = item_data[idx + 1]
|
||||||
|
|
||||||
def parse_info_block(info_str):
|
raw_data = [data[0].strip(), data_dict]
|
||||||
pattern = re.compile(r"(\w+)\[([^\]]*)\]")
|
else:
|
||||||
return {
|
raw_data = [
|
||||||
key: convert_value(val, key) for key, val in pattern.findall(info_str)
|
value
|
||||||
}
|
for value in item.replace("[", " ")
|
||||||
|
.replace("]", " ")
|
||||||
|
.split(" ")[:-1]
|
||||||
|
if value != ""
|
||||||
|
]
|
||||||
|
if len(raw_data) == 1:
|
||||||
|
raw_data.append("")
|
||||||
|
if raw_data[0] == "":
|
||||||
|
raw_data = raw_data[1:]
|
||||||
|
|
||||||
for stat in new_data.get("STATS", []):
|
stats_dict[raw_data[0]] = raw_data[1:]
|
||||||
keys_to_replace = {}
|
stats_items.append(raw_data)
|
||||||
|
|
||||||
for key, value in stat.items():
|
return stats_dict
|
||||||
if "MM" in key:
|
|
||||||
# Normalize key by removing suffix after colon
|
|
||||||
norm_key = key.split(":")[0]
|
|
||||||
|
|
||||||
mm_data = value
|
|
||||||
if not isinstance(mm_data, str):
|
|
||||||
continue
|
|
||||||
if mm_data.startswith("'STATS':"):
|
|
||||||
mm_data = mm_data[len("'STATS':") :]
|
|
||||||
keys_to_replace[norm_key] = parse_info_block(mm_data)
|
|
||||||
|
|
||||||
elif key == "HBinfo":
|
|
||||||
match = re.search(r"'(\w+)':\{(.+)\}", value)
|
|
||||||
if match:
|
|
||||||
hb_key = match.group(1)
|
|
||||||
hb_data = match.group(2)
|
|
||||||
keys_to_replace[key] = {hb_key: parse_info_block(hb_data)}
|
|
||||||
|
|
||||||
# Remove old keys and insert parsed versions
|
|
||||||
for k in list(stat.keys()):
|
|
||||||
if "MM" in k or k == "HBinfo":
|
|
||||||
del stat[k]
|
|
||||||
stat.update(keys_to_replace)
|
|
||||||
|
|
||||||
return new_data
|
|
||||||
|
|
||||||
##################################################
|
##################################################
|
||||||
### DATA GATHERING FUNCTIONS (get_{some_data}) ###
|
### DATA GATHERING FUNCTIONS (get_{some_data}) ###
|
||||||
@@ -265,210 +190,152 @@ class AvalonMiner(CGMiner):
|
|||||||
except (KeyError, IndexError, ValueError, TypeError):
|
except (KeyError, IndexError, ValueError, TypeError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_hashboards(self, rpc_estats: dict = None) -> List[HashBoard]:
|
async def _get_hashboards(self, rpc_stats: dict = None) -> List[HashBoard]:
|
||||||
if self.expected_hashboards is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
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)
|
||||||
]
|
]
|
||||||
|
|
||||||
if rpc_estats is None:
|
if rpc_stats is None:
|
||||||
try:
|
try:
|
||||||
rpc_estats = await self.rpc.estats()
|
rpc_stats = await self.rpc.stats()
|
||||||
except APIError:
|
except APIError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
if rpc_estats is not None:
|
if rpc_stats is not None:
|
||||||
try:
|
try:
|
||||||
parsed_estats = self.parse_estats(rpc_estats)
|
unparsed_stats = rpc_stats["STATS"][0]["MM ID0"]
|
||||||
|
parsed_stats = self.parse_stats(unparsed_stats)
|
||||||
except (IndexError, KeyError, ValueError, TypeError):
|
except (IndexError, KeyError, ValueError, TypeError):
|
||||||
return hashboards
|
return hashboards
|
||||||
|
|
||||||
for board in range(self.expected_hashboards):
|
for board in range(self.expected_hashboards):
|
||||||
try:
|
try:
|
||||||
board_hr = parsed_estats["STATS"][0]["MM ID0"]["MGHS"]
|
hashboards[board].chip_temp = int(parsed_stats["MTmax"][board])
|
||||||
if isinstance(board_hr, list):
|
|
||||||
hashboards[board].hashrate = self.algo.hashrate(
|
|
||||||
rate=float(board_hr[board]), unit=self.algo.unit.GH
|
|
||||||
).into(self.algo.unit.default)
|
|
||||||
else:
|
|
||||||
hashboards[board].hashrate = self.algo.hashrate(
|
|
||||||
rate=float(board_hr), unit=self.algo.unit.GH
|
|
||||||
).into(self.algo.unit.default)
|
|
||||||
|
|
||||||
except LookupError:
|
except LookupError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
try:
|
try:
|
||||||
hashboards[board].chip_temp = int(
|
board_hr = parsed_stats["MGHS"][board]
|
||||||
parsed_estats["STATS"][0]["MM ID0"]["MTmax"][board]
|
hashboards[board].hashrate = self.algo.hashrate(
|
||||||
)
|
rate=float(board_hr), unit=self.algo.unit.GH
|
||||||
|
).into(self.algo.unit.default)
|
||||||
except LookupError:
|
except LookupError:
|
||||||
try:
|
pass
|
||||||
hashboards[board].chip_temp = int(
|
|
||||||
parsed_estats["STATS"][0]["MM ID0"]["Tmax"]
|
|
||||||
)
|
|
||||||
except LookupError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
hashboards[board].temp = int(
|
hashboards[board].temp = int(parsed_stats["MTavg"][board])
|
||||||
parsed_estats["STATS"][0]["MM ID0"]["MTmax"][board]
|
|
||||||
)
|
|
||||||
except LookupError:
|
except LookupError:
|
||||||
try:
|
pass
|
||||||
hashboards[board].temp = int(
|
|
||||||
parsed_estats["STATS"][0]["MM ID0"]["Tavg"]
|
|
||||||
)
|
|
||||||
except LookupError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
hashboards[board].inlet_temp = int(
|
chip_data = parsed_stats[f"PVT_T{board}"]
|
||||||
parsed_estats["STATS"][0]["MM ID0"]["MTavg"][board]
|
|
||||||
)
|
|
||||||
except LookupError:
|
|
||||||
try:
|
|
||||||
hashboards[board].inlet_temp = int(
|
|
||||||
parsed_estats["STATS"][0]["MM ID0"]["HBITemp"]
|
|
||||||
)
|
|
||||||
except LookupError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
try:
|
|
||||||
hashboards[board].outlet_temp = int(
|
|
||||||
parsed_estats["STATS"][0]["MM ID0"]["MTmax"][board]
|
|
||||||
)
|
|
||||||
except LookupError:
|
|
||||||
try:
|
|
||||||
hashboards[board].outlet_temp = int(
|
|
||||||
parsed_estats["STATS"][0]["MM ID0"]["HBOTemp"]
|
|
||||||
)
|
|
||||||
except LookupError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
try:
|
|
||||||
chip_data = parsed_estats["STATS"][0]["MM ID0"][f"PVT_T{board}"]
|
|
||||||
hashboards[board].missing = False
|
hashboards[board].missing = False
|
||||||
if chip_data:
|
if chip_data:
|
||||||
hashboards[board].chips = len(
|
hashboards[board].chips = len(
|
||||||
[item for item in chip_data if not item == "0"]
|
[item for item in chip_data if not item == "0"]
|
||||||
)
|
)
|
||||||
except LookupError:
|
except LookupError:
|
||||||
try:
|
pass
|
||||||
chip_data = parsed_estats["STATS"][0]["HBinfo"][f"HB{board}"][
|
|
||||||
f"PVT_T{board}"
|
|
||||||
]
|
|
||||||
hashboards[board].missing = False
|
|
||||||
if chip_data:
|
|
||||||
hashboards[board].chips = len(
|
|
||||||
[item for item in chip_data if not item == "0"]
|
|
||||||
)
|
|
||||||
except LookupError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
return hashboards
|
return hashboards
|
||||||
|
|
||||||
async def _get_expected_hashrate(
|
async def _get_expected_hashrate(
|
||||||
self, rpc_estats: dict = None
|
self, rpc_stats: dict = None
|
||||||
) -> Optional[AlgoHashRate]:
|
) -> Optional[AlgoHashRate]:
|
||||||
if rpc_estats is None:
|
if rpc_stats is None:
|
||||||
try:
|
try:
|
||||||
rpc_estats = await self.rpc.estats()
|
rpc_stats = await self.rpc.stats()
|
||||||
except APIError:
|
except APIError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
if rpc_estats is not None:
|
if rpc_stats is not None:
|
||||||
try:
|
try:
|
||||||
parsed_estats = self.parse_estats(rpc_estats)["STATS"][0]["MM ID0"]
|
unparsed_stats = rpc_stats["STATS"][0]["MM ID0"]
|
||||||
|
parsed_stats = self.parse_stats(unparsed_stats)
|
||||||
return self.algo.hashrate(
|
return self.algo.hashrate(
|
||||||
rate=float(parsed_estats["GHSmm"]), unit=self.algo.unit.GH
|
rate=float(parsed_stats["GHSmm"][0]), unit=self.algo.unit.GH
|
||||||
).into(self.algo.unit.default)
|
).into(self.algo.unit.default)
|
||||||
except (IndexError, KeyError, ValueError, TypeError):
|
except (IndexError, KeyError, ValueError, TypeError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_env_temp(self, rpc_estats: dict = None) -> Optional[float]:
|
async def _get_env_temp(self, rpc_stats: dict = None) -> Optional[float]:
|
||||||
if rpc_estats is None:
|
if rpc_stats is None:
|
||||||
try:
|
try:
|
||||||
rpc_estats = await self.rpc.estats()
|
rpc_stats = await self.rpc.stats()
|
||||||
except APIError:
|
except APIError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
if rpc_estats is not None:
|
if rpc_stats is not None:
|
||||||
try:
|
try:
|
||||||
parsed_estats = self.parse_estats(rpc_estats)["STATS"][0]["MM ID0"]
|
unparsed_stats = rpc_stats["STATS"][0]["MM ID0"]
|
||||||
return float(parsed_estats["Temp"])
|
parsed_stats = self.parse_stats(unparsed_stats)
|
||||||
|
return float(parsed_stats["Temp"][0])
|
||||||
except (IndexError, KeyError, ValueError, TypeError):
|
except (IndexError, KeyError, ValueError, TypeError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_wattage_limit(self, rpc_estats: dict = None) -> Optional[int]:
|
async def _get_wattage_limit(self, rpc_stats: dict = None) -> Optional[int]:
|
||||||
if rpc_estats is None:
|
if rpc_stats is None:
|
||||||
try:
|
try:
|
||||||
rpc_estats = await self.rpc.estats()
|
rpc_stats = await self.rpc.stats()
|
||||||
except APIError:
|
except APIError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
if rpc_estats is not None:
|
if rpc_stats is not None:
|
||||||
try:
|
try:
|
||||||
parsed_estats = self.parse_estats(rpc_estats)["STATS"][0]["MM ID0"]
|
unparsed_stats = rpc_stats["STATS"][0]["MM ID0"]
|
||||||
return int(parsed_estats["MPO"])
|
parsed_stats = self.parse_stats(unparsed_stats)
|
||||||
|
return int(parsed_stats["MPO"][0])
|
||||||
except (IndexError, KeyError, ValueError, TypeError):
|
except (IndexError, KeyError, ValueError, TypeError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_wattage(self, rpc_estats: dict = None) -> Optional[int]:
|
async def _get_fans(self, rpc_stats: dict = None) -> List[Fan]:
|
||||||
if rpc_estats is None:
|
if rpc_stats is None:
|
||||||
try:
|
try:
|
||||||
rpc_estats = await self.rpc.estats()
|
rpc_stats = await self.rpc.stats()
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if rpc_estats is not None:
|
|
||||||
try:
|
|
||||||
parsed_estats = self.parse_estats(rpc_estats)["STATS"][0]["MM ID0"]
|
|
||||||
return int(parsed_estats["WALLPOWER"])
|
|
||||||
except (IndexError, KeyError, ValueError, TypeError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_fans(self, rpc_estats: dict = None) -> List[Fan]:
|
|
||||||
if self.expected_fans is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
if rpc_estats is None:
|
|
||||||
try:
|
|
||||||
rpc_estats = await self.rpc.estats()
|
|
||||||
except APIError:
|
except APIError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
fans_data = [Fan() for _ in range(self.expected_fans)]
|
fans_data = [Fan() for _ in range(self.expected_fans)]
|
||||||
if rpc_estats is not None:
|
if rpc_stats is not None:
|
||||||
try:
|
try:
|
||||||
parsed_estats = self.parse_estats(rpc_estats)["STATS"][0]["MM ID0"]
|
unparsed_stats = rpc_stats["STATS"][0]["MM ID0"]
|
||||||
|
parsed_stats = self.parse_stats(unparsed_stats)
|
||||||
except LookupError:
|
except LookupError:
|
||||||
return fans_data
|
return fans_data
|
||||||
|
|
||||||
for fan in range(self.expected_fans):
|
for fan in range(self.expected_fans):
|
||||||
try:
|
try:
|
||||||
fans_data[fan].speed = int(parsed_estats[f"Fan{fan + 1}"])
|
fans_data[fan].speed = int(parsed_stats[f"Fan{fan + 1}"][0])
|
||||||
except (IndexError, KeyError, ValueError, TypeError):
|
except (IndexError, KeyError, ValueError, TypeError):
|
||||||
pass
|
pass
|
||||||
return fans_data
|
return fans_data
|
||||||
|
|
||||||
async def _get_fault_light(self, rpc_estats: dict = None) -> Optional[bool]:
|
async def _get_fault_light(self, rpc_stats: dict = None) -> Optional[bool]:
|
||||||
if self.light:
|
if self.light:
|
||||||
return self.light
|
return self.light
|
||||||
if rpc_estats is None:
|
if rpc_stats is None:
|
||||||
try:
|
try:
|
||||||
rpc_estats = await self.rpc.estats()
|
rpc_stats = await self.rpc.stats()
|
||||||
except APIError:
|
except APIError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
if rpc_estats is not None:
|
if rpc_stats is not None:
|
||||||
try:
|
try:
|
||||||
parsed_estats = self.parse_estats(rpc_estats)["STATS"][0]["MM ID0"]
|
unparsed_stats = rpc_stats["STATS"][0]["MM ID0"]
|
||||||
led = int(parsed_estats["Led"])
|
parsed_stats = self.parse_stats(unparsed_stats)
|
||||||
|
led = int(parsed_stats["Led"][0])
|
||||||
return True if led == 1 else False
|
return True if led == 1 else False
|
||||||
except (IndexError, KeyError, ValueError, TypeError):
|
except (IndexError, KeyError, ValueError, TypeError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
try:
|
||||||
|
data = await self.rpc.ascset(0, "led", "1-255")
|
||||||
|
except APIError:
|
||||||
|
return False
|
||||||
|
try:
|
||||||
|
if data["STATUS"][0]["Msg"] == "ASC 0 set info: LED[1]":
|
||||||
|
return True
|
||||||
|
except LookupError:
|
||||||
|
pass
|
||||||
return False
|
return False
|
||||||
|
|||||||
@@ -129,9 +129,6 @@ class BFGMiner(StockFirmware):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_hashboards(self, rpc_stats: dict = None) -> List[HashBoard]:
|
async def _get_hashboards(self, rpc_stats: dict = None) -> List[HashBoard]:
|
||||||
if self.expected_hashboards is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
hashboards = []
|
hashboards = []
|
||||||
|
|
||||||
if rpc_stats is None:
|
if rpc_stats is None:
|
||||||
@@ -188,9 +185,6 @@ class BFGMiner(StockFirmware):
|
|||||||
return hashboards
|
return hashboards
|
||||||
|
|
||||||
async def _get_fans(self, rpc_stats: dict = None) -> List[Fan]:
|
async def _get_fans(self, rpc_stats: dict = None) -> List[Fan]:
|
||||||
if self.expected_fans is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
if rpc_stats is None:
|
if rpc_stats is None:
|
||||||
try:
|
try:
|
||||||
rpc_stats = await self.rpc.stats()
|
rpc_stats = await self.rpc.stats()
|
||||||
|
|||||||
@@ -1,7 +1,235 @@
|
|||||||
from pyasic.miners.backends.espminer import ESPMiner
|
from typing import List, Optional
|
||||||
|
|
||||||
|
from pyasic import APIError, MinerConfig
|
||||||
|
from pyasic.data import Fan, HashBoard
|
||||||
|
from pyasic.device.algorithm import AlgoHashRate
|
||||||
|
from pyasic.device.firmware import MinerFirmware
|
||||||
|
from pyasic.miners.base import BaseMiner
|
||||||
|
from pyasic.miners.data import DataFunction, DataLocations, DataOptions, WebAPICommand
|
||||||
|
from pyasic.web.bitaxe import BitAxeWebAPI
|
||||||
|
|
||||||
|
BITAXE_DATA_LOC = DataLocations(
|
||||||
|
**{
|
||||||
|
str(DataOptions.HASHRATE): DataFunction(
|
||||||
|
"_get_hashrate",
|
||||||
|
[WebAPICommand("web_system_info", "system/info")],
|
||||||
|
),
|
||||||
|
str(DataOptions.EXPECTED_HASHRATE): DataFunction(
|
||||||
|
"_get_expected_hashrate",
|
||||||
|
[WebAPICommand("web_system_info", "system/info")],
|
||||||
|
),
|
||||||
|
str(DataOptions.WATTAGE): DataFunction(
|
||||||
|
"_get_wattage",
|
||||||
|
[WebAPICommand("web_system_info", "system/info")],
|
||||||
|
),
|
||||||
|
str(DataOptions.UPTIME): DataFunction(
|
||||||
|
"_get_uptime",
|
||||||
|
[WebAPICommand("web_system_info", "system/info")],
|
||||||
|
),
|
||||||
|
str(DataOptions.HASHBOARDS): DataFunction(
|
||||||
|
"_get_hashboards",
|
||||||
|
[WebAPICommand("web_system_info", "system/info")],
|
||||||
|
),
|
||||||
|
str(DataOptions.HOSTNAME): DataFunction(
|
||||||
|
"_get_hostname",
|
||||||
|
[WebAPICommand("web_system_info", "system/info")],
|
||||||
|
),
|
||||||
|
str(DataOptions.FANS): DataFunction(
|
||||||
|
"_get_fans",
|
||||||
|
[WebAPICommand("web_system_info", "system/info")],
|
||||||
|
),
|
||||||
|
str(DataOptions.FW_VERSION): DataFunction(
|
||||||
|
"_get_fw_ver",
|
||||||
|
[WebAPICommand("web_system_info", "system/info")],
|
||||||
|
),
|
||||||
|
str(DataOptions.API_VERSION): DataFunction(
|
||||||
|
"_get_api_ver",
|
||||||
|
[WebAPICommand("web_system_info", "system/info")],
|
||||||
|
),
|
||||||
|
str(DataOptions.MAC): DataFunction(
|
||||||
|
"_get_mac",
|
||||||
|
[WebAPICommand("web_system_info", "system/info")],
|
||||||
|
),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class BitAxe(ESPMiner):
|
class BitAxe(BaseMiner):
|
||||||
"""Handler for BitAxe"""
|
"""Handler for BitAxe"""
|
||||||
|
|
||||||
pass
|
web: BitAxeWebAPI
|
||||||
|
_web_cls = BitAxeWebAPI
|
||||||
|
|
||||||
|
firmware = MinerFirmware.STOCK
|
||||||
|
|
||||||
|
data_locations = BITAXE_DATA_LOC
|
||||||
|
|
||||||
|
async def reboot(self) -> bool:
|
||||||
|
await self.web.restart()
|
||||||
|
return True
|
||||||
|
|
||||||
|
async def get_config(self) -> MinerConfig:
|
||||||
|
web_system_info = await self.web.system_info()
|
||||||
|
return MinerConfig.from_bitaxe(web_system_info)
|
||||||
|
|
||||||
|
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
|
||||||
|
await self.web.update_settings(**config.as_bitaxe())
|
||||||
|
|
||||||
|
async def _get_wattage(self, web_system_info: dict = None) -> Optional[int]:
|
||||||
|
if web_system_info is None:
|
||||||
|
try:
|
||||||
|
web_system_info = await self.web.system_info()
|
||||||
|
except APIError:
|
||||||
|
pass
|
||||||
|
if web_system_info is not None:
|
||||||
|
try:
|
||||||
|
return round(web_system_info["power"])
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
async def _get_hashrate(
|
||||||
|
self, web_system_info: dict = None
|
||||||
|
) -> Optional[AlgoHashRate]:
|
||||||
|
if web_system_info is None:
|
||||||
|
try:
|
||||||
|
web_system_info = await self.web.system_info()
|
||||||
|
except APIError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if web_system_info is not None:
|
||||||
|
try:
|
||||||
|
return self.algo.hashrate(
|
||||||
|
rate=float(web_system_info["hashRate"]), unit=self.algo.unit.GH
|
||||||
|
).into(self.algo.unit.default)
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
async def _get_expected_hashrate(
|
||||||
|
self, web_system_info: dict = None
|
||||||
|
) -> Optional[AlgoHashRate]:
|
||||||
|
if web_system_info is None:
|
||||||
|
try:
|
||||||
|
web_system_info = await self.web.system_info()
|
||||||
|
except APIError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if web_system_info is not None:
|
||||||
|
try:
|
||||||
|
expected_hashrate = (
|
||||||
|
web_system_info.get("smallCoreCount")
|
||||||
|
* web_system_info.get("asicCount")
|
||||||
|
* web_system_info.get("frequency")
|
||||||
|
)
|
||||||
|
|
||||||
|
return self.algo.hashrate(
|
||||||
|
rate=float(expected_hashrate), unit=self.algo.unit.MH
|
||||||
|
).into(self.algo.unit.default)
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
async def _get_uptime(self, web_system_info: dict = None) -> Optional[int]:
|
||||||
|
if web_system_info is None:
|
||||||
|
try:
|
||||||
|
web_system_info = await self.web.system_info()
|
||||||
|
except APIError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if web_system_info is not None:
|
||||||
|
try:
|
||||||
|
return web_system_info["uptimeSeconds"]
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
async def _get_hashboards(self, web_system_info: dict = None) -> List[HashBoard]:
|
||||||
|
if web_system_info is None:
|
||||||
|
try:
|
||||||
|
web_system_info = await self.web.system_info()
|
||||||
|
except APIError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if web_system_info is not None:
|
||||||
|
try:
|
||||||
|
return [
|
||||||
|
HashBoard(
|
||||||
|
hashrate=self.algo.hashrate(
|
||||||
|
rate=float(web_system_info["hashRate"]),
|
||||||
|
unit=self.algo.unit.GH,
|
||||||
|
).into(self.algo.unit.default),
|
||||||
|
chip_temp=web_system_info.get("temp"),
|
||||||
|
temp=web_system_info.get("vrTemp"),
|
||||||
|
chips=web_system_info.get("asicCount", 1),
|
||||||
|
expected_chips=self.expected_chips,
|
||||||
|
missing=False,
|
||||||
|
active=True,
|
||||||
|
voltage=web_system_info.get("voltage"),
|
||||||
|
)
|
||||||
|
]
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
return []
|
||||||
|
|
||||||
|
async def _get_fans(self, web_system_info: dict = None) -> List[Fan]:
|
||||||
|
if web_system_info is None:
|
||||||
|
try:
|
||||||
|
web_system_info = await self.web.system_info()
|
||||||
|
except APIError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if web_system_info is not None:
|
||||||
|
try:
|
||||||
|
return [Fan(speed=web_system_info["fanrpm"])]
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
return []
|
||||||
|
|
||||||
|
async def _get_hostname(self, web_system_info: dict = None) -> Optional[str]:
|
||||||
|
if web_system_info is None:
|
||||||
|
try:
|
||||||
|
web_system_info = await self.web.system_info()
|
||||||
|
except APIError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if web_system_info is not None:
|
||||||
|
try:
|
||||||
|
return web_system_info["hostname"]
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
async def _get_api_ver(self, web_system_info: dict = None) -> Optional[str]:
|
||||||
|
if web_system_info is None:
|
||||||
|
try:
|
||||||
|
web_system_info = await self.web.system_info()
|
||||||
|
except APIError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if web_system_info is not None:
|
||||||
|
try:
|
||||||
|
return web_system_info["version"]
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
async def _get_fw_ver(self, web_system_info: dict = None) -> Optional[str]:
|
||||||
|
if web_system_info is None:
|
||||||
|
try:
|
||||||
|
web_system_info = await self.web.system_info()
|
||||||
|
except APIError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if web_system_info is not None:
|
||||||
|
try:
|
||||||
|
return web_system_info["version"]
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
async def _get_mac(self, web_system_info: dict = None) -> Optional[str]:
|
||||||
|
if web_system_info is None:
|
||||||
|
try:
|
||||||
|
web_system_info = await self.web.system_info()
|
||||||
|
except APIError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if web_system_info is not None:
|
||||||
|
try:
|
||||||
|
return web_system_info["macAddr"].upper()
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|||||||
@@ -133,9 +133,6 @@ class BMMiner(StockFirmware):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_hashboards(self, rpc_stats: dict = None) -> List[HashBoard]:
|
async def _get_hashboards(self, rpc_stats: dict = None) -> List[HashBoard]:
|
||||||
if self.expected_hashboards is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
hashboards = []
|
hashboards = []
|
||||||
|
|
||||||
if rpc_stats is None:
|
if rpc_stats is None:
|
||||||
@@ -205,9 +202,6 @@ class BMMiner(StockFirmware):
|
|||||||
return hashboards
|
return hashboards
|
||||||
|
|
||||||
async def _get_fans(self, rpc_stats: dict = None) -> List[Fan]:
|
async def _get_fans(self, rpc_stats: dict = None) -> List[Fan]:
|
||||||
if self.expected_fans is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
if rpc_stats is None:
|
if rpc_stats is None:
|
||||||
try:
|
try:
|
||||||
rpc_stats = await self.rpc.stats()
|
rpc_stats = await self.rpc.stats()
|
||||||
|
|||||||
@@ -376,9 +376,6 @@ class BOSMiner(BraiinsOSFirmware):
|
|||||||
rpc_devdetails: dict = None,
|
rpc_devdetails: dict = None,
|
||||||
rpc_devs: dict = None,
|
rpc_devs: dict = None,
|
||||||
) -> List[HashBoard]:
|
) -> List[HashBoard]:
|
||||||
if self.expected_hashboards is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
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)
|
||||||
@@ -476,9 +473,6 @@ class BOSMiner(BraiinsOSFirmware):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_fans(self, rpc_fans: dict = None) -> List[Fan]:
|
async def _get_fans(self, rpc_fans: dict = None) -> List[Fan]:
|
||||||
if self.expected_fans is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
if rpc_fans is None:
|
if rpc_fans is None:
|
||||||
try:
|
try:
|
||||||
rpc_fans = await self.rpc.fans()
|
rpc_fans = await self.rpc.fans()
|
||||||
@@ -932,9 +926,6 @@ class BOSer(BraiinsOSFirmware):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_hashboards(self, grpc_hashboards: dict = None) -> List[HashBoard]:
|
async def _get_hashboards(self, grpc_hashboards: dict = None) -> List[HashBoard]:
|
||||||
if self.expected_hashboards is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
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)
|
||||||
@@ -1006,9 +997,6 @@ class BOSer(BraiinsOSFirmware):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_fans(self, grpc_cooling_state: dict = None) -> List[Fan]:
|
async def _get_fans(self, grpc_cooling_state: dict = None) -> List[Fan]:
|
||||||
if self.expected_fans is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
if grpc_cooling_state is None:
|
if grpc_cooling_state is None:
|
||||||
try:
|
try:
|
||||||
grpc_cooling_state = await self.web.get_cooling_state()
|
grpc_cooling_state = await self.web.get_cooling_state()
|
||||||
|
|||||||
@@ -13,14 +13,14 @@
|
|||||||
# 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
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from typing import List, Optional
|
||||||
|
|
||||||
import aiofiles
|
import aiofiles
|
||||||
import semver
|
|
||||||
|
|
||||||
from pyasic.config import MinerConfig, MiningModeConfig, PoolConfig
|
from pyasic.config import MinerConfig, MiningModeConfig
|
||||||
from pyasic.data import Fan, HashBoard
|
from pyasic.data import Fan, HashBoard
|
||||||
from pyasic.data.error_codes import MinerErrorData, WhatsminerError
|
from pyasic.data.error_codes import MinerErrorData, WhatsminerError
|
||||||
from pyasic.data.pools import PoolMetrics, PoolUrl
|
from pyasic.data.pools import PoolMetrics, PoolUrl
|
||||||
@@ -28,36 +28,7 @@ from pyasic.device.algorithm import AlgoHashRate
|
|||||||
from pyasic.errors import APIError
|
from pyasic.errors import APIError
|
||||||
from pyasic.miners.data import DataFunction, DataLocations, DataOptions, RPCAPICommand
|
from pyasic.miners.data import DataFunction, DataLocations, DataOptions, RPCAPICommand
|
||||||
from pyasic.miners.device.firmware import StockFirmware
|
from pyasic.miners.device.firmware import StockFirmware
|
||||||
from pyasic.rpc.btminer import BTMinerRPCAPI, BTMinerV3RPCAPI
|
from pyasic.rpc.btminer import BTMinerRPCAPI
|
||||||
|
|
||||||
|
|
||||||
class BTMiner(StockFirmware):
|
|
||||||
def __new__(cls, ip: str, version: str | None = None):
|
|
||||||
bases = cls.__bases__
|
|
||||||
bases = bases[1:]
|
|
||||||
|
|
||||||
def get_new(v: str | None):
|
|
||||||
if v is None:
|
|
||||||
return BTMinerV2
|
|
||||||
try:
|
|
||||||
semantic = semver.Version(
|
|
||||||
major=int(v[0:4]),
|
|
||||||
minor=int(v[4:6]),
|
|
||||||
patch=int(v[6:8]),
|
|
||||||
)
|
|
||||||
except ValueError:
|
|
||||||
return BTMinerV2
|
|
||||||
if semantic > semver.Version(major=2024, minor=11, patch=0):
|
|
||||||
return BTMinerV3
|
|
||||||
return BTMinerV2
|
|
||||||
|
|
||||||
inject = get_new(version)
|
|
||||||
|
|
||||||
bases = (inject,) + bases
|
|
||||||
|
|
||||||
cls = type(cls.__name__, bases, {})(ip=ip, version=version)
|
|
||||||
return cls
|
|
||||||
|
|
||||||
|
|
||||||
BTMINER_DATA_LOC = DataLocations(
|
BTMINER_DATA_LOC = DataLocations(
|
||||||
**{
|
**{
|
||||||
@@ -148,7 +119,7 @@ BTMINER_DATA_LOC = DataLocations(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class BTMinerV2(StockFirmware):
|
class BTMiner(StockFirmware):
|
||||||
"""Base handler for BTMiner based miners."""
|
"""Base handler for BTMiner based miners."""
|
||||||
|
|
||||||
_rpc_cls = BTMinerRPCAPI
|
_rpc_cls = BTMinerRPCAPI
|
||||||
@@ -323,7 +294,7 @@ class BTMinerV2(StockFirmware):
|
|||||||
|
|
||||||
async def _get_mac(
|
async def _get_mac(
|
||||||
self, rpc_summary: dict = None, rpc_get_miner_info: dict = None
|
self, rpc_summary: dict = None, rpc_get_miner_info: dict = None
|
||||||
) -> str | None:
|
) -> Optional[str]:
|
||||||
if rpc_get_miner_info is None:
|
if rpc_get_miner_info is None:
|
||||||
try:
|
try:
|
||||||
rpc_get_miner_info = await self.rpc.get_miner_info()
|
rpc_get_miner_info = await self.rpc.get_miner_info()
|
||||||
@@ -350,7 +321,7 @@ class BTMinerV2(StockFirmware):
|
|||||||
except LookupError:
|
except LookupError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_api_ver(self, rpc_get_version: dict = None) -> str | None:
|
async def _get_api_ver(self, rpc_get_version: dict = None) -> Optional[str]:
|
||||||
if rpc_get_version is None:
|
if rpc_get_version is None:
|
||||||
try:
|
try:
|
||||||
rpc_get_version = await self.rpc.get_version()
|
rpc_get_version = await self.rpc.get_version()
|
||||||
@@ -375,7 +346,7 @@ class BTMinerV2(StockFirmware):
|
|||||||
|
|
||||||
async def _get_fw_ver(
|
async def _get_fw_ver(
|
||||||
self, rpc_get_version: dict = None, rpc_summary: dict = None
|
self, rpc_get_version: dict = None, rpc_summary: dict = None
|
||||||
) -> str | None:
|
) -> Optional[str]:
|
||||||
if rpc_get_version is None:
|
if rpc_get_version is None:
|
||||||
try:
|
try:
|
||||||
rpc_get_version = await self.rpc.get_version()
|
rpc_get_version = await self.rpc.get_version()
|
||||||
@@ -408,7 +379,7 @@ class BTMinerV2(StockFirmware):
|
|||||||
|
|
||||||
return self.fw_ver
|
return self.fw_ver
|
||||||
|
|
||||||
async def _get_hostname(self, rpc_get_miner_info: dict = None) -> str | None:
|
async def _get_hostname(self, rpc_get_miner_info: dict = None) -> Optional[str]:
|
||||||
hostname = None
|
hostname = None
|
||||||
if rpc_get_miner_info is None:
|
if rpc_get_miner_info is None:
|
||||||
try:
|
try:
|
||||||
@@ -424,7 +395,7 @@ class BTMinerV2(StockFirmware):
|
|||||||
|
|
||||||
return hostname
|
return hostname
|
||||||
|
|
||||||
async def _get_hashrate(self, rpc_summary: dict = None) -> AlgoHashRate | None:
|
async def _get_hashrate(self, rpc_summary: dict = None) -> Optional[AlgoHashRate]:
|
||||||
if rpc_summary is None:
|
if rpc_summary is None:
|
||||||
try:
|
try:
|
||||||
rpc_summary = await self.rpc.summary()
|
rpc_summary = await self.rpc.summary()
|
||||||
@@ -439,12 +410,8 @@ class BTMinerV2(StockFirmware):
|
|||||||
).into(self.algo.unit.default)
|
).into(self.algo.unit.default)
|
||||||
except LookupError:
|
except LookupError:
|
||||||
pass
|
pass
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_hashboards(self, rpc_devs: dict = None) -> list[HashBoard]:
|
|
||||||
if self.expected_hashboards is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
|
async def _get_hashboards(self, rpc_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)
|
||||||
@@ -480,7 +447,7 @@ class BTMinerV2(StockFirmware):
|
|||||||
|
|
||||||
return hashboards
|
return hashboards
|
||||||
|
|
||||||
async def _get_env_temp(self, rpc_summary: dict = None) -> float | None:
|
async def _get_env_temp(self, rpc_summary: dict = None) -> Optional[float]:
|
||||||
if rpc_summary is None:
|
if rpc_summary is None:
|
||||||
try:
|
try:
|
||||||
rpc_summary = await self.rpc.summary()
|
rpc_summary = await self.rpc.summary()
|
||||||
@@ -492,9 +459,8 @@ class BTMinerV2(StockFirmware):
|
|||||||
return rpc_summary["SUMMARY"][0]["Env Temp"]
|
return rpc_summary["SUMMARY"][0]["Env Temp"]
|
||||||
except LookupError:
|
except LookupError:
|
||||||
pass
|
pass
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_wattage(self, rpc_summary: dict = None) -> int | None:
|
async def _get_wattage(self, rpc_summary: dict = None) -> Optional[int]:
|
||||||
if rpc_summary is None:
|
if rpc_summary is None:
|
||||||
try:
|
try:
|
||||||
rpc_summary = await self.rpc.summary()
|
rpc_summary = await self.rpc.summary()
|
||||||
@@ -507,9 +473,8 @@ class BTMinerV2(StockFirmware):
|
|||||||
return wattage if not wattage == -1 else None
|
return wattage if not wattage == -1 else None
|
||||||
except LookupError:
|
except LookupError:
|
||||||
pass
|
pass
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_wattage_limit(self, rpc_summary: dict = None) -> int | None:
|
async def _get_wattage_limit(self, rpc_summary: dict = None) -> Optional[int]:
|
||||||
if rpc_summary is None:
|
if rpc_summary is None:
|
||||||
try:
|
try:
|
||||||
rpc_summary = await self.rpc.summary()
|
rpc_summary = await self.rpc.summary()
|
||||||
@@ -521,14 +486,10 @@ class BTMinerV2(StockFirmware):
|
|||||||
return rpc_summary["SUMMARY"][0]["Power Limit"]
|
return rpc_summary["SUMMARY"][0]["Power Limit"]
|
||||||
except LookupError:
|
except LookupError:
|
||||||
pass
|
pass
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_fans(
|
async def _get_fans(
|
||||||
self, rpc_summary: dict = None, rpc_get_psu: dict = None
|
self, rpc_summary: dict = None, rpc_get_psu: dict = None
|
||||||
) -> list[Fan]:
|
) -> List[Fan]:
|
||||||
if self.expected_fans is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
if rpc_summary is None:
|
if rpc_summary is None:
|
||||||
try:
|
try:
|
||||||
rpc_summary = await self.rpc.summary()
|
rpc_summary = await self.rpc.summary()
|
||||||
@@ -550,7 +511,7 @@ class BTMinerV2(StockFirmware):
|
|||||||
|
|
||||||
async def _get_fan_psu(
|
async def _get_fan_psu(
|
||||||
self, rpc_summary: dict = None, rpc_get_psu: dict = None
|
self, rpc_summary: dict = None, rpc_get_psu: dict = None
|
||||||
) -> int | None:
|
) -> Optional[int]:
|
||||||
if rpc_summary is None:
|
if rpc_summary is None:
|
||||||
try:
|
try:
|
||||||
rpc_summary = await self.rpc.summary()
|
rpc_summary = await self.rpc.summary()
|
||||||
@@ -574,11 +535,10 @@ class BTMinerV2(StockFirmware):
|
|||||||
return int(rpc_get_psu["Msg"]["fan_speed"])
|
return int(rpc_get_psu["Msg"]["fan_speed"])
|
||||||
except (KeyError, TypeError):
|
except (KeyError, TypeError):
|
||||||
pass
|
pass
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_errors(
|
async def _get_errors(
|
||||||
self, rpc_summary: dict = None, rpc_get_error_code: dict = None
|
self, rpc_summary: dict = None, rpc_get_error_code: dict = None
|
||||||
) -> list[MinerErrorData]:
|
) -> List[MinerErrorData]:
|
||||||
errors = []
|
errors = []
|
||||||
if rpc_get_error_code is None and rpc_summary is None:
|
if rpc_get_error_code is None and rpc_summary is None:
|
||||||
try:
|
try:
|
||||||
@@ -615,7 +575,7 @@ class BTMinerV2(StockFirmware):
|
|||||||
|
|
||||||
async def _get_expected_hashrate(
|
async def _get_expected_hashrate(
|
||||||
self, rpc_summary: dict = None
|
self, rpc_summary: dict = None
|
||||||
) -> AlgoHashRate | None:
|
) -> Optional[AlgoHashRate]:
|
||||||
if rpc_summary is None:
|
if rpc_summary is None:
|
||||||
try:
|
try:
|
||||||
rpc_summary = await self.rpc.summary()
|
rpc_summary = await self.rpc.summary()
|
||||||
@@ -632,9 +592,8 @@ class BTMinerV2(StockFirmware):
|
|||||||
|
|
||||||
except LookupError:
|
except LookupError:
|
||||||
pass
|
pass
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_fault_light(self, rpc_get_miner_info: dict = None) -> bool | None:
|
async def _get_fault_light(self, rpc_get_miner_info: dict = None) -> Optional[bool]:
|
||||||
if rpc_get_miner_info is None:
|
if rpc_get_miner_info is None:
|
||||||
try:
|
try:
|
||||||
rpc_get_miner_info = await self.rpc.get_miner_info()
|
rpc_get_miner_info = await self.rpc.get_miner_info()
|
||||||
@@ -672,7 +631,7 @@ class BTMinerV2(StockFirmware):
|
|||||||
async def set_hostname(self, hostname: str):
|
async def set_hostname(self, hostname: str):
|
||||||
await self.rpc.set_hostname(hostname)
|
await self.rpc.set_hostname(hostname)
|
||||||
|
|
||||||
async def _is_mining(self, rpc_status: dict = None) -> bool | None:
|
async def _is_mining(self, rpc_status: dict = None) -> Optional[bool]:
|
||||||
if rpc_status is None:
|
if rpc_status is None:
|
||||||
try:
|
try:
|
||||||
rpc_status = await self.rpc.status()
|
rpc_status = await self.rpc.status()
|
||||||
@@ -690,9 +649,8 @@ class BTMinerV2(StockFirmware):
|
|||||||
return True if rpc_status["Msg"]["mineroff"] == "false" else False
|
return True if rpc_status["Msg"]["mineroff"] == "false" else False
|
||||||
except LookupError:
|
except LookupError:
|
||||||
pass
|
pass
|
||||||
return False
|
|
||||||
|
|
||||||
async def _get_uptime(self, rpc_summary: dict = None) -> int | None:
|
async def _get_uptime(self, rpc_summary: dict = None) -> Optional[int]:
|
||||||
if rpc_summary is None:
|
if rpc_summary is None:
|
||||||
try:
|
try:
|
||||||
rpc_summary = await self.rpc.summary()
|
rpc_summary = await self.rpc.summary()
|
||||||
@@ -705,7 +663,7 @@ class BTMinerV2(StockFirmware):
|
|||||||
except LookupError:
|
except LookupError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_pools(self, rpc_pools: dict = None) -> list[PoolMetrics]:
|
async def _get_pools(self, rpc_pools: dict = None) -> List[PoolMetrics]:
|
||||||
if rpc_pools is None:
|
if rpc_pools is None:
|
||||||
try:
|
try:
|
||||||
rpc_pools = await self.rpc.pools()
|
rpc_pools = await self.rpc.pools()
|
||||||
@@ -778,414 +736,3 @@ class BTMinerV2(StockFirmware):
|
|||||||
exc_info=True,
|
exc_info=True,
|
||||||
)
|
)
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
|
||||||
BTMINERV3_DATA_LOC = DataLocations(
|
|
||||||
**{
|
|
||||||
str(DataOptions.MAC): DataFunction(
|
|
||||||
"_get_mac", [RPCAPICommand("rpc_get_device_info", "get.device.info")]
|
|
||||||
),
|
|
||||||
str(DataOptions.API_VERSION): DataFunction(
|
|
||||||
"_get_api_version",
|
|
||||||
[RPCAPICommand("rpc_get_device_info", "get.device.info")],
|
|
||||||
),
|
|
||||||
str(DataOptions.FW_VERSION): DataFunction(
|
|
||||||
"_get_firmware_version",
|
|
||||||
[RPCAPICommand("rpc_get_device_info", "get.device.info")],
|
|
||||||
),
|
|
||||||
str(DataOptions.HOSTNAME): DataFunction(
|
|
||||||
"_get_hostname", [RPCAPICommand("rpc_get_device_info", "get.device.info")]
|
|
||||||
),
|
|
||||||
str(DataOptions.FAULT_LIGHT): DataFunction(
|
|
||||||
"_get_light_flashing",
|
|
||||||
[RPCAPICommand("rpc_get_device_info", "get.device.info")],
|
|
||||||
),
|
|
||||||
str(DataOptions.WATTAGE_LIMIT): DataFunction(
|
|
||||||
"_get_wattage_limit",
|
|
||||||
[RPCAPICommand("rpc_get_device_info", "get.device.info")],
|
|
||||||
),
|
|
||||||
str(DataOptions.FANS): DataFunction(
|
|
||||||
"_get_fans",
|
|
||||||
[RPCAPICommand("rpc_get_miner_status_summary", "get.miner.status:summary")],
|
|
||||||
),
|
|
||||||
str(DataOptions.FAN_PSU): DataFunction(
|
|
||||||
"_get_psu_fans", [RPCAPICommand("rpc_get_device_info", "get.device.info")]
|
|
||||||
),
|
|
||||||
str(DataOptions.HASHBOARDS): DataFunction(
|
|
||||||
"_get_hashboards",
|
|
||||||
[
|
|
||||||
RPCAPICommand("rpc_get_device_info", "get.device.info"),
|
|
||||||
RPCAPICommand(
|
|
||||||
"rpc_get_miner_status_edevs",
|
|
||||||
"get.miner.status:edevs",
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
str(DataOptions.POOLS): DataFunction(
|
|
||||||
"_get_pools",
|
|
||||||
[RPCAPICommand("rpc_get_miner_status_summary", "get.miner.status:summary")],
|
|
||||||
),
|
|
||||||
str(DataOptions.UPTIME): DataFunction(
|
|
||||||
"_get_uptime",
|
|
||||||
[RPCAPICommand("rpc_get_miner_status_summary", "get.miner.status:summary")],
|
|
||||||
),
|
|
||||||
str(DataOptions.WATTAGE): DataFunction(
|
|
||||||
"_get_wattage",
|
|
||||||
[RPCAPICommand("rpc_get_miner_status_summary", "get.miner.status:summary")],
|
|
||||||
),
|
|
||||||
str(DataOptions.HASHRATE): DataFunction(
|
|
||||||
"_get_hashrate",
|
|
||||||
[RPCAPICommand("rpc_get_miner_status_summary", "get.miner.status:summary")],
|
|
||||||
),
|
|
||||||
str(DataOptions.EXPECTED_HASHRATE): DataFunction(
|
|
||||||
"_get_expected_hashrate",
|
|
||||||
[RPCAPICommand("rpc_get_miner_status_summary", "get.miner.status:summary")],
|
|
||||||
),
|
|
||||||
str(DataOptions.ENVIRONMENT_TEMP): DataFunction(
|
|
||||||
"_get_env_temp",
|
|
||||||
[RPCAPICommand("rpc_get_miner_status_summary", "get.miner.status:summary")],
|
|
||||||
),
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class BTMinerV3(StockFirmware):
|
|
||||||
_rpc_cls = BTMinerV3RPCAPI
|
|
||||||
rpc: BTMinerV3RPCAPI
|
|
||||||
|
|
||||||
data_locations = BTMINERV3_DATA_LOC
|
|
||||||
|
|
||||||
supports_shutdown = True
|
|
||||||
supports_autotuning = True
|
|
||||||
supports_power_modes = True
|
|
||||||
|
|
||||||
async def get_config(self) -> MinerConfig:
|
|
||||||
pools = None
|
|
||||||
settings = None
|
|
||||||
device_info = None
|
|
||||||
try:
|
|
||||||
pools = await self.rpc.get_miner_status_pools()
|
|
||||||
settings = await self.rpc.get_miner_setting()
|
|
||||||
device_info = await self.rpc.get_device_info()
|
|
||||||
except APIError as e:
|
|
||||||
logging.warning(e)
|
|
||||||
except LookupError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
self.config = MinerConfig.from_btminer_v3(
|
|
||||||
rpc_pools=pools, rpc_settings=settings, rpc_device_info=device_info
|
|
||||||
)
|
|
||||||
|
|
||||||
return self.config
|
|
||||||
|
|
||||||
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
|
|
||||||
self.config = config
|
|
||||||
|
|
||||||
conf = config.as_btminer_v3(user_suffix=user_suffix)
|
|
||||||
|
|
||||||
await asyncio.gather(
|
|
||||||
*[self.rpc.send_command(k, parameters=v) for k, v in conf.values()]
|
|
||||||
)
|
|
||||||
|
|
||||||
async def fault_light_off(self) -> bool:
|
|
||||||
try:
|
|
||||||
data = await self.rpc.set_system_led()
|
|
||||||
except APIError:
|
|
||||||
return False
|
|
||||||
if data:
|
|
||||||
if "code" in data.keys():
|
|
||||||
if data["code"] == 0:
|
|
||||||
self.light = False
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def fault_light_on(self) -> bool:
|
|
||||||
try:
|
|
||||||
data = await self.rpc.set_system_led(
|
|
||||||
leds=[
|
|
||||||
{
|
|
||||||
{"color": "red", "period": 60, "duration": 20, "start": 0},
|
|
||||||
}
|
|
||||||
],
|
|
||||||
)
|
|
||||||
except APIError:
|
|
||||||
return False
|
|
||||||
if data:
|
|
||||||
if "code" in data.keys():
|
|
||||||
if data["code"] == 0:
|
|
||||||
self.light = True
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def reboot(self) -> bool:
|
|
||||||
try:
|
|
||||||
data = await self.rpc.set_system_reboot()
|
|
||||||
except APIError:
|
|
||||||
return False
|
|
||||||
if data.get("msg"):
|
|
||||||
if data["msg"] == "ok":
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def restart_backend(self) -> bool:
|
|
||||||
try:
|
|
||||||
data = await self.rpc.set_miner_service("restart")
|
|
||||||
except APIError:
|
|
||||||
return False
|
|
||||||
if data.get("msg"):
|
|
||||||
if data["msg"] == "ok":
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def stop_mining(self) -> bool:
|
|
||||||
try:
|
|
||||||
data = await self.rpc.set_miner_service("stop")
|
|
||||||
except APIError:
|
|
||||||
return False
|
|
||||||
if data.get("msg"):
|
|
||||||
if data["msg"] == "ok":
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def resume_mining(self) -> bool:
|
|
||||||
try:
|
|
||||||
data = await self.rpc.set_miner_service("start")
|
|
||||||
except APIError:
|
|
||||||
return False
|
|
||||||
if data.get("msg"):
|
|
||||||
if data["msg"] == "ok":
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def set_power_limit(self, wattage: int) -> bool:
|
|
||||||
try:
|
|
||||||
await self.rpc.set_miner_power_limit(wattage)
|
|
||||||
except Exception as e:
|
|
||||||
logging.warning(f"{self} set_power_limit: {e}")
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
return True
|
|
||||||
|
|
||||||
async def _get_mac(self, rpc_get_device_info: dict = None) -> str | None:
|
|
||||||
if rpc_get_device_info is None:
|
|
||||||
try:
|
|
||||||
rpc_get_device_info = await self.rpc.get_device_info()
|
|
||||||
except APIError:
|
|
||||||
return None
|
|
||||||
return rpc_get_device_info.get("msg", {}).get("network", {}).get("mac")
|
|
||||||
|
|
||||||
async def _get_api_version(self, rpc_get_device_info: dict = None) -> str | None:
|
|
||||||
if rpc_get_device_info is None:
|
|
||||||
try:
|
|
||||||
rpc_get_device_info = await self.rpc.get_device_info()
|
|
||||||
except APIError:
|
|
||||||
return None
|
|
||||||
return rpc_get_device_info.get("msg", {}).get("system", {}).get("api")
|
|
||||||
|
|
||||||
async def _get_firmware_version(
|
|
||||||
self, rpc_get_device_info: dict = None
|
|
||||||
) -> str | None:
|
|
||||||
if rpc_get_device_info is None:
|
|
||||||
try:
|
|
||||||
rpc_get_device_info = await self.rpc.get_device_info()
|
|
||||||
except APIError:
|
|
||||||
return None
|
|
||||||
return rpc_get_device_info.get("msg", {}).get("system", {}).get("fwversion")
|
|
||||||
|
|
||||||
async def _get_hostname(self, rpc_get_device_info: dict = None) -> str | None:
|
|
||||||
if rpc_get_device_info is None:
|
|
||||||
try:
|
|
||||||
rpc_get_device_info = await self.rpc.get_device_info()
|
|
||||||
except APIError:
|
|
||||||
return None
|
|
||||||
return rpc_get_device_info.get("msg", {}).get("network", {}).get("hostname")
|
|
||||||
|
|
||||||
async def _get_light_flashing(
|
|
||||||
self, rpc_get_device_info: dict = None
|
|
||||||
) -> bool | None:
|
|
||||||
if rpc_get_device_info is None:
|
|
||||||
try:
|
|
||||||
rpc_get_device_info = await self.rpc.get_device_info()
|
|
||||||
except APIError:
|
|
||||||
return None
|
|
||||||
val = rpc_get_device_info.get("msg", {}).get("system", {}).get("ledstatus")
|
|
||||||
if isinstance(val, str):
|
|
||||||
return val != "auto"
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_wattage_limit(
|
|
||||||
self, rpc_get_device_info: dict = None
|
|
||||||
) -> float | None:
|
|
||||||
if rpc_get_device_info is None:
|
|
||||||
try:
|
|
||||||
rpc_get_device_info = await self.rpc.get_device_info()
|
|
||||||
except APIError:
|
|
||||||
return None
|
|
||||||
val = rpc_get_device_info.get("msg", {}).get("miner", {}).get("power-limit-set")
|
|
||||||
try:
|
|
||||||
return float(val)
|
|
||||||
except (ValueError, TypeError):
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def _get_fans(self, rpc_get_miner_status_summary: dict = None) -> list[Fan]:
|
|
||||||
if rpc_get_miner_status_summary is None:
|
|
||||||
try:
|
|
||||||
rpc_get_miner_status_summary = await self.rpc.get_miner_status_summary()
|
|
||||||
except APIError:
|
|
||||||
return []
|
|
||||||
fans = []
|
|
||||||
summary = rpc_get_miner_status_summary.get("msg", {}).get("summary", {})
|
|
||||||
for idx, direction in enumerate(["in", "out"]):
|
|
||||||
rpm = summary.get(f"fan-speed-{direction}")
|
|
||||||
if rpm is not None:
|
|
||||||
fans.append(Fan(speed=rpm))
|
|
||||||
return fans
|
|
||||||
|
|
||||||
async def _get_psu_fans(self, rpc_get_device_info: dict = None) -> list[Fan]:
|
|
||||||
if rpc_get_device_info is None:
|
|
||||||
try:
|
|
||||||
rpc_get_device_info = await self.rpc.get_device_info()
|
|
||||||
except APIError:
|
|
||||||
return []
|
|
||||||
rpm = rpc_get_device_info.get("msg", {}).get("power", {}).get("fanspeed")
|
|
||||||
return [Fan(speed=rpm)] if rpm is not None else []
|
|
||||||
|
|
||||||
async def _get_hashboards(
|
|
||||||
self,
|
|
||||||
rpc_get_device_info: dict = None,
|
|
||||||
rpc_get_miner_status_edevs: dict = None,
|
|
||||||
) -> list[HashBoard]:
|
|
||||||
if rpc_get_device_info is None:
|
|
||||||
try:
|
|
||||||
rpc_get_device_info = await self.rpc.get_device_info()
|
|
||||||
except APIError:
|
|
||||||
return []
|
|
||||||
if rpc_get_miner_status_edevs is None:
|
|
||||||
try:
|
|
||||||
rpc_get_miner_status_edevs = await self.rpc.get_miner_status_edevs()
|
|
||||||
except APIError:
|
|
||||||
return []
|
|
||||||
|
|
||||||
boards = []
|
|
||||||
board_count = (
|
|
||||||
rpc_get_device_info.get("msg", {}).get("hardware", {}).get("boards", 3)
|
|
||||||
)
|
|
||||||
edevs = rpc_get_miner_status_edevs.get("msg", {}).get("edevs", [])
|
|
||||||
for idx in range(board_count):
|
|
||||||
board_data = edevs[idx] if idx < len(edevs) else {}
|
|
||||||
boards.append(
|
|
||||||
HashBoard(
|
|
||||||
slot=idx,
|
|
||||||
hashrate=self.algo.hashrate(
|
|
||||||
rate=board_data.get("hash-average", 0), unit=self.algo.unit.TH
|
|
||||||
).into(self.algo.unit.default),
|
|
||||||
temp=board_data.get("chip-temp-min"),
|
|
||||||
inlet_temp=board_data.get("chip-temp-min"),
|
|
||||||
outlet_temp=board_data.get("chip-temp-max"),
|
|
||||||
serial_number=rpc_get_device_info.get("msg", {})
|
|
||||||
.get("miner", {})
|
|
||||||
.get(f"pcbsn{idx}"),
|
|
||||||
chips=board_data.get("effective-chips"),
|
|
||||||
expected_chips=self.expected_chips,
|
|
||||||
active=(board_data.get("hash-average") or 0) > 0,
|
|
||||||
missing=False,
|
|
||||||
tuned=True,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
return boards
|
|
||||||
|
|
||||||
async def _get_pools(
|
|
||||||
self, rpc_get_miner_status_summary: dict = None
|
|
||||||
) -> list[PoolMetrics]:
|
|
||||||
if rpc_get_miner_status_summary is None:
|
|
||||||
try:
|
|
||||||
rpc_get_miner_status_summary = await self.rpc.get_miner_status_summary()
|
|
||||||
except APIError:
|
|
||||||
return []
|
|
||||||
pools = []
|
|
||||||
msg_pools = rpc_get_miner_status_summary.get("msg", {}).get("pools", [])
|
|
||||||
for idx, pool in enumerate(msg_pools):
|
|
||||||
pools.append(
|
|
||||||
PoolMetrics(
|
|
||||||
index=idx,
|
|
||||||
user=pool.get("account"),
|
|
||||||
alive=pool.get("status") == "alive",
|
|
||||||
active=pool.get("stratum-active"),
|
|
||||||
url=pool.get("url"),
|
|
||||||
)
|
|
||||||
)
|
|
||||||
return pools
|
|
||||||
|
|
||||||
async def _get_uptime(
|
|
||||||
self, rpc_get_miner_status_summary: dict = None
|
|
||||||
) -> int | None:
|
|
||||||
if rpc_get_miner_status_summary is None:
|
|
||||||
try:
|
|
||||||
rpc_get_miner_status_summary = await self.rpc.get_miner_status_summary()
|
|
||||||
except APIError:
|
|
||||||
return None
|
|
||||||
return (
|
|
||||||
rpc_get_miner_status_summary.get("msg", {})
|
|
||||||
.get("summary", {})
|
|
||||||
.get("elapsed")
|
|
||||||
)
|
|
||||||
|
|
||||||
async def _get_wattage(
|
|
||||||
self, rpc_get_miner_status_summary: dict = None
|
|
||||||
) -> float | None:
|
|
||||||
if rpc_get_miner_status_summary is None:
|
|
||||||
try:
|
|
||||||
rpc_get_miner_status_summary = await self.rpc.get_miner_status_summary()
|
|
||||||
except APIError:
|
|
||||||
return None
|
|
||||||
return (
|
|
||||||
rpc_get_miner_status_summary.get("msg", {})
|
|
||||||
.get("summary", {})
|
|
||||||
.get("power-realtime")
|
|
||||||
)
|
|
||||||
|
|
||||||
async def _get_hashrate(
|
|
||||||
self, rpc_get_miner_status_summary: dict = None
|
|
||||||
) -> float | None:
|
|
||||||
if rpc_get_miner_status_summary is None:
|
|
||||||
try:
|
|
||||||
rpc_get_miner_status_summary = await self.rpc.get_miner_status_summary()
|
|
||||||
except APIError:
|
|
||||||
return None
|
|
||||||
return (
|
|
||||||
rpc_get_miner_status_summary.get("msg", {})
|
|
||||||
.get("summary", {})
|
|
||||||
.get("hash-realtime")
|
|
||||||
)
|
|
||||||
|
|
||||||
async def _get_expected_hashrate(
|
|
||||||
self, rpc_get_miner_status_summary: dict = None
|
|
||||||
) -> float | None:
|
|
||||||
if rpc_get_miner_status_summary is None:
|
|
||||||
try:
|
|
||||||
rpc_get_miner_status_summary = await self.rpc.get_miner_status_summary()
|
|
||||||
except APIError:
|
|
||||||
return None
|
|
||||||
res = (
|
|
||||||
rpc_get_miner_status_summary.get("msg", {})
|
|
||||||
.get("summary", {})
|
|
||||||
.get("factory-hash")
|
|
||||||
)
|
|
||||||
|
|
||||||
if res == (-0.001 * self.expected_hashboards):
|
|
||||||
return None
|
|
||||||
return res
|
|
||||||
|
|
||||||
async def _get_env_temp(
|
|
||||||
self, rpc_get_miner_status_summary: dict = None
|
|
||||||
) -> float | None:
|
|
||||||
if rpc_get_miner_status_summary is None:
|
|
||||||
try:
|
|
||||||
rpc_get_miner_status_summary = await self.rpc.get_miner_status_summary()
|
|
||||||
except APIError:
|
|
||||||
return None
|
|
||||||
return (
|
|
||||||
rpc_get_miner_status_summary.get("msg", {})
|
|
||||||
.get("summary", {})
|
|
||||||
.get("environment-temperature")
|
|
||||||
)
|
|
||||||
|
|||||||
@@ -1,380 +0,0 @@
|
|||||||
# ------------------------------------------------------------------------------
|
|
||||||
# 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 typing import List, Optional
|
|
||||||
|
|
||||||
from pyasic import APIError, MinerConfig
|
|
||||||
from pyasic.data import Fan, HashBoard, X19Error
|
|
||||||
from pyasic.data.error_codes import MinerErrorData
|
|
||||||
from pyasic.data.pools import PoolMetrics, PoolUrl
|
|
||||||
from pyasic.device.algorithm import AlgoHashRate
|
|
||||||
from pyasic.miners.data import (
|
|
||||||
DataFunction,
|
|
||||||
DataLocations,
|
|
||||||
DataOptions,
|
|
||||||
WebAPICommand,
|
|
||||||
)
|
|
||||||
from pyasic.miners.device.firmware import StockFirmware
|
|
||||||
from pyasic.web.elphapex import ElphapexWebAPI
|
|
||||||
|
|
||||||
ELPHAPEX_DATA_LOC = DataLocations(
|
|
||||||
**{
|
|
||||||
str(DataOptions.MAC): DataFunction(
|
|
||||||
"_get_mac",
|
|
||||||
[WebAPICommand("web_get_system_info", "get_system_info")],
|
|
||||||
),
|
|
||||||
str(DataOptions.API_VERSION): DataFunction(
|
|
||||||
"_get_api_ver",
|
|
||||||
[WebAPICommand("web_summary", "summary")],
|
|
||||||
),
|
|
||||||
str(DataOptions.FW_VERSION): DataFunction(
|
|
||||||
"_get_fw_ver",
|
|
||||||
[WebAPICommand("web_get_system_info", "get_system_info")],
|
|
||||||
),
|
|
||||||
str(DataOptions.HOSTNAME): DataFunction(
|
|
||||||
"_get_hostname",
|
|
||||||
[WebAPICommand("web_get_system_info", "get_system_info")],
|
|
||||||
),
|
|
||||||
str(DataOptions.HASHBOARDS): DataFunction(
|
|
||||||
"_get_hashboards",
|
|
||||||
[WebAPICommand("web_stats", "stats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.EXPECTED_HASHRATE): DataFunction(
|
|
||||||
"_get_expected_hashrate",
|
|
||||||
[WebAPICommand("web_stats", "stats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.FANS): DataFunction(
|
|
||||||
"_get_fans",
|
|
||||||
[WebAPICommand("web_stats", "stats")],
|
|
||||||
),
|
|
||||||
str(DataOptions.ERRORS): DataFunction(
|
|
||||||
"_get_errors",
|
|
||||||
[WebAPICommand("web_summary", "summary")],
|
|
||||||
),
|
|
||||||
str(DataOptions.FAULT_LIGHT): DataFunction(
|
|
||||||
"_get_fault_light",
|
|
||||||
[WebAPICommand("web_get_blink_status", "get_blink_status")],
|
|
||||||
),
|
|
||||||
str(DataOptions.IS_MINING): DataFunction(
|
|
||||||
"_is_mining",
|
|
||||||
[WebAPICommand("web_get_miner_conf", "get_miner_conf")],
|
|
||||||
),
|
|
||||||
str(DataOptions.UPTIME): DataFunction(
|
|
||||||
"_get_uptime",
|
|
||||||
[WebAPICommand("web_summary", "summary")],
|
|
||||||
),
|
|
||||||
str(DataOptions.POOLS): DataFunction(
|
|
||||||
"_get_pools",
|
|
||||||
[WebAPICommand("web_pools", "pools")],
|
|
||||||
),
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class ElphapexMiner(StockFirmware):
|
|
||||||
"""Handler for Elphapex miners."""
|
|
||||||
|
|
||||||
_web_cls = ElphapexWebAPI
|
|
||||||
web: ElphapexWebAPI
|
|
||||||
|
|
||||||
data_locations = ELPHAPEX_DATA_LOC
|
|
||||||
|
|
||||||
async def get_config(self) -> MinerConfig:
|
|
||||||
data = await self.web.get_miner_conf()
|
|
||||||
if data:
|
|
||||||
self.config = MinerConfig.from_elphapex(data)
|
|
||||||
return self.config
|
|
||||||
|
|
||||||
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
|
|
||||||
self.config = config
|
|
||||||
await self.web.set_miner_conf(config.as_elphapex(user_suffix=user_suffix))
|
|
||||||
|
|
||||||
async def fault_light_on(self) -> bool:
|
|
||||||
data = await self.web.blink(blink=True)
|
|
||||||
if data:
|
|
||||||
if data.get("code") == "B000":
|
|
||||||
self.light = True
|
|
||||||
return self.light
|
|
||||||
|
|
||||||
async def fault_light_off(self) -> bool:
|
|
||||||
data = await self.web.blink(blink=False)
|
|
||||||
if data:
|
|
||||||
if data.get("code") == "B100":
|
|
||||||
self.light = False
|
|
||||||
return self.light
|
|
||||||
|
|
||||||
async def reboot(self) -> bool:
|
|
||||||
data = await self.web.reboot()
|
|
||||||
if data:
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def _get_api_ver(self, web_summary: dict = None) -> Optional[str]:
|
|
||||||
if web_summary is None:
|
|
||||||
try:
|
|
||||||
web_summary = await self.web.summary()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if web_summary is not None:
|
|
||||||
try:
|
|
||||||
self.api_ver = web_summary["STATUS"]["api_version"]
|
|
||||||
except LookupError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
return self.api_ver
|
|
||||||
|
|
||||||
async def _get_fw_ver(self, web_get_system_info: dict = None) -> Optional[str]:
|
|
||||||
if web_get_system_info is None:
|
|
||||||
try:
|
|
||||||
web_get_system_info = await self.web.get_system_info()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if web_get_system_info is not None:
|
|
||||||
try:
|
|
||||||
self.fw_ver = (
|
|
||||||
web_get_system_info["system_filesystem_version"]
|
|
||||||
.upper()
|
|
||||||
.split("V")[-1]
|
|
||||||
)
|
|
||||||
except LookupError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
return self.fw_ver
|
|
||||||
|
|
||||||
async def _get_hostname(self, web_get_system_info: dict = None) -> Optional[str]:
|
|
||||||
if web_get_system_info is None:
|
|
||||||
try:
|
|
||||||
web_get_system_info = await self.web.get_system_info()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if web_get_system_info is not None:
|
|
||||||
try:
|
|
||||||
return web_get_system_info["hostname"]
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_mac(self, web_get_system_info: dict = None) -> Optional[str]:
|
|
||||||
if web_get_system_info is None:
|
|
||||||
try:
|
|
||||||
web_get_system_info = await self.web.get_system_info()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if web_get_system_info is not None:
|
|
||||||
try:
|
|
||||||
return web_get_system_info["macaddr"]
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
try:
|
|
||||||
data = await self.web.get_network_info()
|
|
||||||
if data:
|
|
||||||
return data["macaddr"]
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_errors(self, web_summary: dict = None) -> List[MinerErrorData]:
|
|
||||||
if web_summary is None:
|
|
||||||
try:
|
|
||||||
web_summary = await self.web.summary()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
errors = []
|
|
||||||
if web_summary is not None:
|
|
||||||
try:
|
|
||||||
for item in web_summary["SUMMARY"][0]["status"]:
|
|
||||||
try:
|
|
||||||
if not item["status"] == "s":
|
|
||||||
errors.append(X19Error(error_message=item["msg"]))
|
|
||||||
except KeyError:
|
|
||||||
continue
|
|
||||||
except LookupError:
|
|
||||||
pass
|
|
||||||
return errors
|
|
||||||
|
|
||||||
async def _get_hashboards(self, web_stats: dict | None = None) -> List[HashBoard]:
|
|
||||||
if self.expected_hashboards is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
hashboards = [
|
|
||||||
HashBoard(slot=idx, expected_chips=self.expected_chips)
|
|
||||||
for idx in range(self.expected_hashboards)
|
|
||||||
]
|
|
||||||
|
|
||||||
if web_stats is None:
|
|
||||||
try:
|
|
||||||
web_stats = await self.web.stats()
|
|
||||||
except APIError:
|
|
||||||
return hashboards
|
|
||||||
|
|
||||||
if web_stats is not None:
|
|
||||||
try:
|
|
||||||
for board in web_stats["STATS"][0]["chain"]:
|
|
||||||
hashboards[board["index"]].hashrate = self.algo.hashrate(
|
|
||||||
rate=board["rate_real"], unit=self.algo.unit.MH
|
|
||||||
).into(self.algo.unit.default)
|
|
||||||
hashboards[board["index"]].chips = board["asic_num"]
|
|
||||||
board_temp_data = list(
|
|
||||||
filter(lambda x: not x == 0, board["temp_pcb"])
|
|
||||||
)
|
|
||||||
hashboards[board["index"]].temp = sum(board_temp_data) / len(
|
|
||||||
board_temp_data
|
|
||||||
)
|
|
||||||
chip_temp_data = list(
|
|
||||||
filter(lambda x: not x == "", board["temp_chip"])
|
|
||||||
)
|
|
||||||
hashboards[board["index"]].chip_temp = sum(
|
|
||||||
[int(i) / 1000 for i in chip_temp_data]
|
|
||||||
) / len(chip_temp_data)
|
|
||||||
hashboards[board["index"]].serial_number = board["sn"]
|
|
||||||
hashboards[board["index"]].missing = False
|
|
||||||
except LookupError:
|
|
||||||
pass
|
|
||||||
return hashboards
|
|
||||||
|
|
||||||
async def _get_fault_light(
|
|
||||||
self, web_get_blink_status: dict = None
|
|
||||||
) -> Optional[bool]:
|
|
||||||
if self.light:
|
|
||||||
return self.light
|
|
||||||
|
|
||||||
if web_get_blink_status is None:
|
|
||||||
try:
|
|
||||||
web_get_blink_status = await self.web.get_blink_status()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if web_get_blink_status is not None:
|
|
||||||
try:
|
|
||||||
self.light = web_get_blink_status["blink"]
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
return self.light
|
|
||||||
|
|
||||||
async def _get_expected_hashrate(
|
|
||||||
self, web_stats: dict = None
|
|
||||||
) -> Optional[AlgoHashRate]:
|
|
||||||
if web_stats is None:
|
|
||||||
try:
|
|
||||||
web_stats = await self.web.stats()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if web_stats is not None:
|
|
||||||
try:
|
|
||||||
expected_rate = web_stats["STATS"][1]["total_rateideal"]
|
|
||||||
try:
|
|
||||||
rate_unit = web_stats["STATS"][1]["rate_unit"]
|
|
||||||
except KeyError:
|
|
||||||
rate_unit = "MH"
|
|
||||||
return self.algo.hashrate(
|
|
||||||
rate=float(expected_rate), unit=self.algo.unit.from_str(rate_unit)
|
|
||||||
).into(self.algo.unit.default)
|
|
||||||
except LookupError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _is_mining(self, web_get_miner_conf: dict = None) -> Optional[bool]:
|
|
||||||
if web_get_miner_conf is None:
|
|
||||||
try:
|
|
||||||
web_get_miner_conf = await self.web.get_miner_conf()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if web_get_miner_conf is not None:
|
|
||||||
try:
|
|
||||||
if str(web_get_miner_conf["fc-work-mode"]).isdigit():
|
|
||||||
return (
|
|
||||||
False if int(web_get_miner_conf["fc-work-mode"]) == 1 else True
|
|
||||||
)
|
|
||||||
return False
|
|
||||||
except LookupError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_uptime(self, web_summary: dict = None) -> Optional[int]:
|
|
||||||
if web_summary is None:
|
|
||||||
try:
|
|
||||||
web_summary = await self.web.summary()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if web_summary is not None:
|
|
||||||
try:
|
|
||||||
return int(web_summary["SUMMARY"][1]["elapsed"])
|
|
||||||
except LookupError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_fans(self, web_stats: dict = None) -> List[Fan]:
|
|
||||||
if self.expected_fans is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
if web_stats is None:
|
|
||||||
try:
|
|
||||||
web_stats = await self.web.stats()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
fans = [Fan() for _ in range(self.expected_fans)]
|
|
||||||
if web_stats is not None:
|
|
||||||
for fan_n in range(self.expected_fans):
|
|
||||||
try:
|
|
||||||
fans[fan_n].speed = int(web_stats["STATS"][0]["fan"][fan_n])
|
|
||||||
except LookupError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
return fans
|
|
||||||
|
|
||||||
async def _get_pools(self, web_pools: list = None) -> List[PoolMetrics]:
|
|
||||||
if web_pools is None:
|
|
||||||
try:
|
|
||||||
web_pools = await self.web.pools()
|
|
||||||
except APIError:
|
|
||||||
return []
|
|
||||||
|
|
||||||
active_pool_index = None
|
|
||||||
highest_priority = float("inf")
|
|
||||||
|
|
||||||
for pool_info in web_pools["POOLS"]:
|
|
||||||
if (
|
|
||||||
pool_info.get("status") == "Alive"
|
|
||||||
and pool_info.get("priority", float("inf")) < highest_priority
|
|
||||||
):
|
|
||||||
highest_priority = pool_info["priority"]
|
|
||||||
active_pool_index = pool_info["index"]
|
|
||||||
|
|
||||||
pools_data = []
|
|
||||||
if web_pools is not None:
|
|
||||||
try:
|
|
||||||
for pool_info in web_pools["POOLS"]:
|
|
||||||
url = pool_info.get("url")
|
|
||||||
pool_url = PoolUrl.from_str(url) if url else None
|
|
||||||
pool_data = PoolMetrics(
|
|
||||||
accepted=pool_info.get("accepted"),
|
|
||||||
rejected=pool_info.get("rejected"),
|
|
||||||
get_failures=pool_info.get("stale"),
|
|
||||||
remote_failures=pool_info.get("discarded"),
|
|
||||||
active=pool_info.get("index") == active_pool_index,
|
|
||||||
alive=pool_info.get("status") == "Alive",
|
|
||||||
url=pool_url,
|
|
||||||
user=pool_info.get("user"),
|
|
||||||
index=pool_info.get("index"),
|
|
||||||
)
|
|
||||||
pools_data.append(pool_data)
|
|
||||||
except LookupError:
|
|
||||||
pass
|
|
||||||
return pools_data
|
|
||||||
@@ -21,7 +21,7 @@ from pyasic.config import MinerConfig
|
|||||||
from pyasic.data import Fan, HashBoard
|
from pyasic.data import Fan, HashBoard
|
||||||
from pyasic.data.error_codes import MinerErrorData, X19Error
|
from pyasic.data.error_codes import MinerErrorData, X19Error
|
||||||
from pyasic.data.pools import PoolMetrics, PoolUrl
|
from pyasic.data.pools import PoolMetrics, PoolUrl
|
||||||
from pyasic.device.algorithm import AlgoHashRate, ScryptAlgo
|
from pyasic.device.algorithm import AlgoHashRate
|
||||||
from pyasic.errors import APIError
|
from pyasic.errors import APIError
|
||||||
from pyasic.logger import logger
|
from pyasic.logger import logger
|
||||||
from pyasic.miners.data import DataFunction, DataLocations, DataOptions, WebAPICommand
|
from pyasic.miners.data import DataFunction, DataLocations, DataOptions, WebAPICommand
|
||||||
@@ -138,8 +138,6 @@ class ePIC(ePICFirmware):
|
|||||||
await self.web.set_ptune_algo(conf["ptune"])
|
await self.web.set_ptune_algo(conf["ptune"])
|
||||||
|
|
||||||
## Pools
|
## Pools
|
||||||
if self.algo == ScryptAlgo:
|
|
||||||
conf["pools"]["coin"] = "Ltc"
|
|
||||||
await self.web.set_pools(conf["pools"])
|
await self.web.set_pools(conf["pools"])
|
||||||
except APIError:
|
except APIError:
|
||||||
pass
|
pass
|
||||||
@@ -285,9 +283,6 @@ class ePIC(ePICFirmware):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_fans(self, web_summary: dict = None) -> List[Fan]:
|
async def _get_fans(self, web_summary: dict = None) -> List[Fan]:
|
||||||
if self.expected_fans is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
if web_summary is None:
|
if web_summary is None:
|
||||||
try:
|
try:
|
||||||
web_summary = await self.web.summary()
|
web_summary = await self.web.summary()
|
||||||
@@ -307,9 +302,6 @@ class ePIC(ePICFirmware):
|
|||||||
async def _get_hashboards(
|
async def _get_hashboards(
|
||||||
self, web_summary: dict = None, web_capabilities: dict = None
|
self, web_summary: dict = None, web_capabilities: dict = None
|
||||||
) -> List[HashBoard]:
|
) -> List[HashBoard]:
|
||||||
if self.expected_hashboards is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
if web_summary is None:
|
if web_summary is None:
|
||||||
try:
|
try:
|
||||||
web_summary = await self.web.summary()
|
web_summary = await self.web.summary()
|
||||||
|
|||||||
@@ -1,248 +0,0 @@
|
|||||||
from typing import List, Optional
|
|
||||||
|
|
||||||
from pyasic import APIError, MinerConfig
|
|
||||||
from pyasic.data import Fan, HashBoard
|
|
||||||
from pyasic.device.algorithm import AlgoHashRate
|
|
||||||
from pyasic.device.firmware import MinerFirmware
|
|
||||||
from pyasic.miners.base import BaseMiner
|
|
||||||
from pyasic.miners.data import DataFunction, DataLocations, DataOptions, WebAPICommand
|
|
||||||
from pyasic.web.espminer import ESPMinerWebAPI
|
|
||||||
|
|
||||||
ESPMINER_DATA_LOC = DataLocations(
|
|
||||||
**{
|
|
||||||
str(DataOptions.HASHRATE): DataFunction(
|
|
||||||
"_get_hashrate",
|
|
||||||
[WebAPICommand("web_system_info", "system/info")],
|
|
||||||
),
|
|
||||||
str(DataOptions.EXPECTED_HASHRATE): DataFunction(
|
|
||||||
"_get_expected_hashrate",
|
|
||||||
[WebAPICommand("web_system_info", "system/info")],
|
|
||||||
),
|
|
||||||
str(DataOptions.WATTAGE): DataFunction(
|
|
||||||
"_get_wattage",
|
|
||||||
[WebAPICommand("web_system_info", "system/info")],
|
|
||||||
),
|
|
||||||
str(DataOptions.UPTIME): DataFunction(
|
|
||||||
"_get_uptime",
|
|
||||||
[WebAPICommand("web_system_info", "system/info")],
|
|
||||||
),
|
|
||||||
str(DataOptions.HASHBOARDS): DataFunction(
|
|
||||||
"_get_hashboards",
|
|
||||||
[WebAPICommand("web_system_info", "system/info")],
|
|
||||||
),
|
|
||||||
str(DataOptions.HOSTNAME): DataFunction(
|
|
||||||
"_get_hostname",
|
|
||||||
[WebAPICommand("web_system_info", "system/info")],
|
|
||||||
),
|
|
||||||
str(DataOptions.FANS): DataFunction(
|
|
||||||
"_get_fans",
|
|
||||||
[WebAPICommand("web_system_info", "system/info")],
|
|
||||||
),
|
|
||||||
str(DataOptions.FW_VERSION): DataFunction(
|
|
||||||
"_get_fw_ver",
|
|
||||||
[WebAPICommand("web_system_info", "system/info")],
|
|
||||||
),
|
|
||||||
str(DataOptions.API_VERSION): DataFunction(
|
|
||||||
"_get_api_ver",
|
|
||||||
[WebAPICommand("web_system_info", "system/info")],
|
|
||||||
),
|
|
||||||
str(DataOptions.MAC): DataFunction(
|
|
||||||
"_get_mac",
|
|
||||||
[WebAPICommand("web_system_info", "system/info")],
|
|
||||||
),
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class ESPMiner(BaseMiner):
|
|
||||||
"""Handler for ESPMiner"""
|
|
||||||
|
|
||||||
web: ESPMinerWebAPI
|
|
||||||
_web_cls = ESPMinerWebAPI
|
|
||||||
|
|
||||||
firmware = MinerFirmware.STOCK
|
|
||||||
|
|
||||||
data_locations = ESPMINER_DATA_LOC
|
|
||||||
|
|
||||||
async def reboot(self) -> bool:
|
|
||||||
await self.web.restart()
|
|
||||||
return True
|
|
||||||
|
|
||||||
async def get_config(self) -> MinerConfig:
|
|
||||||
web_system_info = await self.web.system_info()
|
|
||||||
return MinerConfig.from_espminer(web_system_info)
|
|
||||||
|
|
||||||
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
|
|
||||||
await self.web.update_settings(**config.as_espminer())
|
|
||||||
|
|
||||||
async def _get_wattage(self, web_system_info: dict = None) -> Optional[int]:
|
|
||||||
if web_system_info is None:
|
|
||||||
try:
|
|
||||||
web_system_info = await self.web.system_info()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
if web_system_info is not None:
|
|
||||||
try:
|
|
||||||
return round(web_system_info["power"])
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_hashrate(
|
|
||||||
self, web_system_info: dict = None
|
|
||||||
) -> Optional[AlgoHashRate]:
|
|
||||||
if web_system_info is None:
|
|
||||||
try:
|
|
||||||
web_system_info = await self.web.system_info()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if web_system_info is not None:
|
|
||||||
try:
|
|
||||||
return self.algo.hashrate(
|
|
||||||
rate=float(web_system_info["hashRate"]), unit=self.algo.unit.GH
|
|
||||||
).into(self.algo.unit.default)
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_expected_hashrate(
|
|
||||||
self, web_system_info: dict = None
|
|
||||||
) -> Optional[AlgoHashRate]:
|
|
||||||
if web_system_info is None:
|
|
||||||
try:
|
|
||||||
web_system_info = await self.web.system_info()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if web_system_info is not None:
|
|
||||||
try:
|
|
||||||
small_core_count = web_system_info.get("smallCoreCount")
|
|
||||||
asic_count = web_system_info.get("asicCount")
|
|
||||||
frequency = web_system_info.get("frequency")
|
|
||||||
|
|
||||||
if asic_count is None:
|
|
||||||
try:
|
|
||||||
asic_info = await self.web.asic_info()
|
|
||||||
asic_count = asic_info.get("asicCount")
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
expected_hashrate = small_core_count * asic_count * frequency
|
|
||||||
|
|
||||||
return self.algo.hashrate(
|
|
||||||
rate=float(expected_hashrate), unit=self.algo.unit.MH
|
|
||||||
).into(self.algo.unit.default)
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_uptime(self, web_system_info: dict = None) -> Optional[int]:
|
|
||||||
if web_system_info is None:
|
|
||||||
try:
|
|
||||||
web_system_info = await self.web.system_info()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if web_system_info is not None:
|
|
||||||
try:
|
|
||||||
return web_system_info["uptimeSeconds"]
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_hashboards(self, web_system_info: dict = None) -> List[HashBoard]:
|
|
||||||
if self.expected_hashboards is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
if web_system_info is None:
|
|
||||||
try:
|
|
||||||
web_system_info = await self.web.system_info()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if web_system_info is not None:
|
|
||||||
try:
|
|
||||||
return [
|
|
||||||
HashBoard(
|
|
||||||
hashrate=self.algo.hashrate(
|
|
||||||
rate=float(web_system_info["hashRate"]),
|
|
||||||
unit=self.algo.unit.GH,
|
|
||||||
).into(self.algo.unit.default),
|
|
||||||
chip_temp=web_system_info.get("temp"),
|
|
||||||
temp=web_system_info.get("vrTemp"),
|
|
||||||
chips=web_system_info.get("asicCount", 1),
|
|
||||||
expected_chips=self.expected_chips,
|
|
||||||
missing=False,
|
|
||||||
active=True,
|
|
||||||
voltage=web_system_info.get("voltage"),
|
|
||||||
)
|
|
||||||
]
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
return []
|
|
||||||
|
|
||||||
async def _get_fans(self, web_system_info: dict = None) -> List[Fan]:
|
|
||||||
if self.expected_fans is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
if web_system_info is None:
|
|
||||||
try:
|
|
||||||
web_system_info = await self.web.system_info()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if web_system_info is not None:
|
|
||||||
try:
|
|
||||||
return [Fan(speed=web_system_info["fanrpm"])]
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
return []
|
|
||||||
|
|
||||||
async def _get_hostname(self, web_system_info: dict = None) -> Optional[str]:
|
|
||||||
if web_system_info is None:
|
|
||||||
try:
|
|
||||||
web_system_info = await self.web.system_info()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if web_system_info is not None:
|
|
||||||
try:
|
|
||||||
return web_system_info["hostname"]
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_api_ver(self, web_system_info: dict = None) -> Optional[str]:
|
|
||||||
if web_system_info is None:
|
|
||||||
try:
|
|
||||||
web_system_info = await self.web.system_info()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if web_system_info is not None:
|
|
||||||
try:
|
|
||||||
return web_system_info["version"]
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_fw_ver(self, web_system_info: dict = None) -> Optional[str]:
|
|
||||||
if web_system_info is None:
|
|
||||||
try:
|
|
||||||
web_system_info = await self.web.system_info()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if web_system_info is not None:
|
|
||||||
try:
|
|
||||||
return web_system_info["version"]
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def _get_mac(self, web_system_info: dict = None) -> Optional[str]:
|
|
||||||
if web_system_info is None:
|
|
||||||
try:
|
|
||||||
web_system_info = await self.web.system_info()
|
|
||||||
except APIError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if web_system_info is not None:
|
|
||||||
try:
|
|
||||||
return web_system_info["macAddr"].upper()
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
@@ -145,9 +145,6 @@ class GoldshellMiner(BFGMiner):
|
|||||||
async def _get_hashboards(
|
async def _get_hashboards(
|
||||||
self, rpc_devs: dict = None, rpc_devdetails: dict = None
|
self, rpc_devs: dict = None, rpc_devdetails: dict = None
|
||||||
) -> List[HashBoard]:
|
) -> List[HashBoard]:
|
||||||
if self.expected_hashboards is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
if rpc_devs is None:
|
if rpc_devs is None:
|
||||||
try:
|
try:
|
||||||
rpc_devs = await self.rpc.devs()
|
rpc_devs = await self.rpc.devs()
|
||||||
|
|||||||
@@ -180,9 +180,6 @@ class BlackMiner(StockFirmware):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_hashboards(self, rpc_stats: dict = None) -> List[HashBoard]:
|
async def _get_hashboards(self, rpc_stats: dict = None) -> List[HashBoard]:
|
||||||
if self.expected_hashboards is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
hashboards = []
|
hashboards = []
|
||||||
|
|
||||||
if rpc_stats is None:
|
if rpc_stats is None:
|
||||||
@@ -248,9 +245,6 @@ class BlackMiner(StockFirmware):
|
|||||||
return hashboards
|
return hashboards
|
||||||
|
|
||||||
async def _get_fans(self, rpc_stats: dict = None) -> List[Fan]:
|
async def _get_fans(self, rpc_stats: dict = None) -> List[Fan]:
|
||||||
if self.expected_fans is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
if rpc_stats is None:
|
if rpc_stats is None:
|
||||||
try:
|
try:
|
||||||
rpc_stats = await self.rpc.stats()
|
rpc_stats = await self.rpc.stats()
|
||||||
|
|||||||
@@ -79,9 +79,6 @@ class IceRiver(StockFirmware):
|
|||||||
return MinerConfig.from_iceriver(web_userpanel)
|
return MinerConfig.from_iceriver(web_userpanel)
|
||||||
|
|
||||||
async def _get_fans(self, web_userpanel: dict = None) -> List[Fan]:
|
async def _get_fans(self, web_userpanel: dict = None) -> List[Fan]:
|
||||||
if self.expected_fans is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
if web_userpanel is None:
|
if web_userpanel is None:
|
||||||
try:
|
try:
|
||||||
web_userpanel = await self.web.userpanel()
|
web_userpanel = await self.web.userpanel()
|
||||||
@@ -173,9 +170,6 @@ class IceRiver(StockFirmware):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_hashboards(self, web_userpanel: dict = None) -> List[HashBoard]:
|
async def _get_hashboards(self, web_userpanel: dict = None) -> List[HashBoard]:
|
||||||
if self.expected_hashboards is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
if web_userpanel is None:
|
if web_userpanel is None:
|
||||||
try:
|
try:
|
||||||
web_userpanel = await self.web.userpanel()
|
web_userpanel = await self.web.userpanel()
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user