iobroker.homewizard 0.3.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -4
- package/admin/i18n/de/translations.json +9 -4
- package/admin/i18n/en/translations.json +9 -4
- package/admin/i18n/es/translations.json +9 -4
- package/admin/i18n/fr/translations.json +9 -4
- package/admin/i18n/it/translations.json +9 -4
- package/admin/i18n/nl/translations.json +9 -4
- package/admin/i18n/pl/translations.json +9 -4
- package/admin/i18n/pt/translations.json +11 -6
- package/admin/i18n/ru/translations.json +9 -4
- package/admin/i18n/uk/translations.json +9 -4
- package/admin/i18n/zh-cn/translations.json +9 -4
- package/admin/jsonConfig.json +31 -4
- package/build/lib/websocket-client.js +3 -3
- package/build/lib/websocket-client.js.map +2 -2
- package/io-package.json +27 -14
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -51,14 +51,34 @@ Real-time energy monitoring from HomeWizard devices via API v2 with WebSocket pu
|
|
|
51
51
|
|
|
52
52
|
## Configuration
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
### Prerequisites
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
The **local API** must be enabled on your HomeWizard device:
|
|
57
|
+
|
|
58
|
+
1. Open the **HomeWizard app** on your phone
|
|
59
|
+
2. Go to **Settings** > **Meters** > select your device > **Local API** > **Enable**
|
|
60
|
+
|
|
61
|
+
### Adding a device (automatic via mDNS)
|
|
62
|
+
|
|
63
|
+
1. Go to the **Objects** tab in ioBroker Admin
|
|
57
64
|
2. Set `homewizard.0.startPairing` to `true`
|
|
58
65
|
3. **Press the physical button** on your HomeWizard device within 60 seconds
|
|
59
|
-
4. The device is discovered automatically and appears
|
|
66
|
+
4. The device is discovered automatically and appears under `homewizard.0`
|
|
60
67
|
|
|
61
|
-
|
|
68
|
+
### Adding a device (manual IP)
|
|
69
|
+
|
|
70
|
+
If mDNS is not available (e.g. different VLAN, Docker, or firewall blocking multicast):
|
|
71
|
+
|
|
72
|
+
1. Set `homewizard.0.pairingIp` to the IP address of your device
|
|
73
|
+
2. Set `homewizard.0.startPairing` to `true`
|
|
74
|
+
3. **Press the physical button** on the device within 60 seconds
|
|
75
|
+
|
|
76
|
+
### Managing devices
|
|
77
|
+
|
|
78
|
+
All paired devices are listed in the **Objects** tab under `homewizard.0`. Each device has its own folder (e.g. `hwe-p1_5c2fafaabbcc`) with measurement data, system settings, and device info.
|
|
79
|
+
|
|
80
|
+
- **Remove a device:** Set its `remove` data point to `true` — the device and all data points are deleted immediately
|
|
81
|
+
- **IP changes:** Handled automatically via mDNS. No manual action needed
|
|
62
82
|
|
|
63
83
|
---
|
|
64
84
|
|
|
@@ -134,6 +154,12 @@ homewizard.0.
|
|
|
134
154
|
|
|
135
155
|
## Changelog
|
|
136
156
|
|
|
157
|
+
### 0.3.2 (2026-04-05)
|
|
158
|
+
- Improve Admin UI and README with detailed configuration guide
|
|
159
|
+
|
|
160
|
+
### 0.3.1 (2026-04-05)
|
|
161
|
+
- Fix uncaught exception on device removal (invalid WebSocket frame during close)
|
|
162
|
+
|
|
137
163
|
### 0.3.0 (2026-04-05)
|
|
138
164
|
- Store device config in device objects (no adapter restart on pairing/remove)
|
|
139
165
|
- Fix datapoint issues (startPairing, pairingIp, button states)
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
-
"headerPairing": "
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
2
|
+
"headerPairing": "Gerät hinzufügen",
|
|
3
|
+
"pairingAutoHeader": "Automatisch (mDNS)",
|
|
4
|
+
"pairingAutoInfo": "1. Gehe zum Objekte-Tab und setze 'homewizard.0.startPairing' auf true.\n2. Drücke innerhalb von 60 Sekunden den physischen Knopf am HomeWizard-Gerät.\n3. Das Gerät wird automatisch erkannt und erscheint unter dieser Adapterinstanz.",
|
|
5
|
+
"pairingManualHeader": "Manuell (feste IP)",
|
|
6
|
+
"pairingManualInfo": "Falls mDNS nicht verfügbar ist (z.B. anderes VLAN oder Docker):\n1. Setze 'homewizard.0.pairingIp' auf die IP-Adresse des Geräts.\n2. Setze dann 'homewizard.0.startPairing' auf true.\n3. Drücke innerhalb von 60 Sekunden den physischen Knopf am Gerät.",
|
|
7
|
+
"headerDevices": "Geräte verwalten",
|
|
8
|
+
"devicesInfo": "Alle gekoppelten Geräte sind im Objekte-Tab unter 'homewizard.0' aufgelistet. Jedes Gerät hat einen eigenen Ordner (z.B. hwe-p1_5c2fafaabbcc) mit Messdaten, Systemeinstellungen und Geräteinformationen.\n\nUm ein Gerät zu entfernen, setze dessen 'remove'-Datenpunkt auf true. Das Gerät und alle zugehörigen Datenpunkte werden sofort gelöscht.",
|
|
9
|
+
"headerPrerequisites": "Voraussetzungen",
|
|
10
|
+
"prerequisitesInfo": "Die lokale API muss am HomeWizard-Gerät aktiviert sein. Öffne die HomeWizard-App → Einstellungen → Messgeräte → dein Gerät → Lokale API → Aktivieren.",
|
|
6
11
|
"supportHeader": "Unterstützung",
|
|
7
12
|
"aboutInfo": "Dieser Adapter ist kostenlos und Open Source. Wenn er dir nützlich ist, erwäge die Entwicklung zu unterstützen:",
|
|
8
13
|
"donateKofi": "Ko-fi",
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
-
"headerPairing": "
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
2
|
+
"headerPairing": "Add Device",
|
|
3
|
+
"pairingAutoHeader": "Automatic (mDNS)",
|
|
4
|
+
"pairingAutoInfo": "1. Go to the Objects tab and set 'homewizard.0.startPairing' to true.\n2. Press the physical button on your HomeWizard device within 60 seconds.\n3. The device is discovered automatically and appears under this adapter instance.",
|
|
5
|
+
"pairingManualHeader": "Manual (fixed IP)",
|
|
6
|
+
"pairingManualInfo": "If mDNS is not available (e.g. different VLAN or Docker):\n1. Set 'homewizard.0.pairingIp' to the IP address of your device.\n2. Then set 'homewizard.0.startPairing' to true.\n3. Press the physical button on the device within 60 seconds.",
|
|
7
|
+
"headerDevices": "Manage Devices",
|
|
8
|
+
"devicesInfo": "All paired devices are listed in the Objects tab under 'homewizard.0'. Each device has its own folder (e.g. hwe-p1_5c2fafaabbcc) with measurement data, system settings, and device info.\n\nTo remove a device, set its 'remove' data point to true. The device and all its data points will be deleted immediately.",
|
|
9
|
+
"headerPrerequisites": "Prerequisites",
|
|
10
|
+
"prerequisitesInfo": "The local API must be enabled on your HomeWizard device. Open the HomeWizard app → Settings → Meters → your device → Local API → Enable.",
|
|
6
11
|
"supportHeader": "Support",
|
|
7
12
|
"aboutInfo": "This adapter is free and open source. If you find it useful, consider supporting the development:",
|
|
8
13
|
"donateKofi": "Ko-fi",
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
-
"headerPairing": "
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
2
|
+
"headerPairing": "Agregar dispositivo",
|
|
3
|
+
"pairingAutoHeader": "Automático (mDNS)",
|
|
4
|
+
"pairingAutoInfo": "1. Ve a la pestaña Objetos y establece 'homewizard.0.startPairing' en true.\n2. Presiona el botón físico en tu dispositivo HomeWizard dentro de 60 segundos.\n3. El dispositivo se descubre automáticamente y aparece bajo esta instancia del adaptador.",
|
|
5
|
+
"pairingManualHeader": "Manual (IP fija)",
|
|
6
|
+
"pairingManualInfo": "Si mDNS no está disponible (ej.: VLAN diferente o Docker):\n1. Establece 'homewizard.0.pairingIp' en la dirección IP del dispositivo.\n2. Luego establece 'homewizard.0.startPairing' en true.\n3. Presiona el botón físico en el dispositivo dentro de 60 segundos.",
|
|
7
|
+
"headerDevices": "Gestionar dispositivos",
|
|
8
|
+
"devicesInfo": "Todos los dispositivos emparejados están listados en la pestaña Objetos bajo 'homewizard.0'. Cada dispositivo tiene su propia carpeta (ej.: hwe-p1_5c2fafaabbcc) con datos de medición, configuraciones del sistema e información del dispositivo.\n\nPara eliminar un dispositivo, establece su punto de datos 'remove' en true. El dispositivo y todos sus puntos de datos se eliminarán inmediatamente.",
|
|
9
|
+
"headerPrerequisites": "Requisitos previos",
|
|
10
|
+
"prerequisitesInfo": "La API local debe estar activada en tu dispositivo HomeWizard. Abre la app HomeWizard → Configuración → Medidores → tu dispositivo → API Local → Activar.",
|
|
6
11
|
"supportHeader": "Apoyo",
|
|
7
12
|
"aboutInfo": "Este adaptador es gratuito y de código abierto. Si te resulta útil, considera apoyar el desarrollo:",
|
|
8
13
|
"donateKofi": "Ko-fi",
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
-
"headerPairing": "
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
2
|
+
"headerPairing": "Ajouter un appareil",
|
|
3
|
+
"pairingAutoHeader": "Automatique (mDNS)",
|
|
4
|
+
"pairingAutoInfo": "1. Allez dans l'onglet Objets et définissez 'homewizard.0.startPairing' sur true.\n2. Appuyez sur le bouton physique de votre appareil HomeWizard dans les 60 secondes.\n3. L'appareil est découvert automatiquement et apparaît sous cette instance d'adaptateur.",
|
|
5
|
+
"pairingManualHeader": "Manuel (IP fixe)",
|
|
6
|
+
"pairingManualInfo": "Si mDNS n'est pas disponible (ex. : VLAN différent ou Docker) :\n1. Définissez 'homewizard.0.pairingIp' sur l'adresse IP de l'appareil.\n2. Puis définissez 'homewizard.0.startPairing' sur true.\n3. Appuyez sur le bouton physique de l'appareil dans les 60 secondes.",
|
|
7
|
+
"headerDevices": "Gérer les appareils",
|
|
8
|
+
"devicesInfo": "Tous les appareils appairés sont listés dans l'onglet Objets sous 'homewizard.0'. Chaque appareil a son propre dossier (ex. : hwe-p1_5c2fafaabbcc) avec les données de mesure, les paramètres système et les informations de l'appareil.\n\nPour supprimer un appareil, définissez son point de données 'remove' sur true. L'appareil et tous ses points de données seront supprimés immédiatement.",
|
|
9
|
+
"headerPrerequisites": "Prérequis",
|
|
10
|
+
"prerequisitesInfo": "L'API locale doit être activée sur votre appareil HomeWizard. Ouvrez l'application HomeWizard → Paramètres → Compteurs → votre appareil → API Locale → Activer.",
|
|
6
11
|
"supportHeader": "Soutien",
|
|
7
12
|
"aboutInfo": "Cet adaptateur est gratuit et open source. Si vous le trouvez utile, envisagez de soutenir le développement :",
|
|
8
13
|
"donateKofi": "Ko-fi",
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
-
"headerPairing": "
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
2
|
+
"headerPairing": "Aggiungi dispositivo",
|
|
3
|
+
"pairingAutoHeader": "Automatico (mDNS)",
|
|
4
|
+
"pairingAutoInfo": "1. Vai alla scheda Oggetti e imposta 'homewizard.0.startPairing' su true.\n2. Premi il pulsante fisico sul dispositivo HomeWizard entro 60 secondi.\n3. Il dispositivo viene scoperto automaticamente e appare sotto questa istanza dell'adattatore.",
|
|
5
|
+
"pairingManualHeader": "Manuale (IP fisso)",
|
|
6
|
+
"pairingManualInfo": "Se mDNS non è disponibile (es. VLAN diverso o Docker):\n1. Imposta 'homewizard.0.pairingIp' sull'indirizzo IP del dispositivo.\n2. Poi imposta 'homewizard.0.startPairing' su true.\n3. Premi il pulsante fisico sul dispositivo entro 60 secondi.",
|
|
7
|
+
"headerDevices": "Gestione dispositivi",
|
|
8
|
+
"devicesInfo": "Tutti i dispositivi associati sono elencati nella scheda Oggetti sotto 'homewizard.0'. Ogni dispositivo ha la propria cartella (es. hwe-p1_5c2fafaabbcc) con dati di misurazione, impostazioni di sistema e informazioni sul dispositivo.\n\nPer rimuovere un dispositivo, imposta il suo punto dati 'remove' su true. Il dispositivo e tutti i suoi punti dati verranno eliminati immediatamente.",
|
|
9
|
+
"headerPrerequisites": "Prerequisiti",
|
|
10
|
+
"prerequisitesInfo": "L'API locale deve essere attivata sul dispositivo HomeWizard. Apri l'app HomeWizard → Impostazioni → Contatori → il tuo dispositivo → API Locale → Attiva.",
|
|
6
11
|
"supportHeader": "Supporto",
|
|
7
12
|
"aboutInfo": "Questo adattatore è gratuito e open source. Se lo trovi utile, considera di supportare lo sviluppo:",
|
|
8
13
|
"donateKofi": "Ko-fi",
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
-
"headerPairing": "
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
2
|
+
"headerPairing": "Apparaat toevoegen",
|
|
3
|
+
"pairingAutoHeader": "Automatisch (mDNS)",
|
|
4
|
+
"pairingAutoInfo": "1. Ga naar het tabblad Objecten en zet 'homewizard.0.startPairing' op true.\n2. Druk binnen 60 seconden op de fysieke knop op je HomeWizard-apparaat.\n3. Het apparaat wordt automatisch gevonden en verschijnt onder deze adapterinstantie.",
|
|
5
|
+
"pairingManualHeader": "Handmatig (vast IP)",
|
|
6
|
+
"pairingManualInfo": "Als mDNS niet beschikbaar is (bijv. ander VLAN of Docker):\n1. Stel 'homewizard.0.pairingIp' in op het IP-adres van het apparaat.\n2. Zet vervolgens 'homewizard.0.startPairing' op true.\n3. Druk binnen 60 seconden op de fysieke knop op het apparaat.",
|
|
7
|
+
"headerDevices": "Apparaten beheren",
|
|
8
|
+
"devicesInfo": "Alle gekoppelde apparaten staan in het tabblad Objecten onder 'homewizard.0'. Elk apparaat heeft een eigen map (bijv. hwe-p1_5c2fafaabbcc) met meetgegevens, systeeminstellingen en apparaatinformatie.\n\nOm een apparaat te verwijderen, zet het 'remove'-datapunt op true. Het apparaat en al zijn datapunten worden onmiddellijk verwijderd.",
|
|
9
|
+
"headerPrerequisites": "Vereisten",
|
|
10
|
+
"prerequisitesInfo": "De lokale API moet ingeschakeld zijn op je HomeWizard-apparaat. Open de HomeWizard-app → Instellingen → Meters → jouw apparaat → Lokale API → Inschakelen.",
|
|
6
11
|
"supportHeader": "Ondersteuning",
|
|
7
12
|
"aboutInfo": "Deze adapter is gratis en open source. Als je het nuttig vindt, overweeg dan de ontwikkeling te steunen:",
|
|
8
13
|
"donateKofi": "Ko-fi",
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
-
"headerPairing": "
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
2
|
+
"headerPairing": "Dodaj urządzenie",
|
|
3
|
+
"pairingAutoHeader": "Automatycznie (mDNS)",
|
|
4
|
+
"pairingAutoInfo": "1. Przejdź do zakładki Obiekty i ustaw 'homewizard.0.startPairing' na true.\n2. Naciśnij fizyczny przycisk na urządzeniu HomeWizard w ciągu 60 sekund.\n3. Urządzenie zostanie wykryte automatycznie i pojawi się pod tą instancją adaptera.",
|
|
5
|
+
"pairingManualHeader": "Ręcznie (stały IP)",
|
|
6
|
+
"pairingManualInfo": "Jeśli mDNS nie jest dostępny (np. inny VLAN lub Docker):\n1. Ustaw 'homewizard.0.pairingIp' na adres IP urządzenia.\n2. Następnie ustaw 'homewizard.0.startPairing' na true.\n3. Naciśnij fizyczny przycisk na urządzeniu w ciągu 60 sekund.",
|
|
7
|
+
"headerDevices": "Zarządzanie urządzeniami",
|
|
8
|
+
"devicesInfo": "Wszystkie sparowane urządzenia są wymienione w zakładce Obiekty pod 'homewizard.0'. Każde urządzenie ma własny folder (np. hwe-p1_5c2fafaabbcc) z danymi pomiarowymi, ustawieniami systemowymi i informacjami o urządzeniu.\n\nAby usunąć urządzenie, ustaw jego punkt danych 'remove' na true. Urządzenie i wszystkie jego punkty danych zostaną natychmiast usunięte.",
|
|
9
|
+
"headerPrerequisites": "Wymagania",
|
|
10
|
+
"prerequisitesInfo": "Lokalne API musi być włączone na urządzeniu HomeWizard. Otwórz aplikację HomeWizard → Ustawienia → Liczniki → twoje urządzenie → Lokalne API → Włącz.",
|
|
6
11
|
"supportHeader": "Wsparcie",
|
|
7
12
|
"aboutInfo": "Ten adapter jest darmowy i otwartoźródłowy. Jeśli uważasz go za przydatny, rozważ wsparcie rozwoju:",
|
|
8
13
|
"donateKofi": "Ko-fi",
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
{
|
|
2
|
-
"headerPairing": "
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
2
|
+
"headerPairing": "Adicionar dispositivo",
|
|
3
|
+
"pairingAutoHeader": "Automático (mDNS)",
|
|
4
|
+
"pairingAutoInfo": "1. Vá para a aba Objetos e defina 'homewizard.0.startPairing' como true.\n2. Pressione o botão físico no dispositivo HomeWizard dentro de 60 segundos.\n3. O dispositivo é descoberto automaticamente e aparece sob esta instância do adaptador.",
|
|
5
|
+
"pairingManualHeader": "Manual (IP fixo)",
|
|
6
|
+
"pairingManualInfo": "Se o mDNS não estiver disponível (ex.: VLAN diferente ou Docker):\n1. Defina 'homewizard.0.pairingIp' com o endereço IP do dispositivo.\n2. Depois defina 'homewizard.0.startPairing' como true.\n3. Pressione o botão físico no dispositivo dentro de 60 segundos.",
|
|
7
|
+
"headerDevices": "Gerenciar dispositivos",
|
|
8
|
+
"devicesInfo": "Todos os dispositivos emparelhados estão listados na aba Objetos sob 'homewizard.0'. Cada dispositivo tem sua própria pasta (ex.: hwe-p1_5c2fafaabbcc) com dados de medição, configurações do sistema e informações do dispositivo.\n\nPara remover um dispositivo, defina seu ponto de dados 'remove' como true. O dispositivo e todos os seus pontos de dados serão excluídos imediatamente.",
|
|
9
|
+
"headerPrerequisites": "Pré-requisitos",
|
|
10
|
+
"prerequisitesInfo": "A API local deve estar ativada no dispositivo HomeWizard. Abra o app HomeWizard → Configurações → Medidores → seu dispositivo → API Local → Ativar.",
|
|
11
|
+
"supportHeader": "Suporte",
|
|
12
|
+
"aboutInfo": "Este adaptador é gratuito e de código aberto. Se for útil para você, considere apoiar o desenvolvimento:",
|
|
8
13
|
"donateKofi": "Ko-fi",
|
|
9
14
|
"donatePaypal": "PayPal"
|
|
10
15
|
}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
-
"headerPairing": "
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
2
|
+
"headerPairing": "Добавить устройство",
|
|
3
|
+
"pairingAutoHeader": "Автоматически (mDNS)",
|
|
4
|
+
"pairingAutoInfo": "1. Перейдите на вкладку Объекты и установите 'homewizard.0.startPairing' в true.\n2. Нажмите физическую кнопку на устройстве HomeWizard в течение 60 секунд.\n3. Устройство будет обнаружено автоматически и появится под этим экземпляром адаптера.",
|
|
5
|
+
"pairingManualHeader": "Вручную (фиксированный IP)",
|
|
6
|
+
"pairingManualInfo": "Если mDNS недоступен (например, другой VLAN или Docker):\n1. Установите 'homewizard.0.pairingIp' на IP-адрес устройства.\n2. Затем установите 'homewizard.0.startPairing' в true.\n3. Нажмите физическую кнопку на устройстве в течение 60 секунд.",
|
|
7
|
+
"headerDevices": "Управление устройствами",
|
|
8
|
+
"devicesInfo": "Все сопряжённые устройства перечислены на вкладке Объекты под 'homewizard.0'. Каждое устройство имеет свою папку (например, hwe-p1_5c2fafaabbcc) с данными измерений, системными настройками и информацией об устройстве.\n\nЧтобы удалить устройство, установите его точку данных 'remove' в true. Устройство и все его точки данных будут немедленно удалены.",
|
|
9
|
+
"headerPrerequisites": "Предварительные требования",
|
|
10
|
+
"prerequisitesInfo": "Локальный API должен быть включён на устройстве HomeWizard. Откройте приложение HomeWizard → Настройки → Счётчики → ваше устройство → Локальный API → Включить.",
|
|
6
11
|
"supportHeader": "Поддержка",
|
|
7
12
|
"aboutInfo": "Этот адаптер бесплатный и с открытым исходным кодом. Если он вам полезен, рассмотрите поддержку разработки:",
|
|
8
13
|
"donateKofi": "Ko-fi",
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
-
"headerPairing": "
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
2
|
+
"headerPairing": "Додати пристрій",
|
|
3
|
+
"pairingAutoHeader": "Автоматично (mDNS)",
|
|
4
|
+
"pairingAutoInfo": "1. Перейдіть на вкладку Об'єкти і встановіть 'homewizard.0.startPairing' на true.\n2. Натисніть фізичну кнопку на пристрої HomeWizard протягом 60 секунд.\n3. Пристрій буде виявлено автоматично і з'явиться під цим екземпляром адаптера.",
|
|
5
|
+
"pairingManualHeader": "Вручну (фіксований IP)",
|
|
6
|
+
"pairingManualInfo": "Якщо mDNS недоступний (напр. інший VLAN або Docker):\n1. Встановіть 'homewizard.0.pairingIp' на IP-адресу пристрою.\n2. Потім встановіть 'homewizard.0.startPairing' на true.\n3. Натисніть фізичну кнопку на пристрої протягом 60 секунд.",
|
|
7
|
+
"headerDevices": "Керування пристроями",
|
|
8
|
+
"devicesInfo": "Всі сполучені пристрої перелічені на вкладці Об'єкти під 'homewizard.0'. Кожен пристрій має власну папку (напр. hwe-p1_5c2fafaabbcc) з даними вимірювань, системними налаштуваннями та інформацією про пристрій.\n\nЩоб видалити пристрій, встановіть його точку даних 'remove' на true. Пристрій та всі його точки даних будуть негайно видалені.",
|
|
9
|
+
"headerPrerequisites": "Передумови",
|
|
10
|
+
"prerequisitesInfo": "Локальний API повинен бути увімкнений на пристрої HomeWizard. Відкрийте додаток HomeWizard → Налаштування → Лічильники → ваш пристрій → Локальний API → Увімкнути.",
|
|
6
11
|
"supportHeader": "Підтримка",
|
|
7
12
|
"aboutInfo": "Цей адаптер безкоштовний і з відкритим кодом. Якщо він вам корисний, розгляньте підтримку розробки:",
|
|
8
13
|
"donateKofi": "Ko-fi",
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
-
"headerPairing": "
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
2
|
+
"headerPairing": "添加设备",
|
|
3
|
+
"pairingAutoHeader": "自动 (mDNS)",
|
|
4
|
+
"pairingAutoInfo": "1. 转到对象选项卡,将 'homewizard.0.startPairing' 设置为 true。\n2. 在 60 秒内按下 HomeWizard 设备上的物理按钮。\n3. 设备将被自动发现并显示在此适配器实例下。",
|
|
5
|
+
"pairingManualHeader": "手动 (固定 IP)",
|
|
6
|
+
"pairingManualInfo": "如果 mDNS 不可用(如不同 VLAN 或 Docker):\n1. 将 'homewizard.0.pairingIp' 设置为设备的 IP 地址。\n2. 然后将 'homewizard.0.startPairing' 设置为 true。\n3. 在 60 秒内按下设备上的物理按钮。",
|
|
7
|
+
"headerDevices": "管理设备",
|
|
8
|
+
"devicesInfo": "所有已配对的设备都列在对象选项卡中的 'homewizard.0' 下。每个设备都有自己的文件夹(如 hwe-p1_5c2fafaabbcc),包含测量数据、系统设置和设备信息。\n\n要移除设备,请将其 'remove' 数据点设置为 true。设备及其所有数据点将被立即删除。",
|
|
9
|
+
"headerPrerequisites": "前提条件",
|
|
10
|
+
"prerequisitesInfo": "必须在 HomeWizard 设备上启用本地 API。打开 HomeWizard 应用 → 设置 → 仪表 → 您的设备 → 本地 API → 启用。",
|
|
6
11
|
"supportHeader": "支持",
|
|
7
12
|
"aboutInfo": "此适配器免费且开源。如果您觉得有用,请考虑支持开发:",
|
|
8
13
|
"donateKofi": "Ko-fi",
|
package/admin/jsonConfig.json
CHANGED
|
@@ -2,16 +2,43 @@
|
|
|
2
2
|
"i18n": true,
|
|
3
3
|
"type": "panel",
|
|
4
4
|
"items": {
|
|
5
|
+
"_headerPrerequisites": {
|
|
6
|
+
"type": "header",
|
|
7
|
+
"text": "headerPrerequisites",
|
|
8
|
+
"size": 3
|
|
9
|
+
},
|
|
10
|
+
"_prerequisitesInfo": {
|
|
11
|
+
"type": "staticText",
|
|
12
|
+
"text": "prerequisitesInfo",
|
|
13
|
+
"xs": 12, "sm": 12, "md": 12, "lg": 12, "xl": 12,
|
|
14
|
+
"style": { "fontSize": 14, "marginBottom": 16 }
|
|
15
|
+
},
|
|
5
16
|
"_headerPairing": {
|
|
6
17
|
"type": "header",
|
|
7
18
|
"text": "headerPairing",
|
|
8
19
|
"size": 3
|
|
9
20
|
},
|
|
10
|
-
"
|
|
21
|
+
"_pairingAutoHeader": {
|
|
22
|
+
"type": "header",
|
|
23
|
+
"text": "pairingAutoHeader",
|
|
24
|
+
"size": 5
|
|
25
|
+
},
|
|
26
|
+
"_pairingAutoInfo": {
|
|
11
27
|
"type": "staticText",
|
|
12
|
-
"text": "
|
|
28
|
+
"text": "pairingAutoInfo",
|
|
13
29
|
"xs": 12, "sm": 12, "md": 12, "lg": 12, "xl": 12,
|
|
14
|
-
"style": { "fontSize": 14, "marginBottom": 16 }
|
|
30
|
+
"style": { "fontSize": 14, "marginBottom": 16, "whiteSpace": "pre-line" }
|
|
31
|
+
},
|
|
32
|
+
"_pairingManualHeader": {
|
|
33
|
+
"type": "header",
|
|
34
|
+
"text": "pairingManualHeader",
|
|
35
|
+
"size": 5
|
|
36
|
+
},
|
|
37
|
+
"_pairingManualInfo": {
|
|
38
|
+
"type": "staticText",
|
|
39
|
+
"text": "pairingManualInfo",
|
|
40
|
+
"xs": 12, "sm": 12, "md": 12, "lg": 12, "xl": 12,
|
|
41
|
+
"style": { "fontSize": 14, "marginBottom": 16, "whiteSpace": "pre-line" }
|
|
15
42
|
},
|
|
16
43
|
"_headerDevices": {
|
|
17
44
|
"type": "header",
|
|
@@ -22,7 +49,7 @@
|
|
|
22
49
|
"type": "staticText",
|
|
23
50
|
"text": "devicesInfo",
|
|
24
51
|
"xs": 12, "sm": 12, "md": 12, "lg": 12, "xl": 12,
|
|
25
|
-
"style": { "fontSize": 14, "marginBottom": 16 }
|
|
52
|
+
"style": { "fontSize": 14, "marginBottom": 16, "whiteSpace": "pre-line" }
|
|
26
53
|
},
|
|
27
54
|
"_supportHeader": {
|
|
28
55
|
"newLine": true,
|
|
@@ -137,9 +137,9 @@ class HomeWizardWebSocket {
|
|
|
137
137
|
cleanup() {
|
|
138
138
|
if (this.ws) {
|
|
139
139
|
this.ws.removeAllListeners();
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
140
|
+
this.ws.on("error", () => {
|
|
141
|
+
});
|
|
142
|
+
this.ws.terminate();
|
|
143
143
|
this.ws = null;
|
|
144
144
|
}
|
|
145
145
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/lib/websocket-client.ts"],
|
|
4
|
-
"sourcesContent": ["import WebSocket from \"ws\";\nimport { HW_AGENT } from \"./cacert\";\nimport type { Measurement, WsMessage } from \"./types\";\n\n/** Callback interface for WebSocket events */\nexport interface WsCallbacks {\n /** Called when measurement data is received */\n onMeasurement: (data: Measurement) => void;\n /** Called when connection is established and authenticated */\n onConnected: () => void;\n /** Called when connection is lost */\n onDisconnected: (error?: Error) => void;\n /** Log functions */\n log: {\n debug: (msg: string) => void;\n warn: (msg: string) => void;\n };\n}\n\n/**\n * WebSocket client for HomeWizard real-time measurement push.\n * Handles auth handshake, subscription, and auto-reconnect.\n */\nexport class HomeWizardWebSocket {\n private readonly ip: string;\n private readonly token: string;\n private readonly callbacks: WsCallbacks;\n private ws: WebSocket | null = null;\n private destroyed = false;\n\n /**\n * @param ip Device IP address\n * @param token Bearer token\n * @param callbacks Event callbacks\n */\n constructor(ip: string, token: string, callbacks: WsCallbacks) {\n this.ip = ip;\n this.token = token;\n this.callbacks = callbacks;\n }\n\n /** Connect to WebSocket and start auth handshake */\n connect(): void {\n if (this.destroyed) {\n return;\n }\n\n this.cleanup();\n\n const url = `wss://${this.ip}/api/ws`;\n this.callbacks.log.debug(`WS connecting to ${url}`);\n\n this.ws = new WebSocket(url, {\n agent: HW_AGENT,\n handshakeTimeout: 10_000,\n });\n\n this.ws.on(\"open\", () => {\n this.callbacks.log.debug(`WS open to ${this.ip}`);\n });\n\n this.ws.on(\"message\", (raw: WebSocket.RawData) => {\n this.handleMessage(raw);\n });\n\n this.ws.on(\"close\", (code: number, reason: Buffer) => {\n this.callbacks.log.debug(`WS closed: ${code} ${reason.toString()}`);\n this.ws = null;\n if (!this.destroyed) {\n this.callbacks.onDisconnected();\n }\n });\n\n this.ws.on(\"error\", (err: Error) => {\n this.callbacks.log.debug(`WS error: ${err.message}`);\n // close event will follow\n });\n }\n\n /** Gracefully close connection */\n close(): void {\n this.destroyed = true;\n this.cleanup();\n }\n\n /** Whether the WebSocket is currently open */\n get isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Handle incoming WebSocket message\n *\n * @param raw Raw message data\n */\n private handleMessage(raw: WebSocket.RawData): void {\n const text = Buffer.isBuffer(raw)\n ? raw.toString(\"utf8\")\n : raw instanceof ArrayBuffer\n ? Buffer.from(raw).toString(\"utf8\")\n : Array.isArray(raw)\n ? Buffer.concat(raw).toString(\"utf8\")\n : \"\";\n let msg: WsMessage;\n try {\n msg = JSON.parse(text) as WsMessage;\n } catch {\n this.callbacks.log.warn(`WS invalid JSON: ${text.substring(0, 200)}`);\n return;\n }\n\n switch (msg.type) {\n case \"authorization_requested\":\n this.callbacks.log.debug(\"WS auth requested, sending token\");\n this.send({ type: \"authorization\", data: this.token });\n break;\n\n case \"authorized\":\n this.callbacks.log.debug(\"WS authorized, subscribing to measurement\");\n this.send({ type: \"subscribe\", data: \"measurement\" });\n this.callbacks.onConnected();\n break;\n\n case \"measurement\":\n if (msg.data) {\n this.callbacks.onMeasurement(msg.data as Measurement);\n }\n break;\n\n default:\n this.callbacks.log.debug(`WS message type: ${msg.type}`);\n break;\n }\n }\n\n /**\n * Send a message over WebSocket\n *\n * @param msg Message to send\n */\n private send(msg: WsMessage): void {\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(msg));\n }\n }\n\n /** Close WebSocket without triggering reconnect */\n private cleanup(): void {\n if (this.ws) {\n this.ws.removeAllListeners();\n
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAsB;AACtB,oBAAyB;AAsBlB,MAAM,oBAAoB;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACT,KAAuB;AAAA,EACvB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOpB,YAAY,IAAY,OAAe,WAAwB;AAC7D,SAAK,KAAK;AACV,SAAK,QAAQ;AACb,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA,EAGA,UAAgB;AACd,QAAI,KAAK,WAAW;AAClB;AAAA,IACF;AAEA,SAAK,QAAQ;AAEb,UAAM,MAAM,SAAS,KAAK,EAAE;AAC5B,SAAK,UAAU,IAAI,MAAM,oBAAoB,GAAG,EAAE;AAElD,SAAK,KAAK,IAAI,UAAAA,QAAU,KAAK;AAAA,MAC3B,OAAO;AAAA,MACP,kBAAkB;AAAA,IACpB,CAAC;AAED,SAAK,GAAG,GAAG,QAAQ,MAAM;AACvB,WAAK,UAAU,IAAI,MAAM,cAAc,KAAK,EAAE,EAAE;AAAA,IAClD,CAAC;AAED,SAAK,GAAG,GAAG,WAAW,CAAC,QAA2B;AAChD,WAAK,cAAc,GAAG;AAAA,IACxB,CAAC;AAED,SAAK,GAAG,GAAG,SAAS,CAAC,MAAc,WAAmB;AACpD,WAAK,UAAU,IAAI,MAAM,cAAc,IAAI,IAAI,OAAO,SAAS,CAAC,EAAE;AAClE,WAAK,KAAK;AACV,UAAI,CAAC,KAAK,WAAW;AACnB,aAAK,UAAU,eAAe;AAAA,MAChC;AAAA,IACF,CAAC;AAED,SAAK,GAAG,GAAG,SAAS,CAAC,QAAe;AAClC,WAAK,UAAU,IAAI,MAAM,aAAa,IAAI,OAAO,EAAE;AAAA,IAErD,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QAAc;AACZ,SAAK,YAAY;AACjB,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA,EAGA,IAAI,cAAuB;AAtF7B;AAuFI,aAAO,UAAK,OAAL,mBAAS,gBAAe,UAAAA,QAAU;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,cAAc,KAA8B;AAClD,UAAM,OAAO,OAAO,SAAS,GAAG,IAC5B,IAAI,SAAS,MAAM,IACnB,eAAe,cACb,OAAO,KAAK,GAAG,EAAE,SAAS,MAAM,IAChC,MAAM,QAAQ,GAAG,IACf,OAAO,OAAO,GAAG,EAAE,SAAS,MAAM,IAClC;AACR,QAAI;AACJ,QAAI;AACF,YAAM,KAAK,MAAM,IAAI;AAAA,IACvB,QAAQ;AACN,WAAK,UAAU,IAAI,KAAK,oBAAoB,KAAK,UAAU,GAAG,GAAG,CAAC,EAAE;AACpE;AAAA,IACF;AAEA,YAAQ,IAAI,MAAM;AAAA,MAChB,KAAK;AACH,aAAK,UAAU,IAAI,MAAM,kCAAkC;AAC3D,aAAK,KAAK,EAAE,MAAM,iBAAiB,MAAM,KAAK,MAAM,CAAC;AACrD;AAAA,MAEF,KAAK;AACH,aAAK,UAAU,IAAI,MAAM,2CAA2C;AACpE,aAAK,KAAK,EAAE,MAAM,aAAa,MAAM,cAAc,CAAC;AACpD,aAAK,UAAU,YAAY;AAC3B;AAAA,MAEF,KAAK;AACH,YAAI,IAAI,MAAM;AACZ,eAAK,UAAU,cAAc,IAAI,IAAmB;AAAA,QACtD;AACA;AAAA,MAEF;AACE,aAAK,UAAU,IAAI,MAAM,oBAAoB,IAAI,IAAI,EAAE;AACvD;AAAA,IACJ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,KAAK,KAAsB;AA5IrC;AA6II,UAAI,UAAK,OAAL,mBAAS,gBAAe,UAAAA,QAAU,MAAM;AAC1C,WAAK,GAAG,KAAK,KAAK,UAAU,GAAG,CAAC;AAAA,IAClC;AAAA,EACF;AAAA;AAAA,EAGQ,UAAgB;AACtB,QAAI,KAAK,IAAI;AACX,WAAK,GAAG,mBAAmB;
|
|
4
|
+
"sourcesContent": ["import WebSocket from \"ws\";\nimport { HW_AGENT } from \"./cacert\";\nimport type { Measurement, WsMessage } from \"./types\";\n\n/** Callback interface for WebSocket events */\nexport interface WsCallbacks {\n /** Called when measurement data is received */\n onMeasurement: (data: Measurement) => void;\n /** Called when connection is established and authenticated */\n onConnected: () => void;\n /** Called when connection is lost */\n onDisconnected: (error?: Error) => void;\n /** Log functions */\n log: {\n debug: (msg: string) => void;\n warn: (msg: string) => void;\n };\n}\n\n/**\n * WebSocket client for HomeWizard real-time measurement push.\n * Handles auth handshake, subscription, and auto-reconnect.\n */\nexport class HomeWizardWebSocket {\n private readonly ip: string;\n private readonly token: string;\n private readonly callbacks: WsCallbacks;\n private ws: WebSocket | null = null;\n private destroyed = false;\n\n /**\n * @param ip Device IP address\n * @param token Bearer token\n * @param callbacks Event callbacks\n */\n constructor(ip: string, token: string, callbacks: WsCallbacks) {\n this.ip = ip;\n this.token = token;\n this.callbacks = callbacks;\n }\n\n /** Connect to WebSocket and start auth handshake */\n connect(): void {\n if (this.destroyed) {\n return;\n }\n\n this.cleanup();\n\n const url = `wss://${this.ip}/api/ws`;\n this.callbacks.log.debug(`WS connecting to ${url}`);\n\n this.ws = new WebSocket(url, {\n agent: HW_AGENT,\n handshakeTimeout: 10_000,\n });\n\n this.ws.on(\"open\", () => {\n this.callbacks.log.debug(`WS open to ${this.ip}`);\n });\n\n this.ws.on(\"message\", (raw: WebSocket.RawData) => {\n this.handleMessage(raw);\n });\n\n this.ws.on(\"close\", (code: number, reason: Buffer) => {\n this.callbacks.log.debug(`WS closed: ${code} ${reason.toString()}`);\n this.ws = null;\n if (!this.destroyed) {\n this.callbacks.onDisconnected();\n }\n });\n\n this.ws.on(\"error\", (err: Error) => {\n this.callbacks.log.debug(`WS error: ${err.message}`);\n // close event will follow\n });\n }\n\n /** Gracefully close connection */\n close(): void {\n this.destroyed = true;\n this.cleanup();\n }\n\n /** Whether the WebSocket is currently open */\n get isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Handle incoming WebSocket message\n *\n * @param raw Raw message data\n */\n private handleMessage(raw: WebSocket.RawData): void {\n const text = Buffer.isBuffer(raw)\n ? raw.toString(\"utf8\")\n : raw instanceof ArrayBuffer\n ? Buffer.from(raw).toString(\"utf8\")\n : Array.isArray(raw)\n ? Buffer.concat(raw).toString(\"utf8\")\n : \"\";\n let msg: WsMessage;\n try {\n msg = JSON.parse(text) as WsMessage;\n } catch {\n this.callbacks.log.warn(`WS invalid JSON: ${text.substring(0, 200)}`);\n return;\n }\n\n switch (msg.type) {\n case \"authorization_requested\":\n this.callbacks.log.debug(\"WS auth requested, sending token\");\n this.send({ type: \"authorization\", data: this.token });\n break;\n\n case \"authorized\":\n this.callbacks.log.debug(\"WS authorized, subscribing to measurement\");\n this.send({ type: \"subscribe\", data: \"measurement\" });\n this.callbacks.onConnected();\n break;\n\n case \"measurement\":\n if (msg.data) {\n this.callbacks.onMeasurement(msg.data as Measurement);\n }\n break;\n\n default:\n this.callbacks.log.debug(`WS message type: ${msg.type}`);\n break;\n }\n }\n\n /**\n * Send a message over WebSocket\n *\n * @param msg Message to send\n */\n private send(msg: WsMessage): void {\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(msg));\n }\n }\n\n /** Close WebSocket without triggering reconnect */\n private cleanup(): void {\n if (this.ws) {\n this.ws.removeAllListeners();\n // Prevent uncaught errors from frames received during close\n this.ws.on(\"error\", () => {});\n this.ws.terminate();\n this.ws = null;\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["WebSocket"]
|
|
7
7
|
}
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "homewizard",
|
|
4
|
-
"version": "0.3.
|
|
4
|
+
"version": "0.3.2",
|
|
5
5
|
"news": {
|
|
6
|
+
"0.3.2": {
|
|
7
|
+
"en": "Improve Admin UI and README with detailed configuration guide (prerequisites, manual IP pairing)",
|
|
8
|
+
"de": "Admin UI und README verbessert mit detaillierter Konfigurationsanleitung (Voraussetzungen, manuelles IP-Pairing)",
|
|
9
|
+
"ru": "Улучшен Admin UI и README с подробным руководством по настройке (предварительные требования, ручное IP-сопряжение)",
|
|
10
|
+
"pt": "Admin UI e README melhorados com guia de configuração detalhado (pré-requisitos, emparelhamento manual por IP)",
|
|
11
|
+
"nl": "Admin UI en README verbeterd met gedetailleerde configuratiegids (vereisten, handmatig IP-koppelen)",
|
|
12
|
+
"fr": "Admin UI et README améliorés avec guide de configuration détaillé (prérequis, appairage IP manuel)",
|
|
13
|
+
"it": "Admin UI e README migliorati con guida di configurazione dettagliata (prerequisiti, associazione IP manuale)",
|
|
14
|
+
"es": "Admin UI y README mejorados con guía de configuración detallada (requisitos, emparejamiento IP manual)",
|
|
15
|
+
"pl": "Ulepszono Admin UI i README ze szczegółowym przewodnikiem konfiguracji (wymagania, ręczne parowanie IP)",
|
|
16
|
+
"uk": "Покращено Admin UI та README з детальним посібником з налаштування (передумови, ручне IP-сполучення)",
|
|
17
|
+
"zh-cn": "改进 Admin UI 和 README,提供详细配置指南(前提条件、手动 IP 配对)"
|
|
18
|
+
},
|
|
19
|
+
"0.3.1": {
|
|
20
|
+
"en": "Fix uncaught exception on device removal (invalid WebSocket frame during close)",
|
|
21
|
+
"de": "Uncaught Exception beim Geraet entfernen behoben (ungueltiger WebSocket-Frame beim Schliessen)",
|
|
22
|
+
"ru": "Исправлено необработанное исключение при удалении устройства (недопустимый кадр WebSocket при закрытии)",
|
|
23
|
+
"pt": "Corrigida exceção não capturada ao remover dispositivo (frame WebSocket inválido durante fechamento)",
|
|
24
|
+
"nl": "Onafgevangen uitzondering bij verwijderen apparaat opgelost (ongeldig WebSocket-frame bij sluiten)",
|
|
25
|
+
"fr": "Correction d exception non capturée lors de la suppression d appareil (frame WebSocket invalide à la fermeture)",
|
|
26
|
+
"it": "Corretta eccezione non gestita alla rimozione del dispositivo (frame WebSocket non valido durante la chiusura)",
|
|
27
|
+
"es": "Corregida excepción no capturada al eliminar dispositivo (frame WebSocket inválido durante cierre)",
|
|
28
|
+
"pl": "Naprawiono nieprzechwycony wyjątek przy usuwaniu urządzenia (nieprawidłowa ramka WebSocket podczas zamykania)",
|
|
29
|
+
"uk": "Виправлено необроблений виняток при видаленні пристрою (недійсний кадр WebSocket при закритті)",
|
|
30
|
+
"zh-cn": "修复删除设备时的未捕获异常(关闭时无效的 WebSocket 帧)"
|
|
31
|
+
},
|
|
6
32
|
"0.3.0": {
|
|
7
33
|
"en": "Store device config in device objects (no adapter restart), fix datapoint issues, reconnect workflow",
|
|
8
34
|
"de": "Gerätekonfiguration in Geräteobjekten gespeichert (kein Adapter-Neustart), Datenpunkt-Fixes, Reconnect-Workflow",
|
|
@@ -67,19 +93,6 @@
|
|
|
67
93
|
"pl": "Dodano testy jednostkowe (129 testów), poprawiono konfigurację Dependabot",
|
|
68
94
|
"uk": "Додано модульні тести (129 тестів), виправлено конфігурацію Dependabot",
|
|
69
95
|
"zh-cn": "添加单元测试(129个测试),修复 Dependabot 配置"
|
|
70
|
-
},
|
|
71
|
-
"0.1.0": {
|
|
72
|
-
"en": "Initial release with API v2, WebSocket push, mDNS discovery, multi-device pairing",
|
|
73
|
-
"de": "Erstveröffentlichung mit API v2, WebSocket-Push, mDNS-Discovery, Multi-Geräte-Pairing",
|
|
74
|
-
"ru": "Первый выпуск с API v2, WebSocket push, mDNS discovery, сопряжение нескольких устройств",
|
|
75
|
-
"pt": "Lançamento inicial com API v2, WebSocket push, descoberta mDNS, emparelhamento multi-dispositivo",
|
|
76
|
-
"nl": "Eerste release met API v2, WebSocket push, mDNS discovery, multi-device pairing",
|
|
77
|
-
"fr": "Version initiale avec API v2, WebSocket push, découverte mDNS, appairage multi-appareils",
|
|
78
|
-
"it": "Rilascio iniziale con API v2, WebSocket push, scoperta mDNS, associazione multi-dispositivo",
|
|
79
|
-
"es": "Lanzamiento inicial con API v2, WebSocket push, descubrimiento mDNS, emparejamiento multi-dispositivo",
|
|
80
|
-
"pl": "Pierwsze wydanie z API v2, WebSocket push, odkrywanie mDNS, parowanie wielu urządzeń",
|
|
81
|
-
"uk": "Початковий випуск з API v2, WebSocket push, mDNS виявлення, з'єднання кількох пристроїв",
|
|
82
|
-
"zh-cn": "初始版本,支持 API v2、WebSocket 推送、mDNS 发现、多设备配对"
|
|
83
96
|
}
|
|
84
97
|
},
|
|
85
98
|
"titleLang": {
|
package/package.json
CHANGED