iobroker.alpha-ess 0.4.0 → 0.5.0
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 +4 -0
- package/io-package.json +14 -14
- package/main.js +93 -29
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -37,6 +37,10 @@ The password is stored encrypted and must therefore be entered manually: demo
|
|
|
37
37
|
**All product and company names or logos are trademarks™ or registered® trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them or any associated subsidiaries! This personal project is maintained in spare time and has no business goal.**
|
|
38
38
|
|
|
39
39
|
## Changelog
|
|
40
|
+
### 0.5.0 (2023-03-05)
|
|
41
|
+
* (Gaspode) Remove no more supported states at startup automatically
|
|
42
|
+
* (Gaspode) Prepared data migration for future versions
|
|
43
|
+
|
|
40
44
|
### 0.4.0 (2023-02-16)
|
|
41
45
|
* (Gaspode) Optimized deletion of group states
|
|
42
46
|
* (Gaspode) Added new Realtime state for pmeter_dc
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "alpha-ess",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.5.0",
|
|
5
5
|
"news": {
|
|
6
|
+
"0.5.0": {
|
|
7
|
+
"en": "Remove no more supported states at startup automatically\nPrepared data migration for future versions",
|
|
8
|
+
"de": "Entfernen Sie keine unterstützten Zustände beim Start automatisch\nVorbereitete Datenmigration für zukünftige Versionen",
|
|
9
|
+
"ru": "Удалить больше не поддерживаемых состояний при запуске автоматически\nПодготовленная миграция данных для будущих версий",
|
|
10
|
+
"pt": "Remover estados não mais suportados na inicialização automaticamente\nMigração de dados preparada para versões futuras",
|
|
11
|
+
"nl": "Verwijder geen ondersteunende staten bij start-up automatisch\nVertaling:",
|
|
12
|
+
"fr": "Enlever plus d'états supportés au démarrage automatiquement\nMigration de données préparée pour les versions futures",
|
|
13
|
+
"it": "Non rimuovere più stati supportati all'avvio automaticamente\nMigrazione dei dati preparata per le versioni future",
|
|
14
|
+
"es": "Eliminar no más estados compatibles en el inicio automáticamente\nMigración de datos preparada para futuras versiones",
|
|
15
|
+
"pl": "Remove nie będzie więcej wspieranych państw\nWstępna migracja danych do przyszłych wersji",
|
|
16
|
+
"uk": "Видаліть не більше підтримуваних держав при запуску автоматично\nПідготовка міграції даних для майбутніх версій",
|
|
17
|
+
"zh-cn": "自动取消不再支持的开办国家\n今后版本的准备数据迁移"
|
|
18
|
+
},
|
|
6
19
|
"0.4.0": {
|
|
7
20
|
"en": "Optimized deletion of group states\nAdded new Realtime state for pmeter_dc",
|
|
8
21
|
"de": "Optimiertes Löschen von Gruppenzuständen\nNeuer Realtime-Zustand für pmeter_dc hinzugefügt",
|
|
@@ -80,19 +93,6 @@
|
|
|
80
93
|
"pl": "Zmniejszenie żądań dotyczących trwałych błędów",
|
|
81
94
|
"uk": "Повільні запити у разі постійних помилок",
|
|
82
95
|
"zh-cn": "长期错误请求下降"
|
|
83
|
-
},
|
|
84
|
-
"0.0.6-beta.4": {
|
|
85
|
-
"en": "Changed adapter type from metering to energy",
|
|
86
|
-
"de": "Geänderter Adaptertyp von der Dosierung bis zur Energie",
|
|
87
|
-
"ru": "Измененный тип адаптера от измерения до энергии",
|
|
88
|
-
"pt": "Tipo de adaptador alterado de medição para energia",
|
|
89
|
-
"nl": "Veranderde adapter type van meting naar energie",
|
|
90
|
-
"fr": "Type d'adaptateur modifié de mesure à énergie",
|
|
91
|
-
"it": "Tipo di adattatore modificato dalla misurazione all'energia",
|
|
92
|
-
"es": "Tipo de adaptador cambiado de medición a energía",
|
|
93
|
-
"pl": "Zmienił adapter typu z metrowania do energii",
|
|
94
|
-
"uk": "Змінений тип адаптера від вимірювальної енергії",
|
|
95
|
-
"zh-cn": "能源参数的变量"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"titleLang": {
|
package/main.js
CHANGED
|
@@ -626,6 +626,9 @@ class AlphaEss extends utils.Adapter {
|
|
|
626
626
|
RefreshToken: ''
|
|
627
627
|
};
|
|
628
628
|
|
|
629
|
+
this.setObjectNormalAsync = this.setObjectNotExistsAsync.bind(this);
|
|
630
|
+
this.setObjectMigrationAsync = this.setObjectAsync.bind(this);
|
|
631
|
+
|
|
629
632
|
this.createdStates = [];
|
|
630
633
|
|
|
631
634
|
this.errorCount = 0;
|
|
@@ -658,24 +661,42 @@ class AlphaEss extends utils.Adapter {
|
|
|
658
661
|
this.log.debug('config updateUnchangedStates: ' + this.config.updateUnchangedStates);
|
|
659
662
|
this.wrongCredentials = false;
|
|
660
663
|
|
|
664
|
+
await this.setObjectNotExistsAsync('info.version', {
|
|
665
|
+
type: 'state',
|
|
666
|
+
common: {
|
|
667
|
+
name: 'Adapter Version'
|
|
668
|
+
, type: 'string'
|
|
669
|
+
, role: 'value'
|
|
670
|
+
, read: true
|
|
671
|
+
, write: false
|
|
672
|
+
},
|
|
673
|
+
native: {},
|
|
674
|
+
});
|
|
675
|
+
|
|
676
|
+
if (await this.isMigrationNecessary()) {
|
|
677
|
+
this.log.info('States will be migrated.');
|
|
678
|
+
}
|
|
679
|
+
|
|
661
680
|
await this.resetAuth();
|
|
662
681
|
|
|
663
682
|
if (this.config.password && this.config.username && this.config.systemId) {
|
|
664
683
|
|
|
665
684
|
for (const gidx of Object.keys(this.stateInfoList)) {
|
|
666
|
-
const
|
|
667
|
-
if (this.config[
|
|
668
|
-
await
|
|
685
|
+
const groupInfo = this.stateInfoList[gidx];
|
|
686
|
+
if (this.config[groupInfo.enabledName]) {
|
|
687
|
+
await groupInfo.fnct(groupInfo.Group);
|
|
669
688
|
}
|
|
670
689
|
else {
|
|
671
|
-
this.log.info(
|
|
672
|
-
await this.delObjectAsync(
|
|
690
|
+
this.log.info(groupInfo.Group + ' data disabled! Adapter won\'t fetch ' + groupInfo.Group + ' data. According states deleted.');
|
|
691
|
+
await this.delObjectAsync(groupInfo.Group, { recursive: true });
|
|
673
692
|
}
|
|
674
693
|
}
|
|
675
694
|
}
|
|
676
695
|
else {
|
|
677
696
|
this.log.error('No username, password and/or system ID set! Adapter won\'t fetch any data.');
|
|
678
697
|
}
|
|
698
|
+
|
|
699
|
+
await this.setStateAsync('info.version', this.version, true);
|
|
679
700
|
}
|
|
680
701
|
catch (e) {
|
|
681
702
|
this.log.error('onReady Exception occurred: ' + e);
|
|
@@ -961,6 +982,26 @@ class AlphaEss extends utils.Adapter {
|
|
|
961
982
|
}
|
|
962
983
|
}
|
|
963
984
|
|
|
985
|
+
/**
|
|
986
|
+
* Answer if the states shall be migrated, i.e. overwritten.
|
|
987
|
+
* This is called a view times at startup only.
|
|
988
|
+
*/
|
|
989
|
+
async isMigrationNecessary() {
|
|
990
|
+
const oldVersionState = await this.getStateAsync('info.version');
|
|
991
|
+
if (oldVersionState) {
|
|
992
|
+
const oldVersion = '' + oldVersionState.val;
|
|
993
|
+
const vParts = oldVersion.split('.');
|
|
994
|
+
if (vParts.length >= 3) {
|
|
995
|
+
const major = Number.parseInt(vParts[0]);
|
|
996
|
+
const minor = Number.parseInt(vParts[1]);
|
|
997
|
+
if (major == 0 && minor > 4 || major > 0) {
|
|
998
|
+
return false;
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
return true;
|
|
1003
|
+
}
|
|
1004
|
+
|
|
964
1005
|
/**
|
|
965
1006
|
* Create states when called the first time, update state values in each call
|
|
966
1007
|
* @param {string} group
|
|
@@ -971,20 +1012,41 @@ class AlphaEss extends utils.Adapter {
|
|
|
971
1012
|
if (data) {
|
|
972
1013
|
const idx = new Date().getDate() - 1;
|
|
973
1014
|
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
1015
|
+
if (!this.createdStates[group]) {
|
|
1016
|
+
|
|
1017
|
+
// Delete no longer supported states for this group
|
|
1018
|
+
const gidx = this.stateInfoList.findIndex(i => i.Group == group);
|
|
1019
|
+
if (gidx >= 0) {
|
|
1020
|
+
const groupStateList = this.stateInfoList[gidx].states;
|
|
1021
|
+
const states = await this.getStatesAsync(group + '.*');
|
|
1022
|
+
for (const sid in states) {
|
|
1023
|
+
const parts = sid.split('.');
|
|
1024
|
+
const id = parts[parts.length - 1];
|
|
1025
|
+
if (groupStateList.findIndex(i => i.id == id) == -1) {
|
|
1026
|
+
this.log.info('State ' + group + '.' + id + ' removed, no longer supported.');
|
|
1027
|
+
await this.delObjectAsync(group + '.' + id);
|
|
1028
|
+
}
|
|
1029
|
+
}
|
|
1030
|
+
}
|
|
1031
|
+
|
|
1032
|
+
const setObjectFunc = await this.isMigrationNecessary() ? this.setObjectMigrationAsync : this.setObjectNormalAsync;
|
|
1033
|
+
|
|
1034
|
+
// Create the folder for this group
|
|
1035
|
+
await setObjectFunc(group, {
|
|
1036
|
+
type: 'folder',
|
|
1037
|
+
common: {
|
|
1038
|
+
name: group
|
|
1039
|
+
, read: true
|
|
1040
|
+
, write: false
|
|
1041
|
+
},
|
|
1042
|
+
native: {}
|
|
1043
|
+
});
|
|
1044
|
+
|
|
1045
|
+
// Create all states for received elements
|
|
1046
|
+
for (const [alphaAttrName, rawValue] of Object.entries(data)) {
|
|
1047
|
+
const stateInfo = this.getStateInfo(group, alphaAttrName);
|
|
1048
|
+
if (stateInfo) {
|
|
1049
|
+
await setObjectFunc(group + '.' + this.osn(stateInfo.id), {
|
|
988
1050
|
type: 'state',
|
|
989
1051
|
common: {
|
|
990
1052
|
name: stateInfo.name + ' [' + stateInfo.alphaAttrName + ']'
|
|
@@ -999,6 +1061,18 @@ class AlphaEss extends utils.Adapter {
|
|
|
999
1061
|
native: {},
|
|
1000
1062
|
});
|
|
1001
1063
|
}
|
|
1064
|
+
else {
|
|
1065
|
+
this.log.debug('Skipped object ' + group + '.' + alphaAttrName + ' with value ' + rawValue);
|
|
1066
|
+
}
|
|
1067
|
+
}
|
|
1068
|
+
this.log.info('Initialized states for : ' + group);
|
|
1069
|
+
this.createdStates[group] = true;
|
|
1070
|
+
}
|
|
1071
|
+
|
|
1072
|
+
// Set values for received states
|
|
1073
|
+
for (const [alphaAttrName, rawValue] of Object.entries(data)) {
|
|
1074
|
+
const stateInfo = this.getStateInfo(group, alphaAttrName);
|
|
1075
|
+
if (stateInfo) {
|
|
1002
1076
|
let value = '';
|
|
1003
1077
|
if (stateInfo.dayIndex) {
|
|
1004
1078
|
value = rawValue[idx];
|
|
@@ -1032,7 +1106,6 @@ class AlphaEss extends utils.Adapter {
|
|
|
1032
1106
|
default:
|
|
1033
1107
|
tvalue = value;
|
|
1034
1108
|
}
|
|
1035
|
-
|
|
1036
1109
|
if (this.config.updateUnchangedStates) {
|
|
1037
1110
|
await this.setStateAsync(group + '.' + this.osn(stateInfo.id), tvalue, true);
|
|
1038
1111
|
}
|
|
@@ -1041,15 +1114,6 @@ class AlphaEss extends utils.Adapter {
|
|
|
1041
1114
|
}
|
|
1042
1115
|
this.log.debug('Received object ' + group + '.' + this.osn(stateInfo.alphaAttrName) + ' with value ' + rawValue);
|
|
1043
1116
|
}
|
|
1044
|
-
else {
|
|
1045
|
-
if (!this.createdStates[group]) {
|
|
1046
|
-
this.log.info('Skipped object ' + group + '.' + alphaAttrName + ' with value ' + rawValue);
|
|
1047
|
-
}
|
|
1048
|
-
}
|
|
1049
|
-
}
|
|
1050
|
-
if (!this.createdStates[group]) {
|
|
1051
|
-
this.log.info('Created states for : ' + group);
|
|
1052
|
-
this.createdStates[group] = true;
|
|
1053
1117
|
}
|
|
1054
1118
|
}
|
|
1055
1119
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.alpha-ess",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Read and write data from and to Alpha ESS systems.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Gaspode",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@iobroker/adapter-core": "^2.6.7",
|
|
23
|
-
"axios": "^1.3.
|
|
23
|
+
"axios": "^1.3.4"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@alcalzone/release-script": "^3.5.9",
|
|
@@ -33,13 +33,13 @@
|
|
|
33
33
|
"@types/chai": "^4.3.4",
|
|
34
34
|
"@types/chai-as-promised": "^7.1.5",
|
|
35
35
|
"@types/mocha": "^10.0.1",
|
|
36
|
-
"@types/node": "^18.
|
|
36
|
+
"@types/node": "^18.14.2",
|
|
37
37
|
"@types/proxyquire": "^1.3.28",
|
|
38
38
|
"@types/sinon": "^10.0.13",
|
|
39
39
|
"@types/sinon-chai": "^3.2.9",
|
|
40
40
|
"chai": "^4.3.7",
|
|
41
41
|
"chai-as-promised": "^7.1.1",
|
|
42
|
-
"eslint": "^8.
|
|
42
|
+
"eslint": "^8.35.0",
|
|
43
43
|
"eslint-config-prettier": "^8.5.0",
|
|
44
44
|
"eslint-plugin-prettier": "^4.2.1",
|
|
45
45
|
"mocha": "^10.2.0",
|