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.
- package/README.md +11 -0
- package/io-package.json +37 -13
- package/lib/state_attr.js +1541 -269
- package/lib/state_trans.js +282 -0
- package/main.js +88 -54
- package/package.json +7 -8
package/lib/state_trans.js
CHANGED
|
@@ -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
|
|
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
|
|
113
|
+
* Read from url via axios
|
|
114
114
|
* @param url to read from
|
|
115
115
|
* @param form to post
|
|
116
116
|
*/
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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":"","
|
|
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":"","
|
|
154
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
+
"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
|
-
"
|
|
27
|
+
"axios": "^0.25.0",
|
|
28
28
|
"@iobroker/adapter-core": "^2.5.1"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
|
-
|
|
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.
|
|
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.
|
|
43
|
+
"eslint": "^8.10.0",
|
|
45
44
|
"gulp": "^4.0.2",
|
|
46
|
-
"mocha": "^9.1
|
|
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.
|
|
49
|
+
"typescript": "~4.6.2"
|
|
51
50
|
},
|
|
52
51
|
"main": "main.js",
|
|
53
52
|
"files": [
|