iobroker.zigbee 3.0.0 → 3.0.1

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/admin/tab_m.html CHANGED
@@ -935,113 +935,126 @@
935
935
  </div>
936
936
  </div>
937
937
  </div>
938
- <div class="row epid0">
939
- <div class="col">
940
- <div class=endpointid>
941
- <p class="translate device_with_endpoint">Main Endpoint</p>
942
- </div>
943
- </div>
944
- <div class="col1">
945
- <div class="input-field groups">
946
- <select id="d_groups_ep0" class="materialSelect" multiple>
947
- <option value="1">select</option>
948
- </select>
949
- <label for="d_groups_ep0" class="translate">Groups</label>
950
- </div>
951
- </div>
952
- </div>
953
- <div class="row epid1">
954
- <div class="col epid">
955
- <div class=endpointid>
956
- <p class="translate device_with_endpoint">Sub Endpoint 1</p>
957
- </div>
958
- </div>
959
- <div class="col">
960
- <div class="input-field groups">
961
- <select id="d_groups_ep1" class="materialSelect" multiple>
962
- <option value="1">select</option>
963
- </select>
964
- <label for="d_groups_ep1" class="translate">Groups</label>
965
- </div>
966
- </div>
967
- </div>
968
- <div class="row epid2">
969
- <div class="col epid">
970
- <div class=endpointid>
971
- <p class="translate device_with_endpoint">Sub Endpoint 2</p>
972
- </div>
973
- </div>
974
- <div class="col">
975
- <div class="input-field groups">
976
- <select id="d_groups_ep2" class="materialSelect" multiple>
977
- <option value="1">select</option>
978
- </select>
979
- <label for="d_groups_ep2" class="translate">Groups</label>
980
- </div>
981
- </div>
982
- </div>
983
- <div class="row epid3">
984
- <div class="col epid">
985
- <div class=endpointid>
986
- <p class="translate device_with_endpoint">Sub Endpoint 3</p>
987
- </div>
988
- </div>
989
- <div class="col">
990
- <div class="input-field groups">
991
- <select id="d_groups_ep3" class="materialSelect" multiple>
992
- <option value="1">select</option>
993
- </select>
994
- <label for="d_groups_ep3" class="translate">Groups</label>
995
- </div>
996
- </div>
938
+ <div class="groups_available">
939
+ <div class="row">
940
+ <h6>Groups</h6>
997
941
  </div>
998
- <div class="row epid4">
999
- <div class="col epid">
1000
- <div class=endpointid>
1001
- <p class="translate device_with_endpoint">Sub Endpoint 4</p>
942
+ <div class="row epid0">
943
+ <div class="col">
944
+ <div class=endpointid>
945
+ <p class="translate device_with_endpoint">Main Endpoint</p>
946
+ </div>
947
+ </div>
948
+ <div class="col1">
949
+ <div class="input-field groups">
950
+ <select id="d_groups_ep0" class="materialSelect" multiple>
951
+ <option value="1">select</option>
952
+ </select>
953
+ <label for="d_groups_ep0" class="translate">Groups</label>
954
+ </div>
1002
955
  </div>
1003
956
  </div>
1004
- <div class="col">
1005
- <div class="input-field groups">
1006
- <select id="d_groups_ep4" class="materialSelect" multiple>
1007
- <option value="1">select</option>
1008
- </select>
1009
- <label for="d_groups_ep4" class="translate">Groups</label>
957
+ <div class="row epid1">
958
+ <div class="col epid">
959
+ <div class=endpointid>
960
+ <p class="translate device_with_endpoint">Sub Endpoint 1</p>
961
+ </div>
962
+ </div>
963
+ <div class="col">
964
+ <div class="input-field groups">
965
+ <select id="d_groups_ep1" class="materialSelect" multiple>
966
+ <option value="1">select</option>
967
+ </select>
968
+ <label for="d_groups_ep1" class="translate">Groups</label>
969
+ </div>
1010
970
  </div>
1011
971
  </div>
