iobroker.senec 1.3.3 → 1.3.6

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.
@@ -386,6 +386,288 @@ const state_trans = {
386
386
  18: 'Senec.Home V3 Hybrid duo (18)',
387
387
  19: 'Senec.Home V3 Hybrid (19)'
388
388
  },
389
+ 'STATISTIC.CURRENT_STATE.0': {
390
+ 0: 'INITIALZUSTAND (0)',
391
+ 1: 'KEINE KOMMUNIKATION LADEGERAET (1)',
392
+ 2: 'FEHLER LEISTUNGSMESSGERAET (2)',
393
+ 3: 'RUNDSTEUEREMPFAENGER (3)',
394
+ 4: 'ERSTLADUNG (4)',
395
+ 5: 'WARTUNGSLADUNG (5)',
396
+ 6: 'WARTUNGSLADUNG FERTIG (6)',
397
+ 7: 'WARTUNG NOTWENDIG (7)',
398
+ 8: 'MAN. SICHERHEITSLADUNG (8)',
399
+ 9: 'SICHERHEITSLADUNG FERTIG (9)',
400
+ 10: 'VOLLLADUNG (10)',
401
+ 11: 'AUSGLEICHSLADUNG: LADEN (11)',
402
+ 12: 'SULFATLADUNG: LADEN (12)',
403
+ 13: 'AKKU VOLL (13)',
404
+ 14: 'LADEN (14)',
405
+ 15: 'AKKU LEER (15)',
406
+ 16: 'ENTLADEN (16)',
407
+ 17: 'PV + ENTLADEN (17)',
408
+ 18: 'NETZ + ENTLADEN (18)',
409
+ 19: 'PASSIV (19)',
410
+ 20: 'AUSGESCHALTET (20)',
411
+ 21: 'EIGENVERBRAUCH (21)',
412
+ 22: 'NEUSTART (22)',
413
+ 23: 'MAN. AUSGLEICHSLADUNG: LADEN (23)',
414
+ 24: 'MAN. SULFATLADUNG: LADEN (24)',
415
+ 25: 'SICHERHEITSLADUNG (25)',
416
+ 26: 'AKKU-SCHUTZBETRIEB (26)',
417
+ 27: 'EG FEHLER (27)',
418
+ 28: 'EG LADEN (28)',
419
+ 29: 'EG ENTLADEN (29)',
420
+ 30: 'EG PASSIV (30)',
421
+ 31: 'EG LADEN VERBOTEN (31)',
422
+ 32: 'EG ENTLADEN VERBOTEN (32)',
423
+ 33: 'NOTLADUNG (33)',
424
+ 34: 'SOFTWAREAKTUALISIERUNG (34)',
425
+ 35: 'FEHLER: NA-SCHUTZ (35)',
426
+ 36: 'FEHLER: NA-SCHUTZ NETZ (36)',
427
+ 37: 'FEHLER: NA-SCHUTZ HARDWARE (37)',
428
+ 38: 'KEINE SERVERVERBINDUNG (38)',
429
+ 39: 'BMS FEHLER (39)',
430
+ 40: 'WARTUNG: FILTER (40)',
431
+ 41: 'SCHLAFMODUS (41)',
432
+ 42: 'WARTE AUF ÜBERSCHUSS (42)',
433
+ 43: 'KAPAZITÄTSTEST: LADEN (43)',
434
+ 44: 'KAPAZITÄTSTEST: ENTLADEN (44)',
435
+ 45: 'MAN. SULFATLADUNG: WARTEN (45)',
436
+ 46: 'MAN. SULFATLADUNG: FERTIG (46)',
437
+ 47: 'MAN. SULFATLADUNG: FEHLER (47)',
438
+ 48: 'AUSGLEICHSLADUNG: WARTEN (48)',
439
+ 49: 'NOTLADUNG: FEHLER (49)',
440
+ 50: 'MAN: AUSGLEICHSLADUNG: WARTEN (50)',
441
+ 51: 'MAN: AUSGLEICHSLADUNG: FEHLER (51)',
442
+ 52: 'MAN: AUSGLEICHSLADUNG: FERTIG (52)',
443
+ 53: 'AUTO: SULFATLADUNG: WARTEN (53)',
444
+ 54: 'LADESCHLUSSPHASE (54)',
445
+ 55: 'BATTERIETRENNSCHALTER AUS (55)',
446
+ 56: 'PEAK-SHAVING: WARTEN (56)',
447
+ 57: 'FEHLER LADEGERAET (57)',
448
+ 58: 'NPU-FEHLER (58)',
449
+ 59: 'BMS OFFLINE (59)',
450
+ 60: 'WARTUNGSLADUNG FEHLER (60)',
451
+ 61: 'MAN. SICHERHEITSLADUNG FEHLER (61)',
452
+ 62: 'SICHERHEITSLADUNG FEHLER (62)',
453
+ 63: 'KEINE MASTERVERBINDUNG (63)',
454
+ 64: 'LITHIUM SICHERHEITSMODUS AKTIV (64)',
455
+ 65: 'LITHIUM SICHERHEITSMODUS BEENDET (65)',
456
+ 66: 'FEHLER BATTERIESPANNUNG (66)',
457
+ 67: 'BMS DC AUSGESCHALTET (67)',
458
+ 68: 'NETZINITIALISIERUNG (68)',
459
+ 69: 'NETZSTABILISIERUNG (69)',
460
+ 70: 'FERNABSCHALTUNG (70)',
461
+ 71: 'OFFPEAK-LADEN (71)',
462
+ 72: 'FEHLER HALBBRÜCKE (72)',
463
+ 73: 'BMS: FEHLER BETRIEBSTEMPERATUR (73)',
464
+ 74: 'FACOTRY SETTINGS NICHT GEFUNDEN (74)',
465
+ 75: 'NETZERSATZBETRIEB (75)',
466
+ 76: 'NETZERSATZBETRIEB AKKU LEER (76)',
467
+ 77: 'NETZERSATZBETRIEB FEHLER (77)',
468
+ 78: 'INITIALISIERUNG (78)',
469
+ 79: 'INSTALLATIONSMODUS (79)',
470
+ 80: 'NETZAUSFALL (80)',
471
+ 81: 'BMS UPDATE ERFORDERLICH (81)',
472
+ 82: 'BMS KONFIGURATION ERFORDERLICH (82)',
473
+ 83: 'ISOLATIONSTEST (83)',
474
+ 84: 'SELBSTTEST (84)',
475
+ 85: 'EXTERNE STEUERUNG (85)',
476
+ 86: 'TEMPERATUR SENSOR FEHLER (86)',
477
+ 87: 'NETZBETREIBER: LADEN GESPERRT (87)',
478
+ 88: 'NETZBETREIBER: ENTLADEN GESPERRT (88)',
479
+ 89: 'RESERVEKAPAZITÄT (89)',
480
+ 90: 'SELBSTTEST FEHLER (90)',
481
+ 91: 'ISOLATIONSFEHLER (91)'
482
+ },
483
+ 'STATISTIC.CURRENT_STATE.1': {
484
+ 0: 'INITIALSTATE',
485
+ 1: 'ERROR INVERTER COMMUNICATION',
486
+ 2: 'ERROR ELECTRICY METER',
487
+ 3: 'RIPPLE CONTROL RECEIVER',
488
+ 4: 'INITIAL CHARGE',
489
+ 5: 'MAINTENANCE CHARGE',
490
+ 6: 'MAINTENANCE READY',
491
+ 7: 'MAINTENANCE REQUIRED',
492
+ 8: 'MAN. SAFETY CHARGE',
493
+ 9: 'SAFETY CHARGE READY',
494
+ 10: 'FULL CHARGE',
495
+ 11: 'EQUALIZATION: CHARGE',
496
+ 12: 'DESULFATATION: CHARGE',
497
+ 13: 'BATTERY FULL',
498
+ 14: 'CHARGE',
499
+ 15: 'BATTERY EMPTY',
500
+ 16: 'DISCHARGE',
501
+ 17: 'PV + DISCHARGE',
502
+ 18: 'GRID + DISCHARGE',
503
+ 19: 'PASSIVE',
504
+ 20: 'OFF',
505
+ 21: 'OWN CONSUMPTION',
506
+ 22: 'RESTART',
507
+ 23: 'MAN. EQUALIZATION: CHARGE',
508
+ 24: 'MAN. DESULFATATION: CHARGE',
509
+ 25: 'SAFETY CHARGE',
510
+ 26: 'BATTERY PROTECTION MODE',
511
+ 27: 'EG ERROR',
512
+ 28: 'EG CHARGE',
513
+ 29: 'EG DISCHARGE',
514
+ 30: 'EG PASSIVE',
515
+ 31: 'EG PROHIBIT CHARGE',
516
+ 32: 'EG PROHIBIT DISCHARGE',
517
+ 33: 'EMERGANCY CHARGE',
518
+ 34: 'SOFTWARE UPDATE',
519
+ 35: 'NSP ERROR',
520
+ 36: 'NSP ERROR: GRID',
521
+ 37: 'NSP ERROR: HARDWRE',
522
+ 38: 'NO SERVER CONNECTION',
523
+ 39: 'BMS ERROR',
524
+ 40: 'MAINTENANCE: FILTER',
525
+ 41: 'SLEEPING MODE',
526
+ 42: 'WAITING EXCESS',
527
+ 43: 'CAPACITY TEST: CHARGE',
528
+ 44: 'CAPACITY TEST: DISCHARGE',
529
+ 45: 'MAN. DESULFATATION: WAIT',
530
+ 46: 'MAN. DESULFATATION: READY',
531
+ 47: 'MAN. DESULFATATION: ERROR',
532
+ 48: 'EQUALIZATION: WAIT',
533
+ 49: 'EMERGANCY CHARGE: ERROR',
534
+ 50: 'MAN. EQUALIZATION: WAIT',
535
+ 51: 'MAN. EQUALIZATION: ERROR',
536
+ 52: 'MAN: EQUALIZATION: READY',
537
+ 53: 'AUTO. DESULFATATION: WAIT',
538
+ 54: 'ABSORPTION PHASE',
539
+ 55: 'DC-SWITCH OFF',
540
+ 56: 'PEAK-SHAVING: WAIT',
541
+ 57: 'ERROR BATTERY INVERTER',
542
+ 58: 'NPU-ERROR',
543
+ 59: 'BMS OFFLINE',
544
+ 60: 'MAINTENANCE CHARGE ERROR',
545
+ 61: 'MAN. SAFETY CHARGE ERROR',
546
+ 62: 'SAFETY CHARGE ERROR',
547
+ 63: 'NO CONNECTION TO MASTER',
548
+ 64: 'LITHIUM SAFE MODE ACTIVE',
549
+ 65: 'LITHIUM SAFE MODE DONE',
550
+ 66: 'BATTERY VOLTAGE ERROR',
551
+ 67: 'BMS DC SWITCHED OFF',
552
+ 68: 'GRID INITIALIZATION',
553
+ 69: 'GRID STABILIZATION',
554
+ 70: 'REMOTE SHUTDOWN',
555
+ 71: 'OFFPEAK-CHARGE',
556
+ 72: 'ERROR HALFBRIDGE',
557
+ 73: 'BMS: ERROR OPERATING TEMPERATURE',
558
+ 74: 'FACOTRY SETTINGS NOT FOUND',
559
+ 75: 'BACKUP POWER MODE - ACTIVE',
560
+ 76: 'BACKUP POWER MODE - BATTERY EMPTY',
561
+ 77: 'BACKUP POWER MODE ERROR',
562
+ 78: 'INITIALISING',
563
+ 79: 'INSTALLATION MODE',
564
+ 80: 'GRID OFFLINE',
565
+ 81: 'BMS UPDATE NEEDED',
566
+ 82: 'BMS CONFIGURATION NEEDED',
567
+ 83: 'INSULATION TEST',
568
+ 84: 'SELFTEST',
569
+ 85: 'EXTERNAL CONTROL',
570
+ 86: 'ERROR: TEMPERATURESENSOR',
571
+ 87: 'GRID OPERATOR: CHARGE PROHIBITED',
572
+ 88: 'GRID OPERATOR: DISCHARGE PROHIBITED',
573
+ 89: 'SPARE CAPACITY',
574
+ 90: 'SELFTEST ERROR',
575
+ 91: 'EARTH FAULT'
576
+ },
577
+ 'STATISTIC.CURRENT_STATE.2': {
578
+ 0: 'STATO INIZIALE',
579
+ 1: 'ERRORE COMMUNICAZIONE INVERTER',
580
+ 2: 'ERRORE WATTMETRO',
581
+ 3: 'RICEVITORE RIPPLE CONTROL',
582
+ 4: 'PRIMA CARICA',
583
+ 5: 'CARICA DI MANTENIMENTO',
584
+ 6: 'CARICA DI MANTENIMENTO COMPLETATA',
585
+ 7: 'MANUTENZIONE: NECESSARIA',
586
+ 8: 'CARICA DI SICUREZZA MANUALE',
587
+ 9: 'CARICA DI SICUREZZA COMPLETA',
588
+ 10: 'CARICA COMPLETA',
589
+ 11: 'CARICA DI EQUALIZZAZIONE',
590
+ 12: 'CARICA DI DESOLFATAZIONE',
591
+ 13: 'ACCUMULATORE CARICO',
592
+ 14: 'CARICA',
593
+ 15: 'ACCUMULATORE SCARICO',
594
+ 16: 'SCARICA',
595
+ 17: 'FV + SCARICA',
596
+ 18: 'RETE + SCARICA',
597
+ 19: 'PASSIVO',
598
+ 20: 'SPENTO',
599
+ 21: 'AUTOCONSUMO',
600
+ 22: 'RIAVVIO',
601
+ 23: 'CARICA DI EQUALIZZAZIONE MANUALE',
602
+ 24: 'CARICA DI DESOLFATAZIONE MANUALE',
603
+ 25: 'CARICA DI SICUREZZA',
604
+ 26: 'MODALITÀ PROTEZIONE ACCUMULATORE',
605
+ 27: 'ERRORE EG',
606
+ 28: 'EG: CARICA',
607
+ 29: 'EG: SCARICA',
608
+ 30: 'EG: PASSIVO',
609
+ 31: 'CARICA EG PROIBITA',
610
+ 32: 'SCARICAMENTO EG PROIBITO',
611
+ 33: 'CARICA D\'EMERGENZA',
612
+ 34: 'AGGIORNAMENTO SOFTWARE',
613
+ 35: 'ERRORE SPI',
614
+ 36: 'ERRORE SPI: RETE ',
615
+ 37: 'ERRORE SPI: HARDWARE ',
616
+ 38: 'NESSUNA CONNESSIONE AL SERVER',
617
+ 39: 'ERRORE BMS',
618
+ 40: 'SOSTITUZIONE DEL FILTRO NECESSARIA',
619
+ 41: 'BATTERIA AL LITIO SPENTA',
620
+ 42: 'IN ATTESA DI SURPLUS ENERGETICO',
621
+ 43: 'TEST DI CAPACITÀ: CARICA',
622
+ 44: 'TEST DI CAPACITÀ: SCARICA',
623
+ 45: 'CARICA DI DESOLFATAZIONE MANUALE: ATTESA',
624
+ 46: 'CARICA DI DESOLFATAZIONE MANUALE: COMPLETA',
625
+ 47: 'CARICA DI DESOLFATAZIONE MANUALE: ERRORE',
626
+ 48: 'EQUALIZZAZIONE: ATTESA',
627
+ 49: 'CARICA D\'EMERGENZA: ERRORE',
628
+ 50: 'EQUALIZZAZIONE MANUALE: ATTESA',
629
+ 51: 'EQUALIZZAZIONE MANUALE: ERRORE',
630
+ 52: 'EQUALIZZAZIONE MANUALE: COMPLETA',
631
+ 53: 'CARICA DI DESOLFATAZIONE: ATTESA',
632
+ 54: 'FASE FINALE CARICA',
633
+ 55: 'SEZIONATORE BATTERIA OFF',
634
+ 56: 'PEAK SHAVING: ATTESA',
635
+ 57: 'ERRORE DISPOSITIVO DI CARICA',
636
+ 58: 'ERRORE NPU',
637
+ 59: 'BMS DISCONESSO',
638
+ 60: 'CARICA DI MANUTENZIONE ERRORE',
639
+ 61: 'CARICA DI SICUREZZA MANUALE ERRORE',
640
+ 62: 'CARICA DI SICUREZZA ERRORE',
641
+ 63: 'NESSUNA CONNESSIONE MASTER',
642
+ 64: 'MODALITA DI PROTEZIONE LITIO ATTIVA',
643
+ 65: 'MODALITA DI PROTEZIONE LITIO COMPLETA',
644
+ 66: 'ERORE DI TENSIONE BATTERIA',
645
+ 67: 'BMS DC SPENTO',
646
+ 68: 'INIZIALIZZAZIONE DELLA RETE',
647
+ 69: 'STABILIZZAZIONE DELLA RETE',
648
+ 70: 'ARRESTO REMOTO',
649
+ 71: 'OFFPEAK-CARICA',
650
+ 72: 'ERRORE MEZZO PONTE',
651
+ 73: 'BMS: ERRORE TEMPERATURA DI FUNZIONAMENTO',
652
+ 74: 'FACOTRY SETTINGS NON TROVATO',
653
+ 75: 'FUNZIONAMENTO ISOLATO',
654
+ 76: 'FUNZIONAMENTO ISOLATO ACCUMULATORE SCARICO',
655
+ 77: 'ERORE DI FUNZIONAMENTO ISOLATO',
656
+ 78: 'INIZIALIZZAZIONE',
657
+ 79: 'MODALITA INSTALLAZIONE',
658
+ 80: 'RETE OFFLINE',
659
+ 81: 'AGGIORNAMENTO BMS NECESSARIO',
660
+ 82: 'CONFIGURAZIONE BMS NECESSARIA',
661
+ 83: 'TEST DI ISOLAMENTO',
662
+ 84: 'AUTOTEST',
663
+ 85: 'CONTROLLO ESTERNO',
664
+ 86: 'ERRORE SENSORE DI TEMPERATURA',
665
+ 87: 'OPERATORE DI RETE: CARICA BLOCCATA',
666
+ 88: 'OPERATORE DI RETE: SCARICA BLOCCATA',
667
+ 89: 'CAPACITA INUTILIZZATA',
668
+ 90: 'ERRORE DI AUTOTEST',
669
+ 91: 'FAGLIA TERRESTRE'
670
+ },
389
671
  'WALLBOX.STATE.0' : {
390
672
  161: 'Warte auf E-Fahrzeug (161)',
391
673
  177: 'E-Fahrzeug fragt Ladung an (177)',
package/main.js CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  const utils = require('@iobroker/adapter-core');
4
- const request = require('request');
4
+ const axios = require('axios');
5
5
  const state_attr = require(__dirname + '/lib/state_attr.js');
6
6
  const state_trans = require(__dirname + '/lib/state_trans.js');
7
7
 
@@ -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
  }
