iobroker.lorawan 1.17.13 → 1.17.15

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
@@ -23,6 +23,13 @@ For now there is documentation in English here: https://wiki.hafenmeister.de
23
23
  Placeholder for the next version (at the beginning of the line):
24
24
  ### **WORK IN PROGRESS**
25
25
  -->
26
+ ### 1.17.15 (2025-09-25)
27
+ * (BenAhrdt) notifi new discover in case of oldDiscoveredDevices
28
+ * (BenAhrdt) bugfix debug logging
29
+
30
+ ### 1.17.14 (2025-09-24)
31
+ * (BenAhrdt) add humidifier to foreign States
32
+
26
33
  ### 1.17.13 (2025-09-24)
27
34
  * (BenAhrdt) Bugfix discover new devices
28
35
 
@@ -174,5 +174,13 @@
174
174
  "ClimateForeignHeader": "Definieren Sie Zustände für eine Klima Entität",
175
175
  "ClimateForeignInformation": "Hier können Sie ein Array von Klimaentitäten definieren",
176
176
  "VirtualMode": "Virtueller Modus",
177
- "VirtualModeTooltip": "Aktivieren Sie diese Option, wenn kein Modus als State vorhanden ist."
177
+ "VirtualModeTooltip": "Aktivieren Sie diese Option, wenn kein Modus als State vorhanden ist.",
178
+ "HumidifierHeader": "Definieren Sie Zustände für eine Luftbefeuchterentität",
179
+ "HumidifierInformation": "Hier können Sie eine Reihe von Luftbefeuchterdefinitionen definieren",
180
+ "HumidifierNameText": "Entitätsname",
181
+ "Humidifier": "Luftbefeuchter",
182
+ "WithAct": "mit Act-State",
183
+ "HumidifierOnOffText": "Ein / Aus",
184
+ "HumidifierTargetText": "Zielfeuchtigkeit",
185
+ "HumidifierActText": "Tatsächliche Luftfeuchtigkeit"
178
186
  }
@@ -174,5 +174,13 @@
174
174
  "ClimateForeignHeader": "Define States for Climate Entity",
175
175
  "ClimateForeignInformation": "Here you can define an array of Climate definitions",
176
176
  "VirtualMode": "Virtual Mode",
177
- "VirtualModeTooltip": "Activate, if a mode id is not present"
177
+ "VirtualModeTooltip": "Activate, if a mode id is not present",
178
+ "HumidifierHeader": "Define States for a Humidifier Entity",
179
+ "HumidifierInformation": "Here you can define an array of Humidifier definitions",
180
+ "HumidifierNameText": "Entityname",
181
+ "Humidifier": "Humidifier",
182
+ "WithAct": "with Act-State",
183
+ "HumidifierOnOffText": "On / Off",
184
+ "HumidifierTargetText": "Target humidity",
185
+ "HumidifierActText": "Actual humidity"
178
186
  }
@@ -174,5 +174,13 @@
174
174
  "ClimateForeignHeader": "Definir estados para la entidad climática",
175
175
  "ClimateForeignInformation": "Aquí puedes definir una variedad de definiciones climáticas",
176
176
  "VirtualMode": "Modo virtual",
177
- "VirtualModeTooltip": "Activar, si no está presente una identificación de modo"
177
+ "VirtualModeTooltip": "Activar, si no está presente una identificación de modo",
178
+ "HumidifierHeader": "Definir estados para la entidad humidificador",
179
+ "HumidifierInformation": "Aquí puede definir una variedad de definiciones de humidificadores",
180
+ "HumidifierNameText": "Entidad",
181
+ "Humidifier": "Humidificador",
182
+ "WithAct": "con estado de acto",
183
+ "HumidifierOnOffText": "Encendido / apagado",
184
+ "HumidifierTargetText": "Humedad objetivo",
185
+ "HumidifierActText": "Humedad real"
178
186
  }
@@ -51,7 +51,7 @@
51
51
  "deviceType": "type d'appareil",
52
52
  "expertSettings": "Sets d'experts",
53
53
  "enabled & collect": "activé et collecté",
54
- "deviceTypeTooltip": "insert the name of the device type, this config is valid. (par exemple, Dragino Xy correspond également à Dragino)",
54
+ "deviceTypeTooltip": "Insérez le nom du type de périphérique, cette configuration est valide. (par exemple, Dragino Xy correspond également à Dragino)",
55
55
  "sendWithUplink": "Envoyer avec la liaison montante",
56
56
  "sendWithUplinkTooltip": "Choisissez votre mode d'envoi pour les configurations avec le deviceType souhaité",
57
57
  "decimalPlaces": "décimal",
@@ -77,7 +77,7 @@
77
77
  "unused": "inutilisé",
78
78
  "downlinkConfigHeader": "Ajoutez les liaisons descendantes de votre appareil spécifiques",
79
79
  "customConfig": "\"Custom\" -konfiguation",
80
- "customConfigHeader": "Ajoutez un objet personnalisé spécifique à chaque état décodé",
80
+ "customConfigHeader": "Ajouter un objet personnalisé spécifique à chaque état décodé",
81
81
  "customJson": "Objekt für den \"Custom\" -Bereich im \"commun\" objekt",
82
82
  "customJsonTooltip": "Fügen Sie Ein objekt Hinzu, Welches en commun. Custom Geschrieben Wird.",
83
83
  "customJsonInformation": "Avec cette fonction, il est possible d'ajouter vos propres entrées personnalisées aux états décodés. Entrez simplement le contenu JSON souhaité en fonction active.",
@@ -112,7 +112,7 @@
112
112
  "minus": "moins",
113
113
  "BridgeHeader": "Pont vers un système étranger",
114
114
  "_DeviceIdentifierConfiguredDiscription": "Résultat d'un sujet configuré:",
115
- "_DeviceIdentifierDiscription": "Configurez les identifiants pour créer un sujet MQTT pour un état. You can select multiple device identifiers, separated by the separator.",
115
+ "_DeviceIdentifierDiscription": "Configurez les identifiants pour créer un sujet MQTT pour un état. Vous pouvez sélectionner plusieurs identificateurs d'appareils, séparés par le séparateur.",
116
116
  "_DeviceIdentifierExampleDiscription": "Exemple de sujet configuré:",
117
117
  "_NoLoRaWAN": "L'État n'est pas dans l'instance de Lorawan droite",
118
118
  "publishTooltip": "Publier l'État sur le pont",
@@ -174,5 +174,13 @@
174
174
  "ClimateForeignHeader": "Définir les États de l'entité climatique",
