iobroker.senec 1.3.4 → 1.3.7
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 +12 -0
- package/io-package.json +37 -25
- package/lib/state_attr.js +832 -64
- package/lib/state_trans.js +42 -6
- package/main.js +71 -52
- package/package.json +12 -12
package/lib/state_trans.js
CHANGED
|
@@ -91,7 +91,13 @@ const state_trans = {
|
|
|
91
91
|
88: 'NETZBETREIBER: ENTLADEN GESPERRT (88)',
|
|
92
92
|
89: 'RESERVEKAPAZITÄT (89)',
|
|
93
93
|
90: 'SELBSTTEST FEHLER (90)',
|
|
94
|
-
91: 'ISOLATIONSFEHLER (91)'
|
|
94
|
+
91: 'ISOLATIONSFEHLER (91)',
|
|
95
|
+
92: 'PV-MODUS (92)',
|
|
96
|
+
93: 'FERNABSCHALTUNG NETZBETREIBER (93)',
|
|
97
|
+
94: 'FEHLER DRM0 (94)',
|
|
98
|
+
95: 'BATTERIEDIAGNOSE (95)',
|
|
99
|
+
96: 'BATTERIE BALANCIERUNG (96)',
|
|
100
|
+
97: 'SICHERHEITSENTLADUNG (97)'
|
|
95
101
|
},
|
|
96
102
|
'ENERGY_STAT_STATE.1': {
|
|
97
103
|
0: 'INITIALSTATE',
|
|
@@ -185,7 +191,13 @@ const state_trans = {
|
|
|
185
191
|
88: 'GRID OPERATOR: DISCHARGE PROHIBITED',
|
|
186
192
|
89: 'SPARE CAPACITY',
|
|
187
193
|
90: 'SELFTEST ERROR',
|
|
188
|
-
91: 'EARTH FAULT'
|
|
194
|
+
91: 'EARTH FAULT',
|
|
195
|
+
92: 'PV-MODE',
|
|
196
|
+
93: 'REMOTE SHUTDOWN GRID OPERATOR',
|
|
197
|
+
94: 'ERROR DRM0 (94)',
|
|
198
|
+
95: 'BATTERY DIAGNOSIS (95)',
|
|
199
|
+
96: 'BATTERY BALANCING (96)',
|
|
200
|
+
97: 'SAFETY DISCHARGE (97)'
|
|
189
201
|
},
|
|
190
202
|
'ENERGY_STAT_STATE.2': {
|
|
191
203
|
0: 'STATO INIZIALE',
|
|
@@ -279,7 +291,13 @@ const state_trans = {
|
|
|
279
291
|
88: 'OPERATORE DI RETE: SCARICA BLOCCATA',
|
|
280
292
|
89: 'CAPACITA INUTILIZZATA',
|
|
281
293
|
90: 'ERRORE DI AUTOTEST',
|
|
282
|
-
91: 'FAGLIA TERRESTRE'
|
|
294
|
+
91: 'FAGLIA TERRESTRE',
|
|
295
|
+
92: 'MODALITÀ FOTOVOLTAICA',
|
|
296
|
+
93: 'SPEGNIMENTO A DISTANZA OPERATORE DI RETE',
|
|
297
|
+
94: 'ERRORE DRM0',
|
|
298
|
+
95: 'DIAGNOSI DELLA BATTERIA (95)',
|
|
299
|
+
96: 'BILANCIAMENTO DELLA BATTERIA (96)',
|
|
300
|
+
97: 'SCARICO DI SICUREZZA (97)'
|
|
283
301
|
},
|
|
284
302
|
'FACTORY.BAT_TYPE.0' : {
|
|
285
303
|
0: 'Studer Xtender (0)',
|
|
@@ -478,7 +496,13 @@ const state_trans = {
|
|
|
478
496
|
88: 'NETZBETREIBER: ENTLADEN GESPERRT (88)',
|
|
479
497
|
89: 'RESERVEKAPAZITÄT (89)',
|
|
480
498
|
90: 'SELBSTTEST FEHLER (90)',
|
|
481
|
-
91: 'ISOLATIONSFEHLER (91)'
|
|
499
|
+
91: 'ISOLATIONSFEHLER (91)',
|
|
500
|
+
92: 'PV-MODUS (92)',
|
|
501
|
+
93: 'FERNABSCHALTUNG NETZBETREIBER (93)',
|
|
502
|
+
94: 'FEHLER DRM0 (94)',
|
|
503
|
+
95: 'BATTERIEDIAGNOSE (95)',
|
|
504
|
+
96: 'BATTERIE BALANCIERUNG (96)',
|
|
505
|
+
97: 'SICHERHEITSENTLADUNG (97)'
|
|
482
506
|
},
|
|
483
507
|
'STATISTIC.CURRENT_STATE.1': {
|
|
484
508
|
0: 'INITIALSTATE',
|
|
@@ -572,7 +596,13 @@ const state_trans = {
|
|
|
572
596
|
88: 'GRID OPERATOR: DISCHARGE PROHIBITED',
|
|
573
597
|
89: 'SPARE CAPACITY',
|
|
574
598
|
90: 'SELFTEST ERROR',
|
|
575
|
-
91: 'EARTH FAULT'
|
|
599
|
+
91: 'EARTH FAULT',
|
|
600
|
+
92: 'PV-MODE',
|
|
601
|
+
93: 'REMOTE SHUTDOWN GRID OPERATOR',
|
|
602
|
+
94: 'ERROR DRM0',
|
|
603
|
+
95: 'BATTERY DIAGNOSIS',
|
|
604
|
+
96: 'BATTERY BALANCING',
|
|
605
|
+
97: 'SAFETY DISCHARGE'
|
|
576
606
|
},
|
|
577
607
|
'STATISTIC.CURRENT_STATE.2': {
|
|
578
608
|
0: 'STATO INIZIALE',
|
|
@@ -666,7 +696,13 @@ const state_trans = {
|
|
|
666
696
|
88: 'OPERATORE DI RETE: SCARICA BLOCCATA',
|
|
667
697
|
89: 'CAPACITA INUTILIZZATA',
|
|
668
698
|
90: 'ERRORE DI AUTOTEST',
|
|
669
|
-
91: 'FAGLIA TERRESTRE'
|
|
699
|
+
91: 'FAGLIA TERRESTRE',
|
|
700
|
+
92: 'MODALITÀ FOTOVOLTAICA',
|
|
701
|
+
93: 'SPEGNIMENTO A DISTANZA OPERATORE DI RETE',
|
|
702
|
+
94: 'ERRORE DRM0',
|
|
703
|
+
95: 'DIAGNOSI DELLA BATTERIA',
|
|
704
|
+
96: 'BILANCIAMENTO DELLA BATTERIA',
|
|
705
|
+
97: 'SCARICO DI SICUREZZA'
|
|
670
706
|
},
|
|
671
707
|
'WALLBOX.STATE.0' : {
|
|
672
708
|
161: 'Warte auf E-Fahrzeug (161)',
|
package/main.js
CHANGED
|
@@ -66,29 +66,29 @@ class Senec extends utils.Adapter {
|
|
|
66
66
|
* Fallback to default values in case they are out of scope
|
|
67
67
|
*/
|
|
68
68
|
async checkConfig() {
|
|
69
|
-
this.log.debug("Configured polling interval high priority: " + this.config.interval);
|
|
69
|
+
this.log.debug("(checkConf) Configured polling interval high priority: " + this.config.interval);
|
|
70
70
|
if (this.config.interval < 1 || this.config.interval > 3600) {
|
|
71
|
-
this.log.warn("Config interval high priority " + this.config.interval + " not [1..3600] seconds. Using default: 10");
|
|
71
|
+
this.log.warn("(checkConf) Config interval high priority " + this.config.interval + " not [1..3600] seconds. Using default: 10");
|
|
72
72
|
this.config.interval = 10;
|
|
73
73
|
}
|
|
74
|
-
this.log.debug("Configured polling interval low priority: " + this.config.intervalLow);
|
|
74
|
+
this.log.debug("(checkConf) Configured polling interval low priority: " + this.config.intervalLow);
|
|
75
75
|
if (this.config.intervalLow < 60 || this.config.intervalLow > 3600) {
|
|
76
|
-
this.log.warn("Config interval low priority " + this.config.intervalLow + " not [60..3600] minutes. Using default: 60");
|
|
76
|
+
this.log.warn("(checkConf) Config interval low priority " + this.config.intervalLow + " not [60..3600] minutes. Using default: 60");
|
|
77
77
|
this.config.intervalLow = 60;
|
|
78
78
|
}
|
|
79
|
-
this.log.debug("Configured polling timeout: " + this.config.pollingTimeout);
|
|
79
|
+
this.log.debug("(checkConf) Configured polling timeout: " + this.config.pollingTimeout);
|
|
80
80
|
if (this.config.pollingTimeout < 1000 || this.config.pollingTimeout > 10000) {
|
|
81
|
-
this.log.warn("Config timeout " + this.config.pollingTimeout + " not [1000..10000] ms. Using default: 5000");
|
|
81
|
+
this.log.warn("(checkConf) Config timeout " + this.config.pollingTimeout + " not [1000..10000] ms. Using default: 5000");
|
|
82
82
|
this.config.pollingTimeout = 5000;
|
|
83
83
|
}
|
|
84
|
-
this.log.debug("Configured num of retries: " + this.config.retries);
|
|
84
|
+
this.log.debug("(checkConf) Configured num of retries: " + this.config.retries);
|
|
85
85
|
if (this.config.retries < 0 || this.config.retries > 999) {
|
|
86
|
-
this.log.warn("Config num of retries " + this.config.retries + " not [0..999] seconds. Using default: 10");
|
|
86
|
+
this.log.warn("(checkConf) Config num of retries " + this.config.retries + " not [0..999] seconds. Using default: 10");
|
|
87
87
|
this.config.retries = 10;
|
|
88
88
|
}
|
|
89
|
-
this.log.debug("Configured retry multiplier: " + this.config.retrymultiplier);
|
|
89
|
+
this.log.debug("(checkConf) Configured retry multiplier: " + this.config.retrymultiplier);
|
|
90
90
|
if (this.config.retrymultiplier < 1 || this.config.retrymultiplier > 10) {
|
|
91
|
-
this.log.warn("Config retry multiplier " + this.config.retrymultiplier + " not [1..10] seconds. Using default: 2");
|
|
91
|
+
this.log.warn("(checkConf) Config retry multiplier " + this.config.retrymultiplier + " not [1..10] seconds. Using default: 2");
|
|
92
92
|
this.config.retrymultiplier = 2;
|
|
93
93
|
}
|
|
94
94
|
}
|
|
@@ -121,30 +121,32 @@ class Senec extends utils.Adapter {
|
|
|
121
121
|
url: pUrl,
|
|
122
122
|
data: pForm,
|
|
123
123
|
timeout: pollingTimeout
|
|
124
|
-
})
|
|
124
|
+
})
|
|
125
|
+
.then(
|
|
125
126
|
async (response) => {
|
|
126
127
|
const content = response.data;
|
|
127
|
-
caller.log.debug('received data (' + response.status + '): ' + JSON.stringify(content));
|
|
128
|
+
caller.log.debug('(Poll) received data (' + response.status + '): ' + JSON.stringify(content));
|
|
128
129
|
resolve(JSON.stringify(content));
|
|
129
130
|
}
|
|
130
|
-
)
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
131
|
+
)
|
|
132
|
+
.catch(
|
|
133
|
+
(error) => {
|
|
134
|
+
if (error.response) {
|
|
135
|
+
// The request was made and the server responded with a status code
|
|
136
|
+
caller.log.warn('(Poll) received error ' + error.response.status + ' response from SENEC with content: ' + JSON.stringify(error.response.data));
|
|
137
|
+
reject(error.response.status);
|
|
138
|
+
} else if (error.request) {
|
|
139
|
+
// The request was made but no response was received
|
|
140
|
+
// `error.request` is an instance of XMLHttpRequest in the browser and an instance of http.ClientRequest in node.js<div></div>
|
|
141
|
+
caller.log.info(error.message);
|
|
142
|
+
reject(error.message);
|
|
143
|
+
} else {
|
|
144
|
+
// Something happened in setting up the request that triggered an Error
|
|
145
|
+
caller.log.info(error.message);
|
|
146
|
+
reject(error.status);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
);
|
|
148
150
|
});
|
|
149
151
|
}
|
|
150
152
|
|
|
@@ -155,7 +157,7 @@ class Senec extends utils.Adapter {
|
|
|
155
157
|
async readSenecV21() {
|
|
156
158
|
// read by webinterface are the following values. Not all are "high priority" though.
|
|
157
159
|
// "STATISTIC":{"STAT_DAY_E_HOUSE":"","STAT_DAY_E_PV":"","STAT_DAY_BAT_CHARGE":"","STAT_DAY_BAT_DISCHARGE":"","STAT_DAY_E_GRID_IMPORT":"","STAT_DAY_E_GRID_EXPORT":"","STAT_YEAR_E_PU1_ARR":""}
|
|
158
|
-
// "ENERGY":{"STAT_STATE":"","
|
|
160
|
+
// "ENERGY":{"STAT_STATE":"","GUI_BAT_DATA_POWER":"","GUI_INVERTER_POWER":"","GUI_HOUSE_POW":"","GUI_GRID_POW":"","STAT_MAINT_REQUIRED":"","GUI_BAT_DATA_FUEL_CHARGE":"","GUI_CHARGING_INFO":"","GUI_BOOSTING_INFO":""}
|
|
159
161
|
// "WIZARD":{"CONFIG_LOADED":""},"SYS_UPDATE":{"UPDATE_AVAILABLE":""}
|
|
160
162
|
// "PV1":{"POWER_RATIO":""},"WIZARD":{"MAC_ADDRESS_BYTES":""},"BAT1OBJ1":{"BMS_NR_INSTALLED":"","SPECIAL_TIMEOUT":"","INV_CYCLE":"","TEMP1":"","TEMP2":"","TEMP3":"","TEMP4":"","TEMP5":"","SW_VERSION":"","SW_VERSION2":"","SW_VERSION3":"","I_DC":""},"BAT1OBJ2":{"TEMP1":"","TEMP2":"","TEMP3":"","TEMP4":"","TEMP5":"","I_DC":""},"BAT1OBJ3":{"TEMP1":"","TEMP2":"","TEMP3":"","TEMP4":"","TEMP5":"","I_DC":""},"PWR_UNIT":{"POWER_L1":"","POWER_L2":"","POWER_L3":""},"BAT1":{"CEI_LIMIT":""},"BMS":{}
|
|
161
163
|
// "PM1OBJ1":{"FREQ":"","U_AC":"","I_AC":"","P_AC":"","P_TOTAL":""},"PM1OBJ2":{"FREQ":"","U_AC":"","I_AC":"","P_AC":"","P_TOTAL":""}
|
|
@@ -163,9 +165,9 @@ class Senec extends utils.Adapter {
|
|
|
163
165
|
|
|
164
166
|
const url = 'http://' + this.config.senecip + '/lala.cgi';
|
|
165
167
|
var form = '{';
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
form += ',"PV1":{"POWER_RATIO":"","MPP_POWER":""
|
|
168
|
+
form += '"BMS":{"CELL_TEMPERATURES_MODULE_A":"","CELL_TEMPERATURES_MODULE_B":"","CELL_TEMPERATURES_MODULE_C":"","CELL_TEMPERATURES_MODULE_D":"","CELL_VOLTAGES_MODULE_A":"","CELL_VOLTAGES_MODULE_B":"","CELL_VOLTAGES_MODULE_C":"","CELL_VOLTAGES_MODULE_D":"","CURRENT":"","SOC":"","SYSTEM_SOC":"","TEMP_MAX":"","TEMP_MIN":"","VOLTAGE":""}';
|
|
169
|
+
form += ',"ENERGY":{"STAT_STATE":"","GUI_BAT_DATA_POWER":"","GUI_INVERTER_POWER":"","GUI_HOUSE_POW":"","GUI_GRID_POW":"","GUI_BAT_DATA_FUEL_CHARGE":"","GUI_CHARGING_INFO":"","GUI_BOOSTING_INFO":"","GUI_BAT_DATA_POWER":"","GUI_BAT_DATA_VOLTAGE":"","GUI_BAT_DATA_CURRENT":"","GUI_BAT_DATA_FUEL_CHARGE":"","GUI_BAT_DATA_OA_CHARGING":"","STAT_LIMITED_NET_SKEW":""}';
|
|
170
|
+
form += ',"PV1":{"POWER_RATIO":"","MPP_POWER":""}';
|
|
169
171
|
form += ',"PWR_UNIT":{"POWER_L1":"","POWER_L2":"","POWER_L3":""}';
|
|
170
172
|
form += ',"PM1OBJ1":{"FREQ":"","U_AC":"","I_AC":"","P_AC":"","P_TOTAL":""}';
|
|
171
173
|
form += ',"PM1OBJ2":{"FREQ":"","U_AC":"","I_AC":"","P_AC":"","P_TOTAL":""}';
|
|
@@ -173,7 +175,13 @@ class Senec extends utils.Adapter {
|
|
|
173
175
|
form += '}';
|
|
174
176
|
|
|
175
177
|
try {
|
|
176
|
-
|
|
178
|
+
var body = await this.doGet(url, form, this, this.config.pollingTimeout);
|
|
179
|
+
if (body.includes('\\"')) {
|
|
180
|
+
// in rare cases senec reports back extra escape sequences on some machines ...
|
|
181
|
+
this.log.info("(Poll) Double escapes detected! Body inc: " + body);
|
|
182
|
+
body = body.replace(/\\"/g, '"');
|
|
183
|
+
this.log.info("(Poll) Double escapes autofixed! Body out: " + body);
|
|
184
|
+
}
|
|
177
185
|
var obj = JSON.parse(body, reviverNumParse);
|
|
178
186
|
await this.evalPoll(obj);
|
|
179
187
|
|
|
@@ -203,7 +211,13 @@ class Senec extends utils.Adapter {
|
|
|
203
211
|
const form = '{"STATISTIC":{},"ENERGY":{},"FEATURES":{},"LOG":{},"SYS_UPDATE":{},"WIZARD":{},"BMS":{},"BAT1":{},"BAT1OBJ1":{},"BAT1OBJ2":{},"BAT1OBJ2":{},"BAT1OBJ3":{},"BAT1OBJ4":{},"PWR_UNIT":{},"PM1OBJ1":{},"PM1OBJ2":{},"PV1":{},"FACTORY":{},"GRIDCONFIG":{},"EG_CONTROL":{},"RTC":{},"PM1":{},"TEMPMEASURE":{},"DEBUG":{},"SOCKETS":{},"CASC":{},"WALLBOX":{},"CONNX50":{},"STECA":{}}';
|
|
204
212
|
|
|
205
213
|
try {
|
|
206
|
-
|
|
214
|
+
var body = await this.doGet(url, form, this, this.config.pollingTimeout);
|
|
215
|
+
if (body.includes('\\"')) {
|
|
216
|
+
// in rare cases senec reports back extra escape sequences on some machines ...
|
|
217
|
+
this.log.info("(Poll) Double escapes detected! Body inc: " + body);
|
|
218
|
+
body = body.replace(/\\"/g, '"');
|
|
219
|
+
this.log.info("(Poll) Double escapes autofixed! Body out: " + body);
|
|
220
|
+
}
|
|
207
221
|
var obj = JSON.parse(body, reviverNumParse);
|
|
208
222
|
|
|
209
223
|
await this.evalPoll(obj);
|
|
@@ -226,7 +240,12 @@ class Senec extends utils.Adapter {
|
|
|
226
240
|
* sets a state's value and creates the state if it doesn't exist yet
|
|
227
241
|
*/
|
|
228
242
|
async doState(name, value, description, unit, write) {
|
|
229
|
-
|
|
243
|
+
if (!isNaN(name.substring(0, 1))) {
|
|
244
|
+
// keys cannot start with digits! Possibly SENEC delivering erraneous data
|
|
245
|
+
this.log.debug('(doState) Invalid datapoint: ' + name + ': ' + value);
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
this.log.silly('(doState) Update: ' + name + ': ' + value);
|
|
230
249
|
await this.setObjectNotExistsAsync(name, {
|
|
231
250
|
type: 'state',
|
|
232
251
|
common: {
|
|
@@ -243,19 +262,19 @@ class Senec extends utils.Adapter {
|
|
|
243
262
|
// Check object for changes:
|
|
244
263
|
var obj = await this.getObjectAsync(name);
|
|
245
264
|
if (obj.common.name != description) {
|
|
246
|
-
this.log.debug("Updating object: " + name + " (desc): " + obj.common.name + " -> " + description);
|
|
265
|
+
this.log.debug("(doState) Updating object: " + name + " (desc): " + obj.common.name + " -> " + description);
|
|
247
266
|
await this.extendObject(name, {common: {name: description}});
|
|
248
267
|
}
|
|
249
268
|
if (obj.common.type != typeof(value)) {
|
|
250
|
-
this.log.debug("Updating object: " + name + " (type): " + obj.common.type + " -> " + typeof(value));
|
|
269
|
+
this.log.debug("(doState) Updating object: " + name + " (type): " + obj.common.type + " -> " + typeof(value));
|
|
251
270
|
await this.extendObject(name, {common: {type: typeof(value)}});
|
|
252
271
|
}
|
|
253
272
|
if (obj.common.unit != unit) {
|
|
254
|
-
this.log.debug("Updating object: " + name + " (unit): " + obj.common.unit + " -> " + unit);
|
|
273
|
+
this.log.debug("(doState) Updating object: " + name + " (unit): " + obj.common.unit + " -> " + unit);
|
|
255
274
|
await this.extendObject(name, {common: {unit: unit}});
|
|
256
275
|
}
|
|
257
276
|
if (obj.common.write != write) {
|
|
258
|
-
this.log.debug("Updating object: " + name + " (write): " + obj.common.write + " -> " + write);
|
|
277
|
+
this.log.debug("(doState) Updating object: " + name + " (write): " + obj.common.write + " -> " + write);
|
|
259
278
|
await this.extendObject(name, {common: {write: write}});
|
|
260
279
|
}
|
|
261
280
|
|
|
@@ -265,7 +284,7 @@ class Senec extends utils.Adapter {
|
|
|
265
284
|
await this.checkUpdateSelfStat(name);
|
|
266
285
|
return;
|
|
267
286
|
}
|
|
268
|
-
this.log.
|
|
287
|
+
this.log.debug('(doState) Update: ' + name + ': ' + oldState.val + ' -> ' + value);
|
|
269
288
|
}
|
|
270
289
|
await this.setStateAsync(name, {
|
|
271
290
|
val: value,
|
|
@@ -284,15 +303,15 @@ class Senec extends utils.Adapter {
|
|
|
284
303
|
var lang = 1; // fallback to english
|
|
285
304
|
var langState = await this.getStateAsync('WIZARD.GUI_LANG');
|
|
286
305
|
if (langState) lang = langState.val;
|
|
287
|
-
this.log.silly("Senec language: " + lang);
|
|
306
|
+
this.log.silly("(Decode) Senec language: " + lang);
|
|
288
307
|
var key = name;
|
|
289
308
|
if (!isNaN(name.substring(name.lastIndexOf('.')) + 1)) key = name.substring(0, name.lastIndexOf('.'));
|
|
290
|
-
this.log.silly("Checking: " + name + " -> " + key);
|
|
309
|
+
this.log.silly("(Decode) Checking: " + name + " -> " + key);
|
|
291
310
|
|
|
292
311
|
if (state_trans[key + "." + lang] !== undefined) {
|
|
293
|
-
this.log.silly("Trans found for: " + key + "." + lang);
|
|
312
|
+
this.log.silly("(Decode) Trans found for: " + key + "." + lang);
|
|
294
313
|
const trans = (state_trans[key + "." + lang] !== undefined ? (state_trans[key + "." + lang][value] !== undefined ? state_trans[key + "." + lang][value] : "(unknown)") : "(unknown)");
|
|
295
|
-
this.log.
|
|
314
|
+
this.log.silly("(Decode) Trans " + key + ":" + value + " = " + trans);
|
|
296
315
|
const desc = (state_attr[key + "_Text"] !== undefined) ? state_attr[key + "_Text"].name : key;
|
|
297
316
|
await this.doState(name + "_Text", trans, desc, "", true);
|
|
298
317
|
}
|
|
@@ -317,7 +336,7 @@ class Senec extends utils.Adapter {
|
|
|
317
336
|
if (value2 !== "VARIABLE_NOT_FOUND" && key2 !== "OBJECT_NOT_FOUND") {
|
|
318
337
|
const key = key1 + '.' + key2;
|
|
319
338
|
if (state_attr[key] === undefined) {
|
|
320
|
-
this.log.
|
|
339
|
+
this.log.info('REPORT_TO_DEV: State attribute definition missing for: ' + key + ', Val: ' + value2);
|
|
321
340
|
}
|
|
322
341
|
const desc = (state_attr[key] !== undefined) ? state_attr[key].name : key2;
|
|
323
342
|
const unit = (state_attr[key] !== undefined) ? state_attr[key].unit : "";
|
|
@@ -366,7 +385,7 @@ class Senec extends utils.Adapter {
|
|
|
366
385
|
const unitRefDay = (state_attr[key + ".ref" + day] !== undefined) ? state_attr[key + ".ref" + day].unit : "";
|
|
367
386
|
|
|
368
387
|
if (refDay != curDay) {
|
|
369
|
-
this.log.debug("New " + day + " (or first value seen). Updating stat data for: " + name.substring(10));
|
|
388
|
+
this.log.debug("(Calc) New " + day + " (or first value seen). Updating stat data for: " + name.substring(10));
|
|
370
389
|
// Change of day
|
|
371
390
|
await this.doState(key + ".ref" + day, curDay, descRefDay, unitRefDay, false);
|
|
372
391
|
await this.doState(key + yesterday, valToday, descYesterday, unitYesterday, false);
|
|
@@ -374,10 +393,10 @@ class Senec extends utils.Adapter {
|
|
|
374
393
|
if (valRef < valCur) {
|
|
375
394
|
await this.doState(key + refValue, valCur, descRef, unitRef, true);
|
|
376
395
|
} else {
|
|
377
|
-
this.log.
|
|
396
|
+
this.log.warn("(Calc) Not updating reference value for: " + name.substring(10) + "! Old RefValue (" + valRef + ") >= new RefValue (" + valCur + "). Impossible situation. If this is intentional, please update via admin!");
|
|
378
397
|
}
|
|
379
398
|
} else {
|
|
380
|
-
this.log.
|
|
399
|
+
this.log.silly("(Calc) Updating " + day +" value for: " + name.substring(10) + ": " + Number((valCur - valRef).toFixed(2)));
|
|
381
400
|
// update today's value
|
|
382
401
|
await this.doState(key + today, Number((valCur - valRef).toFixed(2)), descToday, unitToday, false);
|
|
383
402
|
}
|
|
@@ -418,7 +437,7 @@ class Senec extends utils.Adapter {
|
|
|
418
437
|
const unitRefDay = (state_attr[key + ".ref" + day] !== undefined) ? state_attr[key + ".ref" + day].unit : "";
|
|
419
438
|
|
|
420
439
|
if (refDay != curDay) {
|
|
421
|
-
this.log.debug("New " + day + " (or first value seen). Updating Autarky data for: " + key + " " + day);
|
|
440
|
+
this.log.debug("(Autarky) New " + day + " (or first value seen). Updating Autarky data for: " + key + " " + day);
|
|
422
441
|
// Change of day
|
|
423
442
|
await this.doState(key + ".ref" + day, curDay, descRefDay, unitRefDay, false);
|
|
424
443
|
await this.doState(key + yesterday, valToday, descYesterday, unitYesterday, false);
|
|
@@ -428,7 +447,7 @@ class Senec extends utils.Adapter {
|
|
|
428
447
|
// update today's value - but beware of div/0
|
|
429
448
|
var newVal = 0;
|
|
430
449
|
if (valHouseCons > 0) newVal = Number((((valPVGen - valGridExp - valBatCharge + valBatDischarge) / valHouseCons) * 100).toFixed(0));
|
|
431
|
-
this.log.
|
|
450
|
+
this.log.silly("(Autarky) Updating Autarky " + day +" value for: " + key + today + ": " + newVal);
|
|
432
451
|
if (valHouseCons > 0) await this.doState(key + today, newVal, descToday, unitToday, false);
|
|
433
452
|
}
|
|
434
453
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.senec",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.7",
|
|
4
4
|
"description": "Senec Home",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "NoBl",
|
|
@@ -24,29 +24,29 @@
|
|
|
24
24
|
"url": "https://github.com/nobl/ioBroker.senec.git"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"axios": "^0.
|
|
28
|
-
"@iobroker/adapter-core": "^2.
|
|
27
|
+
"axios": "^0.27.2",
|
|
28
|
+
"@iobroker/adapter-core": "^2.6.0"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
|
-
"@alcalzone/release-script": "^3.5.
|
|
32
|
-
"@iobroker/testing": "^
|
|
33
|
-
"@types/chai": "^4.3.
|
|
31
|
+
"@alcalzone/release-script": "^3.5.9",
|
|
32
|
+
"@iobroker/testing": "^3.0.2",
|
|
33
|
+
"@types/chai": "^4.3.1",
|
|
34
34
|
"@types/chai-as-promised": "^7.1.4",
|
|
35
35
|
"@types/gulp": "^4.0.9",
|
|
36
|
-
"@types/mocha": "^9.
|
|
37
|
-
"@types/node": "^17.0.
|
|
36
|
+
"@types/mocha": "^9.1.1",
|
|
37
|
+
"@types/node": "^17.0.38",
|
|
38
38
|
"@types/proxyquire": "^1.3.28",
|
|
39
39
|
"@types/sinon": "^10.0.6",
|
|
40
40
|
"@types/sinon-chai": "^3.2.8",
|
|
41
41
|
"chai": "^4.3.6",
|
|
42
42
|
"chai-as-promised": "^7.1.1",
|
|
43
|
-
"eslint": "^8.
|
|
43
|
+
"eslint": "^8.16.0",
|
|
44
44
|
"gulp": "^4.0.2",
|
|
45
|
-
"mocha": "^
|
|
45
|
+
"mocha": "^10.0.0",
|
|
46
46
|
"proxyquire": "^2.1.3",
|
|
47
|
-
"sinon": "^
|
|
47
|
+
"sinon": "^14.0.0",
|
|
48
48
|
"sinon-chai": "^3.7.0",
|
|
49
|
-
"typescript": "~4.
|
|
49
|
+
"typescript": "~4.7.2"
|
|
50
50
|
},
|
|
51
51
|
"main": "main.js",
|
|
52
52
|
"files": [
|