-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathecoflow-connector_v115.txt
2514 lines (2398 loc) · 122 KB
/
ecoflow-connector_v115.txt
1
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/**
* ecoflow-connector.js
* Version: 1.1.5
* Release date: 02.10.2023
* Autor: Waly_de
* Forum: https://forum.iobroker.net/topic/66743/ecoflow-connector-script-zur-dynamischen-leistungsanpassung
*
* This JavaScript file establishes a simple connection between IOBroker and EcoFlow.
* It automatically creates known states under 0_userdata.
*
* Please note that adjustments in the ConfigData section are required. Here, you need to enter your access credentials
* used for the EcoFlow app, as well as the serial numbers of your devices.
*
* If you have a state that displays the current power consumption (SmartmeterID), please provide it as well.
* This value will be used to dynamically adjust the Powerstream's feed-in power.
*
* Not all parameters of the Powerstream data are known yet. All known parameters will be automatically created as states.
* By modifying the "protoSource" constant, newly discovered data will also be automatically created.
*
* The raw data of the interface is logged as a HEX string.
*
* Please exercise caution as this is the initial version of the script. Use it at your own risk!
*
* Requirements:
* - Install protobuf. Simply add these libs to your javascript instance configuration (Zusätzliche NPM-Module)
* - The "Paho MQTT Client" is also required. If not already installed, use the javascript instance configuration.
*
*
* Note: It is encouraged to discover and publish missing data definitions to improve the script.
* Suggestions, optimizations, and extensions are welcome at any time.
*
* Special thanks to all contributors for their valuable input and support.
*
* Unterstütze das Projekt 'ecoflow-connector'
* Wenn dir das Script zur dynamischen Leistungsanpassung für den IObroker gefällt und du es nützlich findest,
* ziehe bitte in Erwägung, eine kleine Spende via PayPal zu hinterlassen.
* Jeder Beitrag hilft, das Projekt am Laufen zu halten und weitere Updates zu ermöglichen.
* Danke für deine Unterstützung!
* https://www.paypal.com/donate/?hosted_button_id=4J7JDDALF3N5L
*
*
* Changelog:
* -----------------------------------------------------------
* (0.4) 29.06.2023
* Da der MQTT von ecoflow regelmäßig aufhört zu senden, vor allem, wenn die App genutzt und komplett geschlossen wird,
* habe ich eine Überwachung der letzten ankommenden Nachrichten eingebaut. Kommt 5 Minuten lang nichts Neues vom PowerStream,
* wird die Verbindung zum MQTT komplett neu aufgebaut.
*
* Ein Fehler bei der Erstellung der States wurde beseitigt.
* -----------------------------------------------------------
* (0.5.2) 06.07.2023
* State sumPV hinzugefügt (Summe aus PV1 und PV2) = Solar-Leistung gesamt.
* Abweichung der PV Power von der App versucht zu kompensieren.
* Neuen State RealPower zur besseren Ermittlung der Einspeiseleistung angelegt. Zeigt den Verbrauch im Haus ohne Einspeisung.
* History für RealPower wird automatisch aktiviert.
* Die Koordinaten werden aus den Systemeinstellungen ermittelt (sonst einfach selbst angeben).
* Diverse kleine Anpassungen und Bugfixes.
* Es werden jetzt mehrere PowerStreams berücksichtigt. In der Konfiguration muss das Flag "isPowerStream" gesetzt werden.
* Gesteuert wird aber bisher nur der erste PowerStream.
* Die protoSource so angepasst, dass in "Item" enthaltene unbekannte Daten auch als State angelegt werden. Bitte helft mit zu identifizieren,
* was was ist. Dann können wir die Felder entsprechend benennen...
* Parameter "subscribe" bei der Gerätekonfiguration hinzugefügt. Damit lässt sich der Empfang von MQTT Telegrammen für das Gerät abstellen.
* Mein Delta Max hatte derart viel gesendet, dass der Raspi nicht mehr in der Lage war alles zu verarbeiten. Für die Steuerung braucht man die Daten der Batterie nicht.
* Nach Sonnenuntergang wird jetzt weniger oft reconnectet, wenn keine Daten mehr kommen.
* Reaktionszeiten für die Anpassung der Einspeisung wurden erhöht (30 Sekunden).
* State "totalPV" für die derzeitige komplette PV Leistung hinzugefügt.
* Funktion hinzugefügt, die die Einspeisung bei voller Batterie auf Maximum stellt. Ein- und Ausschaltprozent können mit battPozOn und battPozOff eingestellt werden.
* -----------------------------------------------------------
* (0.6.1) 26.07.2023
* ACHTUNG: Die Felddefinitionen für den Powerstream sind jetzt vollständig und an die von der Community ermittelten Daten angepasst.
* Das bedeutet aber leider auch, dass alle States mit neuen Namen neu angelegt werden. Die vom Script generierten States bleiben erhalten (SerAC, totalPV, sumPV).
*
* Für die Delta Max sind nun einige States auch zum Schreiben verfügbar. Die Delta muss dazu nicht unbedingt auf "subscribe: true" gestellt werden.
* Damit die States angelegt werden, müssen sie bei laufendem Script einmal in der App verändert werden. Möglich sind bisher:
* Beep, slowChgPower, ACPower, DCPower, USBPower, minDsgSoc, maxChgSoc, curr12VMax, standByModeMins, lcdTimeMins, ACstandByMins, openOilSoc, closeOilSoc.
*
* Ob diese States auch so bei anderen Deltas funktionieren, kann ich nicht sagen. Wenn nicht, solltet ihr im Log einen Eintrag finden: "Unbekannter Set Befehl:".
* Wenn ich diesen Eintrag mit einer kurzen Beschreibung erhalte, was es ist, kann ich es auch einbauen.
*
* Die States werden hier angelegt: 0_userdata.0.ecoflow.app_XXXXXXXXXXXXXXXXXXX_XXXXXXXXXXXXXXX_thing_property_set.writeables
*
* (0.6.7) 31.07.2023 *
* Writeables für Delta2 angelegt.
* totalPV / 10 geändert, damit ein echter Wattwert angezeigt wird.
* Anpassung für neues Datenformat nach diversen Updates von ecoflow.
* Diverse Optimierungen und Bugfixes.
*
* (0.6.8) 03.08.2023 *
* Neue Einstellung: "Regulation: false" zum Abstellen der Regulierung des PowerStreams (Read Only Modus).
* Anpassung an neues Format.
* Bugfixes.
*
* (1.0.0) 06.08.2023 *
* - Neuer State "lowestValue" zeigt die Grundlage zur Berechnung der Einspeiseleistung an und repräsentiert den niedrigsten Wert des realen Verbrauchs in den
* letzten mit "MinValueMin" eingestellten Minuten.
* - Neue Einstellung MinValueAg: Art der Ermittlung des kleinsten Wertes 0 = Minimalwert, 1 = Durchschnittswert.
* - Neues Feature: Wenn die volle Leistung (600w) in die Batterie geht, wird die Einspeiseleistung in Stufen erhöht, auch wenn dann
* Leistung ins Netz geht, um möglichst das volle Potenzial der vorhandenen Solarenergie zu nutzen.
* - Neue Einstellungen: lowBatLimitPozOn, lowBatLimitPozOff und lowBatLimit. Bei Unterschreiten der Batterieladung von "lowBatLimitPozOn" % ist die maximale Einspeiseleistung auf
* "lowBatLimit" W limitiert, bis der Ladezustand wieder bei "lowBatLimitPozOff" ist.
* - Neue Einstellungen: RegulationState. Frei wählbar. Wenn angegeben, kann mit diesem State die Regulation ein- und ausgeschaltet werden (Wird automatisch unterhalb 0_userdata.0.ecoflow angelegt).
* - Neue Einstellungen: RegulationOffPower. Wird die Regulation per State abgestellt, wird die Einspeiseleistung des ersten Powerstreams auf diesen Wert gesetzt. (-1 = keine Änderung).
*
* (1.0.1) 07.08.2023 *
* - Writeables auch für PowerStreams angelegt (SetDisplayBrightness, SetPrio (0=Stromversorgung, 1= Batterie ), SetBatLimitLow, SetBatLimitHigh, SetAC).Sie tauchen auf, wenn bei laufendem Script per App geändert wird.
* - Verbesserung der Reguierung
*
* (1.0.2) 09.08.2023 *
* - Unterstützung für SmartPlugs. Bisher ein Writeable: SwitchPlug mit den Werten 0= AUS und 1= AN
* - Bugfix und Optimierungen
*
* (1.1.2) 17.08.2023 *
* - Breaking Changes bei der Konfiguration. Viele Daten sind jetzt zu den einzelnen PowerStream gewandert.
* - Unterstützung der Steuerung von mehreren PowerStream in 2 Modes (Balance und Serial)
* Balance: die PS werden nacheinander angesprochen, dabei versucht jeder Einzelne für sich den Bedarf zu decken.
* Serial: Der Bedarf wird in der Reihenfolge der Konfiguration verteilt. Erst wenn der erste es nicht mehr schafft den Bedarf zu decken, wird der Nächste hinzugezogen
* - Automatisches Wechseln in den Batterieprioritätsmodus. battOnSwitchPrio: true/false wenn battPozOn erreicht ist
* - Festlegen des Gerätetyps bei der Konfiguration. Typ: Powerstrem:"PS"; DeltaMax:"DM"; DeltaMax2: "DM2"; SmartPlug: "SM"; Andere: "NA"
*
* (1.1.3.2) 31.08.2023 *
* - 0 bei MinValueMin greift auf Echtzeitdaten (Realpower) zu. (nicht empfohlen)
* - Neue Writeables für den Delta 2 Max: quietCfg,ACenabled,maxChgSoc,minDsgSoc,bpPowerSoc,fastChgWatts,slowChgWatts,chgPauseFlag,dcChgCfg,dcChgCfg2,USB,12VDC,smartgenClose,smartgenOpen,standbyTime,lcdTime
* - Eigene Bezeichnung für den Delta 2 Max (D2M)
* - Achtung neue Bezeichnungen für Typen: Powerstrem:"PS"; DeltaMax:"DM"; Delta2: "D2" ; Delta2 Max: "D2M"; SmartPlug: "SM"; Andere: "NA"
* - RegulationOffPower ist in die Powerstream-Einstellungen gewandert und kann für jeden PS einzeln eingestellt werden.
* - RegulationState schaltet jetzt RegulationOffPower für alle PS einzeln
* - RegulationOffPower: -2 schaltet den PS in den Batterie-Prioritätsmodus wenn über RegulationState abgestellt wird
* - Neue Einstellung für PS: prioOffOnDemand: Wattwert des Bedarfs, bei dem dem zurück in den Strom-Priomodus geschaltet wird. 0 für kein Rückschalten.
* - Verschiedene Optimierungen
*
* * (1.1.4.1) 23.09.2023
* - Neue Einstellung: "AdditionalPower": Wenn es weitere Wechselrichter gibt, die in ioBroker erfasst werden, können diese hier angelegt werden.
* Die Leistung wird dann für die Berechnung von "Realpower" berücksichtigt.
* - Delta 2 Max "Writeables" erneut überarbeitet (Danke an Ponti92 aus dem ioBroker-Forum).
* - "Maxpower" ist jetzt in den Einstellungen für jeden einzelnen PS verfügbar.
* - Komplett neues Regelwerk zum Einstellen und Verteilen der Einspeiseleistung auf mehrere PS:
* Im "Balance Mode" wird zunächst nur die verfügbare PV-Leistung aller PS eingespeist; erst danach wird aus den Batterien entnommen. Dabei richtet sich die
* Entladeleistung nach dem Ladestand der Batterien. Alle PS werden bei einem Messintervall gleichzeitig geregelt.
* - "battOnSwitchPrio" überarbeitet und verbessert.
* - SmartPlugs sollten nun bei Verwendung den Regelprozess nicht mehr komplett verwirren.
* - Für SmartPlugs gibt es nun auch historische Leistungsdaten in den Objekten.
* - Auch für PS wurden die historischen Leistungsdaten neu angelegt. Die Interpretation dieser Daten steht noch aus. Vielleicht möchte das einer von euch machen?
* - Neue Einstellung: "SmartmeterTimeoutMin" und "SmartmeterFallbackPower". Wenn der letzte Wert vom Smartmeter älter als "SmartmeterTimeoutMin" ist, wird das Skript mit
* "SmartmeterFallbackPower" als aktuellem Realpowerwert weiterarbeiten, bis wieder aktuelle Daten geliefert werden.
* - Bekannte Writeables werden nun automatisch angelegt, auch ohne dass sie in der App geändert werden müssen (voraussetzung ist die richtige Einstellung des Typs bei den Geräteeinstellungen)
* - Verschiedene Optimierungen und Bugfixes
*
* * (1.1.4.2) 26.09.2023
* - BugFix
* - Neuer Parameter: Zusatzpower_Offset: Zusatzpower startet ab einer Batterieladeleistung von MaxPower - Zusatzpower_Offset
*
* * (1.1.5) 02.10.2023
* - BugFix
* - externConfig Eingeführt um beliebige Einstellungspunkte über einen beliebigen States zu steuern
* - Wechsel des automatischen Priomodus fühestens alle 60 Sekunden, um dem PS Zeit für die Umstellung zu geben.
*
*/
// Systemkoordinaten werden versucht zu ermitteln und als Default den Variablen zugeordnet.
var latitude, logM = false
var longitude;
// Ermitteln des Standortes aus den Einstellungen.
getStandortKoordinaten()
/***************************************
********** YOUR DATA HERE ************
****************************************/
var ConfigData = {
email: "[email protected]", // Die App-Zugangsdaten von ecoFlow
passwort: "yourAppPasswort",
SmartmeterID: "sonoff.0.Stromzaehler1.MT175_P", // State, der den aktuellen Gesamtverbrauch in Watt anzeigt
seriennummern: [
//############# Diesen Abschnitt für jedes einzelne Gerät anlegen ################
{
seriennummer: "XXXXXXXXXXXXX", // Die Seriennummer des Gerätes
name: "PowerStream", // beliebiger Namen
MaxPower: 600, // Der höchstmögliche Wert in Watt für die Einspeiseleistung
subscribe: true, // "true": Alle Daten für dieses Gerät werden angefragt. "false": Es werden keine Statusdaten abgefragt
typ: "PS", // Welches Gerät ist es: Powerstrem:"PS"; DeltaMax:"DM"; Delta2: "D2" ; Delta2 Max: "D2M"; SmartPlug: "SM"; Andere: "NA"
// Parameter an hier nur für PowerStream.
regulation: true, // "true": Dieser PowerStream soll vom Script reguliert werden
RegulationOffPower: -1, // Wird die Regulation per State abgestellt, wird die Einspeiseleistung des ersten Powerstreams auf diesen Wert gesetzt (-1 = keine Änderung, -2 = Batterie Priomodus)
hasBat: true, // "true": Eine Batterie ist angeschlossen. Nur für PowerStream relevant.
battPozOn: 99, battPozOff: 94, // Wenn die Batterie bei battPozOn ist, Einspeisung auf MaxPower. Bei BattPozOff Normalbetrieb
battOnSwitchPrio: true, // "true": Bei battPozOn wird in den Batterie-Prioritätsmodus gewechselt
prioOffOnDemand: 30, // Wattwert des Bedarfs, bei dem zurück in den Strom-Priomodus gechaltet wird. 0 für kein Rückschalten.
lowBatLimitPozOn: 5, lowBatLimitPozOff: 15,// Bei Unterschreiten der Batterieladung von "lowBatLimitPozOn" % ist die maximale Einspeiseleistung auf
lowBatLimit: 150, // "lowBatLimit" limitiert, bis der Ladezustand wieder bei "lowBatLimitPozOff" ist
},
//#######################################################################
{
seriennummer: "XXXXXXXXXXXXX",
name: "DELTA Max",
typ: "DM",
subscribe: false, // "true": Alle Daten für dieses Gerät werden angefragt. "false": Es werden keine Statusdaten abgefragt
},
//#######################################################################
{
seriennummer: "XXXXXXXXXXXXX",
name: "SmartPlug 1",
typ: "SM",
subscribe: true, // "true": Alle Daten für dieses Gerät werden angefragt. "false": Es werden keine Statusdaten abgefragt
},
//#######################################################################
],
AdditionalPower: [ // Wenn es weitere Wechselrichter gibt, die in IOBroker erfasst werden, können diese hier Angelegt werden
//############# Diesen Abschnitt für jedes einzelne Gerät anlegen ################
{
name: "Hoymiles2000", // Beliebiger Name
id: "mqtt.0.solar.1234567890.0.power" // Der Objektpfad zu dem Leistungswert in Watt (W)
},
//#######################################################################
],
//****************************************
// Erweiterte Einstellungen:
//****************************************
SmartmeterTimeoutMin: 4, // Wenn der letzte Wert vom Smartmeter älter als "SmartmeterTimeoutMin" ist, wird das Script mit...
SmartmeterFallbackPower: 150, // SmartmeterFallbackPower als aktuellem Realpowerwert weiter arbeiten, bis wieder aktuelle Daten geliefert werden.
Regulation: true, // 'false' stellt das Setzen der Einspeiseleistung ab
RegulationState: "Regulate", // Wenn angegeben, kann mit diesem State die Regulation ein- und ausgeschaltet werden (Wird automatisch unter 0_userdata.0.ecoflow angelegt)
RegulationMultiPsMode: 0, // Wenn mehrere PS reguliert werden sollen. "balance" = 0 oder "serial" = 1
BasePowerOffset: 30, // Wird vom aktuellen Verbrauch abgezogen, um die Einspeiseleistung zu berechnen
Zusatzpower_Offset: 10, // Zusatzpower startet ab einer Batterieladeleistung von MaxPower - Zusatzpower_Offset
MinValueMin: 3, // Der Zeitraum in Minuten, aus dem der niedrigste Gesamtverbrauchswert geholt werden soll. 0 für Echtzeitwert
MinValueAg: 0, // Art der Ermittlung des kleinsten Wertes: 0 = Minimalwert, 1 = Durchschnittswert
ReconnectMin: 30, // Zeit in Minuten, nach der die Anwendung neu gestartet wird, wenn keine neuen Daten eintreffen
statesPrefix: "0_userdata.0.ecoflow", // Hier werden die ecoFlow States angelegt
latitude: latitude, // Breitengrad des Standortes (wird automatisch eingesetzt)
longitude: longitude, // Längengrad des Standortes (wird automatisch eingesetzt)
//****************************************
// Überschuss Ladung:
//****************************************
ExcessCharge: false, //
ExcessChargePowerID: "0_userdata.0.ecoflow.app_xxxxxxxxxxxxxxxxxxxx_DAxxxxxxxxxxxxxxxxxx_thing_property_set.writeables.slowChgPower",
ExcessChargeSwitchID: "hm-rpc.3.xxxxxxxxxxxxxxxxxx.3.STATE",
ExcessChargeSwitchOn: true,
ExcessChargeSwitchOff: false,
ExcessChargeSwitchMin: 10,
ExcessChargeMaxPower: 1500,
ExcessChargeStartPower: 50,
ExcessChargeStartPowerDurationMin: 5,
//****************************************
Debug: false,
PlotCmdID: 99999,
}
//***************************************/
//***************************************/
// EXTERNE STATES zum Manipulieren von Configurationsvariablen
var externConfig = [
//############# Diesen Abschnitt für jeden einzelne Wert anlegen ################
{
VarName: "seriennummern[0].lowBatLimitPozOn", //Variabelname aus "ConfigData" bei Aufzählungen [0...X] in der Reigenfolge der Angaben
id: "0_userdata.0.ecoflow.ExStateTest" //Das Objekt (State) das den Wert für diese Variable enthalten soll
},
//#######################################################################
];
//#######################################################################
// Funktion zum Setzen einer verschachtelten Eigenschaft in einem Objekt
function setNestedProperty(obj, path, value) {
let keys = path.split('.');
let lastKey = keys.pop();
let tempObj = obj;
keys.forEach(key => {
if (key.match(/\[\d+\]/)) {
let index = parseInt(key.match(/\[(\d+)\]/)[1]);
key = key.split('[')[0];
tempObj = tempObj[key][index];
} else {
tempObj = tempObj[key];
}
});
tempObj[lastKey] = value;
}
function setConfigValueFromId(VarName, id) {
if (isState2(id)) {
let value = getState(id).val; // Wert von ioBroker abrufen
setNestedProperty(ConfigData, VarName, value); // Wert in ConfigData setzen
}
}
// Initialisierung bei Programmstart
externConfig.forEach(config => {
setConfigValueFromId(config.VarName, config.id);
});
// Änderungen während der Laufzeit überwachen
externConfig.forEach(config => {
if (isState2(config.id)) {
on(config.id, function (obj) {
setConfigValueFromId(config.VarName, obj.id);
log("ExternesEvent:" + obj.id + " : " + config.VarName + ":" + obj.state.val)
});
}
});
//#######################################################################
//setStateNE(ConfigData.statesPrefix + ".Settings.ConfigData", ConfigData)
const LogAllHeader = false //"HW"
const protoSource2 = `
syntax = "proto3";
message Message {
repeated Header header = 1 ;
bytes payload = 2;
}
message Header {
bytes pdata = 1 [proto3_optional = false];
int32 src = 2 [proto3_optional = true];
int32 dest = 3 [proto3_optional = true];
int32 d_src = 4 [proto3_optional = true];
int32 d_dest = 5 [proto3_optional = true];
int32 enc_type = 6 [proto3_optional = true];
int32 check_type = 7 [proto3_optional = true];
int32 cmd_func = 8 [proto3_optional = true];
int32 cmd_id = 9 [proto3_optional = true];
int32 data_len = 10 [proto3_optional = true];
int32 need_ack = 11 [proto3_optional = true];
int32 is_ack = 12 [proto3_optional = true];
int32 seq = 14 [proto3_optional = true];
int32 product_id = 15 [proto3_optional = true];
int32 version = 16 [proto3_optional = true];
int32 payload_ver = 17 [proto3_optional = true];
int32 time_snap = 18 [proto3_optional = true];
int32 is_rw_cmd = 19 [proto3_optional = true];
int32 is_queue = 20 [proto3_optional = true];
int32 ack_type = 21 [proto3_optional = true];
string code = 22 [proto3_optional = true];
string from = 23 [proto3_optional = true];
string module_sn = 24 [proto3_optional = true];
string device_sn = 25 [proto3_optional = true];
}
message InverterHeartbeat {
optional uint32 inv_err_code = 1;
optional uint32 inv_warn_code = 3;
optional uint32 pv1_err_code = 2;
optional uint32 pv1_warn_code = 4;
optional uint32 pv2_err_code = 5;
optional uint32 pv2_warning_code = 6;
optional uint32 bat_err_code = 7;
optional uint32 bat_warning_code = 8;
optional uint32 llc_err_code = 9;
optional uint32 llc_warning_code = 10;
optional uint32 pv1_statue = 11;
optional uint32 pv2_statue = 12;
optional uint32 bat_statue = 13;
optional uint32 llc_statue = 14;
optional uint32 inv_statue = 15;
optional int32 pv1_input_volt = 16;
optional int32 pv1_op_volt = 17;
optional int32 pv1_input_cur = 18;
optional int32 pv1_input_watts = 19;
optional int32 pv1_temp = 20;
optional int32 pv2_input_volt = 21;
optional int32 pv2_op_volt = 22;
optional int32 pv2_input_cur = 23;
optional int32 pv2_input_watts = 24;
optional int32 pv2_temp = 25;
optional int32 bat_input_volt = 26;
optional int32 bat_op_volt = 27;
optional int32 bat_input_cur = 28;
optional int32 bat_input_watts = 29;
optional int32 bat_temp = 30;
optional uint32 bat_soc = 31;
optional int32 llc_input_volt = 32;
optional int32 llc_op_volt = 33;
optional int32 llc_temp = 34;
optional int32 inv_input_volt = 35;
optional int32 inv_op_volt = 36;
optional int32 inv_output_cur = 37;
optional int32 inv_output_watts = 38;
optional int32 inv_temp = 39;
optional int32 inv_freq = 40;
optional int32 inv_dc_cur = 41;
optional int32 bp_type = 42;
optional int32 inv_relay_status = 43;
optional int32 pv1_relay_status = 44;
optional int32 pv2_relay_status = 45;
optional uint32 install_country = 46;
optional uint32 install_town = 47;
optional uint32 permanent_watts = 48;
optional uint32 dynamic_watts = 49;
optional uint32 supply_priority = 50;
optional uint32 lower_limit = 51;
optional uint32 upper_limit = 52;
optional uint32 inv_on_off = 53;
optional uint32 wireless_err_code = 54;
optional uint32 wireless_warn_code = 55;
optional uint32 inv_brightness = 56;
optional uint32 heartbeat_frequency = 57;
optional uint32 rated_power = 58;
}
message InverterHeartbeat2 {
int32 X_Unknown_1 = 1;
int32 X_Unknown_2 = 2;
int32 X_Unknown_3 = 3;
int32 X_Unknown_4 = 4;
int32 X_Unknown_5 = 5;
int32 X_Unknown_6 = 6;
int32 X_Unknown_7 = 7;
int32 X_Unknown_8 = 8;
int32 X_Unknown_9 = 9;
int32 X_Unknown_10 = 10;
int32 X_Unknown_11 = 11;
int32 X_Unknown_12 = 12;
int32 X_Unknown_13 = 13;
int32 X_Unknown_14 = 14;
int32 X_Unknown_15 = 15;
int32 X_Unknown_16 = 16;
int32 X_Unknown_17 = 17;
int32 X_Unknown_18 = 18;
int32 X_Unknown_19 = 19;
int32 X_Unknown_20 = 20;
int32 X_Unknown_21 = 21;
int32 X_Unknown_22 = 22;
int32 X_Unknown_23 = 23;
int32 X_Unknown_24 = 24;
int32 X_Unknown_25 = 25;
int32 X_Unknown_26 = 26;
int32 X_Unknown_27 = 27;
int32 X_Unknown_28 = 28;
int32 X_Unknown_29 = 29;
int32 X_Unknown_30 = 30;
int32 X_Unknown_31 = 31;
int32 X_Unknown_32 = 32;
int32 X_Unknown_33 = 33;
int32 X_Unknown_34 = 34;
int32 X_Unknown_35 = 35;
int32 X_Unknown_36 = 36;
int32 X_Unknown_37 = 37;
int32 X_Unknown_38 = 38;
int32 X_Unknown_39 = 39;
int32 X_Unknown_40 = 40;
int32 X_Unknown_41 = 41;
int32 X_Unknown_42 = 42;
int32 X_Unknown_43 = 43;
int32 X_Unknown_44 = 44;
int32 X_Unknown_45 = 45;
int32 X_Unknown_46 = 46;
int32 X_Unknown_47 = 47;
int32 X_Unknown_48 = 48;
int32 X_Unknown_49 = 49;
int32 X_Unknown_50 = 50;
int32 X_Unknown_51 = 51;
int32 X_Unknown_52 = 52;
}
message setMessage {
setHeader header = 1;
}
message setHeader {
setValue pdata = 1 [proto3_optional = true];
int32 src = 2 [proto3_optional = true];
int32 dest = 3 [proto3_optional = true];
int32 d_src = 4 [proto3_optional = true];
int32 d_dest = 5 [proto3_optional = true];
int32 enc_type = 6 [proto3_optional = true];
int32 check_type = 7 [proto3_optional = true];
int32 cmd_func = 8 [proto3_optional = true];
int32 cmd_id = 9 [proto3_optional = true];
int32 data_len = 10 [proto3_optional = true];
int32 need_ack = 11 [proto3_optional = true];
int32 is_ack = 12 [proto3_optional = true];
int32 seq = 14 [proto3_optional = true];
int32 product_id = 15 [proto3_optional = true];
int32 version = 16 [proto3_optional = true];
int32 payload_ver = 17 [proto3_optional = true];
int32 time_snap = 18 [proto3_optional = true];
int32 is_rw_cmd = 19 [proto3_optional = true];
int32 is_queue = 20 [proto3_optional = true];
int32 ack_type = 21 [proto3_optional = true];
string code = 22 [proto3_optional = true];
string from = 23 [proto3_optional = true];
string module_sn = 24 [proto3_optional = true];
string device_sn = 25 [proto3_optional = true];
}
message setValue {
optional int32 value = 1;
}
message permanent_watts_pack {
optional int32 permanent_watts = 1;
}
message supply_priority_pack {
optional int32 supply_priority = 1;
}
message bat_lower_pack {
optional int32 lower_limit = 1;
}
message bat_upper_pack {
optional int32 upper_limit = 1;
}
message PowerItem {
optional uint32 timestamp = 1;
optional sint32 timezone = 2;
optional uint32 inv_to_grid_power = 3;
optional uint32 inv_to_plug_power = 4;
optional int32 battery_power = 5;
optional uint32 pv1_output_power = 6;
optional uint32 pv2_output_power = 7;
}
message PowerPack2 {
optional uint32 sys_seq = 1;
repeated PowerItem EnergyItem = 2;
}
message PowerPack32 {
optional uint32 sys_seq = 1;
repeated EnergyItem EnergyItem = 2;
}
message PowerPack133 {
optional uint32 sys_seq = 1;
repeated EnergyItem EnergyItem = 2;
}
message PowerPack138 {
optional uint32 sys_seq = 1;
repeated PowerItem EnergyItem = 2;
}
message PowerPack135 {
optional uint32 sys_seq = 1;
repeated PowerItem EnergyItem = 2;
}
message PowerPack136 {
optional uint32 sys_seq = 1;
repeated PowerItem EnergyItem = 2;
}
message PowerPack {
optional uint32 sys_seq = 1;
repeated PowerItem sys_power_stream = 2;
}
message PowerAckPack {
optional uint32 sys_seq = 1;
}
message node_massage {
optional string sn = 1;
optional bytes mac = 2;
}
message mesh_child_node_info {
optional uint32 topology_type = 1;
optional uint32 mesh_protocol = 2;
optional uint32 max_sub_device_num = 3;
optional bytes parent_mac_id = 4;
optional bytes mesh_id = 5;
repeated node_massage sub_device_list = 6;
}
message EnergyItem {
optional uint32 timestamp = 1;
optional uint32 watth_type = 2;
repeated uint32 watth = 3;
}
message EnergyTotalReport {
optional uint32 watth_seq = 1;
optional EnergyItem watth_item = 2;
}
message BatchEnergyTotalReport {
optional uint32 watth_seq = 1;
repeated EnergyItem watth_item = 2;
}
message EnergyTotalReportAck {
optional uint32 result = 1;
optional uint32 watth_seq = 2;
optional uint32 watth_type = 3;
}
message EventRecordItem {
optional uint32 timestamp = 1;
optional uint32 sys_ms = 2;
optional uint32 event_no = 3;
repeated float event_detail = 4;
}
message EventRecordReport {
optional uint32 event_ver = 1;
optional uint32 event_seq = 2;
repeated EventRecordItem event_item = 3;
}
message EventInfoReportAck {
optional uint32 result = 1;
optional uint32 event_seq = 2;
optional uint32 event_item_num = 3;
}
message ProductNameSet {
optional string name = 1;
}
message ProductNameSetAck {
optional uint32 result = 1;
}
message ProductNameGet {}
message ProductNameGetAck {
optional string name = 3;
}
message RTCTimeGet {}
message RTCTimeGetAck {
optional uint32 timestamp = 1;
optional int32 timezone = 2;
}
message RTCTimeSet {
optional uint32 timestamp = 1;
optional int32 timezone = 2 [(nanopb).default = 0];
}
message RTCTimeSetAck {
optional uint32 result = 1;
}
message country_town_message {
optional uint32 country = 1;
optional uint32 town = 2;
}
message time_task_config {
optional uint32 task_index = 1;
optional time_range_strategy time_range = 2;
optional uint32 type = 3;
}
message time_task_delet {
optional uint32 task_index = 1;
}
message time_task_config_post {
optional time_task_config task1 = 1;
optional time_task_config task2 = 2;
optional time_task_config task3 = 3;
optional time_task_config task4 = 4;
optional time_task_config task5 = 5;
optional time_task_config task6 = 6;
optional time_task_config task7 = 7;
optional time_task_config task8 = 8;
optional time_task_config task9 = 9;
optional time_task_config task10 = 10;
optional time_task_config task11 = 11;
}
message time_task_config_ack {
optional uint32 task_info = 1;
}
message rtc_data {
optional int32 week = 1 [(nanopb).default = 0];
optional int32 sec = 2 [(nanopb).default = 0];
optional int32 min = 3 [(nanopb).default = 0];
optional int32 hour = 4 [(nanopb).default = 0];
optional int32 day = 5 [(nanopb).default = 0];
optional int32 month = 6 [(nanopb).default = 0];
optional int32 year = 7 [(nanopb).default = 0];
}
message time_range_strategy {
optional bool is_config = 1;
optional bool is_enable = 2;
optional int32 time_mode = 3;
optional int32 time_data = 4;
optional rtc_data start_time = 5;
optional rtc_data stop_time = 6;
}
message plug_ack_message {
optional uint32 ack = 1;
}
message plug_heartbeat_pack {
optional uint32 err_code = 1 [(nanopb).default = 0];
optional uint32 warn_code = 2 [(nanopb).default = 0];
optional uint32 country = 3 [(nanopb).default = 0];
optional uint32 town = 4 [(nanopb).default = 0];
optional int32 max_cur = 5 [(nanopb).default = 0];
optional int32 temp = 6 [(nanopb).default = 0];
optional int32 freq = 7 [(nanopb).default = 0];
optional int32 current = 8 [(nanopb).default = 0];
optional int32 volt = 9 [(nanopb).default = 0];
optional int32 watts = 10 [(nanopb).default = 0];
optional bool switch = 11 [(nanopb).default = false];
optional int32 brightness = 12 [(nanopb).default = 0];
optional int32 max_watts = 13 [(nanopb).default = 0];
optional int32 heartbeat_frequency = 14 [(nanopb).default = 0];
optional int32 mesh_enable = 15 [(nanopb).default = 0];
}
message plug_switch_message {
optional uint32 plug_switch = 1;
}
message brightness_pack {
optional int32 brightness = 1 [(nanopb).default = 0];
}
message max_cur_pack {
optional int32 max_cur = 1 [(nanopb).default = 0];
}
message max_watts_pack {
optional int32 max_watts = 1 [(nanopb).default = 0];
}
message mesh_ctrl_pack {
optional uint32 mesh_enable = 1 [(nanopb).default = 0];
}
message ret_pack {
optional bool ret_sta = 1 [(nanopb).default = false];
}
enum CmdFunction {
Unknown = 0;
PermanentWattsPack = 129;
SupplyPriorityPack = 130;
}
`;
const writeables = [
//PowerStream
{ id: 1, name: 'InverterHeartbeat', Typ: 'PS', Templet: 'InverterHeartbeat', writeable: false, cmdFunc: 20 },
{ id: 4, name: 'InverterHeartbeat2', Typ: 'PS', Templet: 'InverterHeartbeat2', writeable: false, cmdFunc: 20 },
{ id: 11, name: 'Ping', Typ: 'PS', Templet: 'setValue', writeable: false, cmdFunc: 32 },
{ id: 32, name: 'PowerPack_32', Typ: 'PS', Templet: 'PowerPack32', writeable: false, Ignor: true, cmdFunc: 254 },
{ id: 134, name: 'Ignor', Typ: 'PS', Templet: '', writeable: false, Ignor: true, cmdFunc: 20 },
{ id: 135, name: 'SetDisplayBrightness', Typ: 'PS', Templet: 'setValue', writeable: true, ValueName: 'value', Ignor: false, cmdFunc: 20 },
{ id: 136, name: 'PowerPack_136', Typ: 'PS', Templet: 'PowerPack136', writeable: false, cmdFunc: 20 },
{ id: 138, name: 'PowerPack_138', Typ: 'PS', Templet: 'PowerPack138', writeable: false, cmdFunc: 20 },
{ id: 130, name: 'SetPrio', Typ: 'PS', Templet: 'setValue', writeable: true, ValueName: 'value', cmdFunc: 20 },
{ id: 132, name: 'SetBatLimitLow', Typ: 'PS', Templet: 'setValue', writeable: true, ValueName: 'value', cmdFunc: 20 },
{ id: 133, name: 'SetBatLimitHigh', Typ: 'PS', Templet: 'setValue', writeable: true, ValueName: 'value', cmdFunc: 20 },
{ id: 129, name: 'SetAC', Typ: 'PS', Templet: 'setValue', writeable: true, ValueName: 'value', cmdFunc: 20 },
//Delta Max
{ id: 38, name: 'Beep', ValueName: 'enabled', Typ: 'DM' },
{ id: 69, name: 'slowChgPower', ValueName: 'slowChgPower', Typ: 'DM' },
{ id: 66, name: 'ACPower', ValueName: 'enabled', Typ: 'DM' },
{ id: 66, name: 'xboost', ValueName: 'xboost', Typ: 'DM' },
{ id: 81, name: 'DCPower', ValueName: 'enabled', Typ: 'DM' },
{ id: 34, name: 'USBPower', ValueName: 'enabled', Typ: 'DM' },
{ id: 51, name: 'minDsgSoc', ValueName: 'minDsgSoc', Typ: 'DM' },
{ id: 49, name: 'maxChgSoc', ValueName: 'maxChgSoc', Typ: 'DM' },
{ id: 71, name: 'curr12VMax', ValueName: 'currMa', Typ: 'DM' },
{ id: 33, name: 'standByModeMins', ValueName: 'standByMode', Typ: 'DM' },
{ id: 49, name: 'lcdTimeMins', ValueName: 'lcdTime', Typ: 'DM' },
{ id: 153, name: 'ACstandByMins', ValueName: 'standByMins', Typ: 'DM' },
{ id: 52, name: 'openOilSoc', ValueName: 'openOilSoc', Typ: 'DM' },
{ id: 53, name: 'closeOilSoc', ValueName: 'closeOilSoc', Typ: 'DM' },
//Delta 2
{ id: 0, name: 'acChgCfg_D2', ValueName: 'chgWatts', Typ: 'D2', MT: 5, AddParam: '{"chgWatts":600,"chgPauseFlag":255}' },
{ id: 0, name: 'acOutCfg_D2', ValueName: 'enabled', Typ: 'D2', MT: 3 },
{ id: 0, name: 'dcOutCfg_D2', ValueName: 'enabled', Typ: 'D2', MT: 1 },
{ id: 0, name: 'quietMode_D2', ValueName: 'enabled', Typ: 'D2', MT: 5 },
{ id: 0, name: 'dcChgCfg_D2', ValueName: 'dcChgCfg', Typ: 'D2', MT: 5 },
//Delta 2 Max
{ id: 0, name: 'quietCfg', ValueName: 'enabled', Typ: 'D2M', MT: 1, OT: 'quietCfg' }, // 0 = Piepen ein, 1 = Piepen aus
{ id: 0, name: 'xboost', ValueName: 'xboost', Typ: 'D2M', MT: 3, OT: 'acOutCfg', AddParam: '{"enabled":255,"out_freq":255,"out_voltage":4294967295,"xboost":0}' }, // 0 ist aus und 1 ist ein (default = 255)
{ id: 0, name: 'ACenabled', ValueName: 'enabled', Typ: 'D2M', MT: 3, OT: 'acOutCfg', AddParam: '{"enabled":0,"out_freq":255,"out_voltage":4294967295,"xboost":255}' }, // 0 ist aus und 1 ist ein (default = 255)
// xboost und ACenabled funktionieren zwar, aber beim Setzen in der App des einen Parameters wird der andere Parameter in iobroker auf 255 gesetzt, was aber keine Auswirkungen hat
//
{ id: 0, name: 'maxChgSoc', ValueName: 'maxChgSoc', Typ: 'D2M', MT: 2, OT: 'upsConfig' }, // Ladegrenzwert -> dasselbe wie SetBatLimitHigh im PS
{ id: 0, name: 'minDsgSoc', ValueName: 'minDsgSoc', Typ: 'D2M', MT: 2, OT: 'dsgCfg' }, // Entladegrenzwert -> dasselbe wie SetBatLimitLow im PS
//
{ id: 0, name: 'bpPowerSoc', ValueName: 'bpPowerSoc', Typ: 'D2M', MT: 1, OT: 'watthConfig', AddParam: '{"bpPowerSoc":12,"minChgSoc":0,"isConfig":0,"minDsgSoc":0}' }, // Backup-Reserve Sicherung in %
{ id: 0, name: 'bpPowerEnable', ValueName: 'isConfig', Typ: 'D2M', MT: 1, OT: 'watthConfig', AddParam: '{"bpPowerSoc":12,"minChgSoc":0,"isConfig":0,"minDsgSoc":0}' }, // Enable Backup-Reserve
//
{ id: 0, name: 'slowChgWatts', ValueName: 'slowChgWatts', Typ: 'D2M', MT: 3, OT: 'acChgCfg', AddParam: '{"fastChgWatts":200, "slowChgWatts":255,"chgPauseFlag":0}' }, // Objekt angelegt, schreibbar
{ id: 0, name: 'chgPauseFlag', ValueName: 'chgPauseFlag', Typ: 'D2M', MT: 3, OT: 'acChgCfg', AddParam: '{"fastChgWatts":200, "slowChgWatts":255,"chgPauseFlag":0}' }, // TODO: chgPauseFlag testen, ob dann die Ladung pausiert
//
{ id: 0, name: 'dcChgCfg', ValueName: 'dcChgCfg', Typ: 'D2M', MT: 5, OT: 'dcChgCfg', AddParam: '{"dcChgCfg":0, "dcChgCfg2":0}' }, // Objekt angelegt, schreibbar, aber beide Eingänge werden gleichzeitig mit dem selben Wert geändert
{ id: 0, name: 'dcChgCfg2', ValueName: 'dcChgCfg2', Typ: 'D2M', MT: 5, OT: 'dcChgCfg', AddParam: '{"dcChgCfg":0, "dcChgCfg2":0}' }, // Hier genauso und die Werte sind 8000 (8A), 6000 (6A) und 4000 (4A)
//
{ id: 0, name: 'USB', ValueName: 'enabled', Typ: 'D2M', MT: 1, OT: 'dcOutCfg' }, // USB ein/aus
{ id: 0, name: '12VDC', ValueName: 'enabled', Typ: 'D2M', MT: 5, OT: 'mpptCar' }, // 12V Auto ein/aus
{ id: 0, name: 'smartgenClose', ValueName: 'closeOilSoc', Typ: 'D2M', MT: 2, OT: 'closeOilSoc' }, // Automatisches Einschalten des Smart Generators in %
{ id: 0, name: 'smartgenOpen', ValueName: 'openOilSoc', Typ: 'D2M', MT: 2, OT: 'openOilSoc' }, // Automatisches Ausschalten des Smart Generators in %
{ id: 0, name: 'standbyTime', ValueName: 'standbyMin', Typ: 'D2M', MT: 1, OT: 'standbyTime' }, // Geräte-Zeitüberschreitung (in min) 0 => Nie
{ id: 0, name: 'lcdTime', ValueName: 'delayOff', Typ: 'D2M', MT: 1, OT: 'lcdCfg', AddParam: '{"brighLevel":255}' }, // Bildschirm-Zeitüberschreitung (in Sekunden) 0 => Nie
{ id: 0, name: 'setRtcTime', Ignor: true, ValueName: 'sec', Typ: 'D2M', MT: 2, OT: 'setRtcTime', AddParam: '{"sec":4,"min": 13, "week": 3, "month": 9,"hour": 11,"year": 2023, "day":6}' }, // Ignorieren
// Smart Plugs
{ id: 2, name: 'PowerPack_2', Typ: 'SM', Templet: 'PowerPack2', writeable: false, ValueName: '', Ignor: false, cmdFunc: 2 },
{ id: 11, name: 'Ping', Typ: 'SM', Templet: 'setValue', writeable: false, cmdFunc: 32 },
{ id: 32, name: 'PowerPack_32', Typ: 'SM', Templet: 'PowerPack32', writeable: false, ValueName: '', Ignor: false, cmdFunc: 254 },
{ id: 133, name: 'PowerPack_133', Typ: 'SM', Templet: 'PowerPack133', writeable: false, ValueName: '', Ignor: true, cmdFunc: 2 },
{ id: 135, name: 'PowerPack_135', Typ: 'SM', Templet: 'PowerPack135', writeable: false, ValueName: '', Ignor: true, cmdFunc: 2 },
{ id: 1, name: 'plug_heartbeat_pack', Typ: 'SM', Templet: 'plug_heartbeat_pack', writeable: false, cmdFunc: 2 },
{ id: 129, name: 'SwitchPlug', Typ: 'SM', Templet: 'setValue', writeable: true, ValueName: 'value', cmdFunc: 2 },
];
const musterGetPS =
{
"header": {
"src": 32,
"dest": 32,
"seq": 1651831507,
"OS": "ios"
}
}
const musterSetAC = {
header: {
pdata: {
value: 1300,
},
src: 32,
dest: 53,
dSrc: 1,
dDest: 1,
checkType: 3,
cmdFunc: 20,
cmdId: 129,
dataLen: 3,
needAck: 1,
seq: 1651831507,
version: 19,
payloadVer: 1,
from: 'ios',
deviceSn: 'ABCxxxxxxx123'
}
};
const musterSetAC2 = {
header: {
pdata: {
value: 17477,
},
src: 32,
dest: 53,
dSrc: 1,
dDest: 1,
checkType: 3,
cmdFunc: 32,
cmdId: 11,
dataLen: 4,
needAck: 1,
seq: 1651831507,
version: 19,
payloadVer: 1,
from: 'ios',
deviceSn: 'ABCxxxxxxx123'
}
};
const musterslowChgPower = {
"from": "iOS",
"operateType": "TCP",
"id": "816376009",
"lang": "de-de",
"params":
{
"id": 69,
},
"version": "1.0"
};
const musterDelta2 = {
"from": "Android",
"id": "458115693",
"moduleType": 5,
"operateType": "acChgCfg",
"params":
{
}
, "version": "1.0"
}
const musterDELTA2MAX = {
"params":
{
},
"from": "iOS",
"lang": "de-de",
"id": "873106536",
"moduleSn": "XXXXXXXXXXXXXXXX",
"moduleType": 1,
"operateType": "quietCfg",
"version": "1.0"
}
// @ts-ignore
const mqtt = require('mqtt');
const https = require('https');
// @ts-ignore
const protobuf = require("protobufjs");
// Verbindungsstatus speichern
let isMqttConnected = false;
const mqttDaten = {
UserID: '',
User: '',
Passwort: '',
URL: '',
Port: '',
protocol: '',
clientID: ''
}
// Initialisiere die Globalen variablen
const GlobalObj = {}
//Die erste PowerStream ermitteln
let firstPsSn = ConfigData.seriennummern[0].seriennummer;
let firstPsSnIndex = -1
GetNextAsn()
//log("firstPsSn: " + GetNextAsn())
function GetNextAsn() {
if (ConfigData.RegulationMultiPsMode == 1) {
//return firstPsSn
firstPsSnIndex = -1
}
var length = ConfigData.seriennummern.length;
for (var j = 0; j < length; j++) {
var i = (firstPsSnIndex + j + 1) % length;
if (ConfigData.seriennummern[i].typ == "PS" && ConfigData.seriennummern[i].regulation && ConfigData.seriennummern[i].seriennummer != "XXXXXXXXXXXXX") {
firstPsSn = ConfigData.seriennummern[i].seriennummer;
firstPsSnIndex = i
break;
}
}
//log("GetNextAsn:" + firstPsSn + " Index:" + firstPsSnIndex)
return firstPsSn
}
/*=======================================================
========= Timer ============
=======================================================*/
//jede x Sekunden
var intervalID = setInterval(function () {
if (true || istTag()) {
CheckforReconnect(function () {
//SetBasePower(GetNextAsn());
SetBasePower()
});
} else {
////SetBasePower(firstPsSn);
}
}, 10 * 1000);
// Hartbeat der App simmulieren
var intervalID3 = setInterval(function () {
if (isMqttConnected) {
for (var i = 0; i < ConfigData.seriennummern.length; i++) {
if (ConfigData.seriennummern[i].typ == "PS" && ConfigData.seriennummern[i].seriennummer != "XXXXXXXXXXXXX") {
setmusterGetPS(ConfigData.seriennummern[i].seriennummer);
}
}
}
}, 32 * 1000);
/*
var intervalID2 = setInterval(function () {
getLowestValue(ConfigData.statesPrefix + ".RealPower", 2)
.then(lowestValue => {
log( "lowestValue:" + lowestValue)//
})
.catch((error) => {
console.warn('Fehler beim Abrufen des niedrigsten Werts:', error);
});
}, 2 * 1000);
//*/
// @ts-ignore
await getEcoFlowMqttData(ConfigData.email, ConfigData.passwort)
async function getEcoFlowMqttData(email, password) {
const options = {
hostname: 'api.ecoflow.com',
path: '/auth/login',
method: 'POST',
headers: {
'Host': 'api.ecoflow.com',
'lang': 'de-de',
'platform': 'android',
'sysversion': '11',
'version': '4.1.2.02',
'phonemodel': 'SM-X200',
'content-type': 'application/json',
'user-agent': 'okhttp/3.14.9'
}
};
const data = {
appVersion: "4.1.2.02",
email: email,
os: "android",
osVersion: "30",
password: Buffer.from(password).toString('base64'),
scene: "IOT_APP",
userType: "ECOFLOW"
};
function httpsRequest(options, data) {
return new Promise((resolve, reject) => {
const req = https.request(options, res => {
let data = '';
res.on('data', chunk => {
data += chunk;
});
res.on('end', () => {
resolve(data);
});
});
req.on('error', error => {
reject(error);
});
if (data) {
req.write(JSON.stringify(data));
}
req.end();
});
}
function uuidv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0,
v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
let response = await httpsRequest(options, data);
try {
let token = JSON.parse(response).data.token;
let userid = JSON.parse(response).data.user.userId;