175
175
  "ClimateForeignInformation": "Ici, vous pouvez définir un tableau de définitions climatiques",
176
176
  "VirtualMode": "Mode virtuel",
177
- "VirtualModeTooltip": "Activer, si un ID de mode n'est pas présent"
177
+ "VirtualModeTooltip": "Activer, si un ID de mode n'est pas présent",
178
+ "HumidifierHeader": "Définir les états de l'entité humidificateur",
179
+ "HumidifierInformation": "Ici, vous pouvez définir un éventail de définitions d'humidificateur",
180
+ "HumidifierNameText": "Entité",
181
+ "Humidifier": "Humidificateur",
182
+ "WithAct": "avec ACT-State",
183
+ "HumidifierOnOffText": "En marche / arrêt",
184
+ "HumidifierTargetText": "Humidité cible",
185
+ "HumidifierActText": "Humidité réelle"
178
186
  }
@@ -174,5 +174,13 @@
174
174
  "ClimateForeignHeader": "Definire gli stati per l'entità climatica",
175
175
  "ClimateForeignInformation": "Qui puoi definire una serie di definizioni climatiche",
176
176
  "VirtualMode": "Modalità virtuale",
177
- "VirtualModeTooltip": "Attivare, se un ID modalità non è presente"
177
+ "VirtualModeTooltip": "Attivare, se un ID modalità non è presente",
178
+ "HumidifierHeader": "Definisci gli stati per l'entità dell'umidificatore",
179
+ "HumidifierInformation": "Qui puoi definire una serie di definizioni di umidificatore",
180
+ "HumidifierNameText": "EntityName",
181
+ "Humidifier": "Umidificatore",
182
+ "WithAct": "con Act-State",
183
+ "HumidifierOnOffText": "ON / OFF",
184
+ "HumidifierTargetText": "Umidità target",
185
+ "HumidifierActText": "Umidità reale"
178
186
  }
@@ -174,5 +174,13 @@
174
174
  "ClimateForeignHeader": "Definieer staten voor klimaat entiteit",
175
175
  "ClimateForeignInformation": "Hier kunt u een scala aan klimaatdefinities definiëren",
176
176
  "VirtualMode": "Virtuele modus",
177
- "VirtualModeTooltip": "Activeer, als een modus -ID niet aanwezig is"
177
+ "VirtualModeTooltip": "Activeer, als een modus -ID niet aanwezig is",
178
+ "HumidifierHeader": "Definieer staten voor de luchtbevochtiger",
179
+ "HumidifierInformation": "Hier kunt u een scala aan definities voor luchtbevochtigers definiëren",
180
+ "HumidifierNameText": "EntityName",
181
+ "Humidifier": "Luchtbevochtiger",
182
+ "WithAct": "met Act-State",
183
+ "HumidifierOnOffText": "Aan / uit",
184
+ "HumidifierTargetText": "Richt de luchtvochtigheid",
185
+ "HumidifierActText": "Werkelijke vochtigheid"
178
186
  }
@@ -174,5 +174,13 @@
174
174
  "ClimateForeignHeader": "Zdefiniuj stany dla jednostki klimatycznej",
175
175
  "ClimateForeignInformation": "Tutaj możesz zdefiniować szereg definicji klimatycznych",
176
176
  "VirtualMode": "Tryb wirtualny",
177
- "VirtualModeTooltip": "Aktywuj, jeśli identyfikator trybu nie jest obecny"
177
+ "VirtualModeTooltip": "Aktywuj, jeśli identyfikator trybu nie jest obecny",
178
+ "HumidifierHeader": "Zdefiniuj stany dla jednostki nawilżacza",
179
+ "HumidifierInformation": "Tutaj możesz zdefiniować szereg definicji nawilżaczy",
180
+ "HumidifierNameText": "Nazwa EntityName",
181
+ "Humidifier": "Nawilżacz",
182
+ "WithAct": "Z ACT-State",
183
+ "HumidifierOnOffText": "Włącz / wyłączony",
184
+ "HumidifierTargetText": "Docelowa wilgotność",
185
+ "HumidifierActText": "Faktyczna wilgotność"
178
186
  }
@@ -174,5 +174,13 @@
174
174
  "ClimateForeignHeader": "Definir estados para a entidade climática",
175
175
  "ClimateForeignInformation": "Aqui você pode definir uma variedade de definições climáticas",
176
176
  "VirtualMode": "Modo virtual",
177
- "VirtualModeTooltip": "Ative, se um ID de modo não estiver presente"
177
+ "VirtualModeTooltip": "Ative, se um ID de modo não estiver presente",
178
+ "HumidifierHeader": "Defina estados para entidade umidificador",
179
+ "HumidifierInformation": "Aqui você pode definir uma variedade de definições de umidificador",
180
+ "HumidifierNameText": "EntityName",
181
+ "Humidifier": "Umidificador",
182
+ "WithAct": "com o estado do ACT",
183
+ "HumidifierOnOffText": "ON / OFF",
184
+ "HumidifierTargetText": "Umidade alvo",
185
+ "HumidifierActText": "Umidade real"
178
186
  }
@@ -174,5 +174,13 @@
174
174
  "ClimateForeignHeader": "Определить состояния для климатической сущности",
175
175
  "ClimateForeignInformation": "Здесь вы можете определить множество климатических определений",
176
176
  "VirtualMode": "Виртуальный режим",
177
- "VirtualModeTooltip": "Активируйте, если идентификатор режима отсутствует"
177
+ "VirtualModeTooltip": "Активируйте, если идентификатор режима отсутствует",
178
+ "HumidifierHeader": "Определите государства для увлажнительного сущности",
179
+ "HumidifierInformation": "Здесь вы можете определить массив определений увлажнителя",
180
+ "HumidifierNameText": "EntityName",
181
+ "Humidifier": "Увлажнитель",
182
+ "WithAct": "с Act-государством",
183
+ "HumidifierOnOffText": "ВКЛ / OFF",
184
+ "HumidifierTargetText": "Целевая влажность",
185
+ "HumidifierActText": "Фактическая влажность"
178
186
  }
@@ -75,7 +75,7 @@
75
75
  "keepalive": "зберігати",
76
76
  "keepaliveTooltip": "Введіть час у секундах для функції Keepalive",
77
77
  "unused": "невикористаний",
78
- "downlinkConfigHeader": "Додайте пристрій конкретні низки",
78
+ "downlinkConfigHeader": "Додайте свій пристрій конкретні низки",
79
79
  "customConfig": "\"Custom\" -konfitiguation",