@@ -110,30 +110,45 @@ class Senec extends utils.Adapter {
110
110
  }
111
111
 
112
112
  /**
113
- * Read from url via request
113
+ * Read from url via axios
114
114
  * @param url to read from
115
115
  * @param form to post
116
116
  */
117
- async doGet(pUrl, pForm, caller, pollingTimeout) {
118
- return new Promise(function (resolve, reject) {
119
- const options = {
120
- url: pUrl,
121
- method: 'POST',
122
- form: pForm,
123
- timeout: pollingTimeout
124
- };
125
- request(options, function (error, response, body) {
126
- if (error)
127
- return reject(error);
128
- caller.log.debug('Status: ' + response.statusCode);
129
- if (!response || response.statusCode !== 200)
130
- return reject('Cannot read from SENEC: ' + response.statusCode);
131
- caller.log.debug('Response: ' + JSON.stringify(response));
132
- caller.log.debug('Body: ' + body);
133
- resolve(body);
134
- });
135
- });
136
- }
117
+ async doGet(pUrl, pForm, caller, pollingTimeout) {
118
+ return new Promise(function (resolve, reject) {
119
+ axios({
120
+ method: 'post',
121
+ url: pUrl,
122
+ data: pForm,
123
+ timeout: pollingTimeout
124
+ })
125
+ .then(
126
+ async (response) => {
127
+ const content = response.data;
128
+ caller.log.debug('(Poll) received data (' + response.status + '): ' + JSON.stringify(content));
129
+ resolve(JSON.stringify(content));
130
+ }
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
+ );
150
+ });
151
+ }
137
152
 
