@atelieruldetehnologii/node-red-custome-solutions 0.62.22

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 (107) hide show
  1. package/NOTICE +56 -0
  2. package/PROPRIETARY-LICENSE.txt +157 -0
  3. package/README.md +105 -0
  4. package/TERMS-AND-CONDITIONS.md +311 -0
  5. package/advantech-read/advantech-read.html +775 -0
  6. package/advantech-read/advantech-read.js +449 -0
  7. package/advantech-write/advantech-write.html +413 -0
  8. package/advantech-write/advantech-write.js +338 -0
  9. package/bess-control/bess-control.html +569 -0
  10. package/bess-control/bess-control.js +541 -0
  11. package/bess-control/lib/allocation.js +149 -0
  12. package/bess-control/lib/batteries.js +86 -0
  13. package/bess-control/lib/helpers.js +157 -0
  14. package/bess-control/lib/messages.js +131 -0
  15. package/bess-control/lib/runtime.js +156 -0
  16. package/carlo-gavazzi/carlo-gavazzi.html +4327 -0
  17. package/carlo-gavazzi/carlo-gavazzi.js +3081 -0
  18. package/control-export/control-export.html +3644 -0
  19. package/control-export/control-export.js +2192 -0
  20. package/control-reactive/control-reactive.html +3136 -0
  21. package/control-reactive/control-reactive.js +2124 -0
  22. package/fronius-emulator/README.md +258 -0
  23. package/fronius-emulator/fronius-emulator.html +170 -0
  24. package/fronius-emulator/fronius-emulator.js +520 -0
  25. package/fronius-emulator/lib/binary-codec.js +65 -0
  26. package/fronius-emulator/lib/fronius-register-map.js +185 -0
  27. package/fronius-emulator/lib/modbus-parser.js +61 -0
  28. package/fronius-emulator/lib/modbus-tcp-server.js +224 -0
  29. package/fronius-emulator/lib/validation.js +206 -0
  30. package/fronius-emulator/lib/virtual-meter.js +132 -0
  31. package/fronius-read/fronius-read.html +3944 -0
  32. package/fronius-read/fronius-read.js +1466 -0
  33. package/fronius-read/lib/inverter-profiles.js +711 -0
  34. package/fronius-read/lib/sunspec-core.js +303 -0
  35. package/fronius-read/lib/sunspec-model-parsers.js +845 -0
  36. package/fronius-write/fronius-write.html +1789 -0
  37. package/fronius-write/fronius-write.js +2531 -0
  38. package/influxdb/influxdb.html +1077 -0
  39. package/influxdb/influxdb.js +1487 -0
  40. package/janitza/janitza.html +2562 -0
  41. package/janitza/janitza.js +1500 -0
  42. package/janitza/lib/janitza-profiles.js +371 -0
  43. package/lib/a3-test-server.js +199 -0
  44. package/lib/adam-6000-profiles.js +173 -0
  45. package/lib/licensing/constants.js +103 -0
  46. package/lib/licensing/device-id.js +251 -0
  47. package/lib/licensing/errors.js +21 -0
  48. package/lib/licensing/license-client.js +377 -0
  49. package/lib/licensing/license-state.js +50 -0
  50. package/lib/licensing/node-guard.js +150 -0
  51. package/lib/licensing/package-integrity.js +167 -0
  52. package/lib/licensing/package-integrity.json +513 -0
  53. package/lib/licensing/public-key.pem +3 -0
  54. package/lib/licensing/public-key.pem.example +2 -0
  55. package/lib/licensing/public-keys.js +18 -0
  56. package/lib/licensing/storage.js +63 -0
  57. package/lib/licensing/token-verifier.js +84 -0
  58. package/lib/numbers.js +26 -0
  59. package/license/atelier-license.html +88 -0
  60. package/license/atelier-license.js +170 -0
  61. package/modbus-tcp-discover/modbus-tcp-discover.html +190 -0
  62. package/modbus-tcp-discover/modbus-tcp-discover.js +706 -0
  63. package/multi-battery/multi-battery.html +649 -0
  64. package/multi-battery/multi-battery.js +668 -0
  65. package/multi-grid/multi-grid.html +745 -0
  66. package/multi-grid/multi-grid.js +1392 -0
  67. package/multi-inverter/lib/engine-core.js +237 -0
  68. package/multi-inverter/multi-inverter.html +2674 -0
  69. package/multi-inverter/multi-inverter.js +1393 -0
  70. package/package.json +109 -0
  71. package/phoenix-contact/lib/eem-ma370-advanced.js +175 -0
  72. package/phoenix-contact/lib/eem-ma370.js +138 -0
  73. package/phoenix-contact/lib/integrations.js +149 -0
  74. package/phoenix-contact/lib/phoenix-contact-profile.js +35030 -0
  75. package/phoenix-contact/phoenix-contact.html +840 -0
  76. package/phoenix-contact/phoenix-contact.js +679 -0
  77. package/pv-generator/pv-generator.html +284 -0
  78. package/pv-generator/pv-generator.js +387 -0
  79. package/pylontech-read/pylontech-read.html +763 -0
  80. package/pylontech-read/pylontech-read.js +518 -0
  81. package/pylontech-write/pylontech-write.html +405 -0
  82. package/pylontech-write/pylontech-write.js +546 -0
  83. package/scada-aggregator/lib/aggregate.js +72 -0
  84. package/scada-aggregator/lib/groups.js +39 -0
  85. package/scada-aggregator/scada-aggregator.html +108 -0
  86. package/scada-aggregator/scada-aggregator.js +117 -0
  87. package/scada-server/lib/aggregator-map.js +58 -0
  88. package/scada-server/lib/encoding.js +235 -0
  89. package/scada-server/lib/modbus-server.js +492 -0
  90. package/scada-server/lib/object-path.js +18 -0
  91. package/scada-server/lib/register-map.js +288 -0
  92. package/scada-server/scada-server.html +1419 -0
  93. package/scada-server/scada-server.js +704 -0
  94. package/scripts/check-syntax.js +66 -0
  95. package/scripts/package-integrity.js +46 -0
  96. package/scripts/package-release.js +116 -0
  97. package/scripts/run-tests.js +2178 -0
  98. package/scripts/tgz-integrity.js +74 -0
  99. package/sma-read/lib/sunspec-core.js +83 -0
  100. package/sma-read/lib/sunspec-model-parsers.js +853 -0
  101. package/sma-read/sma-read.html +659 -0
  102. package/sma-read/sma-read.js +458 -0
  103. package/sma-write/sma-write.html +105 -0
  104. package/sma-write/sma-write.js +270 -0
  105. package/victron-read/lib/mqtt-state.js +176 -0
  106. package/victron-read/victron-read.html +1074 -0
  107. package/victron-read/victron-read.js +1222 -0