80
80
  "customConfigHeader": "Додайте конкретний спеціальний об’єкт до кожного декодованого стану",
81
81
  "customJson": "Objekt für den \"custom\" -bereich im \"common\" objekt",
@@ -174,5 +174,13 @@
174
174
  "ClimateForeignHeader": "Визначте стани клімату",
175
175
  "ClimateForeignInformation": "Тут ви можете визначити безліч визначення клімату",
176
176
  "VirtualMode": "Віртуальний режим",
177
- "VirtualModeTooltip": "Активуйте, якщо ідентифікатор режиму немає"
177
+ "VirtualModeTooltip": "Активуйте, якщо ідентифікатор режиму немає",
178
+ "HumidifierHeader": "Визначте стани для зволожувача",
179
+ "HumidifierInformation": "Тут ви можете визначити безліч визначення зволожувача",
180
+ "HumidifierNameText": "EntityName",
181
+ "Humidifier": "Зволожувач",
182
+ "WithAct": "з акт-станом",
183
+ "HumidifierOnOffText": "Увімкнення / вимкнення",
184
+ "HumidifierTargetText": "Цільова вологість",
185
+ "HumidifierActText": "Фактична вологість"
178
186
  }
@@ -119,7 +119,7 @@
119
119
  "subscribeTooltip": "从桥梁订阅州",
120
120
  "BridgeStateHeader": "定义发现主题的状态",
121
121
  "BridgeStateInformation": "在这里,您可以定义一系列状态,这些状态将设置为发现的主题。 (通配符也是可能的)",
122
- "Application": "Application",
122
+ "Application": "应用",
123
123
  "Device": "设备",
124
124
  "Folder": "文件夹",
125
125
  "State": "状态",
@@ -174,5 +174,13 @@
174
174
  "ClimateForeignHeader": "定义气候实体的国家",
175
175
  "ClimateForeignInformation": "在这里您可以定义一系列气候定义",
176
176
  "VirtualMode": "虚拟模式",
177
- "VirtualModeTooltip": "激活,如果不存在模式ID"
177
+ "VirtualModeTooltip": "激活,如果不存在模式ID",
178
+ "HumidifierHeader": "定义加湿器实体的状态",
179
+ "HumidifierInformation": "在这里您可以定义一系列加湿器定义",
180
+ "HumidifierNameText": "EntityName",
181
+ "Humidifier": "加湿器",
182
+ "WithAct": "与行动状态",
183
+ "HumidifierOnOffText": "打开 /关",
184
+ "HumidifierTargetText": "目标湿度",
185
+ "HumidifierActText": "实际的湿度"
178
186
  }
@@ -1557,20 +1557,19 @@
1557
1557
  "xl": 2
1558
1558
  },
1559
1559
  {
1560
- "newLine": true,
1561
1560
  "type": "staticText",
1562
1561
  "attr": "_statciTextTarget",
1563
- "label": "ClimateTargetTemperatureText",
1562
+ "label": "",
1564
1563
  "xs": 12,
1565
- "sm": 12,
1566
- "md": 12,
1567
- "lg": 12,
1568
- "xl": 12
1564
+ "sm": 6,
1565
+ "md": 6,
1566
+ "lg": 6,
1567
+ "xl": 6
1569
1568
  },
1570
1569
  {
1571
1570
  "type": "objectId",
1572
1571
  "attr": "TargetId",
1573
- "label": "TargetId",
1572
+ "label": "ClimateTargetTemperatureText",
1574
1573
  "xs": 12,
1575
1574
  "sm": 4,
1576
1575
  "md": 4,
@@ -1580,7 +1579,7 @@
1580
1579
  {
1581
1580
  "type": "objectId",
1582
1581
  "attr": "ActId",
1583
- "label": "ActId",
1582
+ "label": "ClimateActTemperatureText",
1584
1583
  "xs": 12,
1585
1584
  "sm": 4,
1586
1585
  "md": 4,
@@ -1590,7 +1589,7 @@
1590
1589
  {
1591
1590
  "type": "objectId",
1592
1591
  "attr": "ModeId",
1593
- "label": "ModeId",
1592
+ "label": "ClimateModeTemperatureText",
1594
1593
  "hidden": "data.VirtualMode === true",
1595
1594
  "xs": 12,
1596
1595
  "sm": 4,
@@ -1599,6 +1598,121 @@
1599
1598
  "xl": 4
1600
1599
  }
1601
1600
  ]
1601
+ },
1602
+ "_HumidifierForeignHeader":{
1603
+ "newLine": true,
1604
+ "type": "header",
1605
+ "text": "HumidifierHeader",
1606
+ "size": 3,
1607
+ "xs": 12,
1608
+ "sm": 12,
1609
+ "md": 12,
1610
+ "lg": 12,
1611
+ "xl": 12
1612
+ },
1613
+ "_HumidifierForeignInformation":{
1614
+ "newLine":true,
1615
+ "type": "staticText",
1616
+ "label": "HumidifierInformation",
1617
+ "xs": 12,
1618
+ "sm": 12,
1619
+ "md": 12,
1620
+ "lg": 12,
1621
+ "xl": 12
1622
+ },
1623
+ "HumidifierForeignConfig":{
1624
+ "newLine": true,
1625
+ "type":"accordion",
1626
+ "titleAttr": "HumidifierName",
1627
+ "clone": true,
1628
+ "xs": 12,
1629
+ "sm": 12,
1630
+ "md": 12,
1631
+ "lg": 12,
1632
+ "xl": 12,
1633
+ "items":[
1634
+ {
1635
+ "type": "text",
1636
+ "attr": "HumidifierName",
1637
+ "label": "HumidifierNameText",
1638
+ "validator": "if(data.HumidifierName === ''){return false;}else{return true;}",
1639
+ "validatorNoSaveOnError": true,
1640
+ "default": "Humidifier Name",
1641
+ "xs": 12,
1642
+ "sm": 4,
1643
+ "md": 4,
1644
+ "lg": 4,
1645
+ "xl": 4
1646
+ },
1647
+ {
1648
+ "type": "checkbox",
1649
+ "attr": "Humidifier",
1650
+ "label": "Humidifier",
1651
+ "tooltip": "HumidifierTooltip",
1652
+ "default": true,
1653
+ "xs": 12,
1654
+ "sm": 2,
1655
+ "md": 2,
1656
+ "lg": 2,
1657
+ "xl": 2
1658
+ },
1659
+ {
1660
+ "type": "checkbox",
1661
+ "attr": "WithAct",
1662
+ "label": "WithAct",
1663
+ "tooltip": "HumidifierTooltip",
1664
+ "default": true,
1665
+ "xs": 12,
1666
+ "sm": 2,
1667
+ "md": 2,
1668
+ "lg": 2,
1669
+ "xl": 2
1670
+ },
1671
+ {
1672
+ "type": "staticText",
1673
+ "attr": "_staticTextTarget",
1674
+ "label": "",
1675
+ "xs": 12,
1676
+ "sm": 4,
1677
+ "md": 4,
1678
+ "lg": 4,
1679
+ "xl": 4
1680
+ },
1681
+ {
1682
+ "type": "objectId",
1683
+ "attr": "OnOffId",
1684
+ "label": "HumidifierOnOffText",
1685
+ "customFilter": "{common: {type: ['boolean']}",
1686
+ "xs": 12,
1687
+ "sm": 4,
1688
+ "md": 4,
1689
+ "lg": 4,
1690
+ "xl": 4
1691
+ },
1692
+ {
1693
+ "type": "objectId",
1694
+ "attr": "TargetId",
1695
+ "label": "HumidifierTargetText",
1696
+ "customFilter": "{common: {type: ['number']}",
1697
+ "xs": 12,
1698
+ "sm": 4,
1699
+ "md": 4,
1700
+ "lg": 4,
1701
+ "xl": 4
1702
+ },
1703
+ {
1704
+ "type": "objectId",
1705
+ "attr": "ActId",
1706
+ "label": "HumidifierActText",
1707
+ "hidden": "data.WithAct === false",
1708
+ "customFilter": "{common: {type: ['number']}",
1709
+ "xs": 12,
1710
+ "sm": 4,
1711
+ "md": 4,
1712
+ "lg": 4,
1713
+ "xl": 4
1714
+ }
1715
+ ]
1602
1716
  }
