From ab0dcd607bc7f4402e9b7f7e44f33fbdb0005a90 Mon Sep 17 00:00:00 2001 From: John-Paul Compagnone Date: Sat, 10 Feb 2024 21:59:08 -0500 Subject: [PATCH 1/7] make ePIC api calls more reliable --- pyasic/miners/factory.py | 15 ++++++---- pyasic/web/epic.py | 61 +++++++++++++++++++++------------------- 2 files changed, 41 insertions(+), 35 deletions(-) diff --git a/pyasic/miners/factory.py b/pyasic/miners/factory.py index 810ea5f3..48dbaf91 100644 --- a/pyasic/miners/factory.py +++ b/pyasic/miners/factory.py @@ -939,12 +939,15 @@ class MinerFactory: pass async def get_miner_model_epic(self, ip: str) -> str | None: - sock_json_data = await self.send_web_command(ip, ":4028/capabilities") - try: - miner_model = sock_json_data["Model"] - return miner_model - except (TypeError, LookupError): - pass + for retry_cnt in range(settings.get("get_data_retries", 1)): + sock_json_data = await self.send_web_command(ip, ":4028/capabilities") + try: + miner_model = sock_json_data["Model"] + return miner_model + except (TypeError, LookupError): + if retry_cnt < settings.get("get_data_retries", 1) - 1: + continue + pass async def get_miner_model_hiveon(self, ip: str) -> str | None: sock_json_data = await self.send_api_command(ip, "version") diff --git a/pyasic/web/epic.py b/pyasic/web/epic.py index 8442a905..dd4107ca 100644 --- a/pyasic/web/epic.py +++ b/pyasic/web/epic.py @@ -44,37 +44,40 @@ class ePICWebAPI(BaseWebAPI): post = privileged or not parameters == {} async with httpx.AsyncClient(transport=settings.transport()) as client: - try: - if post: - response = await client.post( - f"http://{self.ip}:{self.port}/{command}", - timeout=5, - json={ - **parameters, - "password": self.pwd, - }, - ) - else: - response = await client.get( - f"http://{self.ip}:{self.port}/{command}", - timeout=5, - ) - if not response.status_code == 200: - if not ignore_errors: - raise APIError( - f"Web command {command} failed with status code {response.status_code}" + for retry_cnt in range(settings.get("get_data_retries", 1)): + try: + if post: + response = await client.post( + f"http://{self.ip}:{self.port}/{command}", + timeout=5, + json={ + **parameters, + "password": self.pwd, + }, ) - return {} - json_data = response.json() - if json_data: - # The API can return a fail status if the miner cannot return the requested data. Catch this and pass - if not json_data.get("result", True) and not post: + else: + response = await client.get( + f"http://{self.ip}:{self.port}/{command}", + timeout=5, + ) + if not response.status_code == 200: if not ignore_errors: - raise APIError(json_data["error"]) - return json_data - return {"success": True} - except (httpx.HTTPError, json.JSONDecodeError, AttributeError): - pass + raise APIError( + f"Web command {command} failed with status code {response.status_code}" + ) + return {} + json_data = response.json() + if json_data: + # The API can return a fail status if the miner cannot return the requested data. Catch this and pass + if not json_data.get("result", True) and not post: + if retry_cnt < settings.get("get_data_retries", 1) - 1: + continue + if not ignore_errors: + raise APIError(json_data["error"]) + return json_data + return {"success": True} + except (httpx.HTTPError, json.JSONDecodeError, AttributeError): + pass async def multicommand( self, *commands: str, ignore_errors: bool = False, allow_warning: bool = True From c25ff6fcefd255baa366e16fe757e162aa81aacd Mon Sep 17 00:00:00 2001 From: John-Paul Compagnone Date: Sun, 11 Feb 2024 10:55:49 -0500 Subject: [PATCH 2/7] add ePIC Blockminer 520i support --- pyasic/miners/blockminer/__init__.py | 17 ++++++++++++++ pyasic/miners/blockminer/epic/__init__.py | 17 ++++++++++++++ .../blockminer/epic/blockminer/__init__.py | 19 ++++++++++++++++ .../blockminer/epic/blockminer/blockminer.py | 22 +++++++++++++++++++ pyasic/miners/factory.py | 2 ++ pyasic/miners/makes/__init__.py | 4 ++++ pyasic/miners/models/__init__.py | 1 + pyasic/miners/models/epic/__init__.py | 1 + .../miners/models/epic/blockminer/__init__.py | 1 + .../models/epic/blockminer/blockminer.py | 7 ++++++ 10 files changed, 91 insertions(+) create mode 100644 pyasic/miners/blockminer/__init__.py create mode 100644 pyasic/miners/blockminer/epic/__init__.py create mode 100644 pyasic/miners/blockminer/epic/blockminer/__init__.py create mode 100644 pyasic/miners/blockminer/epic/blockminer/blockminer.py create mode 100644 pyasic/miners/models/epic/__init__.py create mode 100644 pyasic/miners/models/epic/blockminer/__init__.py create mode 100644 pyasic/miners/models/epic/blockminer/blockminer.py diff --git a/pyasic/miners/blockminer/__init__.py b/pyasic/miners/blockminer/__init__.py new file mode 100644 index 00000000..4664d00a --- /dev/null +++ b/pyasic/miners/blockminer/__init__.py @@ -0,0 +1,17 @@ +# ------------------------------------------------------------------------------ +# 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 .epic import * diff --git a/pyasic/miners/blockminer/epic/__init__.py b/pyasic/miners/blockminer/epic/__init__.py new file mode 100644 index 00000000..b063d429 --- /dev/null +++ b/pyasic/miners/blockminer/epic/__init__.py @@ -0,0 +1,17 @@ +# ------------------------------------------------------------------------------ +# 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 .blockminer import * diff --git a/pyasic/miners/blockminer/epic/blockminer/__init__.py b/pyasic/miners/blockminer/epic/blockminer/__init__.py new file mode 100644 index 00000000..bba5e29f --- /dev/null +++ b/pyasic/miners/blockminer/epic/blockminer/__init__.py @@ -0,0 +1,19 @@ +# ------------------------------------------------------------------------------ +# 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 .blockminer import ( + ePICBlockMiner520, +) diff --git a/pyasic/miners/blockminer/epic/blockminer/blockminer.py b/pyasic/miners/blockminer/epic/blockminer/blockminer.py new file mode 100644 index 00000000..5ec0dea8 --- /dev/null +++ b/pyasic/miners/blockminer/epic/blockminer/blockminer.py @@ -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 ePIC +from pyasic.miners.models import Blockminer520 + + +class ePICBlockMiner520(ePIC, Blockminer520): + pass diff --git a/pyasic/miners/factory.py b/pyasic/miners/factory.py index 48dbaf91..3c37359b 100644 --- a/pyasic/miners/factory.py +++ b/pyasic/miners/factory.py @@ -29,6 +29,7 @@ from pyasic import settings from pyasic.logger import logger from pyasic.miners.antminer import * from pyasic.miners.auradine import * +from pyasic.miners.blockminer import * from pyasic.miners.avalonminer import * from pyasic.miners.backends import ( Auradine, @@ -393,6 +394,7 @@ MINER_CLASSES = { "ANTMINER S19K PRO": ePICS19kPro, "ANTMINER S19 XP": ePICS19XP, "ANTMINER S21": ePICS21, + "BLOCKMINER 520I": ePICBlockMiner520, }, MinerTypes.HIVEON: { None: Hiveon, diff --git a/pyasic/miners/makes/__init__.py b/pyasic/miners/makes/__init__.py index de86dfd2..8cbd72c0 100644 --- a/pyasic/miners/makes/__init__.py +++ b/pyasic/miners/makes/__init__.py @@ -39,3 +39,7 @@ class GoldshellMake(BaseMiner): class AuradineMake(BaseMiner): make = "Auradine" + + +class ePICMake(BaseMiner): + make = "ePIC" diff --git a/pyasic/miners/models/__init__.py b/pyasic/miners/models/__init__.py index e9f4f41b..00036809 100644 --- a/pyasic/miners/models/__init__.py +++ b/pyasic/miners/models/__init__.py @@ -20,3 +20,4 @@ from .avalonminer import * from .goldshell import * from .innosilicon import * from .whatsminer import * +from .epic import * diff --git a/pyasic/miners/models/epic/__init__.py b/pyasic/miners/models/epic/__init__.py new file mode 100644 index 00000000..f0b88835 --- /dev/null +++ b/pyasic/miners/models/epic/__init__.py @@ -0,0 +1 @@ +from .blockminer import * diff --git a/pyasic/miners/models/epic/blockminer/__init__.py b/pyasic/miners/models/epic/blockminer/__init__.py new file mode 100644 index 00000000..f0b88835 --- /dev/null +++ b/pyasic/miners/models/epic/blockminer/__init__.py @@ -0,0 +1 @@ +from .blockminer import * diff --git a/pyasic/miners/models/epic/blockminer/blockminer.py b/pyasic/miners/models/epic/blockminer/blockminer.py new file mode 100644 index 00000000..d7798bc7 --- /dev/null +++ b/pyasic/miners/models/epic/blockminer/blockminer.py @@ -0,0 +1,7 @@ +from pyasic.miners.makes import ePICMake + + +class Blockminer520(ePICMake): + raw_model = "Blockminer 520i" + expected_chips = 124 + expected_fans = 4 From b71c4481990e1e4fc4bd8fd8582a8b73ebbe44e3 Mon Sep 17 00:00:00 2001 From: John-Paul Compagnone Date: Tue, 20 Feb 2024 18:11:57 -0500 Subject: [PATCH 3/7] add missing i --- pyasic/miners/blockminer/epic/blockminer/blockminer.py | 4 ++-- pyasic/miners/models/epic/blockminer/blockminer.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pyasic/miners/blockminer/epic/blockminer/blockminer.py b/pyasic/miners/blockminer/epic/blockminer/blockminer.py index 5ec0dea8..09dc1e27 100644 --- a/pyasic/miners/blockminer/epic/blockminer/blockminer.py +++ b/pyasic/miners/blockminer/epic/blockminer/blockminer.py @@ -15,8 +15,8 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import ePIC -from pyasic.miners.models import Blockminer520 +from pyasic.miners.models import Blockminer520i -class ePICBlockMiner520(ePIC, Blockminer520): +class ePICBlockMiner520(ePIC, Blockminer520i): pass diff --git a/pyasic/miners/models/epic/blockminer/blockminer.py b/pyasic/miners/models/epic/blockminer/blockminer.py index d7798bc7..509acb7b 100644 --- a/pyasic/miners/models/epic/blockminer/blockminer.py +++ b/pyasic/miners/models/epic/blockminer/blockminer.py @@ -1,7 +1,7 @@ from pyasic.miners.makes import ePICMake -class Blockminer520(ePICMake): +class Blockminer520i(ePICMake): raw_model = "Blockminer 520i" expected_chips = 124 expected_fans = 4 From 5d80051f3bfb04d4e3c34ffd1f582261b4caa356 Mon Sep 17 00:00:00 2001 From: John-Paul Compagnone Date: Tue, 20 Feb 2024 18:15:40 -0500 Subject: [PATCH 4/7] more missing i --- pyasic/miners/blockminer/epic/blockminer/__init__.py | 2 +- pyasic/miners/blockminer/epic/blockminer/blockminer.py | 2 +- pyasic/miners/factory.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pyasic/miners/blockminer/epic/blockminer/__init__.py b/pyasic/miners/blockminer/epic/blockminer/__init__.py index bba5e29f..f03cdba4 100644 --- a/pyasic/miners/blockminer/epic/blockminer/__init__.py +++ b/pyasic/miners/blockminer/epic/blockminer/__init__.py @@ -15,5 +15,5 @@ # ------------------------------------------------------------------------------ from .blockminer import ( - ePICBlockMiner520, + ePICBlockMiner520i, ) diff --git a/pyasic/miners/blockminer/epic/blockminer/blockminer.py b/pyasic/miners/blockminer/epic/blockminer/blockminer.py index 09dc1e27..b5519302 100644 --- a/pyasic/miners/blockminer/epic/blockminer/blockminer.py +++ b/pyasic/miners/blockminer/epic/blockminer/blockminer.py @@ -18,5 +18,5 @@ from pyasic.miners.backends import ePIC from pyasic.miners.models import Blockminer520i -class ePICBlockMiner520(ePIC, Blockminer520i): +class ePICBlockMiner520i(ePIC, Blockminer520i): pass diff --git a/pyasic/miners/factory.py b/pyasic/miners/factory.py index 1e42fd1b..c6f8c33b 100644 --- a/pyasic/miners/factory.py +++ b/pyasic/miners/factory.py @@ -397,7 +397,7 @@ MINER_CLASSES = { "ANTMINER S19K PRO": ePICS19kPro, "ANTMINER S19 XP": ePICS19XP, "ANTMINER S21": ePICS21, - "BLOCKMINER 520I": ePICBlockMiner520, + "BLOCKMINER 520I": ePICBlockMiner520i, }, MinerTypes.HIVEON: { None: Hiveon, From c6bcd7e05a4521d8f0257806d23e3ecea322ef94 Mon Sep 17 00:00:00 2001 From: John-Paul Compagnone Date: Tue, 20 Feb 2024 20:33:30 -0500 Subject: [PATCH 5/7] fix capitalization --- pyasic/miners/blockminer/epic/blockminer/blockminer.py | 4 ++-- pyasic/miners/models/epic/blockminer/blockminer.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pyasic/miners/blockminer/epic/blockminer/blockminer.py b/pyasic/miners/blockminer/epic/blockminer/blockminer.py index b5519302..a80b25b4 100644 --- a/pyasic/miners/blockminer/epic/blockminer/blockminer.py +++ b/pyasic/miners/blockminer/epic/blockminer/blockminer.py @@ -15,8 +15,8 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import ePIC -from pyasic.miners.models import Blockminer520i +from pyasic.miners.models import BlockMiner520i -class ePICBlockMiner520i(ePIC, Blockminer520i): +class ePICBlockMiner520i(ePIC, BlockMiner520i): pass diff --git a/pyasic/miners/models/epic/blockminer/blockminer.py b/pyasic/miners/models/epic/blockminer/blockminer.py index 509acb7b..583b8c51 100644 --- a/pyasic/miners/models/epic/blockminer/blockminer.py +++ b/pyasic/miners/models/epic/blockminer/blockminer.py @@ -1,7 +1,7 @@ from pyasic.miners.makes import ePICMake -class Blockminer520i(ePICMake): - raw_model = "Blockminer 520i" +class BlockMiner520i(ePICMake): + raw_model = "BlockMiner 520i" expected_chips = 124 expected_fans = 4 From 825d1f4cfb51da52dca907041cdf68e62672dbdb Mon Sep 17 00:00:00 2001 From: John-Paul Compagnone Date: Tue, 20 Feb 2024 20:39:22 -0500 Subject: [PATCH 6/7] fix checks --- pyasic/data/__init__.py | 6 +++--- pyasic/miners/factory.py | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/pyasic/data/__init__.py b/pyasic/data/__init__.py index 835c28ea..eb6d1e4a 100644 --- a/pyasic/data/__init__.py +++ b/pyasic/data/__init__.py @@ -94,9 +94,9 @@ class MinerData: percent_expected_wattage: float = field(init=False) nominal: bool = field(init=False) config: MinerConfig = None - errors: List[ - Union[WhatsminerError, BraiinsOSError, X19Error, InnosiliconError] - ] = field(default_factory=list) + errors: List[Union[WhatsminerError, BraiinsOSError, X19Error, InnosiliconError]] = ( + field(default_factory=list) + ) fault_light: Union[bool, None] = None efficiency: int = field(init=False) is_mining: bool = True diff --git a/pyasic/miners/factory.py b/pyasic/miners/factory.py index c6f8c33b..85c8d8ae 100644 --- a/pyasic/miners/factory.py +++ b/pyasic/miners/factory.py @@ -952,7 +952,8 @@ class MinerFactory: except (TypeError, LookupError): if retry_cnt < settings.get("get_data_retries", 1) - 1: continue - pass + else: + pass async def get_miner_model_hiveon(self, ip: str) -> str | None: sock_json_data = await self.send_api_command(ip, "version") From bc3bd9e5da7764b756ac3ef62dab99d1be27d98e Mon Sep 17 00:00:00 2001 From: Brett Rowan <121075405+b-rowan@users.noreply.github.com> Date: Wed, 21 Feb 2024 13:20:41 -0700 Subject: [PATCH 7/7] Fix issue with possible type hint incompatability. --- pyasic/data/__init__.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pyasic/data/__init__.py b/pyasic/data/__init__.py index eb6d1e4a..a7860630 100644 --- a/pyasic/data/__init__.py +++ b/pyasic/data/__init__.py @@ -94,9 +94,7 @@ class MinerData: percent_expected_wattage: float = field(init=False) nominal: bool = field(init=False) config: MinerConfig = None - errors: List[Union[WhatsminerError, BraiinsOSError, X19Error, InnosiliconError]] = ( - field(default_factory=list) - ) + errors: List[Union[WhatsminerError, BraiinsOSError, X19Error, InnosiliconError]] = field(default_factory=list) fault_light: Union[bool, None] = None efficiency: int = field(init=False) is_mining: bool = True