iobroker.zigbee2mqtt 3.0.8 → 3.0.10

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,16 @@ 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.10 (2025-12-07)
26
+ - (arteck) Dependencies have been updated
27
+ - (bluefox) Changed role of `color_temp_startup` state to `level` to avoid double `level.temperature` in one device
28
+ - (arteck) fix ZBMINIR2 inching DP
29
+ - (arteck) delete DP colortempstartup
30
+
31
+ ### 3.0.9 (2025-06-19)
32
+ - (bjoernbusch) queue up message parsing
33
+ - (dotcom84) Support for non-default MQTT base topics
34
+
25
35
  ### 3.0.8 (2025-06-08)
26
36
  - (arteck) fix device is deleted
27
37
  - (arteck) fix translation
@@ -1,6 +1,6 @@
1
1
  {
2
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:",
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:",
4
4
  "zigbee2mqtt adapter settings": "Adaptereinstellungen für Zigbee2MQTT",
5
5
  "Select and configure your Zigbee2MQTT connection": "Konfiguriere die Zigbee2MQTT anbindung",
6
6
  "Select connection to Zigbee2MQTT": "Zigbee2MQTT Verbindung auswählen",
@@ -11,6 +11,7 @@
11
11
  "Websocket IP-Address": "Websocket IP-Adresse",
12
12
  "Websocket Port": "Websocket Port",
13
13
  "Create a dummy MQTT-Server for Zigbee2MQTT": "Internen MQTT-Server für Zigbee2MQTT erstellen",
14
+ "Base MQTT topic": "MQTT Basis-Topic",
14
15
  "External MQTT-Server IP-Address": "IP-Adresse des externen MQTT-Servers",
15
16
  "External MQTT-Server Port": "Externer MQTT-Server Port",
16
17
  "MQTT-Server IP-Address bind": "MQTT-Server IP-Adresse binden",
@@ -46,7 +47,7 @@
46
47
  "Time of the automatic check": "Zeitpunkt der automatischen Prüfung",
47
48
  "More information": "Mehr Informationen",
48
49
  "Expert Settings. Please only use if you know what you're doing": "Expert Einstellungen. Bitte nur verwenden, wenn Du weisst was du machst",
49
- "Allways update state for occupancy when message arrives from zigbee2mqtt server (Only for true state). Increases load on ioBroker System" : "Aktualisiert immer den Status für die Bewegung, wenn eine Nachricht vom zigbee2mqtt-Server eintrifft (nur bei true). Erhöht die Last auf dem ioBroker",
50
- "Allways update available state when message included last_seen status": "Aktualisiert immer den available Status, wenn die Nachricht last_seen Status enthält"
50
+ "Always update state for occupancy when message arrives from zigbee2mqtt server (Only for true state). Increases load on ioBroker System" : "Aktualisiert immer den Status für die Bewegung, wenn eine Nachricht vom zigbee2mqtt-Server eintrifft (nur bei true). Erhöht die Last auf dem ioBroker",
51
+ "Always update available state when message included last_seen status": "Aktualisiert immer den available Status, wenn die Nachricht last_seen Status enthält"
51
52
 
52
53
  }
@@ -1,6 +1,6 @@
1
1
  {
2
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:",
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:",
4
4
  "zigbee2mqtt adapter settings": "Adapter settings for zigbee2mqtt",
5
5
  "Select and configure your Zigbee2MQTT connection": "Select and configure Zigbee2MQTT connection",
6
6
  "Select connection to Zigbee2MQTT": "Select connection to Zigbee2MQTT",
@@ -10,10 +10,11 @@
10
10
  "Configure your Zigbee2MQTT connection": "Configure your Zigbee2MQTT connection",
11
11
  "Websocket IP-Address": "Websocket IP-Address",
12
12
  "Websocket Port": "Websocket Port",
13
- "Use Auth-Token": "Use Auth-Token",
14
- "Auth-Token (special characters are not supported)": "Auth-Token (special characters are not supported)",
15
- "Create a dummy MQTT-Server for Zigbee2MQTT": "Create a dummy MQTT-Server for Zigbee2MQTT",
16
- "External MQTT-Server IP-Address": "External MQTT-Server IP-Address",
13
+ "Use Auth-Token": "Use Auth-Token",
14
+ "Auth-Token (special characters are not supported)": "Auth-Token (special characters are not supported)",
15
+ "Create a dummy MQTT-Server for Zigbee2MQTT": "Create a dummy MQTT-Server for Zigbee2MQTT",
16
+ "Base MQTT topic": "Base MQTT topic",
17
+ "External MQTT-Server IP-Address": "External MQTT-Server IP-Address",
17
18
  "External MQTT-Server Port": "External MQTT-Server Port",
18
19
  "MQTT-Server IP-Address bind": "MQTT-Server IP-Address bind",
19
20
  "MQTT-Server Port": "MQTT-Server Port",
@@ -46,6 +47,6 @@
46
47
  "Time of the automatic check": "Time of the automatic check",
47
48
  "More information": "More information",
48
49
  "Expert Settings. Please only use if you know what you're doing": "Expert Settings. Please only use if you know what you're doing",
49
- "Allways update state for occupancy when message arrives from zigbee2mqtt server (Only for true state). Increases load on ioBroker System" : "Allways update state for occupancy when message arrives from zigbee2mqtt server (Only for true state). Increases load on ioBroker System",
50
- "Allways update available state when message included last_seen status": "Allways update available state when message included last_seen status"
50
+ "Always update state for occupancy when message arrives from zigbee2mqtt server (Only for true state). Increases load on ioBroker System" : "Always update state for occupancy when message arrives from zigbee2mqtt server (Only for true state). Increases load on ioBroker System",
51
+ "Always update available state when message included last_seen status": "Always update available state when message included last_seen status"
51
52
  }