1603
1717
  }
1604
1718
  }
package/io-package.json CHANGED
@@ -1,8 +1,34 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "lorawan",
4
- "version": "1.17.13",
4
+ "version": "1.17.15",
5
5
  "news": {
6
+ "1.17.15": {
7
+ "en": "notifi new discover in case of oldDiscoveredDevices\nbugfix debug logging",
8
+ "de": "notifi neu entdecken bei oldDiscoveredDevices\nbugfix debug protokollierung",
9
+ "ru": "уведомить новое открытие в случае старых обнаруженных устройств\nрегистрация отладчиков",
10
+ "pt": "notifi nova descoberta no caso de dispositivos antigosdescoberta\nregistro de depuração de bugfix",
11
+ "nl": "notifi nieuwe ontdekking in het geval van oudeDiscoverdDevices\nbugfix debug logging",
12
+ "fr": "notifi nouveau découverte en cas d'ancienDiscoveredDevices\nbugfix debug loging",
13
+ "it": "notifi nuova scoperta in caso di vecchiDiscoveredDevices\nbugfix debug logging",
14
+ "es": "notifi new discover in case of oldDiscoveredDevices\nbugfix debug logging",
15
+ "pl": "notifi nowe odkrycie w przypadku old DiscoveredDevices\nlogowanie debugfix",
16
+ "uk": "неідентифікувати нове відкриття у разі виникнення застарілих\nзареєструватися",
17
+ "zh-cn": "旧发现器的新发现\n调试日志"
18
+ },
19
+ "1.17.14": {
20
+ "en": "add humidifier to foreign States",
21
+ "de": "fügen Sie Befeuchter für ausländische Staaten hinzu",
22
+ "ru": "добавить увлажнитель воздуха в иностранные государства",
23
+ "pt": "adicionar umidificador a estados estrangeiros",
24
+ "nl": "luchtbevochtiger toevoegen aan buitenlandse staten",
25
+ "fr": "ajouter l'humidificateur aux États étrangers",
26
+ "it": "aggiungere umidificatore agli Stati esteri",
27
+ "es": "añadir humidificador a Estados extranjeros",
28
+ "pl": "dodać nawilżacz do obcych państw",
29
+ "uk": "додати зволожувач до іноземних держав",
30
+ "zh-cn": "向外国添加增湿剂"
31
+ },
6
32
  "1.17.13": {
7
33
  "en": "Bugfix discover new devices",
8
34
  "de": "Bugfix neue Geräte entdecken",
@@ -67,32 +93,6 @@
67
93
  "pl": "Ustaw domyślny identyfikator urządzenia dla funkcji mostka LoRaWAN na użyty identyfikator urządzenia",
68
94
  "uk": "Встановлено значення за замовчуванням ідентифікатора пристрою для функції моста LoRaWAN на Device Id.",
69
95
  "zh-cn": "将LoRaWAN桥接功能的setdefault设备标识符设置为使用设备ID。"
70
- },
71
- "1.17.8": {
72
- "en": "normalize [] () & {} into _",
73
- "de": "normalize [] () & {} into _",
74
- "ru": "Нормализовать [] () & {} в _",
75
- "pt": "Normalizar [] () & {} para _",
76
- "nl": "normalize [] () & {} into _",
77
- "fr": "normaliser [] () & {} en _",
78
- "it": "normalizzare [] () & {} in _",
79
- "es": "Normalizar [] () & {} en _.",
80
- "pl": "zamień [] () & {} na _",
81
- "uk": "нормалізувати [] () & {} у _",
82
- "zh-cn": "将[]()和{}转换为_"
83
- },
84
- "1.17.7": {
85
- "en": "Virtal Mode for Foreign climate entities available",
86
- "de": "Virtueller Modus für externe Klima-Entitäten verfügbar",
87
- "ru": "Доступен виртуальный режим для иностранных сущностей климата",
88
- "pt": "Modo virtual para entidades de clima estrangeiras disponível.",
89
- "nl": "Virtuele Modus voor Externe klimaatentiteiten beschikbaar",
90
- "fr": "Mode virtuel pour les entités climatiques étrangères disponible",
91
- "it": "Modalità virtuale per le entità di clima estere disponibile",
92
- "es": "Modo virtual para entidades de clima extranjeras disponible.",
93
- "pl": "Dostępny tryb wirtualny dla zagranicznych jednostek klimatyzacyjnych.",
94
- "uk": "Доступний режим віртуальних сутностей для зовнішнього клімату",
95
- "zh-cn": "可用于外部气候实体的虚拟模式"
96
96
  }
97
97
  },
98
98
  "titleLang": {
@@ -453,7 +453,8 @@
453
453
  }
