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 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
  }
@@ -61,9 +61,8 @@
61
61
  "type": "password",
62
62
  "label": "password",
63
63
  "tooltip": "passwordTooltip",
64
- "repeat": true,
65
64
  "default": "",
66
- "sm": 6
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":2
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.5",
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": ">=5.1.13"
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: true,
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
- foundMatch = deviceType;
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.setObjectAsync(`${deviceStartdirectory}.downlink.control.${downlinkConfig.name}`,{
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: true,
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("*.configuration.*");
60
- this.subscribeStatesAsync("*downlink.control.*");
61
- this.subscribeStatesAsync("*.logAvailableConfignames");
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.5",
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",