1012
- </div>
1013
- <div class="row epid5">
972
+ <div class="row epid2">
973
+ <div class="col epid">
974
+ <div class=endpointid>
975
+ <p class="translate device_with_endpoint">Sub Endpoint 2</p>
976
+ </div>
977
+ </div>
978
+ <div class="col">
979
+ <div class="input-field groups">
980
+ <select id="d_groups_ep2" class="materialSelect" multiple>
981
+ <option value="1">select</option>
982
+ </select>
983
+ <label for="d_groups_ep2" class="translate">Groups</label>
984
+ </div>
985
+ </div>
986
+ </div>
987
+ <div class="row epid3">
988
+ <div class="col epid">
989
+ <div class=endpointid>
990
+ <p class="translate device_with_endpoint">Sub Endpoint 3</p>
991
+ </div>
992
+ </div>
993
+ <div class="col">
994
+ <div class="input-field groups">
995
+ <select id="d_groups_ep3" class="materialSelect" multiple>
996
+ <option value="1">select</option>
997
+ </select>
998
+ <label for="d_groups_ep3" class="translate">Groups</label>
999
+ </div>
1000
+ </div>
1001
+ </div>
1002
+ <div class="row epid4">
1003
+ <div class="col epid">
1004
+ <div class=endpointid>
1005
+ <p class="translate device_with_endpoint">Sub Endpoint 4</p>
1006
+ </div>
1007
+ </div>
1008
+ <div class="col">
1009
+ <div class="input-field groups">
1010
+ <select id="d_groups_ep4" class="materialSelect" multiple>
1011
+ <option value="1">select</option>
1012
+ </select>
1013
+ <label for="d_groups_ep4" class="translate">Groups</label>
1014
+ </div>
1015
+ </div>
1016
+ </div>
1017
+ <div class="row epid5">
1018
+ <div class="col epid">
1019
+ <div class=endpointid>
1020
+ <p class="translate device_with_endpoint">Sub Endpoint 5</p>
1021
+ </div>
1022
+ </div>
1023
+ <div class="col">
1024
+ <div class="input-field groups">
1025
+ <select id="d_groups_ep5" class="materialSelect" multiple>
1026
+ <option value="1">select</option>
1027
+ </select>
1028
+ <label for="d_groups_ep5" class="translate">Groups</label>
1029
+ </div>
1030
+ </div>
1031
+ </div>
1032
+ <div class="row epid6">
1014
1033
  <div class="col epid">
1015
1034
  <div class=endpointid>
1016
- <p class="translate device_with_endpoint">Sub Endpoint 5</p>
1035
+ <p class="translate device_with_endpoint">Sub Endpoint 6</p>
1017
1036
  </div>
1018
1037
  </div>
1019
1038
  <div class="col">
1020
1039
  <div class="input-field groups">
1021
- <select id="d_groups_ep5" class="materialSelect" multiple>
1040
+ <select id="d_groups_ep6" class="materialSelect" multiple>
1022
1041
  <option value="1">select</option>
1023
1042
  </select>
1024
- <label for="d_groups_ep5" class="translate">Groups</label>
1043
+ <label for="d_groups_ep6" class="translate">Groups</label>
1044
+ </div>
1025
1045
  </div>
1026
1046
  </div>
1027
- </div>
1028
- <div class="row epid6">
1029
- <div class="col epid">
1030
- <div class=endpointid>
1031
- <p class="translate device_with_endpoint">Sub Endpoint 6</p>
1032
- </div>
1033
1047
  </div>
1034
- <div class="col">
1035
- <div class="input-field groups">
1036
- <select id="d_groups_ep6" class="materialSelect" multiple>
1037
- <option value="1">select</option>
1038
- </select>
1039
- <label for="d_groups_ep6" class="translate">Groups</label>
1040
- </div>
1041
- </div>
1048
+ <div class="row">
1049
+ <div class="options_available col1">
1050
+ <h6>Options</h6>
1051
+ <div class="options_grid">
1052
+ </div>
1053
+ </div>
1042
1054
  </div>
1043
1055
  </div>
1044
1056
  <div class="modal-footer">
1057
+ <a name="add_options" class="waves-effect waves-green btn green translate"><i class="material-icons large">add_circle</i></a>
1045
1058
  <a name="save" href="#!" class="modal-action modal-close waves-effect waves-green btn green translate">Save</a>
1046
1059
  <a href="#!" class="modal-action modal-close waves-effect waves-red btn-flat translate">Cancel</a>
1047
1060
  </div>
package/docs/en/readme.md CHANGED
@@ -31,24 +31,19 @@ The software is divided into "converter" and "adapter".
31
31
 
32
32
 
33
33
  ## Installation
34
- 1. Connect the coordinator hardware to the Raspberry Pi.<br>
35
- 2. Connect to the Raspberry Pi using PuTTY, for example.<br>
36
- 3. Determine the coordinator path. On Linux systems, this is often located in the /dev/serial/by-id directory. Alternatively, /dev/ttyUSB*, /dev/ttyAM* (Linux), /dev/tty.usbserial-* (macOS), or com* (Windows) are expected.<br>
34
+ 1. Connect the coordinator hardware to computer running ioBroker (or the network, in case of LAN/WLan coordinators).<br>
35
+ 2. Open a console on the server. In case of Unix/Linux based systems, this can be done remotely via ssh. Depending on the OS used, additional programs (e.g. puTTY on Windows) may be needed.<br>
36
+ 3. Determine the coordinator path. On Unix/Linux systems, this is often located in the /dev/serial/by-id directory. Alternatively, /dev/ttyUSB*, /dev/ttyAM* (Unix/Linux), /dev/tty.usbserial-* (macOS), or com* (Windows) are expected.<br>
37
37
  The following example shows a Linux installation on a Raspberry Pi. The command `ls -la /dev/serial/by-id/` produces the output shown in the image.
