solax-py-library 1.0.0.20__tar.gz → 1.0.0.21__tar.gz

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.
Files changed (47) hide show
  1. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/PKG-INFO +1 -1
  2. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/pyproject.toml +1 -1
  3. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/__init__.py +1 -1
  4. solax_py_library-1.0.0.21/solax_py_library/device/constant/inverter_model_info.py +312 -0
  5. solax_py_library-1.0.0.21/solax_py_library/device/core/interver/__init__.py +36 -0
  6. solax_py_library-1.0.0.21/solax_py_library/device/core/interver/base.py +215 -0
  7. solax_py_library-1.0.0.21/solax_py_library/device/types/__init__.py +0 -0
  8. solax_py_library-1.0.0.21/solax_py_library/device/types/inverter_config.py +41 -0
  9. solax_py_library-1.0.0.21/solax_py_library/device/types/modbus_point.py +30 -0
  10. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/exception.py +10 -10
  11. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/snap_shot/__init__.py +3 -3
  12. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/snap_shot/constant/__init__.py +5 -5
  13. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/snap_shot/constant/crc_table.py +258 -258
  14. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/snap_shot/core/__init__.py +0 -2
  15. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/snap_shot/core/base_modbus.py +14 -14
  16. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/snap_shot/core/parser.py +225 -225
  17. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/snap_shot/core/snap_shot.py +14 -12
  18. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/snap_shot/exceptions/__init__.py +3 -3
  19. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/snap_shot/exceptions/snap_shot.py +9 -9
  20. solax_py_library-1.0.0.21/solax_py_library/snap_shot/test/__init__.py +0 -0
  21. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/snap_shot/types/__init__.py +15 -15
  22. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/snap_shot/types/address.py +39 -39
  23. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/upload/__init__.py +3 -3
  24. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/upload/api/service.py +24 -24
  25. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/upload/core/upload_service/ftp.py +1 -1
  26. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/upload/exceptions/__init__.py +8 -8
  27. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/upload/exceptions/upload_error.py +21 -21
  28. solax_py_library-1.0.0.21/solax_py_library/upload/test/__init__.py +0 -0
  29. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/upload/test/test_ftp.py +1 -1
  30. solax_py_library-1.0.0.21/solax_py_library/utils/__init__.py +0 -0
  31. solax_py_library-1.0.0.21/solax_py_library/utils/common.py +38 -0
  32. solax_py_library-1.0.0.21/solax_py_library/utils/struct_util.py +30 -0
  33. solax_py_library-1.0.0.20/solax_py_library/utils/common.py +0 -19
  34. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/README.md +0 -0
  35. {solax_py_library-1.0.0.20/solax_py_library/snap_shot/test → solax_py_library-1.0.0.21/solax_py_library/device}/__init__.py +0 -0
  36. {solax_py_library-1.0.0.20/solax_py_library/upload/test → solax_py_library-1.0.0.21/solax_py_library/device/constant}/__init__.py +0 -0
  37. {solax_py_library-1.0.0.20/solax_py_library/utils → solax_py_library-1.0.0.21/solax_py_library/device/core}/__init__.py +0 -0
  38. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/upload/api/__init__.py +0 -0
  39. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/upload/core/__init__.py +0 -0
  40. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/upload/core/data_adapter/__init__.py +0 -0
  41. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/upload/core/data_adapter/base.py +0 -0
  42. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/upload/core/data_adapter/csv.py +0 -0
  43. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/upload/core/upload_service/__init__.py +0 -0
  44. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/upload/core/upload_service/base.py +0 -0
  45. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/upload/types/__init__.py +0 -0
  46. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/upload/types/client.py +0 -0
  47. {solax_py_library-1.0.0.20 → solax_py_library-1.0.0.21}/solax_py_library/upload/types/ftp.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: solax-py-library
3
- Version: 1.0.0.20
3
+ Version: 1.0.0.21
4
4
  Summary: some common tool
5
5
  Author: shenlvyu
6
6
  Author-email: 13296718439@163.com
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "solax-py-library"
3
- version = "1.0.0.20"
3
+ version = "1.0.0.21"
4
4
  description = "some common tool"
5
5
  authors = ["shenlvyu <13296718439@163.com>", "x5m8944pjl <371630856@qq.com>"]
6
6
  readme = "README.md"