454
454
  ],
455
455
  "ClimateConfig": [],
456
- "ClimateForeignConfig": []
456
+ "ClimateForeignConfig": [],
457
+ "HumidifierForeignConfig": []
457
458
  },
458
459
  "objects": [],
459
460
  "instanceObjects": [
@@ -36,6 +36,7 @@ class bridgeClass {
36
36
  this.EndingSet = '/set';
37
37
  this.EndingState = '/state';
38
38
  this.EndingVirtualClimate = '.virtual_climate';
39
+ this.EndingVirtualHumidifier = '.virtual_humiditier';
39
40
  this.EndingVirtualMode = '.virtual_mode';
40
41
  this.NotificationId = '.notification';
41
42
  this.GeneralId = '.general';
@@ -43,6 +44,8 @@ class bridgeClass {
43
44
  this.OnlineId = '.online';
44
45
  this.EndingNotification = '.notification';
45
46
  this.ClimateEntityType = 'climate';
47
+ this.HumidifierEntityType = 'humidifier';
48
+ this.DeHumidifierEntityType = 'dehumidifier';
46
49
  this.NotificationEntityType = 'device_automation';
47
50
  this.MaxValueCount = 5;
48
51
  this.Words = {
@@ -73,6 +76,7 @@ class bridgeClass {
73
76
  },
74
77
  };
75
78
  this.discoveredDevices = {};
79
+ this.oldDiscoveredDevices = {};
76
80
 
77
81
  // Unitmapping zur Zuweisung der passenden Unit, wenn diese falsch geschrieben ist
78
82
  this.unitMap = {
@@ -272,27 +276,6 @@ class bridgeClass {
272
276
  }
273
277
  }
274
278
 
275
- /*********************************************************************
276
- * *************** Discover Device Notifications *********************
277
- * ******************************************************************/
278
-
279
- /**
280
- * @param normalizedDeficeIdentifier identifier od device
281
- */
282
- async checkNewDeviceDiscovered(normalizedDeficeIdentifier) {
283
- const activeFunction = 'bridge.js checkNewDeviceDiscovered';
284
- this.adapter.log.debug(`Function ${activeFunction} started.`);
285
- try {
286
- if (!this.discoveredDevices[normalizedDeficeIdentifier]) {
287
- this.discoveredDevices[normalizedDeficeIdentifier] = {};
288
- return true;
289
- }
290
- return false;
291
- } catch (error) {
292
- this.adapter.log.error(`error at ${activeFunction}: ${error}`);
293
- }
294
- }
295
-
296
279
  /*********************************************************************
297
280
  * ******************** Discover Notification ************************
298
281
  * ******************************************************************/
@@ -990,24 +973,34 @@ class bridgeClass {
990
973
  if (typeof DiscoveryObject.payload !== 'string') {
991
974
  // Payload is not empty => discover
992
975
  const normalizedDeficeIdentifier = DiscoveryObject.payload.device.identifiers[0];
993
- const notificationId = `${this.adapter.namespace}.${this.Words.notification}${this.GeneralId}`;
994
976
  // New Device
995
- if (!this.discoveredDevices[normalizedDeficeIdentifier] && id !== notificationId) {
977
+ if (!this.discoveredDevices[normalizedDeficeIdentifier]) {
996
978
  this.discoveredDevices[normalizedDeficeIdentifier] = {};
997
- returnValue.newDevice = DiscoveryObject;
998
- const device = DiscoveryObject.informations.usedDeviceId;
999
- let message = `${this.adapter.i18nTranslation['new device discovered']}.\n${this.adapter.i18nTranslation['Device']}: ${device}`;
1000
- if (DiscoveryObject.informations.usedApplicationName) {
1001
- const application = DiscoveryObject.informations.usedApplicationName;
1002
- message += `\n${this.adapter.i18nTranslation['Application']}: ${application}`;
979
+ if (!this.oldDiscoveredDevices[normalizedDeficeIdentifier]) {
980
+ // Only messegae with ne fiscovered dewvice, if not in old discovered devices
981
+ returnValue.newDevice = DiscoveryObject;
982
+ let device = 'unknown';
983
+ if (DiscoveryObject.informations.usedDeviceId) {
984
+ device = DiscoveryObject.informations.usedDeviceId;
985
+ } else if (
986
+ DiscoveryObject.informations.target &&
987
+ DiscoveryObject.informations.target.usedDeviceId
988
+ ) {
989
+ device = DiscoveryObject.informations.target.usedDeviceId;
990
+ }
991
+ let message = `${this.adapter.i18nTranslation['new device discovered']}.\n${this.adapter.i18nTranslation['Device']}: ${device}`;
992
+ if (DiscoveryObject.informations.usedApplicationName) {
993
+ const application = DiscoveryObject.informations.usedApplicationName;
994
+ message += `\n${this.adapter.i18nTranslation['Application']}: ${application}`;
995
+ }
996
+ const notificationId = `${this.adapter.namespace}.${this.adapter.bridge.Words.notification}${this.adapter.bridge.GeneralId}`;
997
+ await this.adapter.bridge?.publishNotification(
998
+ notificationId,
999
+ message,
1000
+ this.adapter.bridge?.Notificationlevel.deviceState,
1001
+ false,
1002
+ );
1003
1003
  }
1004
- const notificationId = `${this.adapter.namespace}.${this.adapter.bridge.Words.notification}${this.adapter.bridge.GeneralId}`;
1005
- await this.adapter.bridge?.publishNotification(
1006
- notificationId,
1007
- message,
1008
- this.adapter.bridge?.Notificationlevel.deviceState,
1009
- false,
1010
- );
1011
1004
  }
1012
1005
  // New Id
1013
1006
  if (!this.DiscoveredIds[id]) {
@@ -1401,6 +1394,9 @@ class bridgeClass {
1401
1394
  try {
1402
1395
  // get old Discovered ids
1403
1396
  this.OldDiscoveredIds = JSON.parse((await this.adapter.getStateAsync('info.discoveredIds')).val);
1397
+ this.oldDiscoveredDevices = this.generateOldDevices(this.OldDiscoveredIds);
1398
+ //this.adapter.log.error(JSON.stringify(this.oldDiscoveredDevices));
1399
+ await this.discoverGeneralNotification();
1404
1400
 
1405
1401
  // Get all ids in adapterfolder
1406
1402
  // Generate Infos of all devices and decoded folders
@@ -1426,36 +1422,68 @@ class bridgeClass {
1426
1422
  await this.discoverClimate();
1427
1423
  await this.getForeignStatesForStandardEntities();
1428
1424
  await this.getForeignClimateConfig();
1429
- await this.discoverGeneralNotification();
1425
+ await this.getForeignHumidifierConfig();
1430
1426
  await this.checkDiscoveries();
1431
1427
  } catch (error) {
1432
1428
  this.adapter.log.error(`error at ${activeFunction}: ${error}`);
1433
1429
  }
1434
1430
  }
1435
1431
 
1432
+ /**
1433
+ * @param oldDiscoveredIds Ids wiche are discovered last time that Adapter runs
1434
+ */
1435
+ generateOldDevices(oldDiscoveredIds) {
1436
+ const activeFunction = 'bridge.js - generateOldDevices';
1437
+ this.adapter.log.debug(`Function ${activeFunction} started.`);
1438
+ try {
1439
+ const oldDevices = {};
1440
+ for (const id of Object.values(oldDiscoveredIds)) {
1441
+ const normalizedDeviceidentifier = id.payload.device.identifiers[0];
1442
+ if (!oldDevices[normalizedDeviceidentifier]) {
1443
+ oldDevices[normalizedDeviceidentifier] = {};
1444
+ }
1445
+ }
1446
+ return oldDevices;
1447
+ } catch (error) {
1448
+ this.adapter.log.error(`error at ${activeFunction}: ${error}`);
1449
+ return {};
1450
+ }
1451
+ }
1452
+
1436
1453
  /**
1437
1454
  * check discovery for old entries
1438
1455
  */
1439
1456
  async checkDiscoveries() {
1440
- for (const id in this.OldDiscoveredIds) {
1441
- if (!this.DiscoveredIds[id]) {
1442
- this.adapter.log.debug(`The discovered id: ${id} will be removed`);
1443
- this.DiscoveredIds[id] = this.OldDiscoveredIds[id];
1444
- this.DiscoveredIds[id].payload = '';
1445
- await this.publishDiscovery(id, this.DiscoveredIds[id]);
1446
- delete this.DiscoveredIds[id];
1447
- await this.adapter.setState('info.discoveredIds', JSON.stringify(this.DiscoveredIds), true);
1448
- } else {
1449
- if (this.DiscoveredIds[id].topic !== this.OldDiscoveredIds[id].topic) {
1450
- this.adapter.log.debug(`The discovered topic: ${this.OldDiscoveredIds[id].topic} will be removed`);
1451
- const safeCurrent = this.DiscoveredIds[id];
1457
+ const activeFunction = 'bridge.js - checkDiscoveries';
1458
+ this.adapter.log.debug(`Function ${activeFunction} started.`);
1459
+ try {
1460
+ for (const id in this.OldDiscoveredIds) {
1461
+ if (!this.DiscoveredIds[id]) {
1462
+ this.adapter.log.debug(`The discovered id: ${id} will be removed`);
1452
1463
  this.DiscoveredIds[id] = this.OldDiscoveredIds[id];
1453
1464
  this.DiscoveredIds[id].payload = '';
1454
1465
  await this.publishDiscovery(id, this.DiscoveredIds[id]);
1455
- this.DiscoveredIds[id] = safeCurrent;
1456
- await this.publishDiscovery(id, this.DiscoveredIds[id]);
1466
+ delete this.DiscoveredIds[id];
1467
+ delete this.OldDiscoveredIds[id];
1468
+ await this.adapter.setState('info.discoveredIds', JSON.stringify(this.DiscoveredIds), true);
1469
+ } else {
1470
+ if (this.DiscoveredIds[id].topic !== this.OldDiscoveredIds[id].topic) {
1471
+ this.adapter.log.debug(
1472
+ `The discovered topic: ${this.OldDiscoveredIds[id].topic} will be removed`,
1473
+ );
1474
+ const safeCurrent = this.DiscoveredIds[id];
1475
+ this.DiscoveredIds[id] = this.OldDiscoveredIds[id];
1476
+ this.DiscoveredIds[id].payload = '';
1477
+ await this.publishDiscovery(id, this.DiscoveredIds[id]);
1478
+ this.DiscoveredIds[id] = safeCurrent;
1479
+ await this.publishDiscovery(id, this.DiscoveredIds[id]);
1480
+ }
1457
1481
  }
1458
1482
  }
1483
+ //Assign new Discoverd Devices to Old
1484
+ this.oldDiscoveredDevices = structuredClone(this.discoveredDevices);
1485
+ } catch (error) {
1486
+ this.adapter.log.error(`error at ${activeFunction}: ${error}`);
1459
1487
  }
1460
1488
  }
1461
1489
  // create schedule Jobs for online and historic values
@@ -1601,7 +1629,7 @@ class bridgeClass {
1601
1629
  this.SubscribedTopics,
1602
1630
  `${target.Topic}${this.EndingSet}`,
1603
1631
  {
1604
- deviceId: target.DeviceIdentifier,
1632
+ usedDeviceId: target.DeviceIdentifier,
1605
1633
  },
1606
1634
  DiscoveryTopic,
1607
1635
  DiscoveryPayload,
@@ -1613,7 +1641,7 @@ class bridgeClass {
1613
1641
  this.SubscribedTopics,
1614
1642
  `${mode.Topic}${this.EndingSet}`,
1615
1643
  {
1616
- deviceId: mode.DeviceIdentifier,
1644
+ usedDeviceId: mode.DeviceIdentifier,
1617
1645
  },
1618
1646
  DiscoveryTopic,
1619
1647
  DiscoveryPayload,
@@ -1626,7 +1654,7 @@ class bridgeClass {
1626
1654
  this.PublishedIds,
1627
1655
  config.climateIds.target,
1628
1656
  {
1629
- deviceId: target.DeviceIdentifier,
1657
+ usedDeviceId: target.DeviceIdentifier,
1630
1658
  },
1631
1659
  DiscoveryTopic,
1632
1660
  DiscoveryPayload,
@@ -1638,7 +1666,7 @@ class bridgeClass {
1638
1666
  this.PublishedIds,
1639
1667
  config.climateIds.act,
1640
1668
  {
1641
- deviceId: act.DeviceIdentifier,
1669
+ usedDeviceId: act.DeviceIdentifier,
1642
1670
  },
1643
1671
  DiscoveryTopic,
1644
1672
  DiscoveryPayload,
@@ -1650,7 +1678,7 @@ class bridgeClass {
1650
1678
  this.PublishedIds,
1651
1679
  config.climateIds.mode,
1652
1680
  {
1653
- deviceId: mode.DeviceIdentifier,
1681
+ usedDeviceId: mode.DeviceIdentifier,
1654
1682
  },
1655
1683
  DiscoveryTopic,
1656
1684
  DiscoveryPayload,
@@ -1668,13 +1696,13 @@ class bridgeClass {
1668
1696
  payload: structuredClone(DiscoveryPayload),
1669
1697
  informations: {
1670
1698
  target: {
1671
- deviceId: target.DeviceIdentifier,
1699
+ usedDeviceId: target.DeviceIdentifier,
1672
1700
  },
1673
1701
  act: {
1674
- deviceId: act.DeviceIdentifier,
1702
+ usedDeviceId: act.DeviceIdentifier,
1675
1703
  },
1676
1704
  mode: {
1677
- deviceId: mode.DeviceIdentifier,
1705
+ usedDeviceId: mode.DeviceIdentifier,
1678
1706
  },
1679
1707
  },
1680
1708
  });
@@ -1694,7 +1722,7 @@ class bridgeClass {
1694
1722
  }
1695
1723
 
1696
1724
  /*********************************************************************
1697
- * ****************** generate Climate Ids ***************************
1725
+ * *************** generate Foreign Climate Ids **********************
1698
1726
  * ******************************************************************/
1699
1727
 
1700
1728
  /**
@@ -1713,7 +1741,7 @@ class bridgeClass {
1713
1741
  climateIds.mode = config.ModeId;
1714
1742
  }
1715
1743
  for (const id of Object.values(climateIds)) {
1716
- // Just lockto object, if it does not end with Virtual Mode
1744
+ // Just lock to object, if it does not end with Virtual Mode
1717
1745
  if (!id.endsWith(this.EndingVirtualMode)) {
1718
1746
  if (!(await this.adapter.getForeignObjectAsync(id))) {
1719
1747
  this.adapter.log.debug(`Id: ${id} does not exsit.`);
@@ -1736,6 +1764,232 @@ class bridgeClass {
1736
1764
  }
1737
1765
  }
1738
1766
 
1767
+ /**
1768
+ * get Foreign states for Bridge
1769
+ */
1770
+ async getForeignHumidifierConfig() {
1771
+ const activeFunction = 'bridge.js - getForeignHumidifierConfig';
1772
+ this.adapter.log.debug(`Function ${activeFunction} started.`);
1773
+ try {
1774
+ for (const config of this.adapter.config.HumidifierForeignConfig) {
1775
+ await this.discoverForeignHumidifier(config);
1776
+ }
1777
+ } catch (error) {
1778
+ this.adapter.log.error(`error at ${activeFunction}: ${error}`);
1779
+ }
1780
+ }
1781
+
1782
+ /**
1783
+ * get Foreign states for Bridge
1784
+ *
1785
+ * @param config config of the climate entity
1786
+ */
1787
+ async discoverForeignHumidifier(config) {
1788
+ const activeFunction = 'bridge.js - discoverForeignHumidifier';
1789
+ this.adapter.log.debug(`Function ${activeFunction} started.`);
1790
+ try {
1791
+ // Assign the Ids (use the codenameing of discoverClimate)
1792
+ if (!(await this.generateForeignHumidifierIds(config))) {
1793
+ this.adapter.log.warn(
1794
+ `The Foreign Humidifier config is not complete, or has error(s): ${config.ClimateName}`,
1795
+ );
1796
+ return;
1797
+ }
1798
+
1799
+ // On Off
1800
+ const onOff = {};
1801
+ onOff.DeviceIdentifier = (await this.getParentNameing(config.HumidifierIds.onOff))?.parentName;
1802
+ onOff.uniqueString = await this.getUniqueString(config.HumidifierIds.onOff, onOff.DeviceIdentifier);
1803
+ onOff.Topic = `${this.bridgeMqttClient.BridgePrefix}${onOff.uniqueString}`.toLowerCase();
1804
+
1805
+ // Target
1806
+ const target = {};
1807
+ target.DeviceIdentifier = (await this.getParentNameing(config.HumidifierIds.target))?.parentName;
1808
+ target.uniqueString = await this.getUniqueString(config.HumidifierIds.target, target.DeviceIdentifier);
1809
+ target.Topic = `${this.bridgeMqttClient.BridgePrefix}${target.uniqueString}`.toLowerCase();
1810
+
1811
+ //Min und Max holen
1812
+ const targetObject = await this.adapter.getForeignObjectAsync(config.HumidifierIds.target);
1813
+ if (targetObject.common.min) {
1814
+ target.min = targetObject.common.min;
1815
+ }
1816
+ if (targetObject.common.max) {
1817
+ target.max = targetObject.common.max;
1818
+ }
1819
+
1820
+ // Act
1821
+ const act = {};
1822
+ act.DeviceIdentifier = (await this.getParentNameing(config.HumidifierIds.act))?.parentName;
1823
+ act.uniqueString = await this.getUniqueString(config.HumidifierIds.act, act.DeviceIdentifier);
1824
+ act.Topic = `${this.bridgeMqttClient.BridgePrefix}${act.uniqueString}`.toLowerCase();
1825
+
1826
+ const humidifierUniquString = await this.getUniqueString(
1827
+ `${this.adapter.namespace}.${config.HumidifierName}`,
1828
+ target.DeviceIdentifier,
1829
+ );
1830
+ const entityType = config.Humidifier ? this.HumidifierEntityType : this.DeHumidifierEntityType;
1831
+ const DiscoveryTopic =
1832
+ `${this.BridgeDiscoveryPrefix[this.adapter.config.BridgeType]}${this.HumidifierEntityType}/${humidifierUniquString}/config`.toLowerCase();
1833
+ const indexLastDotTarget = config.HumidifierIds.target.lastIndexOf('.');
1834
+ const Id = config.HumidifierIds.target.substring(0, indexLastDotTarget) + this.EndingVirtualHumidifier;
1835
+
1836
+ const DiscoveryPayload = {
1837
+ name: config.HumidifierName,
1838
+ unique_id: `${humidifierUniquString}`.toLowerCase(),
1839
+ device: {
1840
+ identifiers: [this.normalizeString(target.DeviceIdentifier).toLowerCase()],
1841
+ name: target.DeviceIdentifier,
1842
+ },
1843
+ device_class: `${entityType}`,
1844
+ state_topic: `${onOff.Topic}${this.EndingState}`,
1845
+ command_topic: `${onOff.Topic}${this.EndingSet}`,
1846
+ state_on: 'true',
1847
+ payload_on: 'true',
1848
+ payload_off: 'false',
1849
+ min_humidity: target.min ? target.min : 0,
1850
+ max_humidity: target.max ? target.max : 100,
1851
+ target_humidity_state_topic: `${target.Topic}${this.EndingState}`,
1852
+ target_humidity_command_topic: `${target.Topic}${this.EndingSet}`,
1853
+ };
1854
+ if (config.WithAct) {
1855
+ DiscoveryPayload.current_humidity_topic = `${act.Topic}${this.EndingState}`;
1856
+ }
1857
+ // Assign Subscribed Topics
1858
+ // On Off
1859
+ this.assignTopicStructure(
1860
+ this.SubscribedTopics,
1861
+ `${onOff.Topic}${this.EndingSet}`,
1862
+ {
1863
+ usedDeviceId: onOff.DeviceIdentifier,
1864
+ },
1865
+ DiscoveryTopic,
1866
+ DiscoveryPayload,
1867
+ config.HumidifierIds.onOff,
1868
+ );
1869
+
1870
+ // Target
1871
+ this.assignTopicStructure(
1872
+ this.SubscribedTopics,
1873
+ `${target.Topic}${this.EndingSet}`,
1874
+ {
1875
+ usedDeviceId: target.DeviceIdentifier,
1876
+ },
1877
+ DiscoveryTopic,
1878
+ DiscoveryPayload,
1879
+ config.HumidifierIds.target,
1880
+ );
1881
+
1882
+ // Assign published Topics
1883
+ // On Off
1884
+ this.assignIdStructure(
1885
+ this.PublishedIds,
1886
+ config.HumidifierIds.onOff,
1887
+ {
1888
+ usedDeviceId: onOff.DeviceIdentifier,
1889
+ },
1890
+ DiscoveryTopic,
1891
+ DiscoveryPayload,
1892
+ `${onOff.Topic}${this.EndingState}`,
1893
+ );
1894
+
1895
+ // Target
1896
+ this.assignIdStructure(
1897
+ this.PublishedIds,
1898
+ config.HumidifierIds.target,
1899
+ {
1900
+ usedDeviceId: target.DeviceIdentifier,
1901
+ },
1902
+ DiscoveryTopic,
1903
+ DiscoveryPayload,
1904
+ `${target.Topic}${this.EndingState}`,
1905
+ );
1906
+
1907
+ // Act
1908
+ this.assignIdStructure(
1909
+ this.PublishedIds,
1910
+ config.HumidifierIds.act,
1911
+ {
1912
+ usedDeviceId: act.DeviceIdentifier,
1913
+ },
1914
+ DiscoveryTopic,
1915
+ DiscoveryPayload,
1916
+ `${act.Topic}${this.EndingState}`,
1917
+ );
1918
+ const informations = {
1919
+ onOff: {
1920
+ usedDeviceId: onOff.DeviceIdentifier,
1921
+ },
1922
+ target: {
1923
+ usedDeviceId: target.DeviceIdentifier,
1924
+ },
1925
+ };
1926
+ if (config.WithAct) {
1927
+ informations.act = { usedDeviceId: act.DeviceIdentifier };
1928
+ }
1929
+ // Publishing the discover message
1930
+ await this.publishDiscovery(Id, {
1931
+ topic: DiscoveryTopic,
1932
+ payload: structuredClone(DiscoveryPayload),
1933
+ informations: informations,
1934
+ });
1935
+ // Delay for publish new entity
1936
+ setTimeout(async () => {
1937
+ await this.publishId(config.HumidifierIds.onOff, undefined, {});
1938
+ await this.publishId(config.HumidifierIds.target, undefined, {});
1939
+ if (config.WithAct) {
1940
+ await this.publishId(config.HumidifierIds.act, undefined, {});
1941
+ }
1942
+ // Subscribe state for onStatechange mathode
1943
+ await this.adapter.subscribeForeignStatesAsync(config.HumidifierIds.onOff);
1944
+ await this.adapter.subscribeForeignStatesAsync(config.HumidifierIds.target);
1945
+ if (config.WithAct) {
1946
+ await this.adapter.subscribeForeignStatesAsync(config.HumidifierIds.act);
1947
+ }
1948
+ }, 1000);
1949
+ } catch (error) {
1950
+ this.adapter.log.error(`error at ${activeFunction}: ${error}`);
1951
+ }
1952
+ }
1953
+
1954
+ /*********************************************************************
1955
+ * *************** generate Foreign Climate Ids **********************
1956
+ * ******************************************************************/
1957
+
1958
+ /**
1959
+ * @param config Configuration of the climate entity, wich is to genereate
1960
+ */
1961
+ async generateForeignHumidifierIds(config) {
1962
+ const activeFunction = 'generateForeignHumidifierIds';
1963
+ this.adapter.log.debug(`Function ${activeFunction} started.`);
1964
+ try {
1965
+ const HumidifierIds = { onOff: '', target: '', act: '' };
1966
+ HumidifierIds.onOff = config.OnOffId;
1967
+ HumidifierIds.target = config.TargetId;
1968
+ HumidifierIds.act = config.ActId;
1969
+ for (const id of Object.values(HumidifierIds)) {
1970
+ // Just lock to object, if it does not end with Virtual Mode
1971
+ if (!id.endsWith(this.EndingVirtualMode)) {
1972
+ if (!(await this.adapter.getForeignObjectAsync(id))) {
1973
+ this.adapter.log.debug(`Id: ${id} does not exsit.`);
1974
+ return false;
1975
+ }
1976
+ }
1977
+ }
1978
+ if (config.HumidifierName === '') {
1979
+ this.adapter.log.debug(`Humidifier name is empty`);
1980
+ return false;
1981
+ }
1982
+ const indexOfSpace = config.HumidifierName.indexOf(' -- ');
1983
+ if (indexOfSpace > 0) {
1984
+ config.HumidifierName = config.HumidifierName.substring(0, indexOfSpace);
1985
+ }
1986
+ config.HumidifierIds = HumidifierIds;
1987
+ return true;
1988
+ } catch (error) {
1989
+ this.adapter.log.error(`error at ${activeFunction}: ${error}`);
1990
+ }
1991
+ }
1992
+
1739
1993
  /**
1740
1994
  * get Foreign states for Bridge
1741
1995
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.lorawan",
3
- "version": "1.17.13",
3
+ "version": "1.17.15",
4
4
  "description": "converts the desired lora gateway data to a ioBroker structure",
5
5
  "author": {
6
6
  "name": "BenAhrdt",