iobroker.lorawan 0.1.5 → 0.1.7
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 +9 -0
- package/admin/i18n/de/translations.json +5 -1
- package/admin/i18n/en/translations.json +5 -1
- package/admin/i18n/es/translations.json +5 -1
- package/admin/i18n/fr/translations.json +5 -1
- package/admin/i18n/it/translations.json +5 -1
- package/admin/i18n/nl/translations.json +5 -1
- package/admin/i18n/pl/translations.json +5 -1
- package/admin/i18n/pt/translations.json +5 -1
- package/admin/i18n/ru/translations.json +5 -1
- package/admin/i18n/uk/translations.json +5 -1
- package/admin/i18n/zh-cn/translations.json +5 -1
- package/admin/jsonConfig.json +25 -3
- package/io-package.json +28 -28
- package/lib/modules/directorieshandler.js +1 -1
- package/lib/modules/downlinkConfighandler.js +10 -2
- package/lib/modules/messagehandler.js +2 -2
- package/main.js +35 -8
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -14,11 +14,20 @@ 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.7 (2024-02-06)
|
|
26
|
+
* (BenAhrdt) change filter on statechange
|
|
27
|
+
|
|
28
|
+
### 0.1.6 (2024-02-05)
|
|
29
|
+
* (BenAhrdt) implments byte swap
|
|
30
|
+
|
|
22
31
|
### 0.1.5 (2024-02-02)
|
|
23
32
|
* (BenAhrdt) remove units and insert roles
|
|
24
33
|
|
|
@@ -55,5 +55,9 @@
|
|
|
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",
|
|
61
|
+
"crc": "Prüfsumme (crc 16) (comming soon)",
|
|
62
|
+
"crcTooltip": "Anhängen der CRC16 Prüsumme an Ihre Daten"
|
|
59
63
|
}
|
|
@@ -55,5 +55,9 @@
|
|
|
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",
|
|
61
|
+
"crc": "checksum (crc 16) (comming soon)",
|
|
62
|
+
"crcTooltip": "append the crc16 to your data"
|
|
59
63
|
}
|
|
@@ -55,5 +55,9 @@
|
|
|
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",
|
|
61
|
+
"crc": "suma de comprobación (crc 16)",
|
|
62
|
+
"crcTooltip": "agregue el crc16 a sus datos"
|
|
59
63
|
}
|
|
@@ -55,5 +55,9 @@
|
|
|
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",
|
|
61
|
+
"crc": "somme de contrôle (crc 16)",
|
|
62
|
+
"crcTooltip": "ajouter le crc16 à vos données"
|
|
59
63
|
}
|
|
@@ -55,5 +55,9 @@
|
|
|
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",
|
|
61
|
+
"crc": "somma di controllo (crc 16)",
|
|
62
|
+
"crcTooltip": "aggiungi crc16 ai tuoi dati"
|
|
59
63
|
}
|
|
@@ -55,5 +55,9 @@
|
|
|
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",
|
|
61
|
+
"crc": "controlesom (crc 16)",
|
|
62
|
+
"crcTooltip": "voeg de crc16 toe aan uw gegevens"
|
|
59
63
|
}
|
|
@@ -55,5 +55,9 @@
|
|
|
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",
|
|
61
|
+
"crc": "suma kontrolna (crc 16)",
|
|
62
|
+
"crcTooltip": "dołącz crc16 do swoich danych"
|
|
59
63
|
}
|
|
@@ -55,5 +55,9 @@
|
|
|
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",
|
|
61
|
+
"crc": "soma de verificação (crc 16)",
|
|
62
|
+
"crcTooltip": "anexe o crc16 aos seus dados"
|
|
59
63
|
}
|
|
@@ -55,5 +55,9 @@
|
|
|
55
55
|
"decimalPlaces": "десятичные знаки",
|
|
56
56
|
"decimalPlacesTooltip": "выберите желаемое количество десятичных знаков",
|
|
57
57
|
"downlinkConfigMainHeader": "основная конфигурация нисходящей линии связи",
|
|
58
|
-
"downlinkConfigSubHeader": "индивидуальная конфигурация нисходящей линии связи"
|
|
58
|
+
"downlinkConfigSubHeader": "индивидуальная конфигурация нисходящей линии связи",
|
|
59
|
+
"swap": "с прямым порядком байтов (порядок байтов Sawp)",
|
|
60
|
+
"swapTooltip": "поменять местами байтодер ввода",
|
|
61
|
+
"crc": "контрольная сумма (crc 16)",
|
|
62
|
+
"crcTooltip": "добавьте crc16 к вашим данным"
|
|
59
63
|
}
|
|
@@ -55,5 +55,9 @@
|
|
|
55
55
|
"decimalPlaces": "знаки після коми",
|
|
56
56
|
"decimalPlacesTooltip": "виберіть потрібну кількість знаків після коми",
|
|
57
57
|
"downlinkConfigMainHeader": "основна конфігурація низхідного каналу",
|
|
58
|
-
"downlinkConfigSubHeader": "індивідуальна конфігурація низхідного каналу"
|
|
58
|
+
"downlinkConfigSubHeader": "індивідуальна конфігурація низхідного каналу",
|
|
59
|
+
"swap": "маленький порядок байтів (sawp byteorder)",
|
|
60
|
+
"swapTooltip": "поміняти байтовий порядок введення",
|
|
61
|
+
"crc": "контрольна сума (CRC 16)",
|
|
62
|
+
"crcTooltip": "додайте crc16 до своїх даних"
|
|
59
63
|
}
|
|
@@ -55,5 +55,9 @@
|
|
|
55
55
|
"decimalPlaces": "小数位",
|
|
56
56
|
"decimalPlacesTooltip": "选择所需的小数位数",
|
|
57
57
|
"downlinkConfigMainHeader": "主要下行配置",
|
|
58
|
-
"downlinkConfigSubHeader": "单独的下行链路配置"
|
|
58
|
+
"downlinkConfigSubHeader": "单独的下行链路配置",
|
|
59
|
+
"swap": "小尾数(sawp 字节顺序)",
|
|
60
|
+
"swapTooltip": "交换输入的字节码",
|
|
61
|
+
"crc": "校验和(crc 16)",
|
|
62
|
+
"crcTooltip": "将 crc16 附加到您的数据中"
|
|
59
63
|
}
|
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",
|
|
@@ -312,7 +326,15 @@
|
|
|
312
326
|
"tooltip": "unitTooltip",
|
|
313
327
|
"default": "",
|
|
314
328
|
"hidden": "data.type === 'boolean' || data.type === 'button' || data.type === 'string'",
|
|
315
|
-
"sm":
|
|
329
|
+
"sm":1
|
|
330
|
+
},
|
|
331
|
+
{
|
|
332
|
+
"type": "checkbox",
|
|
333
|
+
"attr": "crc",
|
|
334
|
+
"label": "crc",
|
|
335
|
+
"tooltip": "crcTooltip",
|
|
336
|
+
"default": false,
|
|
337
|
+
"sm":1
|
|
316
338
|
}
|
|
317
339
|
]
|
|
318
340
|
}
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "lorawan",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.7",
|
|
5
5
|
"news": {
|
|
6
|
+
"0.1.7": {
|
|
7
|
+
"en": "change filter on statechange",
|
|
8
|
+
"de": "änderungsfilter auf statechange",
|
|
9
|
+
"ru": "изменение фильтра для изменения состояния",
|
|
10
|
+
"pt": "filtro de mudança de estado",
|
|
11
|
+
"nl": "filter wijzigen bij statusverandering",
|
|
12
|
+
"fr": "modifier le filtre sur le changement d'état",
|
|
13
|
+
"it": "cambiare il filtro sul cambio di stato",
|
|
14
|
+
"es": "filtro de cambio en el cambio de estado",
|
|
15
|
+
"pl": "zmienić filtr na statechange",
|
|
16
|
+
"uk": "зміна фільтра на державну зміну",
|
|
17
|
+
"zh-cn": "状态更改过滤器"
|
|
18
|
+
},
|
|
19
|
+
"0.1.6": {
|
|
20
|
+
"en": "implments byte swap",
|
|
21
|
+
"de": "implikationen byte swap",
|
|
22
|
+
"ru": "свопа",
|
|
23
|
+
"pt": "impelimentos por swap",
|
|
24
|
+
"nl": "implments byte swap",
|
|
25
|
+
"fr": "swap par octets",
|
|
26
|
+
"it": "importazioni di swap",
|
|
27
|
+
"es": "swap byte",
|
|
28
|
+
"pl": "implikacje swap bajtów",
|
|
29
|
+
"uk": "напляскване",
|
|
30
|
+
"zh-cn": "杂质字节互换"
|
|
31
|
+
},
|
|
6
32
|
"0.1.5": {
|
|
7
33
|
"en": "remove units and insert roles",
|
|
8
34
|
"de": "einheiten entfernen und rollen einfügen",
|
|
@@ -67,32 +93,6 @@
|
|
|
67
93
|
"pl": "redukcja zmiany wywołania Info > tworzenie expersettings do wysyłania linków w dół za pomocą łącza",
|
|
68
94
|
"uk": "зменшення зміни виклику Інформація > створити налаштування для відправки посилань з посиланням",
|
|
69
95
|
"zh-cn": "减少调用更改 Info > 创建带上行链路的下行链路"
|
|
70
|
-
},
|
|
71
|
-
"0.1.0": {
|
|
72
|
-
"en": "removing downlink/configuration path and first tests of send downlink with uplink",
|
|
73
|
-
"de": "entfernen von downlink/konfigurationspfad und ersten tests von downlink mit uplink",
|
|
74
|
-
"ru": "удаление пути внизlink/конфигурации и первые тесты отправной ссылки с помощью uplink",
|
|
75
|
-
"pt": "remoção de downlink / caminho de configuração e primeiros testes de enviar downlink com uplink",
|
|
76
|
-
"nl": "verwijderen van downlink/configuratie pad en eerste tests van verzenden downlink met uplink",
|
|
77
|
-
"fr": "supprimer la liaison descendante / chemin de configuration et les premiers tests d'envoi de liaison descendante avec uplink",
|
|
78
|
-
"it": "rimuovere downlink/configuration path e i primi test di send downlink con uplink",
|
|
79
|
-
"es": "eliminación de enlace descendente / ruta de configuración y las primeras pruebas de enviar enlace descendente con enlace ascendente",
|
|
80
|
-
"pl": "usuwanie ścieżki downlink / configuration oraz pierwsze testy wysyłania łącza downlink za pomocą programu uplink",
|
|
81
|
-
"uk": "видалити шлях посилання / налаштування та перші тести відправки з посиланням",
|
|
82
|
-
"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
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const fs = require("fs");
|
|
2
2
|
const { isDeepStrictEqual } = require("util");
|
|
3
|
+
//const crc16 = require("js-crc").crc16;
|
|
3
4
|
|
|
4
5
|
class downlinkConfighandlerClass {
|
|
5
6
|
constructor(adapter) {
|
|
@@ -10,6 +11,8 @@ class downlinkConfighandlerClass {
|
|
|
10
11
|
this.internalDevices = {
|
|
11
12
|
baseDevice: "internalBaseDevice"
|
|
12
13
|
};
|
|
14
|
+
// this.source = "0258";
|
|
15
|
+
// this.adapter.log.warn(crc16(Buffer.from(this.source,"hex")).toUpperCase());
|
|
13
16
|
}
|
|
14
17
|
|
|
15
18
|
/*********************************************************************
|
|
@@ -81,7 +84,7 @@ class downlinkConfighandlerClass {
|
|
|
81
84
|
config[downlinkConfig.deviceType] = downlinkConfig;
|
|
82
85
|
config[downlinkConfig.deviceType].downlinkState = {};
|
|
83
86
|
for(const downlinkParameter of Object.values(downlinkConfig.downlinkParameter)){
|
|
84
|
-
config[downlinkConfig.deviceType].downlinkState[downlinkParameter.name] = downlinkParameter;
|
|
87
|
+
config[downlinkConfig.deviceType].downlinkState[downlinkParameter.name.replace(this.adapter.FORBIDDEN_CHARS,"_")] = downlinkParameter;
|
|
85
88
|
}
|
|
86
89
|
}
|
|
87
90
|
catch(error){
|
|
@@ -115,7 +118,9 @@ class downlinkConfighandlerClass {
|
|
|
115
118
|
let foundLength = 0;
|
|
116
119
|
for(const deviceType in this.activeDownlinkConfigs){
|
|
117
120
|
if((deviceType === "all" || deviceType === this.internalDevices.baseDevice || changeInfo.deviceType.indexOf(deviceType) === 0) && deviceType.length > foundLength){
|
|
118
|
-
|
|
121
|
+
if(foundLength === 0){
|
|
122
|
+
foundMatch = deviceType;
|
|
123
|
+
}
|
|
119
124
|
if(deviceType !== "all" && deviceType !== this.internalDevices.baseDevice){
|
|
120
125
|
foundLength = deviceType.length;
|
|
121
126
|
}
|
|
@@ -269,6 +274,9 @@ class downlinkConfighandlerClass {
|
|
|
269
274
|
zeroDiggits += "0";
|
|
270
275
|
}
|
|
271
276
|
payloadInHex = (zeroDiggits + payloadInHex).slice(-numberOfDiggits);
|
|
277
|
+
if(downlinkParameter.swap){
|
|
278
|
+
payloadInHex = Buffer.from(payloadInHex,"hex").reverse().toString("hex");
|
|
279
|
+
}
|
|
272
280
|
payloadInHex = downlinkParameter.front + payloadInHex + downlinkParameter.end;
|
|
273
281
|
break;
|
|
274
282
|
|
|
@@ -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.extendObjectAsync(`${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.silly(`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();
|
|
@@ -94,6 +92,35 @@ class Lorawan extends utils.Adapter {
|
|
|
94
92
|
//const message = {"deduplicationId":"bd3fdb3b-af86-4617-b9f2-da07075d2bc5","time":"2024-01-24T16:47:01.573381+00:00","deviceInfo":{"tenantId":"52f14cd4-c6f1-4fbd-8f87-4025e1d49242","tenantName":"ChirpStack","applicationId":"d63c10b6-9263-4ab3-9299-4308fa19a2ad","applicationName":"Benjamin Schmidt","deviceProfileId":"f1c0ae0e-b4a2-4547-b360-7cfa15e85734","deviceProfileName":"Dragino LT22222","deviceName":"Relaistestgerät","devEui":"a8404127a188d826","deviceClassEnabled":"CLASS_C","tags":{}},"devAddr":"01dfbaf2","adr":true,"dr":5,"fCnt":12,"fPort":2,"confirmed":false,"data":"AAAAAAAAAAA8/0E=","object":{"RO1_status":"OFF","DO2_status":"H","ACI2_mA":0.0,"DO1_status":"H","Hardware_mode":"LT22222","RO2_status":"OFF","AVI2_V":0.0,"ACI1_mA":0.0,"DI1_status":"H","DI2_status":"H","Work_mode":"2ACI+2AVI","AVI1_V":0.0},"rxInfo":[{"gatewayId":"50303541b0344750","uplinkId":57857,"gwTime":"2024-01-24T16:47:01.573381+00:00","nsTime":"2024-01-24T16:47:02.370171527+00:00","rssi":-54,"snr":8.5,"channel":6,"location":{"latitude":50.69344693065449,"longitude":8.476783633232118},"context":"2tr9BA==","metadata":{"region_config_id":"eu868","region_common_name":"EU868"},"crcStatus":"CRC_OK"}],"txInfo":{"frequency":867700000,"modulation":{"lora":{"bandwidth":125000,"spreadingFactor":7,"codeRate":"CR_4_5"}}}};
|
|
95
93
|
//const topic = "application/d63c10b6-9263-4ab3-9299-4308fa19a2ad/device/a8404127a188d826/command/down";
|
|
96
94
|
//const message = {"devEui":"a8404127a188d826","confirmed":false,"fPort":1,"data":"AQACWA=="};
|
|
95
|
+
|
|
96
|
+
// ACK
|
|
97
|
+
//const topic = "application/59bcc5a7-59e2-4481-9615-fc4e58791915/device/70b3d52dd300ed31/event/ack";
|
|
98
|
+
//const message = {"deduplicationId":"b080c0d8-6151-4675-84b8-74ecf9e33bae","time":"2023-08-15T13:22:27.969901+00:00","deviceInfo":{"tenantId":"52f14cd4-c6f1-4fbd-8f87-4025e1d49242","tenantName":"ChirpStack","applicationId":"59bcc5a7-59e2-4481-9615-fc4e58791915","applicationName":"Mclimate_Vicki","deviceProfileId":"3a9bc28f-3664-4bdf-b3be-a20d1eb32dc8","deviceProfileName":"Mclimate_Vicki","deviceName":"MClimate_Vicki_Heizkoerperventil_001","devEui":"70b3d52dd300ed31","deviceClassEnabled":"CLASS_A","tags":{}},"queueItemId":"3434298f-2b89-49f8-885e-9fdd9f0892e6","acknowledged":true,"fCntDown":262};
|
|
99
|
+
|
|
100
|
+
// TXACK
|
|
101
|
+
//const topic = "application/59bcc5a7-59e2-4481-9615-fc4e58791915/device/70b3d52dd300ed31/event/txack";
|
|
102
|
+
//const message = {"downlinkId":2478630510,"time":"2024-01-27T11:50:04.736655452+00:00","deviceInfo":{"tenantId":"52f14cd4-c6f1-4fbd-8f87-4025e1d49242","tenantName":"ChirpStack","applicationId":"59bcc5a7-59e2-4481-9615-fc4e58791915","applicationName":"Mclimate_Vicki","deviceProfileId":"3a9bc28f-3664-4bdf-b3be-a20d1eb32dc8","deviceProfileName":"Mclimate_Vicki","deviceName":"MClimate_Vicki_Heizkoerperventil_001","devEui":"70b3d52dd300ed31","deviceClassEnabled":"CLASS_A","tags":{}},"queueItemId":"efc2bacf-d5da-48d3-a6ef-2a77fda41bd0","fCntDown":4940,"gatewayId":"50313953530a4750","txInfo":{"frequency":868300000,"power":16,"modulation":{"lora":{"bandwidth":125000,"spreadingFactor":7,"codeRate":"CR_4_5","polarizationInversion":true}},"timing":{"delay":{"delay":"1s"}},"context":"eqFuiw=="}};
|
|
103
|
+
|
|
104
|
+
// STATUS
|
|
105
|
+
//const topic = "application/59bcc5a7-59e2-4481-9615-fc4e58791915/device/70b3d52dd300ed31/event/status";
|
|
106
|
+
//const message = {"deduplicationId":"4a91b00d-b5e1-4955-b085-ba21b9318213","time":"2024-01-26T20:18:45.299871+00:00","deviceInfo":{"tenantId":"52f14cd4-c6f1-4fbd-8f87-4025e1d49242","tenantName":"ChirpStack","applicationId":"59bcc5a7-59e2-4481-9615-fc4e58791915","applicationName":"Mclimate_Vicki","deviceProfileId":"3a9bc28f-3664-4bdf-b3be-a20d1eb32dc8","deviceProfileName":"Mclimate_Vicki","deviceName":"MClimate_Vicki_Heizkoerperventil_001","devEui":"70b3d52dd300ed31","deviceClassEnabled":"CLASS_A","tags":{}},"margin":7,"externalPowerSource":false,"batteryLevelUnavailable":false,"batteryLevel":85.826775};
|
|
107
|
+
|
|
108
|
+
// UP
|
|
109
|
+
//const topic = "application/59bcc5a7-59e2-4481-9615-fc4e58791915/device/70b3d52dd300ed31/event/up";
|
|
110
|
+
//const message = {"deduplicationId":"c14f77c3-cfe5-42f3-9c43-651d3ca4cf45","time":"2024-01-27T12:00:05.267780+00:00","deviceInfo":{"tenantId":"52f14cd4-c6f1-4fbd-8f87-4025e1d49242","tenantName":"ChirpStack","applicationId":"59bcc5a7-59e2-4481-9615-fc4e58791915","applicationName":"Mclimate_Vicki","deviceProfileId":"3a9bc28f-3664-4bdf-b3be-a20d1eb32dc8","deviceProfileName":"Mclimate_Vicki","deviceName":"MClimate_Vicki_Heizkoerperventil_001","devEui":"70b3d52dd300ed31","deviceClassEnabled":"CLASS_A","tags":{}},"devAddr":"01343968","adr":true,"dr":5,"fCnt":11129,"fPort":2,"confirmed":false,"data":"gQyOiP39EdAw","object":{"sensorTemperature":20.06,"targetTemperature":12.0,"motorRange":509.0,"childLock":false,"batteryVoltage":3.3,"attachedBackplate":true,"lowMotorConsumption":false,"motorPosition":509.0,"reason":81.0,"highMotorConsumption":false,"calibrationFailed":false,"relativeHumidity":53.13,"perceiveAsOnline":true,"openWindow":false,"brokenSensor":false},"rxInfo":[{"gatewayId":"50313953530a4750","uplinkId":47105,"gwTime":"2024-01-27T12:00:05.267780+00:00","nsTime":"2024-01-27T12:00:05.314616473+00:00","rssi":-68,"snr":9.25,"channel":7,"location":{"latitude":53.55485739669679,"longitude":9.921609163284304},"context":"nnL1/A==","metadata":{"region_common_name":"EU868","region_config_id":"eu868"},"crcStatus":"CRC_OK"}],"txInfo":{"frequency":867900000,"modulation":{"lora":{"bandwidth":125000,"spreadingFactor":7,"codeRate":"CR_4_5"}}}};
|
|
111
|
+
|
|
112
|
+
// LOG
|
|
113
|
+
//const topic = "application/59bcc5a7-59e2-4481-9615-fc4e58791915/device/70b3d52dd300ed31/event/up";
|
|
114
|
+
//const message = {"time":"2024-01-27T10:29:58.221817559+00:00","deviceInfo":{"tenantId":"52f14cd4-c6f1-4fbd-8f87-4025e1d49242","tenantName":"ChirpStack","applicationId":"59bcc5a7-59e2-4481-9615-fc4e58791915","applicationName":"Mclimate_Vicki","deviceProfileId":"3a9bc28f-3664-4bdf-b3be-a20d1eb32dc8","deviceProfileName":"Mclimate_Vicki","deviceName":"MClimate_Vicki_Heizkoerperventil_001","devEui":"70b3d52dd300ed31","deviceClassEnabled":"CLASS_A","tags":{}},"level":"ERROR","code":"UPLINK_CODEC","description":"Exception generated by quickjs","context":{"deduplication_id":"c44e7e25-09ce-4c95-b96f-5a298c5c6440"}};
|
|
115
|
+
|
|
116
|
+
// JOIN
|
|
117
|
+
//const topic = "application/59bcc5a7-59e2-4481-9615-fc4e58791915/device/70b3d52dd300ed31/event/join";
|
|
118
|
+
//const message = {"deduplicationId":"44cef56d-1b8d-45fc-a762-03b98b620db2","time":"2023-12-12T03:13:21.551178+00:00","deviceInfo":{"tenantId":"52f14cd4-c6f1-4fbd-8f87-4025e1d49242","tenantName":"ChirpStack","applicationId":"59bcc5a7-59e2-4481-9615-fc4e58791915","applicationName":"Mclimate_Vicki","deviceProfileId":"3a9bc28f-3664-4bdf-b3be-a20d1eb32dc8","deviceProfileName":"Mclimate_Vicki","deviceName":"MClimate_Vicki_Heizkoerperventil_001","devEui":"70b3d52dd300ed31","deviceClassEnabled":"CLASS_A","tags":{}},"devAddr":"01009400"};
|
|
119
|
+
|
|
120
|
+
// DOWN
|
|
121
|
+
//const topic = "application/59bcc5a7-59e2-4481-9615-fc4e58791915/device/70b3d52dd300ed31/command/down";
|
|
122
|
+
//const message = {"devEui": "70b3d52dd300ed31", "confirmed": false,"fPort": 1,"data": "DQEYDQEY"};
|
|
123
|
+
|
|
97
124
|
await this.messagehandler?.handleMessage(topic, message);
|
|
98
125
|
}
|
|
99
126
|
/**
|
|
@@ -139,7 +166,7 @@ class Lorawan extends utils.Adapter {
|
|
|
139
166
|
// The state was changed => only states with ack = false will be processed, others will be ignored
|
|
140
167
|
if(!state.ack){
|
|
141
168
|
// Check for downlink in id
|
|
142
|
-
if(id.indexOf("downlink") !== -1){
|
|
169
|
+
if(id.indexOf(".downlink.control.") !== -1){
|
|
143
170
|
this.log.silly(`the state ${id} has changed to ${state.val}.`);
|
|
144
171
|
// get information of the changing state
|
|
145
172
|
const changeInfo = await this.getChangeInfo(id,{withBestMatch:true});
|
|
@@ -166,7 +193,7 @@ class Lorawan extends utils.Adapter {
|
|
|
166
193
|
}
|
|
167
194
|
}
|
|
168
195
|
// State is from configuration path
|
|
169
|
-
else if(id.indexOf("configuration") !== -1){
|
|
196
|
+
else if(id.indexOf(".configuration.") !== -1){
|
|
170
197
|
const changeInfo = await this.getChangeInfo(id,{withBestMatch:true});
|
|
171
198
|
this.messagehandler?.fillWithDownlinkConfig(changeInfo?.objectStartDirectory);
|
|
172
199
|
|
|
@@ -184,7 +211,7 @@ class Lorawan extends utils.Adapter {
|
|
|
184
211
|
this.setStateAsync(id,state.val,true);
|
|
185
212
|
}
|
|
186
213
|
// logging of the actual available configs
|
|
187
|
-
else if(id.indexOf("logAvailableConfignames") !== -1){
|
|
214
|
+
else if(id.indexOf(".logAvailableConfignames") !== -1){
|
|
188
215
|
this.log.info(`The following devicenames has an existing downlink-config`);
|
|
189
216
|
let index = 0;
|
|
190
217
|
for(const devicename in this.downlinkConfighandler?.activeDownlinkConfigs){
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.lorawan",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
4
4
|
"description": "converts the desired lora gateway data to a ioBroker structure",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "BenAhrdt",
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"@iobroker/adapter-core": "^3.0.4",
|
|
28
|
+
"js-crc": "^0.2.0",
|
|
28
29
|
"mqtt": "^5.3.5"
|
|
29
30
|
},
|
|
30
31
|
"devDependencies": {
|
|
@@ -42,8 +43,8 @@
|
|
|
42
43
|
"@types/proxyquire": "^1.3.31",
|
|
43
44
|
"@types/sinon": "^17.0.3",
|
|
44
45
|
"@types/sinon-chai": "^3.2.12",
|
|
45
|
-
"chai-as-promised": "^7.1.1",
|
|
46
46
|
"chai": "^4.4.1",
|
|
47
|
+
"chai-as-promised": "^7.1.1",
|
|
47
48
|
"eslint": "^8.56.0",
|
|
48
49
|
"mocha": "^10.2.0",
|
|
49
50
|
"proxyquire": "^2.1.3",
|