138
153
  /**
139
154
  * Read values from Senec Home V2.1
@@ -142,7 +157,7 @@ class Senec extends utils.Adapter {
142
157
  async readSenecV21() {
143
158
  // read by webinterface are the following values. Not all are "high priority" though.
144
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":""}
145
- // "ENERGY":{"STAT_STATE":"","STAT_STATE_DECODE":"","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":""}
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":""}
146
161
  // "WIZARD":{"CONFIG_LOADED":""},"SYS_UPDATE":{"UPDATE_AVAILABLE":""}
147
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":{}
148
163
  // "PM1OBJ1":{"FREQ":"","U_AC":"","I_AC":"","P_AC":"","P_TOTAL":""},"PM1OBJ2":{"FREQ":"","U_AC":"","I_AC":"","P_AC":"","P_TOTAL":""}
@@ -150,9 +165,8 @@ class Senec extends utils.Adapter {
150
165
 
151
166
  const url = 'http://' + this.config.senecip + '/lala.cgi';
152
167
  var form = '{';
153
- form += '"ENERGY":{"STAT_STATE":"","STAT_STATE_DECODE":"","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":""}';
154
- // MPP_INT got replaced by MPP_POWER but might still be in use by some machines. Can be removed at a later point in time. (includes state_attr) 2020-10-22
155
- form += ',"PV1":{"POWER_RATIO":"","MPP_POWER":"","MPP_INT":""}';
168
+ 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":""}';
169
+ form += ',"PV1":{"POWER_RATIO":"","MPP_POWER":""}';
156
170
  form += ',"PWR_UNIT":{"POWER_L1":"","POWER_L2":"","POWER_L3":""}';
157
171
  form += ',"PM1OBJ1":{"FREQ":"","U_AC":"","I_AC":"","P_AC":"","P_TOTAL":""}';
158
172
  form += ',"PM1OBJ2":{"FREQ":"","U_AC":"","I_AC":"","P_AC":"","P_TOTAL":""}';
@@ -160,7 +174,13 @@ class Senec extends utils.Adapter {
160
174
  form += '}';
161
175
 
162
176
  try {
163
- const body = await this.doGet(url, form, this, this.config.pollingTimeout);
177
+ var body = await this.doGet(url, form, this, this.config.pollingTimeout);
178
+ if (body.includes('\\"')) {
179
+ // in rare cases senec reports back extra escape sequences on some machines ...
180
+ this.log.info("(Poll) Double escapes detected! Body inc: " + body);
181
+ body = body.replace(/\\"/g, '"');
182
+ this.log.info("(Poll) Double escapes autofixed! Body out: " + body);
183
+ }
164
184
  var obj = JSON.parse(body, reviverNumParse);
165
185
  await this.evalPoll(obj);
166
186
 
@@ -190,7 +210,13 @@ class Senec extends utils.Adapter {
190
210
  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":{}}';
191
211
 
192
212
  try {
193
- const body = await this.doGet(url, form, this, this.config.pollingTimeout);
213
+ var body = await this.doGet(url, form, this, this.config.pollingTimeout);
214
+ if (body.includes('\\"')) {
215
+ // in rare cases senec reports back extra escape sequences on some machines ...
216
+ this.log.info("(Poll) Double escapes detected! Body inc: " + body);
217
+ body = body.replace(/\\"/g, '"');
218
+ this.log.info("(Poll) Double escapes autofixed! Body out: " + body);
219
+ }
194
220
  var obj = JSON.parse(body, reviverNumParse);
195
221
 
196
222
  await this.evalPoll(obj);
@@ -213,6 +239,12 @@ class Senec extends utils.Adapter {
213
239
  * sets a state's value and creates the state if it doesn't exist yet
214
240
  */
