iobroker.lorawan 0.1.5 → 0.1.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 +6 -0
- package/admin/i18n/de/translations.json +3 -1
- package/admin/i18n/en/translations.json +3 -1
- package/admin/i18n/es/translations.json +3 -1
- package/admin/i18n/fr/translations.json +3 -1
- package/admin/i18n/it/translations.json +3 -1
- package/admin/i18n/nl/translations.json +3 -1
- package/admin/i18n/pl/translations.json +3 -1
- package/admin/i18n/pt/translations.json +3 -1
- package/admin/i18n/ru/translations.json +3 -1
- package/admin/i18n/uk/translations.json +3 -1
- package/admin/i18n/zh-cn/translations.json +3 -1
- package/admin/jsonConfig.json +16 -2
- package/io-package.json +15 -15
- package/lib/modules/directorieshandler.js +1 -1
- package/lib/modules/downlinkConfighandler.js +7 -2
- package/lib/modules/messagehandler.js +2 -2
- package/main.js +6 -8
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -14,11 +14,17 @@ The adapter communicates bidirectionally with LoraWan devices via LoRaWAN Networ
|
|
|
14
14
|
“The Thinks Network” and “Chirpstack” are supported now, more could follow later.
|
|
15
15
|
Adapter was created in collaboration with Joerg Froehner LoraWan@hafenmeister.com
|
|
16
16
|
|
|
17
|
+
For Documentation use the doc folder.
|
|
18
|
+
For now there is documentation in English here: http://www.hafenmeister.com/LoraWan/Iobroker-Adapter.pdf
|
|
19
|
+
|
|
17
20
|
## Changelog
|
|
18
21
|
<!--
|
|
19
22
|
Placeholder for the next version (at the beginning of the line):
|
|
20
23
|
### **WORK IN PROGRESS**
|
|
21
24
|
-->
|
|
25
|
+
### 0.1.6 (2024-02-05)
|
|
26
|
+
* (BenAhrdt) implments byte swap
|
|
27
|
+
|
|
22
28
|
### 0.1.5 (2024-02-02)
|
|
23
29
|
* (BenAhrdt) remove units and insert roles
|
|
24
30
|
|
|
@@ -55,5 +55,7 @@
|
|
|
55
55
|
"decimalPlaces": "Nachkommastellen",
|
|
56
56
|
"decimalPlacesTooltip": "Wählen Sie die gewünschte Anzahl an Nachkommastellen aus, die als Downlink gesendet werden",
|
|
57
57
|
"downlinkConfigMainHeader": "Haupt Downlink Konfiguration",
|
|
58
|
-
"downlinkConfigSubHeader": "Individuelle Downlink Konfiguration"
|
|
58
|
+
"downlinkConfigSubHeader": "Individuelle Downlink Konfiguration",
|
|
59
|
+
"swap": "Little Endian (Bytereihenfolge tauschen)",
|
|
60
|
+
"swapTooltip": "Tauschen Sie den Bytereihenfolged der Eingabe"
|
|
59
61
|
}
|
|
@@ -55,5 +55,7 @@
|
|
|
55
55
|
"decimalPlaces": "decimal places",
|
|
56
56
|
"decimalPlacesTooltip": "select the desired numberof decimal places",
|
|
57
57
|
"downlinkConfigMainHeader": "main downlink config",
|
|
58
|
-
"downlinkConfigSubHeader": "individual downlink config"
|
|
58
|
+
"downlinkConfigSubHeader": "individual downlink config",
|
|
59
|
+
"swap": "little endian (sawp byteorder)",
|
|
60
|
+
"swapTooltip": "swap the byteoder of the input"
|
|
59
61
|
}
|
|
@@ -55,5 +55,7 @@
|
|
|
55
55
|
"decimalPlaces": "lugares decimales",
|
|
56
56
|
"decimalPlacesTooltip": "seleccione el número deseado de decimales",
|
|
57
57
|
"downlinkConfigMainHeader": "configuración principal del enlace descendente",
|
|
58
|
-
"downlinkConfigSubHeader": "configuración de enlace descendente individual"
|
|
58
|
+
"downlinkConfigSubHeader": "configuración de enlace descendente individual",
|
|
59
|
+
"swap": "little endian (orden de bytes visto)",
|
|
60
|
+
"swapTooltip": "intercambiar el byteoder de la entrada"
|
|
59
61
|
}
|
|
@@ -55,5 +55,7 @@
|
|
|
55
55
|
"decimalPlaces": "décimales",
|
|
56
56
|
"decimalPlacesTooltip": "sélectionnez le nombre de décimales souhaité",
|
|
57
57
|
"downlinkConfigMainHeader": "configuration principale de la liaison descendante",
|
|
58
|
-
"downlinkConfigSubHeader": "configuration de liaison descendante individuelle"
|
|
58
|
+
"downlinkConfigSubHeader": "configuration de liaison descendante individuelle",
|
|
59
|
+
"swap": "Little Endian (ordre des octets Sawp)",
|
|
60
|
+
"swapTooltip": "échanger le byteoder de l'entrée"
|
|
59
61
|
}
|
|
@@ -55,5 +55,7 @@
|
|
|
55
55
|
"decimalPlaces": "decimali",
|
|
56
56
|
"decimalPlacesTooltip": "selezionare il numero desiderato di cifre decimali",
|
|
57
57
|
"downlinkConfigMainHeader": "configurazione downlink principale",
|
|
58
|
-
"downlinkConfigSubHeader": "configurazione downlink individuale"
|
|
58
|
+
"downlinkConfigSubHeader": "configurazione downlink individuale",
|
|
59
|
+
"swap": "little endian (ordine byte sawp)",
|
|
60
|
+
"swapTooltip": "scambia il byteoder dell'input"
|
|
59
61
|
}
|
|
@@ -55,5 +55,7 @@
|
|
|
55
55
|
"decimalPlaces": "decimalen",
|
|
56
56
|
"decimalPlacesTooltip": "selecteer het gewenste aantal decimalen",
|
|
57
57
|
"downlinkConfigMainHeader": "belangrijkste downlink-configuratie",
|
|
58
|
-
"downlinkConfigSubHeader": "individuele downlinkconfiguratie"
|
|
58
|
+
"downlinkConfigSubHeader": "individuele downlinkconfiguratie",
|
|
59
|
+
"swap": "kleine endian (sawp-bytevolgorde)",
|
|
60
|
+
"swapTooltip": "verwissel de byteoder van de invoer"
|
|
59
61
|
}
|
|
@@ -55,5 +55,7 @@
|
|
|
55
55
|
"decimalPlaces": "miejsca dziesiętne",
|
|
56
56
|
"decimalPlacesTooltip": "wybierz żądaną liczbę miejsc po przecinku",
|
|
57
57
|
"downlinkConfigMainHeader": "główna konfiguracja łącza w dół",
|
|
58
|
-
"downlinkConfigSubHeader": "indywidualna konfiguracja łącza w dół"
|
|
58
|
+
"downlinkConfigSubHeader": "indywidualna konfiguracja łącza w dół",
|
|
59
|
+
"swap": "Little Endian (kolejność bajtów sawp)",
|
|
60
|
+
"swapTooltip": "zamień bajt wejścia"
|
|
59
61
|
}
|
|
@@ -55,5 +55,7 @@
|
|
|
55
55
|
"decimalPlaces": "casas decimais",
|
|
56
56
|
"decimalPlacesTooltip": "selecione o número desejado de casas decimais",
|
|
57
57
|
"downlinkConfigMainHeader": "configuração de downlink principal",
|
|
58
|
-
"downlinkConfigSubHeader": "configuração de downlink individual"
|
|
58
|
+
"downlinkConfigSubHeader": "configuração de downlink individual",
|
|
59
|
+
"swap": "little endian (ordem de bytes serrada)",
|
|
60
|
+
"swapTooltip": "trocar o byteoder da entrada"
|
|
59
61
|
}
|
|
@@ -55,5 +55,7 @@
|
|
|
55
55
|
"decimalPlaces": "десятичные знаки",
|
|
56
56
|
"decimalPlacesTooltip": "выберите желаемое количество десятичных знаков",
|
|
57
57
|
"downlinkConfigMainHeader": "основная конфигурация нисходящей линии связи",
|
|
58
|
-
"downlinkConfigSubHeader": "индивидуальная конфигурация нисходящей линии связи"
|
|
58
|
+
"downlinkConfigSubHeader": "индивидуальная конфигурация нисходящей линии связи",
|
|
59
|
+
"swap": "с прямым порядком байтов (порядок байтов Sawp)",
|
|
60
|
+
"swapTooltip": "поменять местами байтодер ввода"
|
|
59
61
|
}
|
|
@@ -55,5 +55,7 @@
|
|
|
55
55
|
"decimalPlaces": "знаки після коми",
|
|
56
56
|
"decimalPlacesTooltip": "виберіть потрібну кількість знаків після коми",
|
|
57
57
|
"downlinkConfigMainHeader": "основна конфігурація низхідного каналу",
|
|
58
|
-
"downlinkConfigSubHeader": "індивідуальна конфігурація низхідного каналу"
|
|
58
|
+
"downlinkConfigSubHeader": "індивідуальна конфігурація низхідного каналу",
|
|
59
|
+
"swap": "маленький порядок байтів (sawp byteorder)",
|
|
60
|
+
"swapTooltip": "поміняти байтовий порядок введення"
|
|
59
61
|
}
|
package/admin/jsonConfig.json
CHANGED
|
@@ -61,9 +61,8 @@
|
|
|
61
61
|
"type": "password",
|
|
62
62
|
"label": "password",
|
|
63
63
|
"tooltip": "passwordTooltip",
|
|
64
|
-
"repeat": true,
|
|
65
64
|
"default": "",
|
|
66
|
-
"sm":
|
|
65
|
+
"sm": 3
|
|
67
66
|
},
|
|
68
67
|
"OriginHeader": {
|
|
69
68
|
"newLine": true,
|
|
@@ -214,6 +213,21 @@
|
|
|
214
213
|
"default": "boolean",
|
|
215
214
|
"sm":2
|
|
216
215
|
},
|
|
216
|
+
{
|
|
217
|
+
"type": "checkbox",
|
|
218
|
+
"attr": "swap",
|
|
219
|
+
"label": "swap",
|
|
220
|
+
"tooltip": "swapTooltip",
|
|
221
|
+
"hidden": "data.type !== 'number'",
|
|
222
|
+
"default": false,
|
|
223
|
+
"sm":2
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"type": "staticText",
|
|
227
|
+
"label": "",
|
|
228
|
+
"hidden": "data.type === 'number'",
|
|
229
|
+
"sm":2
|
|
230
|
+
},
|
|
217
231
|
{
|
|
218
232
|
"type": "checkbox",
|
|
219
233
|
"attr": "confirmed",
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "lorawan",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.6",
|
|
5
5
|
"news": {
|
|
6
|
+
"0.1.6": {
|
|
7
|
+
"en": "implments byte swap",
|
|
8
|
+
"de": "implikationen byte swap",
|
|
9
|
+
"ru": "свопа",
|
|
10
|
+
"pt": "impelimentos por swap",
|
|
11
|
+
"nl": "implments byte swap",
|
|
12
|
+
"fr": "swap par octets",
|
|
13
|
+
"it": "importazioni di swap",
|
|
14
|
+
"es": "swap byte",
|
|
15
|
+
"pl": "implikacje swap bajtów",
|
|
16
|
+
"uk": "напляскване",
|
|
17
|
+
"zh-cn": "杂质字节互换"
|
|
18
|
+
},
|
|
6
19
|
"0.1.5": {
|
|
7
20
|
"en": "remove units and insert roles",
|
|
8
21
|
"de": "einheiten entfernen und rollen einfügen",
|
|
@@ -80,19 +93,6 @@
|
|
|
80
93
|
"pl": "usuwanie ścieżki downlink / configuration oraz pierwsze testy wysyłania łącza downlink za pomocą programu uplink",
|
|
81
94
|
"uk": "видалити шлях посилання / налаштування та перші тести відправки з посиланням",
|
|
82
95
|
"zh-cn": "删除下行链路/ 配置路径, 并首次测试下行链路的发送"
|
|
83
|
-
},
|
|
84
|
-
"0.0.18": {
|
|
85
|
-
"en": "remove wrong warn logging",
|
|
86
|
-
"de": "falsche warnen protokollierung entfernen",
|
|
87
|
-
"ru": "удалить неправильные предупреждения",
|
|
88
|
-
"pt": "remover registro de aviso errado",
|
|
89
|
-
"nl": "foutmelding verwijderen",
|
|
90
|
-
"fr": "supprimer les avertissements erronés",
|
|
91
|
-
"it": "rimuovere l'avvertenza sbagliata",
|
|
92
|
-
"es": "eliminar el registro incorrecto",
|
|
93
|
-
"pl": "usunąć nieprawidłowe logowanie ostrzeżeń",
|
|
94
|
-
"uk": "видалити неправильний попереджати залоги",
|
|
95
|
-
"zh-cn": "删除错误的警告记录"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"title": "LoRaWAN",
|
|
@@ -152,7 +152,7 @@
|
|
|
152
152
|
],
|
|
153
153
|
"globalDependencies": [
|
|
154
154
|
{
|
|
155
|
-
"admin": ">=
|
|
155
|
+
"admin": ">=6.13.15"
|
|
156
156
|
}
|
|
157
157
|
]
|
|
158
158
|
},
|
|
@@ -185,7 +185,7 @@ class directorieshandlerClass {
|
|
|
185
185
|
type: stateCommonType !== undefined? stateCommonType!== "object"? stateCommonType: "mixed": "mixed",
|
|
186
186
|
name: stateCommonName,
|
|
187
187
|
role: stateCommonRole,
|
|
188
|
-
read:
|
|
188
|
+
read: stateCommonRole !== "button",
|
|
189
189
|
unit: obj[elementName]? obj[elementName].CommonStateUnit? obj[elementName].CommonStateUnit : "" : "",
|
|
190
190
|
def: obj[elementName]? obj[elementName].stateCommonDef? obj[elementName].stateCommonDef: stateCommonType === "boolean"? false : stateCommonType === "number"? 0: "": stateCommonType === "number"? 0: "",
|
|
191
191
|
write: stateCommonWrite
|
|
@@ -81,7 +81,7 @@ class downlinkConfighandlerClass {
|
|
|
81
81
|
config[downlinkConfig.deviceType] = downlinkConfig;
|
|
82
82
|
config[downlinkConfig.deviceType].downlinkState = {};
|
|
83
83
|
for(const downlinkParameter of Object.values(downlinkConfig.downlinkParameter)){
|
|
84
|
-
config[downlinkConfig.deviceType].downlinkState[downlinkParameter.name] = downlinkParameter;
|
|
84
|
+
config[downlinkConfig.deviceType].downlinkState[downlinkParameter.name.replace(this.adapter.FORBIDDEN_CHARS,"_")] = downlinkParameter;
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
catch(error){
|
|
@@ -115,7 +115,9 @@ class downlinkConfighandlerClass {
|
|
|
115
115
|
let foundLength = 0;
|
|
116
116
|
for(const deviceType in this.activeDownlinkConfigs){
|
|
117
117
|
if((deviceType === "all" || deviceType === this.internalDevices.baseDevice || changeInfo.deviceType.indexOf(deviceType) === 0) && deviceType.length > foundLength){
|
|
118
|
-
|
|
118
|
+
if(foundLength === 0){
|
|
119
|
+
foundMatch = deviceType;
|
|
120
|
+
}
|
|
119
121
|
if(deviceType !== "all" && deviceType !== this.internalDevices.baseDevice){
|
|
120
122
|
foundLength = deviceType.length;
|
|
121
123
|
}
|
|
@@ -269,6 +271,9 @@ class downlinkConfighandlerClass {
|
|
|
269
271
|
zeroDiggits += "0";
|
|
270
272
|
}
|
|
271
273
|
payloadInHex = (zeroDiggits + payloadInHex).slice(-numberOfDiggits);
|
|
274
|
+
if(downlinkParameter.swap){
|
|
275
|
+
payloadInHex = Buffer.from(payloadInHex,"hex").reverse().toString("hex");
|
|
276
|
+
}
|
|
272
277
|
payloadInHex = downlinkParameter.front + payloadInHex + downlinkParameter.end;
|
|
273
278
|
break;
|
|
274
279
|
|
|
@@ -98,13 +98,13 @@ class messagehandlerClass {
|
|
|
98
98
|
else if(stateCommonType === "ascii"){
|
|
99
99
|
stateCommonType = "string";
|
|
100
100
|
}
|
|
101
|
-
await this.adapter.
|
|
101
|
+
await this.adapter.extendObject(`${deviceStartdirectory}.downlink.control.${downlinkConfig.name}`,{
|
|
102
102
|
type: "state",
|
|
103
103
|
common: {
|
|
104
104
|
name: "",
|
|
105
105
|
type: stateCommonType,
|
|
106
106
|
role: stateCommonRole,
|
|
107
|
-
read:
|
|
107
|
+
read: stateCommonRole !== "button",
|
|
108
108
|
write: true,
|
|
109
109
|
unit: downlinkConfig.unit? downlinkConfig.unit:"",
|
|
110
110
|
def: stateCommonType === "boolean"? false : stateCommonType === "number"? 0: "",
|
package/main.js
CHANGED
|
@@ -56,11 +56,9 @@ class Lorawan extends utils.Adapter {
|
|
|
56
56
|
await this.messagehandler.generateDownlinksAndRemoveStatesAtStatup();
|
|
57
57
|
|
|
58
58
|
//Subscribe all configuration and control states
|
|
59
|
-
this.subscribeStatesAsync("
|
|
60
|
-
this.
|
|
61
|
-
this.
|
|
62
|
-
this.log.debug(`the adapter start with the config: ${JSON.stringify(this.config)}.`);
|
|
63
|
-
this.log.silly(`the whole reacable downlinkconfigs are: ${JSON.stringify(this.downlinkConfighandler.activeDownlinkConfigs)}`);
|
|
59
|
+
this.subscribeStatesAsync("*");
|
|
60
|
+
this.log.debug(`the adapter starts with downlinkconfigs: ${JSON.stringify(this.config.downlinkConfig)}.`);
|
|
61
|
+
this.log.silly(`the active downlinkconfigs are: ${JSON.stringify(this.downlinkConfighandler.activeDownlinkConfigs)}`);
|
|
64
62
|
|
|
65
63
|
/*setTimeout(async () => {
|
|
66
64
|
await this.startSimulation();
|
|
@@ -139,7 +137,7 @@ class Lorawan extends utils.Adapter {
|
|
|
139
137
|
// The state was changed => only states with ack = false will be processed, others will be ignored
|
|
140
138
|
if(!state.ack){
|
|
141
139
|
// Check for downlink in id
|
|
142
|
-
if(id.indexOf("downlink") !== -1){
|
|
140
|
+
if(id.indexOf(".downlink.contro.") !== -1){
|
|
143
141
|
this.log.silly(`the state ${id} has changed to ${state.val}.`);
|
|
144
142
|
// get information of the changing state
|
|
145
143
|
const changeInfo = await this.getChangeInfo(id,{withBestMatch:true});
|
|
@@ -166,7 +164,7 @@ class Lorawan extends utils.Adapter {
|
|
|
166
164
|
}
|
|
167
165
|
}
|
|
168
166
|
// State is from configuration path
|
|
169
|
-
else if(id.indexOf("configuration") !== -1){
|
|
167
|
+
else if(id.indexOf(".configuration.") !== -1){
|
|
170
168
|
const changeInfo = await this.getChangeInfo(id,{withBestMatch:true});
|
|
171
169
|
this.messagehandler?.fillWithDownlinkConfig(changeInfo?.objectStartDirectory);
|
|
172
170
|
|
|
@@ -184,7 +182,7 @@ class Lorawan extends utils.Adapter {
|
|
|
184
182
|
this.setStateAsync(id,state.val,true);
|
|
185
183
|
}
|
|
186
184
|
// logging of the actual available configs
|
|
187
|
-
else if(id.indexOf("logAvailableConfignames") !== -1){
|
|
185
|
+
else if(id.indexOf(".logAvailableConfignames") !== -1){
|
|
188
186
|
this.log.info(`The following devicenames has an existing downlink-config`);
|
|
189
187
|
let index = 0;
|
|
190
188
|
for(const devicename in this.downlinkConfighandler?.activeDownlinkConfigs){
|