Compare commits

...

38 Commits

Author SHA1 Message Date
Upstream Data
51a56f441c version: bump version number. 2023-02-18 09:34:29 -07:00
Upstream Data
54310b1d79 bug: fix bad capitalization on S99Bosminer. 2023-02-18 09:34:03 -07:00
Upstream Data
cb30b761dc version: bump version number. 2023-02-16 18:36:38 -07:00
Upstream Data
cb50a7cac8 feature: add support for configuring BOS+ BBB, and add support for new BOS+ config version 2.0. 2023-02-16 18:36:03 -07:00
UpstreamData
738af245cb version: bump version number. 2023-02-16 13:35:45 -07:00
UpstreamData
71e9af1b91 format: improve warning locations to remove warnings when connections are refused. 2023-02-16 13:35:20 -07:00
UpstreamData
1cd2566d0a version: bump version number. 2023-02-16 12:23:29 -07:00
UpstreamData
1f1e5f23a2 bug: fix a bug where not all errors could be handled when scanning. 2023-02-16 12:22:58 -07:00
UpstreamData
3394234e4f version: bump version number. 2023-02-16 08:58:17 -07:00
UpstreamData
e9882124ff formatting: removed print statements. 2023-02-16 08:57:51 -07:00
UpstreamData
1e5b19c149 version: bump version number. 2023-02-16 08:47:15 -07:00
UpstreamData
c9339fec2f bug: fix issues with new versions of braiins OS, and fix bugs with innosilicon miners not returning much data at all. 2023-02-16 08:46:32 -07:00
UpstreamData
018c09e84f version: bump version number. 2023-02-15 14:34:08 -07:00
UpstreamData
46e7f9a569 bug: remove a missed print statement. 2023-02-15 14:31:32 -07:00
UpstreamData
996ab58252 version: bump version number. 2023-02-15 14:19:57 -07:00
UpstreamData
04974d5287 bug: fix reboot and restart on btminer not returning data. 2023-02-15 14:17:57 -07:00
UpstreamData
1a8a5ccb0e version: bump version number. 2023-02-14 10:33:46 -07:00
UpstreamData
4c61c4c345 bug: add MAC address support for stock S9s. 2023-02-14 10:33:14 -07:00
UpstreamData
a6d6bfe73d version: bump version number. 2023-02-14 10:19:20 -07:00
UpstreamData
f159e9ccb4 bug: add additional X19 MAC address check. 2023-02-14 10:18:52 -07:00
UpstreamData
8ae2932274 version: bump version number. 2023-02-14 10:12:59 -07:00
UpstreamData
52786ba954 feature: add support for VNISH miners. 2023-02-14 10:12:13 -07:00
Upstream Data
f5cc526e8a version: bump version number. 2023-02-13 19:38:04 -07:00
Upstream Data
a616aaba04 bug: fix an issue where GQL can fail to get hostname for permission errors. 2023-02-13 19:37:07 -07:00
UpstreamData
15b4177ce4 formatting: update copyright formatting. 2023-02-13 16:03:38 -07:00
UpstreamData
5b382cdb0b version: bump version number. 2023-02-13 14:52:42 -07:00
UpstreamData
16622099c8 feature: add static IP configuration for whatsminers. 2023-02-13 14:52:18 -07:00
UpstreamData
a75434fe7b version: bump version number. 2023-02-13 12:39:20 -07:00
UpstreamData
020558ed4d Add the ability to set static IP and hostname on X19. 2023-02-13 12:38:03 -07:00
Upstream Data
39a82d03bc version: bump version number. 2023-02-11 21:28:16 -07:00
Upstream Data
41ecb5dbc6 bug: fix a bug with power_off not working properly with the respbefore flag by faking data, hopefully will be fixed by Whatsminer in a later update. 2023-02-11 21:27:51 -07:00
Upstream Data
2d057ca9f6 version: bump version number. 2023-02-11 19:45:03 -07:00
Upstream Data
b71b23d2a0 bug: add a check for power_on in reboot check. 2023-02-11 19:44:26 -07:00
UpstreamData
b32649435d version: bump version number. 2023-02-09 15:48:49 -07:00
UpstreamData
c0096126df bug: Reverse check for whatsminer fault light as it was backwards. 2023-02-09 15:47:11 -07:00
UpstreamData
d632360932 version: bump version number. 2023-02-09 10:37:19 -07:00
UpstreamData
400001fa38 version: bump version number. 2023-02-07 13:41:06 -07:00
UpstreamData
4ff32a8081 feature: allow get_data to pick which data to gather in the first place to allow for speed optimizations. 2023-02-07 13:40:09 -07:00
261 changed files with 4936 additions and 4350 deletions

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import asyncio import asyncio
import ipaddress import ipaddress
@@ -95,7 +97,9 @@ class BaseMinerAPI:
Parameters: Parameters:
*commands: The commands to send as a multicommand to the miner. *commands: The commands to send as a multicommand to the miner.
ignore_errors: Whether to raise APIError when the command returns an error.
allow_warning: A boolean to supress APIWarnings. allow_warning: A boolean to supress APIWarnings.
""" """
# make sure we can actually run each command, otherwise they will fail # make sure we can actually run each command, otherwise they will fail
commands = self._check_commands(*commands) commands = self._check_commands(*commands)
@@ -169,9 +173,14 @@ If you are sure you want to use this command please use API.send_command("{comma
writer.write(data) writer.write(data)
logging.debug(f"{self} - ([Hidden] Send Bytes) - Draining") logging.debug(f"{self} - ([Hidden] Send Bytes) - Draining")
await writer.drain() await writer.drain()
ret_data = await asyncio.wait_for(reader.read(4096), timeout=timeout)
# instantiate data try:
ret_data = b"" # Fix for stupid whatsminer bug, reboot/restart seem to not load properly in the loop
# have to receive, save the data, check if there is more data by reading with a short timeout
# append that data if there is more, and then onto the main loop.
ret_data += await asyncio.wait_for(reader.read(1), timeout=1)
except asyncio.TimeoutError:
return ret_data
# loop to receive all the data # loop to receive all the data
logging.debug(f"{self} - ([Hidden] Send Bytes) - Receiving") logging.debug(f"{self} - ([Hidden] Send Bytes) - Receiving")
@@ -240,6 +249,8 @@ If you are sure you want to use this command please use API.send_command("{comma
str_data = str_data.replace("}{", "},{") str_data = str_data.replace("}{", "},{")
# fix an error with a bmminer return having a specific comma that breaks json.loads() # fix an error with a bmminer return having a specific comma that breaks json.loads()
str_data = str_data.replace("[,{", "[{") str_data = str_data.replace("[,{", "[{")
# fix an error with a btminer return having a missing comma. (2023-01-06 version)
str_data = str_data.replace('""temp0', '","temp0')
# fix an error with Avalonminers returning inf and nan # fix an error with Avalonminers returning inf and nan
str_data = str_data.replace("info", "1nfo") str_data = str_data.replace("info", "1nfo")
str_data = str_data.replace("inf", "0") str_data = str_data.replace("inf", "0")

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import logging import logging
from pyasic.API import APIError, BaseMinerAPI from pyasic.API import APIError, BaseMinerAPI
@@ -63,8 +65,8 @@ class BMMinerAPI(BaseMinerAPI):
data[cmd].append( data[cmd].append(
await self.send_command(cmd, allow_warning=allow_warning) await self.send_command(cmd, allow_warning=allow_warning)
) )
except APIError as e: except APIError:
raise APIError(e) pass
except Exception as e: except Exception as e:
logging.warning( logging.warning(
f"{self} - ([Hidden] X19 Multicommand) - API Command Error {e}" f"{self} - ([Hidden] X19 Multicommand) - API Command Error {e}"

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.API import BaseMinerAPI from pyasic.API import BaseMinerAPI

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import asyncio import asyncio
import base64 import base64
@@ -245,17 +247,13 @@ class BTMinerAPI(BaseMinerAPI):
try: try:
data = await self._send_bytes(enc_command, timeout) data = await self._send_bytes(enc_command, timeout)
except (asyncio.CancelledError, asyncio.TimeoutError) as e: except (asyncio.CancelledError, asyncio.TimeoutError) as e:
if command["cmd"] in ["reboot", "restart"]: if ignore_errors:
logging.info( return {}
f"{self} - (reboot/restart) - Whatsminers currently break this. " raise APIError("No data was returned from the API.")
f"Ignoring exception. Command probably worked."
)
# FAKING IT HERE
data = b'{"STATUS": "S", "When": 1670966423, "Code": 131, "Msg": "API command OK", "Description": "Reboot"}'
else:
raise APIError("No data was returned from the API.")
if not data: if not data:
if ignore_errors:
return {}
raise APIError("No data was returned from the API.") raise APIError("No data was returned from the API.")
data = self._load_api_data(data) data = self._load_api_data(data)
@@ -542,6 +540,23 @@ class BTMinerAPI(BaseMinerAPI):
self.pwd = new_pwd self.pwd = new_pwd
return data return data
async def net_config(
self,
ip: str = None,
mask: str = None,
gate: str = None,
dns: str = None,
host: str = None,
dhcp: bool = True,
):
if dhcp:
return await self.send_privileged_command("net_config", param="dhcp")
if None in [ip, mask, gate, dns, host]:
raise APIError("Incorrect parameters.")
return await self.send_privileged_command(
"net_config", ip=ip, mask=mask, gate=gate, dns=dns, host=host
)
async def set_target_freq(self, percent: int) -> dict: async def set_target_freq(self, percent: int) -> dict:
"""Update the target frequency. """Update the target frequency.

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import logging import logging
@@ -61,7 +63,7 @@ class CGMinerAPI(BaseMinerAPI):
data[cmd] = [] data[cmd] = []
data[cmd].append(await self.send_command(cmd, allow_warning=True)) data[cmd].append(await self.send_command(cmd, allow_warning=True))
except APIError as e: except APIError as e:
raise APIError(e) pass
except Exception as e: except Exception as e:
logging.warning( logging.warning(
f"{self} - ([Hidden] X19 Multicommand) - API Command Error {e}" f"{self} - ([Hidden] X19 Multicommand) - API Command Error {e}"

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.API import BaseMinerAPI from pyasic.API import BaseMinerAPI

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.API.bmminer import BMMinerAPI from pyasic.API.bmminer import BMMinerAPI
from pyasic.API.bosminer import BOSMinerAPI from pyasic.API.bosminer import BOSMinerAPI
from pyasic.API.btminer import BTMinerAPI from pyasic.API.btminer import BTMinerAPI

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import json import json
import logging import logging
@@ -243,7 +245,9 @@ class MinerConfig:
fan_speed: Manual fan speed to run the fan at (only if temp_mode == "manual"). fan_speed: Manual fan speed to run the fan at (only if temp_mode == "manual").
asicboost: Whether or not to enable asicboost. asicboost: Whether or not to enable asicboost.
autotuning_enabled: Whether or not to enable autotuning. autotuning_enabled: Whether or not to enable autotuning.
autotuning_mode: Autotuning mode, either "wattage" or "hashrate".
autotuning_wattage: The wattage to use when autotuning. autotuning_wattage: The wattage to use when autotuning.
autotuning_hashrate: The hashrate to use when autotuning.
dps_enabled: Whether or not to enable dynamic power scaling. dps_enabled: Whether or not to enable dynamic power scaling.
dps_power_step: The amount of power to reduce autotuning by when the miner reaches dangerous temp. dps_power_step: The amount of power to reduce autotuning by when the miner reaches dangerous temp.
dps_min_power: The minimum power to reduce autotuning to. dps_min_power: The minimum power to reduce autotuning to.
@@ -264,7 +268,9 @@ class MinerConfig:
asicboost: bool = None asicboost: bool = None
autotuning_enabled: bool = True autotuning_enabled: bool = True
autotuning_wattage: int = 900 autotuning_mode: Literal["power", "hashrate"] = None
autotuning_wattage: int = None
autotuning_hashrate: int = None
dps_enabled: bool = None dps_enabled: bool = None
dps_power_step: int = None dps_power_step: int = None
@@ -347,14 +353,20 @@ class MinerConfig:
self.autotuning_enabled = data[key][_key] self.autotuning_enabled = data[key][_key]
elif _key == "psu_power_limit": elif _key == "psu_power_limit":
self.autotuning_wattage = data[key][_key] self.autotuning_wattage = data[key][_key]
elif _key == "power_target":
self.autotuning_wattage = data[key][_key]
elif _key == "hashrate_target":
self.autotuning_hashrate = data[key][_key]
elif _key == "mode":
self.autotuning_mode = data[key][_key].replace("_target", "")
if key == "power_scaling": if key in ["power_scaling", "performance_scaling"]:
for _key in data[key].keys(): for _key in data[key].keys():
if _key == "enabled": if _key == "enabled":
self.dps_enabled = data[key][_key] self.dps_enabled = data[key][_key]
elif _key == "power_step": elif _key == "power_step":
self.dps_power_step = data[key][_key] self.dps_power_step = data[key][_key]
elif _key == "min_psu_power_limit": elif _key in ["min_psu_power_limit", "min_power_target"]:
self.dps_min_power = data[key][_key] self.dps_min_power = data[key][_key]
elif _key == "shutdown_enabled": elif _key == "shutdown_enabled":
self.dps_shutdown_enabled = data[key][_key] self.dps_shutdown_enabled = data[key][_key]
@@ -480,7 +492,7 @@ class MinerConfig:
"format": { "format": {
"version": "1.2+", "version": "1.2+",
"model": f"Antminer {model}", "model": f"Antminer {model}",
"generator": "Upstream Config Utility", "generator": "pyasic",
"timestamp": int(time.time()), "timestamp": int(time.time()),
}, },
"group": [ "group": [
@@ -498,8 +510,16 @@ class MinerConfig:
cfg["autotuning"] = {} cfg["autotuning"] = {}
if self.autotuning_enabled: if self.autotuning_enabled:
cfg["autotuning"]["enabled"] = self.autotuning_enabled cfg["autotuning"]["enabled"] = self.autotuning_enabled
if self.autotuning_wattage: if self.autotuning_mode:
cfg["autotuning"]["psu_power_limit"] = self.autotuning_wattage cfg["format"]["version"] = "2.0"
cfg["autotuning"]["mode"] = self.autotuning_mode + "_target"
if self.autotuning_wattage:
cfg["autotuning"]["power_target"] = self.autotuning_wattage
elif self.autotuning_hashrate:
cfg["autotuning"]["hashrate_target"] = self.autotuning_hashrate
else:
if self.autotuning_wattage:
cfg["autotuning"]["psu_power_limit"] = self.autotuning_wattage
if self.asicboost: if self.asicboost:
cfg["hash_chain_global"] = {} cfg["hash_chain_global"] = {}
@@ -523,7 +543,10 @@ class MinerConfig:
if self.dps_power_step: if self.dps_power_step:
cfg["power_scaling"]["power_step"] = self.dps_power_step cfg["power_scaling"]["power_step"] = self.dps_power_step
if self.dps_min_power: if self.dps_min_power:
cfg["power_scaling"]["min_psu_power_limit"] = self.dps_min_power if cfg["format"]["version"] == "2.0":
cfg["power_scaling"]["min_power_target"] = self.dps_min_power
else:
cfg["power_scaling"]["min_psu_power_limit"] = self.dps_min_power
if self.dps_shutdown_enabled: if self.dps_shutdown_enabled:
cfg["power_scaling"]["shutdown_enabled"] = self.dps_shutdown_enabled cfg["power_scaling"]["shutdown_enabled"] = self.dps_shutdown_enabled
if self.dps_shutdown_duration: if self.dps_shutdown_duration:

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import copy import copy
import json import json
@@ -46,6 +48,17 @@ class HashBoard:
missing: bool = True missing: bool = True
@dataclass
class Fan:
"""A Dataclass to standardize fan data.
Attributes:
speed: The speed of the fan.
"""
speed: int = -1
@dataclass @dataclass
class MinerData: class MinerData:
"""A Dataclass to standardize data returned from miners (specifically `AnyMiner().get_data()`) """A Dataclass to standardize data returned from miners (specifically `AnyMiner().get_data()`)
@@ -120,10 +133,11 @@ class MinerData:
right_board_chip_temp: int = field(init=False) right_board_chip_temp: int = field(init=False)
wattage: int = -1 wattage: int = -1
wattage_limit: int = -1 wattage_limit: int = -1
fan_1: int = -1 fans: List[Fan] = field(default_factory=list)
fan_2: int = -1 fan_1: int = field(init=False)
fan_3: int = -1 fan_2: int = field(init=False)
fan_4: int = -1 fan_3: int = field(init=False)
fan_4: int = field(init=False)
fan_psu: int = -1 fan_psu: int = -1
left_chips: int = field(init=False) left_chips: int = field(init=False)
center_chips: int = field(init=False) center_chips: int = field(init=False)
@@ -199,6 +213,42 @@ class MinerData:
setattr(cp, key, item & other_item) setattr(cp, key, item & other_item)
return cp return cp
@property
def fan_1(self): # noqa - Skip PyCharm inspection
if len(self.fans) > 0:
return self.fans[0].speed
@fan_1.setter
def fan_1(self, val):
pass
@property
def fan_2(self): # noqa - Skip PyCharm inspection
if len(self.fans) > 1:
return self.fans[1].speed
@fan_2.setter
def fan_2(self, val):
pass
@property
def fan_3(self): # noqa - Skip PyCharm inspection
if len(self.fans) > 2:
return self.fans[2].speed
@fan_3.setter
def fan_3(self, val):
pass
@property
def fan_4(self): # noqa - Skip PyCharm inspection
if len(self.fans) > 3:
return self.fans[3].speed
@fan_4.setter
def fan_4(self, val):
pass
@property @property
def total_chips(self): # noqa - Skip PyCharm inspection def total_chips(self): # noqa - Skip PyCharm inspection
return sum([hb.chips for hb in self.hashboards]) return sum([hb.chips for hb in self.hashboards])

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from dataclasses import asdict, dataclass, fields from dataclasses import asdict, dataclass, fields

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from typing import TypeVar from typing import TypeVar

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from dataclasses import asdict, dataclass, fields from dataclasses import asdict, dataclass, fields

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from dataclasses import asdict, dataclass, field, fields from dataclasses import asdict, dataclass, field, fields

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from dataclasses import asdict, dataclass, field, fields from dataclasses import asdict, dataclass, field, fields

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
class APIError(Exception): class APIError(Exception):

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import logging import logging

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import ipaddress import ipaddress
from typing import Union from typing import Union

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import asyncio import asyncio
import json import json
@@ -25,7 +27,7 @@ from pyasic.miners._backends import BMMiner # noqa - Ignore access to _module
from pyasic.settings import PyasicSettings from pyasic.settings import PyasicSettings
class BMMinerX19(BMMiner): class X19(BMMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None: def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
super().__init__(ip, api_ver=api_ver) super().__init__(ip, api_ver=api_ver)
self.ip = ip self.ip = ip
@@ -124,6 +126,13 @@ class BMMinerX19(BMMiner):
except KeyError: except KeyError:
pass pass
try:
data = await self.send_web_command("get_network_info")
if data:
return data["macaddr"]
except KeyError:
pass
async def get_errors(self) -> List[MinerErrorData]: async def get_errors(self) -> List[MinerErrorData]:
errors = [] errors = []
data = await self.send_web_command("summary") data = await self.send_web_command("summary")
@@ -172,3 +181,53 @@ class BMMinerX19(BMMiner):
return round(ideal_rate, 2) return round(ideal_rate, 2)
except (KeyError, IndexError): except (KeyError, IndexError):
pass pass
async def set_static_ip(
self,
ip: str,
dns: str,
gateway: str,
subnet_mask: str = "255.255.255.0",
hostname: str = None,
):
if not hostname:
hostname = await self.get_hostname()
payload = {
"ipAddress": ip,
"ipDns": dns,
"ipGateway": gateway,
"ipHost": hostname,
"ipPro": 2, # static
"ipSub": subnet_mask,
}
await self.send_web_command("set_network_conf", params=payload)
async def set_dhcp(self, hostname: str = None):
if not hostname:
hostname = await self.get_hostname()
payload = {
"ipAddress": "",
"ipDns": "",
"ipGateway": "",
"ipHost": hostname,
"ipPro": 1, # DHCP
"ipSub": "",
}
await self.send_web_command("set_network_conf", params=payload)
async def set_hostname(self, hostname: str):
cfg = await self.send_web_command("get_network_info")
dns = cfg["conf_dnsservers"]
gateway = cfg["conf_gateway"]
ip = cfg["conf_ipaddress"]
subnet_mask = cfg["conf_netmask"]
protocol = 1 if cfg["conf_nettype"] == "DHCP" else 2
payload = {
"ipAddress": ip,
"ipDns": dns,
"ipGateway": gateway,
"ipHost": hostname,
"ipPro": protocol,
"ipSub": subnet_mask,
}
await self.send_web_command("set_network_conf", params=payload)

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from .bmminer import BMMiner from .bmminer import BMMiner
from .bosminer import BOSMiner from .bosminer import BOSMiner
@@ -18,3 +20,5 @@ from .btminer import BTMiner
from .cgminer import CGMiner from .cgminer import CGMiner
from .cgminer_avalon import CGMinerAvalon from .cgminer_avalon import CGMinerAvalon
from .hiveon import Hiveon from .hiveon import Hiveon
from .vnish import VNish
from .X19 import X19

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import ipaddress import ipaddress
import logging import logging
@@ -21,7 +23,7 @@ import asyncssh
from pyasic.API.bmminer import BMMinerAPI from pyasic.API.bmminer import BMMinerAPI
from pyasic.config import MinerConfig from pyasic.config import MinerConfig
from pyasic.data import HashBoard, MinerData from pyasic.data import Fan, HashBoard, MinerData
from pyasic.data.error_codes import MinerErrorData from pyasic.data.error_codes import MinerErrorData
from pyasic.errors import APIError from pyasic.errors import APIError
from pyasic.miners.base import BaseMiner from pyasic.miners.base import BaseMiner
@@ -138,13 +140,10 @@ class BMMiner(BaseMiner):
logging.warning(f"Failed to get model for miner: {self}") logging.warning(f"Failed to get model for miner: {self}")
return None return None
async def get_version( async def get_api_ver(self, api_version: dict = None) -> Optional[str]:
self, api_version: dict = None
) -> Tuple[Optional[str], Optional[str]]:
miner_version = namedtuple("MinerVersion", "api_ver fw_ver")
# Check to see if the version info is already cached # Check to see if the version info is already cached
if self.api_ver and self.fw_ver: if self.api_ver:
return miner_version(self.api_ver, self.fw_ver) return self.api_ver
if not api_version: if not api_version:
try: try:
@@ -157,12 +156,40 @@ class BMMiner(BaseMiner):
self.api_ver = api_version["VERSION"][0]["API"] self.api_ver = api_version["VERSION"][0]["API"]
except (KeyError, IndexError): except (KeyError, IndexError):
pass pass
return self.api_ver
async def get_fw_ver(self, api_version: dict = None) -> Optional[str]:
# Check to see if the version info is already cached
if self.fw_ver:
return self.fw_ver
if not api_version:
try:
api_version = await self.api.version()
except APIError:
pass
if api_version:
try: try:
self.fw_ver = api_version["VERSION"][0]["CompileTime"] self.fw_ver = api_version["VERSION"][0]["CompileTime"]
except (KeyError, IndexError): except (KeyError, IndexError):
pass pass
return miner_version(self.api_ver, self.fw_ver) return self.fw_ver
async def get_version(
self, api_version: dict = None
) -> Tuple[Optional[str], Optional[str]]:
# check if version is cached
miner_version = namedtuple("MinerVersion", "api_ver fw_ver")
return miner_version(
api_ver=await self.get_api_ver(api_version),
fw_ver=await self.get_fw_ver(api_version=api_version),
)
async def get_fan_psu(self):
return None
async def get_hostname(self) -> Optional[str]: async def get_hostname(self) -> Optional[str]:
hn = await self.send_ssh_command("cat /proc/sys/kernel/hostname") hn = await self.send_ssh_command("cat /proc/sys/kernel/hostname")
@@ -245,18 +272,7 @@ class BMMiner(BaseMiner):
async def get_wattage_limit(self) -> Optional[int]: async def get_wattage_limit(self) -> Optional[int]:
return None return None
async def get_fans( async def get_fans(self, api_stats: dict = None) -> List[Fan]:
self, api_stats: dict = None
) -> Tuple[
Tuple[Optional[int], Optional[int], Optional[int], Optional[int]],
Tuple[Optional[int]],
]:
fan_speeds = namedtuple("FanSpeeds", "fan_1 fan_2 fan_3 fan_4")
psu_fan_speeds = namedtuple("PSUFanSpeeds", "psu_fan")
miner_fan_speeds = namedtuple("MinerFans", "fan_speeds psu_fan_speeds")
psu_fans = psu_fan_speeds(None)
if not api_stats: if not api_stats:
try: try:
api_stats = await self.api.stats() api_stats = await self.api.stats()
@@ -280,9 +296,9 @@ class BMMiner(BaseMiner):
fans_data[fan] = api_stats["STATS"][1].get(f"fan{fan_offset+fan}") fans_data[fan] = api_stats["STATS"][1].get(f"fan{fan_offset+fan}")
except (KeyError, IndexError): except (KeyError, IndexError):
pass pass
fans = fan_speeds(*fans_data) fans = [Fan(speed=d) if d else Fan() for d in fans_data]
return miner_fan_speeds(fans, psu_fans) return fans
async def get_pools(self, api_pools: dict = None) -> List[dict]: async def get_pools(self, api_pools: dict = None) -> List[dict]:
groups = [] groups = []
@@ -339,108 +355,3 @@ class BMMiner(BaseMiner):
return round(ideal_rate, 2) return round(ideal_rate, 2)
except (KeyError, IndexError): except (KeyError, IndexError):
pass pass
async def _get_data(self, allow_warning: bool) -> dict:
miner_data = None
for i in range(PyasicSettings().miner_get_data_retries):
try:
miner_data = await self.api.multicommand(
"summary",
"pools",
"version",
"devdetails",
"stats",
allow_warning=allow_warning,
)
except APIError:
try:
miner_data = await self.api.multicommand(
"summary",
"version",
"pools",
"stats",
allow_warning=allow_warning,
)
except APIError:
pass
if miner_data:
break
if miner_data:
summary = miner_data.get("summary")
if summary:
summary = summary[0]
pools = miner_data.get("pools")
if pools:
pools = pools[0]
version = miner_data.get("version")
if version:
version = version[0]
devdetails = miner_data.get("devdetails")
if devdetails:
devdetails = devdetails[0]
stats = miner_data.get("stats")
if stats:
stats = stats[0]
else:
summary, pools, devdetails, version, stats = (None for _ in range(5))
data = { # noqa - Ignore dictionary could be re-written
# ip - Done at start
# datetime - Done auto
"mac": await self.get_mac(),
"model": await self.get_model(api_devdetails=devdetails),
# make - Done at start
"api_ver": None, # - Done at end
"fw_ver": None, # Done at end.
"hostname": await self.get_hostname(),
"hashrate": await self.get_hashrate(api_summary=summary),
"nominal_hashrate": await self.get_nominal_hashrate(api_stats=stats),
"hashboards": await self.get_hashboards(api_stats=stats),
# ideal_hashboards - Done at start
"env_temp": await self.get_env_temp(),
"wattage": await self.get_wattage(),
"wattage_limit": await self.get_wattage_limit(),
"fan_1": None, # - Done at end
"fan_2": None, # - Done at end
"fan_3": None, # - Done at end
"fan_4": None, # - Done at end
"fan_psu": None, # - Done at end
# ideal_chips - Done at start
"pool_split": None, # - Done at end
"pool_1_url": None, # - Done at end
"pool_1_user": None, # - Done at end
"pool_2_url": None, # - Done at end
"pool_2_user": None, # - Done at end
"errors": await self.get_errors(),
"fault_light": await self.get_fault_light(),
}
data["api_ver"], data["fw_ver"] = await self.get_version(api_version=version)
fan_data = await self.get_fans()
if fan_data:
data["fan_1"] = fan_data.fan_speeds.fan_1 # noqa
data["fan_2"] = fan_data.fan_speeds.fan_2 # noqa
data["fan_3"] = fan_data.fan_speeds.fan_3 # noqa
data["fan_4"] = fan_data.fan_speeds.fan_4 # noqa
data["fan_psu"] = fan_data.psu_fan_speeds.psu_fan # noqa
pools_data = await self.get_pools(api_pools=pools)
if pools_data:
data["pool_1_url"] = pools_data[0]["pool_1_url"]
data["pool_1_user"] = pools_data[0]["pool_1_user"]
if len(pools_data) > 1:
data["pool_2_url"] = pools_data[1]["pool_2_url"]
data["pool_2_user"] = pools_data[1]["pool_2_user"]
data[
"pool_split"
] = f"{pools_data[0]['quota']}/{pools_data[1]['quota']}"
else:
try:
data["pool_2_url"] = pools_data[0]["pool_2_url"]
data["pool_2_user"] = pools_data[0]["pool_2_user"]
data["quota"] = "0"
except KeyError:
pass
return data

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import ipaddress import ipaddress
import json import json
@@ -24,7 +26,7 @@ import toml
from pyasic.API.bosminer import BOSMinerAPI from pyasic.API.bosminer import BOSMinerAPI
from pyasic.config import MinerConfig from pyasic.config import MinerConfig
from pyasic.data import HashBoard, MinerData from pyasic.data import Fan, HashBoard, MinerData
from pyasic.data.error_codes import BraiinsOSError, MinerErrorData from pyasic.data.error_codes import BraiinsOSError, MinerErrorData
from pyasic.errors import APIError from pyasic.errors import APIError
from pyasic.miners.base import BaseMiner from pyasic.miners.base import BaseMiner
@@ -196,11 +198,8 @@ class BOSMiner(BaseMiner):
return self.config return self.config
if conn: if conn:
async with conn: async with conn:
logging.debug(f"{self}: Opening SFTP connection.") # good ol' BBB compatibility :/
async with conn.start_sftp_client() as sftp: toml_data = toml.loads((await conn.run("cat /etc/bosminer.toml")).stdout)
logging.debug(f"{self}: Reading config file.")
async with sftp.open("/etc/bosminer.toml") as file:
toml_data = toml.loads(await file.read())
logging.debug(f"{self}: Converting config file.") logging.debug(f"{self}: Converting config file.")
cfg = MinerConfig().from_raw(toml_data) cfg = MinerConfig().from_raw(toml_data)
self.config = cfg self.config = cfg
@@ -217,14 +216,28 @@ class BOSMiner(BaseMiner):
except (asyncssh.Error, OSError): except (asyncssh.Error, OSError):
return None return None
async with conn: async with conn:
await conn.run("/etc/init.d/bosminer stop") # BBB check because bitmain suxx
logging.debug(f"{self}: Opening SFTP connection.") bbb_check = await conn.run("if [ ! -f /etc/init.d/bosminer ]; then echo '1'; else echo '0'; fi;")
async with conn.start_sftp_client() as sftp:
logging.debug(f"{self}: Opening config file.") bbb = bbb_check.stdout.strip() == "1"
async with sftp.open("/etc/bosminer.toml", "w+") as file:
await file.write(toml_conf) if not bbb:
logging.debug(f"{self}: Restarting BOSMiner") await conn.run("/etc/init.d/bosminer stop")
await conn.run("/etc/init.d/bosminer start") logging.debug(f"{self}: Opening SFTP connection.")
async with conn.start_sftp_client() as sftp:
logging.debug(f"{self}: Opening config file.")
async with sftp.open("/etc/bosminer.toml", "w+") as file:
await file.write(toml_conf)
logging.debug(f"{self}: Restarting BOSMiner")
await conn.run("/etc/init.d/bosminer start")
# I really hate BBB, please get rid of it if you have it
else:
await conn.run("/etc/init.d/S99bosminer stop")
logging.debug(f"{self}: BBB sending config")
await conn.run("echo '" + toml_conf + "' > /etc/bosminer.toml")
logging.debug(f"{self}: BBB restarting bosminer.")
await conn.run("/etc/init.d/S99bosminer start")
async def set_power_limit(self, wattage: int) -> bool: async def set_power_limit(self, wattage: int) -> bool:
try: try:
@@ -287,10 +300,29 @@ class BOSMiner(BaseMiner):
) -> Tuple[Optional[str], Optional[str]]: ) -> Tuple[Optional[str], Optional[str]]:
# check if version is cached # check if version is cached
miner_version = namedtuple("MinerVersion", "api_ver fw_ver") miner_version = namedtuple("MinerVersion", "api_ver fw_ver")
# if self.fw_ver and self.api_ver: api_ver = await self.get_api_ver(api_version)
# logging.debug(f"Found version for {self.ip}: {self.fw_ver}") fw_ver = await self.get_fw_ver(graphql_version)
# return miner_version(self.api_ver, self.fw_ver) return miner_version(api_ver, fw_ver)
async def get_api_ver(self, api_version: dict = None) -> Optional[str]:
if not api_version:
try:
api_version = await self.api.version()
except APIError:
pass
# Now get the API version
if api_version:
try:
api_ver = api_version["VERSION"][0]["API"]
except (KeyError, IndexError):
api_ver = None
self.api_ver = api_ver
self.api.api_ver = self.api_ver
return self.api_ver
async def get_fw_ver(self, graphql_version: dict = None) -> Optional[str]:
if not graphql_version: if not graphql_version:
try: try:
graphql_version = await self.send_graphql_query( graphql_version = await self.send_graphql_query(
@@ -299,11 +331,6 @@ class BOSMiner(BaseMiner):
except APIError: except APIError:
pass pass
if not api_version:
try:
api_version = await self.api.version()
except APIError:
pass
fw_ver = None fw_ver = None
if graphql_version: if graphql_version:
@@ -323,16 +350,7 @@ class BOSMiner(BaseMiner):
self.fw_ver = ver self.fw_ver = ver
logging.debug(f"Found version for {self.ip}: {self.fw_ver}") logging.debug(f"Found version for {self.ip}: {self.fw_ver}")
# Now get the API version return self.fw_ver
if api_version:
try:
api_ver = api_version["VERSION"][0]["API"]
except (KeyError, IndexError):
api_ver = None
self.api_ver = api_ver
self.api.api_ver = self.api_ver
return miner_version(self.api_ver, self.fw_ver)
async def get_hostname(self, graphql_hostname: dict = None) -> Union[str, None]: async def get_hostname(self, graphql_hostname: dict = None) -> Union[str, None]:
if self.hostname: if self.hostname:
@@ -476,10 +494,9 @@ class BOSMiner(BaseMiner):
api_devs = d["devs"][0] api_devs = d["devs"][0]
except (KeyError, IndexError): except (KeyError, IndexError):
api_devs = None api_devs = None
if api_temps: if api_temps:
try: try:
offset = 6 if api_temps["TEMPS"][0]["ID"] in [6, 7, 8] else 0 offset = 6 if api_temps["TEMPS"][0]["ID"] in [6, 7, 8] else 1
for board in api_temps["TEMPS"]: for board in api_temps["TEMPS"]:
_id = board["ID"] - offset _id = board["ID"] - offset
@@ -492,7 +509,7 @@ class BOSMiner(BaseMiner):
if api_devdetails: if api_devdetails:
try: try:
offset = 6 if api_devdetails["DEVDETAILS"][0]["ID"] in [6, 7, 8] else 0 offset = 6 if api_devdetails["DEVDETAILS"][0]["ID"] in [6, 7, 8] else 1
for board in api_devdetails["DEVDETAILS"]: for board in api_devdetails["DEVDETAILS"]:
_id = board["ID"] - offset _id = board["ID"] - offset
@@ -504,7 +521,7 @@ class BOSMiner(BaseMiner):
if api_devs: if api_devs:
try: try:
offset = 6 if api_devs["DEVS"][0]["ID"] in [6, 7, 8] else 0 offset = 6 if api_devs["DEVS"][0]["ID"] in [6, 7, 8] else 1
for board in api_devs["DEVS"]: for board in api_devs["DEVS"]:
_id = board["ID"] - offset _id = board["ID"] - offset
@@ -584,16 +601,7 @@ class BOSMiner(BaseMiner):
async def get_fans( async def get_fans(
self, api_fans: dict = None, graphql_fans: dict = None self, api_fans: dict = None, graphql_fans: dict = None
) -> Tuple[ ) -> List[Fan]:
Tuple[Optional[int], Optional[int], Optional[int], Optional[int]],
Tuple[Optional[int]],
]:
psu_fan = None
fan_speeds = namedtuple("FanSpeeds", "fan_1 fan_2 fan_3 fan_4")
psu_fan_speeds = namedtuple("PSUFanSpeeds", "psu_fan")
miner_fan_speeds = namedtuple("MinerFans", "fan_speeds psu_fan_speeds")
if not graphql_fans and not api_fans: if not graphql_fans and not api_fans:
try: try:
graphql_fans = await self.send_graphql_query( graphql_fans = await self.send_graphql_query(
@@ -603,18 +611,15 @@ class BOSMiner(BaseMiner):
pass pass
if graphql_fans: if graphql_fans:
fans = {"fan_1": None, "fan_2": None, "fan_3": None, "fan_4": None} fans = {"fan_1": Fan(), "fan_2": Fan(), "fan_3": Fan(), "fan_4": Fan()}
for n in range(self.fan_count): for n in range(self.fan_count):
try: try:
fans[f"fan_{n + 1}"] = graphql_fans["bosminer"]["info"]["fans"][n][ fans[f"fan_{n + 1}"].speed = graphql_fans["bosminer"]["info"][
"rpm" "fans"
] ][n]["rpm"]
except KeyError: except KeyError:
pass pass
return miner_fan_speeds( return [fans["fan_1"], fans["fan_2"], fans["fan_3"], fans["fan_4"]]
fan_speeds(fans["fan_1"], fans["fan_2"], fans["fan_3"], fans["fan_4"]),
psu_fan_speeds(psu_fan),
)
if not api_fans: if not api_fans:
try: try:
@@ -623,19 +628,17 @@ class BOSMiner(BaseMiner):
pass pass
if api_fans: if api_fans:
fans = {"fan_1": None, "fan_2": None, "fan_3": None, "fan_4": None} fans = {"fan_1": Fan(), "fan_2": Fan(), "fan_3": Fan(), "fan_4": Fan()}
for n in range(self.fan_count): for n in range(self.fan_count):
try: try:
fans[f"fan_{n + 1}"] = api_fans["FANS"][n]["RPM"] fans[f"fan_{n + 1}"].speed = api_fans["FANS"][n]["RPM"]
except KeyError: except KeyError:
pass pass
return miner_fan_speeds( return [fans["fan_1"], fans["fan_2"], fans["fan_3"], fans["fan_4"]]
fan_speeds(fans["fan_1"], fans["fan_2"], fans["fan_3"], fans["fan_4"]), return [Fan(), Fan(), Fan(), Fan()]
psu_fan_speeds(psu_fan),
) async def get_fan_psu(self) -> Optional[int]:
return miner_fan_speeds( return None
fan_speeds(None, None, None, None), psu_fan_speeds(None)
)
async def get_pools( async def get_pools(
self, api_pools: dict = None, graphql_pools: dict = None self, api_pools: dict = None, graphql_pools: dict = None
@@ -851,144 +854,3 @@ class BOSMiner(BaseMiner):
) )
except (IndexError, KeyError): except (IndexError, KeyError):
pass pass
async def _get_data(self, allow_warning: bool) -> dict:
miner_data = None
for i in range(PyasicSettings().miner_get_data_retries):
try:
miner_data = await self.api.multicommand(
"summary",
"temps",
"tunerstatus",
"pools",
"devdetails",
"fans",
"devs",
"version",
allow_warning=allow_warning,
)
except APIError as e:
if str(e.message) == "Not ready":
try:
miner_data = await self.api.multicommand(
"summary", "tunerstatus", "pools", "devs", "version"
)
except APIError:
pass
if miner_data:
break
if miner_data:
summary = miner_data.get("summary")
if summary:
summary = summary[0]
version = miner_data.get("version")
if version:
version = version[0]
temps = miner_data.get("temps")
if temps:
temps = temps[0]
tunerstatus = miner_data.get("tunerstatus")
if tunerstatus:
tunerstatus = tunerstatus[0]
pools = miner_data.get("pools")
if pools:
pools = pools[0]
devdetails = miner_data.get("devdetails")
if devdetails:
devdetails = devdetails[0]
devs = miner_data.get("devs")
if devs:
devs = devs[0]
fans = miner_data.get("fans")
if fans:
fans = fans[0]
else:
summary, version, temps, tunerstatus, pools, devdetails, devs, fans = (
None for _ in range(8)
)
try:
gql_data = await self.send_graphql_query(
"{bos {hostname}, bosminer{config{... on BosminerConfig{groups{pools{url, user}, strategy{... on QuotaStrategy {quota}}}}}, info{fans{name, rpm}, workSolver{realHashrate{mhs1M}, temperatures{degreesC}, power{limitW, approxConsumptionW}, childSolvers{name, realHashrate{mhs1M}, hwDetails{chips}, tuner{statusMessages}, temperatures{degreesC}}}}}}"
)
except APIError:
gql_data = None
if gql_data:
if "data" in gql_data:
gql_data = gql_data["data"]
data = { # noqa - Ignore dictioonary could be re-written
# ip - Done at start
# datetime - Done auto
"mac": await self.get_mac(),
"model": await self.get_model(),
# make - Done at start
"api_ver": None, # - Done at end
"fw_ver": None, # - Done at end
"hostname": await self.get_hostname(graphql_hostname=gql_data),
"hashrate": await self.get_hashrate(
api_summary=summary, graphql_hashrate=gql_data
),
"nominal_hashrate": await self.get_nominal_hashrate(api_devs=devs),
"hashboards": await self.get_hashboards(
api_temps=temps,
api_devdetails=devdetails,
api_devs=devs,
graphql_boards=gql_data,
),
# ideal_hashboards - Done at start
"env_temp": await self.get_env_temp(),
"wattage": await self.get_wattage(
api_tunerstatus=tunerstatus, graphql_wattage=gql_data
),
"wattage_limit": await self.get_wattage_limit(
api_tunerstatus=tunerstatus, graphql_wattage_limit=gql_data
),
"fan_1": None, # - Done at end
"fan_2": None, # - Done at end
"fan_3": None, # - Done at end
"fan_4": None, # - Done at end
"fan_psu": None, # - Done at end
# ideal_chips - Done at start
"pool_split": None, # - Done at end
"pool_1_url": None, # - Done at end
"pool_1_user": None, # - Done at end
"pool_2_url": None, # - Done at end
"pool_2_user": None, # - Done at end
"errors": await self.get_errors(
api_tunerstatus=tunerstatus, graphql_errors=gql_data
),
"fault_light": await self.get_fault_light(),
}
data["api_ver"], data["fw_ver"] = await self.get_version(
api_version=version, graphql_version=gql_data
)
fan_data = await self.get_fans(api_fans=fans, graphql_fans=gql_data)
if fan_data:
data["fan_1"] = fan_data.fan_speeds.fan_1 # noqa
data["fan_2"] = fan_data.fan_speeds.fan_2 # noqa
data["fan_3"] = fan_data.fan_speeds.fan_3 # noqa
data["fan_4"] = fan_data.fan_speeds.fan_4 # noqa
data["fan_psu"] = fan_data.psu_fan_speeds.psu_fan # noqa
pools_data = await self.get_pools(api_pools=pools, graphql_pools=gql_data)
if pools_data:
data["pool_1_url"] = pools_data[0]["pool_1_url"]
data["pool_1_user"] = pools_data[0]["pool_1_user"]
if len(pools_data) > 1:
data["pool_2_url"] = pools_data[1]["pool_2_url"]
data["pool_2_user"] = pools_data[1]["pool_2_user"]
data[
"pool_split"
] = f"{pools_data[0]['quota']}/{pools_data[1]['quota']}"
else:
try:
data["pool_2_url"] = pools_data[0]["pool_2_url"]
data["pool_2_user"] = pools_data[0]["pool_2_user"]
data["quota"] = "0"
except KeyError:
pass
return data

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import ipaddress import ipaddress
import logging import logging
@@ -21,7 +23,7 @@ import asyncssh
from pyasic.API.bosminer import BOSMinerAPI from pyasic.API.bosminer import BOSMinerAPI
from pyasic.config import MinerConfig from pyasic.config import MinerConfig
from pyasic.data import HashBoard, MinerData from pyasic.data import Fan, HashBoard, MinerData
from pyasic.data.error_codes import MinerErrorData from pyasic.data.error_codes import MinerErrorData
from pyasic.errors import APIError from pyasic.errors import APIError
from pyasic.miners.base import BaseMiner from pyasic.miners.base import BaseMiner
@@ -131,18 +133,17 @@ class BOSMinerOld(BaseMiner):
async def get_fans( async def get_fans(
self, self,
) -> Tuple[ ) -> List[Fan]:
Tuple[Optional[int], Optional[int], Optional[int], Optional[int]], return [Fan(), Fan(), Fan(), Fan()]
Tuple[Optional[int]],
]:
fan_speeds = namedtuple("FanSpeeds", "fan_1 fan_2 fan_3 fan_4")
psu_fan_speeds = namedtuple("PSUFanSpeeds", "psu_fan")
miner_fan_speeds = namedtuple("MinerFans", "fan_speeds psu_fan_speeds")
fans = fan_speeds(None, None, None, None) async def get_fan_psu(self) -> Optional[int]:
psu_fans = psu_fan_speeds(None) return None
return miner_fan_speeds(fans, psu_fans) async def get_api_ver(self) -> Optional[str]:
return None
async def get_fw_ver(self) -> Optional[str]:
return None
async def get_pools(self, api_pools: dict = None) -> List[dict]: async def get_pools(self, api_pools: dict = None) -> List[dict]:
groups = [] groups = []
@@ -179,8 +180,5 @@ class BOSMinerOld(BaseMiner):
async def get_nominal_hashrate(self) -> Optional[float]: async def get_nominal_hashrate(self) -> Optional[float]:
return None return None
async def _get_data(self, allow_warning: bool) -> dict:
return {}
async def get_data(self, allow_warning: bool = False) -> MinerData: async def get_data(self, allow_warning: bool = False) -> MinerData:
return MinerData(ip=str(self.ip)) return MinerData(ip=str(self.ip))

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import ipaddress import ipaddress
import logging import logging
@@ -19,7 +21,7 @@ from typing import List, Optional, Tuple, Union
from pyasic.API.btminer import BTMinerAPI from pyasic.API.btminer import BTMinerAPI
from pyasic.config import MinerConfig from pyasic.config import MinerConfig
from pyasic.data import HashBoard, MinerData from pyasic.data import Fan, HashBoard, MinerData
from pyasic.data.error_codes import MinerErrorData, WhatsminerError from pyasic.data.error_codes import MinerErrorData, WhatsminerError
from pyasic.errors import APIError from pyasic.errors import APIError
from pyasic.miners.base import BaseMiner from pyasic.miners.base import BaseMiner
@@ -172,17 +174,17 @@ class BTMiner(BaseMiner):
################################################## ##################################################
async def get_mac( async def get_mac(
self, api_summary: dict = None, api_miner_info: dict = None self, api_summary: dict = None, api_get_miner_info: dict = None
) -> Optional[str]: ) -> Optional[str]:
if not api_miner_info: if not api_get_miner_info:
try: try:
api_miner_info = await self.api.get_miner_info() api_get_miner_info = await self.api.get_miner_info()
except APIError: except APIError:
pass pass
if api_miner_info: if api_get_miner_info:
try: try:
mac = api_miner_info["Msg"]["mac"] mac = api_get_miner_info["Msg"]["mac"]
return str(mac).upper() return str(mac).upper()
except KeyError: except KeyError:
pass pass
@@ -223,34 +225,64 @@ class BTMiner(BaseMiner):
return None return None
async def get_version( async def get_version(
self, api_version: dict = None, api_summary: dict = None self, api_get_version: dict = None, api_summary: dict = None
) -> Tuple[Optional[str], Optional[str]]: ) -> Tuple[Optional[str], Optional[str]]:
# check if version is cached
miner_version = namedtuple("MinerVersion", "api_ver fw_ver") miner_version = namedtuple("MinerVersion", "api_ver fw_ver")
# Check to see if the version info is already cached api_ver = await self.get_api_ver(api_get_version=api_get_version)
if self.api_ver and self.fw_ver: fw_ver = await self.get_fw_ver(
return miner_version(self.api_ver, self.fw_ver) api_get_version=api_get_version, api_summary=api_summary
)
return miner_version(api_ver, fw_ver)
if not api_version: async def get_api_ver(self, api_get_version: dict = None) -> Optional[str]:
# Check to see if the version info is already cached
if self.api_ver:
return self.api_ver
if not api_get_version:
try: try:
api_version = await self.api.get_version() api_get_version = await self.api.get_version()
except APIError: except APIError:
pass pass
if api_version: if api_get_version:
if "Code" in api_version.keys(): if "Code" in api_get_version.keys():
if api_version["Code"] == 131: if api_get_version["Code"] == 131:
try: try:
api_ver = api_version["Msg"] api_ver = api_get_version["Msg"]
if not isinstance(api_ver, str): if not isinstance(api_ver, str):
api_ver = api_ver["api_ver"] api_ver = api_ver["api_ver"]
self.api_ver = api_ver.replace("whatsminer v", "") self.api_ver = api_ver.replace("whatsminer v", "")
self.fw_ver = api_version["Msg"]["fw_ver"]
except (KeyError, TypeError): except (KeyError, TypeError):
pass pass
else: else:
self.api.api_ver = self.api_ver self.api.api_ver = self.api_ver
return miner_version(self.api_ver, self.fw_ver) return self.api_ver
return self.api_ver
async def get_fw_ver(
self, api_get_version: dict = None, api_summary: dict = None
) -> Optional[str]:
# Check to see if the version info is already cached
if self.fw_ver:
return self.fw_ver
if not api_get_version:
try:
api_get_version = await self.api.get_version()
except APIError:
pass
if api_get_version:
if "Code" in api_get_version.keys():
if api_get_version["Code"] == 131:
try:
self.fw_ver = api_get_version["Msg"]["fw_ver"]
except (KeyError, TypeError):
pass
else:
return self.fw_ver
if not api_summary: if not api_summary:
try: try:
@@ -266,21 +298,21 @@ class BTMiner(BaseMiner):
except (KeyError, IndexError): except (KeyError, IndexError):
pass pass
return miner_version(self.api_ver, self.fw_ver) return self.fw_ver
async def get_hostname(self, api_miner_info: dict = None) -> Optional[str]: async def get_hostname(self, api_get_miner_info: dict = None) -> Optional[str]:
if self.hostname: if self.hostname:
return self.hostname return self.hostname
if not api_miner_info: if not api_get_miner_info:
try: try:
api_miner_info = await self.api.get_miner_info() api_get_miner_info = await self.api.get_miner_info()
except APIError: except APIError:
return None # only one way to get this return None # only one way to get this
if api_miner_info: if api_get_miner_info:
try: try:
self.hostname = api_miner_info["Msg"]["hostname"] self.hostname = api_get_miner_info["Msg"]["hostname"]
except KeyError: except KeyError:
return None return None
@@ -375,18 +407,32 @@ class BTMiner(BaseMiner):
pass pass
async def get_fans( async def get_fans(
self, api_summary: dict = None, api_psu: dict = None self, api_summary: dict = None, api_get_psu: dict = None
) -> Tuple[ ) -> List[Fan]:
Tuple[Optional[int], Optional[int], Optional[int], Optional[int]], if not api_summary:
Tuple[Optional[int]], try:
]: api_summary = await self.api.summary()
fan_speeds = namedtuple("FanSpeeds", "fan_1 fan_2 fan_3 fan_4") except APIError:
psu_fan_speeds = namedtuple("PSUFanSpeeds", "psu_fan") pass
miner_fan_speeds = namedtuple("MinerFans", "fan_speeds psu_fan_speeds")
fans = fan_speeds(None, None, None, None) fans = [Fan(), Fan(), Fan(), Fan()]
psu_fans = psu_fan_speeds(None) if api_summary:
try:
if self.fan_count > 0:
fans = [
Fan(api_summary["SUMMARY"][0]["Fan Speed In"]),
Fan(api_summary["SUMMARY"][0]["Fan Speed Out"]),
Fan(),
Fan(),
]
except (KeyError, IndexError):
pass
return fans
async def get_fan_psu(
self, api_summary: dict = None, api_get_psu: dict = None
) -> Optional[int]:
if not api_summary: if not api_summary:
try: try:
api_summary = await self.api.summary() api_summary = await self.api.summary()
@@ -395,33 +441,21 @@ class BTMiner(BaseMiner):
if api_summary: if api_summary:
try: try:
if self.fan_count > 0: return int(api_summary["SUMMARY"][0]["Power Fanspeed"])
fans = fan_speeds(
api_summary["SUMMARY"][0]["Fan Speed In"],
api_summary["SUMMARY"][0]["Fan Speed Out"],
None,
None,
)
psu_fans = psu_fan_speeds(
int(api_summary["SUMMARY"][0]["Power Fanspeed"])
)
except (KeyError, IndexError): except (KeyError, IndexError):
pass pass
if not psu_fans[0]: if not api_get_psu:
if not api_psu: try:
try: api_get_psu = await self.api.get_psu()
api_psu = await self.api.get_psu() except APIError:
except APIError: pass
pass
if api_psu: if api_get_psu:
try: try:
psu_fans = psu_fan_speeds(int(api_psu["Msg"]["fan_speed"])) return int(api_get_psu["Msg"]["fan_speed"])
except (KeyError, TypeError): except (KeyError, TypeError):
pass pass
return miner_fan_speeds(fans, psu_fans)
async def get_pools(self, api_pools: dict = None) -> List[dict]: async def get_pools(self, api_pools: dict = None) -> List[dict]:
groups = [] groups = []
@@ -450,10 +484,10 @@ class BTMiner(BaseMiner):
return groups return groups
async def get_errors( async def get_errors(
self, api_summary: dict = None, api_error_codes: dict = None self, api_summary: dict = None, api_get_error_code: dict = None
) -> List[MinerErrorData]: ) -> List[MinerErrorData]:
errors = [] errors = []
if not api_summary and not api_error_codes: if not api_summary and not api_get_error_code:
try: try:
api_summary = await self.api.summary() api_summary = await self.api.summary()
except APIError: except APIError:
@@ -468,14 +502,14 @@ class BTMiner(BaseMiner):
except (KeyError, IndexError, ValueError, TypeError): except (KeyError, IndexError, ValueError, TypeError):
pass pass
if not api_error_codes: if not api_get_error_code:
try: try:
api_error_codes = await self.api.get_error_code() api_get_error_code = await self.api.get_error_code()
except APIError: except APIError:
pass pass
if api_error_codes: if api_get_error_code:
for err in api_error_codes["Msg"]["error_code"]: for err in api_get_error_code["Msg"]["error_code"]:
if isinstance(err, dict): if isinstance(err, dict):
for code in err: for code in err:
errors.append(WhatsminerError(error_code=int(code))) errors.append(WhatsminerError(error_code=int(code)))
@@ -499,134 +533,42 @@ class BTMiner(BaseMiner):
except (KeyError, IndexError): except (KeyError, IndexError):
pass pass
async def get_fault_light(self, api_miner_info: dict = None) -> bool: async def get_fault_light(self, api_get_miner_info: dict = None) -> bool:
data = None data = None
if not api_miner_info: if not api_get_miner_info:
try: try:
api_miner_info = await self.api.get_miner_info() api_get_miner_info = await self.api.get_miner_info()
except APIError: except APIError:
if not self.light: if not self.light:
self.light = False self.light = False
if api_miner_info: if api_get_miner_info:
try: try:
self.light = api_miner_info["Msg"]["ledstat"] == "auto" self.light = not (api_get_miner_info["Msg"]["ledstat"] == "auto")
except KeyError: except KeyError:
pass pass
return self.light if self.light else False return self.light if self.light else False
async def _get_data(self, allow_warning: bool) -> dict: async def set_static_ip(
miner_data = None self,
for i in range(PyasicSettings().miner_get_data_retries): ip: str,
try: dns: str,
miner_data = await self.api.multicommand( gateway: str,
"summary", subnet_mask: str = "255.255.255.0",
"get_version", hostname: str = None,
"pools", ):
"devdetails", if not hostname:
"devs", hostname = await self.get_hostname()
"get_psu", await self.api.net_config(
"get_miner_info", ip=ip, mask=subnet_mask, dns=dns, gate=gateway, host=hostname, dhcp=False
"get_error_code", )
allow_warning=allow_warning,
)
except APIError:
pass
if miner_data:
break
if miner_data:
summary = miner_data.get("summary")
if summary:
summary = summary[0]
version = miner_data.get("get_version")
if version:
version = version[0]
pools = miner_data.get("pools")
if pools:
pools = pools[0]
devdetails = miner_data.get("devdetails")
if devdetails:
devdetails = devdetails[0]
devs = miner_data.get("devs")
if devs:
devs = devs[0]
psu = miner_data.get("get_psu")
if psu:
psu = psu[0]
miner_info = miner_data.get("get_miner_info")
if miner_info:
miner_info = miner_info[0]
error_codes = miner_data.get("get_error_codes")
if error_codes:
error_codes = error_codes[0]
else:
summary, version, pools, devdetails, devs, psu, miner_info, error_codes = (
None for _ in range(8)
)
data = { # noqa - Ignore dictionary could be re-written async def set_dhcp(self, hostname: str = None):
# ip - Done at start if hostname:
# datetime - Done auto await self.set_hostname(hostname)
"mac": await self.get_mac(api_summary=summary, api_miner_info=miner_info), await self.api.net_config()
"model": await self.get_model(api_devdetails=devdetails),
# make - Done at start
"api_ver": None, # - Done at end
"fw_ver": None, # - Done at end
"hostname": await self.get_hostname(api_miner_info=miner_info),
"hashrate": await self.get_hashrate(api_summary=summary),
"nominal_hashrate": await self.get_nominal_hashrate(api_summary=summary),
"hashboards": await self.get_hashboards(api_devs=devs),
# ideal_hashboards - Done at start
"env_temp": await self.get_env_temp(api_summary=summary),
"wattage": await self.get_wattage(api_summary=summary),
"wattage_limit": await self.get_wattage_limit(api_summary=summary),
"fan_1": None, # - Done at end
"fan_2": None, # - Done at end
"fan_3": None, # - Done at end
"fan_4": None, # - Done at end
"fan_psu": None, # - Done at end
# ideal_chips - Done at start
"pool_split": None, # - Done at end
"pool_1_url": None, # - Done at end
"pool_1_user": None, # - Done at end
"pool_2_url": None, # - Done at end
"pool_2_user": None, # - Done at end
"errors": await self.get_errors(
api_summary=summary, api_error_codes=error_codes
),
"fault_light": await self.get_fault_light(api_miner_info=miner_info),
}
data["api_ver"], data["fw_ver"] = await self.get_version(api_version=version) async def set_hostname(self, hostname: str):
fan_data = await self.get_fans() await self.api.set_hostname(hostname)
if fan_data:
data["fan_1"] = fan_data.fan_speeds.fan_1 # noqa
data["fan_2"] = fan_data.fan_speeds.fan_2 # noqa
data["fan_3"] = fan_data.fan_speeds.fan_3 # noqa
data["fan_4"] = fan_data.fan_speeds.fan_4 # noqa
data["fan_psu"] = fan_data.psu_fan_speeds.psu_fan # noqa
pools_data = await self.get_pools(api_pools=pools)
if pools_data:
data["pool_1_url"] = pools_data[0]["pool_1_url"]
data["pool_1_user"] = pools_data[0]["pool_1_user"]
if len(pools_data) > 1:
data["pool_2_url"] = pools_data[1]["pool_2_url"]
data["pool_2_user"] = pools_data[1]["pool_2_user"]
data[
"pool_split"
] = f"{pools_data[0]['quota']}/{pools_data[1]['quota']}"
else:
try:
data["pool_2_url"] = pools_data[0]["pool_2_url"]
data["pool_2_user"] = pools_data[0]["pool_2_user"]
data["quota"] = "0"
except KeyError:
pass
return data

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import ipaddress import ipaddress
import logging import logging
@@ -21,7 +23,7 @@ import asyncssh
from pyasic.API.cgminer import CGMinerAPI from pyasic.API.cgminer import CGMinerAPI
from pyasic.config import MinerConfig from pyasic.config import MinerConfig
from pyasic.data import HashBoard, MinerData from pyasic.data import Fan, HashBoard, MinerData
from pyasic.data.error_codes import MinerErrorData from pyasic.data.error_codes import MinerErrorData
from pyasic.errors import APIError from pyasic.errors import APIError
from pyasic.miners.base import BaseMiner from pyasic.miners.base import BaseMiner
@@ -185,9 +187,14 @@ class CGMiner(BaseMiner):
self, api_version: dict = None self, api_version: dict = None
) -> Tuple[Optional[str], Optional[str]]: ) -> Tuple[Optional[str], Optional[str]]:
miner_version = namedtuple("MinerVersion", "api_ver fw_ver") miner_version = namedtuple("MinerVersion", "api_ver fw_ver")
# Check to see if the version info is already cached return miner_version(
if self.api_ver and self.fw_ver: api_ver=await self.get_api_ver(api_version=api_version),
return miner_version(self.api_ver, self.fw_ver) fw_ver=await self.get_fw_ver(api_version=api_version),
)
async def get_api_ver(self, api_version: dict = None) -> Optional[str]:
if self.api_ver:
return self.api_ver
if not api_version: if not api_version:
try: try:
@@ -200,12 +207,26 @@ class CGMiner(BaseMiner):
self.api_ver = api_version["VERSION"][0]["API"] self.api_ver = api_version["VERSION"][0]["API"]
except (KeyError, IndexError): except (KeyError, IndexError):
pass pass
return self.api_ver
async def get_fw_ver(self, api_version: dict = None) -> Optional[str]:
if self.fw_ver:
return self.fw_ver
if not api_version:
try:
api_version = await self.api.version()
except APIError:
pass
if api_version:
try: try:
self.fw_ver = api_version["VERSION"][0]["CGMiner"] self.fw_ver = api_version["VERSION"][0]["CGMiner"]
except (KeyError, IndexError): except (KeyError, IndexError):
pass pass
return miner_version(self.api_ver, self.fw_ver) return self.fw_ver
async def get_hostname(self) -> Optional[str]: async def get_hostname(self) -> Optional[str]:
try: try:
@@ -293,25 +314,14 @@ class CGMiner(BaseMiner):
async def get_wattage_limit(self) -> Optional[int]: async def get_wattage_limit(self) -> Optional[int]:
return None return None
async def get_fans( async def get_fans(self, api_stats: dict = None) -> List[Fan]:
self, api_stats: dict = None
) -> Tuple[
Tuple[Optional[int], Optional[int], Optional[int], Optional[int]],
Tuple[Optional[int]],
]:
fan_speeds = namedtuple("FanSpeeds", "fan_1 fan_2 fan_3 fan_4")
psu_fan_speeds = namedtuple("PSUFanSpeeds", "psu_fan")
miner_fan_speeds = namedtuple("MinerFans", "fan_speeds psu_fan_speeds")
psu_fans = psu_fan_speeds(None)
if not api_stats: if not api_stats:
try: try:
api_stats = await self.api.stats() api_stats = await self.api.stats()
except APIError: except APIError:
pass pass
fans_data = [None, None, None, None] fans_data = [Fan(), Fan(), Fan(), Fan()]
if api_stats: if api_stats:
try: try:
fan_offset = -1 fan_offset = -1
@@ -325,12 +335,15 @@ class CGMiner(BaseMiner):
fan_offset = 1 fan_offset = 1
for fan in range(self.fan_count): for fan in range(self.fan_count):
fans_data[fan] = api_stats["STATS"][1].get(f"fan{fan_offset+fan}") fans_data[fan] = Fan(
api_stats["STATS"][1].get(f"fan{fan_offset+fan}")
)
except (KeyError, IndexError): except (KeyError, IndexError):
pass pass
fans = fan_speeds(*fans_data) return fans_data
return miner_fan_speeds(fans, psu_fans) async def get_fan_psu(self) -> Optional[int]:
return None
async def get_pools(self, api_pools: dict = None) -> List[dict]: async def get_pools(self, api_pools: dict = None) -> List[dict]:
groups = [] groups = []
@@ -387,109 +400,3 @@ class CGMiner(BaseMiner):
return round(ideal_rate, 2) return round(ideal_rate, 2)
except (KeyError, IndexError): except (KeyError, IndexError):
pass pass
async def _get_data(self, allow_warning: bool) -> dict:
miner_data = None
for i in range(PyasicSettings().miner_get_data_retries):
try:
miner_data = await self.api.multicommand(
"summary",
"pools",
"devdetails",
"stats",
allow_warning=allow_warning,
)
except APIError:
try:
miner_data = await self.api.multicommand(
"summary",
"pools",
"version",
"stats",
allow_warning=allow_warning,
)
except APIError:
pass
if miner_data:
break
if miner_data:
summary = miner_data.get("summary")
if summary:
summary = summary[0]
pools = miner_data.get("pools")
if pools:
pools = pools[0]
version = miner_data.get("version")
if version:
version = version[0]
devdetails = miner_data.get("devdetails")
if devdetails:
devdetails = devdetails[0]
stats = miner_data.get("stats")
if stats:
stats = stats[0]
else:
summary, pools, devdetails, version, stats = (None for _ in range(5))
data = { # noqa - Ignore dictionary could be re-written
# ip - Done at start
# datetime - Done auto
"mac": await self.get_mac(),
"model": await self.get_model(api_devdetails=devdetails),
# make - Done at start
"api_ver": None, # - Done at end
"fw_ver": None, # - Done at end
"hostname": await self.get_hostname(),
"hashrate": await self.get_hashrate(api_summary=summary),
"nominal_hashrate": await self.get_nominal_hashrate(api_stats=stats),
"hashboards": await self.get_hashboards(api_stats=stats),
# ideal_hashboards - Done at start
"env_temp": await self.get_env_temp(),
"wattage": await self.get_wattage(),
"wattage_limit": await self.get_wattage_limit(),
"fan_1": None, # - Done at end
"fan_2": None, # - Done at end
"fan_3": None, # - Done at end
"fan_4": None, # - Done at end
"fan_psu": None, # - Done at end
# ideal_chips - Done at start
"pool_split": None, # - Done at end
"pool_1_url": None, # - Done at end
"pool_1_user": None, # - Done at end
"pool_2_url": None, # - Done at end
"pool_2_user": None, # - Done at end
"errors": await self.get_errors(),
"fault_light": await self.get_fault_light(),
}
data["api_ver"], data["fw_ver"] = await self.get_version(api_version=version)
fan_data = await self.get_fans()
if fan_data:
data["fan_1"] = fan_data.fan_speeds.fan_1 # noqa
data["fan_2"] = fan_data.fan_speeds.fan_2 # noqa
data["fan_3"] = fan_data.fan_speeds.fan_3 # noqa
data["fan_4"] = fan_data.fan_speeds.fan_4 # noqa
data["fan_psu"] = fan_data.psu_fan_speeds.psu_fan # noqa
pools_data = await self.get_pools(api_pools=pools)
if pools_data:
data["pool_1_url"] = pools_data[0]["pool_1_url"]
data["pool_1_user"] = pools_data[0]["pool_1_user"]
if len(pools_data) > 1:
data["pool_2_url"] = pools_data[1]["pool_2_url"]
data["pool_2_user"] = pools_data[1]["pool_2_user"]
data[
"pool_split"
] = f"{pools_data[0]['quota']}/{pools_data[1]['quota']}"
else:
try:
data["pool_2_url"] = pools_data[0]["pool_2_url"]
data["pool_2_user"] = pools_data[0]["pool_2_user"]
data["quota"] = "0"
except KeyError:
pass
return data

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import ipaddress import ipaddress
import logging import logging
@@ -20,7 +22,7 @@ from typing import List, Optional, Tuple, Union
from pyasic.API.cgminer import CGMinerAPI from pyasic.API.cgminer import CGMinerAPI
from pyasic.config import MinerConfig from pyasic.config import MinerConfig
from pyasic.data import HashBoard, MinerData from pyasic.data import Fan, HashBoard, MinerData
from pyasic.data.error_codes import MinerErrorData from pyasic.data.error_codes import MinerErrorData
from pyasic.errors import APIError from pyasic.errors import APIError
from pyasic.miners._backends import CGMiner from pyasic.miners._backends import CGMiner
@@ -206,25 +208,14 @@ class CGMinerAvalon(CGMiner):
async def get_wattage_limit(self) -> Optional[int]: async def get_wattage_limit(self) -> Optional[int]:
return None return None
async def get_fans( async def get_fans(self, api_stats: dict = None) -> List[Fan]:
self, api_stats: dict = None
) -> Tuple[
Tuple[Optional[int], Optional[int], Optional[int], Optional[int]],
Tuple[Optional[int]],
]:
fan_speeds = namedtuple("FanSpeeds", "fan_1 fan_2 fan_3 fan_4")
psu_fan_speeds = namedtuple("PSUFanSpeeds", "psu_fan")
miner_fan_speeds = namedtuple("MinerFans", "fan_speeds psu_fan_speeds")
psu_fans = psu_fan_speeds(None)
if not api_stats: if not api_stats:
try: try:
api_stats = await self.api.stats() api_stats = await self.api.stats()
except APIError: except APIError:
pass pass
fans_data = [None, None, None, None] fans_data = [Fan(), Fan(), Fan(), Fan()]
if api_stats: if api_stats:
try: try:
stats_data = api_stats[0].get("STATS") stats_data = api_stats[0].get("STATS")
@@ -233,12 +224,11 @@ class CGMinerAvalon(CGMiner):
if key.startswith("MM ID"): if key.startswith("MM ID"):
raw_data = self.parse_stats(stats_data[0][key]) raw_data = self.parse_stats(stats_data[0][key])
for fan in range(self.fan_count): for fan in range(self.fan_count):
fans_data[fan] = int(raw_data[f"Fan{fan + 1}"]) fans_data[fan] = Fan(int(raw_data[f"Fan{fan + 1}"]))
except (KeyError, IndexError, ValueError, TypeError): except (KeyError, IndexError, ValueError, TypeError):
pass pass
fans = fan_speeds(*fans_data)
return miner_fan_speeds(fans, psu_fans) return fans_data
async def get_pools(self, api_pools: dict = None) -> List[dict]: async def get_pools(self, api_pools: dict = None) -> List[dict]:
groups = [] groups = []
@@ -279,101 +269,3 @@ class CGMinerAvalon(CGMiner):
if data["STATUS"][0]["Msg"] == "ASC 0 set info: LED[1]": if data["STATUS"][0]["Msg"] == "ASC 0 set info: LED[1]":
return True return True
return False return False
async def _get_data(self, allow_warning: bool) -> dict:
miner_data = None
for i in range(PyasicSettings().miner_get_data_retries):
try:
miner_data = await self.api.multicommand(
"summary",
"pools",
"version",
"devdetails",
"stats",
allow_warning=allow_warning,
)
except APIError:
pass
if miner_data:
break
if miner_data:
summary = miner_data.get("summary")
if summary:
summary = summary[0]
pools = miner_data.get("pools")
if pools:
pools = pools[0]
version = miner_data.get("version")
if version:
version = version[0]
devdetails = miner_data.get("devdetails")
if devdetails:
devdetails = devdetails[0]
stats = miner_data.get("stats")
if stats:
stats = stats[0]
else:
summary, pools, devdetails, version, stats = (None for _ in range(5))
data = { # noqa - Ignore dictionary could be re-written
# ip - Done at start
# datetime - Done auto
"mac": await self.get_mac(),
"model": await self.get_model(api_devdetails=devdetails),
# make - Done at start
"api_ver": None, # - Done at end
"fw_ver": None, # - Done at end
"hostname": await self.get_hostname(),
"hashrate": await self.get_hashrate(api_summary=summary),
"nominal_hashrate": await self.get_nominal_hashrate(api_stats=stats),
"hashboards": await self.get_hashboards(api_stats=stats),
# ideal_hashboards - Done at start
"env_temp": await self.get_env_temp(),
"wattage": await self.get_wattage(),
"wattage_limit": await self.get_wattage_limit(),
"fan_1": None, # - Done at end
"fan_2": None, # - Done at end
"fan_3": None, # - Done at end
"fan_4": None, # - Done at end
"fan_psu": None, # - Done at end
# ideal_chips - Done at start
"pool_split": None, # - Done at end
"pool_1_url": None, # - Done at end
"pool_1_user": None, # - Done at end
"pool_2_url": None, # - Done at end
"pool_2_user": None, # - Done at end
"errors": await self.get_errors(),
"fault_light": await self.get_fault_light(),
}
data["api_ver"], data["fw_ver"] = await self.get_version(api_version=version)
fan_data = await self.get_fans()
if fan_data:
data["fan_1"] = fan_data.fan_speeds.fan_1 # noqa
data["fan_2"] = fan_data.fan_speeds.fan_2 # noqa
data["fan_3"] = fan_data.fan_speeds.fan_3 # noqa
data["fan_4"] = fan_data.fan_speeds.fan_4 # noqa
data["fan_psu"] = fan_data.psu_fan_speeds.psu_fan # noqa
pools_data = await self.get_pools(api_pools=pools)
if pools_data:
data["pool_1_url"] = pools_data[0]["pool_1_url"]
data["pool_1_user"] = pools_data[0]["pool_1_user"]
if len(pools_data) > 1:
data["pool_2_url"] = pools_data[1]["pool_2_url"]
data["pool_2_user"] = pools_data[1]["pool_2_user"]
data[
"pool_split"
] = f"{pools_data[0]['quota']}/{pools_data[1]['quota']}"
else:
try:
data["pool_2_url"] = pools_data[0]["pool_2_url"]
data["pool_2_user"] = pools_data[0]["pool_2_user"]
data["quota"] = "0"
except KeyError:
pass
return data

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import ipaddress import ipaddress

View File

@@ -0,0 +1,218 @@
# ------------------------------------------------------------------------------
# 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 json
import logging
import warnings
from typing import Optional, Union
import httpx
from pyasic.errors import APIError
from pyasic.miners._backends.bmminer import BMMiner
from pyasic.settings import PyasicSettings
class VNish(BMMiner):
def __init__(self, ip: str, api_ver: str = "0.0.0") -> None:
super().__init__(ip, api_ver)
self.api_type = "VNish"
self.uname = "root"
self.pwd = PyasicSettings().global_vnish_password
self.jwt = None
async def auth(self):
async with httpx.AsyncClient() as client:
try:
auth = await client.post(
f"http://{self.ip}/api/v1/unlock",
json={"pw": self.pwd},
)
except httpx.HTTPError:
warnings.warn(f"Could not authenticate web token with miner: {self}")
else:
if not auth.status_code == 200:
warnings.warn(
f"Could not authenticate web token with miner: {self}"
)
return None
json_auth = auth.json()
self.jwt = json_auth["token"]
return self.jwt
async def send_web_command(
self, command: str, data: Union[dict, None] = None, method: str = "GET"
):
if not self.jwt:
await self.auth()
if not data:
data = {}
async with httpx.AsyncClient() as client:
for i in range(PyasicSettings().miner_get_data_retries):
try:
auth = self.jwt
if command.startswith("system"):
auth = "Bearer " + self.jwt
if method == "GET":
response = await client.get(
f"http://{self.ip}/api/v1/{command}",
headers={"Authorization": auth},
timeout=5,
)
elif method == "POST":
if data:
response = await client.post(
f"http://{self.ip}/api/v1/{command}",
headers={"Authorization": auth},
timeout=5,
json=data,
)
else:
response = await client.post(
f"http://{self.ip}/api/v1/{command}",
headers={"Authorization": auth},
timeout=5,
)
else:
raise APIError("Bad method type.")
if not response.status_code == 200:
# refresh the token, retry
await self.auth()
continue
json_data = response.json()
if json_data:
return json_data
return True
except httpx.HTTPError:
pass
except json.JSONDecodeError:
pass
async def get_model(self, api_stats: dict = None) -> Optional[str]:
# check if model is cached
if self.model:
logging.debug(f"Found model for {self.ip}: {self.model} (VNish)")
return self.model + " (VNish)"
if not api_stats:
try:
api_stats = await self.api.stats()
except APIError:
pass
if api_stats:
try:
m_type = api_stats["STATS"][0]["Type"]
self.model = m_type.split(" ")[1]
return self.model
except (KeyError, IndexError):
pass
async def restart_backend(self) -> bool:
data = await self.send_web_command("mining/restart", method="POST")
return data
async def reboot(self) -> bool:
data = await self.send_web_command("system/reboot", method="POST")
return data
async def get_mac(self, web_summary: dict = None) -> str:
if not web_summary:
web_info = await self.send_web_command("info")
if web_info:
try:
mac = web_info["system"]["network_status"]["mac"]
return mac
except KeyError:
pass
if web_summary:
try:
mac = web_summary["system"]["network_status"]["mac"]
return mac
except KeyError:
pass
async def get_hostname(self, web_summary: dict = None) -> str:
if not web_summary:
web_info = await self.send_web_command("info")
if web_info:
try:
hostname = web_info["system"]["network_status"]["hostname"]
return hostname
except KeyError:
pass
if web_summary:
try:
hostname = web_summary["system"]["network_status"]["hostname"]
return hostname
except KeyError:
pass
async def get_wattage(self, web_summary: dict = None) -> Optional[int]:
if not web_summary:
web_summary = await self.send_web_command("summary")
if web_summary:
try:
wattage = web_summary["miner"]["power_usage"]
wattage = round(wattage * 1000)
return wattage
except KeyError:
pass
async def get_hashrate(self, api_summary: dict = None) -> Optional[float]:
# get hr from API
if not api_summary:
try:
api_summary = await self.api.summary()
except APIError:
pass
if api_summary:
try:
return round(
float(float(api_summary["SUMMARY"][0]["GHS 5s"]) / 1000), 2
)
except (IndexError, KeyError, ValueError, TypeError) as e:
print(e)
pass
async def get_wattage_limit(self, web_settings: dict = None) -> Optional[int]:
if not web_settings:
web_settings = await self.send_web_command("summary")
if web_settings:
try:
wattage_limit = web_settings["miner"]["overclock"]["preset"]
return int(wattage_limit)
except (KeyError, TypeError):
pass
async def get_fw_ver(self, web_summary: dict = None) -> Optional[str]:
if not web_summary:
web_summary = await self.send_web_command("summary")
if web_summary:
try:
fw_ver = web_summary["miner"]["miner_type"]
fw_ver = fw_ver.split("(Vnish ")[1].replace(")", "")
return fw_ver
except KeyError:
pass

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from .antminer import * from .antminer import *
from .avalonminer import * from .avalonminer import *

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AntMiner from pyasic.miners._types.makes import AntMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AntMiner from pyasic.miners._types.makes import AntMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AntMiner from pyasic.miners._types.makes import AntMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AntMiner from pyasic.miners._types.makes import AntMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AntMiner from pyasic.miners._types.makes import AntMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AntMiner from pyasic.miners._types.makes import AntMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AntMiner from pyasic.miners._types.makes import AntMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from .S17 import S17 from .S17 import S17
from .S17_Plus import S17Plus from .S17_Plus import S17Plus

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AntMiner from pyasic.miners._types.makes import AntMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AntMiner from pyasic.miners._types.makes import AntMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AntMiner from pyasic.miners._types.makes import AntMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AntMiner from pyasic.miners._types.makes import AntMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AntMiner from pyasic.miners._types.makes import AntMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AntMiner from pyasic.miners._types.makes import AntMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AntMiner from pyasic.miners._types.makes import AntMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AntMiner from pyasic.miners._types.makes import AntMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from .S19 import S19 from .S19 import S19
from .S19_Pro import S19Pro from .S19_Pro import S19Pro

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AntMiner from pyasic.miners._types.makes import AntMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AntMiner from pyasic.miners._types.makes import AntMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AntMiner from pyasic.miners._types.makes import AntMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from .S9 import S9 from .S9 import S9
from .S9i import S9i from .S9i import S9i

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from .X9 import * from .X9 import *
from .X17 import * from .X17 import *

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AvalonMiner from pyasic.miners._types.makes import AvalonMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AvalonMiner from pyasic.miners._types.makes import AvalonMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AvalonMiner from pyasic.miners._types.makes import AvalonMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from .A1026 import Avalon1026 from .A1026 import Avalon1026
from .A1047 import Avalon1047 from .A1047 import Avalon1047

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AvalonMiner from pyasic.miners._types.makes import AvalonMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AvalonMiner from pyasic.miners._types.makes import AvalonMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AvalonMiner from pyasic.miners._types.makes import AvalonMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from .A721 import Avalon721 from .A721 import Avalon721
from .A741 import Avalon741 from .A741 import Avalon741

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AvalonMiner from pyasic.miners._types.makes import AvalonMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AvalonMiner from pyasic.miners._types.makes import AvalonMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AvalonMiner from pyasic.miners._types.makes import AvalonMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from .A821 import Avalon821 from .A821 import Avalon821
from .A841 import Avalon841 from .A841 import Avalon841

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import AvalonMiner from pyasic.miners._types.makes import AvalonMiner

View File

@@ -1,15 +1,17 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from .A921 import Avalon921 from .A921 import Avalon921

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from .A7X import * from .A7X import *
from .A8X import * from .A8X import *

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import InnosiliconMiner from pyasic.miners._types.makes import InnosiliconMiner

View File

@@ -1,15 +1,17 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from .T3H_Plus import InnosiliconT3HPlus from .T3H_Plus import InnosiliconT3HPlus

View File

@@ -1,15 +1,17 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from .T3X import * from .T3X import *

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners.base import BaseMiner from pyasic.miners.base import BaseMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import WhatsMiner from pyasic.miners._types.makes import WhatsMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from .M20 import M20V10 from .M20 import M20V10
from .M20S import M20SV10, M20SV20, M20SV30 from .M20S import M20SV10, M20SV20, M20SV30

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import WhatsMiner from pyasic.miners._types.makes import WhatsMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from pyasic.miners._types.makes import WhatsMiner from pyasic.miners._types.makes import WhatsMiner

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
from .M30 import M30V10, M30V20 from .M30 import M30V10, M30V20
from .M30S import ( from .M30S import (

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

View File

@@ -1,16 +1,18 @@
# Copyright 2022 Upstream Data Inc # ------------------------------------------------------------------------------
# # 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. # Licensed under the Apache License, Version 2.0 (the "License"); -
# You may obtain a copy of the License at # 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 # -
# # 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, # Unless required by applicable law or agreed to in writing, software -
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # distributed under the License is distributed on an "AS IS" BASIS, -
# See the License for the specific language governing permissions and # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -
# limitations under the License. # See the License for the specific language governing permissions and -
# limitations under the License. -
# ------------------------------------------------------------------------------
import warnings import warnings

Some files were not shown because too many files have changed in this diff Show More