215
241
  async doState(name, value, description, unit, write) {
242
+ if (!isNaN(name.substring(0, 1))) {
243
+ // keys cannot start with digits! Possibly SENEC delivering erraneous data
244
+ this.log.debug('(doState) Invalid datapoint: ' + name + ': ' + value);
245
+ return;
246
+ }
247
+ this.log.silly('(doState) Update: ' + name + ': ' + value);
216
248
  await this.setObjectNotExistsAsync(name, {
217
249
  type: 'state',
218
250
  common: {
@@ -229,19 +261,19 @@ class Senec extends utils.Adapter {
229
261
  // Check object for changes:
230
262
  var obj = await this.getObjectAsync(name);
231
263
  if (obj.common.name != description) {
232
- this.log.debug("Updating object: " + name + " (desc): " + obj.common.name + " -> " + description);
264
+ this.log.debug("(doState) Updating object: " + name + " (desc): " + obj.common.name + " -> " + description);
233
265
  await this.extendObject(name, {common: {name: description}});
234
266
  }
235
267
  if (obj.common.type != typeof(value)) {
236
- this.log.debug("Updating object: " + name + " (type): " + obj.common.type + " -> " + typeof(value));
268
+ this.log.debug("(doState) Updating object: " + name + " (type): " + obj.common.type + " -> " + typeof(value));
237
269
  await this.extendObject(name, {common: {type: typeof(value)}});
238
270
  }
239
271
  if (obj.common.unit != unit) {
240
- this.log.debug("Updating object: " + name + " (unit): " + obj.common.unit + " -> " + unit);
272
+ this.log.debug("(doState) Updating object: " + name + " (unit): " + obj.common.unit + " -> " + unit);
241
273
  await this.extendObject(name, {common: {unit: unit}});
242
274
  }
243
275
  if (obj.common.write != write) {
244
- this.log.debug("Updating object: " + name + " (write): " + obj.common.write + " -> " + write);
276
+ this.log.debug("(doState) Updating object: " + name + " (write): " + obj.common.write + " -> " + write);
245
277
  await this.extendObject(name, {common: {write: write}});
246
278
  }
247
279
 
@@ -251,7 +283,7 @@ class Senec extends utils.Adapter {
251
283
  await this.checkUpdateSelfStat(name);
252
284
  return;
253
285
  }
254
- this.log.silly('Update: ' + name + ': ' + oldState.val + ' -> ' + value);
286
+ this.log.debug('(doState) Update: ' + name + ': ' + oldState.val + ' -> ' + value);
255
287
  }
256
288
  await this.setStateAsync(name, {
257
289
  val: value,
@@ -270,15 +302,15 @@ class Senec extends utils.Adapter {
270
302
  var lang = 1; // fallback to english
271
303
  var langState = await this.getStateAsync('WIZARD.GUI_LANG');
272
304
  if (langState) lang = langState.val;
273
- this.log.silly("Senec language: " + lang);
305
+ this.log.silly("(Decode) Senec language: " + lang);
274
306
  var key = name;
275
307
  if (!isNaN(name.substring(name.lastIndexOf('.')) + 1)) key = name.substring(0, name.lastIndexOf('.'));
276
- this.log.silly("Checking: " + name + " -> " + key);
308
+ this.log.silly("(Decode) Checking: " + name + " -> " + key);
277
309
 
278
310
  if (state_trans[key + "." + lang] !== undefined) {
279
- this.log.silly("Trans found for: " + key + "." + lang);
311
+ this.log.silly("(Decode) Trans found for: " + key + "." + lang);
280
312
  const trans = (state_trans[key + "." + lang] !== undefined ? (state_trans[key + "." + lang][value] !== undefined ? state_trans[key + "." + lang][value] : "(unknown)") : "(unknown)");
281
- this.log.debug("Trans " + key + ":" + value + " = " + trans);
313
+ this.log.silly("(Decode) Trans " + key + ":" + value + " = " + trans);
282
314
  const desc = (state_attr[key + "_Text"] !== undefined) ? state_attr[key + "_Text"].name : key;
283
315
  await this.doState(name + "_Text", trans, desc, "", true);
284
316
  }
@@ -303,7 +335,7 @@ class Senec extends utils.Adapter {
303
335
  if (value2 !== "VARIABLE_NOT_FOUND" && key2 !== "OBJECT_NOT_FOUND") {
304
336
  const key = key1 + '.' + key2;
305
337
  if (state_attr[key] === undefined) {
306
- this.log.debug('REPORT_TO_DEV: State attribute definition missing for: ' + key + ', Val: ' + value2);
338
+ this.log.info('REPORT_TO_DEV: State attribute definition missing for: ' + key + ', Val: ' + value2);
307
339
  }
308
340
  const desc = (state_attr[key] !== undefined) ? state_attr[key].name : key2;
309
341
  const unit = (state_attr[key] !== undefined) ? state_attr[key].unit : "";
@@ -352,7 +384,7 @@ class Senec extends utils.Adapter {
352
384
  const unitRefDay = (state_attr[key + ".ref" + day] !== undefined) ? state_attr[key + ".ref" + day].unit : "";
353
385
 
354
386
  if (refDay != curDay) {
355
- this.log.debug("New " + day + " (or first value seen). Updating stat data for: " + name.substring(10));
387
+ this.log.debug("(Calc) New " + day + " (or first value seen). Updating stat data for: " + name.substring(10));
356
388
  // Change of day
357
389
  await this.doState(key + ".ref" + day, curDay, descRefDay, unitRefDay, false);
358
390
  await this.doState(key + yesterday, valToday, descYesterday, unitYesterday, false);
@@ -360,10 +392,10 @@ class Senec extends utils.Adapter {
360
392
  if (valRef < valCur) {
361
393
  await this.doState(key + refValue, valCur, descRef, unitRef, true);
362
394
  } else {
363
- this.log.warning("Not updating reference value for: " + name.substring(10) + "! Old RefValue (" + valRef + ") >= new RefValue (" + valCur + "). Impossible situation. If this is intentional, please update via admin!");
395
+ 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!");
364
396
  }
365
397
  } else {
366
- this.log.debug("Updating " + day +" value for: " + name.substring(10));
398
+ this.log.silly("(Calc) Updating " + day +" value for: " + name.substring(10) + ": " + Number((valCur - valRef).toFixed(2)));
367
399
  // update today's value
368
400
  await this.doState(key + today, Number((valCur - valRef).toFixed(2)), descToday, unitToday, false);
369
401
  }
@@ -404,16 +436,18 @@ class Senec extends utils.Adapter {
404
436
  const unitRefDay = (state_attr[key + ".ref" + day] !== undefined) ? state_attr[key + ".ref" + day].unit : "";
405
437
 
406
438
  if (refDay != curDay) {
407
- this.log.debug("New " + day + " (or first value seen). Updating Autarky data for: " + key + " " + day);
439
+ this.log.debug("(Autarky) New " + day + " (or first value seen). Updating Autarky data for: " + key + " " + day);
408
440
  // Change of day
409
441
  await this.doState(key + ".ref" + day, curDay, descRefDay, unitRefDay, false);
410
442
  await this.doState(key + yesterday, valToday, descYesterday, unitYesterday, false);
411
443
  // await this.doState(key + today, 0, descToday, unitToday, false); // we don't need to reset autarky to 0 because it is calculated by reference values.
412
444
  // instead do the regular calc right after the change of day
413
445
  }
414
- this.log.debug("Updating Autarky " + day +" value for: " + key + today);
415
446
  // update today's value - but beware of div/0
416
- if (valHouseCons > 0) await this.doState(key + today, Number((((valPVGen - valGridExp - valBatCharge + valBatDischarge) / valHouseCons) * 100).toFixed(0)), descToday, unitToday, false);
447
+ var newVal = 0;
448
+ if (valHouseCons > 0) newVal = Number((((valPVGen - valGridExp - valBatCharge + valBatDischarge) / valHouseCons) * 100).toFixed(0));
449
+ this.log.silly("(Autarky) Updating Autarky " + day +" value for: " + key + today + ": " + newVal);
450
+ if (valHouseCons > 0) await this.doState(key + today, newVal, descToday, unitToday, false);
417
451
  }
418
452
 
419
453
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.senec",
3
- "version": "1.3.3",
3
+ "version": "1.3.6",
4
4
  "description": "Senec Home",
5
5
  "author": {
6
6
  "name": "NoBl",
@@ -24,30 +24,29 @@
24
24
  "url": "https://github.com/nobl/ioBroker.senec.git"
25
25
  },
26
26
  "dependencies": {
27
- "request": "^2.88.2",
27
+ "axios": "^0.25.0",
28
28
  "@iobroker/adapter-core": "^2.5.1"
29
29
  },
30
30
  "devDependencies": {
31
- "@alcalzone/release-script": "^3.5.2",
31
+ "@alcalzone/release-script": "^3.5.2",
32
32
  "@iobroker/testing": "^2.5.2",
33
33
  "@types/chai": "^4.3.0",
34
34
  "@types/chai-as-promised": "^7.1.4",
35
35
  "@types/gulp": "^4.0.9",
36
36
  "@types/mocha": "^9.0.0",
37
- "@types/node": "^17.0.17",
37
+ "@types/node": "^17.0.21",
38
38
  "@types/proxyquire": "^1.3.28",
39
39
  "@types/sinon": "^10.0.6",
40
40
  "@types/sinon-chai": "^3.2.8",
41
- "axios": "^0.25.0",
42
41
  "chai": "^4.3.6",
43
42
  "chai-as-promised": "^7.1.1",
44
- "eslint": "^8.8.0",
43
+ "eslint": "^8.10.0",
45
44
  "gulp": "^4.0.2",
46
- "mocha": "^9.1.3",
45
+ "mocha": "^9.2.1",
47
46
  "proxyquire": "^2.1.3",
48
47
  "sinon": "^12.0.1",
49
48
  "sinon-chai": "^3.7.0",
50
- "typescript": "~4.5.5"
49
+ "typescript": "~4.6.2"
51
50
  },
52
51
  "main": "main.js",
53
52
  "files": [