Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

pyasic-umhost

Упрощённый и стандартизированный интерфейс для управления Bitcoin ASIC-майнерами.

Форк pyasic — асинхронная Python-библиотека для обнаружения, опроса и управления ASIC-майнерами (Antminer, Whatsminer, Avalon, Braiins OS, VNish, LuxOS, Goldshell, Auradine, Innosilicon, ePIC, Hiveon, BitAxe, Iceriver, Volcminer и др.).

Форк добавляет:

  • app.py — Streamlit-интерфейс поверх библиотеки.
  • inspector/ — инструмент для сбора полного отчёта по майнеру.

Python >3.10, <4.0. Лицензия Apache-2.0.


Установка

Дистрибутив называется pyasic-umhost, но импортируется как pyasic:

pip install pyasic-umhost
import pyasic

Установка для разработки

poetry install --with dev      # добавьте ,docs для зависимостей mkdocs
pre-commit install

Запуск Streamlit-интерфейса

Streamlit не объявлен в зависимостях pyproject.toml — установите его отдельно:

pip install streamlit
streamlit run app.py

Быстрый старт

Поиск майнеров в сети

MinerNetwork сканирует подсеть и возвращает список найденных майнеров с уже определённым типом.

import asyncio
from pyasic.network import MinerNetwork


async def scan_miners():
    # любой IP трактуется как подсеть /24 (255 адресов)
    network = MinerNetwork.from_subnet("192.168.1.50/24")  # сеть 192.168.1.0-255
    miners = await network.scan()
    print(miners)


if __name__ == "__main__":
    asyncio.run(scan_miners())

Подключение по известному IP

Если IP уже известен, используйте get_miner() — он определит модель майнера или вернёт UnknownMiner.

import asyncio
from pyasic import get_miner


async def get_miners():
    # быстрее опрашивать несколько майнеров параллельно через asyncio.gather
    tasks = [get_miner("192.168.1.75"), get_miner("192.168.1.76")]
    miners = await asyncio.gather(*tasks)
    print(miners)


if __name__ == "__main__":
    asyncio.run(get_miners())

Получение данных

get_data() возвращает экземпляр MinerData со всеми данными, которые удалось собрать. Любое поле доступно как атрибут, например MinerData().hashrate.

import asyncio
from pyasic import get_miner


async def gather_miner_data():
    miner = await get_miner("192.168.1.75")
    if miner is not None:
        data = await miner.get_data()
        print(data)            # весь датакласс
        print(data.hashrate)   # хешрейт в TH/s


if __name__ == "__main__":
    asyncio.run(gather_miner_data())

Для нескольких майнеров запускайте get_data() параллельно:

all_data = await asyncio.gather(*[m.get_data() for m in miners])

Экземпляры MinerData можно складывать и делить на число — удобно для усреднённых данных по парку:

from pyasic import MinerData

data = [MinerData("192.168.1.1"), MinerData("192.168.1.2")]
average = sum(data, start=MinerData("0.0.0.0")) / len(data)

Управление майнером

Каждый класс майнера реализует единый набор управляющих методов из BaseMiner: check_light, fault_light_on, fault_light_off, get_config, get_data, get_errors, get_hostname, get_model, reboot, restart_backend, stop_mining, resume_mining, is_mining, send_config, set_power_limit.

import asyncio
from pyasic import get_miner


async def control():
    miner = await get_miner("192.168.1.20")

    # включить сигнальный диод
    await miner.fault_light_on()

    # прочитать и записать конфиг
    cfg = await miner.get_config()
    await miner.send_config(cfg)


if __name__ == "__main__":
    asyncio.run(control())

MinerConfig — это унифицированное представление конфигурации майнера (возврат get_config()). send_config() сам конвертирует его в нужный для конкретного майнера формат.


Настройки

Глобальные настройки (pyasic.settings) упрощают работу с большими парками — например, общий пароль по умолчанию:

from pyasic import settings

settings.update("default_antminer_web_password", "my_pwd")

Значения по умолчанию:

"network_ping_retries": 1,
"network_ping_timeout": 3,
"network_scan_semaphore": None,
"factory_get_retries": 1,
"factory_get_timeout": 3,
"get_data_retries": 1,
"api_function_timeout": 5,
"antminer_mining_mode_as_str": False,
"default_whatsminer_rpc_password": "admin",
"default_innosilicon_web_password": "admin",
"default_antminer_web_password": "root",
"default_bosminer_web_password": "root",
"default_vnish_web_password": "admin",
"default_goldshell_web_password": "123456789",
"default_auradine_web_password": "admin",
"default_epic_web_password": "letmein",
"default_hive_web_password": "admin",
"default_antminer_ssh_password": "miner",
"default_bosminer_ssh_password": "root",

# РАСШИРЕННЫЕ — меняйте только если понимаете, что делаете
"socket_linger_time": 1000,

Тесты

Тесты на стандартном unittest (не pytest):

python -m unittest discover -p '*test.py'    # весь набор
ruff check --fix && ruff format              # линт и форматирование
mypy                                         # проверка типов

Сборка и публикация на PyPI

Сборка и публикация идут через Poetry. Бэкенд сборки — poetry-core.

1. Поднять версию

PyPI не даёт перезалить уже существующую версию, поэтому перед каждым релизом меняйте version в [project] файла pyproject.toml (например 0.3.0.dev2 → 0.3.0.dev3 или 0.3.0).

Версии вида 0.3.0.devN — это пре-релизы: pip install pyasic-umhost их по умолчанию не ставит, нужен pip install --pre pyasic-umhost. Для обычного релиза используйте чистую версию без .devN.

2. Настроить токен (один раз)

Получите API-токен на https://pypi.org/manage/account/token/ и сохраните его:

poetry config pypi-token.pypi pypi-AgEIcHl...ваш_токен

3. Собрать и опубликовать

rm -rf dist/        # на всякий случай чистим старые сборки
poetry build        # создаст dist/*.whl и dist/*.tar.gz
poetry publish      # зальёт на PyPI

Или одной командой:

poetry publish --build

Проверка на TestPyPI (необязательно)

Чтобы прогнать релиз без риска для боевого PyPI:

poetry config repositories.testpypi https://test.pypi.org/legacy/
poetry config pypi-token.testpypi pypi-<test-токен>
poetry publish --build -r testpypi

pip install --pre -i https://test.pypi.org/simple/ pyasic-umhost

Если poetry падает с Library not loaded: .../Python.framework/... — это значит, что Homebrew обновил Python и venv самого Poetry сломался. Переустановите Poetry:

rm -rf "$HOME/Library/Application Support/pypoetry"
curl -sSL https://install.python-poetry.org | python3 -

Release files for pyasic-umhost 0.3.0.dev4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pyasic-umhost 0.3.0.dev4
File Size Uploaded
pyasic_umhost-0.3.0.dev4.tar.gz 218.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pyasic-umhost 0.3.0.dev4
File Interpreter ABI Platform
pyasic_umhost-0.3.0.dev4-py3-none-any.whl Python 3 none any Details

Total release size: 758.3 kB

Release files / pyasic_umhost-0.3.0.dev4.tar.gz

Download URL pyasic_umhost-0.3.0.dev4.tar.gz
Size 218.2 kB
Tags Source
SHA-256 checksum
How to use checksums
bf863d14dc84eef6e054a8c72c580859f082904e40c2708d5bbf84d308bef849
BLAKE2b-256 checksum
How to use checksums
8e460a0fcfa848ebf7dfa5eb5b29ec616614678c012a9433006f7f0f28fe0b60
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.4.1 CPython/3.13.14 Darwin/25.5.0

Release files / pyasic_umhost-0.3.0.dev4-py3-none-any.whl

Download URL pyasic_umhost-0.3.0.dev4-py3-none-any.whl
Size 540.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cd099c66be9a6aa0a94293adb3747b8a9c7643c8102f4d711c82f1de41cec54c
BLAKE2b-256 checksum
How to use checksums
145d2cb6f720a86020426a180392845556f71a552aca428750ed1ee2786c0c35
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.4.1 CPython/3.13.14 Darwin/25.5.0

Release history Release notifications | RSS feed

This release

0.3.0.dev4 This release

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

0.0.9

2 release files

0.0.8

2 release files

0.0.7

2 release files

0.0.6

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page