38
38
  ![](../de/img/Bild2.png)
39
- 4. ioBroker -> Install the ZigBee adapter, here version 1.8.10 as an example. <br> ![](../de/img/Bild3.png) <br> This installs all required software components (converter and adapter).
40
- 5. Open the adapter configuration. The following image shows the interface from version 2.1.0 onwards.<br>![](img/Zigbee_config_en.png)<br>
39
+ 4. ioBroker -> Install the ZigBee adapter, here version 1.8.10 as an example. <br> ![](../de/img/Bild3.png) <br> This installs all required software components (converter and adapter). <br>![](img/Zigbee_config_en.png)<br>
40
+ 5. Open the adapter configuration. The above image shows the interface version 3.0.0 or newer.
41
41
  In this situation, the admin indicates whether the ZigBee subsystem is started (A).
42
- 6. Enter the port for the coordinator. (B) In the case of USB coordinators, this is the previously determined device path.
43
- (B) In the case of USB coordinators, this is the previously determined device path.
44
- (B) Bei USB-Koordinatoren ist dies der zuvor ermittelte Gerätepfad.
45
- (B) In the case of USB coordinators, this is the device path previously determined.
46
- (B) Bei USB-Koordinatoren ist dies der zuvor ermittelte Gerätepfad.
47
- For coordinators controlled via the network, the network address and port must be specified in the form tcp://ip:port instead of the device path. If the adapter itself (not the Zigbee subsystem) is active, a list of available serial interfaces is available for selection. The following applies when selecting:
42
+ 6. Enter the port for the coordinator (B). In the case of USB coordinators, this is the previously determined device path. For coordinators controlled via the network, the network address and port must be specified in the form tcp://ip:port instead of the device path. If the adapter itself (not the Zigbee subsystem) is active, a list of available serial interfaces is available for selection. The following applies when selecting:
48
43
  - If multiple adapters with different USB devices are used for communication on the system, a port from the /dev/serial/by-id directory (if available) should **absolutely** be selected. This ensures that the adapter's association with the coordinator is retained when the system is restarted.
49
44
  - If only one USB device is used, the /dev/TTY* port is preferable. This allows the coordinator to be replaced with an identical device in the event of a defect without having to adjust the configuration.
50
45
  7. Assign a Network ID and Pan ID to distinguish it from other ZigBee networks within wireless range. e.g., starting with adapter version 2.1.0, ExtPanID (C) and PanID (D) are automatically pre-assigned with random values ​​until the configuration is saved.<br>
51
- 8. Select a suitable ZigBee channel (E). Please note that ZigBee and 2.4GHz Wi-Fi share the same frequency band. The optimal channel therefore depends, among other things, on the Wi-Fi channels used in the area. The channel names for ZigBee and Wi-Fi are **not** identical. It is also advisable to limit your selection to the ZigBee Light Link channels (11, 15, 20, 25). If a channel is selected that does not belong to the ZLL, the interface displays a yellow triangle with an exclamation mark above the entered channel. <br>After the adapter has been successfully started, a scan of the network channels can also be performed via the configuration.<br>
46
+ 8. Select a suitable ZigBee channel (E). Please note that ZigBee and 2.4GHz Wi-Fi share the same frequency band. The optimal channel therefore depends, among other things, on the Wi-Fi channels used in the area. The channel names for ZigBee and Wi-Fi are **not** identical, e.g. WIFI channel 11 and Zigbee channel 11 do **not** interfere with each other. It is also advisable to limit your selection to the ZigBee Light Link channels (11, 15, 20, 25). If a channel is selected that does not belong to the ZLL, the interface displays a yellow triangle with an exclamation mark above the entered channel. <br>After the adapter has been successfully started, a scan of the network channels can also be performed via the configuration.<br>
52
47
  **Note:** Starting with adapter version 2.1.0, it is possible to change the channel without deleting the configuration and re-learning all devices. However, **this feature is considered experimental** – individual devices may not respond to the channel change; these devices will then need to be re-learned.<br>
53
48
  9. Check whether the Zigbee subsystem is starting. To do this, try starting the Zigbee subsystem using *Start/Stop* (F). The progress of the start attempt can be observed in the log. The icon (A) changes from black/red to black/orange while the Herdsman starts. If the attempt was successful, the icon disappears completely; otherwise, it turns red again, and the messages in the log provide clues as to the cause.<br>
54
49
  The Herdsman can also be stopped using the same button. The icon is also displayed in black/orange. **Important: Stopping can take up to 2 minutes in some cases – especially when using network coordinators.** Patience is required here. After Herdsman has been terminated, the icon appears in black/red and the message 'Herdsman stopped!' appears.
