Compare commits

...

2 Commits

Author SHA1 Message Date
UpstreamData
0bd679f259 version: bump version number. 2023-06-22 15:07:25 -06:00
UpstreamData
1ce5bd0566 Update miner data and fix various bugs related to the fix. (#47)
* feature: fix influxdb data.

* bug: fix an issue with some avalon stats parsing.

* bug: add chip count for 1166 Pro.

* bug: fix some issues with bosminer scanning and some data bugs.

* bug: remove print statement.

* bug: fix failed data gathering multicommand via graphql.

* feature: add partial support for M50S+VK20

* version: bump version number.

* bug: add chip count for M50S+VK20.

* version: bump version number.

* bug: attempt to fix offset check issue on BOS+.

* bug: fix NoneType subscription on BOS+.

* bug: add support for Vnish S17+.

* bug: remove web references for Avalons.

* bug: add support for VNish S17Pro.

* bug: Try secondary identification method for antminers.

* feature: fix a bunch of functionality for avalonminers.

* bug: fix avalonminer fan speed being set as str.

* bug: fix fans speeds being represented as strings.

* bug: fix some get_fan formatting.

* docs: update supported miners list, and fix A10X model name.

* docs: update MinerData docstrings.

* docs: update factory documentation.
2023-06-22 15:06:30 -06:00
42 changed files with 1332 additions and 1546 deletions

View File

@@ -42,8 +42,8 @@ if __name__ == "__main__":
<br> <br>
## Creating miners based on IP ## Creating miners based on IP
If you already know the IP address of your miner or miners, you can use the [`MinerFactory`][pyasic.miners.miner_factory.MinerFactory] to communicate and identify the miners, or an abstraction of its functionality, [`get_miner()`][pyasic.miners.miner_factory.MinerFactory.get_miner]. If you already know the IP address of your miner or miners, you can use the [`MinerFactory`][pyasic.miners.miner_factory.MinerFactory] to communicate and identify the miners, or an abstraction of its functionality, [`get_miner()`][pyasic.miners.get_miner].
The function [`get_miner()`][pyasic.miners.miner_factory.MinerFactory.get_miner] will return any miner it found at the IP address specified, or an `UnknownMiner` if it cannot identify the miner. The function [`get_miner()`][pyasic.miners.get_miner] will return any miner it found at the IP address specified, or an `UnknownMiner` if it cannot identify the miner.
```python ```python
import asyncio # asyncio for handling the async part import asyncio # asyncio for handling the async part
from pyasic import get_miner # handles miner creation from pyasic import get_miner # handles miner creation

View File

@@ -1,11 +1,10 @@
# pyasic # pyasic
## X15 Models ## X15 Models
## Z15 ## Z15
::: pyasic.miners.antminer.cgminer.X15.Z15.CGMinerZ15
::: pyasic.miners.zec.antminer.cgminer.X15.Z15.CGMinerZ15
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4

View File

@@ -2,116 +2,114 @@
## X17 Models ## X17 Models
## S17 ## S17
::: pyasic.miners.antminer.bmminer.X17.S17.BMMinerS17
::: pyasic.miners.btc.antminer.bmminer.X17.S17.BMMinerS17
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## S17+ ## S17+
::: pyasic.miners.antminer.bmminer.X17.S17.BMMinerS17Plus
::: pyasic.miners.btc.antminer.bmminer.X17.S17_Plus.BMMinerS17Plus
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## S17 Pro ## S17 Pro
::: pyasic.miners.antminer.bmminer.X17.S17.BMMinerS17Pro
::: pyasic.miners.btc.antminer.bmminer.X17.S17_Pro.BMMinerS17Pro
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## S17e ## S17e
::: pyasic.miners.antminer.bmminer.X17.S17.BMMinerS17e
::: pyasic.miners.btc.antminer.bmminer.X17.S17e.BMMinerS17e
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## T17 ## T17
::: pyasic.miners.antminer.bmminer.X17.T17.BMMinerT17
::: pyasic.miners.btc.antminer.bmminer.X17.T17.BMMinerT17
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## T17+ ## T17+
::: pyasic.miners.antminer.bmminer.X17.T17.BMMinerT17Plus
::: pyasic.miners.btc.antminer.bmminer.X17.T17_Plus.BMMinerT17Plus
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## T17e ## T17e
::: pyasic.miners.antminer.bmminer.X17.T17.BMMinerT17e
::: pyasic.miners.btc.antminer.bmminer.X17.T17e.BMMinerT17e
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## S17 (BOS) ## S17 (BOS)
::: pyasic.miners.antminer.bosminer.X17.S17.BOSMinerS17
::: pyasic.miners.btc.antminer.bosminer.X17.S17.BOSMinerS17
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## S17+ (BOS) ## S17+ (BOS)
::: pyasic.miners.antminer.bosminer.X17.S17.BOSMinerS17Plus
::: pyasic.miners.btc.antminer.bosminer.X17.S17_Plus.BOSMinerS17Plus
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## S17 Pro (BOS) ## S17 Pro (BOS)
::: pyasic.miners.antminer.bosminer.X17.S17.BOSMinerS17Pro
::: pyasic.miners.btc.antminer.bosminer.X17.S17_Pro.BOSMinerS17Pro
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## S17e (BOS) ## S17e (BOS)
::: pyasic.miners.antminer.bosminer.X17.S17.BOSMinerS17e
::: pyasic.miners.btc.antminer.bosminer.X17.S17e.BOSMinerS17e
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## T17 (BOS) ## T17 (BOS)
::: pyasic.miners.antminer.bosminer.X17.T17.BOSMinerT17
::: pyasic.miners.btc.antminer.bosminer.X17.T17.BOSMinerT17
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## T17+ (BOS) ## T17+ (BOS)
::: pyasic.miners.antminer.bosminer.X17.T17.BOSMinerT17Plus
::: pyasic.miners.btc.antminer.bosminer.X17.T17_Plus.BOSMinerT17Plus
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## T17e (BOS) ## T17e (BOS)
::: pyasic.miners.antminer.bosminer.X17.T17.BOSMinerT17e
::: pyasic.miners.btc.antminer.bosminer.X17.T17e.BOSMinerT17e
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## S17+ (VNish)
::: pyasic.miners.antminer.vnish.X17.S17.VNishS17Plus
handler: python
options:
show_root_heading: false
heading_level: 4
## S17 Pro (VNish)
::: pyasic.miners.antminer.vnish.X17.S17.VNishS17Pro
handler: python
options:
show_root_heading: false
heading_level: 4

View File

@@ -2,109 +2,170 @@
## X19 Models ## X19 Models
## S19 ## S19
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19
::: pyasic.miners.btc.antminer.bmminer.X19.S19.BMMinerS19
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## S19L ## S19L
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19L
::: pyasic.miners.btc.antminer.bmminer.X19.S19L.BMMinerS19L
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## S19 Pro ## S19 Pro
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19Pro
::: pyasic.miners.btc.antminer.bmminer.X19.S19_Pro.BMMinerS19Pro
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## S19a
::: pyasic.miners.btc.antminer.bmminer.X19.S19a.BMMinerS19a
handler: python
options:
show_root_heading: false
heading_level: 4
## S19j ## S19j
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19j
handler: python
options:
show_root_heading: false
heading_level: 4
::: pyasic.miners.btc.antminer.bmminer.X19.S19j.BMMinerS19j ## S19j No PIC
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19jNoPIC
handler: python
options:
show_root_heading: false
heading_level: 4
## S19 Pro+
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19ProPlus
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## S19j Pro ## S19j Pro
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19jPro
::: pyasic.miners.btc.antminer.bmminer.X19.S19j_Pro.BMMinerS19jPro
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## S19 XP ## S19 XP
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19XP
handler: python
options:
show_root_heading: false
heading_level: 4
::: pyasic.miners.btc.antminer.bmminer.X19.S19_XP.BMMinerS19XP ## S19a
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19a
handler: python
options:
show_root_heading: false
heading_level: 4
## S19a Pro
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19aPro
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## T19 ## T19
::: pyasic.miners.antminer.bmminer.X19.T19.BMMinerT19
::: pyasic.miners.btc.antminer.bmminer.X19.T19.BMMinerT19
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## S19 (BOS) ## S19 (BOS)
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19
::: pyasic.miners.btc.antminer.bosminer.X19.S19.BOSMinerS19
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## S19 Pro (BOS) ## S19 Pro (BOS)
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19Pro
::: pyasic.miners.btc.antminer.bosminer.X19.S19_Pro.BOSMinerS19Pro
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## S19j (BOS) ## S19j (BOS)
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19j
handler: python
options:
show_root_heading: false
heading_level: 4
::: pyasic.miners.btc.antminer.bosminer.X19.S19j.BOSMinerS19j ## S19j No PIC (BOS)
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19jNoPIC
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## S19j Pro (BOS) ## S19j Pro (BOS)
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19jPro
::: pyasic.miners.btc.antminer.bosminer.X19.S19j_Pro.BOSMinerS19jPro
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## T19 (BOS) ## T19 (BOS)
::: pyasic.miners.antminer.bosminer.X19.T19.BOSMinerT19
::: pyasic.miners.btc.antminer.bosminer.X19.T19.BOSMinerT19
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## S19 (VNish)
::: pyasic.miners.antminer.vnish.X19.S19.VNishS19
handler: python
options:
show_root_heading: false
heading_level: 4
## S19 Pro (VNish)
::: pyasic.miners.antminer.vnish.X19.S19.VNishS19Pro
handler: python
options:
show_root_heading: false
heading_level: 4
## S19j (VNish)
::: pyasic.miners.antminer.vnish.X19.S19.VNishS19j
handler: python
options:
show_root_heading: false
heading_level: 4
## S19j Pro (VNish)
::: pyasic.miners.antminer.vnish.X19.S19.VNishS19jPro
handler: python
options:
show_root_heading: false
heading_level: 4
## S19a (VNish)
::: pyasic.miners.antminer.vnish.X19.S19.VNishS19a
handler: python
options:
show_root_heading: false
heading_level: 4
## S19a Pro (VNish)
::: pyasic.miners.antminer.vnish.X19.S19.VNishS19aPro
handler: python
options:
show_root_heading: false
heading_level: 4
## T19 (VNish)
::: pyasic.miners.antminer.vnish.X19.T19.VNishT19
handler: python
options:
show_root_heading: false
heading_level: 4

View File

@@ -1,11 +1,31 @@
# pyasic # pyasic
## X3 Models ## X3 Models
## D3
## HS3 ::: pyasic.miners.antminer.cgminer.X3.D3.CGMinerD3
::: pyasic.miners.hns.antminer.cgminer.X3.HS3.CGMinerHS3
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## HS3
::: pyasic.miners.antminer.bmminer.X3.HS3.BMMinerHS3
handler: python
options:
show_root_heading: false
heading_level: 4
## L3+
::: pyasic.miners.antminer.bmminer.X3.L3.BMMinerL3Plus
handler: python
options:
show_root_heading: false
heading_level: 4
## L3+ (VNish)
::: pyasic.miners.antminer.vnish.X3.L3.VnishL3Plus
handler: python
options:
show_root_heading: false
heading_level: 4

View File

@@ -1,11 +1,10 @@
# pyasic # pyasic
## X5 Models ## X5 Models
## DR5 ## DR5
::: pyasic.miners.antminer.cgminer.X5.DR5.CGMinerDR5
::: pyasic.miners.dcr.antminer.cgminer.X5.DR5.CGMinerDR5
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4

View File

@@ -1,11 +1,10 @@
# pyasic # pyasic
## X7 Models ## X7 Models
## L7 ## L7
::: pyasic.miners.antminer.bmminer.X7.L7.BMMinerL7
::: pyasic.miners.ltc.antminer.bmminer.X7.L7.BMMinerL7
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4

View File

@@ -1,44 +1,52 @@
# pyasic # pyasic
## X9 Models ## X9 Models
## E9Pro
## X9 (BOS) ::: pyasic.miners.antminer.bmminer.X9.E9.BMMinerE9Pro
::: pyasic.miners.btc.antminer.bosminer.X9.S9.BOSMinerS9
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## S9 ## S9
::: pyasic.miners.antminer.bmminer.X9.S9.BMMinerS9
::: pyasic.miners.btc.antminer.bmminer.X9.S9.BMMinerS9
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## S9i ## S9i
::: pyasic.miners.antminer.bmminer.X9.S9.BMMinerS9i
handler: python
options:
show_root_heading: false
heading_level: 4
::: pyasic.miners.btc.antminer.bmminer.X9.S9i.BMMinerS9i ## S9j
::: pyasic.miners.antminer.bmminer.X9.S9.BMMinerS9j
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## T9 ## T9
::: pyasic.miners.antminer.bmminer.X9.T9.BMMinerT9
::: pyasic.miners.btc.antminer.bmminer.X9.T9.BMMinerT9
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## E9 Pro ## S9 (BOS)
::: pyasic.miners.antminer.bosminer.X9.S9.BOSMinerS9
::: pyasic.miners.etc.antminer.cgminer.X9.E9_Pro.CGMinerE9Pro
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## T9 (Hiveon)
::: pyasic.miners.antminer.hiveon.X9.T9.HiveonT9
handler: python
options:
show_root_heading: false
heading_level: 4

View File

@@ -1,26 +1,24 @@
# pyasic # pyasic
## A10X Models ## A10X Models
## A1026 ## Avalon 1026
::: pyasic.miners.avalonminer.cgminer.A10X.A1026.CGMinerAvalon1026
::: pyasic.miners.btc.avalonminer.cgminer.A10X.A1026.CGMinerAvalon1026
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## A1047 ## Avalon 1047
::: pyasic.miners.avalonminer.cgminer.A10X.A1047.CGMinerAvalon1047
::: pyasic.miners.btc.avalonminer.cgminer.A10X.A1047.CGMinerAvalon1047
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## A1066 ## Avalon 1066
::: pyasic.miners.avalonminer.cgminer.A10X.A1066.CGMinerAvalon1066
::: pyasic.miners.btc.avalonminer.cgminer.A10X.A1066.CGMinerAvalon1066
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4

View File

@@ -0,0 +1,10 @@
# pyasic
## A11X Models
## Avalon 1166 Pro
::: pyasic.miners.avalonminer.cgminer.A11X.A1166.CGMinerAvalon1166Pro
handler: python
options:
show_root_heading: false
heading_level: 4

View File

@@ -1,10 +1,10 @@
# pyasic # pyasic
## HSX Models ## A12X Models
## HS5 ## Avalon 1246
::: pyasic.miners.avalonminer.cgminer.A12X.A1246.CGMinerAvalon1246
::: pyasic.miners.hns.goldshell.bfgminer.HSX.HS5.BFGMinerHS5
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4

View File

@@ -1,26 +1,24 @@
# pyasic # pyasic
## A7X Models ## A7X Models
## A721 ## Avalon 721
::: pyasic.miners.avalonminer.cgminer.A7X.A721.CGMinerAvalon721
::: pyasic.miners.btc.avalonminer.cgminer.A7X.A721.CGMinerAvalon721
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## A741 ## Avalon 741
::: pyasic.miners.avalonminer.cgminer.A7X.A741.CGMinerAvalon741
::: pyasic.miners.btc.avalonminer.cgminer.A7X.A741.CGMinerAvalon741
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## A761 ## Avalon 761
::: pyasic.miners.avalonminer.cgminer.A7X.A761.CGMinerAvalon761
::: pyasic.miners.btc.avalonminer.cgminer.A7X.A761.CGMinerAvalon761
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4

View File

@@ -1,26 +1,24 @@
# pyasic # pyasic
## A8X Models ## A8X Models
## A821 ## Avalon 821
::: pyasic.miners.avalonminer.cgminer.A8X.A821.CGMinerAvalon821
::: pyasic.miners.btc.avalonminer.cgminer.A8X.A821.CGMinerAvalon821
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## A841 ## Avalon 841
::: pyasic.miners.avalonminer.cgminer.A8X.A841.CGMinerAvalon841
::: pyasic.miners.btc.avalonminer.cgminer.A8X.A841.CGMinerAvalon841
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## A851 ## Avalon 851
::: pyasic.miners.avalonminer.cgminer.A8X.A851.CGMinerAvalon851
::: pyasic.miners.btc.avalonminer.cgminer.A8X.A851.CGMinerAvalon851
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4

View File

@@ -1,10 +1,10 @@
# pyasic # pyasic
## A9X Models ## A9X Models
## A921 ## Avalon 921
::: pyasic.miners.avalonminer.cgminer.A9X.A921.CGMinerAvalon921
::: pyasic.miners.btc.avalonminer.cgminer.A9X.A921.CGMinerAvalon921
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4

View File

@@ -1,19 +0,0 @@
# pyasic
## KDX Models
## KD5
::: pyasic.miners.kda.goldshell.bfgminer.KDX.KD5.BFGMinerKD5
handler: python
options:
show_root_heading: false
heading_level: 4
## KD Max
::: pyasic.miners.kda.goldshell.bfgminer.KDX.KDMax.BFGMinerKDMax
handler: python
options:
show_root_heading: false
heading_level: 4

View File

@@ -0,0 +1,24 @@
# pyasic
## X5 Models
## CK5
::: pyasic.miners.goldshell.bfgminer.X5.CK5.BFGMinerCK5
handler: python
options:
show_root_heading: false
heading_level: 4
## HS5
::: pyasic.miners.goldshell.bfgminer.X5.HS5.BFGMinerHS5
handler: python
options:
show_root_heading: false
heading_level: 4
## KD5
::: pyasic.miners.goldshell.bfgminer.X5.KD5.BFGMinerKD5
handler: python
options:
show_root_heading: false
heading_level: 4

View File

@@ -1,10 +1,10 @@
# pyasic # pyasic
## CKX Models ## XMax Models
## CK5 ## KD Max
::: pyasic.miners.goldshell.bfgminer.XMax.KDMax.BFGMinerKDMax
::: pyasic.miners.ckb.goldshell.bfgminer.CKX.CK5.BFGMinerCK5
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4

View File

@@ -2,9 +2,9 @@
## A10X Models ## A10X Models
## A10X ## A10X
::: pyasic.miners.innosilicon.cgminer.A10X.A10X.CGMinerA10X
::: pyasic.miners.etc.innosilicon.cgminer.A10X.A10X.CGMinerA10X
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4

View File

@@ -2,9 +2,9 @@
## T3X Models ## T3X Models
## T3H+ ## T3H+
::: pyasic.miners.innosilicon.cgminer.T3X.T3H.CGMinerT3HPlus
::: pyasic.miners.btc.innosilicon.cgminer.T3X.T3H_Plus.CGMinerInnosiliconT3HPlus
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4

View File

@@ -8,6 +8,14 @@
heading_level: 4 heading_level: 4
<br> <br>
## Get Miner
::: pyasic.miners.get_miner
handler: python
options:
show_root_heading: false
heading_level: 4
<br>
## AnyMiner ## AnyMiner
::: pyasic.miners.miner_factory.AnyMiner ::: pyasic.miners.miner_factory.AnyMiner
handler: python handler: python

View File

@@ -11,37 +11,72 @@ details {
padding-bottom:0px; padding-bottom:0px;
} }
</style> </style>
<details style="margin:0px; padding-top:0px; padding-bottom:0px;">
<summary>Braiins OS+ Devices:</summary> <details>
<summary>Stock Firmware Antminers:</summary>
<ul> <ul>
<details> <details>
<summary>X19 Series:</summary> <summary>X3 Series:</summary>
<ul> <ul>
<li><a href="../antminer/X19#s19-bos">S19</a></li> <li><a href="../antminer/X3#d3">D3</a></li>
<li><a href="../antminer/X19#s19-pro-bos">S19 Pro</a></li> <li><a href="../antminer/X3#hs3">HS3</a></li>
<li><a href="../antminer/X19#s19j-bos">S19j</a></li> <li><a href="../antminer/X3#l3_1">L3+</a></li>
<li><a href="../antminer/X19#s19j-pro-bos">S19j Pro</a></li>
<li><a href="../antminer/X19#t19-bos">T19</a></li>
</ul> </ul>
</details> </details>
<details> <details>
<summary>X17 Series:</summary> <summary>X5 Series:</summary>
<ul> <ul>
<li><a href="../antminer/X17#s17-bos">S17</a></li> <li><a href="../antminer/X5#dr5">DR5</a></li>
<li><a href="../antminer/X17#s17-plus-bos">S17+</a></li> </ul>
<li><a href="../antminer/X17#s17-pro-bos">S17 Pro</a></li> </details>
<li><a href="../antminer/X17#s17e-bos">S17e</a></li> <details>
<li><a href="../antminer/X17#t17-bos">T17</a></li> <summary>X7 Series:</summary>
<li><a href="../antminer/X17#t17-plus-bos">T17+</a></li> <ul>
<li><a href="../antminer/X17#t17e-bos">T17e</a></li> <li><a href="../antminer/X7#l7">L7</a></li>
</ul> </ul>
</details> </details>
<details> <details>
<summary>X9 Series:</summary> <summary>X9 Series:</summary>
<ul> <ul>
<li><a href="../antminer/X9#s9-bos">S9</a></li> <li><a href="../antminer/X9#e9pro">E9Pro</a></li>
<li><a href="../antminer/X9#s9-bos">S9i</a></li> <li><a href="../antminer/X9#s9">S9</a></li>
<li><a href="../antminer/X9#s9-bos">S9j</a></li> <li><a href="../antminer/X9#s9i">S9i</a></li>
<li><a href="../antminer/X9#s9j">S9j</a></li>
<li><a href="../antminer/X9#t9">T9</a></li>
</ul>
</details>
<details>
<summary>X15 Series:</summary>
<ul>
<li><a href="../antminer/X15#z15">Z15</a></li>
</ul>
</details>
<details>
<summary>X17 Series:</summary>
<ul>
<li><a href="../antminer/X17#s17">S17</a></li>
<li><a href="../antminer/X17#s17_1">S17+</a></li>
<li><a href="../antminer/X17#s17-pro">S17 Pro</a></li>
<li><a href="../antminer/X17#s17e">S17e</a></li>
<li><a href="../antminer/X17#t17">T17</a></li>
<li><a href="../antminer/X17#t17_1">T17+</a></li>
<li><a href="../antminer/X17#t17e">T17e</a></li>
</ul>
</details>
<details>
<summary>X19 Series:</summary>
<ul>
<li><a href="../antminer/X19#s19">S19</a></li>
<li><a href="../antminer/X19#s19l">S19L</a></li>
<li><a href="../antminer/X19#s19-pro">S19 Pro</a></li>
<li><a href="../antminer/X19#s19j">S19j</a></li>
<li><a href="../antminer/X19#s19j-no-pic">S19j No PIC</a></li>
<li><a href="../antminer/X19#s19-pro_1">S19 Pro+</a></li>
<li><a href="../antminer/X19#s19j-pro">S19j Pro</a></li>
<li><a href="../antminer/X19#s19-xp">S19 XP</a></li>
<li><a href="../antminer/X19#s19a">S19a</a></li>
<li><a href="../antminer/X19#s19a-pro">S19a Pro</a></li>
<li><a href="../antminer/X19#t19">T19</a></li>
</ul> </ul>
</details> </details>
</ul> </ul>
@@ -51,440 +86,199 @@ details {
<ul> <ul>
<details> <details>
<summary>M2X Series:</summary> <summary>M2X Series:</summary>
<ul> <ul>
<details> <li><a href="../whatsminer/M2X#m20-v10">M20 V10</a></li>
<summary><a href='../whatsminer/M2X/#M20'>M20</a></summary> <li><a href="../whatsminer/M2X#m20s-v10">M20S V10</a></li>
<ul> <li><a href="../whatsminer/M2X#m20s-v20">M20S V20</a></li>
<li><a href='../whatsminer/M2X/#M20V10'>M20V10</a></li> <li><a href="../whatsminer/M2X#m20s-v30">M20S V30</a></li>
</ul> <li><a href="../whatsminer/M2X#m20s_1-v30">M20S+ V30</a></li>
</details> <li><a href="../whatsminer/M2X#m21-v10">M21 V10</a></li>
<details> <li><a href="../whatsminer/M2X#m21s-v20">M21S V20</a></li>
<summary><a href='../whatsminer/M2X/#M20S'>M20S</a></summary> <li><a href="../whatsminer/M2X#m21s-v60">M21S V60</a></li>
<ul> <li><a href="../whatsminer/M2X#m21s-v70">M21S V70</a></li>
<li><a href='../whatsminer/M2X/#M20SV10'>M20SV10</a></li> <li><a href="../whatsminer/M2X#m21s_1-v20">M21S+ V20</a></li>
<li><a href='../whatsminer/M2X/#M20SV20'>M20SV20</a></li> <li><a href="../whatsminer/M2X#m29-v10">M29 V10</a></li>
<li><a href='../whatsminer/M2X/#M20SV30'>M20SV30</a></li> </ul>
</ul>
</details>
<details>
<summary><a href='../whatsminer/M2X/#M20S_1'>M20S+</a></summary>
<ul>
<li><a href='../whatsminer/M2X/#M20S_1V30'>M20S+V30</a></li>
</ul>
</details>
<details>
<summary><a href='../whatsminer/M2X/#M21'>M21</a></summary>
<ul>
<li><a href='../whatsminer/M2X/#M21V10'>M21V10</a></li>
</ul>
</details>
<details>
<summary><a href='../whatsminer/M2X/#M21S'>M21S</a></summary>
<ul>
<li><a href='../whatsminer/M2X/#M21SV20'>M21SV20</a></li>
<li><a href='../whatsminer/M2X/#M21SV60'>M21SV60</a></li>
<li><a href='../whatsminer/M2X/#M21SV70'>M21SV70</a></li>
</ul>
</details>
<details>
<summary><a href='../whatsminer/M2X/#M21S_1'>M21S+</a></summary>
<ul>
<li><a href='../whatsminer/M2X/#M21S_1V20'>M21S+V20</a></li>
</ul>
</details>
<details>
<summary><a href='../whatsminer/M2X/#M29'>M29</a></summary>
<ul>
<li><a href='../whatsminer/M2X/#M29V10'>M29V10</a></li>
</ul>
</details>
</ul>
</details> </details>
<details> <details>
<summary>M3X Series:</summary> <summary>M3X Series:</summary>
<ul> <ul>
<details> <li><a href="../whatsminer/M3X#m30-v10">M30 V10</a></li>
<summary><a href='../whatsminer/M3X/#M30'>M30</a></summary> <li><a href="../whatsminer/M3X#m30-v20">M30 V20</a></li>
<ul> <li><a href="../whatsminer/M3X#m30s-v10">M30S V10</a></li>
<li><a href='../whatsminer/M3X/#M30V10'>M30V10</a></li> <li><a href="../whatsminer/M3X#m30s-v20">M30S V20</a></li>
<li><a href='../whatsminer/M3X/#M30V20'>M30V20</a></li> <li><a href="../whatsminer/M3X#m30s-v30">M30S V30</a></li>
</ul> <li><a href="../whatsminer/M3X#m30s-v40">M30S V40</a></li>
</details> <li><a href="../whatsminer/M3X#m30s-v50">M30S V50</a></li>
<details> <li><a href="../whatsminer/M3X#m30s-v60">M30S V60</a></li>
<summary><a href='../whatsminer/M3X/#M30S'>M30S</a></summary> <li><a href="../whatsminer/M3X#m30s-v70">M30S V70</a></li>
<ul> <li><a href="../whatsminer/M3X#m30s-v80">M30S V80</a></li>
<li><a href='../whatsminer/M3X/#M30SV10'>M30SV10</a></li> <li><a href="../whatsminer/M3X#m30s-ve10">M30S VE10</a></li>
<li><a href='../whatsminer/M3X/#M30SV20'>M30SV20</a></li> <li><a href="../whatsminer/M3X#m30s-ve20">M30S VE20</a></li>
<li><a href='../whatsminer/M3X/#M30SV30'>M30SV30</a></li> <li><a href="../whatsminer/M3X#m30s-ve30">M30S VE30</a></li>
<li><a href='../whatsminer/M3X/#M30SV40'>M30SV40</a></li> <li><a href="../whatsminer/M3X#m30s-ve40">M30S VE40</a></li>
<li><a href='../whatsminer/M3X/#M30SV50'>M30SV50</a></li> <li><a href="../whatsminer/M3X#m30s-ve50">M30S VE50</a></li>
<li><a href='../whatsminer/M3X/#M30SV60'>M30SV60</a></li> <li><a href="../whatsminer/M3X#m30s-ve60">M30S VE60</a></li>
<li><a href='../whatsminer/M3X/#M30SV70'>M30SV70</a></li> <li><a href="../whatsminer/M3X#m30s-ve70">M30S VE70</a></li>
<li><a href='../whatsminer/M3X/#M30SV80'>M30SV80</a></li> <li><a href="../whatsminer/M3X#m30s-vf10">M30S VF10</a></li>
<li><a href='../whatsminer/M3X/#M30SVE10'>M30SVE10</a></li> <li><a href="../whatsminer/M3X#m30s-vf20">M30S VF20</a></li>
<li><a href='../whatsminer/M3X/#M30SVE20'>M30SVE20</a></li> <li><a href="../whatsminer/M3X#m30s-vf30">M30S VF30</a></li>
<li><a href='../whatsminer/M3X/#M30SVE30'>M30SVE30</a></li> <li><a href="../whatsminer/M3X#m30s-vg10">M30S VG10</a></li>
<li><a href='../whatsminer/M3X/#M30SVE40'>M30SVE40</a></li> <li><a href="../whatsminer/M3X#m30s-vg20">M30S VG20</a></li>
<li><a href='../whatsminer/M3X/#M30SVE50'>M30SVE50</a></li> <li><a href="../whatsminer/M3X#m30s-vg30">M30S VG30</a></li>
<li><a href='../whatsminer/M3X/#M30SVE60'>M30SVE60</a></li> <li><a href="../whatsminer/M3X#m30s-vg40">M30S VG40</a></li>
<li><a href='../whatsminer/M3X/#M30SVE70'>M30SVE70</a></li> <li><a href="../whatsminer/M3X#m30s-vh10">M30S VH10</a></li>
<li><a href='../whatsminer/M3X/#M30SVF10'>M30SVF10</a></li> <li><a href="../whatsminer/M3X#m30s-vh20">M30S VH20</a></li>
<li><a href='../whatsminer/M3X/#M30SVF20'>M30SVF20</a></li> <li><a href="../whatsminer/M3X#m30s-vh30">M30S VH30</a></li>
<li><a href='../whatsminer/M3X/#M30SVF30'>M30SVF30</a></li> <li><a href="../whatsminer/M3X#m30s-vh40">M30S VH40</a></li>
<li><a href='../whatsminer/M3X/#M30SVG10'>M30SVG10</a></li> <li><a href="../whatsminer/M3X#m30s-vh50">M30S VH50</a></li>
<li><a href='../whatsminer/M3X/#M30SVG20'>M30SVG20</a></li> <li><a href="../whatsminer/M3X#m30s-vh60">M30S VH60</a></li>
<li><a href='../whatsminer/M3X/#M30SVG30'>M30SVG30</a></li> <li><a href="../whatsminer/M3X#m30s-vi20">M30S VI20</a></li>
<li><a href='../whatsminer/M3X/#M30SVG40'>M30SVG40</a></li> <li><a href="../whatsminer/M3X#m30s_1-v10">M30S+ V10</a></li>
<li><a href='../whatsminer/M3X/#M30SVH10'>M30SVH10</a></li> <li><a href="../whatsminer/M3X#m30s_1-v20">M30S+ V20</a></li>
<li><a href='../whatsminer/M3X/#M30SVH20'>M30SVH20</a></li> <li><a href="../whatsminer/M3X#m30s_1-v30">M30S+ V30</a></li>
<li><a href='../whatsminer/M3X/#M30SVH30'>M30SVH30</a></li> <li><a href="../whatsminer/M3X#m30s_1-v40">M30S+ V40</a></li>
<li><a href='../whatsminer/M3X/#M30SVH40'>M30SVH40</a></li> <li><a href="../whatsminer/M3X#m30s_1-v50">M30S+ V50</a></li>
<li><a href='../whatsminer/M3X/#M30SVH50'>M30SVH50</a></li> <li><a href="../whatsminer/M3X#m30s_1-v60">M30S+ V60</a></li>
<li><a href='../whatsminer/M3X/#M30SVH60'>M30SVH60</a></li> <li><a href="../whatsminer/M3X#m30s_1-v70">M30S+ V70</a></li>
<li><a href='../whatsminer/M3X/#M30SVI20'>M30SVI20</a></li> <li><a href="../whatsminer/M3X#m30s_1-v80">M30S+ V80</a></li>
</ul> <li><a href="../whatsminer/M3X#m30s_1-v90">M30S+ V90</a></li>
</details> <li><a href="../whatsminer/M3X#m30s_1-v100">M30S+ V100</a></li>
<details> <li><a href="../whatsminer/M3X#m30s_1-ve30">M30S+ VE30</a></li>
<summary><a href='../whatsminer/M3X/#M30S_1'>M30S+</a></summary> <li><a href="../whatsminer/M3X#m30s_1-ve40">M30S+ VE40</a></li>
<ul> <li><a href="../whatsminer/M3X#m30s_1-ve50">M30S+ VE50</a></li>
<li><a href='../whatsminer/M3X/#M30S_1V10'>M30S+V10</a></li> <li><a href="../whatsminer/M3X#m30s_1-ve60">M30S+ VE60</a></li>
<li><a href='../whatsminer/M3X/#M30S_1V20'>M30S+V20</a></li> <li><a href="../whatsminer/M3X#m30s_1-ve70">M30S+ VE70</a></li>
<li><a href='../whatsminer/M3X/#M30S_1V30'>M30S+V30</a></li> <li><a href="../whatsminer/M3X#m30s_1-ve80">M30S+ VE80</a></li>
<li><a href='../whatsminer/M3X/#M30S_1V40'>M30S+V40</a></li> <li><a href="../whatsminer/M3X#m30s_1-ve90">M30S+ VE90</a></li>
<li><a href='../whatsminer/M3X/#M30S_1V50'>M30S+V50</a></li> <li><a href="../whatsminer/M3X#m30s_1-ve100">M30S+ VE100</a></li>
<li><a href='../whatsminer/M3X/#M30S_1V60'>M30S+V60</a></li> <li><a href="../whatsminer/M3X#m30s_1-vf20">M30S+ VF20</a></li>
<li><a href='../whatsminer/M3X/#M30S_1V70'>M30S+V70</a></li> <li><a href="../whatsminer/M3X#m30s_1-vf30">M30S+ VF30</a></li>
<li><a href='../whatsminer/M3X/#M30S_1V80'>M30S+V80</a></li> <li><a href="../whatsminer/M3X#m30s_1-vg30">M30S+ VG30</a></li>
<li><a href='../whatsminer/M3X/#M30S_1V90'>M30S+V90</a></li> <li><a href="../whatsminer/M3X#m30s_1-vg40">M30S+ VG40</a></li>
<li><a href='../whatsminer/M3X/#M30S_1V100'>M30S+V100</a></li> <li><a href="../whatsminer/M3X#m30s_1-vg50">M30S+ VG50</a></li>
<li><a href='../whatsminer/M3X/#M30S_1VE30'>M30S+VE30</a></li> <li><a href="../whatsminer/M3X#m30s_1-vg60">M30S+ VG60</a></li>
<li><a href='../whatsminer/M3X/#M30S_1VE40'>M30S+VE40</a></li> <li><a href="../whatsminer/M3X#m30s_1-vh10">M30S+ VH10</a></li>
<li><a href='../whatsminer/M3X/#M30S_1VE50'>M30S+VE50</a></li> <li><a href="../whatsminer/M3X#m30s_1-vh20">M30S+ VH20</a></li>
<li><a href='../whatsminer/M3X/#M30S_1VE60'>M30S+VE60</a></li> <li><a href="../whatsminer/M3X#m30s_1-vh30">M30S+ VH30</a></li>
<li><a href='../whatsminer/M3X/#M30S_1VE70'>M30S+VE70</a></li> <li><a href="../whatsminer/M3X#m30s_1-vh40">M30S+ VH40</a></li>
<li><a href='../whatsminer/M3X/#M30S_1VE80'>M30S+VE80</a></li> <li><a href="../whatsminer/M3X#m30s_1-vh50">M30S+ VH50</a></li>
<li><a href='../whatsminer/M3X/#M30S_1VE90'>M30S+VE90</a></li> <li><a href="../whatsminer/M3X#m30s_1-vh60">M30S+ VH60</a></li>
<li><a href='../whatsminer/M3X/#M30S_1VE100'>M30S+VE100</a></li> <li><a href="../whatsminer/M3X#m30s_1_1-v10">M30S++ V10</a></li>
<li><a href='../whatsminer/M3X/#M30S_1VF20'>M30S+VF20</a></li> <li><a href="../whatsminer/M3X#m30s_1_1-v20">M30S++ V20</a></li>
<li><a href='../whatsminer/M3X/#M30S_1VF30'>M30S+VF30</a></li> <li><a href="../whatsminer/M3X#m30s_1_1-ve30">M30S++ VE30</a></li>
<li><a href='../whatsminer/M3X/#M36S_1VG30'>M36S+VG30</a></li> <li><a href="../whatsminer/M3X#m30s_1_1-ve40">M30S++ VE40</a></li>
<li><a href='../whatsminer/M3X/#M30S_1VG30'>M30S+VG30</a></li> <li><a href="../whatsminer/M3X#m30s_1_1-ve50">M30S++ VE50</a></li>
<li><a href='../whatsminer/M3X/#M30S_1VG40'>M30S+VG40</a></li> <li><a href="../whatsminer/M3X#m30s_1_1-vf40">M30S++ VF40</a></li>
<li><a href='../whatsminer/M3X/#M30S_1VG50'>M30S+VG50</a></li> <li><a href="../whatsminer/M3X#m30s_1_1-vg30">M30S++ VG30</a></li>
<li><a href='../whatsminer/M3X/#M30S_1VG60'>M30S+VG60</a></li> <li><a href="../whatsminer/M3X#m30s_1_1-vg40">M30S++ VG40</a></li>
<li><a href='../whatsminer/M3X/#M30S_1VH10'>M30S+VH10</a></li> <li><a href="../whatsminer/M3X#m30s_1_1-vg50">M30S++ VG50</a></li>
<li><a href='../whatsminer/M3X/#M30S_1VH20'>M30S+VH20</a></li> <li><a href="../whatsminer/M3X#m30s_1_1-vh10">M30S++ VH10</a></li>
<li><a href='../whatsminer/M3X/#M30S_1VH30'>M30S+VH30</a></li> <li><a href="../whatsminer/M3X#m30s_1_1-vh20">M30S++ VH20</a></li>
<li><a href='../whatsminer/M3X/#M30S_1VH40'>M30S+VH40</a></li> <li><a href="../whatsminer/M3X#m30s_1_1-vh30">M30S++ VH30</a></li>
<li><a href='../whatsminer/M3X/#M30S_1VH50'>M30S+VH50</a></li> <li><a href="../whatsminer/M3X#m30s_1_1-vh40">M30S++ VH40</a></li>
<li><a href='../whatsminer/M3X/#M30S_1VH60'>M30S+VH60</a></li> <li><a href="../whatsminer/M3X#m30s_1_1-vh50">M30S++ VH50</a></li>
</ul> <li><a href="../whatsminer/M3X#m30s_1_1-vh60">M30S++ VH60</a></li>
</details> <li><a href="../whatsminer/M3X#m30s_1_1-vh70">M30S++ VH70</a></li>
<details> <li><a href="../whatsminer/M3X#m30s_1_1-vh80">M30S++ VH80</a></li>
<summary><a href='../whatsminer/M3X/#M30S_2'>M30S++</a></summary> <li><a href="../whatsminer/M3X#m30s_1_1-vh90">M30S++ VH90</a></li>
<ul> <li><a href="../whatsminer/M3X#m30s_1_1-vh100">M30S++ VH100</a></li>
<li><a href='../whatsminer/M3X/#M30S_2V10'>M30S++V10</a></li> <li><a href="../whatsminer/M3X#m30s_1_1-vj20">M30S++ VJ20</a></li>
<li><a href='../whatsminer/M3X/#M30S_2V20'>M30S++V20</a></li> <li><a href="../whatsminer/M3X#m30s_1_1-vj30">M30S++ VJ30</a></li>
<li><a href='../whatsminer/M3X/#M30S_2VE30'>M30S++VE30</a></li> <li><a href="../whatsminer/M3X#m31-v10">M31 V10</a></li>
<li><a href='../whatsminer/M3X/#M30S_2VE40'>M30S++VE40</a></li> <li><a href="../whatsminer/M3X#m31-v20">M31 V20</a></li>
<li><a href='../whatsminer/M3X/#M30S_2VE50'>M30S++VE50</a></li> <li><a href="../whatsminer/M3X#m31s-v10">M31S V10</a></li>
<li><a href='../whatsminer/M3X/#M30S_2VF40'>M30S++VF40</a></li> <li><a href="../whatsminer/M3X#m31s-v20">M31S V20</a></li>
<li><a href='../whatsminer/M3X/#M30S_2VG30'>M30S++VG30</a></li> <li><a href="../whatsminer/M3X#m31s-v30">M31S V30</a></li>
<li><a href='../whatsminer/M3X/#M30S_2VG40'>M30S++VG40</a></li> <li><a href="../whatsminer/M3X#m31s-v40">M31S V40</a></li>
<li><a href='../whatsminer/M3X/#M30S_2VG50'>M30S++VG50</a></li> <li><a href="../whatsminer/M3X#m31s-v50">M31S V50</a></li>
<li><a href='../whatsminer/M3X/#M30S_2VH10'>M30S++VH10</a></li> <li><a href="../whatsminer/M3X#m31s-v60">M31S V60</a></li>
<li><a href='../whatsminer/M3X/#M30S_2VH20'>M30S++VH20</a></li> <li><a href="../whatsminer/M3X#m31s-v70">M31S V70</a></li>
<li><a href='../whatsminer/M3X/#M30S_2VH30'>M30S++VH30</a></li> <li><a href="../whatsminer/M3X#m31s-v80">M31S V80</a></li>
<li><a href='../whatsminer/M3X/#M30S_2VH40'>M30S++VH40</a></li> <li><a href="../whatsminer/M3X#m31s-v90">M31S V90</a></li>
<li><a href='../whatsminer/M3X/#M30S_2VH50'>M30S++VH50</a></li> <li><a href="../whatsminer/M3X#m31s-ve10">M31S VE10</a></li>
<li><a href='../whatsminer/M3X/#M30S_2VH60'>M30S++VH60</a></li> <li><a href="../whatsminer/M3X#m31s-ve20">M31S VE20</a></li>
<li><a href='../whatsminer/M3X/#M30S_2VH70'>M30S++VH70</a></li> <li><a href="../whatsminer/M3X#m31s-ve30">M31S VE30</a></li>
<li><a href='../whatsminer/M3X/#M30S_2VH80'>M30S++VH80</a></li> <li><a href="../whatsminer/M3X#m31se-v10">M31SE V10</a></li>
<li><a href='../whatsminer/M3X/#M30S_2VH90'>M30S++VH90</a></li> <li><a href="../whatsminer/M3X#m31se-v20">M31SE V20</a></li>
<li><a href='../whatsminer/M3X/#M30S_2VH100'>M30S++VH100</a></li> <li><a href="../whatsminer/M3X#m31se-v30">M31SE V30</a></li>
<li><a href='../whatsminer/M3X/#M30S_2VJ20'>M30S++VJ20</a></li> <li><a href="../whatsminer/M3X#m31h-v40">M31H V40</a></li>
<li><a href='../whatsminer/M3X/#M30S_2VJ30'>M30S++VJ30</a></li> <li><a href="../whatsminer/M3X#m31s_1-v10">M31S+ V10</a></li>
</ul> <li><a href="../whatsminer/M3X#m31s_1-v20">M31S+ V20</a></li>
</details> <li><a href="../whatsminer/M3X#m31s_1-v30">M31S+ V30</a></li>
<details> <li><a href="../whatsminer/M3X#m31s_1-v40">M31S+ V40</a></li>
<summary><a href='../whatsminer/M3X/#M31'>M31</a></summary> <li><a href="../whatsminer/M3X#m31s_1-v50">M31S+ V50</a></li>
<ul> <li><a href="../whatsminer/M3X#m31s_1-v60">M31S+ V60</a></li>
<li><a href='../whatsminer/M3X/#M31V10'>M31V10</a></li> <li><a href="../whatsminer/M3X#m31s_1-v80">M31S+ V80</a></li>
<li><a href='../whatsminer/M3X/#M31V20'>M31V20</a></li> <li><a href="../whatsminer/M3X#m31s_1-v90">M31S+ V90</a></li>
</ul> <li><a href="../whatsminer/M3X#m31s_1-v100">M31S+ V100</a></li>
</details> <li><a href="../whatsminer/M3X#m31s_1-ve10">M31S+ VE10</a></li>
<details> <li><a href="../whatsminer/M3X#m31s_1-ve20">M31S+ VE20</a></li>
<summary><a href='../whatsminer/M3X/#M31S'>M31S</a></summary> <li><a href="../whatsminer/M3X#m31s_1-ve30">M31S+ VE30</a></li>
<ul> <li><a href="../whatsminer/M3X#m31s_1-ve40">M31S+ VE40</a></li>
<li><a href='../whatsminer/M3X/#M31SV10'>M31SV10</a></li> <li><a href="../whatsminer/M3X#m31s_1-ve50">M31S+ VE50</a></li>
<li><a href='../whatsminer/M3X/#M31SV20'>M31SV20</a></li> <li><a href="../whatsminer/M3X#m31s_1-ve60">M31S+ VE60</a></li>
<li><a href='../whatsminer/M3X/#M31SV30'>M31SV30</a></li> <li><a href="../whatsminer/M3X#m31s_1-ve80">M31S+ VE80</a></li>
<li><a href='../whatsminer/M3X/#M31SV40'>M31SV40</a></li> <li><a href="../whatsminer/M3X#m31s_1-vf20">M31S+ VF20</a></li>
<li><a href='../whatsminer/M3X/#M31SV50'>M31SV50</a></li> <li><a href="../whatsminer/M3X#m31s_1-vf30">M31S+ VF30</a></li>
<li><a href='../whatsminer/M3X/#M31SV60'>M31SV60</a></li> <li><a href="../whatsminer/M3X#m31s_1-vg20">M31S+ VG20</a></li>
<li><a href='../whatsminer/M3X/#M31SV70'>M31SV70</a></li> <li><a href="../whatsminer/M3X#m31s_1-vg30">M31S+ VG30</a></li>
<li><a href='../whatsminer/M3X/#M31SV80'>M31SV80</a></li> <li><a href="../whatsminer/M3X#m32-v10">M32 V10</a></li>
<li><a href='../whatsminer/M3X/#M31SV90'>M31SV90</a></li> <li><a href="../whatsminer/M3X#m32-v20">M32 V20</a></li>
<li><a href='../whatsminer/M3X/#M31SVE10'>M31SVE10</a></li> <li><a href="../whatsminer/M3X#m33-v10">M33 V10</a></li>
<li><a href='../whatsminer/M3X/#M31SVE20'>M31SVE20</a></li> <li><a href="../whatsminer/M3X#m33-v20">M33 V20</a></li>
<li><a href='../whatsminer/M3X/#M31SVE30'>M31SVE30</a></li> <li><a href="../whatsminer/M3X#m33-v30">M33 V30</a></li>
</ul> <li><a href="../whatsminer/M3X#m33s-vg30">M33S VG30</a></li>
</details> <li><a href="../whatsminer/M3X#m33s_1-vh20">M33S+ VH20</a></li>
<details> <li><a href="../whatsminer/M3X#m33s_1-vh30">M33S+ VH30</a></li>
<summary><a href='../whatsminer/M3X/#M31SE'>M31SE</a></summary> <li><a href="../whatsminer/M3X#m33s_1_1-vh20">M33S++ VH20</a></li>
<ul> <li><a href="../whatsminer/M3X#m33s_1_1-vh30">M33S++ VH30</a></li>
<li><a href='../whatsminer/M3X/#M31SEV10'>M31SEV10</a></li> <li><a href="../whatsminer/M3X#m33s_1_1-vg40">M33S++ VG40</a></li>
<li><a href='../whatsminer/M3X/#M31SEV20'>M31SEV20</a></li> <li><a href="../whatsminer/M3X#m34s_1-ve10">M34S+ VE10</a></li>
<li><a href='../whatsminer/M3X/#M31SEV30'>M31SEV30</a></li> <li><a href="../whatsminer/M3X#m36s-ve10">M36S VE10</a></li>
</ul> <li><a href="../whatsminer/M3X#m36s_1-vg30">M36S+ VG30</a></li>
</details> <li><a href="../whatsminer/M3X#m36s_1_1-vh30">M36S++ VH30</a></li>
<details> <li><a href="../whatsminer/M3X#m39-v20">M39 V20</a></li>
<summary><a href='../whatsminer/M3X/#M31H'>M31H</a></summary> </ul>
<ul>
<li><a href='../whatsminer/M3X/#M31HV40'>M31HV40</a></li>
</ul>
</details>
<details>
<summary><a href='../whatsminer/M3X/#M31S_1'>M31S+</a></summary>
<ul>
<li><a href='../whatsminer/M3X/#M31S_1V10'>M31S+V10</a></li>
<li><a href='../whatsminer/M3X/#M31S_1V20'>M31S+V20</a></li>
<li><a href='../whatsminer/M3X/#M31S_1V30'>M31S+V30</a></li>
<li><a href='../whatsminer/M3X/#M31S_1V40'>M31S+V40</a></li>
<li><a href='../whatsminer/M3X/#M31S_1V50'>M31S+V50</a></li>
<li><a href='../whatsminer/M3X/#M31S_1V60'>M31S+V60</a></li>
<li><a href='../whatsminer/M3X/#M31S_1V80'>M31S+V80</a></li>
<li><a href='../whatsminer/M3X/#M31S_1V90'>M31S+V90</a></li>
<li><a href='../whatsminer/M3X/#M31S_1V100'>M31S+V100</a></li>
<li><a href='../whatsminer/M3X/#M31S_1VE10'>M31S+VE10</a></li>
<li><a href='../whatsminer/M3X/#M31S_1VE20'>M31S+VE20</a></li>
<li><a href='../whatsminer/M3X/#M31S_1VE30'>M31S+VE30</a></li>
<li><a href='../whatsminer/M3X/#M31S_1VE40'>M31S+VE40</a></li>
<li><a href='../whatsminer/M3X/#M31S_1VE50'>M31S+VE50</a></li>
<li><a href='../whatsminer/M3X/#M31S_1VE60'>M31S+VE60</a></li>
<li><a href='../whatsminer/M3X/#M31S_1VE80'>M31S+VE80</a></li>
<li><a href='../whatsminer/M3X/#M31S_1VF20'>M31S+VF20</a></li>
<li><a href='../whatsminer/M3X/#M31S_1VF30'>M31S+VF30</a></li>
<li><a href='../whatsminer/M3X/#M31S_1VG20'>M31S+VG20</a></li>
<li><a href='../whatsminer/M3X/#M31S_1VG30'>M31S+VG30</a></li>
</ul>
</details>
<details>
<summary><a href='../whatsminer/M3X/#M32'>M32</a></summary>
<ul>
<li><a href='../whatsminer/M3X/#M32V10'>M32V10</a></li>
<li><a href='../whatsminer/M3X/#M32V20'>M32V20</a></li>
</ul>
</details>
<details>
<summary><a href='../whatsminer/M3X/#M33'>M33</a></summary>
<ul>
<li><a href='../whatsminer/M3X/#M33V10'>M33V10</a></li>
<li><a href='../whatsminer/M3X/#M33V20'>M33V20</a></li>
<li><a href='../whatsminer/M3X/#M33V30'>M33V30</a></li>
</ul>
</details>
<details>
<summary><a href='../whatsminer/M3X/#M33S'>M33S</a></summary>
<ul>
<li><a href='../whatsminer/M3X/#M33SVG30'>M33SVG30</a></li>
</ul>
</details>
<details>
<summary><a href='../whatsminer/M3X/#M33S_1'>M33S+</a></summary>
<ul>
<li><a href='../whatsminer/M3X/#M33S_1VH20'>M33S+VH20</a></li>
<li><a href='../whatsminer/M3X/#M33S_1VH30'>M33S+VH30</a></li>
</ul>
</details>
<details>
<summary><a href='../whatsminer/M3X/#M33S_2'>M33S++</a></summary>
<ul>
<li><a href='../whatsminer/M3X/#M33S_2VH20'>M33S++VH20</a></li>
<li><a href='../whatsminer/M3X/#M33S_2VH30'>M33S++VH30</a></li>
<li><a href='../whatsminer/M3X/#M33S_2VG40'>M33S++VG40</a></li>
</ul>
</details>
<details>
<summary><a href='../whatsminer/M3X/#M34S_1'>M34S+</a></summary>
<ul>
<li><a href='../whatsminer/M3X/#M34S_1VE10'>M34S+VE10</a></li>
</ul>
</details>
<details>
<summary><a href='../whatsminer/M3X/#M36S'>M36S</a></summary>
<ul>
<li><a href='../whatsminer/M3X/#M36SVE10'>M36SVE10</a></li>
</ul>
</details>
<details>
<summary><a href='../whatsminer/M3X/#M36S_1'>M36S+</a></summary>
<ul>
<li><a href='../whatsminer/M3X/#M36S_1VG30'>M36S+VG30</a></li>
</ul>
</details>
<details>
<summary><a href='../whatsminer/M3X/#M36S_2'>M36S++</a></summary>
<ul>
<li><a href='../whatsminer/M3X/#M36S_2VH30'>M36S++VH30</a></li>
</ul>
</details>
<details>
<summary><a href='../whatsminer/M3X/#M39'>M39</a></summary>
<ul>
<li><a href='../whatsminer/M3X/#M39V20'>M39V20</a></li>
</ul>
</details>
</ul>
</details> </details>
<details> <details>
<summary>M5X Series:</summary> <summary>M5X Series:</summary>
<ul> <ul>
<details> <li><a href="../whatsminer/M5X#m50-vg30">M50 VG30</a></li>
<summary><a href='../whatsminer/M5X/#M50'>M50</a></summary> <li><a href="../whatsminer/M5X#m50-vh10">M50 VH10</a></li>
<ul> <li><a href="../whatsminer/M5X#m50-vh20">M50 VH20</a></li>
<li><a href='../whatsminer/M5X/#M50VG30'>M50VG30</a></li> <li><a href="../whatsminer/M5X#m50-vh30">M50 VH30</a></li>
<li><a href='../whatsminer/M5X/#M50VH10'>M50VH10</a></li> <li><a href="../whatsminer/M5X#m50-vh40">M50 VH40</a></li>
<li><a href='../whatsminer/M5X/#M50VH20'>M50VH20</a></li> <li><a href="../whatsminer/M5X#m50-vh50">M50 VH50</a></li>
<li><a href='../whatsminer/M5X/#M50VH30'>M50VH30</a></li> <li><a href="../whatsminer/M5X#m50-vh60">M50 VH60</a></li>
<li><a href='../whatsminer/M5X/#M50VH40'>M50VH40</a></li> <li><a href="../whatsminer/M5X#m50-vh70">M50 VH70</a></li>
<li><a href='../whatsminer/M5X/#M50VH50'>M50VH50</a></li> <li><a href="../whatsminer/M5X#m50-vh80">M50 VH80</a></li>
<li><a href='../whatsminer/M5X/#M50VH60'>M50VH60</a></li> <li><a href="../whatsminer/M5X#m50-vj10">M50 VJ10</a></li>
<li><a href='../whatsminer/M5X/#M50VH70'>M50VH70</a></li> <li><a href="../whatsminer/M5X#m50-vj20">M50 VJ20</a></li>
<li><a href='../whatsminer/M5X/#M50VH80'>M50VH80</a></li> <li><a href="../whatsminer/M5X#m50-vj30">M50 VJ30</a></li>
<li><a href='../whatsminer/M5X/#M50VJ10'>M50VJ10</a></li> <li><a href="../whatsminer/M5X#m50s-vj10">M50S VJ10</a></li>
<li><a href='../whatsminer/M5X/#M50VJ20'>M50VJ20</a></li> <li><a href="../whatsminer/M5X#m50s-vj20">M50S VJ20</a></li>
<li><a href='../whatsminer/M5X/#M50VJ30'>M50VJ30</a></li> <li><a href="../whatsminer/M5X#m50s-vj30">M50S VJ30</a></li>
</ul> <li><a href="../whatsminer/M5X#m50s-vh10">M50S VH10</a></li>
</details> <li><a href="../whatsminer/M5X#m50s-vh20">M50S VH20</a></li>
<details> <li><a href="../whatsminer/M5X#m50s-vh30">M50S VH30</a></li>
<summary><a href='../whatsminer/M5X/#M50S'>M50S</a></summary> <li><a href="../whatsminer/M5X#m50s-vh40">M50S VH40</a></li>
<ul> <li><a href="../whatsminer/M5X#m50s-vh50">M50S VH50</a></li>
<li><a href='../whatsminer/M5X/#M50SVJ10'>M50SVJ10</a></li> <li><a href="../whatsminer/M5X#m50s_1-vh30">M50S+ VH30</a></li>
<li><a href='../whatsminer/M5X/#M50SVJ20'>M50SVJ20</a></li> <li><a href="../whatsminer/M5X#m50s_1-vh40">M50S+ VH40</a></li>
<li><a href='../whatsminer/M5X/#M50SVJ30'>M50SVJ30</a></li> <li><a href="../whatsminer/M5X#m50s_1-vj30">M50S+ VJ30</a></li>
<li><a href='../whatsminer/M5X/#M50SVH10'>M50SVH10</a></li> <li><a href="../whatsminer/M5X#m50s_1-vk20">M50S+ VK20</a></li>
<li><a href='../whatsminer/M5X/#M50SVH20'>M50SVH20</a></li> <li><a href="../whatsminer/M5X#m50s_1_1-vk10">M50S++ VK10</a></li>
<li><a href='../whatsminer/M5X/#M50SVH30'>M50SVH30</a></li> <li><a href="../whatsminer/M5X#m50s_1_1-vk20">M50S++ VK20</a></li>
<li><a href='../whatsminer/M5X/#M50SVH40'>M50SVH40</a></li> <li><a href="../whatsminer/M5X#m50s_1_1-vk30">M50S++ VK30</a></li>
<li><a href='../whatsminer/M5X/#M50SVH50'>M50SVH50</a></li> <li><a href="../whatsminer/M5X#m53-vh30">M53 VH30</a></li>
</ul> <li><a href="../whatsminer/M5X#m53s-vh30">M53S VH30</a></li>
</details> <li><a href="../whatsminer/M5X#m53s_1-vj30">M53S+ VJ30</a></li>
<details> <li><a href="../whatsminer/M5X#m56-vh30">M56 VH30</a></li>
<summary><a href='../whatsminer/M5X/#M50S_1'>M50S+</a></summary> <li><a href="../whatsminer/M5X#m56s-vh30">M56S VH30</a></li>
<ul> <li><a href="../whatsminer/M5X#m56s_1-vj30">M56S+ VJ30</a></li>
<li><a href='../whatsminer/M5X/#M50S_1VH30'>M50S+VH30</a></li> <li><a href="../whatsminer/M5X#m59-vh30">M59 VH30</a></li>
<li><a href='../whatsminer/M5X/#M50S_1VH40'>M50S+VH40</a></li> </ul>
<li><a href='../whatsminer/M5X/#M50S_1VJ30'>M50S+VJ30</a></li>
</ul>
</details>
<details>
<summary><a href='../whatsminer/M5X/#M53'>M53</a></summary>
<ul>
<li><a href='../whatsminer/M5X/#M53VH30'>M53VH30</a></li>
</ul>
</details>
<details>
<summary><a href='../whatsminer/M5X/#M53S'>M53S</a></summary>
<ul>
<li><a href='../whatsminer/M5X/#M53SVH30'>M53SVH30</a></li>
</ul>
</details>
<details>
<summary><a href='../whatsminer/M5X/#M53S_1'>M53S+</a></summary>
<ul>
<li><a href='../whatsminer/M5X/#M53S_1VJ30'>M53S+VJ30</a></li>
</ul>
</details>
<details>
<summary><a href='../whatsminer/M5X/#M56'>M56</a></summary>
<ul>
<li><a href='../whatsminer/M5X/#M56VH30'>M56VH30</a></li>
</ul>
</details>
<details>
<summary><a href='../whatsminer/M5X/#M56S'>M56S</a></summary>
<ul>
<li><a href='../whatsminer/M5X/#M56SVH30'>M56SVH30</a></li>
</ul>
</details>
<details>
<summary><a href='../whatsminer/M5X/#M56S_1'>M56S+</a></summary>
<ul>
<li><a href='../whatsminer/M5X/#M56S_1VJ30'>M56S+VJ30</a></li>
</ul>
</details>
<details>
<summary><a href='../whatsminer/M5X/#M59'>M59</a></summary>
<ul>
<li><a href='../whatsminer/M5X/#M59VH30'>M59VH30</a></li>
</ul>
</details>
</ul>
</details>
</ul>
</details>
<details>
<summary>Stock Firmware Antminers:</summary>
<ul>
<details>
<summary>X19 Series:</summary>
<ul>
<li><a href="../antminer/X19/#s19">S19</a></li>
<li><a href="../antminer/X19/#s19l">S19L</a></li>
<li><a href="../antminer/X19/#s19-pro">S19 Pro</a></li>
<li><a href="../antminer/X19/#s19a">S19a</a></li>
<li><a href="../antminer/X19/#s19j">S19j</a></li>
<li><a href="../antminer/X19/#s19j-pro">S19j Pro</a></li>
<li><a href="../antminer/X19/#s19-xp">S19 XP</a></li>
<li><a href="../antminer/X19/#t19">T19</a></li>
</ul>
</details>
<details>
<summary>X17 Series:</summary>
<ul>
<li><a href="../antminer/X17/#s17">S17</a></li>
<li><a href="../antminer/X17/#s17_1">S17+</a></li>
<li><a href="../antminer/X17/#s17-pro">S17 Pro</a></li>
<li><a href="../antminer/X17/#s17e">S17e</a></li>
<li><a href="../antminer/X17/#t17">T17</a></li>
<li><a href="../antminer/X17/#t17_1">T17+</a></li>
<li><a href="../antminer/X17/#t17e">T17e</a></li>
</ul>
</details>
<details>
<summary>X15 Series:</summary>
<ul>
<li><a href="../antminer/X15/#z15">Z15</a></li>
</ul>
</details>
<details>
<summary>X9 Series:</summary>
<ul>
<li><a href="../antminer/X9/#s9">S9</a></li>
<li><a href="../antminer/X9/#s9i">S9i</a></li>
<li><a href="../antminer/X9/#t9">T9</a></li>
<li><a href="../antminer/X9/#e9-pro">E9 Pro</a></li>
</ul>
</details>
<details>
<summary>X7 Series:</summary>
<ul>
<li><a href="../antminer/X7/#l7">L7</a></li>
</ul>
</details>
<details>
<summary>X5 Series:</summary>
<ul>
<li><a href="../antminer/X5/#dr5">DR5</a></li>
</ul>
</details>
<details>
<summary>X3 Series:</summary>
<ul>
<li><a href="../antminer/X3/#hs3">HS3</a></li>
</ul>
</details> </details>
</ul> </ul>
</details> </details>
@@ -492,75 +286,157 @@ details {
<summary>Stock Firmware Avalonminers:</summary> <summary>Stock Firmware Avalonminers:</summary>
<ul> <ul>
<details> <details>
<summary>A7X Series:</summary> <summary>A7X Series:</summary>
<ul> <ul>
<li><a href="../avalonminer/A7X/#a721">A721</a></li> <li><a href="../avalonminer/A7X#avalon-721">Avalon 721</a></li>
<li><a href="../avalonminer/A7X/#a741">A741</a></li> <li><a href="../avalonminer/A7X#avalon-741">Avalon 741</a></li>
<li><a href="../avalonminer/A7X/#a761">A761</a></li> <li><a href="../avalonminer/A7X#avalon-761">Avalon 761</a></li>
</ul> </ul>
</details> </details>
<details> <details>
<summary>A8X Series:</summary> <summary>A8X Series:</summary>
<ul> <ul>
<li><a href="../avalonminer/A8X/#a821">A821</a></li> <li><a href="../avalonminer/A8X#avalon-821">Avalon 821</a></li>
<li><a href="../avalonminer/A8X/#a841">A841</a></li> <li><a href="../avalonminer/A8X#avalon-841">Avalon 841</a></li>
<li><a href="../avalonminer/A8X/#a851">A851</a></li> <li><a href="../avalonminer/A8X#avalon-851">Avalon 851</a></li>
</ul> </ul>
</details> </details>
<details> <details>
<summary>A9X Series:</summary> <summary>A9X Series:</summary>
<ul> <ul>
<li><a href="../avalonminer/A9X/#a921">A921</a></li> <li><a href="../avalonminer/A9X#avalon-921">Avalon 921</a></li>
</ul> </ul>
</details> </details>
<details> <details>
<summary>A10X Series:</summary> <summary>A10X Series:</summary>
<ul> <ul>
<li><a href="../avalonminer/A10X/#a1026">A1026</a></li> <li><a href="../avalonminer/A10X#avalon-1026">Avalon 1026</a></li>
<li><a href="../avalonminer/A10X/#a1047">A1047</a></li> <li><a href="../avalonminer/A10X#avalon-1047">Avalon 1047</a></li>
<li><a href="../avalonminer/A10X/#a1066">A1066</a></li> <li><a href="../avalonminer/A10X#avalon-1066">Avalon 1066</a></li>
</ul> </ul>
</details>
<details>
<summary>A11X Series:</summary>
<ul>
<li><a href="../avalonminer/A11X#avalon-1166-pro">Avalon 1166 Pro</a></li>
</ul>
</details>
<details>
<summary>A12X Series:</summary>
<ul>
<li><a href="../avalonminer/A12X#avalon-1246">Avalon 1246</a></li>
</ul>
</details> </details>
</ul> </ul>
</details> </details>
<details> <details>
<summary>Stock Firmware Innosilicon Miners:</summary> <summary>Stock Firmware Innosilicons:</summary>
<ul> <ul>
<details> <details>
<summary>T3X Series:</summary> <summary>T3X Series:</summary>
<ul> <ul>
<li><a href="../innosilicon/T3X/#t3h">T3H+</a></li> <li><a href="../innosilicon/T3X#t3h_1">T3H+</a></li>
</ul> </ul>
</details> </details>
<details> <details>
<summary>A10X Series:</summary> <summary>A10X Series:</summary>
<ul> <ul>
<li><a href="../innosilicon/A10X/#a10x">A10X</a></li> <li><a href="../innosilicon/A10X#a10x">A10X</a></li>
</ul> </ul>
</details> </details>
</ul> </ul>
</details> </details>
<details> <details>
<summary>Stock Firmware BFGMinerGoldshell Miners:</summary> <summary>Stock Firmware Goldshells:</summary>
<ul> <ul>
<details> <details>
<summary>CKX Series:</summary> <summary>X5 Series:</summary>
<ul> <ul>
<li><a href="../goldshell/CKX/#ck5">CK5</a></li> <li><a href="../goldshell/X5#ck5">CK5</a></li>
</ul> <li><a href="../goldshell/X5#hs5">HS5</a></li>
<li><a href="../goldshell/X5#kd5">KD5</a></li>
</ul>
</details> </details>
<details> <details>
<summary>HSX Series:</summary> <summary>XMax Series:</summary>
<ul> <ul>
<li><a href="../goldshell/HSX/#hs5">HS5</a></li> <li><a href="../goldshell/XMax#kd-max">KD Max</a></li>
</ul> </ul>
</details>
<details>
<summary>KDX Series:</summary>
<ul>
<li><a href="../goldshell/KDX/#kd5">KD5</a></li>
<li><a href="../goldshell/KDX/#kd-max">KD Max</a></li>
</ul>
</details> </details>
</ul> </ul>
</details> </details>
<details>
<summary>BOS+ Firmware Miners:</summary>
<ul>
<details>
<summary>X9 Series:</summary>
<ul>
<li><a href="../antminer/X9#s9-bos">S9 (BOS)</a></li>
</ul>
</details>
<details>
<summary>X17 Series:</summary>
<ul>
<li><a href="../antminer/X17#s17-bos">S17 (BOS)</a></li>
<li><a href="../antminer/X17#s17_1-bos">S17+ (BOS)</a></li>
<li><a href="../antminer/X17#s17-pro-bos">S17 Pro (BOS)</a></li>
<li><a href="../antminer/X17#s17e-bos">S17e (BOS)</a></li>
<li><a href="../antminer/X17#t17-bos">T17 (BOS)</a></li>
<li><a href="../antminer/X17#t17_1-bos">T17+ (BOS)</a></li>
<li><a href="../antminer/X17#t17e-bos">T17e (BOS)</a></li>
</ul>
</details>
<details>
<summary>X19 Series:</summary>
<ul>
<li><a href="../antminer/X19#s19-bos">S19 (BOS)</a></li>
<li><a href="../antminer/X19#s19-pro-bos">S19 Pro (BOS)</a></li>
<li><a href="../antminer/X19#s19j-bos">S19j (BOS)</a></li>
<li><a href="../antminer/X19#s19j-no-pic-bos">S19j No PIC (BOS)</a></li>
<li><a href="../antminer/X19#s19j-pro-bos">S19j Pro (BOS)</a></li>
<li><a href="../antminer/X19#t19-bos">T19 (BOS)</a></li>
</ul>
</details>
</ul>
</details>
<details>
<summary>Vnish Firmware Miners:</summary>
<ul>
<details>
<summary>X3 Series:</summary>
<ul>
<li><a href="../antminer/X3#l3_1-vnish">L3+ (VNish)</a></li>
</ul>
</details>
<details>
<summary>X17 Series:</summary>
<ul>
<li><a href="../antminer/X17#s17_1-vnish">S17+ (VNish)</a></li>
<li><a href="../antminer/X17#s17-pro-vnish">S17 Pro (VNish)</a></li>
</ul>
</details>
<details>
<summary>X19 Series:</summary>
<ul>
<li><a href="../antminer/X19#s19-vnish">S19 (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-pro-vnish">S19j Pro (VNish)</a></li>
<li><a href="../antminer/X19#s19a-vnish">S19a (VNish)</a></li>
<li><a href="../antminer/X19#s19a-pro-vnish">S19a Pro (VNish)</a></li>
<li><a href="../antminer/X19#t19-vnish">T19 (VNish)</a></li>
</ul>
</details>
</ul>
</details>
<details>
<summary>HiveOS Firmware Miners:</summary>
<ul>
<details>
<summary>X9 Series:</summary>
<ul>
<li><a href="../antminer/X9#t9-hiveon">T9 (Hiveon)</a></li>
</ul>
</details>
</ul>
</details>

View File

@@ -1,90 +1,80 @@
# pyasic # pyasic
## M2X Models ## M2X Models
## M20V10 ## M20 V10
::: pyasic.miners.whatsminer.btminer.M2X.M20.BTMinerM20V10
::: pyasic.miners.btc.whatsminer.btminer.M2X.M20.BTMinerM20V10
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M20SV10 ## M20S V10
::: pyasic.miners.whatsminer.btminer.M2X.M20S.BTMinerM20SV10
::: pyasic.miners.btc.whatsminer.btminer.M2X.M20S.BTMinerM20SV10
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M20SV20 ## M20S V20
::: pyasic.miners.whatsminer.btminer.M2X.M20S.BTMinerM20SV20
::: pyasic.miners.btc.whatsminer.btminer.M2X.M20S.BTMinerM20SV20
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M20SV30 ## M20S V30
::: pyasic.miners.whatsminer.btminer.M2X.M20S.BTMinerM20SV30
::: pyasic.miners.btc.whatsminer.btminer.M2X.M20S.BTMinerM20SV30
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M20S+V30 ## M20S+ V30
::: pyasic.miners.whatsminer.btminer.M2X.M20S_Plus.BTMinerM20SPlusV30
::: pyasic.miners.btc.whatsminer.btminer.M2X.M20S_Plus.BTMinerM20SPlusV30
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M21V10 ## M21 V10
::: pyasic.miners.whatsminer.btminer.M2X.M21.BTMinerM21V10
::: pyasic.miners.btc.whatsminer.btminer.M2X.M21.BTMinerM21V10
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M21SV20 ## M21S V20
::: pyasic.miners.whatsminer.btminer.M2X.M21S.BTMinerM21SV20
::: pyasic.miners.btc.whatsminer.btminer.M2X.M21S.BTMinerM21SV20
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M21SV60 ## M21S V60
::: pyasic.miners.whatsminer.btminer.M2X.M21S.BTMinerM21SV60
::: pyasic.miners.btc.whatsminer.btminer.M2X.M21S.BTMinerM21SV60
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M21SV70 ## M21S V70
::: pyasic.miners.whatsminer.btminer.M2X.M21S.BTMinerM21SV70
::: pyasic.miners.btc.whatsminer.btminer.M2X.M21S.BTMinerM21SV70
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M21S+V20 ## M21S+ V20
::: pyasic.miners.whatsminer.btminer.M2X.M21S_Plus.BTMinerM21SPlusV20
::: pyasic.miners.btc.whatsminer.btminer.M2X.M21S_Plus.BTMinerM21SPlusV20
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M29V10 ## M29 V10
::: pyasic.miners.whatsminer.btminer.M2X.M29.BTMinerM29V10
::: pyasic.miners.btc.whatsminer.btminer.M2X.M29.BTMinerM29V10
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4

File diff suppressed because it is too large Load Diff

View File

@@ -1,242 +1,241 @@
# pyasic # pyasic
## M5X Models ## M5X Models
## M50VG30 ## M50 VG30
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VG30
::: pyasic.miners.btc.whatsminer.btminer.M5X.M50.BTMinerM50VG30
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M50VH10 ## M50 VH10
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH10
::: pyasic.miners.btc.whatsminer.btminer.M5X.M50.BTMinerM50VH10
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M50VH20 ## M50 VH20
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH20
::: pyasic.miners.btc.whatsminer.btminer.M5X.M50.BTMinerM50VH20
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M50VH30 ## M50 VH30
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH30
::: pyasic.miners.btc.whatsminer.btminer.M5X.M50.BTMinerM50VH30
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M50VH40 ## M50 VH40
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH40
::: pyasic.miners.btc.whatsminer.btminer.M5X.M50.BTMinerM50VH40
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M50VH50 ## M50 VH50
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH50
::: pyasic.miners.btc.whatsminer.btminer.M5X.M50.BTMinerM50VH50
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M50VH60 ## M50 VH60
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH60
::: pyasic.miners.btc.whatsminer.btminer.M5X.M50.BTMinerM50VH60
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M50VH70 ## M50 VH70
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH70
::: pyasic.miners.btc.whatsminer.btminer.M5X.M50.BTMinerM50VH70
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M50VH80 ## M50 VH80
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH80
::: pyasic.miners.btc.whatsminer.btminer.M5X.M50.BTMinerM50VH80
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M50VJ10 ## M50 VJ10
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VJ10
::: pyasic.miners.btc.whatsminer.btminer.M5X.M50.BTMinerM50VJ10
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M50VJ20 ## M50 VJ20
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VJ20
::: pyasic.miners.btc.whatsminer.btminer.M5X.M50.BTMinerM50VJ20
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M50VJ30 ## M50 VJ30
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VJ30
::: pyasic.miners.btc.whatsminer.btminer.M5X.M50.BTMinerM50VJ30
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M50SVJ10 ## M50S VJ10
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVJ10
::: pyasic.miners.btc.whatsminer.btminer.M5X.M50S.BTMinerM50SVJ10
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M50SVJ20 ## M50S VJ20
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVJ20
::: pyasic.miners.btc.whatsminer.btminer.M5X.M50S.BTMinerM50SVJ20
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M50SVJ30 ## M50S VJ30
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVJ30
::: pyasic.miners.btc.whatsminer.btminer.M5X.M50S.BTMinerM50SVJ30
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M50SVH10 ## M50S VH10
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH10
::: pyasic.miners.btc.whatsminer.btminer.M5X.M50S.BTMinerM50SVH10
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M50SVH20 ## M50S VH20
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH20
::: pyasic.miners.btc.whatsminer.btminer.M5X.M50S.BTMinerM50SVH20
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M50SVH30 ## M50S VH30
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH30
::: pyasic.miners.btc.whatsminer.btminer.M5X.M50S.BTMinerM50SVH30
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M50SVH40 ## M50S VH40
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH40
::: pyasic.miners.btc.whatsminer.btminer.M5X.M50S.BTMinerM50SVH40
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M50SVH50 ## M50S VH50
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH50
::: pyasic.miners.btc.whatsminer.btminer.M5X.M50S.BTMinerM50SVH50
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M50S+VH30 ## M50S+ VH30
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVH30
::: pyasic.miners.btc.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVH30
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M50S+VH40 ## M50S+ VH40
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVH40
::: pyasic.miners.btc.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVH40
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M50S+VJ30 ## M50S+ VJ30
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVJ30
::: pyasic.miners.btc.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVJ30
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M53VH30 ## M50S+ VK20
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVK20
::: pyasic.miners.btc.whatsminer.btminer.M5X.M53.BTMinerM53VH30
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M53SVH30 ## M50S++ VK10
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVK10
::: pyasic.miners.btc.whatsminer.btminer.M5X.M53S.BTMinerM53SVH30
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M53S+VJ30 ## M50S++ VK20
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVK20
::: pyasic.miners.btc.whatsminer.btminer.M5X.M53S_Plus.BTMinerM53SPlusVJ30
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M56VH30 ## M50S++ VK30
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVK30
::: pyasic.miners.btc.whatsminer.btminer.M5X.M56.BTMinerM56VH30
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M56SVH30 ## M53 VH30
::: pyasic.miners.whatsminer.btminer.M5X.M53.BTMinerM53VH30
::: pyasic.miners.btc.whatsminer.btminer.M5X.M56S.BTMinerM56SVH30
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M56S+VJ30 ## M53S VH30
::: pyasic.miners.whatsminer.btminer.M5X.M53S.BTMinerM53SVH30
::: pyasic.miners.btc.whatsminer.btminer.M5X.M56S_Plus.BTMinerM56SPlusVJ30
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M59VH30 ## M53S+ VJ30
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus.BTMinerM53SPlusVJ30
::: pyasic.miners.btc.whatsminer.btminer.M5X.M59.BTMinerM59VH30
handler: python handler: python
options: options:
show_root_heading: false show_root_heading: false
heading_level: 4 heading_level: 4
## M56 VH30
::: pyasic.miners.whatsminer.btminer.M5X.M56.BTMinerM56VH30
handler: python
options:
show_root_heading: false
heading_level: 4
## M56S VH30
::: pyasic.miners.whatsminer.btminer.M5X.M56S.BTMinerM56SVH30
handler: python
options:
show_root_heading: false
heading_level: 4
## M56S+ VJ30
::: pyasic.miners.whatsminer.btminer.M5X.M56S_Plus.BTMinerM56SPlusVJ30
handler: python
options:
show_root_heading: false
heading_level: 4
## M59 VH30
::: pyasic.miners.whatsminer.btminer.M5X.M59.BTMinerM59VH30
handler: python
options:
show_root_heading: false
heading_level: 4

View File

@@ -66,34 +66,22 @@ class MinerData:
Attributes: Attributes:
ip: The IP of the miner as a str. ip: The IP of the miner as a str.
datetime: The time and date this data was generated. datetime: The time and date this data was generated.
mac: The MAC address of the miner as a str.
model: The model of the miner as a str. model: The model of the miner as a str.
make: The make of the miner as a str. make: The make of the miner as a str.
api_ver: The current api version on the miner as a str. api_ver: The current api version on the miner as a str.
fw_ver: The current firmware version on the miner as a str. fw_ver: The current firmware version on the miner as a str.
hostname: The network hostname of the miner as a str. hostname: The network hostname of the miner as a str.
hashrate: The hashrate of the miner in TH/s as a float. hashrate: The hashrate of the miner in TH/s as a float. Calculated automatically.
_hashrate: Backup for hashrate found via API instead of hashboards.
nominal_hashrate: The factory nominal hashrate of the miner in TH/s as a float. nominal_hashrate: The factory nominal hashrate of the miner in TH/s as a float.
left_board_hashrate: The hashrate of the left board of the miner in TH/s as a float. hashboards: A list of hashboards on the miner with their statistics.
center_board_hashrate: The hashrate of the center board of the miner in TH/s as a float.
right_board_hashrate: The hashrate of the right board of the miner in TH/s as a float.
temperature_avg: The average temperature across the boards. Calculated automatically. temperature_avg: The average temperature across the boards. Calculated automatically.
env_temp: The environment temps as a float. env_temp: The environment temps as a float.
left_board_temp: The temp of the left PCB as an int.
left_board_chip_temp: The temp of the left board chips as an int.
center_board_temp: The temp of the center PCB as an int.
center_board_chip_temp: The temp of the center board chips as an int.
right_board_temp: The temp of the right PCB as an int.
right_board_chip_temp: The temp of the right board chips as an int.
wattage: Current power draw of the miner as an int. wattage: Current power draw of the miner as an int.
wattage_limit: Power limit of the miner as an int. wattage_limit: Power limit of the miner as an int.
fan_1: The speed of the first fan as an int. fans: A list of fans on the miner with their speeds.
fan_2: The speed of the second fan as an int.
fan_3: The speed of the third fan as an int.
fan_4: The speed of the fourth fan as an int.
fan_psu: The speed of the PSU on the fan if the miner collects it. fan_psu: The speed of the PSU on the fan if the miner collects it.
left_chips: The number of chips online in the left board as an int.
center_chips: The number of chips online in the left board as an int.
right_chips: The number of chips online in the left board as an int.
total_chips: The total number of chips on all boards. Calculated automatically. total_chips: The total number of chips on all boards. Calculated automatically.
ideal_chips: The ideal number of chips in the miner as an int. ideal_chips: The ideal number of chips in the miner as an int.
percent_ideal_chips: The percent of total chips out of the ideal count. Calculated automatically. percent_ideal_chips: The percent of total chips out of the ideal count. Calculated automatically.
@@ -106,7 +94,7 @@ class MinerData:
pool_2_url: The second pool url on the miner as a str. pool_2_url: The second pool url on the miner as a str.
pool_2_user: The second pool user on the miner as a str. pool_2_user: The second pool user on the miner as a str.
errors: A list of errors on the miner. errors: A list of errors on the miner.
fault_light: Whether or not 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.
""" """
@@ -123,34 +111,18 @@ class MinerData:
nominal_hashrate: float = 0 nominal_hashrate: float = 0
hashboards: List[HashBoard] = field(default_factory=list) hashboards: List[HashBoard] = field(default_factory=list)
ideal_hashboards: int = 1 ideal_hashboards: int = 1
left_board_hashrate: float = field(init=False)
center_board_hashrate: float = field(init=False)
right_board_hashrate: float = field(init=False)
temperature_avg: int = field(init=False) temperature_avg: int = field(init=False)
env_temp: float = -1.0 env_temp: float = -1.0
left_board_temp: int = field(init=False)
left_board_chip_temp: int = field(init=False)
center_board_temp: int = field(init=False)
center_board_chip_temp: int = field(init=False)
right_board_temp: int = field(init=False)
right_board_chip_temp: int = field(init=False)
wattage: int = -1 wattage: int = -1
wattage_limit: int = -1 wattage_limit: int = -1
fans: List[Fan] = field(default_factory=list) fans: List[Fan] = field(default_factory=list)
fan_1: int = field(init=False)
fan_2: int = field(init=False)
fan_3: int = field(init=False)
fan_4: int = field(init=False)
fan_psu: int = -1 fan_psu: int = -1
left_chips: int = field(init=False)
center_chips: int = field(init=False)
right_chips: int = field(init=False)
total_chips: int = field(init=False) total_chips: int = field(init=False)
ideal_chips: int = 1 ideal_chips: int = 1
percent_ideal_chips: float = field(init=False) percent_ideal_chips: float = field(init=False)
percent_ideal_hashrate: float = field(init=False) percent_ideal_hashrate: float = field(init=False)
percent_ideal_wattage: float = field(init=False) percent_ideal_wattage: float = field(init=False)
nominal: int = field(init=False) nominal: bool = field(init=False)
pool_split: str = "0" pool_split: str = "0"
pool_1_url: str = "Unknown" pool_1_url: str = "Unknown"
pool_1_user: str = "Unknown" pool_1_user: str = "Unknown"
@@ -228,42 +200,6 @@ class MinerData:
def hashrate(self, val): def hashrate(self, val):
self._hashrate = val self._hashrate = val
@property
def fan_1(self): # noqa - Skip PyCharm inspection
if len(self.fans) > 0:
return self.fans[0].speed
@fan_1.setter
def fan_1(self, val):
pass
@property
def fan_2(self): # noqa - Skip PyCharm inspection
if len(self.fans) > 1:
return self.fans[1].speed
@fan_2.setter
def fan_2(self, val):
pass
@property
def fan_3(self): # noqa - Skip PyCharm inspection
if len(self.fans) > 2:
return self.fans[2].speed
@fan_3.setter
def fan_3(self, val):
pass
@property
def fan_4(self): # noqa - Skip PyCharm inspection
if len(self.fans) > 3:
return self.fans[3].speed
@fan_4.setter
def fan_4(self, val):
pass
@property @property
def total_chips(self): # noqa - Skip PyCharm inspection def total_chips(self): # noqa - Skip PyCharm inspection
return sum([hb.chips for hb in self.hashboards]) return sum([hb.chips for hb in self.hashboards])
@@ -272,151 +208,6 @@ class MinerData:
def total_chips(self, val): def total_chips(self, val):
pass pass
@property
def left_chips(self): # noqa - Skip PyCharm inspection
if len(self.hashboards) in [2, 3, 4]:
return self.hashboards[0].chips
return 0
@left_chips.setter
def left_chips(self, val):
pass
@property
def center_chips(self): # noqa - Skip PyCharm inspection
if len(self.hashboards) == 1:
return self.hashboards[0].chips
if len(self.hashboards) in [2, 3, 4]:
return self.hashboards[1].chips
return 0
@center_chips.setter
def center_chips(self, val):
pass
@property
def right_chips(self): # noqa - Skip PyCharm inspection
if len(self.hashboards) == 2:
return self.hashboards[1].chips
if len(self.hashboards) == 3:
return self.hashboards[2].chips
if len(self.hashboards) > 3:
return self.hashboards[-1:][0].chips
return 0
@right_chips.setter
def right_chips(self, val):
pass
@property
def left_board_hashrate(self): # noqa - Skip PyCharm inspection
if len(self.hashboards) in [2, 3, 4]:
return self.hashboards[0].hashrate
return 0
@left_board_hashrate.setter
def left_board_hashrate(self, val):
pass
@property
def center_board_hashrate(self): # noqa - Skip PyCharm inspection
if len(self.hashboards) == 1:
return self.hashboards[0].hashrate
if len(self.hashboards) in [2, 3, 4]:
return self.hashboards[1].hashrate
return 0
@center_board_hashrate.setter
def center_board_hashrate(self, val):
pass
@property
def right_board_hashrate(self): # noqa - Skip PyCharm inspection
if len(self.hashboards) == 2:
return self.hashboards[1].hashrate
if len(self.hashboards) == 3:
return self.hashboards[2].hashrate
if len(self.hashboards) > 3:
return self.hashboards[-1:][0].hashrate
return 0
@right_board_hashrate.setter
def right_board_hashrate(self, val):
pass
@property
def left_board_temp(self): # noqa - Skip PyCharm inspection
if len(self.hashboards) in [2, 3, 4]:
return self.hashboards[0].temp
return 0
@left_board_temp.setter
def left_board_temp(self, val):
pass
@property
def center_board_temp(self): # noqa - Skip PyCharm inspection
if len(self.hashboards) == 1:
return self.hashboards[0].temp
if len(self.hashboards) in [2, 3, 4]:
return self.hashboards[1].temp
return 0
@center_board_temp.setter
def center_board_temp(self, val):
pass
@property
def right_board_temp(self): # noqa - Skip PyCharm inspection
if len(self.hashboards) == 2:
return self.hashboards[1].temp
if len(self.hashboards) == 3:
return self.hashboards[2].temp
if len(self.hashboards) > 3:
return self.hashboards[-1:][0].temp
return 0
@right_board_temp.setter
def right_board_temp(self, val):
pass
@property
def left_board_chip_temp(self): # noqa - Skip PyCharm inspection
if len(self.hashboards) in [2, 3, 4]:
return self.hashboards[0].chip_temp
return 0
@left_board_chip_temp.setter
def left_board_chip_temp(self, val):
pass
@property
def center_board_chip_temp(self): # noqa - Skip PyCharm inspection
if len(self.hashboards) == 1:
return self.hashboards[0].chip_temp
if len(self.hashboards) in [2, 3, 4]:
return self.hashboards[1].chip_temp
return 0
@center_board_chip_temp.setter
def center_board_chip_temp(self, val):
pass
@property
def right_board_chip_temp(self): # noqa - Skip PyCharm inspection
if len(self.hashboards) == 2:
return self.hashboards[1].chip_temp
if len(self.hashboards) == 3:
return self.hashboards[2].chip_temp
if len(self.hashboards) > 3:
return self.hashboards[-1:][0].chip_temp
return 0
@right_board_chip_temp.setter
def right_board_chip_temp(self, val):
pass
@property @property
def nominal(self): # noqa - Skip PyCharm inspection def nominal(self): # noqa - Skip PyCharm inspection
return self.ideal_chips == self.total_chips return self.ideal_chips == self.total_chips
@@ -536,24 +327,40 @@ class MinerData:
escaped_data = self[attribute].replace(" ", "\\ ") escaped_data = self[attribute].replace(" ", "\\ ")
tag_data.append(f"{attribute}={escaped_data}") tag_data.append(f"{attribute}={escaped_data}")
continue continue
if isinstance(self[attribute], str): elif str(attribute).startswith("_"):
continue
elif isinstance(self[attribute], str):
field_data.append(f'{attribute}="{self[attribute]}"') field_data.append(f'{attribute}="{self[attribute]}"')
continue continue
if isinstance(self[attribute], bool): elif isinstance(self[attribute], bool):
field_data.append(f"{attribute}={str(self[attribute]).lower()}") field_data.append(f"{attribute}={str(self[attribute]).lower()}")
continue continue
if isinstance(self[attribute], int): elif isinstance(self[attribute], int):
field_data.append(f"{attribute}={self[attribute]}") field_data.append(f"{attribute}={self[attribute]}")
continue continue
if isinstance(self[attribute], float): elif isinstance(self[attribute], float):
field_data.append(f"{attribute}={self[attribute]}") field_data.append(f"{attribute}={self[attribute]}")
continue continue
if attribute == "fault_light" and not self[attribute]: elif attribute == "fault_light" and not self[attribute]:
field_data.append(f"{attribute}=false") field_data.append(f"{attribute}=false")
continue continue
if attribute == "errors": elif attribute == "errors":
for idx, item in enumerate(self[attribute]): for idx, item in enumerate(self[attribute]):
field_data.append(f'error_{idx+1}="{item.error_message}"') 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.hashrate}")
field_data.append(f"hashboard_{idx+1}_temperature={item.temp}")
field_data.append(
f"hashboard_{idx+1}_chip_temperature={item.chip_temp}"
)
field_data.append(f"hashboard_{idx+1}_chips={item.chips}")
field_data.append(
f"hashboard_{idx+1}_expected_chips={item.expected_chips}"
)
elif attribute == "fans":
for idx, item in enumerate(self[attribute]):
field_data.append(f"fan_{idx+1}={item.speed}")
tags_str = ",".join(tag_data) tags_str = ",".join(tag_data)
field_str = ",".join(field_data) field_str = ",".join(field_data)

View File

@@ -0,0 +1,25 @@
# ------------------------------------------------------------------------------
# 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.types import S17Plus, S17Pro
class VNishS17Plus(VNish, S17Plus):
pass
class VNishS17Pro(VNish, S17Pro):
pass

View File

@@ -0,0 +1,16 @@
# ------------------------------------------------------------------------------
# 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 .S17 import VNishS17Plus, VNishS17Pro

View File

@@ -15,4 +15,5 @@
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
from .X3 import * from .X3 import *
from .X17 import *
from .X19 import * from .X19 import *

View File

@@ -353,7 +353,7 @@ class AntminerOld(CGMiner):
except APIError: except APIError:
pass pass
fans_data = [Fan(), Fan(), Fan(), Fan()] fans_data = [Fan() for _ in range(self.fan_count)]
if api_stats: if api_stats:
try: try:
fan_offset = -1 fan_offset = -1
@@ -367,8 +367,8 @@ class AntminerOld(CGMiner):
fan_offset = 3 fan_offset = 3
for fan in range(self.fan_count): for fan in range(self.fan_count):
fans_data[fan] = Fan( fans_data[fan].speed = api_stats["STATS"][1].get(
api_stats["STATS"][1].get(f"fan{fan_offset+fan}") f"fan{fan_offset+fan}", 0
) )
except (KeyError, IndexError): except (KeyError, IndexError):
pass pass

View File

@@ -247,14 +247,16 @@ class BFGMiner(BaseMiner):
for fan_num in range(0, 8, 4): for fan_num in range(0, 8, 4):
for _f_num in range(4): for _f_num in range(4):
f = api_stats["STATS"][1].get(f"fan{fan_num + _f_num}") f = api_stats["STATS"][1].get(f"fan{fan_num + _f_num}", 0)
if f and not f == 0 and fan_offset == -1: if not f == 0 and fan_offset == -1:
fan_offset = fan_num fan_offset = fan_num
if fan_offset == -1: if fan_offset == -1:
fan_offset = 1 fan_offset = 1
for fan in range(self.fan_count): for fan in range(self.fan_count):
fans_data[fan] = api_stats["STATS"][1].get(f"fan{fan_offset+fan}") fans_data[fan] = api_stats["STATS"][1].get(
f"fan{fan_offset+fan}", 0
)
except (KeyError, IndexError): except (KeyError, IndexError):
pass pass
fans = [Fan(speed=d) if d else Fan() for d in fans_data] fans = [Fan(speed=d) if d else Fan() for d in fans_data]

View File

@@ -275,24 +275,25 @@ class BMMiner(BaseMiner):
except APIError: except APIError:
pass pass
fans_data = [None, None, None, None] fans = [Fan() for _ in range(self.fan_count)]
if api_stats: if api_stats:
try: try:
fan_offset = -1 fan_offset = -1
for fan_num in range(1, 8, 4): for fan_num in range(1, 8, 4):
for _f_num in range(4): for _f_num in range(4):
f = api_stats["STATS"][1].get(f"fan{fan_num + _f_num}") f = api_stats["STATS"][1].get(f"fan{fan_num + _f_num}", 0)
if f and not f == 0 and fan_offset == -1: if f and not f == 0 and fan_offset == -1:
fan_offset = fan_num fan_offset = fan_num
if fan_offset == -1: if fan_offset == -1:
fan_offset = 1 fan_offset = 1
for fan in range(self.fan_count): for fan in range(self.fan_count):
fans_data[fan] = api_stats["STATS"][1].get(f"fan{fan_offset+fan}") fans[fan].speed = api_stats["STATS"][1].get(
f"fan{fan_offset+fan}", 0
)
except (KeyError, IndexError): except (KeyError, IndexError):
pass pass
fans = [Fan(speed=d) if d else Fan() for d in fans_data]
return fans return fans

View File

@@ -155,7 +155,7 @@ BOSMINER_DATA_LOC = {
"config": { "config": {
"... on BosminerConfig": { "... on BosminerConfig": {
"groups": { "groups": {
"pools": {"urluser": None}, "pools": {"url": None, "user": None},
"strategy": { "strategy": {
"... on QuotaStrategy": {"quota": None} "... on QuotaStrategy": {"quota": None}
}, },
@@ -414,7 +414,7 @@ class BOSMiner(BaseMiner):
if graphql_version: if graphql_version:
try: try:
fw_ver = graphql_version["bos"]["info"]["version"]["full"] fw_ver = graphql_version["data"]["bos"]["info"]["version"]["full"]
except KeyError: except KeyError:
pass pass
@@ -442,7 +442,7 @@ class BOSMiner(BaseMiner):
if graphql_hostname: if graphql_hostname:
try: try:
hostname = graphql_hostname["bos"]["hostname"] hostname = graphql_hostname["data"]["bos"]["hostname"]
return hostname return hostname
except KeyError: except KeyError:
pass pass
@@ -477,7 +477,7 @@ class BOSMiner(BaseMiner):
try: try:
return round( return round(
float( float(
graphql_hashrate["bosminer"]["info"]["workSolver"][ graphql_hashrate["data"]["bosminer"]["info"]["workSolver"][
"realHashrate" "realHashrate"
]["mhs1M"] ]["mhs1M"]
/ 1000000 / 1000000
@@ -535,14 +535,19 @@ class BOSMiner(BaseMiner):
if graphql_boards: if graphql_boards:
try: try:
boards = graphql_boards["bosminer"]["info"]["workSolver"][ boards = graphql_boards["data"]["bosminer"]["info"]["workSolver"][
"childSolvers" "childSolvers"
] ]
except (KeyError, IndexError): except (KeyError, IndexError):
boards = None boards = None
if boards: if boards:
offset = 6 if int(boards[0]["name"]) in [6, 7, 8] else 0 b_names = [int(b["name"]) for b in boards]
offset = 0
if 3 in b_names:
offset = 1
elif 6 in b_names:
offset = 6
for hb in boards: for hb in boards:
_id = int(hb["name"]) - offset _id = int(hb["name"]) - offset
board = hashboards[_id] board = hashboards[_id]
@@ -643,13 +648,12 @@ class BOSMiner(BaseMiner):
) )
except APIError: except APIError:
pass pass
if graphql_wattage is not None:
if graphql_wattage:
try: try:
return graphql_wattage["bosminer"]["info"]["workSolver"]["power"][ return graphql_wattage["data"]["bosminer"]["info"]["workSolver"][
"approxConsumptionW" "power"
] ]["approxConsumptionW"]
except KeyError: except (KeyError, TypeError):
pass pass
if not api_tunerstatus: if not api_tunerstatus:
@@ -679,10 +683,10 @@ class BOSMiner(BaseMiner):
if graphql_wattage_limit: if graphql_wattage_limit:
try: try:
return graphql_wattage_limit["bosminer"]["info"]["workSolver"]["power"][ return graphql_wattage_limit["data"]["bosminer"]["info"]["workSolver"][
"limitW" "power"
] ]["limitW"]
except KeyError: except (KeyError, TypeError):
pass pass
if not api_tunerstatus: if not api_tunerstatus:
@@ -707,17 +711,20 @@ class BOSMiner(BaseMiner):
) )
except APIError: except APIError:
pass pass
if graphql_fans: if graphql_fans:
fans = {"fan_1": Fan(), "fan_2": Fan(), "fan_3": Fan(), "fan_4": Fan()} fans = []
for n in range(self.fan_count): for n in range(self.fan_count):
try: try:
fans[f"fan_{n + 1}"].speed = graphql_fans["bosminer"]["info"][ fans.append(
"fans" Fan(
][n]["rpm"] speed=graphql_fans["data"]["bosminer"]["info"]["fans"][n][
"rpm"
]
)
)
except KeyError: except KeyError:
pass pass
return [fans["fan_1"], fans["fan_2"], fans["fan_3"], fans["fan_4"]] return fans
if not api_fans: if not api_fans:
try: try:
@@ -726,14 +733,14 @@ class BOSMiner(BaseMiner):
pass pass
if api_fans: if api_fans:
fans = {"fan_1": Fan(), "fan_2": Fan(), "fan_3": Fan(), "fan_4": Fan()} fans = []
for n in range(self.fan_count): for n in range(self.fan_count):
try: try:
fans[f"fan_{n + 1}"].speed = api_fans["FANS"][n]["RPM"] fans.append(Fan(api_fans["FANS"][n]["RPM"]))
except (IndexError, KeyError): except (IndexError, KeyError):
pass pass
return [fans["fan_1"], fans["fan_2"], fans["fan_3"], fans["fan_4"]] return fans
return [Fan(), Fan(), Fan(), Fan()] return [Fan() for _ in range(self.fan_count)]
async def get_fan_psu(self) -> Optional[int]: async def get_fan_psu(self) -> Optional[int]:
return None return None
@@ -763,7 +770,7 @@ class BOSMiner(BaseMiner):
if graphql_pools: if graphql_pools:
groups = [] groups = []
try: try:
g = graphql_pools["bosminer"]["config"]["groups"] g = graphql_pools["data"]["bosminer"]["config"]["groups"]
for group in g: for group in g:
pools = {"quota": group["strategy"]["quota"]} pools = {"quota": group["strategy"]["quota"]}
for i, pool in enumerate(group["pools"]): for i, pool in enumerate(group["pools"]):
@@ -775,7 +782,7 @@ class BOSMiner(BaseMiner):
pools[f"pool_{i + 1}_user"] = pool["user"] pools[f"pool_{i + 1}_user"] = pool["user"]
groups.append(pools) groups.append(pools)
return groups return groups
except KeyError: except (KeyError, TypeError):
pass pass
if not api_pools: if not api_pools:
@@ -852,7 +859,7 @@ class BOSMiner(BaseMiner):
if graphql_errors: if graphql_errors:
errors = [] errors = []
try: try:
boards = graphql_errors["bosminer"]["info"]["workSolver"][ boards = graphql_errors["data"]["bosminer"]["info"]["workSolver"][
"childSolvers" "childSolvers"
] ]
except (KeyError, IndexError): except (KeyError, IndexError):
@@ -946,7 +953,7 @@ class BOSMiner(BaseMiner):
# get light through GraphQL # get light through GraphQL
if graphql_fault_light: if graphql_fault_light:
try: try:
self.light = graphql_fault_light["bos"]["faultLight"] self.light = graphql_fault_light["data"]["bos"]["faultLight"]
return self.light return self.light
except (TypeError, KeyError, ValueError, IndexError): except (TypeError, KeyError, ValueError, IndexError):
pass pass

View File

@@ -463,15 +463,13 @@ class BTMiner(BaseMiner):
except APIError: except APIError:
pass pass
fans = [Fan(), Fan(), Fan(), Fan()] fans = [Fan() for _ in range(self.fan_count)]
if api_summary: if api_summary:
try: try:
if self.fan_count > 0: if self.fan_count > 0:
fans = [ fans = [
Fan(api_summary["SUMMARY"][0]["Fan Speed In"]), Fan(api_summary["SUMMARY"][0].get("Fan Speed In", 0)),
Fan(api_summary["SUMMARY"][0]["Fan Speed Out"]), Fan(api_summary["SUMMARY"][0].get("Fan Speed Out", 0)),
Fan(),
Fan(),
] ]
except (KeyError, IndexError): except (KeyError, IndexError):
pass pass

View File

@@ -296,7 +296,7 @@ class CGMiner(BaseMiner):
except APIError: except APIError:
pass pass
fans_data = [Fan(), Fan(), Fan(), Fan()] fans = [Fan() for _ in range(self.fan_count)]
if api_stats: if api_stats:
try: try:
fan_offset = -1 fan_offset = -1
@@ -310,12 +310,12 @@ class CGMiner(BaseMiner):
fan_offset = 1 fan_offset = 1
for fan in range(self.fan_count): for fan in range(self.fan_count):
fans_data[fan] = Fan( fans[fan].speed = api_stats["STATS"][1].get(
api_stats["STATS"][1].get(f"fan{fan_offset+fan}") f"fan{fan_offset+fan}", 0
) )
except (KeyError, IndexError): except (KeyError, IndexError):
pass pass
return fans_data return fans
async def get_fan_psu(self) -> Optional[int]: async def get_fan_psu(self) -> Optional[int]:
return None return None

View File

@@ -29,20 +29,26 @@ AVALON_DATA_LOC = {
"model": {"cmd": "get_model", "kwargs": {}}, "model": {"cmd": "get_model", "kwargs": {}},
"api_ver": {"cmd": "get_api_ver", "kwargs": {"api_version": {"api": "version"}}}, "api_ver": {"cmd": "get_api_ver", "kwargs": {"api_version": {"api": "version"}}},
"fw_ver": {"cmd": "get_fw_ver", "kwargs": {"api_version": {"api": "version"}}}, "fw_ver": {"cmd": "get_fw_ver", "kwargs": {"api_version": {"api": "version"}}},
"hostname": {"cmd": "get_hostname", "kwargs": {"mac": {"web": "mac"}}}, "hostname": {"cmd": "get_hostname", "kwargs": {"mac": {"api": "version"}}},
"hashrate": {"cmd": "get_hashrate", "kwargs": {"api_summary": {"api": "summary"}}}, "hashrate": {"cmd": "get_hashrate", "kwargs": {"api_devs": {"api": "devs"}}},
"nominal_hashrate": { "nominal_hashrate": {
"cmd": "get_nominal_hashrate", "cmd": "get_nominal_hashrate",
"kwargs": {"api_stats": {"api": "stats"}}, "kwargs": {"api_stats": {"api": "stats"}},
}, },
"hashboards": {"cmd": "get_hashboards", "kwargs": {"api_stats": {"api": "stats"}}}, "hashboards": {"cmd": "get_hashboards", "kwargs": {"api_stats": {"api": "stats"}}},
"env_temp": {"cmd": "get_env_temp", "kwargs": {}}, "env_temp": {"cmd": "get_env_temp", "kwargs": {"api_stats": {"api": "stats"}}},
"wattage": {"cmd": "get_wattage", "kwargs": {}}, "wattage": {"cmd": "get_wattage", "kwargs": {}},
"wattage_limit": {"cmd": "get_wattage_limit", "kwargs": {}}, "wattage_limit": {
"cmd": "get_wattage_limit",
"kwargs": {"api_stats": {"api": "stats"}},
},
"fans": {"cmd": "get_fans", "kwargs": {"api_stats": {"api": "stats"}}}, "fans": {"cmd": "get_fans", "kwargs": {"api_stats": {"api": "stats"}}},
"fan_psu": {"cmd": "get_fan_psu", "kwargs": {}}, "fan_psu": {"cmd": "get_fan_psu", "kwargs": {}},
"errors": {"cmd": "get_errors", "kwargs": {}}, "errors": {"cmd": "get_errors", "kwargs": {}},
"fault_light": {"cmd": "get_fault_light", "kwargs": {}}, "fault_light": {
"cmd": "get_fault_light",
"kwargs": {"api_stats": {"api": "stats"}},
},
"pools": {"cmd": "get_pools", "kwargs": {"api_pools": {"api": "pools"}}}, "pools": {"cmd": "get_pools", "kwargs": {"api_pools": {"api": "pools"}}},
} }
@@ -115,8 +121,17 @@ class CGMinerAvalon(CGMiner):
data = item.replace("]", "").split("[") data = item.replace("]", "").split("[")
data_list = [i.split(": ") for i in data[1].strip().split(", ")] data_list = [i.split(": ") for i in data[1].strip().split(", ")]
data_dict = {} data_dict = {}
for key, val in [tuple(item) for item in data_list]: try:
data_dict[key] = val for key, val in [tuple(item) for item in data_list]:
data_dict[key] = val
except ValueError:
# --avalon args
for arg_item in data_list:
item_data = arg_item[0].split(" ")
for idx in range(len(item_data)):
if idx % 2 == 0 or idx == 0:
data_dict[item_data[idx]] = item_data[idx + 1]
raw_data = [data[0].strip(), data_dict] raw_data = [data[0].strip(), data_dict]
else: else:
raw_data = [ raw_data = [
@@ -168,16 +183,16 @@ class CGMinerAvalon(CGMiner):
if mac: if mac:
return f"Avalon{mac.replace(':', '')[-6:]}" return f"Avalon{mac.replace(':', '')[-6:]}"
async def get_hashrate(self, api_summary: dict = None) -> Optional[float]: async def get_hashrate(self, api_devs: dict = None) -> Optional[float]:
if not api_summary: if not api_devs:
try: try:
api_summary = await self.api.summary() api_devs = await self.api.devs()
except APIError: except APIError:
pass pass
if api_summary: if api_devs:
try: try:
return round(float(api_summary["SUMMARY"][0]["MHS 1m"] / 1000000), 2) return round(float(api_devs["DEVS"][0]["MHS 1m"] / 1000000), 2)
except (KeyError, IndexError, ValueError, TypeError): except (KeyError, IndexError, ValueError, TypeError):
pass pass
@@ -195,38 +210,87 @@ class CGMinerAvalon(CGMiner):
if api_stats: if api_stats:
try: try:
stats_data = api_stats[0].get("STATS") unparsed_stats = api_stats["STATS"][0]["MM ID0"]
if stats_data: parsed_stats = self.parse_stats(unparsed_stats)
for key in stats_data[0].keys():
if key.startswith("MM ID"):
raw_data = self.parse_stats(stats_data[0][key])
for board in range(self.ideal_hashboards):
chip_temp = raw_data.get("MTmax")
if chip_temp:
hashboards[board].chip_temp = chip_temp[board]
temp = raw_data.get("MTavg")
if temp:
hashboards[board].temp = temp[board]
chips = raw_data.get(f"PVT_T{board}")
if chips:
hashboards[board].chips = len(
[item for item in chips if not item == "0"]
)
except (IndexError, KeyError, ValueError, TypeError): except (IndexError, KeyError, ValueError, TypeError):
pass return hashboards
for board in range(self.ideal_hashboards):
try:
hashboards[board].chip_temp = int(parsed_stats["MTmax"][board])
except LookupError:
pass
try:
board_hr = parsed_stats["MGHS"][board]
hashboards[board].hashrate = round(float(board_hr) / 1000, 2)
except LookupError:
pass
try:
hashboards[board].temp = int(parsed_stats["MTavg"][board])
except LookupError:
pass
try:
chip_data = parsed_stats[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_env_temp(self) -> Optional[float]: async def get_nominal_hashrate(self, api_stats: dict = None) -> Optional[float]:
return None if not api_stats:
try:
api_stats = await self.api.stats()
except APIError:
pass
if api_stats:
try:
unparsed_stats = api_stats["STATS"][0]["MM ID0"]
parsed_stats = self.parse_stats(unparsed_stats)
return round(float(parsed_stats["GHSmm"]) / 1000, 2)
except (IndexError, KeyError, ValueError, TypeError):
pass
async def get_env_temp(self, api_stats: dict = None) -> Optional[float]:
if not api_stats:
try:
api_stats = await self.api.stats()
except APIError:
pass
if api_stats:
try:
unparsed_stats = api_stats["STATS"][0]["MM ID0"]
parsed_stats = self.parse_stats(unparsed_stats)
return float(parsed_stats["Temp"])
except (IndexError, KeyError, ValueError, TypeError):
pass
async def get_wattage(self) -> Optional[int]: async def get_wattage(self) -> Optional[int]:
return None return None
async def get_wattage_limit(self) -> Optional[int]: async def get_wattage_limit(self, api_stats: dict = None) -> Optional[int]:
return None if not api_stats:
try:
api_stats = await self.api.stats()
except APIError:
pass
if api_stats:
try:
unparsed_stats = api_stats["STATS"][0]["MM ID0"]
parsed_stats = self.parse_stats(unparsed_stats)
return int(parsed_stats["MPO"])
except (IndexError, KeyError, ValueError, TypeError):
pass
async def get_fans(self, api_stats: dict = None) -> List[Fan]: async def get_fans(self, api_stats: dict = None) -> List[Fan]:
if not api_stats: if not api_stats:
@@ -235,19 +299,19 @@ class CGMinerAvalon(CGMiner):
except APIError: except APIError:
pass pass
fans_data = [Fan(), Fan(), Fan(), Fan()] fans_data = [Fan() for _ in range(self.fan_count)]
if api_stats: if api_stats:
try: try:
stats_data = api_stats[0].get("STATS") unparsed_stats = api_stats["STATS"][0]["MM ID0"]
if stats_data: parsed_stats = self.parse_stats(unparsed_stats)
for key in stats_data[0].keys(): except LookupError:
if key.startswith("MM ID"): return fans_data
raw_data = self.parse_stats(stats_data[0][key])
for fan in range(self.fan_count):
fans_data[fan] = Fan(int(raw_data[f"Fan{fan + 1}"]))
except (KeyError, IndexError, ValueError, TypeError):
pass
for fan in range(self.fan_count):
try:
fans_data[fan].speed = int(parsed_stats[f"Fan{fan + 1}"])
except (IndexError, KeyError, ValueError, TypeError):
pass
return fans_data return fans_data
async def get_pools(self, api_pools: dict = None) -> List[dict]: async def get_pools(self, api_pools: dict = None) -> List[dict]:
@@ -279,13 +343,31 @@ class CGMinerAvalon(CGMiner):
async def get_errors(self) -> List[MinerErrorData]: async def get_errors(self) -> List[MinerErrorData]:
return [] return []
async def get_fault_light(self) -> bool: async def get_fault_light(self, api_stats: dict = None) -> bool: # noqa
if self.light: if self.light:
return self.light return self.light
if not api_stats:
try:
api_stats = await self.api.stats()
except APIError:
pass
if api_stats:
try:
unparsed_stats = api_stats["STATS"][0]["MM ID0"]
parsed_stats = self.parse_stats(unparsed_stats)
led = int(parsed_stats["Led"])
return True if led == 1 else False
except (IndexError, KeyError, ValueError, TypeError):
pass
try: try:
data = await self.api.ascset(0, "led", "1-255") data = await self.api.ascset(0, "led", "1-255")
except APIError: except APIError:
return False return False
if data["STATUS"][0]["Msg"] == "ASC 0 set info: LED[1]": try:
return True if data["STATUS"][0]["Msg"] == "ASC 0 set info: LED[1]":
return True
except LookupError:
pass
return False return False

View File

@@ -254,7 +254,7 @@ class CGMinerA10X(CGMiner, A10X):
else: else:
web_get_all = web_get_all["all"] web_get_all = web_get_all["all"]
fan_data = [Fan(), Fan(), Fan(), Fan()] fans = [Fan() for _ in range(self.fan_count)]
if web_get_all: if web_get_all:
try: try:
spd = web_get_all["fansSpeed"] spd = web_get_all["fansSpeed"]
@@ -263,9 +263,9 @@ class CGMinerA10X(CGMiner, A10X):
else: else:
round((int(spd) * 6000) / 100) round((int(spd) * 6000) / 100)
for i in range(self.fan_count): for i in range(self.fan_count):
fan_data[i] = Fan(spd) fans[i].speed = spd
return fan_data return fans
async def get_pools(self, api_pools: dict = None) -> List[dict]: async def get_pools(self, api_pools: dict = None) -> List[dict]:
groups = [] groups = []

View File

@@ -236,7 +236,7 @@ class CGMinerT3HPlus(CGMiner, T3HPlus):
else: else:
web_get_all = web_get_all["all"] web_get_all = web_get_all["all"]
fan_data = [Fan(), Fan(), Fan(), Fan()] fans = [Fan() for _ in range(self.fan_count)]
if web_get_all: if web_get_all:
try: try:
spd = web_get_all["fansSpeed"] spd = web_get_all["fansSpeed"]
@@ -245,9 +245,9 @@ class CGMinerT3HPlus(CGMiner, T3HPlus):
else: else:
round((int(spd) * 6000) / 100) round((int(spd) * 6000) / 100)
for i in range(self.fan_count): for i in range(self.fan_count):
fan_data[i] = Fan(spd) fans[i].speed = spd
return fan_data return fans
async def get_pools(self, api_pools: dict = None) -> List[dict]: async def get_pools(self, api_pools: dict = None) -> List[dict]:
groups = [] groups = []

View File

@@ -61,10 +61,10 @@ class MinerTypes(enum.Enum):
MINER_CLASSES = { MINER_CLASSES = {
MinerTypes.ANTMINER: { MinerTypes.ANTMINER: {
None: BMMiner, None: BMMiner,
"ANTMINER DR5": CGMinerDR5,
"ANTMINER D3": CGMinerD3, "ANTMINER D3": CGMinerD3,
"ANTMINER HS3": BMMinerHS3, "ANTMINER HS3": BMMinerHS3,
"ANTMINER L3+": BMMinerL3Plus, "ANTMINER L3+": BMMinerL3Plus,
"ANTMINER DR5": CGMinerDR5,
"ANTMINER L7": BMMinerL7, "ANTMINER L7": BMMinerL7,
"ANTMINER E9 PRO": BMMinerE9Pro, "ANTMINER E9 PRO": BMMinerE9Pro,
"ANTMINER S9": BMMinerS9, "ANTMINER S9": BMMinerS9,
@@ -322,6 +322,8 @@ MINER_CLASSES = {
MinerTypes.VNISH: { MinerTypes.VNISH: {
None: VNish, None: VNish,
"ANTMINER L3+": VnishL3Plus, "ANTMINER L3+": VnishL3Plus,
"ANTMINER S17+": VNishS17Plus,
"ANTMINER S17 PRO": VNishS17Pro,
"ANTMINER S19": VNishS19, "ANTMINER S19": VNishS19,
"ANTMINER S19 PRO": VNishS19Pro, "ANTMINER S19 PRO": VNishS19Pro,
"ANTMINER S19J": VNishS19j, "ANTMINER S19J": VNishS19j,
@@ -393,7 +395,9 @@ class MinerFactory:
ip = str(ip) ip = str(ip)
if ip in self.cache: if ip in self.cache:
return self.cache[ip] return self.cache[ip]
miner_type = None miner_type = None
for _ in range(RETRIES): for _ in range(RETRIES):
task = asyncio.create_task(self._get_miner_type(ip)) task = asyncio.create_task(self._get_miner_type(ip))
try: try:
@@ -406,23 +410,18 @@ class MinerFactory:
if miner_type is not None: if miner_type is not None:
miner_model = None miner_model = None
fn = None miner_model_fns = {
if miner_type == MinerTypes.ANTMINER: MinerTypes.ANTMINER: self.get_miner_model_antminer,
fn = self.get_miner_model_antminer MinerTypes.WHATSMINER: self.get_miner_model_whatsminer,
if miner_type == MinerTypes.WHATSMINER: MinerTypes.AVALONMINER: self.get_miner_model_avalonminer,
fn = self.get_miner_model_whatsminer MinerTypes.INNOSILICON: self.get_miner_model_innosilicon,
if miner_type == MinerTypes.AVALONMINER: MinerTypes.GOLDSHELL: self.get_miner_model_goldshell,
fn = self.get_miner_model_avalonminer MinerTypes.BRAIINS_OS: self.get_miner_model_braiins_os,
if miner_type == MinerTypes.INNOSILICON: MinerTypes.VNISH: self.get_miner_model_vnish,
fn = self.get_miner_model_innosilicon MinerTypes.HIVEON: self.get_miner_model_hiveon,
if miner_type == MinerTypes.GOLDSHELL: }
fn = self.get_miner_model_goldshell fn = miner_model_fns.get(miner_type)
if miner_type == MinerTypes.BRAIINS_OS:
fn = self.get_miner_model_braiins_os
if miner_type == MinerTypes.VNISH:
fn = self.get_miner_model_vnish
if miner_type == MinerTypes.HIVEON:
fn = self.get_miner_model_hiveon
if fn is not None: if fn is not None:
task = asyncio.create_task(fn(ip)) task = asyncio.create_task(fn(ip))
try: try:
@@ -433,6 +432,7 @@ class MinerFactory:
miner = self._select_miner_from_classes( miner = self._select_miner_from_classes(
ip, miner_type=miner_type, miner_model=miner_model ip, miner_type=miner_type, miner_model=miner_model
) )
if miner is not None and not isinstance(miner, UnknownMiner): if miner is not None and not isinstance(miner, UnknownMiner):
self.cache[ip] = miner self.cache[ip] = miner
return miner return miner
@@ -464,7 +464,7 @@ class MinerFactory:
try: try:
resp = await session.get(url) resp = await session.get(url)
return await resp.text(), resp return await resp.text(), resp
except aiohttp.ClientError: except (aiohttp.ClientError, asyncio.TimeoutError):
pass pass
return None, None return None, None
@@ -680,6 +680,22 @@ class MinerFactory:
try: try:
miner_model = sock_json_data["VERSION"][0]["Type"] miner_model = sock_json_data["VERSION"][0]["Type"]
if " (" in miner_model:
split_miner_model = miner_model.split(" (")
miner_model = split_miner_model[0]
return miner_model
except (TypeError, LookupError):
pass
sock_json_data = await self.send_api_command(ip, "stats")
try:
miner_model = sock_json_data["STATS"][0]["Type"]
if " (" in miner_model:
split_miner_model = miner_model.split(" (")
miner_model = split_miner_model[0]
return miner_model return miner_model
except (TypeError, LookupError): except (TypeError, LookupError):
pass pass
@@ -761,7 +777,8 @@ class MinerFactory:
try: try:
async with aiohttp.ClientSession() as session: async with aiohttp.ClientSession() as session:
d = await session.post( d = await session.post(
url, json={"query": "{bosminer {info{modelName}}}"} f"http://{ip}/graphql",
json={"query": "{bosminer {info{modelName}}}"},
) )
if d.status == 200: if d.status == 200:
json_data = await d.json() json_data = await d.json()
@@ -773,9 +790,9 @@ class MinerFactory:
async def get_miner_model_vnish(self, ip: str) -> Optional[str]: async def get_miner_model_vnish(self, ip: str) -> Optional[str]:
sock_json_data = await self.send_api_command(ip, "stats") sock_json_data = await self.send_api_command(ip, "stats")
try: try:
miner_model = sock_json_data["STATS"][0]["Type"].upper() miner_model = sock_json_data["STATS"][0]["Type"]
if " (VNISH" in miner_model: if " (" in miner_model:
split_miner_model = miner_model.split(" (VNISH ") split_miner_model = miner_model.split(" (")
miner_model = split_miner_model[0] miner_model = split_miner_model[0]
return miner_model return miner_model

View File

@@ -22,8 +22,6 @@ class Avalon1166Pro(AvalonMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0"): def __init__(self, ip: str, api_ver: str = "0.0.0"):
super().__init__(ip, api_ver) super().__init__(ip, api_ver)
self.ip = ip self.ip = ip
self.model = "Avalon 1166" self.model = "Avalon 1166 Pro"
warnings.warn( self.nominal_chips = 120
f"Unknown chip count for miner type {self.model}, please open an issue on GitHub (https://github.com/UpstreamData/pyasic)."
)
self.fan_count = 4 self.fan_count = 4

View File

@@ -20,3 +20,4 @@ class A10X(InnosiliconMiner): # noqa - ignore ABC method implementation
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None: def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
super().__init__(ip, api_ver) super().__init__(ip, api_ver)
self.ip = ip self.ip = ip
self.model = "A10X"

View File

@@ -31,10 +31,8 @@ class BOSMinerWebAPI(BaseWebAPI):
if isinstance(graphql_command, dict): if isinstance(graphql_command, dict):
data = [] data = []
for key in graphql_command: for key in graphql_command:
if graphql_command[key]: if graphql_command[key] is not None:
parsed = self.parse_command(graphql_command[key]) parsed = self.parse_command(graphql_command[key])
if key.startswith("... on"):
parsed = parsed.replace(",", "")
data.append(key + parsed) data.append(key + parsed)
else: else:
data.append(key) data.append(key)
@@ -80,10 +78,20 @@ class BOSMinerWebAPI(BaseWebAPI):
command = merge(*commands) command = merge(*commands)
data = await self.send_command(command) data = await self.send_command(command)
if not data: if data is not None:
data = {} if data.get("data") is None:
data["multicommand"] = False try:
return data commands = list(commands)
# noinspection PyTypeChecker
commands.remove({"bos": {"faultLight": None}})
command = merge(*commands)
data = await self.send_command(command)
except LookupError:
pass
if not data:
data = {}
data["multicommand"] = False
return data
async def auth(self, client: httpx.AsyncClient) -> None: async def auth(self, client: httpx.AsyncClient) -> None:
url = f"http://{self.ip}/graphql" url = f"http://{self.ip}/graphql"

View File

@@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "pyasic" name = "pyasic"
version = "0.34.4" version = "0.35.0"
description = "A set of modules for interfacing with many common types of ASIC bitcoin miners, using both their API and SSH." description = "A set of modules for interfacing with many common types of ASIC bitcoin miners, using both their API and SSH."
authors = ["UpstreamData <brett@upstreamdata.ca>"] authors = ["UpstreamData <brett@upstreamdata.ca>"]
repository = "https://github.com/UpstreamData/pyasic" repository = "https://github.com/UpstreamData/pyasic"