iobroker.zigbee2mqtt 3.0.5 → 3.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -22,6 +22,10 @@ This adapter allows to control the data points of the devices of a Zigbee2MQTT i
22
22
  [Adapter Documentation](https://github.com/arteck/ioBroker.zigbee2mqtt/blob/main/docs/wiki.md)
23
23
 
24
24
  ## Changelog
25
+ ### 3.0.6 (2025-05-31)
26
+ - (arteck) settings restructure
27
+ - (arteck) fix icon not found message
28
+
25
29
  ### 3.0.5 (2025-05-29)
26
30
  - (arteck) add additional folder for some devices (like smoke detector)
27
31
  - (arteck) state.js cleanup
@@ -1,14 +1,16 @@
1
1
  {
2
+ "click for Documentation": "hier geht es zur Dokumentation",
3
+ "A detailed documentation with explanations and all further information can be found on this GitHub page:": "Eine ausführliche Dokumentation mit Erklärungen und allen weiteren Informationen findest Du auf dieser GitHub-Seite:",
2
4
  "zigbee2mqtt adapter settings": "Adaptereinstellungen für Zigbee2MQTT",
3
- "Select and configure your Zigbee2MQTT connection": "Wählen und konfiguriere die Zigbee2MQTT Verbindung",
5
+ "Select and configure your Zigbee2MQTT connection": "Konfiguriere die Zigbee2MQTT anbindung",
4
6
  "Select connection to Zigbee2MQTT": "Zigbee2MQTT Verbindung auswählen",
5
7
  "Websocket": "Websocket",
6
8
  "External MQTT-Server": "Externer MQTT-Server",
7
- "Internal MQTT-Server (Experimental)": "Interner MQTT-Server (Experimentell)",
8
- "Configure your Zigbee2MQTT connection": "Konfigurier die Zigbee2MQTT Verbindung",
9
+ "Internal MQTT-Server": "Interner MQTT-Server",
10
+ "Configure your Zigbee2MQTT connection": "Konfiguriere",
9
11
  "Websocket IP-Address": "Websocket IP-Adresse",
10
12
  "Websocket Port": "Websocket Port",
11
- "Create a dummy MQTT-Server for Zigbee2MQTT": "Dummy MQTT-Server für Zigbee2MQTT erstellen",
13
+ "Create a dummy MQTT-Server for Zigbee2MQTT": "Internen MQTT-Server für Zigbee2MQTT erstellen",
12
14
  "External MQTT-Server IP-Address": "IP-Adresse des externen MQTT-Servers",
13
15
  "External MQTT-Server Port": "Externer MQTT-Server Port",
14
16
  "MQTT-Server IP-Address bind": "MQTT-Server IP-Adresse binden",
@@ -1,10 +1,12 @@
1
1
  {
2
+ "click for Documentation": "click for Documentation",
3
+ "A detailed documentation with explanations and all further information can be found on this GitHub page:": "A detailed documentation with explanations and all further information can be found on this GitHub page:",
2
4
  "zigbee2mqtt adapter settings": "Adapter settings for zigbee2mqtt",
3
5
  "Select and configure your Zigbee2MQTT connection": "Select and configure Zigbee2MQTT connection",
4
6
  "Select connection to Zigbee2MQTT": "Select connection to Zigbee2MQTT",
5
7
  "Websocket": "Websocket",
6
8
  "External MQTT-Server": "External MQTT-Server",
7
- "Internal MQTT-Server (Experimental)": "Internal MQTT-Server (Experimental)",
9
+ "Internal MQTT-Server": "Internal MQTT-Server",
8
10
  "Configure your Zigbee2MQTT connection": "Configure your Zigbee2MQTT connection",
9
11
  "Websocket IP-Address": "Websocket IP-Address",
10
12
  "Websocket Port": "Websocket Port",
@@ -1,10 +1,12 @@
1
1
  {
2
+ "click for Documentation": "haz clic para ver la documentación",
3
+ "A detailed documentation with explanations and all further information can be found on this GitHub page:": "Una documentación detallada con explicaciones y toda la información adicional se puede encontrar en esta página de GitHub:",
2
4
  "zigbee2mqtt adapter settings": "Configuración del adaptador para zigbee2mqtt",
3
5
  "Select and configure your Zigbee2MQTT connection": "Seleccionar y configurar la conexión Zigbee2MQTT",
4
6
  "Select connection to Zigbee2MQTT": "Seleccionar conexión a Zigbee2MQTT",
5
7
  "Websocket": "Websocket",
6
8
  "External MQTT-Server": "Servidor MQTT externo",
7
- "Internal MQTT-Server (Experimental)": "Servidor MQTT interno (experimental)",
9
+ "Internal MQTT-Server": "Servidor MQTT interno",
8
10
  "Configure your Zigbee2MQTT connection": "Configura tu conexión Zigbee2MQTT",
9
11
  "Websocket IP-Address": "Dirección IP de Websocket",
10
12
  "Websocket Port": "puerto websocket",
@@ -1,10 +1,12 @@
1
1
  {
2
+ "click for Documentation": "cliquez pour la documentation",
3
+ "A detailed documentation with explanations and all further information can be found on this GitHub page:": "Une documentation détaillée avec des explications et toutes les informations complémentaires peut être trouvée sur cette page GitHub :",
2
4
  "zigbee2mqtt adapter settings": "Paramètres de l'adaptateur pour zigbee2mqtt",
3
5
  "Select and configure your Zigbee2MQTT connection": "Sélectionnez et configurez la connexion Zigbee2MQTT",
4
6
  "Select connection to Zigbee2MQTT": "Sélectionnez la connexion à Zigbee2MQTT",
5
7
  "Websocket": "Websocket",
6
8
  "External MQTT-Server": "Serveur MQTT externe",
7
- "Internal MQTT-Server (Experimental)": "Serveur MQTT interne (expérimental)",
9
+ "Internal MQTT-Server": "Serveur MQTT interne",
8
10
  "Configure your Zigbee2MQTT connection": "Configurez votre connexion Zigbee2MQTT",
9
11
  "Websocket IP-Address": "Adresse IP Websocket",
10
12
  "Websocket Port": "Port WebSocket",
@@ -1,10 +1,12 @@
1
1
  {
2
+ "click for Documentation": "clicca per la documentazione",
3
+ "A detailed documentation with explanations and all further information can be found on this GitHub page:": "Una documentazione dettagliata con spiegazioni e tutte le ulteriori informazioni può essere trovata su questa pagina GitHub:",
2
4
  "zigbee2mqtt adapter settings": "Impostazioni dell'adattatore per zigbee2mqtt",
3
5
  "Select and configure your Zigbee2MQTT connection": "Seleziona e configura la connessione Zigbee2MQTT",
4
6
  "Select connection to Zigbee2MQTT": "Seleziona la connessione a Zigbee2MQTT",
5
7
  "Websocket": "Presa web",
6
8
  "External MQTT-Server": "Server MQTT esterno",
7
- "Internal MQTT-Server (Experimental)": "Server MQTT interno (sperimentale)",
9
+ "Internal MQTT-Server": "Server MQTT interno",
8
10
  "Configure your Zigbee2MQTT connection": "Configura la tua connessione Zigbee2MQTT",
9
11
  "Websocket IP-Address": "Indirizzo IP WebSocket",
10
12
  "Websocket Port": "Porta websocket",
@@ -1,10 +1,12 @@
1
1
  {
2
+ "click for Documentation": "klik voor documentatie",
3
+ "A detailed documentation with explanations and all further information can be found on this GitHub page:": "Een gedetailleerde documentatie met uitleg en alle verdere informatie is te vinden op deze GitHub-pagina:",
2
4
  "zigbee2mqtt adapter settings": "Adapterinstellingen voor zigbee2mqtt",
3
5
  "Select and configure your Zigbee2MQTT connection": "Selecteer en configureer de Zigbee2MQTT-verbinding",
4
6
  "Select connection to Zigbee2MQTT": "Selecteer verbinding met Zigbee2MQTT",
5
7
  "Websocket": "Websocket",
6
8
  "External MQTT-Server": "Externe MQTT-server",
7
- "Internal MQTT-Server (Experimental)": "Interne MQTT-server (experimenteel)",
9
+ "Internal MQTT-Server": "Interne MQTT-server",
8
10
  "Configure your Zigbee2MQTT connection": "Configureer je Zigbee2MQTT-verbinding",
9
11
  "Websocket IP-Address": "Websocket IP-adres",
10
12
  "Websocket Port": "Websocket-poort",
@@ -1,10 +1,12 @@
1
1
  {
2
+ "click for Documentation": "kliknij, aby uzyskać dokumentację",
3
+ "A detailed documentation with explanations and all further information can be found on this GitHub page:": "Szczegółowa dokumentacja z wyjaśnieniami i wszystkimi dalszymi informacjami można znaleźć na tej stronie GitHub:",
2
4
  "zigbee2mqtt adapter settings": "Ustawienia adaptera dla zigbee2mqtt",
3
5
  "Select and configure your Zigbee2MQTT connection": "Wybierz i skonfiguruj połączenie Zigbee2MQTT",
4
6
  "Select connection to Zigbee2MQTT": "Wybierz połączenie z Zigbee2MQTT",
5
7
  "Websocket": "Gniazdo sieciowe",
6
8
  "External MQTT-Server": "Zewnętrzny serwer MQTT",
7
- "Internal MQTT-Server (Experimental)": "Wewnętrzny serwer MQTT (eksperymentalny)",
9
+ "Internal MQTT-Server": "Wewnętrzny serwer MQTT",
8
10
  "Configure your Zigbee2MQTT connection": "Skonfiguruj połączenie Zigbee2MQTT",
9
11
  "Websocket IP-Address": "Adres IP gniazda internetowego",
10
12
  "Websocket Port": "Gniazdo sieciowe",
@@ -1,10 +1,12 @@
1
1
  {
2
+ "click for Documentation": "clique para ver a documentação",
3
+ "A detailed documentation with explanations and all further information can be found on this GitHub page:": "Uma documentação detalhada com explicações e toda a informação adicional pode ser encontrada nesta pagina do GitHub:",
2
4
  "zigbee2mqtt adapter settings": "Configurações do adaptador para zigbee2mqtt",
3
5
  "Select and configure your Zigbee2MQTT connection": "Selecione e configure a conexão Zigbee2MQTT",
4
6
  "Select connection to Zigbee2MQTT": "Selecione a conexão com Zigbee2MQTT",
5
7
  "Websocket": "Websocket",
6
8
  "External MQTT-Server": "Servidor MQTT Externo",
7
- "Internal MQTT-Server (Experimental)": "Servidor MQTT Interno (Experimental)",
9
+ "Internal MQTT-Server": "Servidor MQTT Interno",
8
10
  "Configure your Zigbee2MQTT connection": "Configure sua conexão Zigbee2MQTT",
9
11
  "Websocket IP-Address": "Endereço IP do Websocket",
10
12
  "Websocket Port": "Porta Websocket",
@@ -1,10 +1,12 @@
1
1
  {
2
+ "click for Documentation": "нажмите для документации",
3
+ "A detailed documentation with explanations and all further information can be found on this GitHub page:": "Подробная документация с объяснениями и всеми дальними информаций можно найти на этом GitHub-странице:",
2
4
  "zigbee2mqtt adapter settings": "Настройки адаптера для zigbee2mqtt",
3
5
  "Select and configure your Zigbee2MQTT connection": "Выберите и настройте соединение Zigbee2MQTT",
4
6
  "Select connection to Zigbee2MQTT": "Выберите подключение к Zigbee2MQTT",
5
7
  "Websocket": "Веб-сокет",
6
8
  "External MQTT-Server": "Внешний MQTT-сервер",
7
- "Internal MQTT-Server (Experimental)": "Внутренний MQTT-сервер (экспериментальный)",
9
+ "Internal MQTT-Server": "Внутренний MQTT-сервер",
8
10
  "Configure your Zigbee2MQTT connection": "Настройте соединение Zigbee2MQTT",
9
11
  "Websocket IP-Address": "IP-адрес веб-сокета",
10
12
  "Websocket Port": "Порт веб-сокета",
@@ -1,10 +1,12 @@
1
1
  {
2
+ "click for Documentation": "натисніть для документації",
3
+ "A detailed documentation with explanations and all further information can be found on this GitHub page:": "Детальна документація з поясненнями і всім більшою інформацією можна знайти на цій GitHub-сторінці:",
2
4
  "zigbee2mqtt adapter settings": "Налаштування адаптера для zigbee2mqtt",
3
5
  "Select and configure your Zigbee2MQTT connection": "Виберіть і налаштуйте підключення Zigbee2MQTT",
4
6
  "Select connection to Zigbee2MQTT": "Виберіть підключення до Zigbee2MQTT",
5
7
  "Websocket": "Websocket",
6
8
  "External MQTT-Server": "Зовнішній MQTT-сервер",
7
- "Internal MQTT-Server (Experimental)": "Внутрішній MQTT-сервер (експериментальний)",
9
+ "Internal MQTT-Server": "Внутрішній MQTT-сервер",
8
10
  "Configure your Zigbee2MQTT connection": "Налаштуйте підключення Zigbee2MQTT",
9
11
  "Websocket IP-Address": "IP-адреса Websocket",
10
12
  "Websocket Port": "Порт Websocket",
@@ -1,10 +1,12 @@
1
1
  {
2
+ "click for Documentation": "点击查看文档",
3
+ "A detailed documentation with explanations and all further information can be found on this GitHub page:": "有关更多信息,请参见 GitHub 页面上的详细说明和解释:",
2
4
  "zigbee2mqtt adapter settings": "zigbee2mqtt 的适配器设置",
3
5
  "Select and configure your Zigbee2MQTT connection": "选择并配置 Zigbee2MQTT 连接",
4
6
  "Select connection to Zigbee2MQTT": "选择与 Zigbee2MQTT 的连接",
5
7
  "Websocket": "网络套接字",
6
8
  "External MQTT-Server": "外部 MQTT 服务器",
7
- "Internal MQTT-Server (Experimental)": "内部 MQTT 服务器(实验性)",
9
+ "Internal MQTT-Server": "内部 MQTT 服务器",
8
10
  "Configure your Zigbee2MQTT connection": "配置您的 Zigbee2MQTT 连接",
9
11
  "Websocket IP-Address": "Websocket IP 地址",
10
12
  "Websocket Port": "Websocket 端口",
@@ -1,434 +1,477 @@
1
1
  {
2
- "i18n": true,
3
- "type": "panel",
4
- "items": {
5
- "connectionHeader": {
6
- "type": "header",
7
- "text": "Select and configure your Zigbee2MQTT connection",
8
- "size": 2,
9
- "newLine": true
10
- },
11
- "connectionType": {
12
- "label": "Select connection to Zigbee2MQTT",
13
- "xs": 12,
14
- "sm": 12,
15
- "md": 6,
16
- "lg": 4,
17
- "xl": 4,
18
- "type": "select",
19
- "options": [
20
- {
21
- "label": "Websocket",
22
- "value": "ws"
23
- },
24
- {
25
- "label": "External MQTT-Server",
26
- "value": "exmqtt"
27
- },
28
- {
29
- "label": "Internal MQTT-Server (Experimental)",
30
- "value": "intmqtt"
31
- }
32
- ],
33
- "newLine": true
34
- },
35
- "spacer01": {
36
- "type": "staticText",
37
- "text": "",
38
- "xs": 12,
39
- "sm": 12,
40
- "md": 6,
41
- "lg": 4,
42
- "xl": 4,
43
- "newLine": true
44
- },
45
- "wsHeader": {
46
- "type": "staticText",
47
- "text": "Configure your Zigbee2MQTT connection",
48
- "xs": 12,
49
- "sm": 12,
50
- "md": 6,
51
- "lg": 4,
52
- "xl": 4,
53
- "newLine": true
54
- },
55
- "wsScheme": {
56
- "type": "select",
57
- "label": "Scheme",
58
- "options": [
59
- {
60
- "label": "WS",
61
- "value": "ws"
62
- },
63
- {
64
- "label": "WSS (SSL)",
65
- "value": "wss"
66
- }
67
- ],
68
- "newLine": true,
69
- "xs": 12,
70
- "sm": 12,
71
- "md": 6,
72
- "lg": 4,
73
- "xl": 4,
74
- "hidden": "data.connectionType != 'ws'"
75
- },
76
- "wsServerIP": {
77
- "type": "text",
78
- "label": "Websocket IP-Address",
79
- "xs": 12,
80
- "sm": 12,
81
- "md": 6,
82
- "lg": 4,
83
- "xl": 4,
84
- "newLine": false,
85
- "hidden": "data.connectionType != 'ws'"
86
- },
87
- "wsServerPort": {
88
- "type": "number",
89
- "label": "Websocket Port",
90
- "newLine": false,
91
- "xs": 12,
92
- "sm": 12,
93
- "md": 6,
94
- "lg": 4,
95
- "xl": 4,
96
- "hidden": "data.connectionType != 'ws'"
97
- },
98
- "wsTokenEnabled": {
99
- "type": "checkbox",
100
- "label": "Use Auth-Token",
101
- "newLine": true,
102
- "xs": 12,
103
- "sm": 12,
104
- "md": 6,
105
- "lg": 4,
106
- "xl": 4,
107
- "hidden": "data.connectionType != 'ws'"
108
- },
109
- "wsToken": {
110
- "type": "password",
111
- "label": "Auth-Token (special characters are not supported)",
112
- "newLine": true,
113
- "xs": 12,
114
- "sm": 12,
115
- "md": 6,
116
- "lg": 4,
117
- "xl": 4,
118
- "lg": 5,
119
- "hidden": "data.wsTokenEnabled != true || data.connectionType != 'ws'"
120
- },
121
- "dummyMqtt": {
122
- "type": "checkbox",
123
- "label": "Create a dummy MQTT-Server for Zigbee2MQTT",
124
- "newLine": true,
125
- "xs": 12,
126
- "sm": 12,
127
- "md": 6,
128
- "lg": 4,
129
- "xl": 4,
130
- "hidden": "data.connectionType != 'ws'"
131
- },
132
- "externalMqttServerIP": {
133
- "type": "text",
134
- "label": "External MQTT-Server IP-Address",
135
- "newLine": true,
136
- "xs": 12,
137
- "sm": 12,
138
- "md": 6,
139
- "lg": 4,
140
- "xl": 4,
141
- "hidden": "data.connectionType != 'exmqtt'"
142
- },
143
- "externalMqttServerPort": {
144
- "type": "number",
145
- "label": "External MQTT-Server Port",
146
- "newLine": false,
147
- "xs": 12,
148
- "sm": 12,
149
- "md": 6,
150
- "lg": 4,
151
- "xl": 4,
152
- "hidden": "data.connectionType != 'exmqtt'"
153
- },
154
- "externalMqttServerCredentials": {
155
- "type": "checkbox",
156
- "label": "Use MQTT Credentials",
157
- "newLine": true,
158
- "xs": 12,
159
- "sm": 12,
160
- "md": 6,
161
- "lg": 4,
162
- "xl": 4,
163
- "hidden": "data.connectionType != 'exmqtt'"
164
- },
165
- "externalMqttServerUsername": {
166
- "type": "text",
167
- "label": "MQTT Username",
168
- "newLine": true,
169
- "xs": 12,
170
- "sm": 12,
171
- "md": 6,
172
- "lg": 4,
173
- "xl": 4,
174
- "hidden": "data.externalMqttServerCredentials != true ||data.connectionType != 'exmqtt'"
175
- },
176
- "externalMqttServerPassword": {
177
- "type": "password",
178
- "label": "MQTT Password",
179
- "newLine": false,
180
- "xs": 12,
181
- "sm": 12,
182
- "md": 6,
183
- "lg": 4,
184
- "xl": 4,
185
- "visible": true,
186
- "hidden": "data.externalMqttServerCredentials != true ||data.connectionType != 'exmqtt'"
187
- },
188
- "mqttServerIPBind": {
189
- "type": "ip",
190
- "label": "MQTT-Server IP-Address bind",
191
- "listenOnAllPorts": true,
192
- "xs": 12,
193
- "sm": 12,
194
- "md": 6,
195
- "lg": 4,
196
- "xl": 4,
197
- "newLine": true,
198
- "hidden": "data.connectionType == 'exmqtt' || data.dummyMqtt == false && data.connectionType == 'ws'"
199
- },
200
- "mqttServerPort": {
201
- "type": "number",
202
- "label": "MQTT-Server Port",
203
- "xs": 12,
204
- "sm": 12,
205
- "md": 6,
206
- "lg": 4,
207
- "xl": 4,
208
- "newLine": false,
209
- "hidden": "data.connectionType == 'exmqtt' || data.dummyMqtt == false && data.connectionType == 'ws'"
210
- },
211
- "spacer02": {
212
- "type": "staticText",
213
- "text": "",
214
- "newLine": true,
215
- "hidden": "data.connectionType == 'ws'"
216
- },
217
- "webUIHeader": {
218
- "type": "header",
219
- "text": "Configure your Zigbee2MQTT WebUi connection",
220
- "size": 2,
221
- "newLine": true
222
- },
223
- "webUIScheme": {
224
- "type": "select",
225
- "label": "Scheme",
226
- "options": [
227
- {
228
- "label": "HTTP",
229
- "value": "http"
230
- },
231
- {
232
- "label": "HTTPS",
233
- "value": "https"
234
- }
235
- ],
236
- "xs": 12,
237
- "sm": 12,
238
- "md": 6,
239
- "lg": 4,
240
- "xl": 4,
241
- "newLine": true
242
- },
243
- "webUIServer": {
244
- "type": "text",
245
- "label": "WebUi Address",
246
- "xs": 12,
247
- "sm": 12,
248
- "md": 6,
249
- "lg": 4,
250
- "xl": 4,
251
- "newLine": false
252
- },
253
- "webUIPort": {
254
- "type": "number",
255
- "label": "WebUi Port",
256
- "xs": 12,
257
- "sm": 12,
258
- "md": 6,
259
- "lg": 4,
260
- "xl": 4,
261
- "newLine": false
262
- },
263
- "spacer03": {
264
- "type": "staticText",
265
- "text": "",
266
- "newLine": true
267
- },
268
- "colorHeader": {
269
- "type": "header",
270
- "text": "Color configurations",
271
- "size": 2,
272
- "newLine": true
273
- },
274
- "colorTempSyncColor": {
275
- "type": "checkbox",
276
- "label": "Color temperature sync with color",
277
- "newLine": true
278
- },
279
- "useKelvin": {
280
- "type": "checkbox",
281
- "label": "Use Kelvin instead of mired for the color temps",
282
- "newLine": true
283
- },
284
- "stateHeader": {
285
- "type": "header",
286
- "text": "State configurations",
287
- "size": 2,
288
- "newLine": true
289
- },
290
- "simpleHoldReleaseState": {
291
- "type": "checkbox",
292
- "label": "Generate simple 'Hold' and 'Release' states",
293
- "help": "When enabled, the 'Hold' and 'Release' states are combined and the 'Hold' data point remains true until the 'Release' event arrives.",
294
- "newLine": true
295
- },
296
- "simpleMoveStopState": {
297
- "type": "checkbox",
298
- "label": "Generate simple 'Move' and 'Stop' states",
299
- "help": "When enabled, the 'Move' and 'Stop' states are combined and the 'Move' data point remains true until the 'Stop' event arrives.",
300
- "newLine": true
301
- },
302
- "simplePressReleaseState": {
303
- "type": "checkbox",
304
- "label": "Generate simple 'Press' and 'Release' states",
305
- "help": "When enabled, the 'Press' and 'Release' states are combined and the 'Press' data point remains true until the 'Release' event arrives.",
306
- "newLine": true
307
- },
308
- "brightnessMoveOnOff": {
309
- "type": "checkbox",
310
- "label": "Brightness move should also turn the light on or off",
311
- "newLine": true
312
- },
313
- "brightnessStepOnOff": {
314
- "type": "checkbox",
315
- "label": "Brightness step should also turn the light on or off",
316
- "newLine": true
317
- },
318
- "imageHeader": {
319
- "type": "header",
320
- "text": "Device image configurations",
321
- "size": 2,
322
- "newLine": true
323
- },
324
- "useDeviceIcons": {
325
- "type": "checkbox",
326
- "label": "Download device images from Zigbee2Mqtt and use them as object icons.",
327
- "help": "If the size is later changed to a larger value, the images already downloaded must be deleted. <br> Please note that icons are stored in the object and should therefore not be unnecessarily large!",
328
- "newLine": true
329
- },
330
- "deviceIconsSize": {
331
- "type": "number",
332
- "label": "Size of the object icons in pixels",
333
- "min": 8,
334
- "xs": 12,
335
- "sm": 12,
336
- "md": 6,
337
- "lg": 4,
338
- "xl": 4,
339
- "newLine": true
340
- },
341
- "otherHeader": {
342
- "type": "header",
343
- "text": "Other configurations",
344
- "size": 2,
345
- "newLine": true
346
- },
347
- "coordinatorCheck": {
348
- "type": "checkbox",
349
- "label": "Automatic check for missing routers in the coordinator memory.",
350
- "help": "More information",
351
- "helpLink": "https://www.zigbee2mqtt.io/guide/usage/mqtt_topics_and_messages.html#zigbee2mqtt-bridge-request-coordinator-check",
352
- "newLine": true
353
- },
354
- "coordinatorCheckLogLvl": {
355
- "type": "select",
356
- "sm": 3,
357
- "label": "With which log level should a negative search be logged?",
358
- "options": [
359
- {
360
- "label": {
361
- "en": "Debug"
362
- },
363
- "value": "debug"
364
- },
365
- {
366
- "label": {
367
- "en": "Info"
368
- },
369
- "value": "info"
370
- },
371
- {
372
- "label": {
373
- "en": "Warning"
374
- },
375
- "value": "warn"
376
- },
377
- {
378
- "label": {
379
- "en": "Error"
380
- },
381
- "value": "error"
382
- }
383
- ],
384
- "newLine": true,
385
- "xs": 12,
386
- "sm": 12,
387
- "md": 6,
388
- "lg": 4,
389
- "xl": 4,
390
- "hidden": "data.coordinatorCheck != true"
391
- },
392
- "coordinatorCheckCron": {
393
- "type": "cron",
394
- "label": "Time of the automatic check",
395
- "help": "Default: 0 3 * * * (At 03:00 every day)",
396
- "simple": true,
397
- "newLine": true,
398
- "sm": 3,
399
- "hidden": "data.coordinatorCheck != true"
400
- },
401
- "spacer04": {
402
- "type": "staticText",
403
- "text": "",
404
- "newLine": true,
405
- "hidden": "data.coordinatorCheck != true"
406
- },
407
- "proxyZ2MLogs": {
408
- "type": "checkbox",
409
- "label": "Proxy Zigbee2MQTT logs to ioBroker logs",
410
- "newLine": true
411
- },
412
- "useEventInDesc": {
413
- "type": "checkbox",
414
- "label": "The events such as 'Device removed' or 'Disabled' are displayed in the description instead of in the name.",
415
- "newLine": true
416
- },
417
- "expertHeader": {
418
- "type": "header",
419
- "text": "Expert Settings. Please only use if you know what you're doing",
420
- "size": 2,
421
- "newLine": true
422
- },
423
- "allwaysUpdateOccupancyState": {
424
- "type": "checkbox",
425
- "label": "Allways update state for occupancy when message arrives from zigbee2mqtt server (Only for true state). Increases load on ioBroker System",
426
- "newLine": true
427
- },
428
- "allwaysUpdateAvailableState": {
429
- "type": "checkbox",
430
- "label": "Allways update available state when message included last_seen status",
431
- "newLine": true
432
- }
433
- }
434
- }
2
+ "i18n": true,
3
+ "type": "tabs",
4
+ "tabsStyle": {
5
+ "width": "calc(100% - 100px)"
6
+ },
7
+ "items": {
8
+ "_tab_Start": {
9
+ "type": "panel",
10
+ "label": "Main Settings",
11
+ "items": {
12
+ "header_Start": {
13
+ "type": "header",
14
+ "text": "Welcome to Zigbee2MQTT Adapter",
15
+ "size": 2
16
+ },
17
+ "_textStart": {
18
+ "type": "staticText",
19
+ "text": "A detailed documentation with explanations and all further information can be found on this GitHub page",
20
+ "xs": 12,
21
+ "sm": 12,
22
+ "md": 6,
23
+ "lg": 4,
24
+ "xl": 4,
25
+ "style": {
26
+ "fontSize": 14,
27
+ "marginTop": 0
28
+ }
29
+ },
30
+ "_documentationLink": {
31
+ "type": "staticLink",
32
+ "label": "click for Documentation",
33
+ "button": true,
34
+ "href": "https://github.com/arteck/ioBroker.zigbee2mqtt/blob/main/docs/wiki.md",
35
+ "xs": 12,
36
+ "sm": 12,
37
+ "md": 6,
38
+ "lg": 4,
39
+ "xl": 4,
40
+ "style": {
41
+ "fontSize": 18,
42
+ "marginTop": 0
43
+ }
44
+ },
45
+ "connectionHeader": {
46
+ "type": "header",
47
+ "text": "Select and configure your Zigbee2MQTT connection",
48
+ "size": 2,
49
+ "newLine": true
50
+ },
51
+ "connectionType": {
52
+ "label": "Select connection to Zigbee2MQTT",
53
+ "xs": 12,
54
+ "sm": 12,
55
+ "md": 6,
56
+ "lg": 4,
57
+ "xl": 4,
58
+ "type": "select",
59
+ "options": [
60
+ {
61
+ "label": "Websocket",
62
+ "value": "ws"
63
+ },
64
+ {
65
+ "label": "External MQTT-Server",
66
+ "value": "exmqtt"
67
+ },
68
+ {
69
+ "label": "Internal MQTT-Server",
70
+ "value": "intmqtt"
71
+ }
72
+ ],
73
+ "newLine": true
74
+ },
75
+ "spacer01": {
76
+ "type": "staticText",
77
+ "text": "",
78
+ "xs": 12,
79
+ "sm": 12,
80
+ "md": 6,
81
+ "lg": 4,
82
+ "xl": 4,
83
+ "newLine": true
84
+ },
85
+ "wsHeader": {
86
+ "type": "staticText",
87
+ "text": "Configure your Zigbee2MQTT connection",
88
+ "xs": 12,
89
+ "sm": 12,
90
+ "md": 6,
91
+ "lg": 4,
92
+ "xl": 4,
93
+ "newLine": true
94
+ },
95
+ "wsScheme": {
96
+ "type": "select",
97
+ "label": "Scheme",
98
+ "options": [
99
+ {
100
+ "label": "WS",
101
+ "value": "ws"
102
+ },
103
+ {
104
+ "label": "WSS (SSL)",
105
+ "value": "wss"
106
+ }
107
+ ],
108
+ "newLine": true,
109
+ "xs": 12,
110
+ "sm": 12,
111
+ "md": 6,
112
+ "lg": 4,
113
+ "xl": 4,
114
+ "hidden": "data.connectionType != 'ws'"
115
+ },
116
+ "wsServerIP": {
117
+ "type": "text",
118
+ "label": "Websocket IP-Address",
119
+ "xs": 12,
120
+ "sm": 12,
121
+ "md": 6,
122
+ "lg": 4,
123
+ "xl": 4,
124
+ "newLine": false,
125
+ "hidden": "data.connectionType != 'ws'"
126
+ },
127
+ "wsServerPort": {
128
+ "type": "number",
129
+ "label": "Websocket Port",
130
+ "newLine": false,
131
+ "xs": 12,
132
+ "sm": 12,
133
+ "md": 6,
134
+ "lg": 4,
135
+ "xl": 4,
136
+ "hidden": "data.connectionType != 'ws'"
137
+ },
138
+ "wsTokenEnabled": {
139
+ "type": "checkbox",
140
+ "label": "Use Auth-Token",
141
+ "newLine": true,
142
+ "xs": 12,
143
+ "sm": 12,
144
+ "md": 6,
145
+ "lg": 4,
146
+ "xl": 4,
147
+ "hidden": "data.connectionType != 'ws'"
148
+ },
149
+ "wsToken": {
150
+ "type": "password",
151
+ "label": "Auth-Token (special characters are not supported)",
152
+ "newLine": true,
153
+ "xs": 12,
154
+ "sm": 12,
155
+ "md": 6,
156
+ "lg": 5,
157
+ "xl": 4,
158
+ "hidden": "data.wsTokenEnabled != true || data.connectionType != 'ws'"
159
+ },
160
+ "dummyMqtt": {
161
+ "type": "checkbox",
162
+ "label": "Create a dummy MQTT-Server for Zigbee2MQTT",
163
+ "newLine": true,
164
+ "xs": 12,
165
+ "sm": 12,
166
+ "md": 6,
167
+ "lg": 4,
168
+ "xl": 4,
169
+ "hidden": "data.connectionType != 'ws'"
170
+ },
171
+ "externalMqttServerIP": {
172
+ "type": "text",
173
+ "label": "External MQTT-Server IP-Address",
174
+ "newLine": true,
175
+ "xs": 12,
176
+ "sm": 12,
177
+ "md": 6,
178
+ "lg": 4,
179
+ "xl": 4,
180
+ "hidden": "data.connectionType != 'exmqtt'"
181
+ },
182
+ "externalMqttServerPort": {
183
+ "type": "number",
184
+ "label": "External MQTT-Server Port",
185
+ "newLine": false,
186
+ "xs": 12,
187
+ "sm": 12,
188
+ "md": 6,
189
+ "lg": 4,
190
+ "xl": 4,
191
+ "hidden": "data.connectionType != 'exmqtt'"
192
+ },
193
+ "externalMqttServerCredentials": {
194
+ "type": "checkbox",
195
+ "label": "Use MQTT Credentials",
196
+ "newLine": true,
197
+ "xs": 12,
198
+ "sm": 12,
199
+ "md": 6,
200
+ "lg": 4,
201
+ "xl": 4,
202
+ "hidden": "data.connectionType != 'exmqtt'"
203
+ },
204
+ "externalMqttServerUsername": {
205
+ "type": "text",
206
+ "label": "MQTT Username",
207
+ "newLine": true,
208
+ "xs": 12,
209
+ "sm": 12,
210
+ "md": 6,
211
+ "lg": 4,
212
+ "xl": 4,
213
+ "hidden": "data.externalMqttServerCredentials != true ||data.connectionType != 'exmqtt'"
214
+ },
215
+ "externalMqttServerPassword": {
216
+ "type": "password",
217
+ "label": "MQTT Password",
218
+ "newLine": false,
219
+ "xs": 12,
220
+ "sm": 12,
221
+ "md": 6,
222
+ "lg": 4,
223
+ "xl": 4,
224
+ "visible": true,
225
+ "hidden": "data.externalMqttServerCredentials != true ||data.connectionType != 'exmqtt'"
226
+ },
227
+ "mqttServerIPBind": {
228
+ "type": "ip",
229
+ "label": "MQTT-Server IP-Address bind",
230
+ "listenOnAllPorts": true,
231
+ "xs": 12,
232
+ "sm": 12,
233
+ "md": 6,
234
+ "lg": 4,
235
+ "xl": 4,
236
+ "newLine": true,
237
+ "hidden": "data.connectionType == 'exmqtt' || data.dummyMqtt == false && data.connectionType == 'ws'"
238
+ },
239
+ "mqttServerPort": {
240
+ "type": "number",
241
+ "label": "MQTT-Server Port",
242
+ "xs": 12,
243
+ "sm": 12,
244
+ "md": 6,
245
+ "lg": 4,
246
+ "xl": 4,
247
+ "newLine": false,
248
+ "hidden": "data.connectionType == 'exmqtt' || data.dummyMqtt == false && data.connectionType == 'ws'"
249
+ },
250
+ "spacer02": {
251
+ "type": "staticText",
252
+ "text": "",
253
+ "newLine": true,
254
+ "hidden": "data.connectionType == 'ws'"
255
+ },
256
+ "webUIHeader": {
257
+ "type": "header",
258
+ "text": "Configure your Zigbee2MQTT WebUi connection",
259
+ "size": 2,
260
+ "newLine": true
261
+ },
262
+ "webUIScheme": {
263
+ "type": "select",
264
+ "label": "Scheme",
265
+ "options": [
266
+ {
267
+ "label": "HTTP",
268
+ "value": "http"
269
+ },
270
+ {
271
+ "label": "HTTPS",
272
+ "value": "https"
273
+ }
274
+ ],
275
+ "xs": 12,
276
+ "sm": 12,
277
+ "md": 6,
278
+ "lg": 4,
279
+ "xl": 4,
280
+ "newLine": true
281
+ },
282
+ "webUIServer": {
283
+ "type": "text",
284
+ "label": "WebUi Address",
285
+ "xs": 12,
286
+ "sm": 12,
287
+ "md": 6,
288
+ "lg": 4,
289
+ "xl": 4,
290
+ "newLine": false
291
+ },
292
+ "webUIPort": {
293
+ "type": "number",
294
+ "label": "WebUi Port",
295
+ "xs": 12,
296
+ "sm": 12,
297
+ "md": 6,
298
+ "lg": 4,
299
+ "xl": 4,
300
+ "newLine": false
301
+ }
302
+ }
303
+ },
304
+ "_tab_Color Settings": {
305
+ "type": "panel",
306
+ "label": "Color configurations",
307
+ "items": {
308
+ "colorTempSyncColor": {
309
+ "type": "checkbox",
310
+ "label": "Color temperature sync with color",
311
+ "newLine": true
312
+ },
313
+ "useKelvin": {
314
+ "type": "checkbox",
315
+ "label": "Use Kelvin instead of mired for the color temps",
316
+ "newLine": true
317
+ }
318
+ }
319
+ },
320
+ "_tab_State Settings": {
321
+ "type": "panel",
322
+ "label": "State configurations",
323
+ "items": {
324
+ "simpleHoldReleaseState": {
325
+ "type": "checkbox",
326
+ "label": "Generate simple 'Hold' and 'Release' states",
327
+ "help": "When enabled, the 'Hold' and 'Release' states are combined and the 'Hold' data point remains true until the 'Release' event arrives.",
328
+ "newLine": true
329
+ },
330
+ "simpleMoveStopState": {
331
+ "type": "checkbox",
332
+ "label": "Generate simple 'Move' and 'Stop' states",
333
+ "help": "When enabled, the 'Move' and 'Stop' states are combined and the 'Move' data point remains true until the 'Stop' event arrives.",
334
+ "newLine": true
335
+ },
336
+ "simplePressReleaseState": {
337
+ "type": "checkbox",
338
+ "label": "Generate simple 'Press' and 'Release' states",
339
+ "help": "When enabled, the 'Press' and 'Release' states are combined and the 'Press' data point remains true until the 'Release' event arrives.",
340
+ "newLine": true
341
+ },
342
+ "brightnessMoveOnOff": {
343
+ "type": "checkbox",
344
+ "label": "Brightness move should also turn the light on or off",
345
+ "newLine": true
346
+ },
347
+ "brightnessStepOnOff": {
348
+ "type": "checkbox",
349
+ "label": "Brightness step should also turn the light on or off",
350
+ "newLine": true
351
+ }
352
+ }
353
+ },
354
+ "_tab_Image Settings": {
355
+ "type": "panel",
356
+ "label": "Device image configurations",
357
+ "items": {
358
+ "useDeviceIcons": {
359
+ "type": "checkbox",
360
+ "label": "Download device images from Zigbee2Mqtt and use them as object icons.",
361
+ "help": "If the size is later changed to a larger value, the images already downloaded must be deleted. <br> Please note that icons are stored in the object and should therefore not be unnecessarily large!",
362
+ "newLine": true
363
+ },
364
+ "deviceIconsSize": {
365
+ "type": "number",
366
+ "label": "Size of the object icons in pixels",
367
+ "min": 8,
368
+ "xs": 12,
369
+ "sm": 12,
370
+ "md": 6,
371
+ "lg": 4,
372
+ "xl": 4,
373
+ "newLine": true
374
+ }
375
+ }
376
+ },
377
+ "_tab_Other Settings": {
378
+ "type": "panel",
379
+ "label": "Other configurations",
380
+ "items": {
381
+
382
+ "proxyZ2MLogs": {
383
+ "type": "checkbox",
384
+ "label": "Proxy Zigbee2MQTT logs to ioBroker logs",
385
+ "newLine": true
386
+ },
387
+ "useEventInDesc": {
388
+ "type": "checkbox",
389
+ "label": "The events such as 'Device removed' or 'Disabled' are displayed in the description instead of in the name.",
390
+ "newLine": true
391
+ }
392
+ }
393
+ },
394
+ "_tab_Expert Settings": {
395
+ "type": "panel",
396
+ "label": "Expert configurations",
397
+ "items": {
398
+ "expertHeader": {
399
+ "type": "header",
400
+ "text": "Expert Settings. Please only use if you know what you're doing",
401
+ "size": 2,
402
+ "newLine": true
403
+ },
404
+ "coordinatorCheck": {
405
+ "type": "checkbox",
406
+ "label": "Automatic check for missing routers in the coordinator memory.",
407
+ "help": "More information",
408
+ "helpLink": "https://www.zigbee2mqtt.io/guide/usage/mqtt_topics_and_messages.html#zigbee2mqtt-bridge-request-coordinator-check",
409
+ "newLine": true
410
+ },
411
+ "coordinatorCheckLogLvl": {
412
+ "type": "select",
413
+ "sm": 12,
414
+ "label": "With which log level should a negative search be logged?",
415
+ "options": [
416
+ {
417
+ "label": {
418
+ "en": "Debug"
419
+ },
420
+ "value": "debug"
421
+ },
422
+ {
423
+ "label": {
424
+ "en": "Info"
425
+ },
426
+ "value": "info"
427
+ },
428
+ {
429
+ "label": {
430
+ "en": "Warning"
431
+ },
432
+ "value": "warn"
433
+ },
434
+ {
435
+ "label": {
436
+ "en": "Error"
437
+ },
438
+ "value": "error"
439
+ }
440
+ ],
441
+ "newLine": true,
442
+ "xs": 12,
443
+ "md": 6,
444
+ "lg": 4,
445
+ "xl": 4,
446
+ "hidden": "data.coordinatorCheck != true"
447
+ },
448
+ "coordinatorCheckCron": {
449
+ "type": "cron",
450
+ "label": "Time of the automatic check",
451
+ "help": "Default: 0 3 * * * (At 03:00 every day)",
452
+ "simple": true,
453
+ "newLine": true,
454
+ "sm": 3,
455
+ "hidden": "data.coordinatorCheck != true"
456
+ },
457
+ "spacer04": {
458
+ "type": "staticText",
459
+ "text": "",
460
+ "newLine": true,
461
+ "hidden": "data.coordinatorCheck != true"
462
+ },
463
+
464
+ "allwaysUpdateOccupancyState": {
465
+ "type": "checkbox",
466
+ "label": "Allways update state for occupancy when message arrives from zigbee2mqtt server (Only for true state). Increases load on ioBroker System",
467
+ "newLine": true
468
+ },
469
+ "allwaysUpdateAvailableState": {
470
+ "type": "checkbox",
471
+ "label": "Allways update available state when message included last_seen status",
472
+ "newLine": true
473
+ }
474
+ }
475
+ }
476
+ }
477
+ }
package/io-package.json CHANGED
@@ -1,8 +1,21 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "zigbee2mqtt",
4
- "version": "3.0.5",
4
+ "version": "3.0.6",
5
5
  "news": {
6
+ "3.0.6": {
7
+ "en": "settings restructure\nfix icon not found message",
8
+ "de": "einstellungen restrukturieren\nsymbol nicht gefunden",
9
+ "ru": "реструктуризация настроек\nисправить иконку не найдено сообщение",
10
+ "pt": "reestruturação de configurações\ncorrigir ícone não encontrado mensagem",
11
+ "nl": "instellingen herstructureren\npictogram niet gevonden bericht herstellen",
12
+ "fr": "restructuration des paramètres\ncorrection icône non trouvée message",
13
+ "it": "installazione\nfix icona non trovato messaggio",
14
+ "es": "configuración de reestructuración\nfijar icono no encontrado mensaje",
15
+ "pl": "restrukturyzacja ustawień\nnie znaleziono ikony",
16
+ "uk": "реструктуризація параметрів\nне знайдено повідомлення",
17
+ "zh-cn": "设置调整\n未找到消息的修复图标"
18
+ },
6
19
  "3.0.5": {
7
20
  "en": "add additional folder for some devices (like smoke detector)\nstate.js cleanup\nset available State to true if device message include last_seen status",
8
21
  "de": "zusätzliche ordner für einige geräte hinzufügen (wie rauchmelder)\nstate.js cleanup\neingestellt verfügbar Zustand, um wahr zu sein, wenn die Gerätenachricht last_seen status enthält",
@@ -80,19 +93,6 @@
80
93
  "pl": "adaptacja z2m 2.x",
81
94
  "uk": "адаптація z2m 2.x",
82
95
  "zh-cn": "适应z2m 2.x"
83
- },
84
- "2.13.11": {
85
- "en": "corr package.json",
86
- "de": "korr paket.json",
87
- "ru": "коррек-пакет.json",
88
- "pt": "corr pacote.json",
89
- "nl": "corr package.json",
90
- "fr": "c'est ce qu'il a dit",
91
- "it": "pacchetto corr.json",
92
- "es": "corr package.json",
93
- "pl": "corr package.json",
94
- "uk": "english, українська, français..",
95
- "zh-cn": "corr 软件包.json"
96
96
  }
97
97
  },
98
98
  "messages": [
@@ -53,6 +53,7 @@ class ImageController {
53
53
  const slsIconFileName = `${this.sanitizeModelIDForImageUrl(device.model_id)}.png`;
54
54
 
55
55
  let iconFileName = await this.getExistingIconFileName(z2mIconFileNameJPG, z2mIconFileNamePNG, slsIconFileName);
56
+ let iconFound = true;
56
57
 
57
58
  if (!iconFileName) {
58
59
  const iconUrls = [
@@ -63,30 +64,29 @@ class ImageController {
63
64
 
64
65
  for (const iconUrl of iconUrls) {
65
66
  try {
66
- await this.downloadIcon(this.adapter, iconUrl, this.adapter.namespace);
67
- iconFileName = this.getFileNameWithExtension(iconUrl);
68
- break;
69
- } catch (err) {
70
- this.adapter.log.warn(`Failed to download image from ${iconUrl}`);
67
+ iconFound = await this.downloadIcon(this.adapter, iconUrl, this.adapter.namespace);
68
+ if (iconFound) {
69
+ iconFileName = this.getFileNameWithExtension(iconUrl);
70
+ break;
71
+ }
72
+ } catch (ex) {
73
+ // check next pic
71
74
  }
72
75
  }
73
76
  }
74
77
 
75
- if (!iconFileName) {
76
- this.adapter.log.warn(`No image for device model: ${device.definition.model} found!`);
78
+ if (!iconFound) {
79
+ this.adapter.log.warn(`Failed to download image for device model: ${device.definition.model} - ${device.definition.description}`);
77
80
  return '';
78
- }
79
-
80
- let icon;
81
- try {
81
+ } else {
82
82
  // Load image from the Meta-Store
83
- icon = await this.adapter.readFileAsync(this.adapter.namespace, iconFileName);
83
+ const icon = await this.adapter.readFileAsync(this.adapter.namespace, iconFileName);
84
84
  // Load Image Metadata
85
85
  const origIconMeta = await sharp(icon.file).metadata();
86
86
  // Check whether the image needs to be resized
87
87
  if (
88
88
  (origIconMeta.height && origIconMeta.height > imageSize) ||
89
- (origIconMeta.width && origIconMeta.width > imageSize)
89
+ (origIconMeta.width && origIconMeta.width > imageSize)
90
90
  ) {
91
91
  // Resize image to 28x28 pixel
92
92
  this.adapter.log.info(
@@ -103,12 +103,10 @@ class ImageController {
103
103
  // Replace the original image with the resize image.
104
104
  await this.adapter.writeFileAsync(this.adapter.namespace, iconFileName, icon.file);
105
105
  }
106
- } catch (error) {
107
- this.adapter.log.warn(error);
108
- return '';
106
+
107
+ // Create and output Base64
108
+ return `data:image/png;base64,${icon.file.toString('base64')}`;
109
109
  }
110
- // Create and output Base64
111
- return `data:image/png;base64,${icon.file.toString('base64')}`;
112
110
  }
113
111
  getFileNameWithExtension(url) {
114
112
  const path = new URL(url).pathname;
@@ -121,8 +119,10 @@ class ImageController {
121
119
  try {
122
120
  const res = await axios.get(url, { responseType: 'arraybuffer' });
123
121
  await adapter.writeFileAsync(namespace, this.getFileNameWithExtension(url), res.data);
122
+ return true;
124
123
  } catch (ex) {
125
- adapter.log.warn(ex);
124
+ //adapter.log.warn(ex);
125
+ return false;
126
126
  }
127
127
  }
128
128
  async getExistingIconFileName(z2mIconFileNameJPG, z2mIconFileNamePNG, slsIconFileName) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.zigbee2mqtt",
3
- "version": "3.0.5",
3
+ "version": "3.0.6",
4
4
  "description": "Zigbee2MQTT adapter for ioBroker",
5
5
  "author": {
6
6
  "name": "Dennis Rathjen and Arthur Rupp",