package/io-package.json CHANGED
@@ -1,8 +1,21 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "zigbee",
4
- "version": "3.0.0",
4
+ "version": "3.0.1",
5
5
  "news": {
6
+ "3.0.1": {
7
+ "en": "Fix for Ikea SOMRIG configuration raising 'definition.endpoint is not a function' error.\nAccess to 'zigbee2mqtt options as settings in zigbee adapter (ALPHA Stage !)\nFix for 'error: zigbee.0 (1118300) zigbee.0 already running' at adapter start (Alpha Stage)\nUpdated hardware configuration panel - exchanged text buttons for buttons with icons.\nLimited states on device tiles to states which are read only or which can be modified sensibly via the device tile.\n",
8
+ "de": "Fix für Ikea SOMRIG Konfiguration erhöhen 'Definition. Endpoint ist kein Funktionsfehler.\nZugriff auf 'zigbee2mqtt Optionen als Einstellungen im Zickbee Adapter (ALPHA Stage!)\nFix für 'error: zigbee.0 (1118300) zigbee.0 bereits läuft' bei Adapterstart (Alpha Stage)\nAktualisiertes Hardware-Konfigurationsfeld - ausgetauschte Texttasten für Tasten mit Symbolen.\nBegrenzte Zustände auf Gerätefliesen zu Zuständen, die nur gelesen werden oder über die Gerätefliese sensibel modifiziert werden können.\n",
9
+ "ru": "Исправьте конфигурацию IKEA SOMRIG, повысив «определение». Конечная точка не является ошибкой функции.\nДоступ к опциям Zigbee2mqtt в качестве настроек в адаптере Zigbee (стадия ALPHA!)\nИсправьте ошибку: zigbee.0 (1118300) zigbee.0 уже работает на старте адаптера\nОбновленная аппаратная панель конфигурации - обмен текстовыми кнопками на кнопки с иконками.\nОграниченные состояния на плитках устройства к состояниям, которые читаются только или которые могут быть изменены чувственно через плитку устройства.\n",
10
+ "pt": "Corrigir para configuração Ikea SOMRIG elevando 'definição. endpoint não é um erro de função.\nAcesso às opções \"zigbee2mqttt como configurações no adaptador zigbee (Estação LAPHA!)\nFix for 'error: zigbee.0 (1118300) zigbee.0 já em execução' no início do adaptador (Alpha Stage)\nPainel de configuração de hardware atualizado - botões de texto trocados para botões com ícones.\nEstados limitados em telhas de dispositivo para estados que são lidos apenas ou que podem ser modificados sensivelmente através da telha do dispositivo.\n",
11
+ "nl": "Fix voor Ikea SOMRIG configuratie verhogen 'definitie. eindpunt is geen functiefout.\nToegang tot 'zigbee2mqtt opties als instellingen in zigbee adapter (ALPHA Stage !)\nFix voor 'fout: zigbee.0 (1118300) zigbee.0 al actief' bij adapterstart (Alpha Stage)\nBijgewerkt hardware configuratiepaneel - uitgewisselde tekstknoppen voor knoppen met pictogrammen.\nBeperkte toestanden op apparaattegels naar toestanden die alleen worden gelezen of die verstandig kunnen worden gewijzigd via de apparaattegel.\n",
12
+ "fr": "Correction pour la configuration Ikea SOMRIG augmentant la définition. le paramètre n'est pas une erreur de fonction.\nAccès aux options 'zigbee2mqtt comme réglages dans l'adaptateur zigbee (ALPHA Stage !)\nCorrection pour 'erreur: zigbee.0 (1118300) zigbee.0 déjà en cours d'exécution' au démarrage de l'adaptateur (Alpha Stage)\nPanneau de configuration du matériel mis à jour - boutons texte échangés pour les boutons avec des icônes.\nLes états limités sur les tuiles de l'appareil aux états qui sont lus seulement ou qui peuvent être modifiés de façon sensible via la tuile de l'appareil.\n",
13
+ "it": "Fissare per Ikea SOMRIG configurazione aumentando 'definizione. endpoint non è un errore di funzione.\nAccesso alle opzioni 'zigbee2mqtt come impostazioni nell'adattatore zigbee (ALPHA Stage !)\nCorrezione per 'error: zigbee.0 (1118300) zigbee.0 già in esecuzione' all'inizio dell'adattatore (Alpha Stage)\nPannello di configurazione hardware aggiornato - pulsanti di testo scambiati per pulsanti con icone.\nStati limitati su piastrelle di dispositivo a stati che sono letti solo o che possono essere modificati sensibilmente tramite la piastrella del dispositivo.\n",
14
+ "es": "Arregla para la configuración de Ikea SOMRIG criando 'definición. endpoint no es un error de función.\nAcceso a las opciones 'zigbee2mqtt como configuración en el adaptador de zigbee (ALPHA Stage !)\nFijación para 'error: zigbee.0 (1118300) zigbee.0 ya funcionando en el inicio del adaptador (Alpha Stage)\nPanel de configuración de hardware actualizado - botones de texto intercambiados para botones con iconos.\nEstados limitados en fichas de dispositivo a estados que se leen solamente o que pueden ser modificados de forma sensata a través de la ficha del dispositivo.\n",
15
+ "pl": "Napraw dla definicji podnoszenie konfiguracji Ikea SOMRIG. Punkt końcowy nie jest błędem funkcji.\nDostęp do opcji 'zigbee2mqtt jako ustawień w adapterze zigbee (ALPHA Stage!)\nFix for 'error: zigbee.0 (1118300) zigbee.0 already running' at adapter start (Alpha Stage)\nAktualizacja panelu konfiguracji sprzętowej - wymieniono przyciski tekstowe na przyciski z ikonami.\nOgraniczone stany na płytkach urządzenia do stanów, które są tylko odczytywane lub które mogą być modyfikowane w sposób rozsądny za pomocą płytki urządzenia.\n",
16
+ "uk": "Виправлення для налаштування Ikea SOMRIG 'Визначення. кінцева точка не є помилкою функції.\nДоступ до опцій Zigbee2mqtt як налаштування адаптера Zigbee (ALPHA Stage !)\nВиправлення для 'error: zigbee.0 (1118300) zigbee.0 вже запущений' при запуску адаптера (Alpha Stage)\nОновлена панель конфігурації обладнання - обмінні текстові кнопки для гудзиків з іконками.\nОбмежені стани на плитці пристрою для станів, які читаються тільки або які можуть бути змінені, швидко через плитку пристрою.\n",
17
+ "zh-cn": "修复Ikea SOMRIG 配置提升定义 。 结束点不是一个函数'错误.\n访问 'zigbee2mqtt 选项作为 Zigbee 适配器的设置( ALPHA stage !) \n在适配器启动( Alpha Stage)时为 'error: zigbee. 0 (1118300) zigbee. 0 已经运行' 进行修复\n更新的硬件配置面板 - 用图标交换文本按钮作为按钮.\n将设备瓦片的状态限制在只读或通过设备瓦片可敏感修改的状态.\n"
18
+ },
6
19
  "3.0.0": {
7
20
  "en": "Breaking change: Start of zigbee subsystem requires configuration entry !!!\nHardware configuration panel\nUpdate for external converter - detect /dist/ subfolder\nUpdate device image: use of icons defined in external converter (beta)\n",
8
21
  "de": "Bruchänderung: Beginn des Zickbee Subsystems erfordert Konfigurationseintrag!!!\nHardware-Konfigurationspanel\nUpdate für externen Konverter - Erkennung /dist/ Unterordner\nGerätebild aktualisieren: Verwendung von Icons, die im externen Konverter (beta) definiert sind\n",
@@ -80,19 +93,6 @@
80
93
  "pl": "ZMIANY ZBIORCZE\n\nprzełączanie na konwertery 21 zmienia eksponaty dużej liczby urządzeń (głównie pilotów)\nnowa metoda kontrolowania koloru na podstawie podkanałów dla rgb, hs i xy\nWyświetla jako domyślne dla urządzeń ALL. Używanie starej definicji jako opcji\nWymaga węzła 20.x lub nowsze\n\nNapraw parowanie\nzmienić ping\nopóźnianie generowania mapy aż do uruchomienia odświeżania, wiadomości mapy po generacji\nusunąć zakładkę wiązania z zakładki zigbee\nponownie zamówić karty w konfiguracji\nusunąć zakładkę wiązania z konfiguracji\nusuń mapę z konfiguracji\ndodaj debug do karty zigbee\nHerdsman 3.2.5, Konwertery 21.30.0\nWyświetla jako domyślne, użycie starych definicji urządzenia jako dotychczasowe opcjonalne\nObrazy specyficzne dla użytkownika (oparte na modelu, na urządzeniu)\nUlepszona edycja grupowa - usunąć członków z karty grupowej",
81
94
  "uk": "БРЕАКІНГОВІ ЗМІНИ\n\nперемикач на перетворювачі 21 змінює висадки для великої кількості пристроїв (найбільш віддалені)\nновий метод контролю кольору на основі підканалів для rgb, hs і xy\nЗа замовчуванням для всіх пристроїв. Використання старого визначення як варіант\nВимагає Node 20.x або нові\n\nФіксація Пірсинг\nзмінити пінг\nгенерація карти затримки до освіження активується, повідомлення після генерації\nвидалити вкладку в'язання з вкладки zigbee\nвкладка зворотного замовлення в конфігурації\nвидалити вкладку з конфігурації\nвидалити карту з конфігурації\nadd debug до zigbee tab\nEnglish, Українська, Français..\nЕкспози як за замовчуванням, використання застарілих параметрів пристрою, як необов'язковий\nКористувальницькі специфічні зображення (моделі на основі пристрою)\nУдосконалено редагування груп - видалення членів з групової картки",
82
95
  "zh-cn": "裂变\n\n21 更改大量设备(大多为远程设备)的曝光量\n基于 rgb、 hs 和 xy 子通道的新的颜色控制方法\n曝光为默认所有设备 。 仅将旧定义用作选项\n需要节点 20.x 或更新\n\n修复对齐\n更改键\n将映射生成延迟到刷新启动, 映射消息生成后\n从 zigbee 标签中删除绑定标签\n在配置中重新排序标签\n从配置中删除绑定标签\n从配置中删除地图\n添加调试到 zigbee 标签\n牧民 3.2.5,转换器 21.30.0\n将曝光作为默认, 将旧设备定义作为遗留选项\n用户特定图像( 基于模型、 设备)\n改进组编辑 - 从组卡中删除成员"
83
- },
84
- "1.10.14": {
85
- "en": "Herdsman 2.1.9, Converters 20.58.0\nFix: Aqara T1M (CL-L02D) \ndeleteDeviceStates change to deleteObj",
86
- "de": "Herdsman 2.1.9, Konverter 20.58.0\nFix: Aqara T1M (CL-L02D)\nlöschen DeviceState Änderung zum Löschen Ob",
87
- "ru": "Herdsman 2.1.9, Converters 20.58.0\nFix: Aqara T1M (CL-L02D)\nудалить Устройства меняются для удаления Obj",
88
- "pt": "Herdsman 2.1.9, Conversores 20.58.0\nFix: Aqara T1M (CL-L02D)\nexcluir DeviceStates mudam para excluir Objecção",
89
- "nl": "Herdsman 2.1.9, Converters 20.58.0\nFix: Aqara T1M (CL-L02D)\nverwijderen Apparaatstaten wijzigen om te verwijderen Obj",
90
- "fr": "Herdsman 2.1.9, Convertisseurs 20.58.0\nCorrection: Aqara T1M (CL-L02D)\nsupprimer Les états de périphérique changent pour supprimer OBJ",
91
- "it": "Herdsman 2.1.9, Convertitori 20.58.0\nFisso: Aqara T1M (CL-L02D)\ncancella DeviceStates modifica per eliminare Obj",
92
- "es": "Herdsman 2.1.9, convertidores 20.58.0\nFijación: Aqara T1M (CL-L02D)\nborrar Los Estados de dispositivos cambian para eliminar Obj",
93
- "pl": "Herdsman 2.1.9, konwertery 20.58.0\nFix: Aqara T1M (CL- L02D)\nusuń DeviceStates zmienić, aby usunąć Obj",
94
- "uk": "Herdsman 2.1.9, Конвертер 20.58.0\nФіксація: Aqara T1M (CL-L02D)\nвидалити Зміна стану пристроїв для видалення Офіціант",
95
- "zh-cn": "牧民2.1.9,转换器 20.58.0\n修补:Aqara T1M(CL-L02D)\n删除 设备状态更改以删除 欧比"
96
96
  }
97
97
  },