@@ -1,6 +1,6 @@
1
1
  {
2
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:",
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:",
4
4
  "zigbee2mqtt adapter settings": "Configuración del adaptador para zigbee2mqtt",
5
5
  "Select and configure your Zigbee2MQTT connection": "Seleccionar y configurar la conexión Zigbee2MQTT",
6
6
  "Select connection to Zigbee2MQTT": "Seleccionar conexión a Zigbee2MQTT",
@@ -13,6 +13,7 @@
13
13
  "Use Auth-Token": "Usar token de autenticación",
14
14
  "Auth-Token (special characters are not supported)": "Auth-Token (los caracteres especiales no son compatibles)",
15
15
  "Create a dummy MQTT-Server for Zigbee2MQTT": "Cree un servidor MQTT ficticio para Zigbee2MQTT",
16
+ "Base MQTT topic": "Tema base MQTT",
16
17
  "External MQTT-Server IP-Address": "Dirección IP del servidor MQTT externo",
17
18
  "External MQTT-Server Port": "Puerto de servidor MQTT externo",
18
19
  "MQTT-Server IP-Address bind": "Enlace de dirección IP del servidor MQTT",
@@ -1,6 +1,6 @@
1
1
  {
2
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 :",
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 :",
4
4
  "zigbee2mqtt adapter settings": "Paramètres de l'adaptateur pour zigbee2mqtt",
5
5
  "Select and configure your Zigbee2MQTT connection": "Sélectionnez et configurez la connexion Zigbee2MQTT",
6
6
  "Select connection to Zigbee2MQTT": "Sélectionnez la connexion à Zigbee2MQTT",
@@ -13,6 +13,7 @@
13
13
  "Use Auth-Token": "Utiliser le jeton d'authentification",
14
14
  "Auth-Token (special characters are not supported)": "Auth-Token (les caractères spéciaux ne sont pas pris en charge)",
15
15
  "Create a dummy MQTT-Server for Zigbee2MQTT": "Créer un serveur MQTT factice pour Zigbee2MQTT",
16
+ "Base MQTT topic": "Sujet MQTT de base",
16
17
  "External MQTT-Server IP-Address": "Adresse IP du serveur MQTT externe",
17
18
  "External MQTT-Server Port": "Port serveur MQTT externe",
18
19
  "MQTT-Server IP-Address bind": "Liaison d'adresse IP MQTT-Server",
@@ -45,5 +46,5 @@
45
46
  "With which log level should a negative search be logged?": "Avec quel niveau de journalisation une recherche négative doit-elle être enregistrée ?",
46
47
  "Time of the automatic check": "Heure du contrôle automatique",
47
48
  "More information": "Plus d'information",
48
- "Allways update available state when message included last_seen status": "Mettre à jour l'état disponible lorsque le message inclut le statut last_seen"
49
+ "Always update available state when message included last_seen status": "Mettre à jour l'état disponible lorsque le message inclut le statut last_seen"
49
50
  }
@@ -1,6 +1,6 @@
1
1
  {
2
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:",
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:",
4
4
  "zigbee2mqtt adapter settings": "Impostazioni dell'adattatore per zigbee2mqtt",
5
5
  "Select and configure your Zigbee2MQTT connection": "Seleziona e configura la connessione Zigbee2MQTT",
6
6
  "Select connection to Zigbee2MQTT": "Seleziona la connessione a Zigbee2MQTT",
@@ -13,6 +13,7 @@
13
13
  "Use Auth-Token": "Usa token di autenticazione",
14
14
  "Auth-Token (special characters are not supported)": "Auth-Token (i caratteri speciali non sono supportati)",
15
15
  "Create a dummy MQTT-Server for Zigbee2MQTT": "Crea un server MQTT fittizio per Zigbee2MQTT",
16
+ "Base MQTT topic": "Topic MQTT base",
16
17
  "External MQTT-Server IP-Address": "Indirizzo IP del server MQTT esterno",
17
18
  "External MQTT-Server Port": "Porta server MQTT esterna",
18
19
  "MQTT-Server IP-Address bind": "Binding dell'indirizzo IP del server MQTT",
@@ -45,5 +46,5 @@
45
46
  "With which log level should a negative search be logged?": "Con quale livello di registro deve essere registrata una ricerca negativa?",
46
47
  "Time of the automatic check": "Orario del controllo automatico",
47
48
  "More information": "Maggiori informazioni",
48
- "Allways update available state when message included last_seen status": "Aggiorna sempre lo stato disponibile quando il messaggio include lo stato last_seen"
49
+ "Always update available state when message included last_seen status": "Aggiorna sempre lo stato disponibile quando il messaggio include lo stato last_seen"
49
50
  }
@@ -1,6 +1,6 @@
1
1
  {
2
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:",
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:",
4
4
  "zigbee2mqtt adapter settings": "Adapterinstellingen voor zigbee2mqtt",
5
5
  "Select and configure your Zigbee2MQTT connection": "Selecteer en configureer de Zigbee2MQTT-verbinding",
6
6
  "Select connection to Zigbee2MQTT": "Selecteer verbinding met Zigbee2MQTT",
@@ -13,6 +13,7 @@
13
13
  "Use Auth-Token": "Gebruik Auth-Token",
14
14
  "Auth-Token (special characters are not supported)": "Auth-Token (speciale tekens worden niet ondersteund)",
15
15
  "Create a dummy MQTT-Server for Zigbee2MQTT": "Maak een dummy MQTT-server voor Zigbee2MQTT",
16
+ "Base MQTT topic": "Basis MQTT-topic",
16
17
  "External MQTT-Server IP-Address": "Extern MQTT-server IP-adres",
17
18
  "External MQTT-Server Port": "Externe MQTT-serverpoort",
18
19
  "MQTT-Server IP-Address bind": "MQTT-server IP-adres binding",
@@ -45,5 +46,5 @@
45
46
  "With which log level should a negative search be logged?": "Met welk logniveau moet een negatieve zoekopdracht worden geregistreerd?",
46
47
  "Time of the automatic check": "Tijdstip van de automatische controle",
47
48
  "More information": "Meer informatie",
48
- "Allways update available state when message included last_seen status": "Altijd de beschikbare status bijwerken wanneer het bericht de last_seen-status bevat"
49
+ "Always update available state when message included last_seen status": "Altijd de beschikbare status bijwerken wanneer het bericht de last_seen-status bevat"
49
50
  }
@@ -1,6 +1,6 @@
1
1
  {
2
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:",
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:",
4
4
  "zigbee2mqtt adapter settings": "Ustawienia adaptera dla zigbee2mqtt",
5
5
  "Select and configure your Zigbee2MQTT connection": "Wybierz i skonfiguruj połączenie Zigbee2MQTT",
6
6
  "Select connection to Zigbee2MQTT": "Wybierz połączenie z Zigbee2MQTT",
@@ -13,6 +13,7 @@
13
13
  "Use Auth-Token": "Użyj tokena uwierzytelniającego",
14
14
  "Auth-Token (special characters are not supported)": "Auth-Token (znaki specjalne nie są obsługiwane)",
15
15
  "Create a dummy MQTT-Server for Zigbee2MQTT": "Utwórz fikcyjny serwer MQTT dla Zigbee2MQTT",
16
+ "Base MQTT topic": "Podstawowy temat MQTT",
16
17
  "External MQTT-Server IP-Address": "Adres IP zewnętrznego serwera MQTT",
17
18
  "External MQTT-Server Port": "Zewnętrzny port serwera MQTT",
18
19
  "MQTT-Server IP-Address bind": "Powiązanie adresu IP serwera MQTT",
@@ -45,5 +46,5 @@
45
46
  "With which log level should a negative search be logged?": "Na jakim poziomie rejestrowania należy rejestrować wyszukiwanie wykluczające?",
46
47
  "Time of the automatic check": "Czas automatycznego sprawdzenia",
47
48
  "More information": "Więcej informacji",
48
- "Allways update available state when message included last_seen status": "Zawsze aktualizuj available stan, gdy wiadomość zawiera status last_seen"
49
+ "Always update available state when message included last_seen status": "Zawsze aktualizuj available stan, gdy wiadomość zawiera status last_seen"
49
50
  }
@@ -1,6 +1,6 @@
1
1
  {
2
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:",
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:",
4
4
  "zigbee2mqtt adapter settings": "Configurações do adaptador para zigbee2mqtt",
5
5
  "Select and configure your Zigbee2MQTT connection": "Selecione e configure a conexão Zigbee2MQTT",
6
6
  "Select connection to Zigbee2MQTT": "Selecione a conexão com Zigbee2MQTT",
@@ -13,6 +13,7 @@
13
13
  "Use Auth-Token": "Usar token de autenticação",
14
14
  "Auth-Token (special characters are not supported)": "Auth-Token (caracteres especiais não são suportados)",
15
15
  "Create a dummy MQTT-Server for Zigbee2MQTT": "Crie um servidor MQTT fictício para Zigbee2MQTT",
16
+ "Base MQTT topic": "Tópico MQTT base",
16
17
  "External MQTT-Server IP-Address": "Endereço IP do servidor MQTT externo",
17
18
  "External MQTT-Server Port": "Porta externa do servidor MQTT",
18
19
  "MQTT-Server IP-Address bind": "Vinculação de endereço IP do servidor MQTT",
@@ -45,5 +46,5 @@
45
46
  "With which log level should a negative search be logged?": "Com qual nível de log uma pesquisa negativa deve ser registrada?",
46
47
  "Time of the automatic check": "Hora da verificação automática",
47
48
  "More information": "Mais Informações",
48
- "Allways update available state when message included last_seen status": "Sempre atualize o estado disponível quando a mensagem incluir o status last_seen"
49
+ "Always update available state when message included last_seen status": "Sempre atualize o estado disponível quando a mensagem incluir o status last_seen"
49
50
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "click for Documentation": "нажмите для документации",
3
- "A detailed documentation with explanations and all further information can be found on this GitHub page:": "Подробная документация с объяснениями и всеми дальними информаций можно найти на этом GitHub-странице:",
3
+ "A detailed documentation with explanations and all further information can be found on this GitHub page": "Подробная документация с объяснениями и всеми дальними информаций можно найти на этом GitHub-странице:",
4
4
  "zigbee2mqtt adapter settings": "Настройки адаптера для zigbee2mqtt",
5
5
  "Select and configure your Zigbee2MQTT connection": "Выберите и настройте соединение Zigbee2MQTT",
6
6
  "Select connection to Zigbee2MQTT": "Выберите подключение к Zigbee2MQTT",
@@ -13,6 +13,7 @@
13
13
  "Use Auth-Token": "Использовать авторизационный токен",
14
14
  "Auth-Token (special characters are not supported)": "Auth-Token (специальные символы не поддерживаются)",
15
15
  "Create a dummy MQTT-Server for Zigbee2MQTT": "Создайте фиктивный MQTT-сервер для Zigbee2MQTT",
16
+ "Base MQTT topic": "Базовая тема MQTT",
16
17
  "External MQTT-Server IP-Address": "IP-адрес внешнего MQTT-сервера",
17
18
  "External MQTT-Server Port": "Порт внешнего MQTT-сервера",
18
19
  "MQTT-Server IP-Address bind": "Привязка IP-адреса MQTT-сервера",
@@ -45,5 +46,5 @@
45
46
  "With which log level should a negative search be logged?": "На каком уровне журнала следует регистрировать отрицательный поиск?",
46
47
  "Time of the automatic check": "Время автоматической проверки",
47
48
  "More information": "Больше информации",
48
- "Allways update available state when message included last_seen status": "Всегда обновляйте доступное состояние, когда сообщение включает статус last_seen"
49
+ "Always update available state when message included last_seen status": "Всегда обновляйте доступное состояние, когда сообщение включает статус last_seen"
49
50
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "click for Documentation": "натисніть для документації",
3
- "A detailed documentation with explanations and all further information can be found on this GitHub page:": "Детальна документація з поясненнями і всім більшою інформацією можна знайти на цій GitHub-сторінці:",
3
+ "A detailed documentation with explanations and all further information can be found on this GitHub page": "Детальна документація з поясненнями і всім більшою інформацією можна знайти на цій GitHub-сторінці:",
4
4
  "zigbee2mqtt adapter settings": "Налаштування адаптера для zigbee2mqtt",
5
5
  "Select and configure your Zigbee2MQTT connection": "Виберіть і налаштуйте підключення Zigbee2MQTT",
6
6
  "Select connection to Zigbee2MQTT": "Виберіть підключення до Zigbee2MQTT",
@@ -13,6 +13,7 @@
13
13
  "Use Auth-Token": "Використовуйте Auth-Token",
14
14
  "Auth-Token (special characters are not supported)": "Auth-Token (спеціальні символи не підтримуються)",
15
15
  "Create a dummy MQTT-Server for Zigbee2MQTT": "Створіть фіктивний MQTT-сервер для Zigbee2MQTT",
16
+ "Base MQTT topic": "Базова тема MQTT",
16
17
  "External MQTT-Server IP-Address": "IP-адреса зовнішнього MQTT-сервера",
17
18
  "External MQTT-Server Port": "Зовнішній порт MQTT-сервера",
18
19
  "MQTT-Server IP-Address bind": "Прив’язка IP-адреси MQTT-сервера",
@@ -45,5 +46,5 @@
45
46
  "With which log level should a negative search be logged?": "На якому рівні журналу слід реєструвати негативний пошук?",
46
47
  "Time of the automatic check": "Час автоматичної перевірки",
47
48
  "More information": "Більше інформації",
48
- "Allways update available state when message included last_seen status": "Завжди оновлюйте доступний стан, коли повідомлення містить статус last_seen"
49
+ "Always update available state when message included last_seen status": "Завжди оновлюйте доступний стан, коли повідомлення містить статус last_seen"
49
50
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "click for Documentation": "点击查看文档",
3
- "A detailed documentation with explanations and all further information can be found on this GitHub page:": "详细的文档和所有其他信息可在此 GitHub 页面找到:",
3
+ "A detailed documentation with explanations and all further information can be found on this GitHub page": "详细的文档和所有其他信息可在此 GitHub 页面找到:",
4
4
  "zigbee2mqtt adapter settings": "zigbee2mqtt 适配器设置",
5
5
  "Select and configure your Zigbee2MQTT connection": "选择并配置您的 Zigbee2MQTT 连接",
6
6
  "Select connection to Zigbee2MQTT": "选择 Zigbee2MQTT 连接",
@@ -13,6 +13,7 @@
13
13
  "Use Auth-Token": "使用认证令牌",
14
14
  "Auth-Token (special characters are not supported)": "认证令牌(不支持特殊字符)",
15
15
  "Create a dummy MQTT-Server for Zigbee2MQTT": "为 Zigbee2MQTT 创建虚拟 MQTT 服务器",
16
+ "Base MQTT topic": "MQTT 基础主题",
16
17
  "External MQTT-Server IP-Address": "外部 MQTT 服务器 IP 地址",
17
18
  "External MQTT-Server Port": "外部 MQTT 服务器端口",
18
19
  "MQTT-Server IP-Address bind": "MQTT 服务器绑定的 IP 地址",
@@ -46,6 +47,6 @@
46
47
  "Time of the automatic check": "自动检查时间",
47
48
  "More information": "更多信息",
48
49
  "Expert Settings. Please only use if you know what you're doing": "专家设置。请仅在您清楚操作的情况下使用",
49
- "Allways update state for occupancy when message arrives from zigbee2mqtt server (Only for true state). Increases load on ioBroker System": "当来自 zigbee2mqtt 服务器的消息到达时始终更新占用状态(仅限为 true 的状态)。会增加 ioBroker 系统负载",
50
- "Allways update available state when message included last_seen status": "当消息包含 last_seen 状态时始终更新可用状态"
50
+ "Always update state for occupancy when message arrives from zigbee2mqtt server (Only for true state). Increases load on ioBroker System": "当来自 zigbee2mqtt 服务器的消息到达时始终更新占用状态(仅限为 true 的状态)。会增加 ioBroker 系统负载",
51
+ "Always update available state when message included last_seen status": "当消息包含 last_seen 状态时始终更新可用状态"
51
52
  }
@@ -72,6 +72,17 @@
72
72
  ],