@@ -1 +1 @@
1
- __all__ = ["upload", "snap_shot"]
1
+ __all__ = ["upload", "snap_shot"]
@@ -0,0 +1,312 @@
1
+ Inverter_model_info = {
2
+ "A": {
3
+ "A3F040": {"model": "X3-FTH", "rated_power": 40000},
4
+ "A3F050": {"model": "X3-FTH", "rated_power": 50000},
5
+ "A3F060": {"model": "X3-FTH", "rated_power": 60000},
6
+ "A3F070": {"model": "X3-FTH", "rated_power": 70000},
7
+ "A3F080": {"model": "X3-FTH", "rated_power": 80000},
8
+ "A3F100": {"model": "X3-FTH", "rated_power": 100000},
9
+ "A3F110": {"model": "X3-FTH", "rated_power": 110000},
10
+ "A3F120": {"model": "X3-FTH", "rated_power": 120000},
11
+ "A3F125": {"model": "X3-FTH", "rated_power": 125000},
12
+ "A3F136": {"model": "X3-FTH", "rated_power": 136000},
13
+ "A3F150": {"model": "X3-FTH", "rated_power": 150000},
14
+ },
15
+ "B": {
16
+ "B3F040": {"model": "X3-FTH", "rated_power": 40000},
17
+ "B3F050": {"model": "X3-FTH", "rated_power": 50000},
18
+ "B3F060": {"model": "X3-FTH", "rated_power": 60000},
19
+ "B3F070": {"model": "X3-FTH", "rated_power": 70000},
20
+ "B3F080": {"model": "X3-FTH", "rated_power": 80000},
21
+ "B3F100": {"model": "X3-FTH", "rated_power": 100000},
22
+ "B3F110": {"model": "X3-FTH", "rated_power": 110000},
23
+ "B3F120": {"model": "X3-FTH", "rated_power": 120000},
24
+ "B3F125": {"model": "X3-FTH", "rated_power": 125000},
25
+ "B3F136": {"model": "X3-FTH", "rated_power": 136000},
26
+ "B3F150": {"model": "X3-FTH", "rated_power": 150000},
27
+ },
28
+ "C": {
29
+ "C107": {"model": "EVCharger_1", "rated_power": 7200},
30
+ "C111": {"model": "EVCharger_1", "rated_power": 11000},
31
+ "C122": {"model": "EVCharger_1", "rated_power": 22000},
32
+ "C307": {"model": "EVCharger_3", "rated_power": 7200},
33
+ "C311": {"model": "EVCharger_3", "rated_power": 11000},
34
+ "C322": {"model": "EVCharger_3", "rated_power": 22000},
35
+ },
36
+ "F": {
37
+ "F430": {"model": "X1-Fit-G4", "rated_power": 3000},
38
+ "F437": {"model": "X1-Fit-G4", "rated_power": 3700},
39
+ "F450": {"model": "X1-Fit-G4", "rated_power": 5000},
40
+ "F460": {"model": "X1-Fit-G4", "rated_power": 6000},
41
+ "F475": {"model": "X1-Fit-G4", "rated_power": 7500},
42
+ "F34A06": {"model": "X3-Fit-G4", "rated_power": 6000},
43
+ "F34C06": {"model": "X3-Fit-G4", "rated_power": 6000},
44
+ "F34A08": {"model": "X3-Fit-G4", "rated_power": 8000},
45
+ "F34C08": {"model": "X3-Fit-G4", "rated_power": 8000},
46
+ "F34A10": {"model": "X3-Fit-G4", "rated_power": 10000},
47
+ "F34C10": {"model": "X3-Fit-G4", "rated_power": 10000},
48
+ "F34A15": {"model": "X3-Fit-G4", "rated_power": 15000},
49
+ "F34C15": {"model": "X3-Fit-G4", "rated_power": 15000},
50
+ },
51
+ "J": {
52
+ "J16": {"model": "J1-ESS-HB", "rated_power": 6000},
53
+ "J13": {"model": "J1-ESS-HB", "rated_power": 3000},
54
+ },
55
+ "H": {
56
+ "H34M05": {"model": "X3-Hybrid-G4", "rated_power": 5000},
57
+ "H34M06": {"model": "X3-Hybrid-G4", "rated_power": 6000},
58
+ "H34M08": {"model": "X3-Hybrid-G4", "rated_power": 8000},
59
+ "H34M10": {"model": "X3-Hybrid-G4", "rated_power": 10000},
60
+ "H34M12": {"model": "X3-Hybrid-G4", "rated_power": 12000},
61
+ "H34M15": {"model": "X3-Hybrid-G4", "rated_power": 15000},
62
+ "H34D05": {"model": "X3-Hybrid-G4", "rated_power": 5000},
63
+ "H34D06": {"model": "X3-Hybrid-G4", "rated_power": 6000},
64
+ "H34D08": {"model": "X3-Hybrid-G4", "rated_power": 8000},
65
+ "H34D10": {"model": "X3-Hybrid-G4", "rated_power": 10000},
66
+ "H34D12": {"model": "X3-Hybrid-G4", "rated_power": 12000},
67
+ "H34D15": {"model": "X3-Hybrid-G4", "rated_power": 15000},
68
+ "H34C05": {"model": "X3-Hybrid-G4", "rated_power": 5000},
69
+ "H34C06": {"model": "X3-Hybrid-G4", "rated_power": 6000},
70
+ "H34C08": {"model": "X3-Hybrid-G4", "rated_power": 8000},
71
+ "H34C10": {"model": "X3-Hybrid-G4", "rated_power": 10000},
72
+ "H34C12": {"model": "X3-Hybrid-G4", "rated_power": 12000},
73
+ "H34C15": {"model": "X3-Hybrid-G4", "rated_power": 15000},
74
+ "H34B05": {"model": "X3-Hybrid-G4", "rated_power": 5000},
75
+ "H34B06": {"model": "X3-Hybrid-G4", "rated_power": 6000},
76
+ "H34B08": {"model": "X3-Hybrid-G4", "rated_power": 8000},
77
+ "H34B10": {"model": "X3-Hybrid-G4", "rated_power": 10000},
78
+ "H34B12": {"model": "X3-Hybrid-G4", "rated_power": 12000},
79
+ "H34B15": {"model": "X3-Hybrid-G4", "rated_power": 15000},
80
+ "H34A05": {"model": "X3-Hybrid-G4", "rated_power": 5000},
81
+ "H34A06": {"model": "X3-Hybrid-G4", "rated_power": 6000},
82
+ "H34A08": {"model": "X3-Hybrid-G4", "rated_power": 8000},
83
+ "H34A10": {"model": "X3-Hybrid-G4", "rated_power": 10000},
84
+ "H34A12": {"model": "X3-Hybrid-G4", "rated_power": 12000},
85
+ "H34A15": {"model": "X3-Hybrid-G4", "rated_power": 15000},
86
+ "H34T05": {"model": "X3-Hybrid-G4", "rated_power": 5000},
87
+ "H34T06": {"model": "X3-Hybrid-G4", "rated_power": 6000},
88
+ "H34T08": {"model": "X3-Hybrid-G4", "rated_power": 8000},
89
+ "H34T10": {"model": "X3-Hybrid-G4", "rated_power": 10000},
90
+ "H34T12": {"model": "X3-Hybrid-G4", "rated_power": 12000},
91
+ "H34T15": {"model": "X3-Hybrid-G4", "rated_power": 15000},
92
+ "H430": {"model": "X1-Hybrid-G4", "rated_power": 3000},
93
+ "H437": {"model": "X1-Hybrid-G4", "rated_power": 3700},
94
+ "H450": {"model": "X1-Hybrid-G4", "rated_power": 5000},
95
+ "H460": {"model": "X1-Hybrid-G4", "rated_power": 6000},
96
+ "H475": {"model": "X1-Hybrid-G4", "rated_power": 7500},
97
+ "H35M05": {"model": "X3-IES", "rated_power": 5000},
98
+ "H35M06": {"model": "X3-IES", "rated_power": 6000},
99
+ "H35M08": {"model": "X3-IES", "rated_power": 8000},
100
+ "H35M10": {"model": "X3-IES", "rated_power": 10000},
101
+ "H35M12": {"model": "X3-IES", "rated_power": 12000},
102
+ "H35M15": {"model": "X3-IES", "rated_power": 15000},
103
+ "H35D05": {"model": "X3-IES", "rated_power": 5000},
104
+ "H35D06": {"model": "X3-IES", "rated_power": 6000},
105
+ "H35D08": {"model": "X3-IES", "rated_power": 8000},
106
+ "H35D10": {"model": "X3-IES", "rated_power": 10000},
107
+ "H35D12": {"model": "X3-IES", "rated_power": 12000},
108
+ "H35D15": {"model": "X3-IES", "rated_power": 15000},
109
+ "H35C05": {"model": "X3-IES", "rated_power": 5000},
110
+ "H35C06": {"model": "X3-IES", "rated_power": 6000},
111
+ "H35C08": {"model": "X3-IES", "rated_power": 8000},
112
+ "H35C10": {"model": "X3-IES", "rated_power": 10000},
113
+ "H35C12": {"model": "X3-IES", "rated_power": 12000},
114
+ "H35C15": {"model": "X3-IES", "rated_power": 15000},
115
+ "H35B05": {"model": "X3-IES", "rated_power": 5000},
116
+ "H35B06": {"model": "X3-IES", "rated_power": 6000},
117
+ "H35B08": {"model": "X3-IES", "rated_power": 8000},
118
+ "H35B10": {"model": "X3-IES", "rated_power": 10000},
119
+ "H35B12": {"model": "X3-IES", "rated_power": 12000},
120
+ "H35B15": {"model": "X3-IES", "rated_power": 15000},
121
+ "H35A05": {"model": "X3-IES", "rated_power": 5000},
122
+ "H35A06": {"model": "X3-IES", "rated_power": 6000},
123
+ "H35A08": {"model": "X3-IES", "rated_power": 8000},
124
+ "H35A10": {"model": "X3-IES", "rated_power": 10000},
125
+ "H35A12": {"model": "X3-IES", "rated_power": 12000},
126
+ "H35A15": {"model": "X3-IES", "rated_power": 15000},
127
+ "H35T05": {"model": "X3-IES", "rated_power": 5000},
128
+ "H35T06": {"model": "X3-IES", "rated_power": 6000},
129
+ "H35T08": {"model": "X3-IES", "rated_power": 8000},
130
+ "H35T10": {"model": "X3-IES", "rated_power": 10000},
131
+ "H35T12": {"model": "X3-IES", "rated_power": 12000},
132
+ "H35T15": {"model": "X3-IES", "rated_power": 15000},
133
+ "H530": {"model": "X1-IES", "rated_power": 3000},
134
+ "H537": {"model": "X1-IES", "rated_power": 3700},
135
+ "H546": {"model": "X1-IES", "rated_power": 4600},
136
+ "H550": {"model": "X1-IES", "rated_power": 5000},
137
+ "H560": {"model": "X1-IES", "rated_power": 6000},
138
+ "H580": {"model": "X1-IES", "rated_power": 8000},
139
+ "H3BC15": {"model": "X3-ULT", "rated_power": 15000},
140
+ "H3BD15": {"model": "X3-ULT", "rated_power": 15000},
141
+ "H3BE15": {"model": "X3-ULT", "rated_power": 15000},
142
+ "H3BF15": {"model": "X3-ULT", "rated_power": 15000},
143
+ "H3BG15": {"model": "X3-ULT", "rated_power": 15000},
144
+ "H3BC20": {"model": "X3-ULT", "rated_power": 20000},
145
+ "H3BD20": {"model": "X3-ULT", "rated_power": 20000},
146
+ "H3BE20": {"model": "X3-ULT", "rated_power": 20000},
147
+ "H3BF20": {"model": "X3-ULT", "rated_power": 20000},
148
+ "H3BG20": {"model": "X3-ULT", "rated_power": 20000},
149
+ "H3BC25": {"model": "X3-ULT", "rated_power": 25000},
150
+ "H3BD25": {"model": "X3-ULT", "rated_power": 25000},
151
+ "H3BE25": {"model": "X3-ULT", "rated_power": 25000},
152
+ "H3BF25": {"model": "X3-ULT", "rated_power": 25000},
153
+ "H3BG25": {"model": "X3-ULT", "rated_power": 25000},
154
+ "H3BC30": {"model": "X3-ULT", "rated_power": 30000},
155
+ "H3BD30": {"model": "X3-ULT", "rated_power": 30000},
156
+ "H3BE30": {"model": "X3-ULT", "rated_power": 30000},
157
+ "H3BF30": {"model": "X3-ULT", "rated_power": 30000},
158
+ "H3BG30": {"model": "X3-ULT", "rated_power": 30000},
159
+ },
160
+ "L": {
161
+ "L3G020": {"model": "X3-MGA-G2", "rated_power": 20000},
162
+ "L3G025": {"model": "X3-MGA-G2", "rated_power": 25000},
163
+ "L3G030": {"model": "X3-MGA-G2", "rated_power": 30000},
164
+ "L3G040": {"model": "X3-MGA-G2", "rated_power": 40000},
165
+ "L3G035": {"model": "X3-MGA-G2", "rated_power": 35000},
166
+ "L3G050": {"model": "X3-MGA-G2", "rated_power": 50000},
167
+ "L3G060": {"model": "X3-MGA-G2", "rated_power": 60000},
168
+ },
169
+ "M": {
170
+ "MC203": {"model": "X3-MIC-G2", "rated_power": 3000},
171
+ "MC204": {"model": "X3-MIC-G2", "rated_power": 4000},
172
+ "MC205": {"model": "X3-MIC-G2", "rated_power": 5000},
173
+ "MC206": {"model": "X3-MIC-G2", "rated_power": 6000},
174
+ "MC208": {"model": "X3-MIC-G2", "rated_power": 8000},
175
+ "MC210": {"model": "X3-MIC-G2", "rated_power": 10000},
176
+ "MC212": {"model": "X3-MIC-G2", "rated_power": 12000},
177
+ "MC215": {"model": "X3-MIC-G2", "rated_power": 15000},
178
+ "MPT30": {"model": "X3-PRO-G2", "rated_power": 30000},
179
+ "MPT25": {"model": "X3-PRO-G2", "rated_power": 25000},
180
+ "MPT20": {"model": "X3-PRO-G2", "rated_power": 20000},
181
+ "MPT17": {"model": "X3-PRO-G2", "rated_power": 17000},
182
+ "MPT15": {"model": "X3-PRO-G2", "rated_power": 15000},
183
+ "MPT12": {"model": "X3-PRO-G2", "rated_power": 12000},
184
+ "MPT10": {"model": "X3-PRO-G2", "rated_power": 10000},
185
+ "MPT08": {"model": "X3-PRO-G2", "rated_power": 8000},
186
+ },
187
+ "P": {
188
+ "P3F040": {"model": "X3-FTH", "rated_power": 40000},
189
+ "P3F050": {"model": "X3-FTH", "rated_power": 50000},
190
+ "P3F060": {"model": "X3-FTH", "rated_power": 60000},
191
+ "P3F070": {"model": "X3-FTH", "rated_power": 70000},
192
+ "P3F080": {"model": "X3-FTH", "rated_power": 80000},
193
+ "P3F100": {"model": "X3-FTH", "rated_power": 100000},
194
+ "P3F110": {"model": "X3-FTH", "rated_power": 110000},
195
+ "P3F120": {"model": "X3-FTH", "rated_power": 120000},
196
+ "P3F125": {"model": "X3-FTH", "rated_power": 125000},
197
+ "P3F136": {"model": "X3-FTH", "rated_power": 136000},
198
+ "P3F150": {"model": "X3-FTH", "rated_power": 150000},
199
+ },
200
+ "X": {
201
+ "X3F040": {"model": "X3-FTH", "rated_power": 40000},
202
+ "X3F050": {"model": "X3-FTH", "rated_power": 50000},
203
+ "X3F060": {"model": "X3-FTH", "rated_power": 60000},
204
+ "X3F070": {"model": "X3-FTH", "rated_power": 70000},
205
+ "X3F080": {"model": "X3-FTH", "rated_power": 80000},
206
+ "X3F100": {"model": "X3-FTH", "rated_power": 100000},
207
+ "X3F110": {"model": "X3-FTH", "rated_power": 110000},
208
+ "X3F120": {"model": "X3-FTH", "rated_power": 120000},
209
+ "X3F125": {"model": "X3-FTH", "rated_power": 125000},
210
+ "X3F136": {"model": "X3-FTH", "rated_power": 136000},
211
+ "X3F150": {"model": "X3-FTH", "rated_power": 150000},
212
+ "X3G020": {"model": "X3-MGA-G2", "rated_power": 20000},
213
+ "X3G025": {"model": "X3-MGA-G2", "rated_power": 25000},
214
+ "X3G030": {"model": "X3-MGA-G2", "rated_power": 30000},
215
+ "X3G040": {"model": "X3-MGA-G2", "rated_power": 40000},
216
+ "X3G035": {"model": "X3-MGA-G2", "rated_power": 35000},
217
+ "X3G050": {"model": "X3-MGA-G2", "rated_power": 50000},
218
+ "X3G060": {"model": "X3-MGA-G2", "rated_power": 60000},
219
+ "XB4030": {"model": "X1-BOOST-G4", "rated_power": 3000},
220
+ "XB40330": {"model": "X1-BOOST-G4", "rated_power": 3300},
221
+ "XB4036": {"model": "X1-BOOST-G4", "rated_power": 3600},
222
+ "XB4042": {"model": "X1-BOOST-G4", "rated_power": 4200},
223
+ "XB4050": {"model": "X1-BOOST-G4", "rated_power": 5000},
224
+ "XB4055": {"model": "X1-BOOST-G4", "rated_power": 5500},
225
+ "XB4060": {"model": "X1-BOOST-G4", "rated_power": 6000},
226
+ "XB4A30": {"model": "X1-BOOST-G4", "rated_power": 3000},
227
+ "XB4A330": {"model": "X1-BOOST-G4", "rated_power": 3300},
228
+ "XB4A36": {"model": "X1-BOOST-G4", "rated_power": 3600},
229
+ "XB4A42": {"model": "X1-BOOST-G4", "rated_power": 4200},
230
+ "XB4A50": {"model": "X1-BOOST-G4", "rated_power": 5000},
231
+ "XB4A55": {"model": "X1-BOOST-G4", "rated_power": 5500},
232
+ "XB4A60": {"model": "X1-BOOST-G4", "rated_power": 6000},
233
+ "XM4006": {"model": "X1-MINI-G4", "rated_power": 600},
234
+ "XM4007": {"model": "X1-MINI-G4", "rated_power": 700},
235
+ "XM4008": {"model": "X1-MINI-G4", "rated_power": 800},
236
+ "XM4011": {"model": "X1-MINI-G4", "rated_power": 1100},
237
+ "XM4015": {"model": "X1-MINI-G4", "rated_power": 1500},
238
+ "XM4020": {"model": "X1-MINI-G4", "rated_power": 2000},
239
+ "XM4025": {"model": "X1-MINI-G4", "rated_power": 2500},
240
+ "XM4030": {"model": "X1-MINI-G4", "rated_power": 3000},
241
+ "XM4033": {"model": "X1-MINI-G4", "rated_power": 3300},
242
+ "XM4037": {"model": "X1-MINI-G4", "rated_power": 3700},
243
+ "XM4040": {"model": "X1-MINI-G4", "rated_power": 4000},
244
+ "XSTA05": {"model": "X1-SMART-G2", "rated_power": 5000},
245
+ "XSTA06": {"model": "X1-SMART-G2", "rated_power": 6000},
246
+ "XSTA07": {"model": "X1-SMART-G2", "rated_power": 7000},
247
+ "XSTA08": {"model": "X1-SMART-G2", "rated_power": 8000},
248
+ "XSTA09": {"model": "X1-SMART-G2", "rated_power": 9000},
249
+ "XSTA10": {"model": "X1-SMART-G2", "rated_power": 10000},
250
+ },
251
+ "5": {
252
+ "50204": {"model": "X1-HAC-4P", "rated_power": 4600},
253
+ "50207": {"model": "X1-HAC-7P", "rated_power": 7200},
254
+ "50209": {"model": "X1-HAC-9P", "rated_power": 9600},
255
+ "5020B": {"model": "X1-HAC-11P", "rated_power": 11000},
256
+ "5020M": {"model": "X1-HAC-22P", "rated_power": 22000},
257
+ "50304": {"model": "X3-HAC-4P", "rated_power": 4600},
258
+ "50307": {"model": "X3-HAC-7P", "rated_power": 7200},
259
+ "50309": {"model": "X3-HAC-9P", "rated_power": 9600},
260
+ "5030B": {"model": "X3-HAC-11P", "rated_power": 11000},
261
+ "5030M": {"model": "X3-HAC-22P", "rated_power": 22000},
262
+ "50404": {"model": "J1-HAC-4P", "rated_power": 4600},
263
+ "50407": {"model": "J1-HAC-7P", "rated_power": 7200},
264
+ "50409": {"model": "J1-HAC-9P", "rated_power": 9000},
265
+ "5040B": {"model": "J1-HAC-11P", "rated_power": 11000},
266
+ "5040M": {"model": "J1-HAC-22P", "rated_power": 22000},
267
+ "50504": {"model": "A1-HAC-4P", "rated_power": 4600},
268
+ "50507": {"model": "A1-HAC-7P", "rated_power": 7200},
269
+ "50509": {"model": "A1-HAC-9P", "rated_power": 9000},
270
+ "5050B": {"model": "A1-HAC-11P", "rated_power": 11000},
271
+ "5050M": {"model": "A1-HAC-22P", "rated_power": 22000},
272
+ "50604": {"model": "X1-HAC-4S", "rated_power": 4600},
273
+ "50607": {"model": "X1-HAC-7S", "rated_power": 7200},
274
+ "50609": {"model": "X1-HAC-9S", "rated_power": 9600},
275
+ "5060B": {"model": "X1-HAC-11S", "rated_power": 11000},
276
+ "5060M": {"model": "X1-HAC-22S", "rated_power": 22000},
277
+ "50704": {"model": "X3-HAC-4S", "rated_power": 4600},
278
+ "50707": {"model": "X3-HAC-7S", "rated_power": 7200},
279
+ "50709": {"model": "X3-HAC-9S", "rated_power": 9600},
280
+ "5070B": {"model": "X3-HAC-11S", "rated_power": 11000},
281
+ "5070M": {"model": "X3-HAC-22S", "rated_power": 22000},
282
+ "50804": {"model": "C1-HAC-4P", "rated_power": 4600},
283
+ "50807": {"model": "C1-HAC-7P", "rated_power": 7200},
284
+ "50809": {"model": "C1-HAC-9P", "rated_power": 9600},
285
+ "5080B": {"model": "C1-HAC-11P", "rated_power": 11000},
286
+ "5080M": {"model": "C1-HAC-22P", "rated_power": 22000},
287
+ "50904": {"model": "C3-HAC-4P", "rated_power": 4600},
288
+ "50907": {"model": "C3-HAC-7P", "rated_power": 7200},
289
+ "50909": {"model": "C3-HAC-9P", "rated_power": 9600},
290
+ "5090B": {"model": "C3-HAC-11P", "rated_power": 11000},
291
+ "5090M": {"model": "C3-HAC-22P", "rated_power": 22000},
292
+ },
293
+ "3": {
294
+ "30P2B00": {"model": "X3-FTH-PLUS", "rated_power": 75000},
295
+ "30P3400": {"model": "X3-FTH-PLUS", "rated_power": 100000},
296
+ "30P3E00": {"model": "X3-FTH-PLUS", "rated_power": 110000},
297
+ "30P3Y00": {"model": "X3-FTH-PLUS", "rated_power": 120000},
298
+ "30P3T00": {"model": "X3-FTH-PLUS", "rated_power": 125000},
299
+ "30P4800": {"model": "X3-FTH-PLUS", "rated_power": 136000},
300
+ "30P4M00": {"model": "X3-FTH-PLUS", "rated_power": 150000},
301
+ "30Y9C00": {"model": "X3-GRAND", "rated_power": 300000},
302
+ "30YA000": {"model": "X3-GRAND", "rated_power": 320000},
303
+ "30YAA00": {"model": "X3-GRAND", "rated_power": 330000},
304
+ "30YAD00": {"model": "X3-GRAND", "rated_power": 333000},
305
+ "30YAU00": {"model": "X3-GRAND", "rated_power": 350000},
306
+ },
307
+ "166": "ZTY-1",
308
+ "167": "ZTY-3",
309
+ "SEVEN": "3S-IS",
310
+ "PMC-340": "EM300",
311
+ "PMC-53A": "EM700",
312
+ }
@@ -0,0 +1,36 @@
1
+ from .base import InverterProtocol
2
+
3
+
4
+ inverter_protocol_map = {}
5
+
6
+
7
+ def register_protocol(protocol_class: InverterProtocol):
8
+ if protocol_class.inverter_model is None:
9
+ raise RuntimeError("未找到对应的设备类型")
10
+ inverter_protocol_map[protocol_class.inverter_model] = protocol_class
11
+
12
+
13
+ def ProtocolFactory(inverter_model: int, *args, **kwargs) -> InverterProtocol:
14
+ """
15
+ 创建协议实例。
16
+ inverter_model: 逆变器类型
17
+ device_info: 设备信息。
18
+ data: 数据。
19
+ """
20
+ protocol_class = inverter_protocol_map.get(inverter_model)
21
+ if not protocol_class:
22
+ raise ValueError(f"未找到名为 '{str(inverter_model)}' 的协议")
23
+ return protocol_class(*args, **kwargs)
24
+
25
+
26
+ def match_pcs(operate_queue, slave_num):
27
+ for device_model in inverter_protocol_map.keys():
28
+ client = ProtocolFactory(device_model)
29
+ sn_data = client.read_sn(operate_queue.modbus_rtu, slave_num)
30
+ if not sn_data:
31
+ continue
32
+ sn = get_char(sn_data)
33
+ inverter_model, _ = client.parse_sn(sn)
34
+ if inverter_model:
35
+ return inverter_model, sn
36
+ return None, None
@@ -0,0 +1,215 @@
1
+ import json
2
+ from abc import ABCMeta, abstractmethod
3
+ from collections import OrderedDict
4
+ from datetime import datetime
5
+ from typing import List, Union
6
+
7
+ from pydantic.class_validators import Validator
8
+
9
+ from solax_py_library.device.types.inverter_config import InverterConfig, InverterPoint
10
+ from solax_py_library.device.types.modbus_point import WriteModbusPoint, ReadModbusPoint
11
+ from solax_py_library.utils.common import round_value
12
+ from solax_py_library.utils.struct_util import unpack
13
+
14
+
15
+ class InverterProtocol(metaclass=ABCMeta):
16
+ inverter_model: None
17
+
18
+ def __init__(self, point_config):
19
+ self.col_name_index_map = OrderedDict()
20
+ self.col_index_name_map = OrderedDict()
21
+ self.col_id_index_map = {}
22
+ self.sn_config = None
23
+ self.shutdown_config = None
24
+ self.boot_up_config = None
25
+ self.time_config = None
26
+ self.version_config = None
27
+ self.error_map = None
28
+ self._prepare(point_config)
29
+
30
+ def _prepare(self, point_config: str):
31
+ point_config = json.loads(point_config)
32
+ self.real_data_start_address = None
33
+ self.real_data_end_address = None
34
+ try:
35
+ point_config = InverterConfig(**point_config)
36
+ except Validator as e:
37
+ print(e)
38
+ for index, real_point in enumerate(point_config.real_data):
39
+ point_key = real_point.point_key
40
+ point_id = real_point.point_id
41
+ self.col_name_index_map[point_key] = real_point
42
+ self.col_index_name_map[point_id] = real_point
43
+ self.col_id_index_map[point_id] = index
44
+ self.real_data_start_address = min(
45
+ self.real_data_start_address, real_point.starting_address
46
+ )
47
+ self.real_data_end_address = max(
48
+ self.real_data_end_address,
49
+ real_point.starting_address + real_point.quantity_of_x - 1,
50
+ )
51
+
52
+ self.sn_config = point_config.other_data.sn
53
+ self.shutdown_config = point_config.other_data.shutdown
54
+ self.boot_up_config = point_config.other_data.boot_up
55
+ self.time_config = point_config.other_data.time
56
+ self.version_config = point_config.other_data.version
57
+
58
+ self.error_map = point_config.error_map
59
+
60
+ def read_real_data(self, modbus_client, slave):
61
+ real_data = self._execute_modbus(
62
+ modbus_client,
63
+ slave,
64
+ ReadModbusPoint(
65
+ starting_address=self.real_data_start_address,
66
+ quantity_of_x=self.real_data_end_address
67
+ - self.real_data_start_address
68
+ + 1,
69
+ function_code=InverterPoint.function_code,
70
+ ),
71
+ )
72
+ ret_real_data = {}
73
+ for point_id, point_info in self.col_index_name_map.items():
74
+ offset = point_info.starting_address
75
+ data = real_data[offset : offset + point_info.quantity_of_x]
76
+ ret_real_data[point_id] = self._parse_point_data(point_info, data)
77
+ return ret_real_data
78
+
79
+ def read_real_data_to_list(self, modbus_client, slave):
80
+ real_data = self.read_real_data(modbus_client, slave)
81
+ return list(real_data.values())
82
+
83
+ def _parse_point_data(self, point_info: InverterPoint, point_data):
84
+ value = unpack(
85
+ point_data, data_format=point_info.register_dataformat, reversed=True
86
+ )
87
+ accuracy = point_info.accuracy
88
+ return round_value(value * accuracy, 3)
89
+
90
+ def get_data_by_point_id_from_list(self, point_id, real_data):
91
+ point_index = self.col_id_index_map[point_id]
92
+ return real_data[point_index]
93
+
94
+ @abstractmethod
95
+ def get_real_power(self, read_data):
96
+ raise NotImplementedError()
97
+
98
+ @abstractmethod
99
+ def get_error_data(self, read_data):
100
+ raise NotImplementedError()
101
+
102
+ @abstractmethod
103
+ def parse_pcs_status(self, read_data):
104
+ ...
105
+
106
+ @abstractmethod
107
+ def parse_error_code(self, error_data):
108
+ ...
109
+
110
+ def error_to_alarm_code(self, error_codes: List[int]):
111
+ if not self.error_map:
112
+ return error_codes
113
+ alarm_codes = []
114
+ for error_code in error_codes:
115
+ if alarm_code := self.error_map.get(error_code):
116
+ alarm_codes.append(alarm_code)
117
+ return alarm_codes
118
+
119
+ def pv_power_data(self, real_data):
120
+ ...
121
+
122
+ def get_pv_capacity(self, real_data, history_data):
123
+ ...
124
+
125
+ def get_active_power(self, read_data):
126
+ ...
127
+
128
+ def get_reactive_power(self, read_data):
129
+ ...
130
+
131
+ # ============================== read or write =========================================
132
+
133
+ def _execute_modbus(
134
+ self,
135
+ modbus_client,
136
+ slave_num,
137
+ point_info: Union[WriteModbusPoint, ReadModbusPoint],
138
+ output_value=None,
139
+ ):
140
+ try:
141
+ ret = modbus_client.read_and_write(
142
+ slave_num,
143
+ **point_info.dict(
144
+ include={"starting_address", "quantity_of_x", "function_code"}
145
+ ),
146
+ output_value=output_value,
147
+ )
148
+ except Exception as e:
149
+ print(e)
150
+ return ret
151
+
152
+ def shutdown(self, modbus_client, slave_num):
153
+ self._execute_modbus(
154
+ modbus_client,
155
+ slave_num,
156
+ self.shutdown_config,
157
+ output_value=self.shutdown_config.output_value,
158
+ )
159
+
160
+ def boot_up(self, modbus_client, slave_num):
161
+ self._execute_modbus(
162
+ modbus_client,
163
+ slave_num,
164
+ self.boot_up_config,
165
+ output_value=self.boot_up_config.output_value,
166
+ )
167
+
168
+ def read_sn(self, modbus_client, slave_num):
169
+ return self._execute_modbus(modbus_client, slave_num, self.sn_config)
170
+
171
+ def read_soft_version_and_hard_version(self, modbus_client, slave_num):
172
+ soft_inv_version = self.read_soft_version(modbus_client, slave_num)
173
+ hard_inv_version = self.read_hard_version(modbus_client, slave_num)
174
+ return soft_inv_version, hard_inv_version
175
+
176
+ def read_soft_version(self, modbus_client, slave_num):
177
+ return self._execute_modbus(
178
+ modbus_client, slave_num, self.version_config.software
179
+ )
180
+
181
+ def read_hard_version(self, modbus_client, slave_num):
182
+ return self._execute_modbus(
183
+ modbus_client, slave_num, self.version_config.hardware
184
+ )
185
+
186
+ def get_upgrade_value(self, crc, file_size):
187
+ crc_nums = [crc[1], crc[0]]
188
+ file_size = [file_size[1], file_size[0]]
189
+ value = (
190
+ [self.inverter_model]
191
+ + crc_nums
192
+ + [1, 0, 0, 0, 0, 0, 0]
193
+ + file_size
194
+ + [1, 0, 0]
195
+ )
196
+ return value
197
+
198
+ def write_pcs_time(self, modbus_client, slave_num):
199
+ self._execute_modbus(
200
+ modbus_client,
201
+ slave_num,
202
+ self.time_config,
203
+ output_value=self._build_pcs_time_value(),
204
+ )
205
+
206
+ def _build_pcs_time_value(self):
207
+ cur_time = datetime.now()
208
+ return [
209
+ cur_time.year,
210
+ cur_time.month,
211
+ cur_time.day,
212
+ cur_time.hour,
213
+ cur_time.minute,
214
+ cur_time.second,
215
+ ]
@@ -0,0 +1,41 @@
1
+ from typing import List, Optional, Dict
2
+ from modbus_tk import defines
3
+
4
+ from pydantic import BaseModel
5
+ from enum import IntEnum
6
+
7
+ from solax_py_library.device.types.modbus_point import ReadModbusPoint, WriteModbusPoint
8
+
9
+
10
+ class InverterModel(IntEnum):
11
+ ...
12
+
13
+ def __str__(self):
14
+ ...
15
+
16
+
17
+ class InverterPoint(ReadModbusPoint):
18
+ description: Optional[str]
19
+ point_key: str
20
+ point_id: int
21
+ accuracy: Optional[float]
22
+ function_code: int = defines.READ_INPUT_REGISTERS
23
+
24
+
25
+ class InverterVersionConfig(BaseModel):
26
+ software: ReadModbusPoint
27
+ hardware: ReadModbusPoint
28
+
29
+
30
+ class InverterSystemConfig(BaseModel):
31
+ sn: ReadModbusPoint
32
+ shutdown: WriteModbusPoint
33
+ boot_up: WriteModbusPoint
34
+ time: WriteModbusPoint
35
+ version: InverterVersionConfig
36
+
37
+
38
+ class InverterConfig(BaseModel):
39
+ real_data: List[InverterPoint]
40
+ other_data: InverterSystemConfig
41
+ error_map: Dict[int, int]