iobroker.sun2000 2.1.1 → 2.2.0
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.
- package/README.md +5 -0
- package/io-package.json +14 -14
- package/lib/drivers/driver_emma.js +48 -11
- package/lib/drivers/driver_inverter.js +25 -24
- package/lib/drivers/driver_slogger.js +29 -6
- package/lib/register.js +36 -30
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -65,6 +65,11 @@ browse in the [wiki](https://github.com/bolliy/ioBroker.sun2000/wiki)
|
|
|
65
65
|
Placeholder for the next version (at the beginning of the line):
|
|
66
66
|
### **WORK IN PROGRESS**
|
|
67
67
|
-->
|
|
68
|
+
### 2.2.0 (2025-10-05)
|
|
69
|
+
* dependency and configuration updates
|
|
70
|
+
* new state `meter.derived.signConventionForPowerFeed-in` sign of meter.activePower that is currently being fed into the power grid
|
|
71
|
+
* new state `meter.derived.feed-inPower` electric power that is supplied to a grid ("fed in")
|
|
72
|
+
|
|
68
73
|
### 2.1.1 (2025-09-24)
|
|
69
74
|
* dependency and configuration updates
|
|
70
75
|
* fix: adjust event value limits based on usableSurplus parameters
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "sun2000",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.2.0",
|
|
5
5
|
"news": {
|
|
6
|
+
"2.2.0": {
|
|
7
|
+
"en": "dependency and configuration updates\nnew state `meter.derived.signConventionForPowerFeed-in` sign of meter.activePower that is currently being fed into the power grid\nnew state `meter.derived.feed-inPower` electric power that is supplied to a grid (\"fed in\")",
|
|
8
|
+
"de": "abhängigkeits- und konfigurationsupdates\nneuer Zustand `meter.derived.signConventionForPowerFeed-in` Zeichen von meter.active Strom, der derzeit in das Stromnetz eingespeist wird\nneue Zustand `meter.derived.feed-inPower` elektrische Leistung, die einem Netz zugeführt wird (\"fed in\")",
|
|
9
|
+
"ru": "обновления зависимостей и конфигурации\nновый государственный знак «meter.derived.signConventionForPowerFeed-in» Мощность, которая в настоящее время подается в электросеть\nэлектрическая мощность нового состояния «meter.derived.feed-inPower», которая подается в сеть («питается в»)",
|
|
10
|
+
"pt": "atualizações de dependência e configuração\nnovo estado `meter.derived.signConventionForPowerFeed-in` sinal do medidor.active Energia que está sendo alimentada na rede de energia\nnovo estado `meter.derived.feed-inPower` energia elétrica que é fornecida a uma grade (\"feed in\")",
|
|
11
|
+
"nl": "afhankelijkheid en configuratie-updates\nnieuwe staat Energie die momenteel wordt gevoed in het elektriciteitsnet\nnieuwe toestand ",
|
|
12
|
+
"fr": "mises à jour de la dépendance et de la configuration\nnouvel état `meter.derived.signConventionForPowerFeed-in` signe de meter.active Puissance qui est actuellement introduite dans le réseau électrique\nnouvel état `meter.derived.feed-inPower` électricité qui est fourni à un réseau (\"feed in\")",
|
|
13
|
+
"it": "aggiornamenti di dipendenza e configurazione\nnuovo stato `meter.derived.signConventionForPowerFeed-in` segno di metro.active Potenza che sta attualmente alimentando nella rete elettrica\nnuovo stato `meter.derived.feed-inPower` potere elettrico che viene fornito a una griglia (\"fed in\")",
|
|
14
|
+
"es": "actualizaciones de dependencia y configuración\nnuevo estado `meter.derived.signConventionForPowerFeed-in` signo de medidor.active Potencia que actualmente está siendo alimentada en la red eléctrica\nnuevo estado `meter.derived.feed-inPower` energía eléctrica que se suministra a una red (\"fed in\")",
|
|
15
|
+
"pl": "aktualizacje zależności i konfiguracji\nnowy stan 'meter.derived.signConventionForPowerFeed- in' znak meter.active Energia zasilana obecnie do sieci energetycznej\nnowy stan 'meter.derived.feed-inPower' energia elektryczna, która jest dostarczana do sieci (\"karmiona w\")",
|
|
16
|
+
"uk": "оновлення залежності та конфігурації\nновий стан `meter.derived.signConventionForPowerFeed-in` знак лічильника.active Потужність, яка в даний час вдається в електромережу\nновий стан `meter.derived.feed-inPower` електрична потужність, яка подається в сітку (\"fed in\")",
|
|
17
|
+
"zh-cn": "依赖和配置更新\n新的状态“ 公尺” 。 生成。 签署 Convention ForPowerFeed- in' sign of meter. 活动 目前输入电网的电力\n新状态“ met. entered. feed-inpower” 供电给电网(“ feeded in”)"
|
|
18
|
+
},
|
|
6
19
|
"2.1.1": {
|
|
7
20
|
"en": "dependency and configuration updates\nfix: adjust event value limits based on usableSurplus parameters\nfix: swap register values for power consumption in Emma driver #190\nemma: improve power calculation with exponential moving average in EmmaCharger\nupdate surplus power state definitions and deprecate old identifiers",
|
|
8
21
|
"de": "abhängigkeits- und konfigurationsupdates\nfix: Event-Wert-Grenze basierend auf nutzbar Überschüssige Parameter\nfix: Swap-Registerwerte für den Stromverbrauch in Emma Treiber #190\nemma: Leistungsberechnung mit exponentiellem Bewegungsmittel in EmmaCharger verbessern\naktualisierung der überschussstrom-zustandsdefinitionen und abschreibung alter kennungen",
|
|
@@ -80,19 +93,6 @@
|
|
|
80
93
|
"pl": "usableSurplusPower: nowy stan kontroli 'Sun2000.0.control.usableSurplus.allowNegativeValue'",
|
|
81
94
|
"uk": "english, Українська, Français... й",
|
|
82
95
|
"zh-cn": "可用SurpusPower: 新的控制状态 `sun 2000.control.usurplus.allow NegativeValue ' `"
|
|
83
|
-
},
|
|
84
|
-
"1.2.2": {
|
|
85
|
-
"en": "deploy 1.2",
|
|
86
|
-
"de": "bereitstellung 1.2",
|
|
87
|
-
"ru": "развернуть 1.2",
|
|
88
|
-
"pt": "implementação 1.2",
|
|
89
|
-
"nl": "1.2 inzetten",
|
|
90
|
-
"fr": "déploiement 1,2",
|
|
91
|
-
"it": "distribuzione 1.2",
|
|
92
|
-
"es": "despliegue 1.2",
|
|
93
|
-
"pl": "rozmieszczenie 1.2",
|
|
94
|
-
"uk": "розгортання 1.2",
|
|
95
|
-
"zh-cn": "部署"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"titleLang": {
|
|
@@ -9,6 +9,8 @@ class Emma extends DriverBase {
|
|
|
9
9
|
...options,
|
|
10
10
|
});
|
|
11
11
|
|
|
12
|
+
//this.stateCache.set(`meter.derived.directionOfPowerFlow`, 1, { type: 'number' }); //Emma build-in energy sensor
|
|
13
|
+
|
|
12
14
|
//https://github.com/ioBroker/ioBroker.docs/blob/master/docs/en/dev/stateroles.md
|
|
13
15
|
const newFields = [
|
|
14
16
|
/*{
|
|
@@ -116,7 +118,7 @@ class Emma extends DriverBase {
|
|
|
116
118
|
},
|
|
117
119
|
{
|
|
118
120
|
state: {
|
|
119
|
-
id: 'emma.
|
|
121
|
+
id: 'emma.totalDischargedEnergy',
|
|
120
122
|
name: 'Total discharged energy',
|
|
121
123
|
type: 'number',
|
|
122
124
|
unit: 'kWh',
|
|
@@ -312,7 +314,7 @@ class Emma extends DriverBase {
|
|
|
312
314
|
},
|
|
313
315
|
{
|
|
314
316
|
state: {
|
|
315
|
-
id: 'emma.
|
|
317
|
+
id: 'emma.inverterActivePower',
|
|
316
318
|
name: 'Inverter active power',
|
|
317
319
|
type: 'number',
|
|
318
320
|
unit: 'kW',
|
|
@@ -464,7 +466,7 @@ class Emma extends DriverBase {
|
|
|
464
466
|
},
|
|
465
467
|
{
|
|
466
468
|
state: {
|
|
467
|
-
id: 'emma.
|
|
469
|
+
id: 'emma.backupTimeNotificationThreshold',
|
|
468
470
|
name: 'Backup time notification threshold',
|
|
469
471
|
type: 'number',
|
|
470
472
|
unit: 'min',
|
|
@@ -556,7 +558,7 @@ class Emma extends DriverBase {
|
|
|
556
558
|
postHook: path => {
|
|
557
559
|
const numberOfChargers = this.stateCache.get(`${path}emma.numberOfChargers`)?.value ?? 0;
|
|
558
560
|
this.log.debug(`Number of chargers ${numberOfChargers}`);
|
|
559
|
-
this.log.debug('### PostHook for
|
|
561
|
+
this.log.debug('### PostHook for Emma - identify Subdevices charger');
|
|
560
562
|
this.identifySubdevices('charger', this.modbusId)
|
|
561
563
|
.then(ret => {
|
|
562
564
|
this.log.debug(`### PostHook for Emma - ret: ${JSON.stringify(ret)}`);
|
|
@@ -574,6 +576,16 @@ class Emma extends DriverBase {
|
|
|
574
576
|
.catch(err => {
|
|
575
577
|
this.log.warn(`PostHook for identification EmmaChargers - err: ${err}`);
|
|
576
578
|
});
|
|
579
|
+
this.identifySubdevices('sun2000', this.modbusId)
|
|
580
|
+
.then(ret => {
|
|
581
|
+
this.log.debug(`### PostHook for InverterSun2000 - ret: ${JSON.stringify(ret)}`);
|
|
582
|
+
for (const [i, inverter] of ret.entries()) {
|
|
583
|
+
this.log.info(`inverter ${i} sun2000 found - modbus id: ${inverter.slave_id}`);
|
|
584
|
+
}
|
|
585
|
+
})
|
|
586
|
+
.catch(err => {
|
|
587
|
+
this.log.warn(`### PostHook for identification Sun2000 - err: ${err}`);
|
|
588
|
+
});
|
|
577
589
|
},
|
|
578
590
|
},
|
|
579
591
|
{
|
|
@@ -614,9 +626,29 @@ class Emma extends DriverBase {
|
|
|
614
626
|
type: 'number',
|
|
615
627
|
unit: 'kW',
|
|
616
628
|
role: 'value.power.active',
|
|
617
|
-
desc: 'reg:31657, len:2 (
|
|
629
|
+
desc: 'reg:31657, len:2 (<0: feed-in to grid. >0: supply from grid.)',
|
|
630
|
+
},
|
|
631
|
+
register: { reg: 31657, type: dataType.int32, gain: 1000 },
|
|
632
|
+
},
|
|
633
|
+
{
|
|
634
|
+
state: {
|
|
635
|
+
id: 'meter.derived.signConventionForPowerFeed-in',
|
|
636
|
+
name: 'Sign convention for power feed-in',
|
|
637
|
+
type: 'number',
|
|
638
|
+
unit: '',
|
|
639
|
+
role: 'value',
|
|
640
|
+
desc: '1 : positive value indicates that energy is being supplied to the grid, -1 : positive value indicates that energy is being consumed from the grid',
|
|
641
|
+
},
|
|
642
|
+
},
|
|
643
|
+
{
|
|
644
|
+
state: {
|
|
645
|
+
id: 'meter.derived.feed-inPower',
|
|
646
|
+
name: 'feed-in power',
|
|
647
|
+
type: 'number',
|
|
648
|
+
unit: 'kW',
|
|
649
|
+
role: 'value.power.active',
|
|
650
|
+
desc: 'Power to grid',
|
|
618
651
|
},
|
|
619
|
-
register: { reg: 31657, type: dataType.int32, gain: -1000 },
|
|
620
652
|
},
|
|
621
653
|
{
|
|
622
654
|
state: { id: 'meter.powerFactor', name: 'Power factor', type: 'number', unit: '', role: 'value', desc: 'reg:31661, len:1' },
|
|
@@ -650,7 +682,7 @@ class Emma extends DriverBase {
|
|
|
650
682
|
role: 'value.power',
|
|
651
683
|
desc: 'reg:31651, len:2',
|
|
652
684
|
},
|
|
653
|
-
register: { reg: 31651, type: dataType.int32, gain:
|
|
685
|
+
register: { reg: 31651, type: dataType.int32, gain: 1000 },
|
|
654
686
|
},
|
|
655
687
|
{
|
|
656
688
|
state: {
|
|
@@ -661,7 +693,7 @@ class Emma extends DriverBase {
|
|
|
661
693
|
role: 'value.power',
|
|
662
694
|
desc: 'reg:31653, len:2',
|
|
663
695
|
},
|
|
664
|
-
register: { reg: 31653, type: dataType.int32, gain:
|
|
696
|
+
register: { reg: 31653, type: dataType.int32, gain: 1000 },
|
|
665
697
|
},
|
|
666
698
|
{
|
|
667
699
|
state: {
|
|
@@ -672,7 +704,7 @@ class Emma extends DriverBase {
|
|
|
672
704
|
role: 'value.power',
|
|
673
705
|
desc: 'reg:31655, len:2',
|
|
674
706
|
},
|
|
675
|
-
register: { reg: 31655, type: dataType.int32, gain:
|
|
707
|
+
register: { reg: 31655, type: dataType.int32, gain: 1000 },
|
|
676
708
|
},
|
|
677
709
|
{
|
|
678
710
|
state: {
|
|
@@ -683,7 +715,7 @@ class Emma extends DriverBase {
|
|
|
683
715
|
role: 'value.power.consumption',
|
|
684
716
|
desc: 'reg:31679, len:4',
|
|
685
717
|
},
|
|
686
|
-
register: { reg:
|
|
718
|
+
register: { reg: 31679, type: dataType.int64, gain: 100 },
|
|
687
719
|
},
|
|
688
720
|
{
|
|
689
721
|
state: {
|
|
@@ -694,9 +726,14 @@ class Emma extends DriverBase {
|
|
|
694
726
|
role: 'value.power.consumption',
|
|
695
727
|
desc: 'reg:31687, len:4',
|
|
696
728
|
},
|
|
697
|
-
register: { reg:
|
|
729
|
+
register: { reg: 31687, type: dataType.int64, gain: 100 },
|
|
698
730
|
},
|
|
699
731
|
],
|
|
732
|
+
postHook: () => {
|
|
733
|
+
this.stateCache.set(`meter.derived.signConventionForPowerFeed-in`, -1, { type: 'number' }); //Emma build-in energy sensor
|
|
734
|
+
const activePower = this.stateCache.get('meter.activePower')?.value ?? 0;
|
|
735
|
+
this.stateCache.set('meter.derived.feed-inPower', -activePower, { type: 'number' });
|
|
736
|
+
},
|
|
700
737
|
},
|
|
701
738
|
{
|
|
702
739
|
address: 40470,
|
|
@@ -262,30 +262,6 @@ class InverterSun2000 extends DriverBase {
|
|
|
262
262
|
this.solarSum.add(inPowerEff); //riemann Sum
|
|
263
263
|
},
|
|
264
264
|
},
|
|
265
|
-
/*
|
|
266
|
-
{
|
|
267
|
-
address: 37113,
|
|
268
|
-
length: 2,
|
|
269
|
-
info: 'meter activePower',
|
|
270
|
-
refresh: dataRefreshRate.high,
|
|
271
|
-
//standby : true,
|
|
272
|
-
type: deviceType.meter,
|
|
273
|
-
states: [
|
|
274
|
-
{
|
|
275
|
-
state: {
|
|
276
|
-
id: 'meter.activePower',
|
|
277
|
-
name: 'Active power',
|
|
278
|
-
type: 'number',
|
|
279
|
-
unit: 'kW',
|
|
280
|
-
role: 'value.power.active',
|
|
281
|
-
desc: 'reg:37113, len:2 (>0: feed-in to grid. <0: supply from grid.)',
|
|
282
|
-
},
|
|
283
|
-
register: { reg: 37113, type: dataType.int32, gain: 1000 },
|
|
284
|
-
},
|
|
285
|
-
|
|
286
|
-
],
|
|
287
|
-
},
|
|
288
|
-
*/
|
|
289
265
|
{
|
|
290
266
|
address: 37052,
|
|
291
267
|
length: 10,
|
|
@@ -1293,6 +1269,26 @@ class InverterSun2000 extends DriverBase {
|
|
|
1293
1269
|
},
|
|
1294
1270
|
register: { reg: 37113, type: dataType.int32, gain: 1000 },
|
|
1295
1271
|
},
|
|
1272
|
+
{
|
|
1273
|
+
state: {
|
|
1274
|
+
id: 'meter.derived.signConventionForPowerFeed-in',
|
|
1275
|
+
name: 'Sign convention for power feed-in',
|
|
1276
|
+
type: 'number',
|
|
1277
|
+
unit: '',
|
|
1278
|
+
role: 'value',
|
|
1279
|
+
desc: '1 : positive value indicates that energy is being supplied to the grid, -1 : positive value indicates that energy is being consumed from the grid',
|
|
1280
|
+
},
|
|
1281
|
+
},
|
|
1282
|
+
{
|
|
1283
|
+
state: {
|
|
1284
|
+
id: 'meter.derived.feed-inPower',
|
|
1285
|
+
name: 'feed-in power',
|
|
1286
|
+
type: 'number',
|
|
1287
|
+
unit: 'kW',
|
|
1288
|
+
role: 'value.power.active',
|
|
1289
|
+
desc: 'Power to grid',
|
|
1290
|
+
},
|
|
1291
|
+
},
|
|
1296
1292
|
{
|
|
1297
1293
|
state: {
|
|
1298
1294
|
id: 'meter.reactivePower',
|
|
@@ -1399,6 +1395,11 @@ class InverterSun2000 extends DriverBase {
|
|
|
1399
1395
|
register: { reg: 37136, type: dataType.int32 },
|
|
1400
1396
|
},
|
|
1401
1397
|
],
|
|
1398
|
+
postHook: () => {
|
|
1399
|
+
this.stateCache.set(`meter.derived.signConventionForPowerFeed-in`, 1, { type: 'number' });
|
|
1400
|
+
const activePower = this.stateCache.get('meter.activePower')?.value ?? 0;
|
|
1401
|
+
this.stateCache.set('meter.derived.feed-inPower', activePower, { type: 'number' });
|
|
1402
|
+
},
|
|
1402
1403
|
},
|
|
1403
1404
|
{
|
|
1404
1405
|
//https://photomate.zendesk.com/hc/en-gb/articles/5701625507485-Export-limitation-for-SUN2000-inverters-via-FusionSolar-App
|
|
@@ -80,6 +80,7 @@ class SmartLoggerMeter extends DriverBase {
|
|
|
80
80
|
});
|
|
81
81
|
|
|
82
82
|
this._testMode = false;
|
|
83
|
+
|
|
83
84
|
//this._testMode = (this._modbusId == 1);
|
|
84
85
|
|
|
85
86
|
//https://github.com/ioBroker/ioBroker.docs/blob/master/docs/en/dev/stateroles.md
|
|
@@ -126,6 +127,26 @@ class SmartLoggerMeter extends DriverBase {
|
|
|
126
127
|
},
|
|
127
128
|
register: { reg: 32278, type: dataType.int32, gain: 1000 },
|
|
128
129
|
},
|
|
130
|
+
{
|
|
131
|
+
state: {
|
|
132
|
+
id: 'meter.derived.signConventionForPowerFeed-in',
|
|
133
|
+
name: 'Sign convention for power feed-in',
|
|
134
|
+
type: 'number',
|
|
135
|
+
unit: '',
|
|
136
|
+
role: 'value',
|
|
137
|
+
desc: '1 : positive value indicates that energy is being supplied to the grid, -1 : positive value indicates that energy is being consumed from the grid',
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
state: {
|
|
142
|
+
id: 'meter.derived.feed-inPower',
|
|
143
|
+
name: 'feed-in power',
|
|
144
|
+
type: 'number',
|
|
145
|
+
unit: 'kW',
|
|
146
|
+
role: 'value.power.active',
|
|
147
|
+
desc: 'Power to grid',
|
|
148
|
+
},
|
|
149
|
+
},
|
|
129
150
|
{
|
|
130
151
|
state: {
|
|
131
152
|
id: 'meter.reactivePower',
|
|
@@ -227,6 +248,11 @@ class SmartLoggerMeter extends DriverBase {
|
|
|
227
248
|
register: { reg: 32361, type: dataType.int64, gain: 100 },
|
|
228
249
|
},
|
|
229
250
|
],
|
|
251
|
+
postHook: () => {
|
|
252
|
+
this.stateCache.set(`meter.derived.signConventionForPowerFeed-in`, 1, { type: 'number' });
|
|
253
|
+
const activePower = this.stateCache.get('meter.activePower')?.value ?? 0;
|
|
254
|
+
this.stateCache.set('meter.derived.feed-inPower', activePower, { type: 'number' });
|
|
255
|
+
},
|
|
230
256
|
},
|
|
231
257
|
];
|
|
232
258
|
|
|
@@ -288,12 +314,6 @@ class SmartLoggerMeter extends DriverBase {
|
|
|
288
314
|
state: { id: 'meter.powerFactor', name: 'Power factor', type: 'number', unit: '', role: 'value', desc: 'reg:37117, len:1' },
|
|
289
315
|
register: { reg: 37117, type: dataType.int16, gain: 1000 },
|
|
290
316
|
},
|
|
291
|
-
/*
|
|
292
|
-
{
|
|
293
|
-
state: {id: 'meter.gridFrequency', name: 'Grid Frequency', type: 'number', unit: 'Hz', role: 'value.frequency', desc: 'reg:37118, len:1'},
|
|
294
|
-
register: {reg: 37118, type: dataType.int16, gain: 100}
|
|
295
|
-
},
|
|
296
|
-
*/
|
|
297
317
|
{
|
|
298
318
|
state: {
|
|
299
319
|
id: 'meter.positiveActiveEnergy',
|
|
@@ -373,6 +393,9 @@ class SmartLoggerMeter extends DriverBase {
|
|
|
373
393
|
register: { reg: 37136, type: dataType.int32 },
|
|
374
394
|
},
|
|
375
395
|
],
|
|
396
|
+
postHook: path => {
|
|
397
|
+
this.stateCache.set(`${path}meter.derived.directionOfPowerFlow`, 0, { type: 'number' });
|
|
398
|
+
},
|
|
376
399
|
},
|
|
377
400
|
];
|
|
378
401
|
|
package/lib/register.js
CHANGED
|
@@ -80,7 +80,7 @@ class Registers {
|
|
|
80
80
|
let usableSurplusPower = 0;
|
|
81
81
|
|
|
82
82
|
if (this.adapter.control) {
|
|
83
|
-
surplusPower +=
|
|
83
|
+
surplusPower += feedinPower;
|
|
84
84
|
|
|
85
85
|
const minSoc = this.adapter.control.get('usableSurplus.minSoc')?.value ?? 0;
|
|
86
86
|
let bufferSoc = this.adapter.control.get('usableSurplus.bufferSoc')?.value ?? 0;
|
|
@@ -94,6 +94,9 @@ class Registers {
|
|
|
94
94
|
}
|
|
95
95
|
if (soc >= minSoc) {
|
|
96
96
|
if (chargeDischarge > 0) surplusPower += chargeDischarge;
|
|
97
|
+
if (bufferSoc === 0 || soc < bufferSoc) {
|
|
98
|
+
surplusPower -= residualPower / 1000;
|
|
99
|
+
}
|
|
97
100
|
}
|
|
98
101
|
|
|
99
102
|
usableSurplusPower = surplusPower;
|
|
@@ -115,10 +118,6 @@ class Registers {
|
|
|
115
118
|
this.bufferOn = false;
|
|
116
119
|
}
|
|
117
120
|
|
|
118
|
-
if (!this.bufferOn && surplusPower > residualPower / 1000) {
|
|
119
|
-
surplusPower -= residualPower / 1000;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
121
|
if (surplusPower > ratedPower) {
|
|
123
122
|
surplusPower = ratedPower;
|
|
124
123
|
}
|
|
@@ -150,12 +149,13 @@ class Registers {
|
|
|
150
149
|
//maxChargePower = this.stateCache.get(`${inverter.path}.battery.maximumChargingPower`)?.value ?? 0;
|
|
151
150
|
}
|
|
152
151
|
|
|
153
|
-
const
|
|
152
|
+
const feedinPower = this.stateCache.get('meter.derived.feed-inPower')?.value ?? 0;
|
|
153
|
+
|
|
154
154
|
const extPower = this.adapter.control.get('externalPower')?.value ?? 0;
|
|
155
155
|
//extPower = extPower / 1000;
|
|
156
156
|
|
|
157
157
|
//Zu geringe Erzeugerenegie
|
|
158
|
-
let houseConsum = actPower -
|
|
158
|
+
let houseConsum = actPower - feedinPower + extPower;
|
|
159
159
|
if (houseConsum < 0) {
|
|
160
160
|
houseConsum = 0;
|
|
161
161
|
}
|
|
@@ -165,6 +165,7 @@ class Registers {
|
|
|
165
165
|
this.stateCache.set('collected.inputPower', inPower, { type: 'number', renew: true });
|
|
166
166
|
this.stateCache.set('collected.inputPowerWithEfficiencyLoss', inPowerEff, { type: 'number' });
|
|
167
167
|
this.stateCache.set('collected.activePower', actPower, { type: 'number', renew: true });
|
|
168
|
+
//this.stateCache.set('collected.feed-inPower', feedinPower, { type: 'number' }); //positive -> power to grid
|
|
168
169
|
this.stateCache.set('collected.houseConsumption', houseConsum, { type: 'number' });
|
|
169
170
|
this.stateCache.set('collected.chargeDischargePower', chargeDischarge, { type: 'number' });
|
|
170
171
|
this.stateCache.set('collected.usableSurplusPower', surplusArray[1], {
|
|
@@ -246,9 +247,10 @@ class Registers {
|
|
|
246
247
|
let totalCharge = 0;
|
|
247
248
|
let ratedCap = 0;
|
|
248
249
|
let load = 0;
|
|
250
|
+
let feedinEnergy;
|
|
251
|
+
let supplyFromGrid;
|
|
249
252
|
|
|
250
253
|
for (const inverter of inverters) {
|
|
251
|
-
//v0.4.x
|
|
252
254
|
if (inverter.driverClass != driverClasses.inverter) {
|
|
253
255
|
continue;
|
|
254
256
|
}
|
|
@@ -272,27 +274,25 @@ class Registers {
|
|
|
272
274
|
this.stateCache.set('collected.dailyInputYield', inYield, { type: 'number' }); //deprecated
|
|
273
275
|
this.stateCache.set('collected.dailySolarYield', solarYield, { type: 'number' });
|
|
274
276
|
this.stateCache.set('collected.accumulatedEnergyYield', enYield, { type: 'number' });
|
|
275
|
-
const
|
|
277
|
+
const sign = this.stateCache.get('meter.derived.signConventionForPowerFeed-in')?.value ?? 1;
|
|
278
|
+
if (sign === -1) {
|
|
279
|
+
//Emma Meter Power is positive when power is taken from grid
|
|
280
|
+
//Emma Meter Power is negative when power is feed in to grid
|
|
281
|
+
feedinEnergy = this.stateCache.get('meter.reverseActiveEnergy')?.value ?? 0;
|
|
282
|
+
supplyFromGrid = this.stateCache.get('meter.positiveActiveEnergy')?.value ?? 0;
|
|
283
|
+
} else {
|
|
284
|
+
feedinEnergy = this.stateCache.get('meter.positiveActiveEnergy')?.value ?? 0;
|
|
285
|
+
supplyFromGrid = this.stateCache.get('meter.reverseActiveEnergy')?.value ?? 0;
|
|
286
|
+
}
|
|
287
|
+
const conSum = enYield + supplyFromGrid - feedinEnergy;
|
|
276
288
|
this.stateCache.set('collected.consumptionSum', conSum, { type: 'number' });
|
|
277
289
|
// compute export and import today
|
|
278
|
-
this.stateCache.set(
|
|
279
|
-
'
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
'collected.gridImportToday',
|
|
285
|
-
this.stateCache.get('meter.reverseActiveEnergy')?.value - this.stateCache.get('collected.gridImportStart')?.value,
|
|
286
|
-
{ type: 'number' },
|
|
287
|
-
);
|
|
288
|
-
// compute consumption today
|
|
289
|
-
this.stateCache.set(
|
|
290
|
-
'collected.consumptionSum',
|
|
291
|
-
this.stateCache.get('collected.accumulatedEnergyYield')?.value +
|
|
292
|
-
this.stateCache.get('meter.reverseActiveEnergy')?.value -
|
|
293
|
-
this.stateCache.get('meter.positiveActiveEnergy')?.value,
|
|
294
|
-
{ type: 'number' },
|
|
295
|
-
);
|
|
290
|
+
this.stateCache.set('collected.gridExportToday', feedinEnergy - this.stateCache.get('collected.gridExportStart')?.value, {
|
|
291
|
+
type: 'number',
|
|
292
|
+
});
|
|
293
|
+
this.stateCache.set('collected.gridImportToday', supplyFromGrid - this.stateCache.get('collected.gridImportStart')?.value, {
|
|
294
|
+
type: 'number',
|
|
295
|
+
});
|
|
296
296
|
this.stateCache.set(
|
|
297
297
|
'collected.consumptionToday',
|
|
298
298
|
this.stateCache.get('collected.consumptionSum')?.value - this.stateCache.get('collected.consumptionStart')?.value,
|
|
@@ -473,10 +473,16 @@ class Registers {
|
|
|
473
473
|
//state
|
|
474
474
|
async mitnightProcess() {
|
|
475
475
|
// copy current export/import kWh - used to compute daily import/export in kWh
|
|
476
|
-
|
|
477
|
-
|
|
476
|
+
const sign = this.stateCache.get('meter.derived.signConventionForPowerFeed-in')?.value ?? 1;
|
|
477
|
+
if (sign === -1) {
|
|
478
|
+
this.stateCache.set('collected.gridExportStart', this.stateCache.get('meter.reverseActiveEnergy')?.value ?? 0, { type: 'number' });
|
|
479
|
+
this.stateCache.set('collected.gridImportStart', this.stateCache.get('meter.positiveActiveEnergy')?.value ?? 0, { type: 'number' });
|
|
480
|
+
} else {
|
|
481
|
+
this.stateCache.set('collected.gridExportStart', this.stateCache.get('meter.positiveActiveEnergy')?.value ?? 0, { type: 'number' });
|
|
482
|
+
this.stateCache.set('collected.gridImportStart', this.stateCache.get('meter.reverseActiveEnergy')?.value ?? 0, { type: 'number' });
|
|
483
|
+
}
|
|
478
484
|
// copy consumption Sum to Start for the next day
|
|
479
|
-
this.stateCache.set('collected.consumptionStart', this.stateCache.get('collected.consumptionSum')?.value, { type: 'number' });
|
|
485
|
+
this.stateCache.set('collected.consumptionStart', this.stateCache.get('collected.consumptionSum')?.value ?? 0, { type: 'number' });
|
|
480
486
|
for (const device of this.adapter.devices) {
|
|
481
487
|
if (device.instance.mitnightProcess) {
|
|
482
488
|
await device.instance.mitnightProcess();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.sun2000",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "sun2000",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "bolliy",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@iobroker/adapter-core": "^3.3.2",
|
|
31
|
-
"modbus-serial": "^8.0.
|
|
31
|
+
"modbus-serial": "^8.0.22",
|
|
32
32
|
"suncalc2": "^1.8.1",
|
|
33
33
|
"tcp-port-used": "^1.0.2"
|
|
34
34
|
},
|
|
@@ -38,14 +38,14 @@
|
|
|
38
38
|
"@alcalzone/release-script-plugin-license": "^3.7.0",
|
|
39
39
|
"@alcalzone/release-script-plugin-manual-review": "^3.7.0",
|
|
40
40
|
"@eslint/eslintrc": "^3.3.1",
|
|
41
|
-
"@eslint/js": "^9.
|
|
41
|
+
"@eslint/js": "^9.36.0",
|
|
42
42
|
"@iobroker/adapter-dev": "^1.5.0",
|
|
43
43
|
"@iobroker/eslint-config": "^2.2.0",
|
|
44
44
|
"@iobroker/testing": "^5.1.1",
|
|
45
45
|
"@tsconfig/node20": "^20.1.6",
|
|
46
|
-
"@types/node": "^24.
|
|
46
|
+
"@types/node": "^24.6.2",
|
|
47
47
|
"globals": "^16.4.0",
|
|
48
|
-
"typescript": "~5.
|
|
48
|
+
"typescript": "~5.9.3"
|
|
49
49
|
},
|
|
50
50
|
"main": "main.js",
|
|
51
51
|
"files": [
|