iobroker.senec 1.3.0 → 1.3.4
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/LICENSE +3 -1
- package/README.md +17 -3
- package/io-package.json +67 -194
- package/lib/adapter-config.d.ts +18 -18
- package/lib/state_attr.js +848 -136
- package/lib/state_trans.js +282 -0
- package/lib/tools.js +99 -98
- package/main.js +104 -36
- package/package.json +34 -24
- package/CHANGELOG_old.md +0 -68
- package/admin/admin.d.ts +0 -93
- package/docs/de/README.md +0 -574
- package/docs/de/media/mainSettings.png +0 -0
- package/docs/en/README.md +0 -554
- package/docs/en/media/mainSettings.png +0 -0
- package/main.test.js +0 -30
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/lib/tools.js
CHANGED
|
@@ -1,99 +1,100 @@
|
|
|
1
1
|
const axios = require('axios').default;
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Tests whether the given variable is a real object and not an Array
|
|
5
|
+
* @param {any} it The variable to test
|
|
6
|
+
* @returns {it is Record<string, any>}
|
|
7
|
+
*/
|
|
8
|
+
function isObject(it) {
|
|
9
|
+
// This is necessary because:
|
|
10
|
+
// typeof null === 'object'
|
|
11
|
+
// typeof [] === 'object'
|
|
12
|
+
// [] instanceof Object === true
|
|
13
|
+
return Object.prototype.toString.call(it) === '[object Object]';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Tests whether the given variable is really an Array
|
|
18
|
+
* @param {any} it The variable to test
|
|
19
|
+
* @returns {it is any[]}
|
|
20
|
+
*/
|
|
21
|
+
function isArray(it) {
|
|
22
|
+
if (typeof Array.isArray === 'function') return Array.isArray(it);
|
|
23
|
+
return Object.prototype.toString.call(it) === '[object Array]';
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Translates text to the target language. Automatically chooses the right translation API.
|
|
28
|
+
* @param {string} text The text to translate
|
|
29
|
+
* @param {string} targetLang The target languate
|
|
30
|
+
* @param {string} [yandexApiKey] The yandex API key. You can create one for free at https://translate.yandex.com/developers
|
|
31
|
+
* @returns {Promise<string>}
|
|
32
|
+
*/
|
|
33
|
+
async function translateText(text, targetLang, yandexApiKey) {
|
|
34
|
+
if (targetLang === 'en') {
|
|
35
|
+
return text;
|
|
36
|
+
} else if (!text) {
|
|
37
|
+
return '';
|
|
38
|
+
}
|
|
39
|
+
if (yandexApiKey) {
|
|
40
|
+
return translateYandex(text, targetLang, yandexApiKey);
|
|
41
|
+
} else {
|
|
42
|
+
return translateGoogle(text, targetLang);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Translates text with Yandex API
|
|
48
|
+
* @param {string} text The text to translate
|
|
49
|
+
* @param {string} targetLang The target languate
|
|
50
|
+
* @param {string} apiKey The yandex API key. You can create one for free at https://translate.yandex.com/developers
|
|
51
|
+
* @returns {Promise<string>}
|
|
52
|
+
*/
|
|
53
|
+
async function translateYandex(text, targetLang, apiKey) {
|
|
54
|
+
if (targetLang === 'zh-cn') {
|
|
55
|
+
targetLang = 'zh';
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const url = `https://translate.yandex.net/api/v1.5/tr.json/translate?key=${apiKey}&text=${encodeURIComponent(text)}&lang=en-${targetLang}`;
|
|
59
|
+
/** @type {any} */
|
|
60
|
+
const response = await axios({url, timeout: 15000});
|
|
61
|
+
if (response.data && response.data.text && isArray(response.data.text)) {
|
|
62
|
+
return response.data.text[0];
|
|
63
|
+
}
|
|
64
|
+
throw new Error('Invalid response for translate request');
|
|
65
|
+
} catch (e) {
|
|
66
|
+
throw new Error(`Could not translate to "${targetLang}": ${e}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Translates text with Google API
|
|
72
|
+
* @param {string} text The text to translate
|
|
73
|
+
* @param {string} targetLang The target languate
|
|
74
|
+
* @returns {Promise<string>}
|
|
75
|
+
*/
|
|
76
|
+
async function translateGoogle(text, targetLang) {
|
|
77
|
+
try {
|
|
78
|
+
const url = `http://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=${targetLang}&dt=t&q=${encodeURIComponent(text)}&ie=UTF-8&oe=UTF-8`;
|
|
79
|
+
const response = await axios({url, timeout: 15000});
|
|
80
|
+
if (isArray(response.data)) {
|
|
81
|
+
// we got a valid response
|
|
82
|
+
return response.data[0][0][0];
|
|
83
|
+
}
|
|
84
|
+
throw new Error('Invalid response for translate request');
|
|
85
|
+
} catch (e) {
|
|
86
|
+
if (e.response && e.response.status === 429) {
|
|
87
|
+
throw new Error(
|
|
88
|
+
`Could not translate to "${targetLang}": Rate-limited by Google Translate`
|
|
89
|
+
);
|
|
90
|
+
} else {
|
|
91
|
+
throw new Error(`Could not translate to "${targetLang}": ${e}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
module.exports = {
|
|
97
|
+
isArray,
|
|
98
|
+
isObject,
|
|
99
|
+
translateText
|
|
100
|
+
};
|