diff --git a/.github/workflows/dependabot-automerge.yml b/.github/workflows/dependabot-automerge.yml index 7ebd3105..165b8aed 100644 --- a/.github/workflows/dependabot-automerge.yml +++ b/.github/workflows/dependabot-automerge.yml @@ -8,6 +8,7 @@ on: jobs: auto-merge: + if: github.actor == 'dependabot[bot]' runs-on: ubuntu-latest steps: - name: Checkout code @@ -19,4 +20,4 @@ jobs: # This must be a personal access token with push access github-token: ${{ secrets.AUTO_MERGE_TOKEN }} # By default, squash and merge, so Github chooses nice commit messages - command: squash and merge \ No newline at end of file + command: squash and merge diff --git a/.github/workflows/test-and-release.yml b/.github/workflows/test-and-release.yml index 32e862c4..3c1bd454 100644 --- a/.github/workflows/test-and-release.yml +++ b/.github/workflows/test-and-release.yml @@ -4,15 +4,20 @@ name: Test and Release # as well as tags with a semantic version on: push: - branches: - - "*" + branches: + - "master" tags: # normal versions - "v[0-9]+.[0-9]+.[0-9]+" # pre-releases - "v[0-9]+.[0-9]+.[0-9]+-**" pull_request: {} - + +# Cancel previous PR/branch runs when a new commit is pushed +concurrency: + group: ${{ github.ref }} + cancel-in-progress: true + jobs: # Performs quick checks before the expensive test runs check-and-lint: @@ -22,23 +27,17 @@ jobs: strategy: matrix: - node-version: [14.x] + node-version: [16.x] + steps: - - name: Checkout code - uses: actions/checkout@v3 - - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + - uses: ioBroker/testing-action-check@v1 with: - node-version: ${{ matrix.node-version }} - - - name: Install Dependencies - run: npm i - - - name: Test package files - run: npm run test:package - + node-version: "16.x" + # Uncomment the following line if your adapter cannot be installed using 'npm ci' + # install-command: 'npm install' + lint: true + # Runs adapter tests on all supported node versions and OSes adapter-tests: if: contains(github.event.head_commit.message, '[skip ci]') == false @@ -48,46 +47,37 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - node-version: [14.x, 16.x, 18.x] - os: [ubuntu-latest, macos-latest] + node-version: [16.x, 18.x] + os: [ubuntu-latest, windows-latest, macos-latest] steps: - - name: Checkout code - uses: actions/checkout@v3 - - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + - uses: ioBroker/testing-action-adapter@v1 with: node-version: ${{ matrix.node-version }} + os: ${{ matrix.os }} + # Uncomment the following line if your adapter cannot be installed using 'npm ci' + # install-command: 'npm install' - - name: Install Dependencies - run: npm i - - - name: Run unit tests - run: npm run test:unit - - - name: Run integration tests (unix only) - if: startsWith(runner.OS, 'windows') == false - run: DEBUG=testing:* npm run test:integration - - - name: Run integration tests (windows only) - if: startsWith(runner.OS, 'windows') - run: set DEBUG=testing:* & npm run test:integration + # TODO: To enable automatic npm releases, create a token on npmjs.org + # Enter this token as a GitHub secret (with name NPM_TOKEN) in the repository options + # Then uncomment the following block: # Deploys the final package to NPM + # Deploys the final package to NPM and Github Actions deploy: - needs: [adapter-tests] - - # Trigger this step only when a commit on any branch is tagged with a version number + # Trigger this step only when a commit on master is tagged with a version number if: | contains(github.event.head_commit.message, '[skip ci]') == false && github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') + # Define which jobst must succeed before the release + needs: [adapter-tests] + runs-on: ubuntu-latest strategy: matrix: - node-version: [14.x] + node-version: [16.x] steps: - name: Checkout code @@ -119,31 +109,27 @@ jobs: npm config set //registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }} npm whoami npm publish - -# - name: Create Github Release -# uses: actions/create-release@v1 -# env: -# GITHUB_TOKEN: ${{ secrets.Github_Token}} -# with: -# tag_name: ${{ github.ref }} -# release_name: Release v${{ steps.extract_release.outputs.VERSION }} -# draft: false -# # Prerelease versions create prereleases on Github -# prerelease: ${{ contains(steps.extract_release.outputs.VERSION, '-') }} -# body: ${{ steps.extract_release.outputs.BODY }} -# -# - name: Notify Sentry.io about the release -# run: | -# npm i -g @sentry/cli -# export SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }} -# export SENTRY_URL=https://sentry.iobroker.net -# export SENTRY_ORG=iobroker -# export SENTRY_PROJECT=iobroker-zigbee -# export SENTRY_VERSION=iobroker.zigbee@${{ steps.extract_release.outputs.VERSION }} -# sentry-cli releases new $SENTRY_VERSION -# sentry-cli releases finalize $SENTRY_VERSION -# # Add the following line BEFORE finalize if repositories are connected in Sentry -# # sentry-cli releases set-commits $SENTRY_VERSION --auto -# -# # Add the following line BEFORE finalize if sourcemap uploads are needed -# # sentry-cli releases files $SENTRY_VERSION upload-sourcemaps build/ + # b) For monorepos managed with lerna (requires lerna to be installed globally) + #- name: Publish packages to npm + # run: | + # npm config set //registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }} + # npm whoami + # lerna publish from-package --yes + # c) For monorepos managed with yarn v3.1+ (no lerna) + #- name: Publish packages to npm + # run: | + # yarn config set npmAuthToken "${{ secrets.NPM_TOKEN }}" + # yarn npm whoami + # yarn workspaces foreach -vti --no-private npm publish --tolerate-republish + + - name: Create Github Release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }} + with: + tag_name: ${{ github.ref }} + release_name: Release v${{ steps.extract_release.outputs.VERSION }} + draft: false + # Prerelease versions create prereleases on Github + prerelease: ${{ contains(steps.extract_release.outputs.VERSION, '-') }} + body: ${{ steps.extract_release.outputs.BODY }} diff --git a/README.md b/README.md index c41a6715..52a4d019 100644 --- a/README.md +++ b/README.md @@ -26,9 +26,8 @@ Only CC26xx/cc1352/cc2538 Devices support extraction of the NVRam backup which s Current firmware files for these devices can be found [on GitHub](https://github.com/Koenkk/Z-Stack-firmware) - - + @@ -114,6 +113,12 @@ There are knowledge bases that can be useful for working with Zigbee-devices and Works with devices from this list https://github.com/ioBroker/ioBroker.zigbee/wiki/Supported-devices + +## More Informations +https://github.com/ioBroker/ioBroker.zigbee/wiki + + + ## Donate You can thank the authors by these links: @@ -134,11 +139,17 @@ You can thank the authors by these links: ## Changelog +### 1.8.13 +* (arteck) ota corr +* (arteck) devices are wrong with enum exposes +* (arteck) select field for groups is larger + +### 1.8.12 (2023-06-30) +* (arteck) new Documentation (thx Stefan) ### 1.8.11 (2022-12-10) * (arteck) fix compsite exposes with list - ### 1.8.10 (2022-12-12) * (asgothian) fix group access * (asgothian) add option for pairing code: diff --git a/admin/i18n/pl/translations.json b/admin/i18n/pl/translations.json index 56a5cbfa..887e82ab 100644 --- a/admin/i18n/pl/translations.json +++ b/admin/i18n/pl/translations.json @@ -5,7 +5,7 @@ "Binding": "połączenie", "Binding configuration": "Konfiguracja wiązania", "COM port name": "Nazwa portu COM", - "Cancel": "Anuluj", + "Cancel": "Pomiń", "Channel": "Kanał", "ChannelChangeText": "Kanał ustawia używaną częstotliwość radiową. Można go zmienić, aby uniknąć konfliktów z istniejącymi sieciami Wi-Fi. Podczas zmiany wszystkie urządzenia muszą zostać ponownie nauczone!", "Check firmware updates": "Sprawdź aktualizacje oprogramowania układowego", @@ -39,7 +39,7 @@ "Hide": "Ukryj", "Let's pairing!": "Wystartuj łączenie!", "Map view config": "Konfiguracja mapy", - "Name": "Imię", + "Name": "Nazwa", "Needs value": "Potrzebuje wartości", "Network map": "Mapa sieci", "Pairing process": "parowanie", @@ -83,12 +83,12 @@ "Touchlink reset and pairing": "Resetowanie i parowanie za pomocą Touchlink", "Transport Key Text": "Klucz transportowy to sieciowy klucz szyfrowania.", "Transport Key": "Klucz transportowy", - "Type": "Rodzaj", + "Type": "Typ", "Unbind remote from Coordinator (necessary for some remotes like HUE Dimmer Switch)": "Odłącz pilota od Coordinatora (niezbędny do niektórych pilotów, takich jak HUE Dimmer Switch)", "View config": "Wyświetl config", "Waiting": "Czekaj", "Write Attribute": "Napisz atrybut", - "Yes": "tak", + "Yes": "Tak", "You find good explanations what the settings mean": "Znajdziesz dobre wyjaśnienia, co oznaczają ustawienia", "Zigbee adapter": "Adapter Zigbee", "Zigbee-herdsman debug info": "Informacje debugowania Zigbee-Herdsman", diff --git a/admin/img/paumann_spot.png b/admin/img/paulmann_spot.png similarity index 100% rename from admin/img/paumann_spot.png rename to admin/img/paulmann_spot.png diff --git a/admin/index_m.html b/admin/index_m.html index db25fe58..584a8bbb 100644 --- a/admin/index_m.html +++ b/admin/index_m.html @@ -985,10 +985,10 @@

Config device

Main Endpoint

-
+
@@ -1003,7 +1003,7 @@

Config device

@@ -1018,7 +1018,7 @@

Config device

@@ -1033,7 +1033,7 @@

Config device

diff --git a/admin/tab_m.html b/admin/tab_m.html index b741c7f3..42673762 100644 --- a/admin/tab_m.html +++ b/admin/tab_m.html @@ -683,9 +683,9 @@

Config device

Main Endpoint

-
+
- +
@@ -698,7 +698,7 @@

Config device

- +
@@ -711,7 +711,7 @@

Config device

- +
@@ -724,7 +724,7 @@

Config device

- +
@@ -777,7 +777,7 @@

Edit Group

