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 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.1.1",
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.TotalDischargedEnergy',
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.Inverter active power',
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.BackupTimeNotificationThreshold',
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 InverterSun2000');
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 (>0: feed-in to grid. <0: supply from grid.)',
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: -1000 },
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: -1000 },
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: -1000 },
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: 31687, type: dataType.int64, gain: 100 },
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: 31679, type: dataType.int64, gain: 100 },
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 += meterPower;
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 meterPower = this.stateCache.get('meter.activePower')?.value ?? 0;
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 - meterPower + extPower;
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 conSum = enYield + this.stateCache.get('meter.reverseActiveEnergy')?.value - this.stateCache.get('meter.positiveActiveEnergy')?.value;
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
- 'collected.gridExportToday',
280
- this.stateCache.get('meter.positiveActiveEnergy')?.value - this.stateCache.get('collected.gridExportStart')?.value,
281
- { type: 'number' },
282
- );
283
- this.stateCache.set(
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
- this.stateCache.set('collected.gridExportStart', this.stateCache.get('meter.positiveActiveEnergy')?.value, { type: 'number' });
477
- this.stateCache.set('collected.gridImportStart', this.stateCache.get('meter.reverseActiveEnergy')?.value, { type: 'number' });
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.1.1",
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.21",
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.34.0",
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.5.2",
46
+ "@types/node": "^24.6.2",
47
47
  "globals": "^16.4.0",
48
- "typescript": "~5.8.3"
48
+ "typescript": "~5.9.3"
49
49
  },
50
50
  "main": "main.js",
51
51
  "files": [