98
98
  "titleLang": {
@@ -159,6 +159,7 @@
159
159
  "tab": "materialize"
160
160
  },
161
161
  "messagebox": true,
162
+ "stopTimeout": 30000,
162
163
  "stopBeforeUpdate": true,
163
164
  "dataFolder": "zigbee_%INSTANCE%",
164
165
  "compact": true,
package/lib/commands.js CHANGED
@@ -149,9 +149,14 @@ class Commands {
149
149
  this.updateDeviceImage(obj.from, obj.command, obj.message, obj.callback);
150
150
  }
151
151
  break;
152
- case 'updateDeviceData':
152
+ case 'updateLocalConfigItems':
153
153
  if (obj.message && typeof obj.message === 'object') {
154
- this.updateDeviceData(obj.from, obj.command, obj.message, obj.callback);
154
+ this.updateLocalConfigItems(obj.from, obj.command, obj.message, obj.callback);
155
+ }
156
+ break;
157
+ case 'getLocalConfigItems':
158
+ if (obj.message && typeof obj.message === 'object') {
159
+ this.getLocalConfigItems(obj.from, obj.command, obj.message, obj.callback);
155
160
  }
156
161
  break;
157
162
  case 'getDeviceCleanupRequired':
@@ -175,7 +180,7 @@ class Commands {
175
180
  }
