Compare commits

...

20 Commits

Author SHA1 Message Date
Brett Rowan
89641c6316 version: bump version number 2024-12-20 09:26:16 -07:00
Brett Rowan
136ff6a688 feature: add generic hashrate type for doing sums 2024-12-20 09:25:52 -07:00
Brett Rowan
d918d93f4a version: bump version number 2024-12-20 09:21:32 -07:00
Brett Rowan
8046c532a6 bug: fix some issues with adding hashrate types 2024-12-20 09:21:06 -07:00
Upstream Data
92820a362d version: bump version number 2024-12-17 08:15:37 -07:00
aquariuslt
9fd90031a9 fix: update data.env_temp type to float 2024-12-17 08:14:59 -07:00
Brett Rowan
2f2223a112 version: bump version number 2024-12-16 20:06:33 -07:00
Wilfred Allyn
50e6cf9dfd feature: add supports_autotuning to vnish 2024-12-16 07:43:15 -07:00
Wilfred Allyn
1b5e3093e6 feature: set power to highest preset <= wattage 2024-12-16 07:43:15 -07:00
Wilfred Allyn
9e3578b4a2 feature: check vnish presets when set power 2024-12-16 07:43:15 -07:00
Wilfred Allyn
a3087e1a96 set vnish power limit 2024-12-16 07:43:15 -07:00
Brett Rowan
4b16ea2ca2 ci: update publish action 2024-12-10 13:55:30 -07:00
Upstream Data
5dd361c4ef version: bump version number 2024-12-10 13:05:20 -07:00
Upstream Data
098112742c bug: fix vnish config parsing in some overclocking cases 2024-12-10 13:04:58 -07:00
Upstream Data
cd31e0743e docs: update docs 2024-12-10 13:03:07 -07:00
Upstream Data
1a7d0bf7cc feature: add support for vnish S19k pro 2024-12-10 13:02:49 -07:00
Upstream Data
41b5ebf0f0 version: bump version number 2024-12-10 12:28:43 -07:00
Upstream Data
5436bede29 bug: add chip count for avalon 1126 Pro 2024-12-10 12:28:25 -07:00
Upstream Data
c01b3958dc version: bump version number 2024-12-10 11:13:40 -07:00
Upstream Data
c16367285f feature: add support for avalonminer 1126 Pro 2024-12-10 11:13:24 -07:00
19 changed files with 145 additions and 12 deletions

View File

@@ -13,10 +13,10 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4.2.2
- name: Publish GH release
uses: softprops/action-gh-release@v0.1.14
uses: softprops/action-gh-release@v2.1.0
- name: Build using poetry and publish to PyPi
uses: JRubics/poetry-publish@v1.11
uses: JRubics/poetry-publish@v2.0
with:
pypi_token: ${{ secrets.PYPI_API_KEY }}

View File

@@ -302,6 +302,13 @@
show_root_heading: false
heading_level: 4
## S19k Pro (VNish)
::: pyasic.miners.antminer.vnish.X19.S19.VNishS19kPro
handler: python
options:
show_root_heading: false
heading_level: 4
## T19 (VNish)
::: pyasic.miners.antminer.vnish.X19.T19.VNishT19
handler: python

View File

@@ -1,6 +1,13 @@
# pyasic
## A11X Models
## Avalon 1126 Pro (Stock)
::: pyasic.miners.avalonminer.cgminer.A11X.A1126.CGMinerAvalon1126Pro
handler: python
options:
show_root_heading: false
heading_level: 4
## Avalon 1166 Pro (Stock)
::: pyasic.miners.avalonminer.cgminer.A11X.A1166.CGMinerAvalon1166Pro
handler: python

View File