73
73
  "newLine": true
74
74
  },
75
+ "baseTopic": {
76
+ "type": "text",
77
+ "label": "Base MQTT topic",
78
+ "xs": 12,
79
+ "sm": 12,
80
+ "md": 6,
81
+ "lg": 4,
82
+ "xl": 4,
83
+ "default": "zigbee2mqtt",
84
+ "hidden": "data.connectionType != 'exmqtt'"
85
+ },
75
86
  "spacer01": {
76
87
  "type": "staticText",
77
88
  "text": "",
@@ -250,6 +261,11 @@
250
261
  "spacer02": {
251
262
  "type": "staticText",
252
263
  "text": "",
264
+ "xs": 12,
265
+ "sm": 12,
266
+ "md": 6,
267
+ "lg": 4,
268
+ "xl": 4,
253
269
  "newLine": true,
254
270
  "hidden": "data.connectionType == 'ws'"
255
271
  },
@@ -516,13 +532,18 @@
516
532
  "spacer04": {
517
533
  "type": "staticText",
518
534
  "text": "",
535
+ "xs": 12,
536
+ "sm": 12,
537
+ "md": 12,
538
+ "lg": 12,
539
+ "xl": 12,
519
540
  "newLine": true,
520
541
  "hidden": "data.coordinatorCheck != true"
521
542
  },
522
543
 
523
544
  "allwaysUpdateOccupancyState": {
524
545
  "type": "checkbox",
525
- "label": "Allways update state for occupancy when message arrives from zigbee2mqtt server (Only for true state). Increases load on ioBroker System",
546
+ "label": "Always update state for occupancy when message arrives from zigbee2mqtt server (Only for true state). Increases load on ioBroker System",
526
547
  "xs": 12,
527
548
  "sm": 12,
528
549
  "md": 12,
@@ -532,7 +553,7 @@
532
553
  },
533
554
  "allwaysUpdateAvailableState": {
534
555
  "type": "checkbox",
535
- "label": "Allways update available state when message included last_seen status",
556
+ "label": "Always update available state when message included last_seen status",
536
557
  "xs": 12,
537
558
  "sm": 12,
538
559
  "md": 12,
package/io-package.json CHANGED
@@ -1,8 +1,34 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "zigbee2mqtt",
4
- "version": "3.0.8",
4
+ "version": "3.0.10",
5
5
  "news": {
6
+ "3.0.10": {
7
+ "en": "Dependencies have been updated\nChanged role of `color_temp_startup` state to `level` to avoid double `level.temperature` in one device\nfix ZBMINIR2 inching DP\ndelete DP colortempstartup",
8
+ "de": "Abhängigkeiten wurden aktualisiert\nÄnderung der Rolle von `color_temp_startup` Zustand auf `level`, um Doppel `level.temperature` in einem Gerät zu vermeiden\nzBMINIR2 Inch DP reparieren\nlöschen DP colortempstartup",
9
+ "ru": "Зависимости были обновлены\nИзменилась роль состояния «color_temp_startup» до «level», чтобы избежать двойной «level.temperature» в одном устройстве\nzBMINIR2 Inching DP\nудалить DP colortempstartup",
10
+ "pt": "As dependências foram atualizadas\nPapel alterado do estado de `color_temp_startup` para `level` para evitar o duplo `level.temperature` em um dispositivo\ncorrigir ZBMINIR2 nching DP\napagar DP colortempstartup",
11
+ "nl": "Afhankelijkheden zijn bijgewerkt\nVeranderde rol van Color_temp_startup\nfix ZBMINIR2 inching DP\nverwijderen DP colortempstartup",
12
+ "fr": "Les dépendances ont été actualisées\nChangement du rôle de l'état `color_temp_startup` à `level` pour éviter le double `level.temperature` dans un seul appareil\ncorrection de l'encoche ZBMINIR2 DP\nsupprimer DP colortempstartup",
13
+ "it": "Le dipendenze sono state aggiornate\nCambiato ruolo di `color_temp_startup` stato a `level` per evitare doppio `level.temperature` in un dispositivo\ncorrezione ZBMINIR2 inching DP\neliminare DP colortempstartup",
14
+ "es": "Se han actualizado las dependencias\nCambiar el papel de `color_temp_startup` estado a `nivel` para evitar el doble `nivel.temperatura` en un dispositivo\nfijar ZBMINIR2 inching DP\neliminar DP colortempstartup",
15
+ "pl": "Zaktualizowano zależności\nZmieniona rola 'color _ temp _ startup' stanu na 'poziom', aby uniknąć podwójnego 'level.temperature' w jednym urządzeniu\nfix ZBMINIR2 inching DP\nusuń odtwarzacz kolorów DP",
16
+ "uk": "Залежність було оновлено\nЗмінена роль `color_temp_startup` для `level`, щоб уникнути подвійного рівня `level. Температура` в одному пристрої\nзафіксувати ZBMINIR2 інвертор ДП\nвидалити DP Colortempstartup",
17
+ "zh-cn": "依赖关系已更新\n将“color_temp_startup”状态的作用改为“level”,以避免一个设备中的双“level.teperature”\n修补 ZBMINIR2 插入 DP\n删除 DP 调色符启动"
18
+ },
19
+ "3.0.9": {
20
+ "en": "queue up message parsing\nSupport for non-default MQTT base topics",
21
+ "de": "nachrichtenparsing löschen\nUnterstützung für nicht-Standard-MQTT-Basisthemen",
22
+ "ru": "очередь сообщения парсинг\nПоддержка базовых тем MQTT без по умолчанию",
23
+ "pt": "processamento de mensagens em fila\nSuporte para tópicos de base MQTT não padrão",
24
+ "nl": "wachtrij bericht ontleden\nOndersteuning voor niet-standaard MQTT-basisonderwerpen",
25
+ "fr": "analyse des messages en attente\nPrise en charge des sujets de base MQTT non par défaut",
26
+ "it": "code up messaggio parsing\nSupporto per argomenti di base MQTT non di default",
27
+ "es": "mensaje de búsqueda\nApoyo a los temas básicos de MQTT no predeterminados",
28
+ "pl": "kolejka w górę wiadomości parsing\nWsparcie dla niedomyślnych tematów bazowych MQTT",
29
+ "uk": "чергування повідомлень\nПідтримка нерозголошення MQTT базових тем",
30
+ "zh-cn": "排队分析信件\n支持非默认 MQTT 基础主题"
31
+ },
6
32
  "3.0.8": {
7
33
  "en": "fix device is deleted\nfix translation",
8
34
  "de": "fix device wird gelöscht\nbersetzung",
@@ -67,32 +93,6 @@
67
93
  "pl": "aktualizacja admin",
68
94
  "uk": "оновлення адмін",
69
95
  "zh-cn": "更新管理员"
70
- },
71
- "3.0.3": {
72
- "en": "corr illuminance (del illuminance_raw)\nindicator.alarm.flood",
73
- "de": "korr illuminance (del illuminance_raw)\nindikator.alarm.flood",
74
- "ru": "коррозионная иллюминация (подлинный рисунок)\nindicator.alarm.flood",
75
- "pt": "illuminance de corr (del illuminance_raw)\nindicador.alarm.flood",
76
- "nl": "verlichtingssterkte (del verlichtingssterkte_raw)\nindicator.alarm.vloed",
77
- "fr": "illuminance du corr (del illuminance_raw)\nindicateur.alarme.inondation",
78
- "it": "illuminazione corr (del illuminance_raw)\nindicatore.alarm.flood",
79
- "es": "iluminancia del corr (iluminación del dedo_raw)\nindicador.alarm.flood",
80
- "pl": "krzak świetlny (del luminance _ raw)\nindicator.alarm.powódź",
81
- "uk": "апошні\nіндикатор.alarm.flood",
82
- "zh-cn": "corr 灯光( del 灯光_ raw)\n指标. alarm.flood"
83
- },
84
- "3.0.2": {
85
- "en": "corr WebSocket connection",
86
- "de": "korr WebSocket Verbindung",
87
- "ru": "гофровое соединение WebSocket",
88
- "pt": "conexão da WebSocket",
89
- "nl": "corr WebSocket-verbinding",
90
- "fr": "corr Connexion WebSocket",
91
- "it": "collegamento corr WebSocket",
92
- "es": "corr WebSocket connection",
93
- "pl": "połączenie corr WebSocket",
94
- "uk": "корр WebSocket підключення",
95
- "zh-cn": "corr WebSocket 连接"
96
96
  }
97
97
  },
98
98
  "messages": [
@@ -238,6 +238,7 @@
238
238
  "wsTokenEnabled": false,
239
239
  "wsToken": "",
240
240
  "dummyMqtt": false,
241
+ "baseTopic": "zigbee2mqtt",
241
242
  "externalMqttServerIP": "",
242
243
  "externalMqttServerPort": 1883,
243
244
  "externalMqttServerCredentials": false,
package/lib/exposes.js CHANGED
@@ -269,9 +269,7 @@ async function createDeviceFromExposes(devicesMessag, adapter) {
269
269
  // as we have new state, responsible for set, we have to use new `isOption`
270
270
  // or remove it
271
271
  if (
272
- (!state.hasOwnProperty('isOption') || state.isOptions === false) &&
273
- states[stateExists].hasOwnProperty('isOption')
274
- ) {
272
+ (!state.hasOwnProperty('isOption') || state.isOption === false) && states[stateExists].hasOwnProperty('isOption')) {
275
273
  delete states[stateExists].isOption;
276
274
  } else {
277
275
  states[stateExists].isOption = state.isOption;
@@ -442,17 +440,17 @@ async function createDeviceFromExposes(devicesMessag, adapter) {
442
440
  read: true,
443
441
  type: 'number',
444
442
  min:
445
- config.useKelvin == true
446
- ? utils.miredKelvinConversion(prop.value_max)
447
- : prop.value_min,
443
+ config.useKelvin == true
444
+ ? utils.miredKelvinConversion(prop.value_max)
445
+ : prop.value_min,
448
446
  max:
449
- config.useKelvin == true
450
- ? utils.miredKelvinConversion(prop.value_min)
451
- : prop.value_max,
447
+ config.useKelvin == true
448
+ ? utils.miredKelvinConversion(prop.value_min)
449
+ : prop.value_max,
452
450
  def:
453
- config.useKelvin == true
454
- ? utils.miredKelvinConversion(prop.value_min)
455
- : prop.value_max,
451
+ config.useKelvin == true
452
+ ? utils.miredKelvinConversion(prop.value_min)
453
+ : prop.value_max,
456
454
  unit: config.useKelvin == true ? 'K' : 'mired',
457
455
  setter: (value) => {
458
456
  return utils.toMired(value);
@@ -490,21 +488,21 @@ async function createDeviceFromExposes(devicesMessag, adapter) {
490
488
  break;
491
489
  }
492
490
  case 'color_temp_startup': {
493
- const stateName = expose.endpoint
494
- ? `colortempstartup_${expose.endpoint}`
495
- : 'colortempstartup';
491
+ //const stateName = expose.endpoint
492
+ // ? `colortempstartup_${expose.endpoint}`
493
+ // : 'colortempstartup';
496
494
  const propName = expose.endpoint
497
495
  ? `color_temp_startup_${expose.endpoint}`
498
496
  : 'color_temp_startup';
499
497
  //const colorMode = expose.endpoint ? `color_mode_${expose.endpoint}` : 'color_mode';
500
498
  pushToStates(
501
499
  {
502
- id: stateName,
500
+ id: propName,
503
501
  prop: propName,
504
502
  name: `${prop.description} ${expose.endpoint ? `(${expose.endpoint})` : ''}`.trim(),
505
503
  //options: ['transition'],
506
504
  icon: undefined,
507
- role: 'level.color.temperature',
505
+ role: 'level', // Changed role to level to avoid double level.temperature in one device
508
506
  write: true,
509
507
  read: true,
510
508
  type: 'number',
@@ -560,8 +558,8 @@ async function createDeviceFromExposes(devicesMessag, adapter) {
560
558
  }
561
559
  if (
562
560
  payload[stateName] &&
563
- payload[stateName].hasOwnProperty('x') &&
564
- payload[stateName].hasOwnProperty('y')
561
+ payload[stateName].hasOwnProperty('x') &&
562
+ payload[stateName].hasOwnProperty('y')
565
563
  ) {
566
564
  const colorval = rgb.cie_to_rgb(
567
565
  payload[stateName].x,
@@ -569,9 +567,9 @@ async function createDeviceFromExposes(devicesMessag, adapter) {
569
567
  );
570
568
  return (
571
569
  '#' +
572
- utils.decimalToHex(colorval[0]) +
573
- utils.decimalToHex(colorval[1]) +
574
- utils.decimalToHex(colorval[2])
570
+ utils.decimalToHex(colorval[0]) +
571
+ utils.decimalToHex(colorval[1]) +
572
+ utils.decimalToHex(colorval[2])
575
573
  );
576
574
  } else {
577
575
  return undefined;
@@ -1238,48 +1236,27 @@ async function createDeviceFromExposes(devicesMessag, adapter) {
1238
1236
  }
1239
1237
  break;
1240
1238
 
1241
- case 'composite':
1239
+ case 'composite': {
1240
+ const options = [];
1242
1241
  for (const prop of expose.features) {
1243
- // let state;
1244
- // if (prop.type == 'list' && prop.features) {
1245
- // const listName = prop.name;
1246
-
1247
- // for (const feature of prop.features) {
1248
- // genState(feature, 'state', `${listName}_${feature.name}`, prop.description);
1249
- // }
1250
- // }
1242
+ prop.type = 'text'; // to avoid problems with numbers, booleans, etc.
1251
1243
 
1252
1244
  const state = genState(prop);
1253
1245
  // Workaround for FP1 new state (region_upsert)
1254
1246
  if (!state) {
1255
1247
  break;
1256
1248
  }
1257
- state.prop = expose.property;
1258
- state.inOptions = true;
1259
- // I'm not fully sure, as it really needed, but
1260
- state.setterOpt = (value, options) => {
1261
- const result = {};
1262
- options[prop.property] = value;
1263
- result[expose.property] = options;
1264
- return result;
1265
- };
1266
- // if we have a composite expose, the value have to be an object {expose.property : {prop.property: value}}
1267
- if (prop.access & z2mAccess.SET) {
1268
- state.setter = (value, options) => {
1269
- const result = {};
1270
- options[prop.property] = value;
1271
- result[expose.property] = options;
1272
- return result;
1273
- };
1274
- state.setattr = expose.property;
1275
- }
1276
- // if we have a composite expose, the payload will be an object {expose.property : {prop.property: value}}
1277
- if (prop.access & z2mAccess.STATE) {
1249
+
1250
+ state.prop = expose.property;
1251
+ state.inOptions = true;
1252
+ state.isOption = true;
1253
+
1254
+ if (expose.access & z2mAccess.STATE) {
1278
1255
  state.getter = (payload) => {
1279
1256
  if (
1280
1257
  payload.hasOwnProperty(expose.property) &&
1281
- payload[expose.property] !== null &&
1282
- payload[expose.property].hasOwnProperty(prop.property)
1258
+ payload[expose.property] !== null &&
1259
+ payload[expose.property].hasOwnProperty(prop.property)
1283
1260
  ) {
1284
1261
  return !isNaN(payload[expose.property][prop.property])
1285
1262
  ? payload[expose.property][prop.property]
@@ -1289,13 +1266,16 @@ async function createDeviceFromExposes(devicesMessag, adapter) {
1289
1266
  }
1290
1267
  };
1291
1268
  } else {
1292
- state.getter = (_payload) => {
1293
- return undefined;
1269
+ state.getter = (payload) => {
1270
+ return payload[expose.property][prop.property];
1294
1271
  };
1295
1272
  }
1296
- pushToStates(state, prop.access);
1273
+
1274
+ pushToStates(state, z2mAccess.STATE);
1297
1275
  }
1276
+
1298
1277
  break;
1278
+ }
1299
1279
  default:
1300
1280
  console.log(`Unhandled expose type ${expose.type} for device ${deviceID}`);
1301
1281
  }
package/main.js CHANGED
@@ -32,6 +32,8 @@ let z2mController;
32
32
  let websocketController;
33
33
  let mqttServerController;
34
34
 
35
+ let messageParseMutex = Promise.resolve();
36
+
35
37
  class Zigbee2mqtt extends core.Adapter {
36
38
  constructor(options) {
37
39
  super({
@@ -129,7 +131,7 @@ class Zigbee2mqtt extends core.Adapter {
129
131
  );
130
132
  });
131
133
 
132
- mqttClient.subscribe('zigbee2mqtt/#');
134
+ mqttClient.subscribe(`${this.config.baseTopic}/#`);
133
135
 
134
136
  mqttClient.on('message', (topic, payload) => {
135
137
  const newMessage = `{"payload":${payload.toString() == '' ? '"null"' : payload.toString()},"topic":"${topic.slice(topic.search('/') + 1)}"}`;
@@ -177,107 +179,118 @@ class Zigbee2mqtt extends core.Adapter {
177
179
  }
178
180
 
179
181
  async messageParse(message) {
180
- // If the MQTT output type is set to attribute_and_json, the non-valid JSON must be checked here.
181
- if (utils.isJson(message) == false) {
182
- return;
183
- }
182
+ // Mutex lock: queue up calls to messageParse
183
+ let release;
184
+ const lock = new Promise((resolve) => (release = resolve));
185
+ const prev = messageParseMutex;
186
+ messageParseMutex = lock;
187
+ await prev;
188
+ try {
189
+ // If the MQTT output type is set to attribute_and_json, the non-valid JSON must be checked here.
190
+ if (utils.isJson(message) == false) {
191
+ return;
192
+ }
184
193
 
185
- const messageObj = JSON.parse(message);
194
+ const messageObj = JSON.parse(message);
186
195
 
187
- switch (messageObj.topic) {
188
- case 'bridge/config':
189
- break;
190
- case 'bridge/info':
191
- if (showInfo) {
192
- zigbee2mqttInfo(messageObj.payload, this.log);
193
- checkConfig(messageObj.payload.config, this.log, messageObj.payload.version);
194
- showInfo = false;
195
- }
196
- break;
197
- case 'bridge/state':
198
- if (messageObj.payload.state != 'online') {
199
- statesController.setAllAvailableToFalse();
200
- }
201
- this.setStateChanged('info.connection', messageObj.payload.state == 'online', true);
202
- break;
203
- case 'bridge/devices':
204
- await deviceController.createDeviceDefinitions(messageObj.payload);
205
- await deviceController.createOrUpdateDevices();
206
- await deviceController.checkAndProgressDeviceRemove();
207
- await statesController.subscribeWritableStates();
208
- statesController.processQueue();
209
- break;
210
- case 'bridge/groups':
211
- await deviceController.createGroupDefinitions(messageObj.payload);
212
- await deviceController.createOrUpdateDevices();
213
- await statesController.subscribeWritableStates();
214
- statesController.processQueue();
215
- break;
216
- case 'bridge/event':
217
- break;
218
- case 'bridge/response/coordinator_check':
219
- deviceController.processCoordinatorCheck(messageObj.payload);
220
- break;
221
- case 'bridge/response/device/remove':
222
- break;
223
- case 'bridge/response/device/options':
224
- break;
225
- case 'bridge/response/permit_join':
226
- break;
227
- case 'bridge/extensions':
228
- break;
229
- case 'bridge/logging':
230
- if (this.config.proxyZ2MLogs == true) {
231
- z2mController.proxyZ2MLogs(messageObj);
232
- }
233
- break;
234
- case 'bridge/response/device/configure':
235
- break;
236
- case 'bridge/response/device/rename':
237
- await deviceController.renameDeviceInCache(messageObj);
238
- await deviceController.createOrUpdateDevices();
239
- statesController.processQueue();
240
- break;
241
- case 'bridge/response/networkmap':
242
- break;
243
- case 'bridge/response/touchlink/scan':
244
- break;
245
- case 'bridge/response/touchlink/identify':
246
- break;
247
- case 'bridge/response/touchlink/factory_reset':
248
- break;
249
- default:
250
- {
251
- // is the payload an availability status?
252
- if (messageObj.topic.endsWith('/availability')) {
253
- // If an availability message for an old device ID comes with a payload of NULL, this is the indicator that a device has been unnamed.
254
- if (messageObj.payload == 'null') {
255
- return;
256
- }
257
- // is it a viable payload?
258
- if (messageObj.payload && messageObj.payload.state) {
259
- // {"payload":{"state":"online"},"topic":"FL.Licht.Links/availability"} ----> {"payload":{"available":true},"topic":"FL.Licht.Links"}
260
- const newMessage = {
261
- payload: { available: messageObj.payload.state == 'online' },
262
- topic: messageObj.topic.replace('/availability', ''),
263
- };
264
- statesController.processDeviceMessage(newMessage);
265
- }
266
- // States
267
- } else {
268
- // With the MQTT output type attribute_and_json, primitive payloads arrive here that must be discarded.
269
- if (utils.isObject(messageObj.payload) == false) {
270
- return;
271
- }
272
- // If MQTT is used, I have to filter the self-sent 'set' commands.
273
- if (messageObj.topic.endsWith('/set')) {
274
- return;
196
+ switch (messageObj.topic) {
197
+ case 'bridge/config':
198
+ break;
199
+ case 'bridge/info':
200
+ if (showInfo) {
201
+ zigbee2mqttInfo(messageObj.payload, this.log);
202
+ checkConfig(messageObj.payload.config, this.log, messageObj.payload.version);
203
+ showInfo = false;
204
+ }
205
+ break;
206
+ case 'bridge/state':
207
+ if (messageObj.payload.state != 'online') {
208
+ statesController.setAllAvailableToFalse();
209
+ }
210
+ this.setStateChanged('info.connection', messageObj.payload.state == 'online', true);
211
+ break;
212
+ case 'bridge/devices':
213
+ await deviceController.createDeviceDefinitions(messageObj.payload);
214
+ await deviceController.createOrUpdateDevices();
215
+ await deviceController.checkAndProgressDeviceRemove();
216
+ await statesController.subscribeWritableStates();
217
+ statesController.processQueue();
218
+ break;
219
+ case 'bridge/groups':
220
+ await deviceController.createGroupDefinitions(messageObj.payload);
221
+ await deviceController.createOrUpdateDevices();
222
+ await statesController.subscribeWritableStates();
223
+ statesController.processQueue();
224
+ break;
225
+ case 'bridge/event':
226
+ break;
227
+ case 'bridge/response/coordinator_check':
228
+ deviceController.processCoordinatorCheck(messageObj.payload);
229
+ break;
230
+ case 'bridge/response/device/remove':
231
+ break;
232
+ case 'bridge/response/device/options':
233
+ break;
234
+ case 'bridge/response/permit_join':
235
+ break;
236
+ case 'bridge/extensions':
237
+ break;
238
+ case 'bridge/logging':
239
+ if (this.config.proxyZ2MLogs == true) {
240
+ z2mController.proxyZ2MLogs(messageObj);
241
+ }
242
+ break;
243
+ case 'bridge/response/device/configure':
244
+ break;
245
+ case 'bridge/response/device/rename':
246
+ await deviceController.renameDeviceInCache(messageObj);
247
+ await deviceController.createOrUpdateDevices();
248
+ statesController.processQueue();
249
+ break;
250
+ case 'bridge/response/networkmap':
251
+ break;
252
+ case 'bridge/response/touchlink/scan':
253
+ break;
254
+ case 'bridge/response/touchlink/identify':
255
+ break;
256
+ case 'bridge/response/touchlink/factory_reset':
257
+ break;
258
+ default:
259
+ {
260
+ // is the payload an availability status?
261
+ if (messageObj.topic.endsWith('/availability')) {
262
+ // If an availability message for an old device ID comes with a payload of NULL, this is the indicator that a device has been unnamed.
263
+ if (messageObj.payload == 'null') {
264
+ return;
265
+ }
266
+ // is it a viable payload?
267
+ if (messageObj.payload && messageObj.payload.state) {
268
+ // {"payload":{"state":"online"},"topic":"FL.Licht.Links/availability"} ----> {"payload":{"available":true},"topic":"FL.Licht.Links"}
269
+ const newMessage = {
270
+ payload: { available: messageObj.payload.state == 'online' },
271
+ topic: messageObj.topic.replace('/availability', ''),
272
+ };
273
+
274
+ statesController.processDeviceMessage(newMessage);
275
+ }
276
+ // States
277
+ } else {
278
+ // With the MQTT output type attribute_and_json, primitive payloads arrive here that must be discarded.
279
+ if (utils.isObject(messageObj.payload) == false) {
280
+ return;
281
+ }
282
+ // If MQTT is used, I have to filter the self-sent 'set' commands.
283
+ if (messageObj.topic.endsWith('/set')) {
284
+ return;
285
+ }
286
+
287
+ statesController.processDeviceMessage(messageObj);
275
288
  }
276
-
277
- statesController.processDeviceMessage(messageObj);
278
289
  }
279
- }
280
- break;
290
+ break;
291
+ }
292
+ } finally {
293
+ release();
281
294
  }
282
295
  }
283
296
 
@@ -358,7 +371,7 @@ class Zigbee2mqtt extends core.Adapter {
358
371
  const message = (await z2mController.createZ2MMessage(id, state)) || { topic: '', payload: '' };
359
372
 
360
373
  if (['exmqtt', 'intmqtt'].includes(this.config.connectionType)) {
361
- mqttClient.publish(`zigbee2mqtt/${message.topic}`, JSON.stringify(message.payload));
374
+ mqttClient.publish(`${this.config.baseTopic}/${message.topic}`, JSON.stringify(message.payload));
362
375
  } else if (this.config.connectionType == 'ws') {
363
376
  websocketController.send(JSON.stringify(message));
364
377
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.zigbee2mqtt",
3
- "version": "3.0.8",
3
+ "version": "3.0.10",
4
4
  "description": "Zigbee2MQTT adapter for ioBroker",
5
5
  "author": {
6
6
  "name": "Dennis Rathjen and Arthur Rupp",
@@ -24,43 +24,32 @@
24
24
  "node": ">= 20"
25
25
  },
26
26
  "dependencies": {
27
- "@iobroker/adapter-core": "^3.2.3",
27
+ "@iobroker/adapter-core": "^3.3.2",
28
28
  "@iobroker/dm-utils": "^1.0.10",
29
29
  "aedes": "^0.51.3",
30
30
  "aedes-persistence-nedb": "^2.0.3",
31
- "mqtt": "^5.10.4",
31
+ "mqtt": "^5.14.1",
32
32
  "net": "^1.0.2",
33
33
  "node-schedule": "^2.1.1",
34
- "sharp": "^0.33.5",
35
- "ws": "^8.18.2"
34
+ "sharp": "^0.34.5",
35
+ "ws": "^8.18.3"
36
36
  },
37
37
  "devDependencies": {
38
- "@alcalzone/release-script": "^3.8.0",
39
- "@alcalzone/release-script-plugin-iobroker": "^3.7.0",
40
- "@alcalzone/release-script-plugin-license": "^3.7.0",
41
- "@alcalzone/release-script-plugin-manual-review": "^3.7.0",
42
- "@iobroker/adapter-dev": "^1.4.0",
43
- "@iobroker/testing": "^5.0.4",
44
- "@tsconfig/node14": "^14.1.3",
45
- "@types/chai": "^5.2.2",
46
- "@types/chai-as-promised": "^8.0.2",
47
- "@types/mocha": "^10.0.10",
48
- "@types/node": "^22.15.29",
49
- "@types/node-schedule": "^2.1.7",
50
- "@types/proxyquire": "^1.3.31",
51
- "@types/sinon": "^17.0.3",
52
- "@types/sinon-chai": "^4.0.0",
53
- "chai": "^5.2.0",
54
- "chai-as-promised": "^8.0.1",
55
- "eslint": "^9.25.1",
56
- "eslint-config-prettier": "^10.1.5",
57
- "eslint-plugin-prettier": "^5.2.3",
58
- "mocha": "^11.0.1",
59
- "prettier": "^3.5.3",
60
- "proxyquire": "^2.1.3",
61
- "sinon": "^19.0.2",
62
- "sinon-chai": "^4.0.0",
63
- "typescript": "~5.8.2"
38
+ "@alcalzone/release-script": "^5.0.0",
39
+ "@alcalzone/release-script-plugin-iobroker": "^4.0.0",
40
+ "@alcalzone/release-script-plugin-license": "^4.0.0",
41
+ "@alcalzone/release-script-plugin-manual-review": "^4.0.0",
42
+ "@iobroker/adapter-dev": "^1.5.0",
43
+ "@iobroker/testing": "^5.2.2",
44
+ "@iobroker/eslint-config": "^2.1.0",
45
+ "@tsconfig/node14": "^14.1.8",
46
+ "@types/node": "^24.10.1",
47
+ "@types/node-schedule": "^2.1.8",
48
+ "eslint": "^9.39.1",
49
+ "eslint-config-prettier": "^10.1.8",
50
+ "eslint-plugin-prettier": "^5.5.4",
51
+ "prettier": "^3.6.2",
52
+ "typescript": "~5.9.2"
64
53
  },
65
54
  "main": "main.js",
66
55
  "files": [