@@ -0,0 +1,405 @@
1
+ <style>
2
+ .pylontech-write-editor {
3
+ --pw-border: #d7dde5;
4
+ --pw-muted: #667085;
5
+ --pw-surface: #f7fcfb;
6
+ --pw-head: #e8f5f3;
7
+ }
8
+
9
+ .pylontech-write-editor .pw-hero,
10
+ .pylontech-write-editor .pw-section {
11
+ margin: 0 0 18px;
12
+ padding: 14px 16px 16px;
13
+ border: 1px solid var(--pw-border);
14
+ border-radius: 12px;
15
+ background: var(--pw-surface);
16
+ }
17
+
18
+ .pylontech-write-editor .pw-hero {
19
+ background: linear-gradient(135deg, var(--pw-head), #f7fcfb);
20
+ }
21
+
22
+ .pylontech-write-editor .pw-title {
23
+ margin: 0 0 4px;
24
+ font-size: 15px;
25
+ font-weight: 700;
26
+ color: #243447;
27
+ }
28
+
29
+ .pylontech-write-editor .pw-note {
30
+ margin: 0 0 14px;
31
+ color: var(--pw-muted);
32
+ font-size: 12px;
33
+ line-height: 1.45;
34
+ }
35
+
36
+ .pylontech-write-editor .pw-grid {
37
+ display: grid;
38
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
39
+ gap: 12px 16px;
40
+ }
41
+
42
+ .pylontech-write-editor .form-row {
43
+ margin-bottom: 12px;
44
+ }
45
+
46
+ .pylontech-write-editor .pw-grid .form-row,
47
+ .pylontech-write-editor .form-row:last-child {
48
+ margin-bottom: 0;
49
+ }
50
+
51
+ .pylontech-write-editor .form-row > label {
52
+ width: 150px;
53
+ font-weight: 600;
54
+ }
55
+
56
+ .pylontech-write-editor .form-row > input[type="text"] {
57
+ width: calc(100% - 160px);
58
+ }
59
+ </style>
60
+
61
+ <script type="text/javascript">
62
+
63
+ RED.nodes.registerType("pylontech-write", {
64
+
65
+ category: "Atelierul de Tehnologii",
66
+
67
+ color: "#4db6ac",
68
+
69
+ defaults: {
70
+ license: { value: "", type: "atelier-license", required: true },
71
+
72
+ name: { value: "" },
73
+
74
+ host: { value: "", required: true },
75
+
76
+ port: { value: 502, required: true, validate: RED.validators.number() },
77
+
78
+ unitId: { value: 1, required: true, validate: RED.validators.number() },
79
+
80
+ externalControlRegister: { value: 3006, validate: RED.validators.number() },
81
+
82
+ externalControlEnabledValue: { value: 85, validate: RED.validators.number() },
83
+
84
+ externalControlDisabledValue: { value: 170, validate: RED.validators.number() },
85
+
86
+ powerRegister: { value: 3007, validate: RED.validators.number() },
87
+
88
+ powerScaleKw: {
89
+
90
+ value: 0.1,
91
+
92
+ validate: function (v) {
93
+
94
+ const n = Number(v);
95
+
96
+ return Number.isFinite(n) && n > 0;
97
+
98
+ }
99
+
100
+ }
101
+
102
+ },
103
+
104
+ inputs: 1,
105
+
106
+ outputs: 1,
107
+
108
+ icon: "font-awesome/fa-battery-three-quarters",
109
+
110
+ label: function () {
111
+
112
+ return this.name || this.host || "pylontech-write";
113
+
114
+ },
115
+
116
+ oneditprepare: function () {
117
+ $("#node-input-host").off(".pylontechWriteName").on("input.pylontechWriteName change.pylontechWriteName", function () {
118
+ $("#node-input-name").val(String($(this).val() || "").trim());
119
+ });
120
+ },
121
+
122
+ oneditsave: function () {
123
+ if (!String($("#node-input-name").val() || "").trim()) {
124
+ $("#node-input-name").val(String($("#node-input-host").val() || "").trim());
125
+ }
126
+ $("#node-input-host").off(".pylontechWriteName");
127
+ },
128
+
129
+ oneditcancel: function () {
130
+ $("#node-input-host").off(".pylontechWriteName");
131
+ }
132
+
133
+ });
134
+
135
+ </script>
136
+
137
+
138
+ <script type="text/html" data-template-name="pylontech-write">
139
+ <div class="form-row"><label for="node-input-license"><i class="fa fa-key"></i> License</label><input type="text" id="node-input-license"></div>
140
+ <div class="pylontech-write-editor">
141
+ <div class="pw-hero">
142
+ <p class="pw-title">Pylontech Command Writer</p>
143
+ <p class="pw-note">Nodul scrie comanda finala pe fiecare baterie. In fluxul recomandat primeste mesaje direct din <code>multi-battery</code>, deja pregatite cu <code>external_control</code> si <code>power_w</code>.</p>
144
+ </div>
145
+
146
+ <div class="pw-section">
147
+ <p class="pw-title">Connection</p>
148
+ <p class="pw-note">Setari Modbus TCP pentru bateria sau EMS-ul controlat de aceasta instanta.</p>
149
+ <div class="pw-grid">
150
+ <div class="form-row">
151
+ <label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
152
+ <input type="text" id="node-input-name" placeholder="pylontech-write">
153
+ </div>
154
+
155
+ <div class="form-row">
156
+ <label for="node-input-host"><i class="fa fa-plug"></i> Host</label>
157
+ <input type="text" id="node-input-host" placeholder="192.168.135.100">
158
+ </div>
159
+
160
+ <div class="form-row">
161
+ <label for="node-input-port"><i class="fa fa-ellipsis-h"></i> Port</label>
162
+ <input type="text" id="node-input-port" placeholder="502">
163
+ </div>
164
+
165
+ <div class="form-row">
166
+ <label for="node-input-unitId"><i class="fa fa-hashtag"></i> Unit ID</label>
167
+ <input type="text" id="node-input-unitId" placeholder="1">
168
+ </div>
169
+ </div>
170
+ </div>
171
+
172
+ <div class="pw-section">
173
+ <p class="pw-title">External Control Register</p>
174
+ <p class="pw-note">Valori implicite potrivite pentru majoritatea integrarilor Pylontech/EMS.</p>
175
+ <div class="pw-grid">
176
+ <div class="form-row">
177
+ <label for="node-input-externalControlRegister"><i class="fa fa-toggle-on"></i> Register</label>
178
+ <input type="text" id="node-input-externalControlRegister" placeholder="3006">
179
+ </div>
180
+
181
+ <div class="form-row">
182
+ <label for="node-input-externalControlEnabledValue"><i class="fa fa-check"></i> Enable Value</label>
183
+ <input type="text" id="node-input-externalControlEnabledValue" placeholder="85">
184
+ </div>
185
+
186
+ <div class="form-row">
187
+ <label for="node-input-externalControlDisabledValue"><i class="fa fa-times"></i> Disable Value</label>
188
+ <input type="text" id="node-input-externalControlDisabledValue" placeholder="170">
189
+ </div>
190
+ </div>
191
+ </div>
192
+
193
+ <div class="pw-section">
194
+ <p class="pw-title">Power Register</p>
195
+ <p class="pw-note">Nodul converteste automat <code>power_w</code> in kW si apoi in unitatile cerute de registrul Modbus.</p>
196
+ <div class="pw-grid">
197
+ <div class="form-row">
198
+ <label for="node-input-powerRegister"><i class="fa fa-bolt"></i> Register</label>
199
+ <input type="text" id="node-input-powerRegister" placeholder="3007">
200
+ </div>
201
+
202
+ <div class="form-row">
203
+ <label for="node-input-powerScaleKw"><i class="fa fa-balance-scale"></i> Scale (kW/unit)</label>
204
+ <input type="text" id="node-input-powerScaleKw" placeholder="0.1">
205
+ </div>
206
+ </div>
207
+ </div>
208
+ </div>
209
+
210
+ </script>
211
+
212
+
213
+ <script type="text/html" data-help-name="pylontech-write">
214
+
215
+ <p>
216
+
217
+ Nodul <b>pylontech-write</b> scrie prin Modbus TCP două comenzi către Pylontech / EMS:
218
+
219
+ activare-dezactivare control extern și limită de putere.
220
+
221
+ </p>
222
+
223
+
224
+ <h3>Registre implicite</h3>
225
+
226
+ <ul>
227
+
228
+ <li><code>3006</code> — control extern</li>
229
+
230
+ <li><code>3007</code> — putere în pași de <code>0.1 kW</code></li>
231
+
232
+ </ul>
233
+
234
+
235
+ <h3>Input acceptat</h3>
236
+
237
+ <p>Poți trimite doar puterea, doar controlul extern sau ambele în același mesaj.</p>
238
+ <p>În fluxul recomandat, nodul primește direct ieșirile din <code>multi-battery</code>.</p>
239
+
240
+
241
+ <pre>{
242
+
243
+ "payload": 5
244
+
245
+ }</pre>
246
+
247
+ <p>Interpretare: scrie puterea <code>5 kW</code> în registrul de putere.</p>
248
+
249
+
250
+ <pre>{
251
+
252
+ "payload": {
253
+
254
+ "power_kw": -5
255
+
256
+ }
257
+
258
+ }</pre>
259
+
260
+ <p>Interpretare: scrie <code>-5 kW</code> în two's complement pe registrul de putere.</p>
261
+
262
+
263
+ <pre>{
264
+
265
+ "payload": {
266
+
267
+ "power_w": 7500
268
+
269
+ }
270
+
271
+ }</pre>
272
+
273
+ <p>Interpretare: convertește automat <code>7500 W</code> la <code>7.5 kW</code>.</p>
274
+
275
+
276
+ <pre>{
277
+
278
+ "payload": {
279
+
280
+ "external_control": true
281
+
282
+ }
283
+
284
+ }</pre>
285
+
286
+ <p>Interpretare: scrie valoarea de activare pentru control extern.</p>
287
+
288
+
289
+ <pre>{
290
+
291
+ "payload": {
292
+
293
+ "external_control": false
294
+
295
+ }
296
+
297
+ }</pre>
298
+
299
+ <p>Interpretare: scrie valoarea de dezactivare pentru control extern.</p>
300
+
301
+
302
+ <pre>{
303
+
304
+ "payload": {
305
+
306
+ "external_control": true,
307
+
308
+ "power_kw": 12.5
309
+
310
+ }
311
+
312
+ }</pre>
313
+
314
+ <p>Interpretare: activează controlul extern și scrie apoi puterea.</p>
315
+
316
+
317
+ <h3>Chei acceptate</h3>
318
+
319
+ <ul>
320
+
321
+ <li>pentru control extern: <code>external_control</code>, <code>externalControl</code>, <code>enable_external_control</code>, <code>control_extern</code>, <code>enabled</code></li>
322
+
323
+ <li>pentru putere în kW: <code>power_kw</code>, <code>limit_kw</code>, <code>value_kw</code>, <code>kw</code>, <code>power</code></li>
324
+
325
+ <li>pentru putere în W: <code>power_w</code>, <code>limit_w</code>, <code>value_w</code>, <code>watts</code></li>
326
+
327
+ <li>pentru rescriere forțată: <code>force: true</code></li>
328
+
329
+ </ul>
330
+
331
+
332
+ <h3>Output</h3>
333
+
334
+ <p>Nodul emite un mesaj de confirmare sau eroare.</p>
335
+
336
+
337
+ <pre>{
338
+
339
+ "topic": "pylontech/write",
340
+
341
+ "payload": {
342
+
343
+ "status": "ok",
344
+
345
+ "external_control_written": true,
346
+
347
+ "external_control_enabled": true,
348
+
349
+ "external_control_raw": 85,
350
+
351
+ "power_written": true,
352
+
353
+ "power_kw": 12.5,
354
+
355
+ "power_raw": 125
356
+
357
+ }
358
+
359
+ }</pre>
360
+
361
+
362
+ <h3>Observații</h3>
363
+
364
+ <ul>
365
+
366
+ <li>puterea este scrisă ca registru pe 16 biți unsigned, folosind two's complement pentru valori negative</li>
367
+
368
+ <li>în mod implicit, activarea controlului extern scrie <code>85</code>, iar dezactivarea scrie <code>170</code></li>
369
+
370
+ <li>dacă trimiți doar putere, controlul extern nu este modificat</li>
371
+
372
+ <li>dacă trimiți doar control extern, puterea nu este modificată</li>
373
+
374
+ </ul>
375
+
376
+
377
+ <h3>Referinta completa parametri</h3>
378
+
379
+ <ul>
380
+
381
+ <li><code>host</code>, <code>port</code>, <code>unitId</code>: conexiunea Modbus TCP catre baterie/EMS.</li>
382
+
383
+ <li><code>externalControlRegister</code>: registrul pentru activarea/dezactivarea controlului extern.</li>
384
+
385
+ <li><code>externalControlEnabledValue</code>: valoarea scrisa pentru activare.</li>
386
+
387
+ <li><code>externalControlDisabledValue</code>: valoarea scrisa pentru dezactivare.</li>
388
+
389
+ <li><code>powerRegister</code>: registrul pentru puterea comandata.</li>
390
+
391
+ <li><code>powerScaleKw</code>: factorul de conversie intre kW si valoarea bruta scrisa.</li>
392
+
393
+ </ul>
394
+
395
+
396
+ <h3>Model recomandat din multi-battery</h3>
397
+
398
+ <pre>{
399
+ "payload": {
400
+ "external_control": true,
401
+ "power_w": 9000
402
+ }
403
+ }</pre>
404
+
405
+ </script>