@@ -378,6 +378,7 @@ details {
<details>
<summary>A11X Series:</summary>
<ul>
<li><a href="../avalonminer/A11X#avalon-1126-pro-stock">Avalon 1126 Pro (Stock)</a></li>
<li><a href="../avalonminer/A11X#avalon-1166-pro-stock">Avalon 1166 Pro (Stock)</a></li>
</ul>
</details>
@@ -532,6 +533,7 @@ details {
<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#s19-pro-hydro-vnish">S19 Pro Hydro (VNish)</a></li>
<li><a href="../antminer/X19#s19k-pro-vnish">S19k Pro (VNish)</a></li>
<li><a href="../antminer/X19#t19-vnish">T19 (VNish)</a></li>
</ul>
</details>

View File

@@ -22,7 +22,7 @@ class MiningPreset(MinerConfigValue):
hashrate = None
else:
power = hr_power_split[0].replace("watt", "").strip()
hashrate = hr_power_split[1].replace("TH", "").strip()
hashrate = hr_power_split[1].replace("TH", "").replace(" LC", "").strip()
tuned = web_preset["status"] == "tuned"
modded_psu = web_preset["modded_psu_required"]
return cls(

View File

@@ -96,7 +96,7 @@ class MinerData(BaseModel):
expected_fans: int | None = None
# temperature
env_temp: int | None = None
env_temp: float | None = None
# power
wattage: int | None = None

View File

@@ -1,9 +1,11 @@
from __future__ import annotations
from abc import ABC, abstractmethod
from pydantic import BaseModel
from typing_extensions import Self
from .unit.base import AlgoHashRateUnitType
from .unit.base import AlgoHashRateUnitType, GenericUnit
class AlgoHashRateType(BaseModel, ABC):
@@ -27,36 +29,43 @@ class AlgoHashRateType(BaseModel, ABC):
return round(self.rate, n)
def __add__(self, other: Self | int | float) -> Self:
if isinstance(other, self.__class__):
if isinstance(other, AlgoHashRateType):
return self.__class__(
rate=self.rate + other.into(self.unit).rate, unit=self.unit
)
return self.__class__(rate=self.rate + other, unit=self.unit)
def __sub__(self, other: Self | int | float) -> Self:
if isinstance(other, self.__class__):
if isinstance(other, AlgoHashRateType):
return self.__class__(
rate=self.rate - other.into(self.unit).rate, unit=self.unit
)
return self.__class__(rate=self.rate - other, unit=self.unit)
def __truediv__(self, other: Self | int | float) -> Self:
if isinstance(other, self.__class__):
if isinstance(other, AlgoHashRateType):
return self.__class__(
rate=self.rate / other.into(self.unit).rate, unit=self.unit
)
return self.__class__(rate=self.rate / other, unit=self.unit)
def __floordiv__(self, other: Self | int | float) -> Self:
if isinstance(other, self.__class__):
if isinstance(other, AlgoHashRateType):
return self.__class__(
rate=self.rate // other.into(self.unit).rate, unit=self.unit
)
return self.__class__(rate=self.rate // other, unit=self.unit)
def __mul__(self, other: Self | int | float) -> Self:
if isinstance(other, self.__class__):
if isinstance(other, AlgoHashRateType):
return self.__class__(
rate=self.rate * other.into(self.unit).rate, unit=self.unit
)
return self.__class__(rate=self.rate * other, unit=self.unit)
class GenericHashrate(AlgoHashRateType):
def into(self, other: GenericUnit):
return self.__class__(
rate=self.rate / (other.value / self.unit.value), unit=other
)

View File

@@ -53,3 +53,16 @@ class AlgoHashRateUnitType(IntEnum):
def __repr__(self):
return str(self)
class GenericUnit(AlgoHashRateUnitType):
H = 1
KH = int(H) * 1000
MH = int(KH) * 1000
GH = int(MH) * 1000
TH = int(GH) * 1000
PH = int(TH) * 1000
EH = int(PH) * 1000
ZH = int(EH) * 1000
default = H

View File

@@ -296,6 +296,7 @@ class AvalonminerModels(MinerModelType):
Avalon1047 = "Avalon 1047"
Avalon1066 = "Avalon 1066"
Avalon1166Pro = "Avalon 1166 Pro"
Avalon1126Pro = "Avalon 1126 Pro"
Avalon1246 = "Avalon 1246"
AvalonNano3 = "Avalon Nano 3"

View File

@@ -22,6 +22,7 @@ from pyasic.miners.device.models import (
S19aPro,
S19j,
S19jPro,
S19kPro,
S19NoPIC,
S19Pro,
S19ProHydro,
@@ -62,3 +63,7 @@ class VNishS19jPro(VNish, S19jPro):
class VNishS19ProHydro(VNish, S19ProHydro):
pass
class VNishS19kPro(VNish, S19kPro):
pass

View File

@@ -20,6 +20,7 @@ from .S19 import (
VNishS19aPro,
VNishS19j,
VNishS19jPro,
VNishS19kPro,
VNishS19NoPIC,
VNishS19Pro,
VNishS19ProHydro,

View File

@@ -0,0 +1,22 @@
# ------------------------------------------------------------------------------
# Copyright 2022 Upstream Data Inc -
# -
# Licensed under the Apache License, Version 2.0 (the "License"); -
# you may not use this file except in compliance with the License. -
# You may obtain a copy of the License at -
# -
# http://www.apache.org/licenses/LICENSE-2.0 -
# -
# Unless required by applicable law or agreed to in writing, software -
# distributed under the License is distributed on an "AS IS" BASIS, -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.backends import AvalonMiner
from pyasic.miners.device.models import Avalon1126Pro
class CGMinerAvalon1126Pro(AvalonMiner, Avalon1126Pro):
pass

View File

@@ -14,4 +14,5 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
from .A1126 import CGMinerAvalon1126Pro
from .A1166 import CGMinerAvalon1166Pro

View File

@@ -14,6 +14,7 @@
# limitations under the License. -
# ------------------------------------------------------------------------------
import logging
from typing import Optional
from pyasic import MinerConfig
@@ -96,6 +97,7 @@ class VNish(VNishFirmware, BMMiner):
supports_shutdown = True
supports_presets = True
supports_autotuning = True
data_locations = VNISH_DATA_LOC
@@ -272,3 +274,27 @@ class VNish(VNishFirmware, BMMiner):
return self.config
self.config = MinerConfig.from_vnish(web_settings, web_presets)
return self.config
async def set_power_limit(self, wattage: int) -> bool:
config = await self.get_config()
valid_presets = [
preset.power
for preset in config.mining_mode.available_presets
if preset.tuned and preset.power <= wattage
]
new_wattage = max(valid_presets)
# Set power to highest preset <= wattage
try:
await self.web.set_power_limit(new_wattage)
updated_settings = await self.web.settings()
except APIError:
raise
except Exception as e:
logging.warning(f"{self} - Failed to set power limit: {e}")
return False
if int(updated_settings["miner"]["overclock"]["preset"]) == new_wattage:
return True
else:
return False

View File

@@ -0,0 +1,27 @@
# ------------------------------------------------------------------------------
# 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.device.algorithm import MinerAlgo
from pyasic.device.models import MinerModel
from pyasic.miners.device.makes import AvalonMinerMake
class Avalon1126Pro(AvalonMinerMake):
raw_model = MinerModel.AVALONMINER.Avalon1126Pro
expected_chips = 120
expected_fans = 4
expected_hashboards = 3
algo = MinerAlgo.SHA256

View File

@@ -15,4 +15,5 @@
# ------------------------------------------------------------------------------
from .A1126 import Avalon1126Pro
from .A1166 import Avalon1166Pro

View File

@@ -340,6 +340,7 @@ MINER_CLASSES = {
"AVALONMINER 1026": CGMinerAvalon1026,
"AVALONMINER 1047": CGMinerAvalon1047,
"AVALONMINER 1066": CGMinerAvalon1066,
"AVALONMINER 1126PRO": CGMinerAvalon1126Pro,
"AVALONMINER 1166PRO": CGMinerAvalon1166Pro,
"AVALONMINER 1246": CGMinerAvalon1246,
"AVALONMINER NANO3": CGMinerAvalonNano3,
@@ -406,6 +407,7 @@ MINER_CLASSES = {
"ANTMINER S19A": VNishS19a,
"ANTMINER S19A PRO": VNishS19aPro,
"ANTMINER S19 PRO HYD.": VNishS19ProHydro,
"ANTMINER S19K PRO": VNishS19kPro,
"ANTMINER T19": VNishT19,
"ANTMINER S21": VNishS21,
},

View File

@@ -138,6 +138,15 @@ class VNishWebAPI(BaseWebAPI):
async def settings(self) -> dict:
return await self.send_command("settings")
async def set_power_limit(self, wattage: int) -> bool:
# Can only set power limit to tuned preset
settings = await self.settings()
settings["miner"]["overclock"]["preset"] = str(wattage)
new_settings = {"miner": {"overclock": settings["miner"]["overclock"]}}
# response will always be {"restart_required":false,"reboot_required":false} even if unsuccessful
return await self.send_command("settings", privileged=True, **new_settings)
async def autotune_presets(self) -> dict:
return await self.send_command("autotune/presets")

View File

@@ -1,6 +1,6 @@
[tool.poetry]
name = "pyasic"
version = "0.65.5"
version = "0.66.3"
description = "A simplified and standardized interface for Bitcoin ASICs."
authors = ["UpstreamData <brett@upstreamdata.ca>"]
repository = "https://github.com/UpstreamData/pyasic"