solax-py-library 1.0.0.20__py3-none-any.whl → 1.0.0.22__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- solax_py_library/__init__.py +1 -1
- solax_py_library/device/__init__.py +0 -0
- solax_py_library/device/constant/__init__.py +0 -0
- solax_py_library/device/constant/inverter_model_info.py +312 -0
- solax_py_library/device/core/__init__.py +0 -0
- solax_py_library/device/core/interver/__init__.py +36 -0
- solax_py_library/device/core/interver/base.py +215 -0
- solax_py_library/device/types/__init__.py +0 -0
- solax_py_library/device/types/inverter_config.py +41 -0
- solax_py_library/device/types/modbus_point.py +30 -0
- solax_py_library/exception.py +10 -10
- solax_py_library/snap_shot/__init__.py +3 -3
- solax_py_library/snap_shot/constant/__init__.py +5 -5
- solax_py_library/snap_shot/constant/crc_table.py +258 -258
- solax_py_library/snap_shot/core/__init__.py +0 -2
- solax_py_library/snap_shot/core/base_modbus.py +14 -14
- solax_py_library/snap_shot/core/parser.py +225 -225
- solax_py_library/snap_shot/core/snap_shot.py +14 -12
- solax_py_library/snap_shot/exceptions/__init__.py +3 -3
- solax_py_library/snap_shot/exceptions/snap_shot.py +9 -9
- solax_py_library/snap_shot/types/__init__.py +15 -15
- solax_py_library/snap_shot/types/address.py +39 -39
- solax_py_library/upload/__init__.py +3 -3
- solax_py_library/upload/api/service.py +24 -24
- solax_py_library/upload/core/upload_service/ftp.py +17 -12
- solax_py_library/upload/exceptions/__init__.py +8 -8
- solax_py_library/upload/exceptions/upload_error.py +21 -21
- solax_py_library/upload/test/test_ftp.py +36 -4
- solax_py_library/utils/common.py +21 -2
- solax_py_library/utils/struct_util.py +30 -0
- {solax_py_library-1.0.0.20.dist-info → solax_py_library-1.0.0.22.dist-info}/METADATA +1 -1
- solax_py_library-1.0.0.22.dist-info/RECORD +46 -0
- solax_py_library-1.0.0.20.dist-info/RECORD +0 -36
- {solax_py_library-1.0.0.20.dist-info → solax_py_library-1.0.0.22.dist-info}/WHEEL +0 -0
@@ -1,39 +1,39 @@
|
|
1
|
-
from enum import IntEnum
|
2
|
-
|
3
|
-
|
4
|
-
class SnapshotMCUSource(IntEnum):
|
5
|
-
MCU_SOURCE_MDSP = 0
|
6
|
-
MCU_SOURCE_SDSP = 1
|
7
|
-
|
8
|
-
|
9
|
-
class SnapshotExportDevice(IntEnum):
|
10
|
-
EXPORT_DEVICE_UART = 0
|
11
|
-
EXPORT_DEVICE_USB = 1
|
12
|
-
|
13
|
-
|
14
|
-
class SnapshotStartResult(IntEnum):
|
15
|
-
SNAPSHOT_START_START = 0xAAAA
|
16
|
-
SNAPSHOT_START_SUCCESS = 0xA5A5
|
17
|
-
SNAPSHOT_START_FAILED = 0x5A5A
|
18
|
-
SNAPSHOT_START_STOP = 0xBBBB
|
19
|
-
|
20
|
-
|
21
|
-
class SnapshotRegisterAddress(IntEnum):
|
22
|
-
SNAPSHOT_REGISTERADDRESS_MCUSOURCE = 0x4011
|
23
|
-
SNAPSHOT_REGISTERADDRESS_EXPORTDEVICE = 0x4012
|
24
|
-
SNAPSHOT_REGISTERADDRESS_START = 0x4013
|
25
|
-
SNAPSHOT_REGISTERADDRESS_TOTALNUMBER = 0x4070
|
26
|
-
SNAPSHOT_REGISTERADDRESS_SNAPSHOTINDEX = 0x4071
|
27
|
-
SNAPSHOT_REGISTERADDRESS_PACKDATASTATUS = 0x4072
|
28
|
-
SNAPSHOT_REGISTERADDRESS_DATASIZE = 0x4073
|
29
|
-
SNAPSHOT_REGISTERADDRESS_CHANNELNUMBER = 0x4074
|
30
|
-
SNAPSHOT_REGISTERADDRESS_CHANNELDATASIZE = 0x4075
|
31
|
-
SNAPSHOT_REGISTERADDRESS_PACKINDEX = 0x407F
|
32
|
-
SNAPSHOT_REGISTERADDRESS_PACKDATA = 0x4080
|
33
|
-
|
34
|
-
|
35
|
-
class CommandType(IntEnum):
|
36
|
-
ACK = 0x80 # 接收应答
|
37
|
-
TOTAL_PACKETS = 0x81 # 上报总包数
|
38
|
-
DATA_PACKET = 0x82 # 具体分包数据
|
39
|
-
ERROR = 0x83 # 报错应答
|
1
|
+
from enum import IntEnum
|
2
|
+
|
3
|
+
|
4
|
+
class SnapshotMCUSource(IntEnum):
|
5
|
+
MCU_SOURCE_MDSP = 0
|
6
|
+
MCU_SOURCE_SDSP = 1
|
7
|
+
|
8
|
+
|
9
|
+
class SnapshotExportDevice(IntEnum):
|
10
|
+
EXPORT_DEVICE_UART = 0
|
11
|
+
EXPORT_DEVICE_USB = 1
|
12
|
+
|
13
|
+
|
14
|
+
class SnapshotStartResult(IntEnum):
|
15
|
+
SNAPSHOT_START_START = 0xAAAA
|
16
|
+
SNAPSHOT_START_SUCCESS = 0xA5A5
|
17
|
+
SNAPSHOT_START_FAILED = 0x5A5A
|
18
|
+
SNAPSHOT_START_STOP = 0xBBBB
|
19
|
+
|
20
|
+
|
21
|
+
class SnapshotRegisterAddress(IntEnum):
|
22
|
+
SNAPSHOT_REGISTERADDRESS_MCUSOURCE = 0x4011
|
23
|
+
SNAPSHOT_REGISTERADDRESS_EXPORTDEVICE = 0x4012
|
24
|
+
SNAPSHOT_REGISTERADDRESS_START = 0x4013
|
25
|
+
SNAPSHOT_REGISTERADDRESS_TOTALNUMBER = 0x4070
|
26
|
+
SNAPSHOT_REGISTERADDRESS_SNAPSHOTINDEX = 0x4071
|
27
|
+
SNAPSHOT_REGISTERADDRESS_PACKDATASTATUS = 0x4072
|
28
|
+
SNAPSHOT_REGISTERADDRESS_DATASIZE = 0x4073
|
29
|
+
SNAPSHOT_REGISTERADDRESS_CHANNELNUMBER = 0x4074
|
30
|
+
SNAPSHOT_REGISTERADDRESS_CHANNELDATASIZE = 0x4075
|
31
|
+
SNAPSHOT_REGISTERADDRESS_PACKINDEX = 0x407F
|
32
|
+
SNAPSHOT_REGISTERADDRESS_PACKDATA = 0x4080
|
33
|
+
|
34
|
+
|
35
|
+
class CommandType(IntEnum):
|
36
|
+
ACK = 0x80 # 接收应答
|
37
|
+
TOTAL_PACKETS = 0x81 # 上报总包数
|
38
|
+
DATA_PACKET = 0x82 # 具体分包数据
|
39
|
+
ERROR = 0x83 # 报错应答
|
@@ -1,3 +1,3 @@
|
|
1
|
-
from . import api, types, core, exceptions
|
2
|
-
|
3
|
-
__all__ = ["api", "core", "exceptions", "types"]
|
1
|
+
from . import api, types, core, exceptions
|
2
|
+
|
3
|
+
__all__ = ["api", "core", "exceptions", "types"]
|
@@ -1,24 +1,24 @@
|
|
1
|
-
from typing import Dict, Any
|
2
|
-
|
3
|
-
from solax_py_library.upload.core.upload_service import upload_service_map
|
4
|
-
from solax_py_library.exception import SolaxBaseError
|
5
|
-
from solax_py_library.upload.types.client import UploadType, UploadData
|
6
|
-
|
7
|
-
|
8
|
-
def upload_service(upload_type: UploadType, configuration: Dict[str, Any]):
|
9
|
-
"""
|
10
|
-
upload_type: 上传类型。
|
11
|
-
configuration: 配置信息
|
12
|
-
"""
|
13
|
-
upload_class = upload_service_map.get(upload_type)
|
14
|
-
if not upload_class:
|
15
|
-
raise SolaxBaseError
|
16
|
-
return upload_class(**configuration)
|
17
|
-
|
18
|
-
|
19
|
-
async def upload(
|
20
|
-
upload_type: UploadType, configuration: Dict[str, Any], upload_data: UploadData
|
21
|
-
):
|
22
|
-
service = upload_service(upload_type, configuration)
|
23
|
-
with service as s:
|
24
|
-
await s.upload(upload_data)
|
1
|
+
from typing import Dict, Any
|
2
|
+
|
3
|
+
from solax_py_library.upload.core.upload_service import upload_service_map
|
4
|
+
from solax_py_library.exception import SolaxBaseError
|
5
|
+
from solax_py_library.upload.types.client import UploadType, UploadData
|
6
|
+
|
7
|
+
|
8
|
+
def upload_service(upload_type: UploadType, configuration: Dict[str, Any]):
|
9
|
+
"""
|
10
|
+
upload_type: 上传类型。
|
11
|
+
configuration: 配置信息
|
12
|
+
"""
|
13
|
+
upload_class = upload_service_map.get(upload_type)
|
14
|
+
if not upload_class:
|
15
|
+
raise SolaxBaseError
|
16
|
+
return upload_class(**configuration)
|
17
|
+
|
18
|
+
|
19
|
+
async def upload(
|
20
|
+
upload_type: UploadType, configuration: Dict[str, Any], upload_data: UploadData
|
21
|
+
):
|
22
|
+
service = upload_service(upload_type, configuration)
|
23
|
+
with service as s:
|
24
|
+
await s.upload(upload_data)
|
@@ -34,8 +34,7 @@ class FTPUploadService(BaseUploadService):
|
|
34
34
|
try:
|
35
35
|
return FTPServiceConfig(**kwargs)
|
36
36
|
except Exception as e:
|
37
|
-
|
38
|
-
raise ConfigurationError
|
37
|
+
raise ConfigurationError(message=str(e))
|
39
38
|
|
40
39
|
def connect(self):
|
41
40
|
if self._client is not None:
|
@@ -46,18 +45,17 @@ class FTPUploadService(BaseUploadService):
|
|
46
45
|
|
47
46
|
def _connect(self):
|
48
47
|
try:
|
49
|
-
self._client = ftplib.FTP(
|
48
|
+
self._client = ftplib.FTP()
|
49
|
+
self._client.encoding = "utf8" # 默认需要配置为utf8
|
50
50
|
self._client.connect(self.host, self.port, timeout=self.timeout)
|
51
51
|
except Exception as e:
|
52
|
-
|
53
|
-
raise ConnectError
|
52
|
+
raise ConnectError(message=str(e))
|
54
53
|
|
55
54
|
def _login(self):
|
56
55
|
try:
|
57
56
|
self._client.login(self.user, self.password)
|
58
57
|
except Exception as e:
|
59
|
-
|
60
|
-
raise LoginError
|
58
|
+
raise LoginError(message=str(e))
|
61
59
|
|
62
60
|
def close(self):
|
63
61
|
if self._client:
|
@@ -81,17 +79,24 @@ class FTPUploadService(BaseUploadService):
|
|
81
79
|
try:
|
82
80
|
if not self._is_connect:
|
83
81
|
raise ConnectError(message="not connect yet")
|
82
|
+
self._cwd_folder()
|
84
83
|
with open(data.file_path, "rb") as f:
|
85
|
-
self._client.storbinary(
|
86
|
-
f"STOR {self._build_remote_file(data.file_name)}", f
|
87
|
-
)
|
84
|
+
self._client.storbinary(f"STOR {data.file_name}", f)
|
88
85
|
print(f"Successfully uploaded to {data.file_name}")
|
89
86
|
except Exception as e:
|
90
|
-
|
91
|
-
raise SendDataError
|
87
|
+
raise SendDataError(message=str(e))
|
92
88
|
finally:
|
93
89
|
if os.path.exists(data.file_path):
|
94
90
|
os.remove(data.file_path)
|
95
91
|
|
92
|
+
def _cwd_folder(self):
|
93
|
+
try:
|
94
|
+
self._client.cwd(self.remote_path)
|
95
|
+
except Exception as e:
|
96
|
+
print(f"CWD error: {e}")
|
97
|
+
self._client.mkd(self.remote_path)
|
98
|
+
self._client.cwd(self.remote_path)
|
99
|
+
print(f"mkdir {self.remote_path}, remove successfully")
|
100
|
+
|
96
101
|
def _build_remote_file(self, file_name):
|
97
102
|
return os.path.join(self.remote_path, file_name)
|
@@ -1,8 +1,8 @@
|
|
1
|
-
from .upload_error import ConfigurationError, ConnectError, LoginError, SendDataError
|
2
|
-
|
3
|
-
__all__ = [
|
4
|
-
"ConnectError",
|
5
|
-
"LoginError",
|
6
|
-
"SendDataError",
|
7
|
-
"ConfigurationError",
|
8
|
-
]
|
1
|
+
from .upload_error import ConfigurationError, ConnectError, LoginError, SendDataError
|
2
|
+
|
3
|
+
__all__ = [
|
4
|
+
"ConnectError",
|
5
|
+
"LoginError",
|
6
|
+
"SendDataError",
|
7
|
+
"ConfigurationError",
|
8
|
+
]
|
@@ -1,21 +1,21 @@
|
|
1
|
-
from solax_py_library.exception import SolaxBaseError
|
2
|
-
|
3
|
-
|
4
|
-
class ConnectError(SolaxBaseError):
|
5
|
-
code = 0x1001
|
6
|
-
message = "connect error"
|
7
|
-
|
8
|
-
|
9
|
-
class LoginError(SolaxBaseError):
|
10
|
-
code = 0x1002
|
11
|
-
message = "authentication error"
|
12
|
-
|
13
|
-
|
14
|
-
class SendDataError(SolaxBaseError):
|
15
|
-
code = 0x1003
|
16
|
-
message = "send data error"
|
17
|
-
|
18
|
-
|
19
|
-
class ConfigurationError(SolaxBaseError):
|
20
|
-
code = 0x1004
|
21
|
-
message = "server configuration error"
|
1
|
+
from solax_py_library.exception import SolaxBaseError
|
2
|
+
|
3
|
+
|
4
|
+
class ConnectError(SolaxBaseError):
|
5
|
+
code = 0x1001
|
6
|
+
message = "connect error"
|
7
|
+
|
8
|
+
|
9
|
+
class LoginError(SolaxBaseError):
|
10
|
+
code = 0x1002
|
11
|
+
message = "authentication error"
|
12
|
+
|
13
|
+
|
14
|
+
class SendDataError(SolaxBaseError):
|
15
|
+
code = 0x1003
|
16
|
+
message = "send data error"
|
17
|
+
|
18
|
+
|
19
|
+
class ConfigurationError(SolaxBaseError):
|
20
|
+
code = 0x1004
|
21
|
+
message = "server configuration error"
|
@@ -3,7 +3,7 @@ import unittest
|
|
3
3
|
|
4
4
|
from solax_py_library.upload.api.service import upload
|
5
5
|
from solax_py_library.upload.core.upload_service import FTPUploadService
|
6
|
-
from solax_py_library.upload.
|
6
|
+
from solax_py_library.upload.exceptions import ConnectError, LoginError
|
7
7
|
from solax_py_library.upload.types.client import UploadType, UploadData
|
8
8
|
from solax_py_library.upload.types.ftp import FTPFileType
|
9
9
|
|
@@ -48,13 +48,45 @@ class FTPTest(unittest.TestCase):
|
|
48
48
|
except LoginError:
|
49
49
|
...
|
50
50
|
|
51
|
-
def
|
51
|
+
def test_ftp_upload_to_windows(self):
|
52
52
|
ftp_config = {
|
53
53
|
"host": "10.1.31.181", # 测试host
|
54
54
|
"port": 21,
|
55
55
|
"user": "solax",
|
56
56
|
"password": "123456",
|
57
|
-
"remote_path": "
|
57
|
+
"remote_path": "嘻嘻",
|
58
|
+
}
|
59
|
+
asyncio.run(
|
60
|
+
upload(
|
61
|
+
upload_type=UploadType.FTP,
|
62
|
+
configuration=ftp_config,
|
63
|
+
upload_data=UploadData(
|
64
|
+
upload_type=UploadType.FTP,
|
65
|
+
data=dict(
|
66
|
+
file_type=FTPFileType.CSV,
|
67
|
+
file_name="中文",
|
68
|
+
data=[
|
69
|
+
{
|
70
|
+
"EMS1000序列号": "XMG11A011L",
|
71
|
+
"EMS1000本地时间": "2025-02-11 15:39:10",
|
72
|
+
"EMS1000版本号": "V007.11.1",
|
73
|
+
"电站所在国家和地区": None,
|
74
|
+
"电站所在当前时区": None,
|
75
|
+
"电站系统类型": None,
|
76
|
+
}
|
77
|
+
],
|
78
|
+
),
|
79
|
+
),
|
80
|
+
)
|
81
|
+
)
|
82
|
+
|
83
|
+
def test_ftp_upload_to_linux(self):
|
84
|
+
ftp_config = {
|
85
|
+
"host": "10.1.6.153", # 测试host
|
86
|
+
"port": 21,
|
87
|
+
"user": "ftpuser",
|
88
|
+
"password": "123456",
|
89
|
+
"remote_path": "你好呀",
|
58
90
|
}
|
59
91
|
asyncio.run(
|
60
92
|
upload(
|
@@ -64,7 +96,7 @@ class FTPTest(unittest.TestCase):
|
|
64
96
|
upload_type=UploadType.FTP,
|
65
97
|
data=dict(
|
66
98
|
file_type=FTPFileType.CSV,
|
67
|
-
file_name="
|
99
|
+
file_name="中文",
|
68
100
|
data=[
|
69
101
|
{
|
70
102
|
"EMS1000序列号": "XMG11A011L",
|
solax_py_library/utils/common.py
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
import asyncio
|
2
|
+
from decimal import Decimal, ROUND_HALF_UP
|
2
3
|
|
3
4
|
|
4
|
-
def retry(max_attempts=3, delay=0.5):
|
5
|
+
def retry(max_attempts=3, delay=0.5, assign_exception=Exception):
|
5
6
|
def decorator(func):
|
6
7
|
async def wrapper(*args, **kwargs):
|
7
8
|
attempts = 0
|
@@ -12,8 +13,26 @@ def retry(max_attempts=3, delay=0.5):
|
|
12
13
|
print(f"尝试 {attempts+1} 失败: {e}")
|
13
14
|
await asyncio.sleep(delay)
|
14
15
|
attempts += 1
|
15
|
-
raise
|
16
|
+
raise assign_exception(f"操作失败 {max_attempts} 次")
|
16
17
|
|
17
18
|
return wrapper
|
18
19
|
|
19
20
|
return decorator
|
21
|
+
|
22
|
+
|
23
|
+
def round_value(value, decimal_places=0):
|
24
|
+
"""
|
25
|
+
实现四舍五入 代替round函数 遇到5向上取整
|
26
|
+
@param value: 传入数值
|
27
|
+
@param decimal_places: 保留几位小数
|
28
|
+
@return:
|
29
|
+
"""
|
30
|
+
if isinstance(value, int):
|
31
|
+
return value
|
32
|
+
else:
|
33
|
+
# 优化小数位 Decimal函数太耗时 曲线数据直接使用round函数
|
34
|
+
# rounded_value = ("{:.%df}" % decimal_places).format(value)
|
35
|
+
rounded_value = Decimal(str(value)).quantize(
|
36
|
+
Decimal("1e-" + str(decimal_places)), rounding=ROUND_HALF_UP
|
37
|
+
)
|
38
|
+
return float(rounded_value)
|
@@ -0,0 +1,30 @@
|
|
1
|
+
import copy
|
2
|
+
import struct
|
3
|
+
from typing import List
|
4
|
+
|
5
|
+
|
6
|
+
def unpack(data: List, data_format, reversed=False):
|
7
|
+
"""
|
8
|
+
:param data: 数据字节, 入参均是由modbus读取到的list[uint16]进行转换
|
9
|
+
:param data_format: 数据格式
|
10
|
+
:param reversed: 是否翻转大小端
|
11
|
+
"""
|
12
|
+
cur_data = copy.deepcopy(data)
|
13
|
+
data_format = data_format.lower()
|
14
|
+
format_map = {
|
15
|
+
"int8": "bb",
|
16
|
+
"uint8": "BB",
|
17
|
+
"int16": "h",
|
18
|
+
"uint16": "H",
|
19
|
+
"int32": "i",
|
20
|
+
"uint32": "I",
|
21
|
+
"int64": "q",
|
22
|
+
"uint64": "Q",
|
23
|
+
"float": "f",
|
24
|
+
}
|
25
|
+
if data_format not in format_map:
|
26
|
+
raise Exception("暂不支持")
|
27
|
+
pack_str = ("<" if reversed else ">") + "H" * len(cur_data)
|
28
|
+
to_pack_data = struct.pack(pack_str, *cur_data)
|
29
|
+
struct_format = ("<" if reversed else ">") + format_map[data_format]
|
30
|
+
return struct.unpack(struct_format, to_pack_data)
|
@@ -0,0 +1,46 @@
|
|
1
|
+
solax_py_library/__init__.py,sha256=zLUfOeLUGy1sFFu4tZI8cDlfuEATRZ3VcYywVhPLObE,35
|
2
|
+
solax_py_library/device/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
|
+
solax_py_library/device/constant/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
|
+
solax_py_library/device/constant/inverter_model_info.py,sha256=Ujnwv79qycOTV_zqqr21wKXXj_lGLgrA56X_-Vjuxqw,18049
|
5
|
+
solax_py_library/device/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
6
|
+
solax_py_library/device/core/interver/__init__.py,sha256=gnERg9RssRoZvfylG5CgXT8XiwwCf5hQ5_phch6lQM8,1189
|
7
|
+
solax_py_library/device/core/interver/base.py,sha256=8Zexb1ELWQkD_3LzYyEK7Oro0z71nl2m72RSA5w0bZQ,7406
|
8
|
+
solax_py_library/device/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
9
|
+
solax_py_library/device/types/inverter_config.py,sha256=8oNO0PkoBrvCe9XnKpuz8QSs7A0jpW2l-vG6IttV0lA,953
|
10
|
+
solax_py_library/device/types/modbus_point.py,sha256=vukTJhqw7ZxFs4T2hbo975ZW0-oMUIKSF6CLF9muhoU,610
|
11
|
+
solax_py_library/exception.py,sha256=1NNSqi--RC_sEv_1uJ1z01QVBIs8lNe1YemzND_Vluo,267
|
12
|
+
solax_py_library/snap_shot/__init__.py,sha256=50fik3nxjnQoLIFEecc6c557pRtpQ1OxAqjp5HFgfe0,84
|
13
|
+
solax_py_library/snap_shot/constant/__init__.py,sha256=vFoN2ZJWjhpXBQ4BU9vUa9GnvRYA6253bcTZ_nec7AQ,70
|
14
|
+
solax_py_library/snap_shot/constant/crc_table.py,sha256=mTRYF3f7SxvVcVfFNHsgMMiXj2A_GGjRWfWXv4TSMNs,3824
|
15
|
+
solax_py_library/snap_shot/core/__init__.py,sha256=7OIXci81vNuQKqfQWWq2aMYEJI-sv6YrURHXnwXoLZM,112
|
16
|
+
solax_py_library/snap_shot/core/base_modbus.py,sha256=hd8047JdB97X9sF3ZzzjR8YjUNV7qWc0T6xtJEg5Pvs,417
|
17
|
+
solax_py_library/snap_shot/core/parser.py,sha256=pIpQBMkS79BrSvdl2WPGCbVcaGAn0eACCkkdkCKHCvE,7928
|
18
|
+
solax_py_library/snap_shot/core/snap_shot.py,sha256=W5m9K5VDIgPiyzv8BoxqfnzZgXvtlFWkuSXqURo-6uE,10471
|
19
|
+
solax_py_library/snap_shot/exceptions/__init__.py,sha256=PZt5-dSRyBmRVjgBrFseZ_vpOLb8gThRnTtlw4bWP9Y,115
|
20
|
+
solax_py_library/snap_shot/exceptions/snap_shot.py,sha256=8afTk1Y09Pu47yA1yOvu7kxxxZavob1yvDBYlI0WP9w,163
|
21
|
+
solax_py_library/snap_shot/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
22
|
+
solax_py_library/snap_shot/types/__init__.py,sha256=wQRjRVD-bBTAAoVPh69XgmDQfl-pVmS1DzZYhphixlg,305
|
23
|
+
solax_py_library/snap_shot/types/address.py,sha256=8bheI03XMXXMNr7rFHkf9ZdacyGeQgc63bGP9bsojck,1187
|
24
|
+
solax_py_library/upload/__init__.py,sha256=V8QbJ1xmaJZBHWRxBo_OzIrs50Y56QsH9T7qn3kY3M8,96
|
25
|
+
solax_py_library/upload/api/__init__.py,sha256=ASShe-YQxP0aA3B_I8EmpWKXIdXPWvaANifrzlYrFEk,84
|
26
|
+
solax_py_library/upload/api/service.py,sha256=FSAz-WWHRG72vE45gu73n0hheyXuB94GQdgSMfqusOA,787
|
27
|
+
solax_py_library/upload/core/__init__.py,sha256=XMcnyDzCfsLwWaTAZt9-an7TuwYFqVNSt9W1_QRUrwA,89
|
28
|
+
solax_py_library/upload/core/data_adapter/__init__.py,sha256=9CXepLZSOjZMfNjyYKAWQCWZt353kTL_0tFBlIeUIOo,116
|
29
|
+
solax_py_library/upload/core/data_adapter/base.py,sha256=Va-SEe0eL3gobhNOnzHGkYBLIwf5RVawQdYRHHXg9g0,170
|
30
|
+
solax_py_library/upload/core/data_adapter/csv.py,sha256=8nlnV_43mMAR3re50MQJymzT5HYpZOo7eSeMsEfnEVE,861
|
31
|
+
solax_py_library/upload/core/upload_service/__init__.py,sha256=uA-UeH31rDNxByeZwvPhNFHPV_-J8JyCev8geuc---k,269
|
32
|
+
solax_py_library/upload/core/upload_service/base.py,sha256=dxCBVtPxDhN7oRTjnwnjtc2XAF4hyIz9HsYCJePlggg,912
|
33
|
+
solax_py_library/upload/core/upload_service/ftp.py,sha256=QGgL1wJwRFwIUaAWNqH4oupeu0W0bAN6CLffCil0GHc,3234
|
34
|
+
solax_py_library/upload/exceptions/__init__.py,sha256=iSPPPHBP_aG9-9OCR_tCrGihL-uEIpSwvi9JZxSYbUk,194
|
35
|
+
solax_py_library/upload/exceptions/upload_error.py,sha256=sqJvooTZxM9eKqFUV5-sI101xw24ubEdyUZq4mG8sbM,446
|
36
|
+
solax_py_library/upload/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
37
|
+
solax_py_library/upload/test/test_ftp.py,sha256=Rq3ooQGwpqqinRU1V-vNBaDkSedR-bJgyWkIwe7dcfw,3799
|
38
|
+
solax_py_library/upload/types/__init__.py,sha256=og9KBpYbcs36_S1izURj3vyHeuNOLJQrD9GpxK_JJaw,244
|
39
|
+
solax_py_library/upload/types/client.py,sha256=fG674_QEpOw3ibO171lcxJ0cz27yGR_sd3zgiyr4yuI,492
|
40
|
+
solax_py_library/upload/types/ftp.py,sha256=9kCeLB0g5Je19v4ifz8YYEsGOhJL1lKBO2C6V2VBndc,679
|
41
|
+
solax_py_library/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
42
|
+
solax_py_library/utils/common.py,sha256=bfnZcX9uM-PjJrYAFv1UMmZgt6bGR7MaOd7jRPNHGxw,1238
|
43
|
+
solax_py_library/utils/struct_util.py,sha256=ER0F6W_QCGM98NItGbQLmdZtbPn1UAZ-qh2tnqHi004,943
|
44
|
+
solax_py_library-1.0.0.22.dist-info/METADATA,sha256=UrLkxnXXmQNXQQCoBayTp45vcGFMjP4XQ5U5M4H0H7o,1790
|
45
|
+
solax_py_library-1.0.0.22.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
46
|
+
solax_py_library-1.0.0.22.dist-info/RECORD,,
|
@@ -1,36 +0,0 @@
|
|
1
|
-
solax_py_library/__init__.py,sha256=4wrB7TuGOQaYHQvdn574G4JrcOnH6l8RNSR6AtKAiKc,34
|
2
|
-
solax_py_library/exception.py,sha256=ygAccdTqJctRrdt9bu6-vqZP5KadfKVS_1tjt4KcRn8,257
|
3
|
-
solax_py_library/snap_shot/__init__.py,sha256=Ex12q6BCkdU-3OP-f-ehGCetJJWnoZ7KxhEDd_lXh6M,81
|
4
|
-
solax_py_library/snap_shot/constant/__init__.py,sha256=UNfjAlx1wovXc1oH74af9oIe2TljwCCiTzNXzWgtUms,65
|
5
|
-
solax_py_library/snap_shot/constant/crc_table.py,sha256=D-pSxpf1XDzu7YR8LmbnzdLRvI8exDL2dyDh7RRc4Io,3566
|
6
|
-
solax_py_library/snap_shot/core/__init__.py,sha256=R0jkbwcJ3PPVyIGLVXvqRHDFTkq1NWBOPk0sa-FCVT8,178
|
7
|
-
solax_py_library/snap_shot/core/base_modbus.py,sha256=EdDSRvRC2a4IE_LGvjxGznqi6AX5x4O0_Wn1IkHzIpA,403
|
8
|
-
solax_py_library/snap_shot/core/parser.py,sha256=74YG14zOopW2am6BQX0zF3NnWTN21pkYcW7gFP1ssko,7703
|
9
|
-
solax_py_library/snap_shot/core/snap_shot.py,sha256=XbzR4yeCgMlLlcy8gEX58xFIc8agCZN7VDXE6SjlDr4,9931
|
10
|
-
solax_py_library/snap_shot/exceptions/__init__.py,sha256=9wLhmIelRKCXvlymcu3EewasVVYuPu4QQxTDLjGj6NQ,112
|
11
|
-
solax_py_library/snap_shot/exceptions/snap_shot.py,sha256=-oxxh_lUhfZwtggJ4zfNBPdkhdGPvcVvDezNlj4nFfY,154
|
12
|
-
solax_py_library/snap_shot/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
13
|
-
solax_py_library/snap_shot/types/__init__.py,sha256=g9ybB88TntvAMGIhLgJ31Xxn26zluSfI496bg-apSTU,290
|
14
|
-
solax_py_library/snap_shot/types/address.py,sha256=JhyB-t2OnKuE8akKk120sojCNXv4_OlLLuWsl5ChFZ8,1148
|
15
|
-
solax_py_library/upload/__init__.py,sha256=XhZar7BKaRN0XcdPl4QffWr488L3UWvuq5syT8nX2OU,93
|
16
|
-
solax_py_library/upload/api/__init__.py,sha256=ASShe-YQxP0aA3B_I8EmpWKXIdXPWvaANifrzlYrFEk,84
|
17
|
-
solax_py_library/upload/api/service.py,sha256=-APuz86t4loCkjzaxq02kuKrB6jxaPV-Tz1V__j6cY0,763
|
18
|
-
solax_py_library/upload/core/__init__.py,sha256=XMcnyDzCfsLwWaTAZt9-an7TuwYFqVNSt9W1_QRUrwA,89
|
19
|
-
solax_py_library/upload/core/data_adapter/__init__.py,sha256=9CXepLZSOjZMfNjyYKAWQCWZt353kTL_0tFBlIeUIOo,116
|
20
|
-
solax_py_library/upload/core/data_adapter/base.py,sha256=Va-SEe0eL3gobhNOnzHGkYBLIwf5RVawQdYRHHXg9g0,170
|
21
|
-
solax_py_library/upload/core/data_adapter/csv.py,sha256=8nlnV_43mMAR3re50MQJymzT5HYpZOo7eSeMsEfnEVE,861
|
22
|
-
solax_py_library/upload/core/upload_service/__init__.py,sha256=uA-UeH31rDNxByeZwvPhNFHPV_-J8JyCev8geuc---k,269
|
23
|
-
solax_py_library/upload/core/upload_service/base.py,sha256=dxCBVtPxDhN7oRTjnwnjtc2XAF4hyIz9HsYCJePlggg,912
|
24
|
-
solax_py_library/upload/core/upload_service/ftp.py,sha256=Up0_fm-udf8H9u6iy74V6-4IF2OIjTYhyeVsFeAp0x0,2927
|
25
|
-
solax_py_library/upload/exceptions/__init__.py,sha256=12D68_mODfJkVFa1f65QgPUn8bvD5BDAeiHgNgU0258,186
|
26
|
-
solax_py_library/upload/exceptions/upload_error.py,sha256=V2_yEMLj9KQEkdQ0Cm1DOogbjZWGb4p8RVnFx7D9yLY,425
|
27
|
-
solax_py_library/upload/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
28
|
-
solax_py_library/upload/test/test_ftp.py,sha256=tqc7Ag10PqgRewpMsBBG-mfezGK8lsxz3HbKOwQSORQ,2605
|
29
|
-
solax_py_library/upload/types/__init__.py,sha256=og9KBpYbcs36_S1izURj3vyHeuNOLJQrD9GpxK_JJaw,244
|
30
|
-
solax_py_library/upload/types/client.py,sha256=fG674_QEpOw3ibO171lcxJ0cz27yGR_sd3zgiyr4yuI,492
|
31
|
-
solax_py_library/upload/types/ftp.py,sha256=9kCeLB0g5Je19v4ifz8YYEsGOhJL1lKBO2C6V2VBndc,679
|
32
|
-
solax_py_library/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
33
|
-
solax_py_library/utils/common.py,sha256=MY4Iab1o-jv7JoImcDiRDW12-MTXgwYym8yt_PofqRY,571
|
34
|
-
solax_py_library-1.0.0.20.dist-info/METADATA,sha256=3_07XsIfWNwjj_061W3x8zzs4PAmyfGCjMFkzZB_BCg,1790
|
35
|
-
solax_py_library-1.0.0.20.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
36
|
-
solax_py_library-1.0.0.20.dist-info/RECORD,,
|
File without changes
|