docs: update docs.
This commit is contained in:
@@ -47,7 +47,7 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
---
|
---
|
||||||
##### 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.get_miner].
|
If you already know the IP address of your miner or miners, you can use the [`MinerFactory`][pyasic.miners.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.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
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## Miner Factory
|
## Miner Factory
|
||||||
|
|
||||||
[`MinerFactory`][pyasic.miners.miner_factory.MinerFactory] is the way to create miner types in `pyasic`. The most important method is [`get_miner()`][pyasic.get_miner], which is mapped to [`pyasic.get_miner()`][pyasic.get_miner], and should be used from there.
|
[`MinerFactory`][pyasic.MinerFactory] is the way to create miner types in `pyasic`. The most important method is [`get_miner()`][pyasic.get_miner], which is mapped to [`pyasic.get_miner()`][pyasic.get_miner], and should be used from there.
|
||||||
|
|
||||||
The instance used for [`pyasic.get_miner()`][pyasic.get_miner] is `pyasic.miner_factory`.
|
The instance used for [`pyasic.get_miner()`][pyasic.get_miner] is `pyasic.miner_factory`.
|
||||||
|
|
||||||
@@ -9,7 +9,7 @@ The instance used for [`pyasic.get_miner()`][pyasic.get_miner] is `pyasic.miner_
|
|||||||
|
|
||||||
Finally, there is functionality to get multiple miners without using `asyncio.gather()` explicitly. Use `pyasic.miner_factory.get_multiple_miners()` with a list of IPs as strings to get a list of miner instances. You can also get multiple miners with an `AsyncGenerator` by using `pyasic.miner_factory.get_miner_generator()`.
|
Finally, there is functionality to get multiple miners without using `asyncio.gather()` explicitly. Use `pyasic.miner_factory.get_multiple_miners()` with a list of IPs as strings to get a list of miner instances. You can also get multiple miners with an `AsyncGenerator` by using `pyasic.miner_factory.get_miner_generator()`.
|
||||||
|
|
||||||
::: pyasic.miners.miner_factory.MinerFactory
|
::: pyasic.miners.factory.MinerFactory
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
@@ -25,12 +25,12 @@ Finally, there is functionality to get multiple miners without using `asyncio.ga
|
|||||||
<br>
|
<br>
|
||||||
|
|
||||||
## AnyMiner
|
## AnyMiner
|
||||||
::: pyasic.miners.miner_factory.AnyMiner
|
::: pyasic.miners.base.AnyMiner
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
[`AnyMiner`][pyasic.miners.miner_factory.AnyMiner] is a placeholder type variable used for typing returns of functions.
|
[`AnyMiner`][pyasic.miners.base.AnyMiner] is a placeholder type variable used for typing returns of functions.
|
||||||
A function returning [`AnyMiner`][pyasic.miners.miner_factory.AnyMiner] will always return a subclass of [`BaseMiner`][pyasic.miners.BaseMiner],
|
A function returning [`AnyMiner`][pyasic.miners.base.AnyMiner] will always return a subclass of [`BaseMiner`][pyasic.miners.BaseMiner],
|
||||||
and is used to specify a function returning some arbitrary type of miner class instance.
|
and is used to specify a function returning some arbitrary type of miner class instance.
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ Each miner has a unique API that is used to communicate with it.
|
|||||||
Each of these API types has commands that differ between them, and some commands have data that others do not.
|
Each of these API types has commands that differ between them, and some commands have data that others do not.
|
||||||
Each miner that is a subclass of [`BaseMiner`][pyasic.miners.BaseMiner] should have an API linked to it as `Miner.api`.
|
Each miner that is a subclass of [`BaseMiner`][pyasic.miners.BaseMiner] should have an API linked to it as `Miner.api`.
|
||||||
|
|
||||||
All API implementations inherit from [`BaseMinerRPCAPI`][pyasic.rpc.BaseMinerRPCAPI], which implements the basic communications protocols.
|
All API implementations inherit from [`BaseMinerRPCAPI`][pyasic.rpc.base.BaseMinerRPCAPI], which implements the basic communications protocols.
|
||||||
|
|
||||||
[`BaseMinerRPCAPI`][pyasic.rpc.BaseMinerRPCAPI] should never be used unless inheriting to create a new miner API class for a new type of miner (which should be exceedingly rare).
|
[`BaseMinerRPCAPI`][pyasic.rpc.base.BaseMinerRPCAPI] should never be used unless inheriting to create a new miner API class for a new type of miner (which should be exceedingly rare).
|
||||||
[`BaseMinerRPCAPI`][pyasic.rpc.BaseMinerRPCAPI] cannot be instantiated directly, it will raise a `TypeError`.
|
[`BaseMinerRPCAPI`][pyasic.rpc.base.BaseMinerRPCAPI] cannot be instantiated directly, it will raise a `TypeError`.
|
||||||
Use these instead -
|
Use these instead -
|
||||||
|
|
||||||
#### [BFGMiner API][pyasic.rpc.bfgminer.BFGMinerRPCAPI]
|
#### [BFGMiner API][pyasic.rpc.bfgminer.BFGMinerRPCAPI]
|
||||||
@@ -21,7 +21,7 @@ Use these instead -
|
|||||||
<br>
|
<br>
|
||||||
|
|
||||||
## BaseMinerRPCAPI
|
## BaseMinerRPCAPI
|
||||||
::: pyasic.rpc.BaseMinerRPCAPI
|
::: pyasic.rpc.base.BaseMinerRPCAPI
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|||||||
@@ -24,73 +24,9 @@ from typing import Any, List, Union
|
|||||||
from pyasic.config import MinerConfig
|
from pyasic.config import MinerConfig
|
||||||
from pyasic.config.mining import MiningModePowerTune
|
from pyasic.config.mining import MiningModePowerTune
|
||||||
|
|
||||||
|
from .boards import HashBoard
|
||||||
from .error_codes import BraiinsOSError, InnosiliconError, WhatsminerError, X19Error
|
from .error_codes import BraiinsOSError, InnosiliconError, WhatsminerError, X19Error
|
||||||
|
from .fans import Fan
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class HashBoard:
|
|
||||||
"""A Dataclass to standardize hashboard data.
|
|
||||||
|
|
||||||
Attributes:
|
|
||||||
slot: The slot of the board as an int.
|
|
||||||
hashrate: The hashrate of the board in TH/s as a float.
|
|
||||||
temp: The temperature of the PCB as an int.
|
|
||||||
chip_temp: The temperature of the chips as an int.
|
|
||||||
chips: The chip count of the board as an int.
|
|
||||||
expected_chips: The expected chip count of the board as an int.
|
|
||||||
serial_number: The serial number of the board.
|
|
||||||
missing: Whether the board is returned from the miners data as a bool.
|
|
||||||
"""
|
|
||||||
|
|
||||||
slot: int = 0
|
|
||||||
hashrate: float = None
|
|
||||||
temp: int = None
|
|
||||||
chip_temp: int = None
|
|
||||||
chips: int = None
|
|
||||||
expected_chips: int = None
|
|
||||||
serial_number: str = None
|
|
||||||
missing: bool = True
|
|
||||||
|
|
||||||
def get(self, __key: str, default: Any = None):
|
|
||||||
try:
|
|
||||||
val = self.__getitem__(__key)
|
|
||||||
if val is None:
|
|
||||||
return default
|
|
||||||
return val
|
|
||||||
except KeyError:
|
|
||||||
return default
|
|
||||||
|
|
||||||
def __getitem__(self, item: str):
|
|
||||||
try:
|
|
||||||
return getattr(self, item)
|
|
||||||
except AttributeError:
|
|
||||||
raise KeyError(f"{item}")
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class Fan:
|
|
||||||
"""A Dataclass to standardize fan data.
|
|
||||||
|
|
||||||
Attributes:
|
|
||||||
speed: The speed of the fan.
|
|
||||||
"""
|
|
||||||
|
|
||||||
speed: int = None
|
|
||||||
|
|
||||||
def get(self, __key: str, default: Any = None):
|
|
||||||
try:
|
|
||||||
val = self.__getitem__(__key)
|
|
||||||
if val is None:
|
|
||||||
return default
|
|
||||||
return val
|
|
||||||
except KeyError:
|
|
||||||
return default
|
|
||||||
|
|
||||||
def __getitem__(self, item: str):
|
|
||||||
try:
|
|
||||||
return getattr(self, item)
|
|
||||||
except AttributeError:
|
|
||||||
raise KeyError(f"{item}")
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
|||||||
67
pyasic/data/boards.py
Normal file
67
pyasic/data/boards.py
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# 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. -
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
import copy
|
||||||
|
import json
|
||||||
|
import time
|
||||||
|
from dataclasses import asdict, dataclass, field, fields
|
||||||
|
from datetime import datetime, timezone
|
||||||
|
from typing import Any, List, Union
|
||||||
|
|
||||||
|
from pyasic.config import MinerConfig
|
||||||
|
from pyasic.config.mining import MiningModePowerTune
|
||||||
|
|
||||||
|
from .error_codes import BraiinsOSError, InnosiliconError, WhatsminerError, X19Error
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class HashBoard:
|
||||||
|
"""A Dataclass to standardize hashboard data.
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
slot: The slot of the board as an int.
|
||||||
|
hashrate: The hashrate of the board in TH/s as a float.
|
||||||
|
temp: The temperature of the PCB as an int.
|
||||||
|
chip_temp: The temperature of the chips as an int.
|
||||||
|
chips: The chip count of the board as an int.
|
||||||
|
expected_chips: The expected chip count of the board as an int.
|
||||||
|
serial_number: The serial number of the board.
|
||||||
|
missing: Whether the board is returned from the miners data as a bool.
|
||||||
|
"""
|
||||||
|
|
||||||
|
slot: int = 0
|
||||||
|
hashrate: float = None
|
||||||
|
temp: int = None
|
||||||
|
chip_temp: int = None
|
||||||
|
chips: int = None
|
||||||
|
expected_chips: int = None
|
||||||
|
serial_number: str = None
|
||||||
|
missing: bool = True
|
||||||
|
|
||||||
|
def get(self, __key: str, default: Any = None):
|
||||||
|
try:
|
||||||
|
val = self.__getitem__(__key)
|
||||||
|
if val is None:
|
||||||
|
return default
|
||||||
|
return val
|
||||||
|
except KeyError:
|
||||||
|
return default
|
||||||
|
|
||||||
|
def __getitem__(self, item: str):
|
||||||
|
try:
|
||||||
|
return getattr(self, item)
|
||||||
|
except AttributeError:
|
||||||
|
raise KeyError(f"{item}")
|
||||||
53
pyasic/data/fans.py
Normal file
53
pyasic/data/fans.py
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# 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. -
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
import copy
|
||||||
|
import json
|
||||||
|
import time
|
||||||
|
from dataclasses import asdict, dataclass, field, fields
|
||||||
|
from datetime import datetime, timezone
|
||||||
|
from typing import Any, List, Union
|
||||||
|
|
||||||
|
from pyasic.config import MinerConfig
|
||||||
|
from pyasic.config.mining import MiningModePowerTune
|
||||||
|
|
||||||
|
from .error_codes import BraiinsOSError, InnosiliconError, WhatsminerError, X19Error
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class Fan:
|
||||||
|
"""A Dataclass to standardize fan data.
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
speed: The speed of the fan.
|
||||||
|
"""
|
||||||
|
|
||||||
|
speed: int = None
|
||||||
|
|
||||||
|
def get(self, __key: str, default: Any = None):
|
||||||
|
try:
|
||||||
|
val = self.__getitem__(__key)
|
||||||
|
if val is None:
|
||||||
|
return default
|
||||||
|
return val
|
||||||
|
except KeyError:
|
||||||
|
return default
|
||||||
|
|
||||||
|
def __getitem__(self, item: str):
|
||||||
|
try:
|
||||||
|
return getattr(self, item)
|
||||||
|
except AttributeError:
|
||||||
|
raise KeyError(f"{item}")
|
||||||
@@ -24,7 +24,7 @@ from pyasic.miners.factory import AnyMiner, miner_factory
|
|||||||
|
|
||||||
|
|
||||||
class MinerNetwork:
|
class MinerNetwork:
|
||||||
"""A class to handle a network containing miners. Handles scanning and gets miners via [`MinerFactory`][pyasic.miners.miner_factory.MinerFactory].
|
"""A class to handle a network containing miners. Handles scanning and gets miners via [`MinerFactory`][pyasic.miners.factory.MinerFactory].
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
hosts: A list of `ipaddress.IPv4Address` to be used when scanning.
|
hosts: A list of `ipaddress.IPv4Address` to be used when scanning.
|
||||||
|
|||||||
@@ -29,9 +29,6 @@ class BFGMinerRPCAPI(CGMinerRPCAPI):
|
|||||||
function handles sending a command to the miner asynchronously, and
|
function handles sending a command to the miner asynchronously, and
|
||||||
as such is the base for many of the functions in this class, which
|
as such is the base for many of the functions in this class, which
|
||||||
rely on it to send the command for them.
|
rely on it to send the command for them.
|
||||||
|
|
||||||
Parameters:
|
|
||||||
ip: The IP of the miner to reference the API on.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
async def procs(self) -> dict:
|
async def procs(self) -> dict:
|
||||||
|
|||||||
@@ -29,7 +29,4 @@ class BMMinerRPCAPI(CGMinerRPCAPI):
|
|||||||
function handles sending a command to the miner asynchronously, and
|
function handles sending a command to the miner asynchronously, and
|
||||||
as such is the base for many of the functions in this class, which
|
as such is the base for many of the functions in this class, which
|
||||||
rely on it to send the command for them.
|
rely on it to send the command for them.
|
||||||
|
|
||||||
Parameters:
|
|
||||||
ip: The IP of the miner to reference the API on.
|
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -29,9 +29,6 @@ class BOSMinerRPCAPI(BaseMinerRPCAPI):
|
|||||||
function handles sending a command to the miner asynchronously, and
|
function handles sending a command to the miner asynchronously, and
|
||||||
as such is the base for many of the functions in this class, which
|
as such is the base for many of the functions in this class, which
|
||||||
rely on it to send the command for them.
|
rely on it to send the command for them.
|
||||||
|
|
||||||
Parameters:
|
|
||||||
ip: The IP of the miner to reference the API on.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
async def asccount(self) -> dict:
|
async def asccount(self) -> dict:
|
||||||
|
|||||||
@@ -180,9 +180,6 @@ class BTMinerRPCAPI(BaseMinerRPCAPI):
|
|||||||
encoded using a token from the miner, all privileged commands do
|
encoded using a token from the miner, all privileged commands do
|
||||||
this automatically for you and will decode the output to look like
|
this automatically for you and will decode the output to look like
|
||||||
a normal output from a miner API.
|
a normal output from a miner API.
|
||||||
|
|
||||||
Parameters:
|
|
||||||
ip: The IP of the miner to reference the API on.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, ip: str, port: int = 4028, api_ver: str = "0.0.0") -> None:
|
def __init__(self, ip: str, port: int = 4028, api_ver: str = "0.0.0") -> None:
|
||||||
|
|||||||
@@ -29,9 +29,6 @@ class CGMinerRPCAPI(BaseMinerRPCAPI):
|
|||||||
function handles sending a command to the miner asynchronously, and
|
function handles sending a command to the miner asynchronously, and
|
||||||
as such is the base for many of the functions in this class, which
|
as such is the base for many of the functions in this class, which
|
||||||
rely on it to send the command for them.
|
rely on it to send the command for them.
|
||||||
|
|
||||||
Parameters:
|
|
||||||
ip: The IP of the miner to reference the API on.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
async def version(self) -> dict:
|
async def version(self) -> dict:
|
||||||
|
|||||||
@@ -29,9 +29,6 @@ class GCMinerRPCAPI(BaseMinerRPCAPI):
|
|||||||
function handles sending a command to the miner asynchronously, and
|
function handles sending a command to the miner asynchronously, and
|
||||||
as such is the base for many of the functions in this class, which
|
as such is the base for many of the functions in this class, which
|
||||||
rely on it to send the command for them.
|
rely on it to send the command for them.
|
||||||
|
|
||||||
Parameters:
|
|
||||||
ip: The IP of the miner to reference the API on.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
async def asc(self, n: int) -> dict:
|
async def asc(self, n: int) -> dict:
|
||||||
|
|||||||
@@ -30,9 +30,6 @@ class LUXMinerRPCAPI(BaseMinerRPCAPI):
|
|||||||
function handles sending a command to the miner asynchronously, and
|
function handles sending a command to the miner asynchronously, and
|
||||||
as such is the base for many of the functions in this class, which
|
as such is the base for many of the functions in this class, which
|
||||||
rely on it to send the command for them.
|
rely on it to send the command for them.
|
||||||
|
|
||||||
Parameters:
|
|
||||||
ip: The IP of the miner to reference the API on.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
async def addgroup(self, name: str, quota: int) -> dict:
|
async def addgroup(self, name: str, quota: int) -> dict:
|
||||||
|
|||||||
Reference in New Issue
Block a user