176
181
 
177
182
  async readNvBackup(from, command, msg, callback) {
178
- this.warn('readNvBackup called')
183
+ this.debug('readNvBackup called')
179
184
  try {
180
185
  const zo = this.adapter.getZigbeeOptions();
181
186
  const name = require('path').join(zo.dbDir, zo.backupPath);
@@ -186,7 +191,7 @@ class Commands {
186
191
  rv.precfgkey = (nvBackupJson.network_key ? nvBackupJson.network_key.key : undefined);
187
192
  rv.extPanID = nvBackupJson.extended_pan_id ? reverseByteString(nvBackupJson.extended_pan_id) : undefined;
188
193
  rv.panID = parseInt('0x'+nvBackupJson.pan_id);
189
- this.warn('readNvBackup returns ' + JSON.stringify(rv))
194
+ this.debug('readNvBackup returns ' + JSON.stringify(rv))
190
195
  this.adapter.sendTo(from, command, rv, callback)
191
196
  }
192
197
  catch (error) {
@@ -702,10 +707,10 @@ class Commands {
702
707
  }
703
708
  }
704
709
 
705
- async updateDeviceData(from, command, msg, callback) {
710
+ async updateLocalConfigItems(from, command, msg, callback) {
706
711
  if (this.stController) {
707
- this.debug(`UpdateDeviceData : ${JSON.stringify(msg)}`)
708
- const target = msg.target.replace(`${this.adapter.namespace}.`, '');
712
+ this.debug(`updateLocalConfigItems : ${JSON.stringify(msg)}`);
713
+ const target = msg.global ? msg.target : msg.target.replace(`${this.adapter.namespace}.`, '');
709
714
  const entity = await this.zbController.resolveEntity(target);
710
715
  //this.warn('entity for ' + target + ' is '+ JSON.stringify(entity))
711
716
  if (entity && !entity.mapped) {
@@ -720,16 +725,42 @@ class Commands {
720
725
  }
721
726
  }
722
727
  if (entity) {
723
- //this.warn('with Entity');
728
+ this.debug('updateLocalConfigItems with Entity');
724
729
  this.stController.updateDev(target, entity.mapped.model, entity.mapped.model, () => {this.adapter.sendTo(from, command, {}, callback)});
725
730
  }
726
731
  else {
727
- //this.warn('without Entity');
732
+ this.debug('updateLocalConfigItems without Entity');
728
733
  this.stController.updateDev(target, undefined, 'group',() => {this.adapter.sendTo(from, command, {}, callback)});
729
734
  }
730
735
  }
731
736
  }
732
737
 
738
+ async getLocalConfigItems(from, command, msg, callback)
739
+ {
740
+ const rv = {};
741
+ if (this.stController) {
742
+ this.debug(`getLocalConfigItems : ${JSON.stringify(msg)}`)
743
+
744
+ if (msg.hasOwnProperty('global') && msg.hasOwnProperty('target') && (msg.hasOwnProperty('keys') || msg.hasOwnProperty('key')))
745
+ {
746
+ const target = msg.global ? msg.target : msg.target.replace(`${this.adapter.namespace}.`, '');
747
+ const keys = msg.hasOwnProperty('keys') ? msg.keys : [msg.key];
748
+ for (const key of keys) {
749
+ const ld = this.stController.localConfig.getOverrideWithTargetAndKey(target, key, msg.global);
750
+ if (ld != undefined) rv[key] = ld;
751
+ }
752
+
753
+ //const targetId = msg.id ? msg.id.replace(`${this.adapter.namespace}.`, '') : '';
754
+ //const targetModel = msg.model ? msg.model : '';
755
+ }
756
+ else {
757
+ rv.error = `missing data in message ${JSON.stringify(msg)}`;
758
+ }
759
+ }
760
+ else rv.error = 'stController not initialized - no Data sent'
761
+
762
+ this.adapter.sendTo(from, command, rv, callback);
763
+ }
733
764
 
734
765
  async reconfigure(from, command, msg, callback) {
735
766
  if (this.zbController && this.zbController.herdsmanStarted) {
package/lib/groups.js CHANGED
@@ -265,7 +265,7 @@ class Groups {
265
265
  this.warn(`renameGroup caught error ${JSON.stringify(e.code)}`);
266
266
  }
267
267
  }
268
- this.warn(`rename group name ${name}, id ${id}, icon ${icon} remove ${JSON.stringify(message.removeMembers)}`);
268
+ this.debug(`rename group name ${name}, id ${id}, icon ${icon} remove ${JSON.stringify(message.removeMembers)}`);
269
269
  const group = await this.adapter.getObjectAsync(id);
270
270
  if (!group) {
271
271
  this.debug('group object doesnt exist ')
@@ -18,7 +18,6 @@ class localConfig extends EventEmitter {
18
18
  this.basefolder = undefined;
19
19
  this.retTimeoutHanlde = undefined;
20
20
  this.adapter.on('ready', () => this.onReady());
21
- this.adapter.on('unload', callback => this.onUnload(callback));
22
21
  }
23
22
 
24
23
 
@@ -28,9 +27,9 @@ class localConfig extends EventEmitter {
28
27
 
29
28
  async onUnload(callback)
30
29
  {
31
- this.info('local config saved');
32
30
  this.retainData();
33
- callback();
31
+ // No callback here -
32
+ //callback();
34
33
  }
35
34
 
36
35
  info(message) {
@@ -76,14 +75,14 @@ class localConfig extends EventEmitter {
76
75
  async updateLocalOverride(_target, model, key, data, global)
77
76
  {
78
77
  const target = (global ? model : _target);
79
- this.info(`updating local data: (${global ? 'global':'local'}) : ${target}:${key}:${data}`);
78
+ this.info(`updating local data: (${global ? 'global':'local'}) : ${target}:${key}:${JSON.stringify(data)}`);
80
79
 
81
80
  if (typeof target != 'string' || typeof key != 'string') {
82
81
  this.error(`update called with illegal id data:${JSON.stringify(target)}:${JSON.stringify(key)}:${JSON.stringify(data)}`)
83
82
  return false;
84
83
  }
85
84
  const base = global ? this.localData.by_model[target] || {} : this.localData.by_id[target] || {};
86
- if (data && data.length > 0 && data != 'none') {
85
+ if (data && Object.keys(data).length > 0 && data != 'none') {
87
86
  if (key == 'icon')
88
87
  base[key] = data.replace(this.basefolder, '.');
89
88
  else
@@ -103,10 +102,24 @@ class localConfig extends EventEmitter {
103
102
  if (base == {}) delete this.localData.by_id[target];
104
103
  else this.localData.by_id[target] = base;
105
104
  }
106
- this.info(`Local Data for ${target} is ${JSON.stringify(base)}`);
105
+ this.info(`Local Data for ${target} is ${JSON.stringify(base)} after update`);
107
106
  return true;
108
107
  }
109
108
 
109
+ async getLocalOverride(_target, model, key, global)
110
+ {
111
+ const target = (global ? model : _target);
112
+ this.info(`getting local data: (${global ? 'global':'local'}) : ${target}:${key}`);
113
+
114
+ if (typeof target != 'string' || typeof key != 'string') {
115
+ this.error(`update called with illegal id data:${JSON.stringify(target)}:${JSON.stringify(key)}`)
116
+ return false;
117
+ }
118
+ const base = global ? this.localData.by_model[target] || {} : this.localData.by_id[target] || {};
119
+ const rv = {};
120
+ if (base.hasOwnProperty(key)) rv[key] = base[key];
121
+ return rv;
122
+ }
110
123
 
111
124
  NameForId(id, model, defaultName) {
112
125
  this.debug('name for id with ' + id + ' and ' + defaultName + ' from ' + JSON.stringify(this.localData));
@@ -213,7 +226,7 @@ class localConfig extends EventEmitter {
213
226
  return rv;
214
227
  }
215
228
 
216
- getOverrideWithKey(target, key, isGlobal) {
229
+ getOverrideWithTargetAndKey(target, key, isGlobal) {
217
230
  const targetdata = this.getOverrideData(target, isGlobal);
218
231
  if (targetdata && targetdata.hasOwnProperty(key)) return targetdata[key];
219
232
  return undefined;
@@ -221,6 +234,7 @@ class localConfig extends EventEmitter {
221
234
 
222
235
  async updateFromDeviceNames() {
223
236
  const fn = this.adapter.expandFileName('dev_names.json');
237
+ this.info('Initializing localConfig from dev_names.json')
224
238
  fs.readFile(fn, (err, content) => {
225
239
  if (!err) {
226
240
  let data_js = {};
@@ -233,8 +247,10 @@ class localConfig extends EventEmitter {
233
247
  }
234
248
  try {
235
249
  for (const prop in data_js) {
236
- if (data_js[prop] != 'undefined')
250
+ if (data_js[prop] != 'undefined') {
251
+ this.info(`updating device name for ${prop} as ${data_js[prop]}`);
237
252
  this.updateDeviceName(prop, data_js[prop]);
253
+ }
238
254
  }
239
255
  }
240
256
  catch (error) {
@@ -295,6 +311,13 @@ class localConfig extends EventEmitter {
295
311
  return rv;
296
312
  }
297
313
 
314
+ getOptions(dev_id) {
315
+ const ld = this.localData.by_id[dev_id];
316
+ if (ld === undefined || ld.options === undefined) return {};
317
+ this.debug(`getOptions for ${dev_id} : ${JSON.stringify(ld.options)}`);
318
+ return ld.options;
319
+ }
320
+
298
321
  }
299
322
 
300
323
  module.exports = localConfig;
package/lib/networkmap.js CHANGED
@@ -9,6 +9,7 @@ class NetworkMap {
9
9
  start(zbController, stController) {
10
10
  this.zbController = zbController;
11
11
  this.stController = stController;
12
+ return this.stop;
12
13
  }
13
14
 
14
15
  stop() {
@@ -53,4 +54,4 @@ class NetworkMap {
53
54
  }
54
55
  }
55
56
 
56
- module.exports = NetworkMap;
57
+ module.exports = NetworkMap;