- +
diff --git a/admin/words.js b/admin/words.js index 6e8d6385..62b7b87b 100644 --- a/admin/words.js +++ b/admin/words.js @@ -8,7 +8,7 @@ systemDictionary = { "Binding": { "uk": "Прив'язка", "en": "Binding", "de": "Binding", "ru": "Привязка", "pt": "Ligação", "nl": "Verbindend", "fr": "Contraignant", "it": "Rilegatura", "es": "Unión", "pl": "połączenie", "zh-cn": "捆绑"}, "Binding configuration": { "uk": "Конфігурація привʼязки", "en": "Binding configuration", "de": "Binding konfiguration", "ru": "Конфигурация привязки", "pt": "Configuração de ligação", "nl": "Bindende configuratie", "fr": "Configuration de la liaison", "it": "Configurazione vincolante", "es": "Configuración de enlace", "pl": "Konfiguracja wiązania", "zh-cn": "绑定配置"}, "COM port name": { "uk": "Імʼя COM порта", "en": "COM port name", "de": "COM-Anschlussname", "ru": "Имя или адрес порта", "pt": "Nome da porta COM", "nl": "COM-poortnaam", "fr": "Nom du port COM", "it": "Nome della porta COM", "es": "Nombre del puerto COM", "pl": "Nazwa portu COM", "zh-cn": "设备端口"}, - "Cancel": { "uk": "Скасувати", "en": "Cancel", "de": "Abbrechen", "ru": "Отмена", "pt": "Cancelar", "nl": "Annuleren", "fr": "Annuler", "it": "Annulla", "es": "Cancelar", "pl": "Anuluj", "zh-cn": "取消"}, + "Cancel": { "uk": "Скасувати", "en": "Cancel", "de": "Abbrechen", "ru": "Отмена", "pt": "Cancelar", "nl": "Annuleren", "fr": "Annuler", "it": "Annulla", "es": "Cancelar", "pl": "Pomiń", "zh-cn": "取消"}, "Channel": { "uk": "Канал", "en": "Channel", "de": "Kanal", "ru": "Канал", "pt": "Canal", "nl": "Kanaal", "fr": "Canal", "it": "Canale", "es": "Canal", "pl": "Kanał", "zh-cn": "信道"}, "Check firmware updates": { "uk": "Перевірити оновлення прошивок пристроїв", "en": "Check firmware updates", "de": "Auf Firmware-Updates überprüfen", "ru": "Проверить обновления прошивки", "pt": "Verifique as atualizações de firmware", "nl": "Controleer firmware-updates", "fr": "Vérifier les mises à jour du firmware", "it": "Controlla gli aggiornamenti del firmware", "es": "Verifique las actualizaciones de firmware", "pl": "Sprawdź aktualizacje oprogramowania układowego", "zh-cn": "检查固件更新"}, "Choose channel": { "uk": "Виберіть канал", "en": "Choose channel", "de": "Kanal auswählen", "ru": "Выберите канал", "pt": "Escolha o canal", "nl": "Kies een kanaal", "fr": "Choisissez la chaîne", "it": "Scegli il canale", "es": "Elige canal", "pl": "Wybierz kanał", "zh-cn": "选择频道"}, @@ -38,7 +38,7 @@ systemDictionary = { "Hide": { "uk": "Сховати", "en": "Hide", "de": "Ausblenden", "ru": "Скрыть", "pt": "ocultar", "nl": "Verbergen", "fr": "Cacher", "it": "Nascondere", "es": "Esconder", "pl": "Ukryj", "zh-cn": "隐藏"}, "Let's pairing!": { "uk": "Запустити привʼязування пристроїв!", "en": "Let's start pairing!", "de": "Kopplung jetzt starten!", "ru": "Запуск сопряжения устройств!", "pt": "Vamos emparelhar!", "nl": "Laten we verbinding maken!", "fr": "Apparions !", "it": "Facciamo coppia!", "es": "Vamos a emparejar!", "pl": "Wystartuj łączenie!", "zh-cn": "开始配对!"}, "Map view config": { "uk": "Налаштування вигляду мапи", "en": "Map view config", "de": "Kartenansicht konfigurieren", "ru": "Настройки представления", "pt": "Map view config", "nl": "Map weergave configuratie", "fr": "Map view config", "it": "Map view config", "es": "Map view config", "pl": "Konfiguracja mapy", "zh-cn": "配置组网页面"}, - "Name": { "uk": "Імʼя", "en": "Name", "de": "Name", "ru": "Имя", "pt": "Nome", "nl": "Naam", "fr": "Nom", "it": "Nome", "es": "Nombre", "pl": "Imię", "zh-cn": "名称"}, + "Name": { "uk": "Імʼя", "en": "Name", "de": "Name", "ru": "Имя", "pt": "Nome", "nl": "Naam", "fr": "Nom", "it": "Nome", "es": "Nombre", "pl": "Nazwa", "zh-cn": "名称"}, "Needs value": { "uk": "Потребує значення", "en": "Needs value", "de": "Ein Wert wird benötigt", "ru": "Требуется значение", "pt": "Precisa de valor", "nl": "Heeft waarde nodig", "fr": "Besoin de valeur", "it": "Ha bisogno di valore", "es": "Necesita valor", "pl": "Potrzebuje wartości", "zh-cn": "需要价值"}, "Network map": { "uk": "Мапа мережі", "en": "Network map", "de": "Netzwerkkarte", "ru": "Карта сети", "pt": "Mapa de rede", "nl": "Netwerkkaart", "fr": "Carte du réseau", "it": "Mappa di rete", "es": "Mapa de red", "pl": "Mapa sieci", "zh-cn": "组网状态"}, "Pairing process": { "uk": "Процес привʼязування", "en": "Pairing process", "de": "Kopplungsfortschritt", "ru": "Процесс спаривания", "pt": "Processo de emparelhamento", "nl": "Koppelingsproces", "fr": "Processus d'appariement", "it": "Processo di accoppiamento", "es": "Proceso de emparejamiento", "pl": "parowanie", "zh-cn": "配对进度"}, @@ -79,12 +79,12 @@ systemDictionary = { "Target endpoint": { "uk": "Цільова кінцева точка", "en": "Target endpoint", "de": "Ziel-Endpunkt", "ru": "Целевая конечная точка", "pt": "Endpoint alvo", "nl": "Doel eindpunt", "fr": "Point de terminaison cible", "it": "Endpoint di destinazione", "es": "Punto final de destino", "pl": "Docelowy punkt końcowy", "zh-cn": "目标终点"}, "Touchlink reset and pairing": { "uk": "Скидання та сполучення Touchlink", "en": "Touchlink reset and pairing", "de": "Touchlink zurücksetzen und koppeln", "ru": "Сброс Touchlink и сопряжение", "pt": "Redefinição e pareamento do touchlink", "nl": "Touchlink resetten en koppelen", "fr": "Réinitialisation et couplage de Touchlink", "it": "Reimpostazione e associazione del touchlink", "es": "Restablecimiento y emparejamiento de Touchlink", "pl": "Resetowanie i parowanie za pomocą Touchlink", "zh-cn": "触摸链接重置和配对"}, "Transport Key": { "uk": "Транспортний ключ", "en": "Transport Key", "de": "Transportschlüssel", "ru": "Транспортный ключ", "pt": "Chave de transporte", "nl": "Transport sleutel", "fr": "Clé de transport", "it": "Chiave di trasporto", "es": "Transporte clave", "pl": "Klucz transportowy", "zh-cn": "运输钥匙"}, - "Type": { "uk": "Тип", "en": "Type", "de": "Typ", "ru": "Тип", "pt": "Tipo", "nl": "Type", "fr": "Type", "it": "genere", "es": "Tipo", "pl": "Rodzaj", "zh-cn": "类型"}, + "Type": { "uk": "Тип", "en": "Type", "de": "Typ", "ru": "Тип", "pt": "Tipo", "nl": "Type", "fr": "Type", "it": "genere", "es": "Tipo", "pl": "Typ", "zh-cn": "类型"}, "Unbind remote from Coordinator (necessary for some remotes like HUE Dimmer Switch)": {"uk": "Від’єднайте пульт від координатора (необхідно для деяких пультів, наприклад HUE Dimmer Switch)", "en": "Unbind remote from coordinator (necessary for some remotes like HUE Dimmer Switch)", "de": "Entkoppele die Fernbedienung vom Koordinator (erforderlich für einige Fernbedienungen wie HUE Dimmer Switch)", "ru": "Отсоедините пульт от координатора (необходим для некоторых пультов, таких как HUE Dimmer Switch)", "pt": "Desconecte o controle remoto do Coordinator (necessário para alguns controles remotos, como o HUE Dimmer Switch)", "nl": "Ontkoppel afstandsbediening van Coordinator (noodzakelijk voor sommige afstandsbedieningen zoals HUE Dimmer Switch)", "fr": "Dissocier la télécommande de coordination (nécessaire pour certaines télécommandes comme HUE Dimmer Switch)", "it": "Sblocca il telecomando da Coordinator (necessario per alcuni telecomandi come HUE Dimmer Switch)", "es": "Desvincule el control remoto del Coordinador (necesario para algunos controles remotos como HUE Dimmer Switch)", "pl": "Odłącz pilota od Coordinatora (niezbędny do niektórych pilotów, takich jak HUE Dimmer Switch)", "zh-cn": "从Coordinator取消绑定遥控器(对于某些遥控器,例如HUE Dimmer Switch,这是必需的)"}, "View config": { "uk": "Переглянути конфігурацію", "en": "View config", "de": "Konfiguration anzeigen", "ru": "Посмотреть конфигурацию", "pt": "Ver configuração", "nl": "Bekijk configuratie", "fr": "Afficher la configuration", "it": "Visualizza config", "es": "Ver configuración", "pl": "Wyświetl config", "zh-cn": "查看配置"}, "Waiting": { "uk": "Очікування", "en": "Waiting", "de": "Warten", "ru": "Ожидание", "pt": "Esperando", "nl": "Wachtende", "fr": "Attendre", "it": "In attesa", "es": "Esperando", "pl": "Czekaj", "zh-cn": "等候"}, "Write Attribute": { "uk": "Записати атрибут", "en": "Write attribute", "de": "Attribut schreiben", "ru": "Запись атрибута", "pt": "Gravar Atributo", "nl": "Schrijf attribuut", "fr": "Ecrire attribut", "it": "Scrivi attributo", "es": "Escribir atributo", "pl": "Napisz atrybut", "zh-cn": "写属性"}, - "Yes": { "uk": "Так", "en": "Yes", "de": "Ja", "ru": "Да", "pt": "sim", "nl": "Ja", "fr": "Oui", "it": "sì", "es": "Sí", "pl": "tak", "zh-cn": "是"}, + "Yes": { "uk": "Так", "en": "Yes", "de": "Ja", "ru": "Да", "pt": "sim", "nl": "Ja", "fr": "Oui", "it": "sì", "es": "Sí", "pl": "Tak", "zh-cn": "是"}, "You find good explanations what the settings mean": {"uk": "Ви знайдете хороші пояснення значення налаштувань", "en": "You find good explanations what the settings mean", "de": "Sie finden gute Erklärungen, was die Einstellungen bedeuten", "ru": "Вы найдете хорошие объяснения, что означают настройки", "pt": "Você encontra boas explicações sobre o significado das configurações", "nl": "U vindt een goede uitleg wat de instellingen betekenen", "fr": "Vous trouvez de bonnes explications sur ce que signifient les paramètres", "it": "Trovi buone spiegazioni sul significato delle impostazioni", "es": "Encuentra buenas explicaciones de lo que significa la configuración", "pl": "Znajdziesz dobre wyjaśnienia, co oznaczają ustawienia", "zh-cn": "您会找到很好的解释,这些设置意味着什么"}, "Zigbee adapter": { "uk": "Адаптер Zigbee", "en": "Zigbee adapter", "de": "Zigbee-Adapter", "ru": "Zigbee адаптер", "pt": "Adaptador Zigbee", "nl": "Zigbee-adapter", "fr": "Adaptateur Zigbee", "it": "Adattatore Zigbee", "es": "Adaptador zigbee", "pl": "Adapter Zigbee", "zh-cn": "Zigbee适配器"}, "Zigbee-herdsman debug info": { "uk": "Інформація про налагодження Zigbee-herdsman", "en": "Zigbee-herdsman debug info", "de": "Zigbee-herdsman Debug-Info", "ru": "Отладочная информация Zigbee-herdsman", "pt": "Informações de depuração do pastor Zigbee", "nl": "Zigbee-herdsman debug informatie", "fr": "Informations de débogage de Zigbee-herdsman", "it": "Informazioni di debug di Zigbee-herdsman", "es": "Información de depuración de Zigbee-herdsman", "pl": "Informacje debugowania Zigbee-Herdsman", "zh-cn": "Zigbee-herdsman调试信息"}, diff --git a/docs/de/img/Bild10.png b/docs/de/img/Bild10.png new file mode 100644 index 00000000..243fc063 Binary files /dev/null and b/docs/de/img/Bild10.png differ diff --git a/docs/de/img/Bild12.png b/docs/de/img/Bild12.png new file mode 100644 index 00000000..05e34536 Binary files /dev/null and b/docs/de/img/Bild12.png differ diff --git a/docs/de/img/Bild13.png b/docs/de/img/Bild13.png new file mode 100644 index 00000000..3edd9c06 Binary files /dev/null and b/docs/de/img/Bild13.png differ diff --git a/docs/de/img/Bild14.png b/docs/de/img/Bild14.png new file mode 100644 index 00000000..96d4a864 Binary files /dev/null and b/docs/de/img/Bild14.png differ diff --git a/docs/de/img/Bild15.png b/docs/de/img/Bild15.png new file mode 100644 index 00000000..68b65a95 Binary files /dev/null and b/docs/de/img/Bild15.png differ diff --git a/docs/de/img/Bild16.png b/docs/de/img/Bild16.png new file mode 100644 index 00000000..7afa96e7 Binary files /dev/null and b/docs/de/img/Bild16.png differ diff --git a/docs/de/img/Bild17.png b/docs/de/img/Bild17.png new file mode 100644 index 00000000..d7309495 Binary files /dev/null and b/docs/de/img/Bild17.png differ diff --git a/docs/de/img/Bild18.png b/docs/de/img/Bild18.png new file mode 100644 index 00000000..52ea7cd7 Binary files /dev/null and b/docs/de/img/Bild18.png differ diff --git a/docs/de/img/Bild19.png b/docs/de/img/Bild19.png new file mode 100644 index 00000000..6118b541 Binary files /dev/null and b/docs/de/img/Bild19.png differ diff --git a/docs/de/img/Bild2.png b/docs/de/img/Bild2.png new file mode 100644 index 00000000..836d7541 Binary files /dev/null and b/docs/de/img/Bild2.png differ diff --git a/docs/de/img/Bild20.png b/docs/de/img/Bild20.png new file mode 100644 index 00000000..2986ff4f Binary files /dev/null and b/docs/de/img/Bild20.png differ diff --git a/docs/de/img/Bild21.png b/docs/de/img/Bild21.png new file mode 100644 index 00000000..27f3913b Binary files /dev/null and b/docs/de/img/Bild21.png differ diff --git a/docs/de/img/Bild22.png b/docs/de/img/Bild22.png new file mode 100644 index 00000000..c663d7b1 Binary files /dev/null and b/docs/de/img/Bild22.png differ diff --git a/docs/de/img/Bild23.png b/docs/de/img/Bild23.png new file mode 100644 index 00000000..d9e0de9f Binary files /dev/null and b/docs/de/img/Bild23.png differ diff --git a/docs/de/img/Bild24.png b/docs/de/img/Bild24.png new file mode 100644 index 00000000..938a0157 Binary files /dev/null and b/docs/de/img/Bild24.png differ diff --git a/docs/de/img/Bild25.png b/docs/de/img/Bild25.png new file mode 100644 index 00000000..26f50c02 Binary files /dev/null and b/docs/de/img/Bild25.png differ diff --git a/docs/de/img/Bild26.png b/docs/de/img/Bild26.png new file mode 100644 index 00000000..fd13e451 Binary files /dev/null and b/docs/de/img/Bild26.png differ diff --git a/docs/de/img/Bild28.png b/docs/de/img/Bild28.png new file mode 100644 index 00000000..f55a6f80 Binary files /dev/null and b/docs/de/img/Bild28.png differ diff --git a/docs/de/img/Bild3.png b/docs/de/img/Bild3.png new file mode 100644 index 00000000..b70a6e8c Binary files /dev/null and b/docs/de/img/Bild3.png differ diff --git a/docs/de/img/Bild30.png b/docs/de/img/Bild30.png new file mode 100644 index 00000000..822b7124 Binary files /dev/null and b/docs/de/img/Bild30.png differ diff --git a/docs/de/img/Bild31.png b/docs/de/img/Bild31.png new file mode 100644 index 00000000..790eaea0 Binary files /dev/null and b/docs/de/img/Bild31.png differ diff --git a/docs/de/img/Bild32.png b/docs/de/img/Bild32.png new file mode 100644 index 00000000..33563015 Binary files /dev/null and b/docs/de/img/Bild32.png differ diff --git a/docs/de/img/Bild33.png b/docs/de/img/Bild33.png new file mode 100644 index 00000000..5ec4858a Binary files /dev/null and b/docs/de/img/Bild33.png differ diff --git a/docs/de/img/Bild34.png b/docs/de/img/Bild34.png new file mode 100644 index 00000000..0e40a5b4 Binary files /dev/null and b/docs/de/img/Bild34.png differ diff --git a/docs/de/img/Bild35.png b/docs/de/img/Bild35.png new file mode 100644 index 00000000..cfcf1d00 Binary files /dev/null and b/docs/de/img/Bild35.png differ diff --git a/docs/de/img/Bild36.png b/docs/de/img/Bild36.png new file mode 100644 index 00000000..7ad47a0c Binary files /dev/null and b/docs/de/img/Bild36.png differ diff --git a/docs/de/img/Bild37.png b/docs/de/img/Bild37.png new file mode 100644 index 00000000..6d113abf Binary files /dev/null and b/docs/de/img/Bild37.png differ diff --git a/docs/de/img/Bild4.png b/docs/de/img/Bild4.png new file mode 100644 index 00000000..47e437b8 Binary files /dev/null and b/docs/de/img/Bild4.png differ diff --git a/docs/de/img/Bild5.jpg b/docs/de/img/Bild5.jpg new file mode 100644 index 00000000..3bdf5334 Binary files /dev/null and b/docs/de/img/Bild5.jpg differ diff --git a/docs/de/img/Bild6.png b/docs/de/img/Bild6.png new file mode 100644 index 00000000..5c9b2655 Binary files /dev/null and b/docs/de/img/Bild6.png differ diff --git a/docs/de/img/Bild7.png b/docs/de/img/Bild7.png new file mode 100644 index 00000000..b8b839ee Binary files /dev/null and b/docs/de/img/Bild7.png differ diff --git a/docs/de/img/Bild8.png b/docs/de/img/Bild8.png new file mode 100644 index 00000000..02aa38f4 Binary files /dev/null and b/docs/de/img/Bild8.png differ diff --git a/docs/de/img/Bild9.png b/docs/de/img/Bild9.png new file mode 100644 index 00000000..0e57849c Binary files /dev/null and b/docs/de/img/Bild9.png differ diff --git a/docs/de/img/software1.jpg b/docs/de/img/software1.jpg new file mode 100644 index 00000000..767b568c Binary files /dev/null and b/docs/de/img/software1.jpg differ diff --git a/docs/de/img/sonoff.png b/docs/de/img/sonoff.png new file mode 100644 index 00000000..2877f377 Binary files /dev/null and b/docs/de/img/sonoff.png differ diff --git a/docs/de/readme.md b/docs/de/readme.md index edd7e6ee..de769780 100644 --- a/docs/de/readme.md +++ b/docs/de/readme.md @@ -1,27 +1,126 @@ # ioBroker Adapter für Zigbee-Geräte -Mit Hilfe eines Koordinators für Zigbee-Netz, basierend auf Texas Instruments SoC cc253x (und anderen), wird ein eigenes Netz erschaffen, welchem sich andere Zigbee Geräte beitreten können. Dank der direkten Interaktion mit dem Koordinator, erlaubt der Zigbee Adapter die Steuerung der Geräte ohne jegliche Gateways/Bridges der Hersteller (Xiaomi/Tradfri/Hue). Über Funktionsweise der Zigbee-Netze kann man [hier nachlesen (Englisch)](https://github.com/Koenkk/zigbee2mqtt/wiki/ZigBee-network). +Mit Hilfe eines Koordinators für ZigBee-Netze, basierend auf dem Chip "Texas Instruments CC253x" (und anderen), wird ein eigenes ZigBee-Netz erschaffen, dem ZigBee-Geräte (Lampen, Dimmer, Sensoren, …) beitreten können. Dank der direkten Interaktion mit dem Koordinator erlaubt der ZigBee-Adapter die Steuerung der Geräte ohne jegliche Gateways/Bridges der Hersteller (Xiaomi/Tradfri/Hue). Zusätzliche Informationen zu ZigBee kann man hier [hier nachlesen (Englisch)](https://github.com/Koenkk/zigbee2mqtt/wiki/ZigBee-network). ## Die Hardware -Für die Umsetzung wird einer der aufgezählten Geräte/Sticks verwendet, welche mit spezieller ZNP-Firmware geflasht sind: [cc2530, cc2530, cc2530+RF.](https://github.com/Koenkk/zigbee2mqtt/wiki/Supported-sniffer-devices#zigbee-coordinator) +Für den Koordinator (siehe oben) ist eine zusätzliche Hardware erforderlich, welche die Umsetzung zwischen USB und ZigBee-Funksignalen ermöglicht. Es gibt 2 Gruppen: + + - Aufsteckmodul für den RaspberryPi (wird nicht mehr verwendet da veraltet und keine Zigbee 3.0 Unterstützung)
+ - USB-Stick ähnliche Hardware ![](img/CC2531.png) ![](img/sku_429478_2.png) -![](img/sku_429601_2.png) +![](img/cc26x2r.PNG) ![](img/CC2591.png) +![](img/sonoff.png) + + +Bei manchen dieser Geräte ist zum Betrieb das Aufspielen einer geeigneten Firmware erforderlich: +Bitte schaut zuerst wie die entsprechenden Koordinatoren geflasht werden müssen. Die Firmware ist [hier](https://github.com/Koenkk/Z-Stack-firmware) zu fimden. + +Zunehmend beliebt kommt der "Sonoff ZIGBEE 3.0 USB-STICK CC2652P" zum Einsatz: +![](img/sonoff.png) + + - Flashen einer passenden Firmware nicht zwingend erforderlich (Ware wird bereits mit geeigneter Firmware ausgeliefert)
+ - Unterstützt den neueren ZigBee 3.0 Standard + +Die mit dem ZigBee-Netz verbundenen Geräte übermitteln dem Koordinator ihren Zustand und benachrichtigen über Ereignisse (Knopfdruck, Bewegungserkennung, Temperaturänderung, …). Diese Infos werden im Adapter unter den jeweiligen ioBroker-Objekten angezeigt und können so in ioBroker weiterverarbeitet werden. Außerdem ist es möglich Kommandos an das ZigBee-Gerät zu senden (Zustandsänderung Steckdosen und Lampen, Farb- und Helligkeitseinstellungen, …). + + +## Die Software + +Die Software wird unterteilt in "Konverter" und "Adapter". + +![](img/software1.jpg) + + - Konverter
+ Der Konverter gliedert sich auf in zwei Teile:
+ a) Allgemeine Bereitstellung der Daten aus den ZigBee-Funksignalen. Dieser [Softwareteil](https://github.com/Koenkk/zigbee-herdsman) wird für alle ZigBee-Geräte verwendet.
+ b) Gerätespezifische [Aufbereitung](https://github.com/Koenkk/zigbee-herdsman-converters) der Daten auf eine definierte Schnittstelle zum Adapter.
+ + - Adapter
+ Dieser Softwareteil ist die Anbindung des Konverters an ioBroker. Der [Adapter](https://github.com/ioBroker/ioBroker.zigbee) beinhaltet die grafische Darstellung zur Verwaltung der ZigBee-Geräte, sowie die Erzeugung der ioBroker-Objekte zur Steuerung der ZigBee-Geräte. + +## Installation +1. Koordinator Hardware am RaspberryPi anstecken.
+2. Über z.B. PuTTY mit RaspberryPi verbinden.
+3. Eventuell vorhandene ZigBee-Backupdatei löschen. Andernfalls wird der ZigBee-Adapter in ioBroker nicht grün und im ioBroker Log steht, dass der Adapter falsch konfiguriert ist.
+sudo rm /opt/iobroker/iobroker-data/zigbee_0/nvbackup.json
+4. Pfad des Koordinators ermitteln: +`ls -la /dev/serial/by-id/` +![](img/Bild2.png) +5. ioBroker -> ZigBee-Adapter installieren, hier als Beispiel die Version 1.8.10
![](img/Bild3.png)
Hiermit werden alle erforderlichen Softwareteile (Konverter und Adapter) installiert. +6. Adapter öffnen -> ![](img/Bild4.png) -> Zuvor ermittelten Pfad des Koordinators mit dem Zusatz /dev/serial/by-id/ eintragen:![](img/Bild5.jpg)
Es ist zu achten dass am Ende kein leer Zeichen mitgenommen wird +7. Netzwerk-ID und Pan ID vergeben zur Unterscheidung von anderen ZigBee-Netzwerken in Funkreichweite, z.B.
+ ![](img/Bild6.png) ![](img/Bild7.png)
![](img/Bild8.png) ![](img/Bild9.png) +8. Prüfen ob der Adapter in ioBroker grün wird. Sollzustand:
![](img/Bild10.png)
Andernfalls ioBroker Log lesen und Fehlerursache suchen, im Forum stehen viele Lösungsansätze. + +## Pairing +Jedes ZigBee-Gerät (Schalter, Lampe, Sensor, …) muss mit dem Koordinator gekoppelt werden (Pairing):
-Der benötigte Flasher/Programmer und der Prozess der Vorbereitung werden [hier (Englisch)](https://github.com/Koenkk/zigbee2mqtt/wiki/Getting-started) oder [hier (Russisch)](https://github.com/kirovilya/ioBroker.zigbee/wiki/%D0%9F%D1%80%D0%BE%D1%88%D0%B8%D0%B2%D0%BA%D0%B0) beschrieben. + - ZigBee-Gerät: + Jedes **ZigBee-Gerät** kann nur mit genau 1 ZigBee-Netzwerk verbunden sein. Hat das ZigBee-Gerät noch Pairing-Informationen zu einem fremden Koordinator (z.B. Philips Hue Bridge) gespeichert, dann muss es von diesem ZigBee-Netzwerk zuerst entkoppelt werden. Dieses Entkoppeln vom alten ZigBee-Netzwerk erfolgt vorzugsweise über die Bedienoberfläche des alten ZigBee-Netzwerkes (z.B. Philips Hue App). Alternativ kann man das ZigBee-Gerät auf Werkseinstellungen zurücksetzen.
+ Um ein ZigBee-Gerät nun in den Pairing-Mode zu versetzen, gibt es typischer Weise folgende Möglichkeiten:
+ 1. ZigBee-Gerät von einem ZigBee-Netzwerk entkoppeln + 2. Pairing-Button am ZigBee-Gerät drücken + 3. Versorgungsspannung des ZigBee-Gerätes aus- und dann wieder einschalten + +Danach ist das ZigBee-Gerät für typischer Weise 60 Sekunden im Pairing-Mode.
+Ähnlich wie die Vorgehensweise zum Rücksetzen auf Werkseinstellungen ist auch das Aktivieren des Pairing-Mode abhängig vom jeweiligen Gerätetyp (ggf. Bedienungsanleitung des ZigBee-Gerätes lesen).
-Die mit dem Zigbee-Netz verbundenen Geräte übermitteln dem Koordinator ihren Zustand und benachrichtigen über Ereignisse (Knopfdruck, Bewegungserkennung, Temperaturänderung). Diese Infos werden im Adapter unter den jeweiligen Objekten angezeigt. Außerdem ist es möglich manche Ereignisse/Status zurück zum Zigbee-Gerät zusenden (Zustandsänderung Steckdosen und Lampen, Farb- und Helligkeitseinstellungen). + - Koordinator: +Grünen Knopf drücken, um den Koordinator für 60 Sekunden (oder die in den Adaptereinstellungen gewählte Zeit) in den Pairing-Mode zu versetzen.
+![](img/Bild12.png) -## Einstellungen und Pairing -![](https://raw.githubusercontent.com/kirovilya/files/master/config.PNG) + - Warten bis im Dialog "New device joined" erscheint: +![](img/Bild13.png) -Zu Beginn muss der USB-Port angegeben werden, an welchem der cc253x angeschlossen ist. Wie man diesen Erkennt ist [hier beschrieben (Russisch)](https://github.com/kirovilya/ioBroker.zigbee/wiki#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B5%D1%80%D0%B0) + - Pairing überprüfen: +Das zu koppelnde Gerät muss vom ioBroker ZigBee-Adapter unterstützt werden. Im Gutfall wird im ZigBee-Adapter ein neues Gerät angezeigt (z.B. Philips Light Stripe) und entsprechende ioBroker-Objekte angelegt: +![](img/Bild14.png) ![](img/Bild15.png) -Zum Verbinden der Geräte muss der Koordinator für Zigbee-Netz in den Pairingmodus versetzt werden, dazu auf den grünen Knopf im Adapter klicken. Pairingmodus ist ab jetzt für 60 Sekunden aktiv. Um die Geräte zu verbinden, reicht im Normallfall ein Betätigen des Knopfes auf dem zu verbindendem Gerät. Es gibt aber auch „besondere“ Geräte. Wie man diese verbindet ist [hier Englisch](https://github.com/Koenkk/zigbee2mqtt/wiki/Pairing-devices) [oder Russisch](https://github.com/kirovilya/ioBroker.zigbee/wiki#%D0%9F%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%B2%D0%B0%D0%B5%D0%BC%D1%8B%D0%B5-%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0) beschrieben. + - Im Schlechtfall wird das ZigBee-Gerät aktuell noch nicht unterstützt. Im nächsten Abschnitt ist beschrieben, was zu tun ist, um dieses ZigBee-Gerät dennoch nutzen zu können. -Nach erfolgreichem Pairing, wird das Gerät im Adapter angezeigt. Sollte ein Gerät (aus der Liste) den Namen „undefined“ haben, dann versucht es zu löschen und nochmal zu pairen. Sollte es trotzdem nicht funktionieren, schreibt bitte ein Issue. -Zigbee-Geräte die nicht in der Liste aufgeführt sind, können zwar gepairt werden, aber der Adapter kann mit diesen nicht kommunizieren. +## Pairing von bisher unbekannten ZigBee-Geräten + +Bei bisher unbekannten ZigBee-Geräten erscheint beim Pairing der ZigBee-Name des ZigBee-Gerätes (z.B. HOMA1001) mit dem Zusatz "not described in statesMapping"
+![](img/Bild28.png)
+![](img/Bild16.png)
+ +Durch Drehen dieser Kachel erhält man Detailinformationen zu dem ZigBee-Gerät:
+![](img/Bild17.png) ![](img/Bild18.png)
+ +Nach einer Registrierung bei [github.com](https://github.com/ioBroker/ioBroker.zigbee/issues) kann über einen "Issue" das fehlende ZigBee-Gerät gemeldet werden: + +![](img/Bild19.png)
+ +• Detailinformationen der Kachel (siehe oben) in den Issue einfügen, erstelle eine kurze Dokumentation (vorzugweise auf Englisch) und absenden. Ein Entwickler wird sich daraufhin über den Issue melden. + +Nach Anpassung der relevanten Dateien muss der ZigBee-Adapter neugestartet und dann das ZigBee-Gerät vom Koordinator entkoppelt werden (unpair): +![](img/Bild20.png)
+Danach kann das Pairing wiederholt werden. Sollzustand nach dem Pairing:
+![](img/Bild21.png)
+ +Bei manchen ZigBee-Geräten ist es erforderlich alle Softwareschnittstellen ("exposes") des neuen ZigBee-Gerätes in den ioBroker-Objekten anzuzeigen, um alle Funktionen des ZigBee-Gerätes nutzen zu können. In solchen Fällen muss das neue ZigBee-Gerät in die "Ausschliessen"-Gruppe aufgenommen werden. + +![](img/Bild22.png)
+ +![](img/Bild23.png) -> ![](img/Bild24.png) -> ![](img/Bild25.png) -> ZigBee-Gerät (z.B. HOMA1001) auswählen -> ![](img/Bild26.png)
+Nach einem Neustart des ZigBee-Adapters sollte das neue ZigBee-Gerät nun uneingeschränkt funktionieren. + +## Symbole im ZigBee-Adapter + +| icon | Beschreibung | +| ------------- | ------------- | +| ![](img/Bild30.png) | **State Cleanup**
Löschen von ungültigen ioBroker-Objekten, welche durch den Vorgang "Ausschliessen" entstehen können. | +| ![](img/Bild31.png) | **Auf Firmware Updates überprüfen**
Firmware der ZigBee-Geräte (z.B. Philips Hue Lampen) aktualisieren | +| ![](img/Bild32.png) | **Add Group**
Über diese Funktion können mehrere ZigBee-Geräte zu einer logischen Gruppe zusammengefasst werden und dann über ein ioBroker-Objekt gemeinsam angesteuert werden, z.B. brightness=20 dann wird bei allen ZigBee-Geräten der Gruppe brightness auf 20 gesetzt. | +| ![](img/Bild33.png) | **Touchlink zurücksetzen und koppeln**
Touchlink ist eine Funktion von ZigBee, die es physisch nahe beieinander liegenden Geräten ermöglicht, miteinander zu kommunizieren, ohne sich im selben Netzwerk zu befinden. Diese Funktion wird nicht von allen Geräten unterstützt. Um ein ZigBee-Gerät über Touchlink auf Werkseinstellungen zurückzusetzen, bringe das Gerät in die Nähe (< 10 cm) des ZigBee-Koordinators und drücke dann das grüne Symbol. | +| ![](img/Bild34.png) | **Pairing mit QR Code**
Bei manchen ZigBee-Geräten erfolgt das Pairing mittels QR-Code. | +| ![](img/Bild35.png) | **Pairing**
Anlernvorgang neuer ZigBee-Geräte (Pairing) starten. | +| ![](img/Bild36.png) | Zeit seit mit diesem ZigBee-Gerät
zuletzt ein Datenaustausch stattgefunden hat. | +| ![](img/Bild37.png) | Stärke des ZigBee-Funksignals
an diesem ZigBee-Gerät (<10 schlecht, <50 mittel, >50 gut).ZigBee ist ein Funk-Mesh-Netzwerk (mesh = vermascht). Die meisten netzbetriebenen ZigBee-Geräte (z.B. Philips Hue Lampe) können als ZigBee-Router wirken, also als Funkknotenpunkt. ZigBee-Geräte müssen somit nicht zwingend eine direkte Funkverbindung zum Koordinator aufbauen, sondern können stattdessen jeden Router im Netzwerk zur Funkverbindung nutzen. Mit jedem ZigBee-Router wird somit die Funkreichweite des Netzwerkes erweitert. Alle ZigBee-Geräte prüfen regelmäßig, ob es eine bessere Funkroute gibt und stellen sich automatisch um. Dieser Vorgang kann jedoch etliche Minuten dauern.| ## Zusätzliche Informationen -Es gibt noch ein [Freundschaftprojekt](https://github.com/koenkk/zigbee2mqtt) mit gleichen Funktionen und gleicher Technologie, welcher mit denselben Geräten über ein MQTT Protokoll kommuniziert. Wenn irgendwelche Verbesserungen oder neu unterstütze Geräte im Projekt Zigbee2MQTT eingefügt werden, können jene auch in dieses Projekt hinzugefügt werden. Solltet Ihr unterschiede merken, schreibt bitte ein Issue, wir kümmern uns darum +Es gibt noch ein [Freundschaftsprojekt](https://www.zigbee2mqtt.io/) mit gleichen Funktionen und gleicher Technologie, welcher mit denselben Geräten über ein MQTT Protokoll kommuniziert. Wenn irgendwelche Verbesserungen oder neu unterstütze Geräte im Projekt ZigBee2MQTT eingefügt werden, können jene auch in dieses Projekt hinzugefügt werden. Solltet Ihr Unterschiede merken, schreibt bitte ein Issue und wir kümmern uns darum. +Weitere Themen zu diesem Adapter sind auch im zugehörigen [Wiki](https://github.com/ioBroker/ioBroker.zigbee/wiki) dokumentiert. + diff --git a/docs/en/img/Bild13.png b/docs/en/img/Bild13.png new file mode 100644 index 00000000..0815e68a Binary files /dev/null and b/docs/en/img/Bild13.png differ diff --git a/docs/en/img/Bild18.png b/docs/en/img/Bild18.png new file mode 100644 index 00000000..151f5b11 Binary files /dev/null and b/docs/en/img/Bild18.png differ diff --git a/docs/en/img/Bild23.png b/docs/en/img/Bild23.png new file mode 100644 index 00000000..214b5d45 Binary files /dev/null and b/docs/en/img/Bild23.png differ diff --git a/docs/en/img/Bild25.png b/docs/en/img/Bild25.png new file mode 100644 index 00000000..26f50c02 Binary files /dev/null and b/docs/en/img/Bild25.png differ diff --git a/docs/en/img/Bild26.png b/docs/en/img/Bild26.png new file mode 100644 index 00000000..cf10cbda Binary files /dev/null and b/docs/en/img/Bild26.png differ diff --git a/docs/en/img/Bild4.png b/docs/en/img/Bild4.png new file mode 100644 index 00000000..75b15309 Binary files /dev/null and b/docs/en/img/Bild4.png differ diff --git a/docs/en/img/Bild9.png b/docs/en/img/Bild9.png new file mode 100644 index 00000000..5bbfe40e Binary files /dev/null and b/docs/en/img/Bild9.png differ diff --git a/docs/en/img/software1.jpg b/docs/en/img/software1.jpg new file mode 100644 index 00000000..baca712e Binary files /dev/null and b/docs/en/img/software1.jpg differ diff --git a/docs/en/readme.md b/docs/en/readme.md index 78a06dd5..340c682e 100644 --- a/docs/en/readme.md +++ b/docs/en/readme.md @@ -1,30 +1,128 @@ -# ioBroker adapter for working with Zigbee-devices -With the Zigbee-coordinator based on Texas Instruments SoC cc253x (and others), it creates its own zigbee-network, into which zigbee-devices are connected. By work directly with the coordinator, the driver allows you to manage devices without additional gateways / bridge from device manufacturers (Xiaomi / TRADFRI / Hue). About the device Zigbee-network can be read [here (in English)](https://github.com/Koenkk/zigbee2mqtt/wiki/ZigBee-network). +# ioBroker adapter for ZigBee devices +With the help of a coordinator, based on the chip "Texas Instruments CC253x" (and others), a ZigBee network is created for ZigBee devices (bulbs, dimmers, sensors, …) to join. Thanks to the direct interaction with the coordinator, the ZigBee adapter allows to control the devices without any manufacturer gateways/bridges (Xiaomi/Tradfri/Hue). Additional information about ZigBee can be found [here](https://github.com/Koenkk/zigbee2mqtt/wiki/ZigBee-network). ## Hardware -For work, you need one of the following devices, flashed with a special ZNP firmware: [cc2531, cc2530, cc2530 + RF](https://github.com/Koenkk/zigbee2mqtt/wiki/Supported-sniffer-devices#zigbee-coordinator) +Additional hardware is required for the coordinator (see above), which enables conversion between USB and ZigBee radio signals. There are 2 groups: -![](img/CC2531.png) -![](img/sku_429478_2.png) -![](img/sku_429601_2.png) -![](img/CC2591.png) +• Attachment module for the RaspberryPi (its old and not supported Zigbee V3)
+• USB stick like hardware -The necessary equipment for the firmware and the device preparation process is described [here (in English)](https://github.com/Koenkk/zigbee2mqtt/wiki/Getting-started) or [here (in Russian)](https://github.com/kirovilya/ioBroker.zigbee/wiki/%D0%9F%D1%80%D0%BE%D1%88%D0%B8%D0%B2%D0%BA%D0%B0) +![](../de/img/CC2531.png) +![](../de/img/sku_429478_2.png) +![](../de/img/cc26x2r.PNG) +![](../de/img/CC2591.png) +![](../de/img/sonoff.png) -The devices connected to the Zigbee-network inform the coordinator of their status and events (button presses, motion detection, temperature change). This information is reflected in the ioBroker object-states. Some ioBroker states have feedback and send commands to the zigbee-device when the value changes (switching the state of the outlet or lamp, changing the scene or the brightness of the lamp). -## Work with adapter -To start the driver, you must specify the name of the port on which the cc253x device is connected. +Some of these devices require the installation of a suitable firmware for operation: +The required flasher/programmer and the process of preparation are described [here](https://github.com/Koenkk/zigbee2mqtt/wiki/Getting-started) or [here (Russian)](https://github.com/kirovilya/ioBroker.zigbee/wiki/%D0%9F%D1%80%D0%BE%D1%88%D0%B8%D0%B2%D0%BA%D0%B0). -To connect devices, you need to switch the Zigbee-coordinator to pairing mode by pressing the green button. The countdown will begin (60 seconds) until the device connectivity is available. -To connect Zigbee devices in most cases, just press the pairing button on the device itself. But there are features for some devices. More information about pairing with devices can be found [here (in English)](https://github.com/Koenkk/zigbee2mqtt/wiki/Pairing-devices) or [here (in Russian)](https://github.com/kirovilya/ioBroker.zigbee/wiki#%D0%9F%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%B2%D0%B0%D0%B5%D0%BC%D1%8B%D0%B5-%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0) +The "Sonoff ZIGBEE 3.0 USB STICK CC2652P" is becoming increasingly popular: +![](../de/img/sonoff.png) -After successful pairing, the device appears in the configuration panel. If the device appears in the configuration panel but has the type "undefined", then this is an unknown device and can not be work with it. If the device is in the list of available devices, but added as "undefined", then try to remove the device and add it again. + - Flashing of a suitable firmware is not absolutely necessary (hardware is already delivered with suitable firmware) + - Supports the newer ZigBee 3.0 standard -## Additional info -There is a [friendly project](https://github.com/koenkk/zigbee2mqtt) with similar functionality on the same technologies, where you can work with the same devices using the MQTT protocol. Therefore, if any improvements or support for new zigbee-devices occur in the Zigbee2MQTT project, we can transfer and add the same functionality to this adapter. If you notice this, then write the issue - we'll postpone it. +The devices connected to the ZigBee network transmit their status to the coordinator and notify it of events (button press, motion detection, temperature change, ...). This information is displayed in the adapter under the respective ioBroker objects and can thus be further processed in ioBroker. It is also possible to send commands to the ZigBee device (change of status of sockets and lamps, color and brightness settings, ...). + + +## Software + +The software is divided into "converter" and "adapter". + +![](img/software1.jpg) + + - Converter + The converter is divided into two parts:
+ a) General provision of the data from the ZigBee radio signals. This [software part](https://github.com/Koenkk/zigbee-herdsman) is used for all ZigBee devices.
+ b) Device-specific [processing](https://github.com/Koenkk/zigbee-herdsman-converters) of the data to a defined interface to the adapter. + - Adapter
+ This software part is the connection of the converter to ioBroker. The [adapter](https://github.com/ioBroker/ioBroker.zigbee) includes the graphical user interface for managing the ZigBee devices and the creation of ioBroker objects for controlling the ZigBee devices. + + +## Installation +1. Connect the coordinator hardware to the RaspberryPi.
+2. Connect to RaspberryPi e.g. via PuTTY.
+3. Delete any existing ZigBee backup file. Otherwise the ZigBee adapter will not turn green in ioBroker and the ioBroker log will state that the adapter is misconfigured
+4. Find out the path of the coordinator : +`ls -la /dev/serial/by-id/` +![](../de/img/Bild2.png) +5. ioBroker -> install ZigBee adapter, here Version 1.8.10
![](../de/img/Bild3.png)
This will install all the necessary software parts (converter and adapter). +6. Open adapter -> ![](img/Bild4.png) -> Enter the previously determined path of the coordinator with the addition /dev/serial/by-id/:![](../de/img/Bild5.jpg)
There must be NO spaces at the end of the path. +7. Configure network ID and Pan ID to differentiate from other ZigBee networks within radio range, e.g.
+ ![](../de/img/Bild6.png) ![](../de/img/Bild7.png)
![](../de/img/Bild8.png) ![](img/Bild9.png) +8. Check if the adapter turns green in ioBroker. Target state:
![](../de/img/Bild10.png)
Otherwise read the ioBroker log and look for the cause of the error, check also our Forum. + +## Pairing +Each ZigBee device (switch, bulb, sensor, ...) must be paired with the coordinator (pairing):
+ + - ZigBee device: + Each ZigBee device can only be connected to exactly 1 ZigBee network. If the ZigBee device still has pairing information saved for a different coordinator (e.g. Philips Hue Bridge), then it must first be decoupled from this ZigBee network. This decoupling from the old ZigBee network preferably is done via the user interface of the old ZigBee network (z.B. Philips Hue App). Alternatively, you can reset the ZigBee device to factory settings.
+There are typically the following options for putting a ZigBee device into pairing mode
+ 1. Unpair a ZigBee device from a ZigBee network + 2. Press the pairing button on the ZigBee device + 3. Switch the supply voltage of the ZigBee device off and then on again + + +The ZigBee device is then in pairing mode for typically 60 seconds. Similar to the procedure for resetting to factory settings, activating the pairing mode also depends on the respective device type (if necessary, read the operating instructions of the ZigBee device). + + - Coordinator: +Press the green button to put the coordinator into pairing mode for 60 seconds.
+![](../de/img/Bild12.png) + + - Wait until "New device joined" appears in the dialog:
+![](img/Bild13.png) + + - Check Pairing: +The device to be paired must be supported by the ioBroker ZigBee adapter. In the best case, a new device is displayed in the ZigBee adapter (e.g. Philips Light Stripe) and corresponding ioBroker objects are created: +![](../de/img/Bild14.png) ![](../de/img/Bild15.png) + + - In the worst case, the ZigBee device is not currently supported. The next section describes what needs to be done to use this ZigBee device anyhow. + +## Pairing of unknown ZigBee devices so far + +With unknown ZigBee devices so far, the ZigBee name of the ZigBee device (e.g. HOMA1001) appears during pairing with the addition "not described in statesMapping"
+![](../de/img/Bild28.png)
+![](../de/img/Bild16.png)
+ +Turning this tile gives you detailed information about the ZigBee device:
+![](../de/img/Bild17.png) ![](img/Bild18.png)
+ +After registering at [github.com](https://github.com/ioBroker/ioBroker.zigbee/issues) the missing ZigBee device must be reported via an "Issue": + +![](../de/img/Bild19.png)
+ + - Insert detailed information of the tile (see above) into the issue, create a short documentation (preferably in English) and send it. A developer will then respond via the issue. + +After modifying the relevant files, the ZigBee adapter must be restarted and the ZigBee device must be unpaired from the coordinator: +![](../de/img/Bild20.png)
+After that, the pairing can be repeated. Target state after pairing:
+![](../de/img/Bild21.png)
+ +With some ZigBee devices it is necessary to display all software interfaces ("exposes") of the new ZigBee device in the ioBroker objects in order to be able to use all the functions of this ZigBee device. In such cases, the new ZigBee device must be included in the "Exclude" group. + +![](../de/img/Bild22.png)
+ +![](img/Bild23.png) -> ![](../de/img/Bild24.png) -> ![](img/Bild25.png) -> select ZigBee device (e.g. HOMA1001) -> ![](img/Bild26.png)
+After restarting the ZigBee adapter, the new ZigBee device should now work without restrictions. + + + +## Symbols within the ZigBee adapter + +| icon | Beschreibung | +| ------------- | ------------- | +| ![](../de/img/Bild30.png) | **State Cleanup** Deletion of invalid ioBroker objects, which can result from the "Exclude" process. | +| ![](../de/img/Bild31.png) | **Check firmware updates** Update the firmware of the ZigBee devices (e.g. Philips Hue bulbs). | +| ![](../de/img/Bild32.png) | **Add Group** Using this function, ZigBee devices can be combined into a logical group and then be controlled together via one ioBroker object, e.g. brightness=20 sets the brightness of all ZigBee devices in the group to 20. | +| ![](../de/img/Bild33.png) | **Touchlink reset and pairing** Touchlink is a ZigBee function that allows devices that are physically close to each other to communicate with each other without being in the same network. Not all devices support this feature.To factory reset a ZigBee device via Touchlink, bring the device close (< 10 cm) to the ZigBee coordinator and then press this green icon. | +| ![](../de/img/Bild34.png) | **Pairing with QR code** Bei With some ZigBee devices, pairing is done using a QR code. | +| ![](../de/img/Bild35.png) | **Let's start Pairing** Start the pairing process for new ZigBee devices. | +| ![](../de/img/Bild36.png) | Time since data was last exchanged with this ZigBee device. | +| ![](../de/img/Bild37.png) | Strength of the ZigBee radio signal at this ZigBee device (<10 poor, <50 medium, >50 good).ZigBee is a wireless mesh network. Most mains-operated ZigBee devices (e.g. Philips Hue bulbs) can act as a ZigBee router, this means as a radio node. ZigBee devices therefore do not necessarily have to establish a direct wireless connection to the coordinator, but can instead use any router in the network for the wireless connection. The radio range of the network is thus extended with each ZigBee router. All ZigBee devices regularly check whether there is a better radio route and switch over automatically. However, this process can take several minutes.| + +## Additional information +There is [another](https://www.zigbee2mqtt.io/) with the same functions and the same technology, which communicates with the same devices via an MQTT protocol. If any improvements or new supported devices are included in the ZigBee2MQTT project, those can also be added to this project. If you notice any differences, please write an issue and we will take care of it. +Other topics related to this adapter are also documented in the associated wiki. -There are knowledge bases that can be useful for working with Zigbee-devices and equipment: -* in English https://github.com/koenkk/zigbee2mqtt/wiki -* in Russian https://github.com/kirovilya/ioBroker.zigbee/wiki diff --git a/io-package.json b/io-package.json index 6aac30c1..488c5fa4 100644 --- a/io-package.json +++ b/io-package.json @@ -1,8 +1,16 @@ { "common": { "name": "zigbee", - "version": "1.8.11", + "version": "1.8.15", "news": { + "1.8.13": { + "en": "see Readme https://github.com/ioBroker/ioBroker.zigbee/blob/master/README.md", + "de": "see Readme https://github.com/ioBroker/ioBroker.zigbee/blob/master/README.md" + }, + "1.8.12": { + "en": "new Documentation", + "de": "neue Dokumentation" + }, "1.8.11": { "en": "fix exposes with composite list", "de": "fix exposes with composite list" @@ -44,22 +52,6 @@ "1.8.6": { "en": "fix exposes", "de": "fix exposes" - }, - "1.8.5": { - "en": "fix for new code", - "de": "fix für neuen code", - "ru": "исправить для нового кода", - "pt": "corrigir para novo código", - "nl": "vertaling:", - "fr": "correction du nouveau code", - "it": "correzione per nuovo codice", - "es": "fijar para nuevo código", - "pl": "naprawić nowy kod", - "uk": "виправити для нового коду", - "zh-cn": "f 新的守则的ix" - }, - "1.8.4": { - "en": "fix for new code" } }, "title": "Zigbee", @@ -231,6 +223,7 @@ "_id": "exclude.all", "type": "state", "common": { + "role": "state", "name": "all", "type": "string", "read": true, @@ -264,6 +257,7 @@ "_id": "info.pairingMode", "type": "state", "common": { + "role": "indicator", "name": "Pairing mode", "type": "boolean", "read": true, @@ -276,6 +270,7 @@ "_id": "info.pairingCountdown", "type": "state", "common": { + "role": "indicator", "name": "Pairing countdown", "type": "number", "read": true, @@ -288,6 +283,7 @@ "_id": "info.pairingMessage", "type": "state", "common": { + "role": "indicator", "name": "Pairing message", "type": "string", "read": true, @@ -300,6 +296,7 @@ "_id": "info.groups", "type": "state", "common": { + "role": "state", "name": "Groups", "type": "string", "read": true, @@ -312,6 +309,7 @@ "_id": "info.undefinedDevices", "type": "state", "common": { + "role": "state", "name": "Recorded undefined devices", "type": "string", "read": true, @@ -319,6 +317,19 @@ "def": "" }, "native": {} + }, + { + "_id": "info.debugmessages", + "type": "state", + "common": { + "role": "state", + "name": "Log changes as warnings for", + "type": "string", + "read": true, + "write": true, + "def": "" + }, + "native": {} } ] } diff --git a/lib/devices.js b/lib/devices.js index 7cbeb520..f41b023e 100644 --- a/lib/devices.js +++ b/lib/devices.js @@ -1890,7 +1890,7 @@ const devices = [ }, { models: ['50064'], - icon: 'img/paulmann_spot.png', + icon: 'img/paulmann_rgbw_controller.png', states: lightStatesWithColortemp, syncStates: [sync.brightness], }, diff --git a/lib/exposes.js b/lib/exposes.js index d9d600ef..0849a78d 100644 --- a/lib/exposes.js +++ b/lib/exposes.js @@ -71,9 +71,35 @@ function genState(expose, role, name, desc) { write: writable, read: true, type: 'string', - states: expose.values.map(item => `${item}:${item}`).join(';'), + states: {}, }; - // if a definition of a button + + for (const val of expose.values) { + // if a definition of a enum states + if (val == '') { + state.states[propName] = propName; + } else { + state.states[val] = val; + } + state.type = typeof (val); + } + + switch (state.type) { + case 'boolean': + state.def = false; + break; + case 'number': + state.def = 0; + break; + case 'object': + state.def = {}; + break; + case 'string': + state.def = ''; + break; + } + + // if a definition of a special button if (state.states == ':') { state.states = propName + ':' + propName; state.type = 'object'; @@ -846,24 +872,38 @@ function applyExposes(mappedDevices, byModel, allExcludesObj) { const allExcludesStr = JSON.stringify(allExcludesObj); // create or update device from exposes for (const deviceDef of zigbeeHerdsmanConverters.definitions) { + applyDeviceDef(mappedDevices, byModel, allExcludesStr, deviceDef); + + if (deviceDef.hasOwnProperty('whiteLabel')) { + for (const deviceWhiteLabel of deviceDef.whiteLabel) { + applyDeviceDef(mappedDevices, byModel, allExcludesStr, { + ...deviceDef, + model: deviceWhiteLabel.model, + vendor: deviceWhiteLabel.vendor, + description: deviceWhiteLabel.description || deviceDef.description, + }); + } + } + } +} - const stripModel = utils.getModelRegEx(deviceDef.model); - // check if device is mapped - const existsMap = byModel.get(stripModel); - - if ((deviceDef.hasOwnProperty('exposes') && (!existsMap || !existsMap.hasOwnProperty('states'))) || allExcludesStr.indexOf(stripModel) > 0) { - try { - const newDevice = createFromExposes(stripModel, deviceDef); - if (!existsMap) { - mappedDevices.push(newDevice); - byModel.set(stripModel, newDevice); - } else { - existsMap.states = newDevice.states; - existsMap.exposed = true; - } - } catch (e) { - console.log(`Wrong expose devicedefinition ${deviceDef.vendor} ${deviceDef.model}`); +function applyDeviceDef(mappedDevices, byModel, allExcludesStr, deviceDef) { + const stripModel = utils.getModelRegEx(deviceDef.model); + // check if device is mapped + const existsMap = byModel.get(stripModel); + + if ((deviceDef.hasOwnProperty('exposes') && (!existsMap || !existsMap.hasOwnProperty('states'))) || allExcludesStr.indexOf(stripModel) > 0) { + try { + const newDevice = createFromExposes(stripModel, deviceDef); + if (!existsMap) { + mappedDevices.push(newDevice); + byModel.set(stripModel, newDevice); + } else { + existsMap.states = newDevice.states; + existsMap.exposed = true; } + } catch (e) { + console.log(`Wrong expose devicedefinition ${deviceDef.vendor} ${stripModel}`); } } } diff --git a/lib/ota.js b/lib/ota.js index 526c330c..32197319 100755 --- a/lib/ota.js +++ b/lib/ota.js @@ -97,7 +97,7 @@ class Ota { const available = await device.mapped.ota.isUpdateAvailable(device.device, this); result.status = available.available ? 'available' : 'not_available'; if (available.currentFileVersion !== available.otaFileVersion) { - this.warning(`current Firmware for ${device.name} is ${available.currentFileVersion} new is ${available.otaFileVersion}`); + this.warn(`current Firmware for ${device.name} is ${available.currentFileVersion} new is ${available.otaFileVersion}`); } } else { result.status = 'not_supported'; @@ -105,7 +105,7 @@ class Ota { this.debug(`Firmware update for ${device.name} is ${result.status}`); this.adapter.sendTo(obj.from, obj.command, result, obj.callback); } catch (error) { - const message = `Failed to check if update available for '${device.name}' (${error.message})`; + const message = `Failed to check if update available for '${device.name}' ${error.message}`; result.status = 'fail'; result.msg = message; this.warn(message); diff --git a/lib/states.js b/lib/states.js index 2d2a893e..c55ed503 100644 --- a/lib/states.js +++ b/lib/states.js @@ -312,7 +312,7 @@ const states = { type: 'number', unit: '%', min: 0, - max: 100 + max: 120 }, left_click: { id: 'left_click', diff --git a/lib/statescontroller.js b/lib/statescontroller.js index e8fc79ae..0edbd462 100644 --- a/lib/statescontroller.js +++ b/lib/statescontroller.js @@ -72,31 +72,9 @@ class StatesController extends EventEmitter { this.debugDevices = state.val.split(';'); } this.info(`debug devices set to ${JSON.stringify(this.debugDevices)}`); - } else { - this.adapter.setObject('info.debugmessages', { - type: 'state', - common: { - name: 'Log changes as warnings for', - role: '', - type: 'string', - read: true, - write: true, - }, - native: {}, - }); } }); - this.adapter.setObject('info.undefinedDevices', { - type: 'state', - common: { - name: 'Recorded undefined devices', - role: '', - type: 'string', - read: true, - write: false, - }, - native: {}, - }); + this.adapter.setStateAsync(`info.undefinedDevices`, JSON.stringify(knownUndefinedDevices), true); } @@ -160,12 +138,13 @@ class StatesController extends EventEmitter { const result = {}; // find model states for options and get it values const devStates = await this.getDevStates('0x' + devId, model); - if (!devStates) { + if (devStates == null || devStates == undefined) { callback(result); return; } - const states = devStates.states.filter(statedesc => statedesc.isOption || statedesc.inOptions); - if (!states) { + + const states = devStates.states.filter(statedesc => statedesc.isOption || statedesc.inOptions); + if (states == null || states == undefined) { callback(result); return; } diff --git a/main.js b/main.js index 2fc6b88d..00f67abd 100644 --- a/main.js +++ b/main.js @@ -516,7 +516,7 @@ class Zigbee extends utils.Adapter { if (!converters.length) { if (type !== 'readResponse') { this.log.debug( - `No converter available for '${mappedModel.model}' with cluster '${cluster}' and type '${type}'` + `No converter available for '${mappedModel.model}' '${devId}' with cluster '${cluster}' and type '${type}'` ); } return; @@ -562,144 +562,155 @@ class Zigbee extends utils.Adapter { async publishFromState(deviceId, model, stateModel, stateList, options) { let isGroup = false; + + this.log.debug(`publishFromState : ${deviceId} ${model}`); if (model === 'group') { isGroup = true; deviceId = parseInt(deviceId); } - const entity = await this.zbController.resolveEntity(deviceId); - this.log.debug(`entity: ${deviceId} ${model} ${safeJsonStringify(entity)}`); - const mappedModel = entity.mapped; - if (!mappedModel) { - this.log.debug(`No mapped model for ${model}`); - return; - } - this.log.debug(`Mapped Model: ${JSON.stringify(mappedModel)}`); - - stateList.forEach(async changedState => { - const stateDesc = changedState.stateDesc; - const value = changedState.value; - - if (stateDesc.id === 'send_payload') { - try { - const json_value = JSON.parse(value); - const payload = {device: deviceId.replace('0x', ''), payload: json_value}; - const result = await this.sendPayload(payload); - if (result.hasOwnProperty('success') && result.success) { - this.acknowledgeState(deviceId, model, stateDesc, value); - } - } catch (error) { - this.log.warn(`send_payload: ${value} does not parse as JSON Object : ${error.message}`); - return; - } + try { + const entity = await this.zbController.resolveEntity(deviceId); + + this.log.debug(`entity: ${deviceId} ${model} ${safeJsonStringify(entity)}`); + + const mappedModel = entity.mapped; + + if (!mappedModel) { + this.log.debug(`No mapped model for ${model}`); return; } - - if (stateDesc.isOption) { - // acknowledge state with given value - this.acknowledgeState(deviceId, model, stateDesc, value); - // process sync state list - //this.processSyncStatesList(deviceId, modelId, syncStateList); - // if this is the device query state => trigger the device query - - // on activation of the 'device_query' state trigger hardware query where possible - if (stateDesc.id === 'device_query') { - if (this.query_device_block.indexOf(deviceId) > -1) { - this.log.warn(`Device query for '${entity.device.ieeeAddr}' blocked`); + + stateList.forEach(async changedState => { + const stateDesc = changedState.stateDesc; + const value = changedState.value; + + if (stateDesc.id === 'send_payload') { + try { + const json_value = JSON.parse(value); + const payload = {device: deviceId.replace('0x', ''), payload: json_value}; + const result = await this.sendPayload(payload); + if (result.hasOwnProperty('success') && result.success) { + this.acknowledgeState(deviceId, model, stateDesc, value); + } + } catch (error) { + this.log.warn(`send_payload: ${value} does not parse as JSON Object : ${error.message}`); return; } - if (mappedModel) { - this.query_device_block.push(deviceId); - this.log.debug(`Device query for '${entity.device.ieeeAddr}' started`); - for (const converter of mappedModel.toZigbee) { - if (converter.hasOwnProperty('convertGet')) { - for (const ckey of converter.key) { - try { - await converter.convertGet(entity.device.endpoints[0], ckey, {}); - } catch (error) { - this.log.warn(`Failed to read state '${JSON.stringify(ckey)}'of '${entity.device.ieeeAddr}' after query with '${JSON.stringify(error)}'`); - + return; + } + + if (stateDesc.isOption) { + // acknowledge state with given value + this.acknowledgeState(deviceId, model, stateDesc, value); + // process sync state list + //this.processSyncStatesList(deviceId, modelId, syncStateList); + // if this is the device query state => trigger the device query + + // on activation of the 'device_query' state trigger hardware query where possible + if (stateDesc.id === 'device_query') { + if (this.query_device_block.indexOf(deviceId) > -1) { + this.log.warn(`Device query for '${entity.device.ieeeAddr}' blocked`); + return; + } + if (mappedModel) { + this.query_device_block.push(deviceId); + this.log.debug(`Device query for '${entity.device.ieeeAddr}' started`); + for (const converter of mappedModel.toZigbee) { + if (converter.hasOwnProperty('convertGet')) { + for (const ckey of converter.key) { + try { + await converter.convertGet(entity.device.endpoints[0], ckey, {}); + } catch (error) { + this.log.warn(`Failed to read state '${JSON.stringify(ckey)}'of '${entity.device.ieeeAddr}' after query with '${JSON.stringify(error)}'`); + + } } } } + this.log.debug(`Device query for '${entity.device.ieeeAddr}' done`); + const idToRemove = deviceId; + setTimeout(() => { + const idx = this.query_device_block.indexOf(idToRemove); + if (idx > -1) { + this.query_device_block.splice(idx); + } + }, 10000); } - this.log.debug(`Device query for '${entity.device.ieeeAddr}' done`); - const idToRemove = deviceId; - setTimeout(() => { - const idx = this.query_device_block.indexOf(idToRemove); - if (idx > -1) { - this.query_device_block.splice(idx); - } - }, 10000); + return; } return; } - return; - } - const converter = mappedModel.toZigbee.find(c => c && (c.key.includes(stateDesc.prop) || c.key.includes(stateDesc.setattr) || c.key.includes(stateDesc.id))); - if (!converter) { - this.log.error(`No converter available for '${model}' with key '${stateDesc.id}' `); - this.sendError(`No converter available for '${model}' with key '${stateDesc.id}' `); - return; - } - - const preparedValue = (stateDesc.setter) ? stateDesc.setter(value, options) : value; - const preparedOptions = (stateDesc.setterOpt) ? stateDesc.setterOpt(value, options) : {}; - let syncStateList = []; - if (stateModel && stateModel.syncStates) { - stateModel.syncStates.forEach(syncFunct => { - const res = syncFunct(stateDesc, value, options); - if (res) { - syncStateList = syncStateList.concat(res); - } - }); - } - - const epName = stateDesc.epname !== undefined ? stateDesc.epname : (stateDesc.prop || stateDesc.id); - const key = stateDesc.setattr || stateDesc.prop || stateDesc.id; - this.log.debug(`convert ${key}, ${safeJsonStringify(preparedValue)}, ${safeJsonStringify(preparedOptions)}`); - - let target; - if (model === 'group') { - target = entity.mapped; - } else { - target = await this.zbController.resolveEntity(deviceId, epName); - target = target.endpoint; - } - - this.log.debug(`target: ${safeJsonStringify(target)}`); - - const meta = { - endpoint_name: epName, - options: preparedOptions, - device: entity.device, - mapped: model === 'group' ? [] : mappedModel, - message: {[key]: preparedValue}, - logger: this.log, - state: {}, - }; - if (preparedOptions.hasOwnProperty('state')) { - meta.state = preparedOptions.state; - } - try { - const result = await converter.convertSet(target, key, preparedValue, meta); - this.log.debug(`convert result ${safeJsonStringify(result)}`); - if (result !== undefined) { - if (stateModel && !isGroup) { - this.acknowledgeState(deviceId, model, stateDesc, value); - } - // process sync state list - this.processSyncStatesList(deviceId, model, syncStateList); - - if (isGroup) { - await this.callPluginMethod('queryGroupMemberState', [deviceId, stateDesc]); - this.acknowledgeState(deviceId, model, stateDesc, value); + const converter = mappedModel.toZigbee.find(c => c && (c.key.includes(stateDesc.prop) || c.key.includes(stateDesc.setattr) || c.key.includes(stateDesc.id))); + if (!converter) { + this.log.error(`No converter available for '${model}' with key '${stateDesc.id}' `); + this.sendError(`No converter available for '${model}' with key '${stateDesc.id}' `); + return; + } + + const preparedValue = (stateDesc.setter) ? stateDesc.setter(value, options) : value; + const preparedOptions = (stateDesc.setterOpt) ? stateDesc.setterOpt(value, options) : {}; + let syncStateList = []; + if (stateModel && stateModel.syncStates) { + stateModel.syncStates.forEach(syncFunct => { + const res = syncFunct(stateDesc, value, options); + if (res) { + syncStateList = syncStateList.concat(res); + } + }); + } + + const epName = stateDesc.epname !== undefined ? stateDesc.epname : (stateDesc.prop || stateDesc.id); + const key = stateDesc.setattr || stateDesc.prop || stateDesc.id; + this.log.debug(`convert ${key}, ${safeJsonStringify(preparedValue)}, ${safeJsonStringify(preparedOptions)}`); + + let target; + if (model === 'group') { + target = entity.mapped; + } else { + target = await this.zbController.resolveEntity(deviceId, epName); + target = target.endpoint; + } + + this.log.debug(`target: ${safeJsonStringify(target)}`); + + const meta = { + endpoint_name: epName, + options: preparedOptions, + device: entity.device, + mapped: model === 'group' ? [] : mappedModel, + message: {[key]: preparedValue}, + logger: this.log, + state: {}, + }; + + if (preparedOptions.hasOwnProperty('state')) { + meta.state = preparedOptions.state; + } + + try { + const result = await converter.convertSet(target, key, preparedValue, meta); + this.log.debug(`convert result ${safeJsonStringify(result)}`); + if (result !== undefined) { + if (stateModel && !isGroup) { + this.acknowledgeState(deviceId, model, stateDesc, value); + } + // process sync state list + this.processSyncStatesList(deviceId, model, syncStateList); + + if (isGroup) { + await this.callPluginMethod('queryGroupMemberState', [deviceId, stateDesc]); + this.acknowledgeState(deviceId, model, stateDesc, value); + } } + + } catch (error) { + this.filterError(`Error ${error.code} on send command to ${deviceId}.` + + ` Error: ${error.stack}`, `Send command to ${deviceId} failed with`, error); } - } catch (error) { - this.filterError(`Error ${error.code} on send command to ${deviceId}.` + - ` Error: ${error.stack}`, `Send command to ${deviceId} failed with`, error); - } - }); + }); + } catch (err) { + this.log.error(`No entity for ${deviceId}`); + } } // This function is introduced to explicitly allow user level scripts to send Commands @@ -917,7 +928,6 @@ class Zigbee extends utils.Adapter { if (Number.isInteger(data)) { _pairingMode = true; this.setState('info.pairingCountdown', data, true); - _pairingMode = true; } if (data === 0) { // set pairing mode off diff --git a/package-lock.json b/package-lock.json index 2c68fc13..e4f37089 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,20 +1,23 @@ { "name": "iobroker.zigbee", - "version": "1.8.11", + "version": "1.8.12", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "iobroker.zigbee", - "version": "1.8.11", + "version": "1.8.12", "license": "MIT", "dependencies": { "@iobroker/adapter-core": "^2.6.8", + "serialport": "^11.0.0", - "tar": "^6.1.13", - "typescript": "^5.0.4", - "zigbee-herdsman": "0.14.111", - "zigbee-herdsman-converters": "15.0.100" + + "tar": "^6.1.15", + "typescript": "^5.1.6", + "zigbee-herdsman": "0.16.0", + "zigbee-herdsman-converters": "15.33.0" + }, "devDependencies": { "@alcalzone/release-script": "^3.5.9", @@ -24,7 +27,7 @@ "axios": "^1.3.4", "chai": "^4.3.7", "chai-as-promised": "^7.1.1", - "eslint": "^8.37.0", + "eslint": "^8.44.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-prettier": "^4.2.1", "gulp": "^4.0.2", @@ -40,6 +43,15 @@ "serialport": "^11.0.0" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@alcalzone/pak": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@alcalzone/pak/-/pak-0.8.1.tgz", @@ -259,14 +271,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.1", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -282,18 +294,18 @@ } }, "node_modules/@eslint/js": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.37.0.tgz", - "integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -347,6 +359,11 @@ "sinon-chai": "^3.7.0" } }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -400,6 +417,7 @@ "resolved": "https://registry.npmjs.org/@serialport/bindings-cpp/-/bindings-cpp-10.8.0.tgz", "integrity": "sha512-OMQNJz5kJblbmZN5UgJXLwi2XNtVLxSKmq5VyWuXQVsUIJD4l9UGHnLPqM5LD9u3HPZgDI5w7iYN7gxkQNZJUw==", "hasInstallScript": true, + "optional": true, "dependencies": { "@serialport/bindings-interface": "1.2.2", "@serialport/parser-readline": "^10.2.1", @@ -544,6 +562,7 @@ "version": "10.5.0", "resolved": "https://registry.npmjs.org/@serialport/stream/-/stream-10.5.0.tgz", "integrity": "sha512-gbcUdvq9Kyv2HsnywS7QjnEB28g+6OGB5Z8TLP7X+UPpoMIWoUsoQIq5Kt0ZTgMoWn3JGM2lqwTsSHF+1qhniA==", + "optional": true, "dependencies": { "@serialport/bindings-interface": "1.2.2", "debug": "^4.3.2" @@ -650,21 +669,10 @@ "@types/node": "*" } }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -683,14 +691,14 @@ } }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dependencies": { - "debug": "4" + "debug": "^4.3.4" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 14" } }, "node_modules/ajv": { @@ -886,6 +894,11 @@ "node": ">=0.10.0" } }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, "node_modules/array-initial": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", @@ -1040,9 +1053,9 @@ } }, "node_modules/b4a": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.1.tgz", - "integrity": "sha512-AsKjNhz72yxteo/0EtQEiwkMUgk/tGmycXlbG4g3Ard2/ULtNLUykGOkeK0egmN27h0xMAhb76jYccW+XTBExA==" + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" }, "node_modules/bach": { "version": "1.2.0", @@ -1137,25 +1150,6 @@ "node": ">=0.10.0" } }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/beeper": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/beeper/-/beeper-2.1.0.tgz", @@ -1199,36 +1193,23 @@ "file-uri-to-path": "1.0.0" } }, - "node_modules/bl": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-6.0.0.tgz", - "integrity": "sha512-Ik9BVIMdcWzSOCpzDv2XpQ4rJ4oZBuk3ck6MgiOv0EopdgtohN2uSCrrLlkH1Jf0KnpZZMBA3D0bUMbCdj/jgA==", - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^4.2.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.2.0.tgz", - "integrity": "sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A==", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, + "node_modules/bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1266,29 +1247,6 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -1919,6 +1877,22 @@ "node": ">=0.3.1" } }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" + }, + "node_modules/dns-packet": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -2165,16 +2139,16 @@ } }, "node_modules/eslint": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.37.0.tgz", - "integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.37.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -2183,9 +2157,9 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2193,20 +2167,19 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -2255,9 +2228,9 @@ } }, "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -2265,12 +2238,15 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2280,14 +2256,14 @@ } }, "node_modules/espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", + "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2338,22 +2314,6 @@ "node": ">=0.10.0" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -2587,9 +2547,9 @@ "dev": true }, "node_modules/fast-fifo": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.1.0.tgz", - "integrity": "sha512-Kl29QoNbNvn4nhDsLYjyIAaIqaJB6rBx5p3sL9VjaefJ+eMFBWVZiaoguaoZfzEKr5RhAti0UgM8703akGPJ6g==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.0.tgz", + "integrity": "sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw==" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", @@ -3119,10 +3079,10 @@ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "node_modules/gulp": { @@ -3487,15 +3447,15 @@ } }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.0.tgz", + "integrity": "sha512-0euwPCRyAPSgGdzD1IVN9nJYHtBhJwb6XPfbpQcYbPCwrBidX6GzxmchnaF4sfF/jPb74Ojx5g4yTg3sixlyPw==", "dependencies": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/human-signals": { @@ -3507,25 +3467,6 @@ "node": ">=10.17.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -3573,7 +3514,8 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "node_modules/ini": { "version": "1.3.8", @@ -3931,16 +3873,6 @@ "url": "https://bevry.me/fund" } }, - "node_modules/js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -4821,6 +4753,18 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, "node_modules/mute-stdout": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", @@ -4982,7 +4926,8 @@ "node_modules/node-addon-api": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", - "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" + "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==", + "optional": true }, "node_modules/node-gyp-build": { "version": "4.6.0", @@ -5267,17 +5212,17 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -5629,14 +5574,6 @@ "node": ">= 0.8" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -6783,9 +6720,9 @@ "dev": true }, "node_modules/streamx": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.13.0.tgz", - "integrity": "sha512-9jD4uoX0juNSIcv4PazT+97FpM4Mww3cp7PM23HRTLANhgb7K7n1mB45guH/kT5F4enl04kApOM3EeoUXSPfvw==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.0.tgz", + "integrity": "sha512-HcxY6ncGjjklGs1xsP1aR71INYcsXFJet5CU1CHqihQ2J5nOsbd4OjgjHO42w/4QNv9gZb3BueV+Vxok5pLEXg==", "dependencies": { "fast-fifo": "^1.1.0", "queue-tick": "^1.0.1" @@ -6900,13 +6837,13 @@ "dev": true }, "node_modules/tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" @@ -6916,19 +6853,19 @@ } }, "node_modules/tar-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.0.0.tgz", - "integrity": "sha512-O6OfUKBbQOqAhh6owTWmA730J/yZCYcpmZ1DBj2YX51ZQrt7d7NgzrR+CnO9wP6nt/viWZW2XeXLavX3/ZEbEg==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.4.tgz", + "integrity": "sha512-IlHr7ZOW6XaVBCrSCokUJG4IqUuRcWW76B8XbrtCotbaDh6zVGE7WPCzaSz1CN+acFmWiwoa+cE4RZsom0RzXg==", "dependencies": { - "b4a": "^1.6.1", - "bl": "^6.0.0", - "streamx": "^2.12.5" + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" } }, "node_modules/tar/node_modules/minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.1.tgz", - "integrity": "sha512-V9esFpNbK0arbN3fm2sxDKqMYgIp7XtVdE4Esj+PE4Qaaxdg1wIw48ITQIOn1sc8xXSmUviVL3cyjMqPlrVkiA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "engines": { "node": ">=8" } @@ -6990,6 +6927,11 @@ "xtend": "~4.0.0" } }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, "node_modules/time-stamp": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", @@ -7193,15 +7135,15 @@ "dev": true }, "node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=12.20" + "node": ">=14.17" } }, "node_modules/uc.micro": { @@ -7511,15 +7453,6 @@ "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==", "dev": true }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", @@ -7642,13 +7575,14 @@ } }, "node_modules/zigbee-herdsman": { - "version": "0.14.111", - "resolved": "https://registry.npmjs.org/zigbee-herdsman/-/zigbee-herdsman-0.14.111.tgz", - "integrity": "sha512-gN3CzIos/Z9/cHIApz1ppqmicZsaQl2Ub+lIqhaxP2ht8BFKWC5OJctB6JRSPCp1tNlItfsmXJ/9PaYygqahDg==", - "dependencies": { - "@serialport/bindings-cpp": "^10.8.0", - "@serialport/parser-delimiter": "^10.5.0", - "@serialport/stream": "^10.5.0", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/zigbee-herdsman/-/zigbee-herdsman-0.16.0.tgz", + "integrity": "sha512-P9uerqilwpm+kwswXGUtvuQubQWEb9hG2UVqslG0lfPsEVC4oKKYVjxoKcVA/INNKQaJC7XSfpMNX+kHu7eowg==", + "dependencies": { + "@serialport/bindings-cpp": "^11.0.1", + "@serialport/parser-delimiter": "^11.0.0", + "@serialport/stream": "^11.0.0", + "bonjour-service": "^1.1.1", "debounce": "^1.2.1", "debug": "^4.3.4", "fast-deep-equal": "^3.1.3", @@ -7658,19 +7592,142 @@ } }, "node_modules/zigbee-herdsman-converters": { - "version": "15.0.100", - "resolved": "https://registry.npmjs.org/zigbee-herdsman-converters/-/zigbee-herdsman-converters-15.0.100.tgz", - "integrity": "sha512-4E5EVfz0cHsYsXit+enfMrSkyiN1f2WO02mWqnnVnTyzODu5EdzRyyDcBO1YW6t9HITXmQSnaLIogx5nPxHCZQ==", + "version": "15.33.0", + "resolved": "https://registry.npmjs.org/zigbee-herdsman-converters/-/zigbee-herdsman-converters-15.33.0.tgz", + "integrity": "sha512-erd1hrn5+7TkX9VkxhJ4zEdVBpdH6tKbU5atIlGJvauys2Ft1gyjv0zgLxthwO7Rk9sekG3+BSSKR2mneyUbeA==", "dependencies": { "axios": "^1.4.0", "buffer-crc32": "^0.2.13", - "https-proxy-agent": "^5.0.1", - "tar-stream": "^3.0.0", - "zigbee-herdsman": "0.14.111" + "https-proxy-agent": "^7.0.0", + "tar-stream": "^3.1.4", + "zigbee-herdsman": "^0.15.2" + } + }, + "node_modules/zigbee-herdsman-converters/node_modules/@serialport/bindings-cpp": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@serialport/bindings-cpp/-/bindings-cpp-11.0.1.tgz", + "integrity": "sha512-3I1mniVg3osYuIUXxU0jB5AHPsxWmErmc3JC3WfUSlfXsjWMHkHfFzbW9Scuv/z/6DLCJIDyltabRa2FoW2qsQ==", + "hasInstallScript": true, + "dependencies": { + "@serialport/bindings-interface": "1.2.2", + "@serialport/parser-readline": "10.5.0", + "debug": "4.3.4", + "node-addon-api": "6.1.0", + "node-gyp-build": "4.6.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/zigbee-herdsman-converters/node_modules/@serialport/parser-delimiter": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-11.0.0.tgz", + "integrity": "sha512-aZLJhlRTjSmEwllLG7S4J8s8ctRAS0cbvCpO87smLvl3e4BgzbVgF6Z6zaJd3Aji2uSiYgfedCdNc4L6W+1E2g==", + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/zigbee-herdsman-converters/node_modules/@serialport/stream": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@serialport/stream/-/stream-11.0.0.tgz", + "integrity": "sha512-Zty7B8C1H2XRnay2mVmW1ygEHXRHXQDcaC5wAVvOZMbQSc7ye03rMlPvviDS+pGxU2t2A2bMo34CUrRduSBong==", + "dependencies": { + "@serialport/bindings-interface": "1.2.2", + "debug": "4.3.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" } + }, + "node_modules/zigbee-herdsman-converters/node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" + }, + "node_modules/zigbee-herdsman-converters/node_modules/zigbee-herdsman": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/zigbee-herdsman/-/zigbee-herdsman-0.15.3.tgz", + "integrity": "sha512-1sfGMW0tBe/5LLbx0pgIzNT0r8vIDho0XLxAs1jthQa2uCoCLRDJLX4r6e1MH//5o/M/GozSXcR0APV9rH1vkA==", + "dependencies": { + "@serialport/bindings-cpp": "^11.0.1", + "@serialport/parser-delimiter": "^11.0.0", + "@serialport/stream": "^11.0.0", + "bonjour-service": "^1.1.1", + "debounce": "^1.2.1", + "debug": "^4.3.4", + "fast-deep-equal": "^3.1.3", + "mixin-deep": "^2.0.1", + "mz": "^2.7.0", + "slip": "^1.0.2" + } + }, + "node_modules/zigbee-herdsman/node_modules/@serialport/bindings-cpp": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@serialport/bindings-cpp/-/bindings-cpp-11.0.1.tgz", + "integrity": "sha512-3I1mniVg3osYuIUXxU0jB5AHPsxWmErmc3JC3WfUSlfXsjWMHkHfFzbW9Scuv/z/6DLCJIDyltabRa2FoW2qsQ==", + "hasInstallScript": true, + "dependencies": { + "@serialport/bindings-interface": "1.2.2", + "@serialport/parser-readline": "10.5.0", + "debug": "4.3.4", + "node-addon-api": "6.1.0", + "node-gyp-build": "4.6.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/zigbee-herdsman/node_modules/@serialport/parser-delimiter": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-11.0.0.tgz", + "integrity": "sha512-aZLJhlRTjSmEwllLG7S4J8s8ctRAS0cbvCpO87smLvl3e4BgzbVgF6Z6zaJd3Aji2uSiYgfedCdNc4L6W+1E2g==", + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/zigbee-herdsman/node_modules/@serialport/stream": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@serialport/stream/-/stream-11.0.0.tgz", + "integrity": "sha512-Zty7B8C1H2XRnay2mVmW1ygEHXRHXQDcaC5wAVvOZMbQSc7ye03rMlPvviDS+pGxU2t2A2bMo34CUrRduSBong==", + "dependencies": { + "@serialport/bindings-interface": "1.2.2", + "debug": "4.3.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/zigbee-herdsman/node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, "@alcalzone/pak": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@alcalzone/pak/-/pak-0.8.1.tgz", @@ -7851,14 +7908,14 @@ "dev": true }, "@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.1", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -7868,15 +7925,15 @@ } }, "@eslint/js": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.37.0.tgz", - "integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", "dev": true }, "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -7920,6 +7977,11 @@ "sinon-chai": "^3.7.0" } }, + "@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -7960,6 +8022,7 @@ "version": "10.8.0", "resolved": "https://registry.npmjs.org/@serialport/bindings-cpp/-/bindings-cpp-10.8.0.tgz", "integrity": "sha512-OMQNJz5kJblbmZN5UgJXLwi2XNtVLxSKmq5VyWuXQVsUIJD4l9UGHnLPqM5LD9u3HPZgDI5w7iYN7gxkQNZJUw==", + "optional": true, "requires": { "@serialport/bindings-interface": "1.2.2", "@serialport/parser-readline": "^10.2.1", @@ -8038,6 +8101,7 @@ "version": "10.5.0", "resolved": "https://registry.npmjs.org/@serialport/stream/-/stream-10.5.0.tgz", "integrity": "sha512-gbcUdvq9Kyv2HsnywS7QjnEB28g+6OGB5Z8TLP7X+UPpoMIWoUsoQIq5Kt0ZTgMoWn3JGM2lqwTsSHF+1qhniA==", + "optional": true, "requires": { "@serialport/bindings-interface": "1.2.2", "debug": "^4.3.2" @@ -8140,18 +8204,10 @@ "@types/node": "*" } }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "requires": { - "event-target-shim": "^5.0.0" - } - }, "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", "dev": true }, "acorn-jsx": { @@ -8162,11 +8218,11 @@ "requires": {} }, "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "requires": { - "debug": "4" + "debug": "^4.3.4" } }, "ajv": { @@ -8315,6 +8371,11 @@ "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", "dev": true }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, "array-initial": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", @@ -8434,9 +8495,9 @@ } }, "b4a": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.1.tgz", - "integrity": "sha512-AsKjNhz72yxteo/0EtQEiwkMUgk/tGmycXlbG4g3Ard2/ULtNLUykGOkeK0egmN27h0xMAhb76jYccW+XTBExA==" + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" }, "bach": { "version": "1.2.0", @@ -8515,11 +8576,6 @@ } } }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, "beeper": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/beeper/-/beeper-2.1.0.tgz", @@ -8551,35 +8607,23 @@ "file-uri-to-path": "1.0.0" } }, - "bl": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-6.0.0.tgz", - "integrity": "sha512-Ik9BVIMdcWzSOCpzDv2XpQ4rJ4oZBuk3ck6MgiOv0EopdgtohN2uSCrrLlkH1Jf0KnpZZMBA3D0bUMbCdj/jgA==", - "requires": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^4.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.2.0.tgz", - "integrity": "sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A==", - "requires": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10" - } - } - } - }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, + "bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "requires": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -8614,15 +8658,6 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -9111,6 +9146,19 @@ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" + }, + "dns-packet": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "requires": { + "@leichtgewicht/ip-codec": "^2.0.1" + } + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -9308,16 +9356,16 @@ "dev": true }, "eslint": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.37.0.tgz", - "integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.37.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -9326,9 +9374,9 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -9336,20 +9384,19 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -9372,9 +9419,9 @@ } }, "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -9382,20 +9429,20 @@ } }, "eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true }, "espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", + "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", "dev": true, "requires": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" + "eslint-visitor-keys": "^3.4.1" } }, "esquery": { @@ -9428,16 +9475,6 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" - }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -9639,9 +9676,9 @@ "dev": true }, "fast-fifo": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.1.0.tgz", - "integrity": "sha512-Kl29QoNbNvn4nhDsLYjyIAaIqaJB6rBx5p3sL9VjaefJ+eMFBWVZiaoguaoZfzEKr5RhAti0UgM8703akGPJ6g==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.0.tgz", + "integrity": "sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw==" }, "fast-json-stable-stringify": { "version": "2.1.0", @@ -10050,10 +10087,10 @@ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "gulp": { @@ -10350,11 +10387,11 @@ } }, "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.0.tgz", + "integrity": "sha512-0euwPCRyAPSgGdzD1IVN9nJYHtBhJwb6XPfbpQcYbPCwrBidX6GzxmchnaF4sfF/jPb74Ojx5g4yTg3sixlyPw==", "requires": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" } }, @@ -10364,11 +10401,6 @@ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, "ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -10404,7 +10436,8 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "ini": { "version": "1.3.8", @@ -10674,12 +10707,6 @@ "textextensions": "^3.2.0" } }, - "js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", - "dev": true - }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -11364,6 +11391,15 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "requires": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + } + }, "mute-stdout": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", @@ -11507,7 +11543,8 @@ "node-addon-api": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", - "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" + "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==", + "optional": true }, "node-gyp-build": { "version": "4.6.0", @@ -11724,17 +11761,17 @@ } }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" } }, "ordered-read-streams": { @@ -11990,11 +12027,6 @@ "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", "dev": true }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -12908,9 +12940,9 @@ "dev": true }, "streamx": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.13.0.tgz", - "integrity": "sha512-9jD4uoX0juNSIcv4PazT+97FpM4Mww3cp7PM23HRTLANhgb7K7n1mB45guH/kT5F4enl04kApOM3EeoUXSPfvw==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.0.tgz", + "integrity": "sha512-HcxY6ncGjjklGs1xsP1aR71INYcsXFJet5CU1CHqihQ2J5nOsbd4OjgjHO42w/4QNv9gZb3BueV+Vxok5pLEXg==", "requires": { "fast-fifo": "^1.1.0", "queue-tick": "^1.0.1" @@ -12998,33 +13030,33 @@ "dev": true }, "tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "dependencies": { "minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.1.tgz", - "integrity": "sha512-V9esFpNbK0arbN3fm2sxDKqMYgIp7XtVdE4Esj+PE4Qaaxdg1wIw48ITQIOn1sc8xXSmUviVL3cyjMqPlrVkiA==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" } } }, "tar-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.0.0.tgz", - "integrity": "sha512-O6OfUKBbQOqAhh6owTWmA730J/yZCYcpmZ1DBj2YX51ZQrt7d7NgzrR+CnO9wP6nt/viWZW2XeXLavX3/ZEbEg==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.4.tgz", + "integrity": "sha512-IlHr7ZOW6XaVBCrSCokUJG4IqUuRcWW76B8XbrtCotbaDh6zVGE7WPCzaSz1CN+acFmWiwoa+cE4RZsom0RzXg==", "requires": { - "b4a": "^1.6.1", - "bl": "^6.0.0", - "streamx": "^2.12.5" + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" } }, "text-table": { @@ -13075,6 +13107,11 @@ "xtend": "~4.0.0" } }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, "time-stamp": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", @@ -13236,9 +13273,9 @@ "dev": true }, "typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==" + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==" }, "uc.micro": { "version": "1.0.6", @@ -13496,12 +13533,6 @@ "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==", "dev": true }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, "workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", @@ -13594,31 +13625,115 @@ "dev": true }, "zigbee-herdsman": { - "version": "0.14.111", - "resolved": "https://registry.npmjs.org/zigbee-herdsman/-/zigbee-herdsman-0.14.111.tgz", - "integrity": "sha512-gN3CzIos/Z9/cHIApz1ppqmicZsaQl2Ub+lIqhaxP2ht8BFKWC5OJctB6JRSPCp1tNlItfsmXJ/9PaYygqahDg==", - "requires": { - "@serialport/bindings-cpp": "^10.8.0", - "@serialport/parser-delimiter": "^10.5.0", - "@serialport/stream": "^10.5.0", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/zigbee-herdsman/-/zigbee-herdsman-0.16.0.tgz", + "integrity": "sha512-P9uerqilwpm+kwswXGUtvuQubQWEb9hG2UVqslG0lfPsEVC4oKKYVjxoKcVA/INNKQaJC7XSfpMNX+kHu7eowg==", + "requires": { + "@serialport/bindings-cpp": "^11.0.1", + "@serialport/parser-delimiter": "^11.0.0", + "@serialport/stream": "^11.0.0", + "bonjour-service": "^1.1.1", "debounce": "^1.2.1", "debug": "^4.3.4", "fast-deep-equal": "^3.1.3", "mixin-deep": "^2.0.1", "mz": "^2.7.0", "slip": "^1.0.2" + }, + "dependencies": { + "@serialport/bindings-cpp": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@serialport/bindings-cpp/-/bindings-cpp-11.0.1.tgz", + "integrity": "sha512-3I1mniVg3osYuIUXxU0jB5AHPsxWmErmc3JC3WfUSlfXsjWMHkHfFzbW9Scuv/z/6DLCJIDyltabRa2FoW2qsQ==", + "requires": { + "@serialport/bindings-interface": "1.2.2", + "@serialport/parser-readline": "10.5.0", + "debug": "4.3.4", + "node-addon-api": "6.1.0", + "node-gyp-build": "4.6.0" + } + }, + "@serialport/parser-delimiter": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-11.0.0.tgz", + "integrity": "sha512-aZLJhlRTjSmEwllLG7S4J8s8ctRAS0cbvCpO87smLvl3e4BgzbVgF6Z6zaJd3Aji2uSiYgfedCdNc4L6W+1E2g==" + }, + "@serialport/stream": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@serialport/stream/-/stream-11.0.0.tgz", + "integrity": "sha512-Zty7B8C1H2XRnay2mVmW1ygEHXRHXQDcaC5wAVvOZMbQSc7ye03rMlPvviDS+pGxU2t2A2bMo34CUrRduSBong==", + "requires": { + "@serialport/bindings-interface": "1.2.2", + "debug": "4.3.4" + } + }, + "node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" + } } }, "zigbee-herdsman-converters": { - "version": "15.0.100", - "resolved": "https://registry.npmjs.org/zigbee-herdsman-converters/-/zigbee-herdsman-converters-15.0.100.tgz", - "integrity": "sha512-4E5EVfz0cHsYsXit+enfMrSkyiN1f2WO02mWqnnVnTyzODu5EdzRyyDcBO1YW6t9HITXmQSnaLIogx5nPxHCZQ==", + "version": "15.33.0", + "resolved": "https://registry.npmjs.org/zigbee-herdsman-converters/-/zigbee-herdsman-converters-15.33.0.tgz", + "integrity": "sha512-erd1hrn5+7TkX9VkxhJ4zEdVBpdH6tKbU5atIlGJvauys2Ft1gyjv0zgLxthwO7Rk9sekG3+BSSKR2mneyUbeA==", "requires": { "axios": "^1.4.0", "buffer-crc32": "^0.2.13", - "https-proxy-agent": "^5.0.1", - "tar-stream": "^3.0.0", - "zigbee-herdsman": "0.14.111" + "https-proxy-agent": "^7.0.0", + "tar-stream": "^3.1.4", + "zigbee-herdsman": "^0.15.2" + }, + "dependencies": { + "@serialport/bindings-cpp": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@serialport/bindings-cpp/-/bindings-cpp-11.0.1.tgz", + "integrity": "sha512-3I1mniVg3osYuIUXxU0jB5AHPsxWmErmc3JC3WfUSlfXsjWMHkHfFzbW9Scuv/z/6DLCJIDyltabRa2FoW2qsQ==", + "requires": { + "@serialport/bindings-interface": "1.2.2", + "@serialport/parser-readline": "10.5.0", + "debug": "4.3.4", + "node-addon-api": "6.1.0", + "node-gyp-build": "4.6.0" + } + }, + "@serialport/parser-delimiter": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-11.0.0.tgz", + "integrity": "sha512-aZLJhlRTjSmEwllLG7S4J8s8ctRAS0cbvCpO87smLvl3e4BgzbVgF6Z6zaJd3Aji2uSiYgfedCdNc4L6W+1E2g==" + }, + "@serialport/stream": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@serialport/stream/-/stream-11.0.0.tgz", + "integrity": "sha512-Zty7B8C1H2XRnay2mVmW1ygEHXRHXQDcaC5wAVvOZMbQSc7ye03rMlPvviDS+pGxU2t2A2bMo34CUrRduSBong==", + "requires": { + "@serialport/bindings-interface": "1.2.2", + "debug": "4.3.4" + } + }, + "node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" + }, + "zigbee-herdsman": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/zigbee-herdsman/-/zigbee-herdsman-0.15.3.tgz", + "integrity": "sha512-1sfGMW0tBe/5LLbx0pgIzNT0r8vIDho0XLxAs1jthQa2uCoCLRDJLX4r6e1MH//5o/M/GozSXcR0APV9rH1vkA==", + "requires": { + "@serialport/bindings-cpp": "^11.0.1", + "@serialport/parser-delimiter": "^11.0.0", + "@serialport/stream": "^11.0.0", + "bonjour-service": "^1.1.1", + "debounce": "^1.2.1", + "debug": "^4.3.4", + "fast-deep-equal": "^3.1.3", + "mixin-deep": "^2.0.1", + "mz": "^2.7.0", + "slip": "^1.0.2" + } + } } } } diff --git a/package.json b/package.json index 5fb88cff..d4374453 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iobroker.zigbee", - "version": "1.8.11", + "version": "1.8.15", "author": { "name": "Kirov Ilya", "email": "kirovilya@gmail.com" @@ -22,10 +22,10 @@ }, "dependencies": { "@iobroker/adapter-core": "^2.6.8", - "tar": "^6.1.13", - "typescript": "^5.0.4", - "zigbee-herdsman": "0.14.111", - "zigbee-herdsman-converters": "15.0.100" + "tar": "^6.1.15", + "typescript": "^5.1.6", + "zigbee-herdsman": "0.17.1", + "zigbee-herdsman-converters": "15.38.0" }, "description": "Zigbee devices", "devDependencies": { @@ -36,7 +36,7 @@ "axios": "^1.3.4", "chai": "^4.3.7", "chai-as-promised": "^7.1.1", - "eslint": "^8.37.0", + "eslint": "^8.44.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-prettier": "^4.2.1", "gulp": "^4.0.2",