From e55477a8b81fac684241dcc51083eddc4212b152 Mon Sep 17 00:00:00 2001
From: Brett Rowan <121075405+b-rowan@users.noreply.github.com>
Date: Mon, 21 Jul 2025 09:51:51 -0600
Subject: [PATCH] feature: add support for S19j+
Fixes: #330
---
docs/miners/antminer/X19.md | 13 +++++++++++++
docs/miners/supported_types.md | 1 +
pyasic/device/models.py | 1 +
pyasic/miners/antminer/bmminer/X19/S19.py | 5 +++++
pyasic/miners/antminer/bmminer/X19/__init__.py | 1 +
pyasic/miners/device/models/antminer/X19/S19.py | 9 +++++++++
.../miners/device/models/antminer/X19/__init__.py | 1 +
pyasic/miners/factory.py | 1 +
8 files changed, 32 insertions(+)
diff --git a/docs/miners/antminer/X19.md b/docs/miners/antminer/X19.md
index f655a931..a57307f1 100644
--- a/docs/miners/antminer/X19.md
+++ b/docs/miners/antminer/X19.md
@@ -183,6 +183,19 @@
show_root_heading: false
heading_level: 0
+## S19j+ (Stock)
+
+- [x] Shutdowns
+- [x] Power Modes
+- [ ] Setpoints
+- [ ] Presets
+
+::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19jPlus
+ handler: python
+ options:
+ show_root_heading: false
+ heading_level: 0
+
## S19j No PIC (Stock)
- [x] Shutdowns
diff --git a/docs/miners/supported_types.md b/docs/miners/supported_types.md
index 481c3cd2..91b4db37 100644
--- a/docs/miners/supported_types.md
+++ b/docs/miners/supported_types.md
@@ -86,6 +86,7 @@ details {
S19j No PIC (Stock)
S19 Pro+ (Stock)
S19j Pro (Stock)
+ S19j+ (Stock)
S19j Pro+ (Stock)
S19 XP (Stock)
S19a (Stock)
diff --git a/pyasic/device/models.py b/pyasic/device/models.py
index 92dae912..6f98591f 100644
--- a/pyasic/device/models.py
+++ b/pyasic/device/models.py
@@ -43,6 +43,7 @@ class AntminerModels(MinerModelType):
S19jNoPIC = "S19j No PIC"
S19ProPlus = "S19 Pro+"
S19jPro = "S19j Pro"
+ S19jPlus = "S19j+"
S19jProNoPIC = "S19j Pro No PIC"
S19jProPlus = "S19j Pro+"
S19jProPlusNoPIC = "S19j Pro+ No PIC"
diff --git a/pyasic/miners/antminer/bmminer/X19/S19.py b/pyasic/miners/antminer/bmminer/X19/S19.py
index d2b08ec2..8cd8d2a9 100644
--- a/pyasic/miners/antminer/bmminer/X19/S19.py
+++ b/pyasic/miners/antminer/bmminer/X19/S19.py
@@ -25,6 +25,7 @@ from pyasic.miners.device.models import (
S19i,
S19j,
S19jNoPIC,
+ S19jPlus,
S19jPro,
S19jProPlus,
S19jXP,
@@ -81,6 +82,10 @@ class BMMinerS19jPro(AntminerModern, S19jPro):
pass
+class BMMinerS19jPlus(AntminerModern, S19jPlus):
+ pass
+
+
class BMMinerS19L(AntminerModern, S19L):
pass
diff --git a/pyasic/miners/antminer/bmminer/X19/__init__.py b/pyasic/miners/antminer/bmminer/X19/__init__.py
index b6f72ff3..d1f4798f 100644
--- a/pyasic/miners/antminer/bmminer/X19/__init__.py
+++ b/pyasic/miners/antminer/bmminer/X19/__init__.py
@@ -22,6 +22,7 @@ from .S19 import (
BMMinerS19i,
BMMinerS19j,
BMMinerS19jNoPIC,
+ BMMinerS19jPlus,
BMMinerS19jPro,
BMMinerS19jProPlus,
BMMinerS19jXP,
diff --git a/pyasic/miners/device/models/antminer/X19/S19.py b/pyasic/miners/device/models/antminer/X19/S19.py
index 6a40b405..989b6894 100644
--- a/pyasic/miners/device/models/antminer/X19/S19.py
+++ b/pyasic/miners/device/models/antminer/X19/S19.py
@@ -126,6 +126,15 @@ class S19jPro(AntMinerMake):
algo = MinerAlgo.SHA256
+class S19jPlus(AntMinerMake):
+ raw_model = MinerModel.ANTMINER.S19jPlus
+
+ expected_chips = 108
+ expected_fans = 4
+ expected_hashboards = 3
+ algo = MinerAlgo.SHA256
+
+
class S19jProNoPIC(AntMinerMake):
raw_model = MinerModel.ANTMINER.S19jProNoPIC
diff --git a/pyasic/miners/device/models/antminer/X19/__init__.py b/pyasic/miners/device/models/antminer/X19/__init__.py
index c2ff64c8..43550efb 100644
--- a/pyasic/miners/device/models/antminer/X19/__init__.py
+++ b/pyasic/miners/device/models/antminer/X19/__init__.py
@@ -24,6 +24,7 @@ from .S19 import (
S19i,
S19j,
S19jNoPIC,
+ S19jPlus,
S19jPro,
S19jProNoPIC,
S19jProPlus,
diff --git a/pyasic/miners/factory.py b/pyasic/miners/factory.py
index 0c042ba1..7c33b25e 100644
--- a/pyasic/miners/factory.py
+++ b/pyasic/miners/factory.py
@@ -108,6 +108,7 @@ MINER_CLASSES = {
"ANTMINER S19J88NOPIC": BMMinerS19jNoPIC,
"ANTMINER S19PRO+": BMMinerS19ProPlus,
"ANTMINER S19J PRO": BMMinerS19jPro,
+ "ANTMINER S19J+": BMMinerS19jPlus,
"ANTMINER S19J PRO+": BMMinerS19jProPlus,
"ANTMINER S19 XP": BMMinerS19XP,
"ANTMINER S19A": BMMinerS19a,