iobroker.govee-smart 2.16.2 → 2.17.0
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 +43 -9
- package/admin/i18n/de.json +2 -5
- package/admin/i18n/en.json +2 -5
- package/admin/i18n/es.json +3 -6
- package/admin/i18n/fr.json +1 -4
- package/admin/i18n/it.json +2 -5
- package/admin/i18n/nl.json +4 -7
- package/admin/i18n/pl.json +3 -6
- package/admin/i18n/pt.json +2 -5
- package/admin/i18n/ru.json +2 -5
- package/admin/i18n/uk.json +3 -6
- package/admin/i18n/zh-cn.json +3 -6
- package/admin/jsonConfig.json +1 -1
- package/build/lib/capability-mapper.js +49 -25
- package/build/lib/capability-mapper.js.map +2 -2
- package/build/lib/cloud-retry.js +8 -5
- package/build/lib/cloud-retry.js.map +2 -2
- package/build/lib/command-router.js +7 -3
- package/build/lib/command-router.js.map +2 -2
- package/build/lib/device-baseline.js +2 -2
- package/build/lib/device-baseline.js.map +2 -2
- package/build/lib/device-manager/cache.js +9 -1
- package/build/lib/device-manager/cache.js.map +2 -2
- package/build/lib/device-manager/lookups.js +10 -3
- package/build/lib/device-manager/lookups.js.map +2 -2
- package/build/lib/device-manager/mapping.js +20 -5
- package/build/lib/device-manager/mapping.js.map +2 -2
- package/build/lib/device-manager.js +24 -4
- package/build/lib/device-manager.js.map +2 -2
- package/build/lib/diagnostics.js +37 -5
- package/build/lib/diagnostics.js.map +2 -2
- package/build/lib/govee-cloud-client.js +9 -1
- package/build/lib/govee-cloud-client.js.map +2 -2
- package/build/lib/govee-constants.js +1 -1
- package/build/lib/govee-constants.js.map +1 -1
- package/build/lib/govee-lan-client.js +35 -13
- package/build/lib/govee-lan-client.js.map +2 -2
- package/build/lib/govee-mqtt-client.js +20 -21
- package/build/lib/govee-mqtt-client.js.map +2 -2
- package/build/lib/govee-openapi-mqtt-client.js +16 -12
- package/build/lib/govee-openapi-mqtt-client.js.map +2 -2
- package/build/lib/group-fanout.js +35 -9
- package/build/lib/group-fanout.js.map +2 -2
- package/build/lib/handlers/cloud-state-loader.js +5 -0
- package/build/lib/handlers/cloud-state-loader.js.map +2 -2
- package/build/lib/handlers/dropdown-reset-helpers.js +2 -2
- package/build/lib/handlers/dropdown-reset-helpers.js.map +2 -2
- package/build/lib/handlers/state-change-router.js +41 -16
- package/build/lib/handlers/state-change-router.js.map +2 -2
- package/build/lib/message-router.js +33 -4
- package/build/lib/message-router.js.map +2 -2
- package/build/lib/rate-limiter.js +13 -7
- package/build/lib/rate-limiter.js.map +2 -2
- package/build/lib/segment-wizard.js +56 -28
- package/build/lib/segment-wizard.js.map +2 -2
- package/build/lib/state-manager.js +58 -10
- package/build/lib/state-manager.js.map +2 -2
- package/build/lib/timing-constants.js +18 -0
- package/build/lib/timing-constants.js.map +2 -2
- package/build/lib/types.js +22 -9
- package/build/lib/types.js.map +2 -2
- package/build/main.js +26 -2
- package/build/main.js.map +2 -2
- package/devices.json +13 -1
- package/io-package.json +41 -15
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -56,7 +56,7 @@ For details and how to disable it, see the [Sentry plugin documentation](https:/
|
|
|
56
56
|
## Requirements
|
|
57
57
|
|
|
58
58
|
- Node.js >= 22
|
|
59
|
-
- ioBroker js-controller >= 7.
|
|
59
|
+
- ioBroker js-controller >= 7.2.2
|
|
60
60
|
- ioBroker Admin >= 7.8.23
|
|
61
61
|
- A Govee account and at least one Govee WiFi device. LAN control needs a light with LAN mode enabled in the Govee Home app — see Govee's [LAN-supported device list](https://app-h5.govee.com/user-manual/wlan-guide).
|
|
62
62
|
|
|
@@ -64,7 +64,7 @@ For details and how to disable it, see the [Sentry plugin documentation](https:/
|
|
|
64
64
|
|
|
65
65
|
## Getting started
|
|
66
66
|
|
|
67
|
-
The adapter works LAN-only without any credentials. Adding an API key unlocks scenes, segments
|
|
67
|
+
The adapter works LAN-only without any credentials. Adding an API key unlocks scenes, segments and appliance control. Adding your Govee email and password adds sensor readings (temperature/humidity via the App API), real-time status push and full group control. See the [Setup page](https://github.com/krobipd/ioBroker.govee-smart/wiki/Setup) for credential levels, how to get an API key, and network requirements.
|
|
68
68
|
|
|
69
69
|
---
|
|
70
70
|
|
|
@@ -78,7 +78,7 @@ Each device shows its test status under `diag.tier`. The [Devices page](https://
|
|
|
78
78
|
|
|
79
79
|
Common issues (no devices discovered, empty scenes dropdown, segment colors not changing, limited group commands, delayed status updates) are covered on the Wiki [Behavior](https://github.com/krobipd/ioBroker.govee-smart/wiki/Behavior) / [Verhalten](https://github.com/krobipd/ioBroker.govee-smart/wiki/Verhalten) page.
|
|
80
80
|
|
|
81
|
-
For anything else,
|
|
81
|
+
For anything else, set **`diag.export`** to `true` on the affected device, copy the JSON from `diag.result`, and open a [GitHub Issue](https://github.com/krobipd/ioBroker.govee-smart/issues).
|
|
82
82
|
|
|
83
83
|
---
|
|
84
84
|
|
|
@@ -94,7 +94,45 @@ This adapter's MQTT authentication and BLE-over-LAN (ptReal) protocol implementa
|
|
|
94
94
|
Placeholder for the next version (at the beginning of the line):
|
|
95
95
|
### **WORK IN PROGRESS**
|
|
96
96
|
-->
|
|
97
|
-
### 2.
|
|
97
|
+
### 2.17.0 (2026-07-01)
|
|
98
|
+
|
|
99
|
+
- **Breaking:** colour datapoints renamed to snake_case — e.g. `control.colorRgb` → `control.color_rgb`, and the colour-temperature one likewise (devices + groups). Update your scripts.
|
|
100
|
+
- Security: the Govee Cloud API key can no longer leak into the ioBroker log — it was written in plaintext on the cloud-events connection and is now masked.
|
|
101
|
+
- Security: the diagnostics export (the JSON you paste into a GitHub issue) no longer contains device or gateway secrets — a gateway's secret key and push topic are now masked.
|
|
102
|
+
- Security: a spoofed LAN discovery reply can no longer redirect a device's commands to another IP — the device address is taken from the real network source, not the packet.
|
|
103
|
+
- Robustness: the Admin "Test login" button is now rate-limited, so repeated clicks can no longer trigger a burst of Govee logins that could get your account temporarily locked.
|
|
104
|
+
- Security: a hostile or misbehaving device on your network can no longer flood the adapter with fake device announcements and slow it down — new devices are now bounded.
|
|
105
|
+
- Fixed: a device you delete from your Govee account is now removed from the adapter on the next cloud refresh (e.g. after a restart), instead of lingering as a phantom device for up to two weeks.
|
|
106
|
+
- New: a "Manually sync devices" button (`info.manual_sync_devices`) — set it to true to sync the device list with your Govee account on demand (add new, drop deleted) without a restart.
|
|
107
|
+
- Fixed: multi-colour DIY scenes activated over the local network now load correctly — longer scenes could previously be corrupted and silently fail to apply.
|
|
108
|
+
- Fixed: after you remove a device and add it again, its info states (name, model, …) are recreated correctly instead of leaving "has no existing object" warnings until the next restart.
|
|
109
|
+
- Fixed: if a Govee push/cloud-events connection connects but can't subscribe (a rare server hiccup), the adapter no longer reconnects every few seconds — the retry now backs off normally.
|
|
110
|
+
- Fixed: the admin "Test login" button now waits for the real MQTT connection before reporting — valid Govee account credentials no longer show a false "MQTT not up, restart the adapter" message.
|
|
111
|
+
- Fixed: on lamps whose music modes start at zero, the first mode was unreachable and "off" was missing — the music-mode selector is fixed. **Breaking:** its numbers shift by one, adjust scripts.
|
|
112
|
+
- Fixed: cloud snapshots whose value is a plain number are no longer dropped from the snapshot dropdown, and an entry with an empty value no longer shows up as a phantom option.
|
|
113
|
+
- Fixed: clearing the preset-scene selector no longer fires a spurious empty scene command.
|
|
114
|
+
- Fixed: DIY scenes you create in the Govee app now show up in the DIY dropdown after a reload, instead of only on the very first load.
|
|
115
|
+
- Fixed: a malformed `segments.command` (e.g. `;` instead of `:`) now logs a clear warning with the expected syntax instead of being silently ignored.
|
|
116
|
+
- Fixed: a command to a group with no reachable members (or where every member fails) is no longer reported as successful — it warns and leaves the state un-acknowledged, like a single device.
|
|
117
|
+
- Fixed: setting music sensitivity or auto-color on a LAN-controlled light no longer silently appears to succeed — the adapter now makes clear only the music mode applies locally.
|
|
118
|
+
- Fixed: an out-of-range segment range in `segments.command` (e.g. `0-2000000000`) is now clamped to the protocol limit instead of briefly freezing the adapter while it expands the range.
|
|
119
|
+
- Fixed: the segment-detection wizard now leaves your light off after it finishes or is cancelled if it was off before — it no longer leaves a light on that you had switched off.
|
|
120
|
+
- Fixed: the segment-detection wizard now restores your strip's original per-segment gradient on finish/abort instead of flattening it to a single colour — a uniformly-coloured strip is unaffected.
|
|
121
|
+
- Fixed: starting the segment-detection wizard twice in quick succession can no longer open two overlapping sessions.
|
|
122
|
+
- Fixed: the Govee account email field no longer shows a "valid email" error when you leave it empty — LAN-only and API-key-only setups no longer see a false validation error.
|
|
123
|
+
- Fixed: per-segment colour and brightness now show a default value instead of reading as null in visualizations before the first change.
|
|
124
|
+
- Fixed: sensor readings (temperature/humidity/battery/CO₂) now default to 0 instead of null in visualizations before the first reading arrives.
|
|
125
|
+
- Fixed: device groups no longer expose a meaningless "verified" trust-tier datapoint (the trust tier only applies to real devices, not groups).
|
|
126
|
+
- Fixed: cleaner shutdown/restart — the adapter no longer opens a cloud connection or reports a stray error after it has been told to stop.
|
|
127
|
+
- Fixed: a broken rate-limit reply from Govee no longer causes rapid repeated retries — the adapter now waits at least 5 seconds before trying again.
|
|
128
|
+
- Fixed: under heavy cloud load a fresh control command (power/brightness) is no longer dropped in favour of queued scene activations.
|
|
129
|
+
- Fixed: a LAN light no longer loses its power and colour controls after a cloud data refresh.
|
|
130
|
+
- Added: device catalog entries for the H5109 Pool Thermometer and H1630 Lantern Floor Lamp (user-reported) — they are now recognised instead of logging a "not supported" warning.
|
|
131
|
+
- Fixed: a sensor sending fresh readings now shows `info.online = true` even when Govee's cloud wrongly reports it offline (e.g. gateway thermometers) — online is derived from data freshness.
|
|
132
|
+
- Fixed: temperature-only sensors no longer keep a phantom humidity datapoint stuck at 0 — a device with no humidity sensor drops it, while a real thermo-hygrometer keeps its humidity.
|
|
133
|
+
- Fixed: a rejected Govee API key is now always reported as "API key rejected — check Govee API key" and stops the retry loop, instead of a generic error and retrying a bad key forever.
|
|
134
|
+
|
|
135
|
+
### 2.16.2 (2026-06-16) — stable
|
|
98
136
|
- On hosts with multiple network interfaces, LAN device discovery now uses the selected interface for outgoing traffic, so it no longer misses devices by scanning on the wrong one.
|
|
99
137
|
|
|
100
138
|
### 2.16.1 (2026-06-11)
|
|
@@ -108,16 +146,12 @@ This adapter's MQTT authentication and BLE-over-LAN (ptReal) protocol implementa
|
|
|
108
146
|
- Lights and appliances without a local connection can now be controlled through the Cloud and report their correct online status; devices that support local control keep using it first.
|
|
109
147
|
- When account verification, the Cloud API key or the Govee password needs your attention, the adapter now flags it once clearly and as an ioBroker notification instead of repeating the same error.
|
|
110
148
|
- Added many more supported device models to the catalog, including Curtain Lights v1 and v2, the TV Backlight 3 Pro and the DreamView T1.
|
|
111
|
-
- Requires ioBroker js-controller 7.
|
|
149
|
+
- Requires ioBroker js-controller 7.2.2 or newer.
|
|
112
150
|
|
|
113
151
|
### 2.15.0 (2026-06-07)
|
|
114
152
|
|
|
115
153
|
- Added optional Sentry error reporting: crashes are sent to the developer so issues get fixed faster. Active only with ioBroker diagnostics enabled; anonymous.
|
|
116
154
|
|
|
117
|
-
### 2.14.1 (2026-06-05)
|
|
118
|
-
|
|
119
|
-
- Corrected the ioBroker role of the scene, mode and snapshot selector states (no change to how they work)
|
|
120
|
-
|
|
121
155
|
[Older changelogs can be found there](CHANGELOG_OLD.md)
|
|
122
156
|
|
|
123
157
|
## Support
|
package/admin/i18n/de.json
CHANGED
|
@@ -82,11 +82,7 @@
|
|
|
82
82
|
"localSnapshotDesc": "Snapshots, die dieser Adapter lokal auf dem ioBroker-Server gespeichert hat. Unabhängig von der Govee-Home-App.",
|
|
83
83
|
"localSnapshotsFolder": "Vom Benutzer gespeicherte lokale Snapshots",
|
|
84
84
|
"logAbortFailed": "Abbruch des Assistenten nach Timeout fehlgeschlagen: {msg}",
|
|
85
|
-
"
|
|
86
|
-
"logGapsSuffix": ", Lücken erkannt (manual_list=\"{list}\")",
|
|
87
|
-
"logIdleTimeout": "Segment-Assistent für {name}: Idle-Timeout (5 Min), abgebrochen",
|
|
88
|
-
"logNoGapsSuffix": ", keine Lücken",
|
|
89
|
-
"manualListDesc": "manualListDesc",
|
|
85
|
+
"manualListDesc": "Indizes und Bereiche durch Kommas getrennt, z. B. „0-9\" oder „0-8,10-14\" (nur wenn manual_mode=true)",
|
|
90
86
|
"manualSegmentList": "Manuelle Segmentliste",
|
|
91
87
|
"manualSegmentsActive": "Manuelle Segmente aktiv",
|
|
92
88
|
"manualSegmentsDesc": "Manuelle Segmentliste aktivieren (z.B. für gekürzte LED-Strips mit weniger physischen Segmenten als gemeldet)",
|
|
@@ -126,6 +122,7 @@
|
|
|
126
122
|
"scene": "Szene",
|
|
127
123
|
"sceneSpeed": "Szenen-Geschwindigkeit",
|
|
128
124
|
"seenSoFar": "Bisher als sichtbar markiert: [{list}]",
|
|
125
|
+
"segmentCount": "Segment-Anzahl",
|
|
129
126
|
"segmentFlashing": "► Segment {idx} leuchtet jetzt WEISS.",
|
|
130
127
|
"segmentWizardDeviceOption": "%s (%s, bisher %s Segmente)",
|
|
131
128
|
"supportHeader": "Unterstützung",
|
package/admin/i18n/en.json
CHANGED
|
@@ -82,11 +82,7 @@
|
|
|
82
82
|
"localSnapshotDesc": "Snapshots saved by this adapter on the ioBroker server. Independent of the Govee Home app.",
|
|
83
83
|
"localSnapshotsFolder": "User-saved local snapshots",
|
|
84
84
|
"logAbortFailed": "Wizard abort after timeout failed: {msg}",
|
|
85
|
-
"
|
|
86
|
-
"logGapsSuffix": ", gaps detected (manual_list=\"{list}\")",
|
|
87
|
-
"logIdleTimeout": "Segment wizard for {name}: idle timeout (5 min), aborted",
|
|
88
|
-
"logNoGapsSuffix": ", no gaps",
|
|
89
|
-
"manualListDesc": "manualListDesc",
|
|
85
|
+
"manualListDesc": "Indices and ranges separated by commas, e.g. \"0-9\" or \"0-8,10-14\" (only if manual_mode=true)",
|
|
90
86
|
"manualSegmentList": "Manual Segment List",
|
|
91
87
|
"manualSegmentsActive": "Manual Segments Active",
|
|
92
88
|
"manualSegmentsDesc": "Enable manual segment list (e.g. for cut LED strips with fewer physical segments than reported)",
|
|
@@ -126,6 +122,7 @@
|
|
|
126
122
|
"scene": "Scene",
|
|
127
123
|
"sceneSpeed": "Scene Speed",
|
|
128
124
|
"seenSoFar": "Marked visible so far: [{list}]",
|
|
125
|
+
"segmentCount": "Segment Count",
|
|
129
126
|
"segmentFlashing": "► Segment {idx} is now lit WHITE.",
|
|
130
127
|
"segmentWizardDeviceOption": "%s (%s, currently %s segments)",
|
|
131
128
|
"supportHeader": "Support",
|
package/admin/i18n/es.json
CHANGED
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"finishDone": "✓ ¡LISTO!",
|
|
60
60
|
"finishGaps": "Lista de espacios: {list}: modo manual activo.",
|
|
61
61
|
"finishNoGaps": "Sin espacios: modo manual desactivado.",
|
|
62
|
-
"finishTreeRebuilt": "El árbol
|
|
62
|
+
"finishTreeRebuilt": "El árbol de estados ha sido reconstruido.",
|
|
63
63
|
"groups": "Grupos",
|
|
64
64
|
"groupsStatus": "Estado de grupos",
|
|
65
65
|
"humidity": "Humedad",
|
|
@@ -82,11 +82,7 @@
|
|
|
82
82
|
"localSnapshotDesc": "Snapshots guardados por este adaptador en el servidor ioBroker. Independiente de la app Govee Home.",
|
|
83
83
|
"localSnapshotsFolder": "Instantáneas locales guardadas por el usuario",
|
|
84
84
|
"logAbortFailed": "Error en la cancelación del asistente después del tiempo de espera: {msg}",
|
|
85
|
-
"
|
|
86
|
-
"logGapsSuffix": ", lagunas detectadas (manual_list=\"{list}\")",
|
|
87
|
-
"logIdleTimeout": "Asistente de segmentos para {name}: tiempo de espera de inactividad (5 minutos), cancelado",
|
|
88
|
-
"logNoGapsSuffix": ", sin espacios",
|
|
89
|
-
"manualListDesc": "manualListDesc",
|
|
85
|
+
"manualListDesc": "Índices y rangos separados por comas, p. ej. \"0-9\" o \"0-8,10-14\" (solo si manual_mode=true)",
|
|
90
86
|
"manualSegmentList": "Lista de segmentos manuales",
|
|
91
87
|
"manualSegmentsActive": "Segmentos manuales activos",
|
|
92
88
|
"manualSegmentsDesc": "Activa la lista manual de segmentos (p. ej. para tiras LED cortadas con menos segmentos físicos)",
|
|
@@ -126,6 +122,7 @@
|
|
|
126
122
|
"scene": "Escena",
|
|
127
123
|
"sceneSpeed": "Velocidad de escena",
|
|
128
124
|
"seenSoFar": "Marcado visible hasta el momento: [{list}]",
|
|
125
|
+
"segmentCount": "Número de segmentos",
|
|
129
126
|
"segmentFlashing": "► El segmento {idx} ahora está iluminado en BLANCO.",
|
|
130
127
|
"segmentWizardDeviceOption": "%s (%s, actualmente %s segmentos)",
|
|
131
128
|
"supportHeader": "Apoyo",
|
package/admin/i18n/fr.json
CHANGED
|
@@ -82,10 +82,6 @@
|
|
|
82
82
|
"localSnapshotDesc": "Snapshots enregistrés par cet adaptateur sur le serveur ioBroker. Indépendants de l'app Govee Home.",
|
|
83
83
|
"localSnapshotsFolder": "Snapshots locaux enregistrés par l'utilisateur",
|
|
84
84
|
"logAbortFailed": "Abandon de l'assistant après échec du délai d'attente : {msg}",
|
|
85
|
-
"logDetected": "Assistant de segment pour {name} : {count} segments détectés{gaps}",
|
|
86
|
-
"logGapsSuffix": ", lacunes détectées (manual_list=\"{list}\")",
|
|
87
|
-
"logIdleTimeout": "Assistant de segment pour {name} : délai d'inactivité (5 minutes), abandonné",
|
|
88
|
-
"logNoGapsSuffix": ", pas de lacunes",
|
|
89
85
|
"manualListDesc": "Indices + plages séparés par des virgules, p. ex. « 0-9 » ou « 0-8,10-14 » (seulement si manual_mode=true)",
|
|
90
86
|
"manualSegmentList": "Liste des segments manuels",
|
|
91
87
|
"manualSegmentsActive": "Segments manuels actifs",
|
|
@@ -126,6 +122,7 @@
|
|
|
126
122
|
"scene": "Scène",
|
|
127
123
|
"sceneSpeed": "Vitesse de la scène",
|
|
128
124
|
"seenSoFar": "Marqué visible jusqu'à présent : [{list}]",
|
|
125
|
+
"segmentCount": "Nombre de segments",
|
|
129
126
|
"segmentFlashing": "► Le segment {idx} est maintenant allumé en BLANC.",
|
|
130
127
|
"segmentWizardDeviceOption": "%s (%s, actuellement %s segments)",
|
|
131
128
|
"supportHeader": "Soutien",
|
package/admin/i18n/it.json
CHANGED
|
@@ -82,11 +82,7 @@
|
|
|
82
82
|
"localSnapshotDesc": "Snapshot salvati da questo adattatore sul server ioBroker. Indipendenti dall'app Govee Home.",
|
|
83
83
|
"localSnapshotsFolder": "Snapshot locali salvati dall'utente",
|
|
84
84
|
"logAbortFailed": "Interruzione della procedura guidata dopo timeout non riuscita: {msg}",
|
|
85
|
-
"
|
|
86
|
-
"logGapsSuffix": ", lacune rilevate (manual_list=\"{list}\")",
|
|
87
|
-
"logIdleTimeout": "Procedura guidata per il segmento per {name}: timeout di inattività (5 min), interrotto",
|
|
88
|
-
"logNoGapsSuffix": ", senza lacune",
|
|
89
|
-
"manualListDesc": "manualListDesc",
|
|
85
|
+
"manualListDesc": "Indici e intervalli separati da virgole, es. \"0-9\" o \"0-8,10-14\" (solo se manual_mode=true)",
|
|
90
86
|
"manualSegmentList": "Elenco segmenti manuali",
|
|
91
87
|
"manualSegmentsActive": "Segmenti manuali attivi",
|
|
92
88
|
"manualSegmentsDesc": "Abilita la lista manuale dei segmenti (es. per strisce LED tagliate con meno segmenti fisici)",
|
|
@@ -126,6 +122,7 @@
|
|
|
126
122
|
"scene": "Scena",
|
|
127
123
|
"sceneSpeed": "Velocità scena",
|
|
128
124
|
"seenSoFar": "Contrassegnato come visibile finora: [{list}]",
|
|
125
|
+
"segmentCount": "Numero di segmenti",
|
|
129
126
|
"segmentFlashing": "► Il segmento {idx} ora è illuminato in BIANCO.",
|
|
130
127
|
"segmentWizardDeviceOption": "%s (%s, attualmente %s segmenti)",
|
|
131
128
|
"supportHeader": "Supporto",
|
package/admin/i18n/nl.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"abortRestart": "U kunt de wizard op elk gewenst moment opnieuw starten.",
|
|
3
3
|
"abortRestored": "De strip is in de oude staat hersteld.",
|
|
4
|
-
"abortTitle": "
|
|
4
|
+
"abortTitle": "Assistent afgebroken.",
|
|
5
5
|
"aboutInfo": "Deze adapter is gratis en open source. Als u het nuttig vindt, overweeg dan om de ontwikkeling te ondersteunen.",
|
|
6
6
|
"advancedHeader": "Geavanceerde opties",
|
|
7
7
|
"apiKeyLabel": "API-sleutel",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"finishDone": "✓ KLAAR!",
|
|
60
60
|
"finishGaps": "Gap-lijst: {list} — handmatige modus actief.",
|
|
61
61
|
"finishNoGaps": "Geen gaten - handmatige modus uitgeschakeld.",
|
|
62
|
-
"finishTreeRebuilt": "De
|
|
62
|
+
"finishTreeRebuilt": "De statusboom is opnieuw opgebouwd.",
|
|
63
63
|
"groups": "Groepen",
|
|
64
64
|
"groupsStatus": "Groepsstatus",
|
|
65
65
|
"humidity": "Luchtvochtigheid",
|
|
@@ -82,11 +82,7 @@
|
|
|
82
82
|
"localSnapshotDesc": "Snapshots die deze adapter op de ioBroker-server opslaat. Onafhankelijk van de Govee Home-app.",
|
|
83
83
|
"localSnapshotsFolder": "Door gebruiker opgeslagen lokale snapshots",
|
|
84
84
|
"logAbortFailed": "Wizard afbreken na time-out mislukt: {msg}",
|
|
85
|
-
"
|
|
86
|
-
"logGapsSuffix": ", hiaten gedetecteerd (manual_list=\"{list}\")",
|
|
87
|
-
"logIdleTimeout": "Segmentwizard voor {name}: time-out bij inactiviteit (5 min), afgebroken",
|
|
88
|
-
"logNoGapsSuffix": ", geen gaten",
|
|
89
|
-
"manualListDesc": "manualListDesc",
|
|
85
|
+
"manualListDesc": "Indexen en bereiken gescheiden door komma's, bijv. \"0-9\" of \"0-8,10-14\" (alleen als manual_mode=true)",
|
|
90
86
|
"manualSegmentList": "Handmatige segmentlijst",
|
|
91
87
|
"manualSegmentsActive": "Handmatige segmenten actief",
|
|
92
88
|
"manualSegmentsDesc": "Handmatige segmentlijst inschakelen (bv. voor ingekorte LED-strips met minder fysieke segmenten)",
|
|
@@ -126,6 +122,7 @@
|
|
|
126
122
|
"scene": "Scène",
|
|
127
123
|
"sceneSpeed": "Scènesnelheid",
|
|
128
124
|
"seenSoFar": "Tot nu toe als zichtbaar gemarkeerd: [{list}]",
|
|
125
|
+
"segmentCount": "Aantal segmenten",
|
|
129
126
|
"segmentFlashing": "► Segment {idx} is nu WIT verlicht.",
|
|
130
127
|
"segmentWizardDeviceOption": "%s (%s, momenteel %s segmenten)",
|
|
131
128
|
"supportHeader": "Steun",
|
package/admin/i18n/pl.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"abortRestart": "Możesz ponownie uruchomić kreatora w dowolnym momencie.",
|
|
3
3
|
"abortRestored": "Pasek został przywrócony do poprzedniego stanu.",
|
|
4
|
-
"abortTitle": "
|
|
4
|
+
"abortTitle": "Kreator przerwany.",
|
|
5
5
|
"aboutInfo": "Ten adapter jest darmowy i open source. Jeśli uznasz to za przydatne, rozważ wsparcie rozwoju.",
|
|
6
6
|
"advancedHeader": "Opcje zaawansowane",
|
|
7
7
|
"apiKeyLabel": "Klucz API",
|
|
@@ -82,11 +82,7 @@
|
|
|
82
82
|
"localSnapshotDesc": "Snapshoty zapisane przez ten adapter na serwerze ioBroker. Niezależne od aplikacji Govee Home.",
|
|
83
83
|
"localSnapshotsFolder": "Lokalne migawki zapisane przez użytkownika",
|
|
84
84
|
"logAbortFailed": "Kreator przerwał pracę po nieudanym przekroczeniu limitu czasu: {msg}",
|
|
85
|
-
"
|
|
86
|
-
"logGapsSuffix": ", wykryto luki (manual_list=\"{list}\")",
|
|
87
|
-
"logIdleTimeout": "Kreator segmentów dla {name}: przekroczenie limitu czasu bezczynności (5 min), przerwane",
|
|
88
|
-
"logNoGapsSuffix": ", brak luk",
|
|
89
|
-
"manualListDesc": "manualListDesc",
|
|
85
|
+
"manualListDesc": "Indeksy i zakresy oddzielone przecinkami, np. \"0-9\" lub \"0-8,10-14\" (tylko jeśli manual_mode=true)",
|
|
90
86
|
"manualSegmentList": "Lista ręcznych segmentów",
|
|
91
87
|
"manualSegmentsActive": "Ręczne segmenty aktywne",
|
|
92
88
|
"manualSegmentsDesc": "Włącz ręczną listę segmentów (np. dla skróconych LED-strips z mniejszą liczbą fizycznych segmentów)",
|
|
@@ -126,6 +122,7 @@
|
|
|
126
122
|
"scene": "Scena",
|
|
127
123
|
"sceneSpeed": "Prędkość sceny",
|
|
128
124
|
"seenSoFar": "Oznaczono jako widoczne do tej pory: [{list}]",
|
|
125
|
+
"segmentCount": "Liczba segmentów",
|
|
129
126
|
"segmentFlashing": "► Segment {idx} świeci się teraz na BIAŁO.",
|
|
130
127
|
"segmentWizardDeviceOption": "%s (%s, obecnie %s segmentów)",
|
|
131
128
|
"supportHeader": "Wsparcie",
|
package/admin/i18n/pt.json
CHANGED
|
@@ -82,11 +82,7 @@
|
|
|
82
82
|
"localSnapshotDesc": "Snapshots guardados por este adaptador no servidor ioBroker. Independente da app Govee Home.",
|
|
83
83
|
"localSnapshotsFolder": "Snapshots locais salvos pelo utilizador",
|
|
84
84
|
"logAbortFailed": "Falha na interrupção do assistente após tempo limite: {msg}",
|
|
85
|
-
"
|
|
86
|
-
"logGapsSuffix": ", lacunas detectadas (manual_list=\"{list}\")",
|
|
87
|
-
"logIdleTimeout": "Assistente de segmento para {name}: tempo limite de inatividade (5 min), abortado",
|
|
88
|
-
"logNoGapsSuffix": ", sem lacunas",
|
|
89
|
-
"manualListDesc": "manualListDesc",
|
|
85
|
+
"manualListDesc": "Índices e intervalos separados por vírgulas, ex. \"0-9\" ou \"0-8,10-14\" (apenas se manual_mode=true)",
|
|
90
86
|
"manualSegmentList": "Lista de segmentos manuais",
|
|
91
87
|
"manualSegmentsActive": "Segmentos manuais ativos",
|
|
92
88
|
"manualSegmentsDesc": "Ativar lista manual de segmentos (p.ex. para LED-strips cortadas com menos segmentos físicos do que reportado)",
|
|
@@ -126,6 +122,7 @@
|
|
|
126
122
|
"scene": "Cena",
|
|
127
123
|
"sceneSpeed": "Velocidade da cena",
|
|
128
124
|
"seenSoFar": "Marcado como visível até agora: [{list}]",
|
|
125
|
+
"segmentCount": "Número de segmentos",
|
|
129
126
|
"segmentFlashing": "► O segmento {idx} agora está aceso em BRANCO.",
|
|
130
127
|
"segmentWizardDeviceOption": "%s (%s, atualmente %s segmentos)",
|
|
131
128
|
"supportHeader": "Apoiar",
|
package/admin/i18n/ru.json
CHANGED
|
@@ -82,11 +82,7 @@
|
|
|
82
82
|
"localSnapshotDesc": "Снапшоты, сохранённые этим адаптером на сервере ioBroker. Независимо от приложения Govee Home.",
|
|
83
83
|
"localSnapshotsFolder": "Сохранённые пользователем локальные снимки",
|
|
84
84
|
"logAbortFailed": "Прерывание работы мастера после истечения времени ожидания: {msg}",
|
|
85
|
-
"
|
|
86
|
-
"logGapsSuffix": ", обнаружены пробелы (manual_list=\"{list}\")",
|
|
87
|
-
"logIdleTimeout": "Мастер сегментирования для {name}: тайм-аут простоя (5 минут), прервано",
|
|
88
|
-
"logNoGapsSuffix": ", без пробелов",
|
|
89
|
-
"manualListDesc": "manualListDesc",
|
|
85
|
+
"manualListDesc": "Индексы и диапазоны через запятую, напр. «0-9» или «0-8,10-14» (только если manual_mode=true)",
|
|
90
86
|
"manualSegmentList": "Список ручных сегментов",
|
|
91
87
|
"manualSegmentsActive": "Ручные сегменты активны",
|
|
92
88
|
"manualSegmentsDesc": "Включить ручной список сегментов (например, для обрезанных LED-strip с меньшим числом физических сегментов)",
|
|
@@ -126,6 +122,7 @@
|
|
|
126
122
|
"scene": "Сцена",
|
|
127
123
|
"sceneSpeed": "Скорость сцены",
|
|
128
124
|
"seenSoFar": "Отмечено как видимое на данный момент: [{list}]",
|
|
125
|
+
"segmentCount": "Количество сегментов",
|
|
129
126
|
"segmentFlashing": "► Сегмент {idx} теперь горит БЕЛЫМ.",
|
|
130
127
|
"segmentWizardDeviceOption": "%s (%s, в настоящее время сегментов %s)",
|
|
131
128
|
"supportHeader": "Поддерживать",
|
package/admin/i18n/uk.json
CHANGED
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"finishDone": "✓ ГОТОВО!",
|
|
60
60
|
"finishGaps": "Список пропусків: {list} — ручний режим активний.",
|
|
61
61
|
"finishNoGaps": "Без пропусків — ручний режим вимкнено.",
|
|
62
|
-
"finishTreeRebuilt": "
|
|
62
|
+
"finishTreeRebuilt": "Дерево станів відбудовано.",
|
|
63
63
|
"groups": "Групи",
|
|
64
64
|
"groupsStatus": "Статус груп",
|
|
65
65
|
"humidity": "Вологість",
|
|
@@ -82,11 +82,7 @@
|
|
|
82
82
|
"localSnapshotDesc": "Знімки, збережені цим адаптером на сервері ioBroker. Незалежно від додатка Govee Home.",
|
|
83
83
|
"localSnapshotsFolder": "Збережені користувачем локальні знімки",
|
|
84
84
|
"logAbortFailed": "Майстер припинив роботу після тайм-ауту: {msg}",
|
|
85
|
-
"
|
|
86
|
-
"logGapsSuffix": ", виявлено прогалини (manual_list=\"{list}\")",
|
|
87
|
-
"logIdleTimeout": "Майстер сегментів для {name}: тайм-аут простою (5 хв), перервано",
|
|
88
|
-
"logNoGapsSuffix": ", без пропусків",
|
|
89
|
-
"manualListDesc": "manualListDesc",
|
|
85
|
+
"manualListDesc": "Індекси та діапазони через кому, напр. «0-9» або «0-8,10-14» (лише якщо manual_mode=true)",
|
|
90
86
|
"manualSegmentList": "Список ручних сегментів",
|
|
91
87
|
"manualSegmentsActive": "Ручні сегменти активні",
|
|
92
88
|
"manualSegmentsDesc": "Увімкнути ручний перелік сегментів (наприклад, для обрізаних LED-strips із меншою кількістю сегментів)",
|
|
@@ -126,6 +122,7 @@
|
|
|
126
122
|
"scene": "Сцена",
|
|
127
123
|
"sceneSpeed": "Швидкість сцени",
|
|
128
124
|
"seenSoFar": "Позначено як видимий: [{list}]",
|
|
125
|
+
"segmentCount": "Кількість сегментів",
|
|
129
126
|
"segmentFlashing": "► Сегмент {idx} тепер світиться БІЛИМ.",
|
|
130
127
|
"segmentWizardDeviceOption": "%s (%s, наразі %s сегментів)",
|
|
131
128
|
"supportHeader": "Підтримка",
|
package/admin/i18n/zh-cn.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"abortRestart": "您可以随时重新启动向导。",
|
|
3
3
|
"abortRestored": "该地带已恢复到之前的状态。",
|
|
4
|
-
"abortTitle": "
|
|
4
|
+
"abortTitle": "向导已中止。",
|
|
5
5
|
"aboutInfo": "该适配器是免费且开源的。如果您觉得有用,请考虑支持开发。",
|
|
6
6
|
"advancedHeader": "高级选项",
|
|
7
7
|
"apiKeyLabel": "API密钥",
|
|
@@ -82,11 +82,7 @@
|
|
|
82
82
|
"localSnapshotDesc": "由本适配器保存在 ioBroker 服务器上的快照。与 Govee Home 应用无关。",
|
|
83
83
|
"localSnapshotsFolder": "用户保存的本地快照",
|
|
84
84
|
"logAbortFailed": "超时失败后向导中止:{msg}",
|
|
85
|
-
"
|
|
86
|
-
"logGapsSuffix": ",检测到间隙(manual_list=\"{list}\")",
|
|
87
|
-
"logIdleTimeout": "{name} 的分段向导:空闲超时(5 分钟),已中止",
|
|
88
|
-
"logNoGapsSuffix": ",无间隙",
|
|
89
|
-
"manualListDesc": "manualListDesc",
|
|
85
|
+
"manualListDesc": "以逗号分隔的索引和范围,例如 \"0-9\" 或 \"0-8,10-14\"(仅当 manual_mode=true 时)",
|
|
90
86
|
"manualSegmentList": "手动分段列表",
|
|
91
87
|
"manualSegmentsActive": "手动分段已启用",
|
|
92
88
|
"manualSegmentsDesc": "启用手动分段列表(例如剪短的 LED 灯带,物理分段数少于报告值)",
|
|
@@ -126,6 +122,7 @@
|
|
|
126
122
|
"scene": "场景",
|
|
127
123
|
"sceneSpeed": "场景速度",
|
|
128
124
|
"seenSoFar": "到目前为止标记为可见:[{list}]",
|
|
125
|
+
"segmentCount": "分段数量",
|
|
129
126
|
"segmentFlashing": "► 段 {idx} 现在呈白色亮起。",
|
|
130
127
|
"segmentWizardDeviceOption": "%s(%s,当前有 %s 个段)",
|
|
131
128
|
"supportHeader": "支持",
|
package/admin/jsonConfig.json
CHANGED
|
@@ -23,9 +23,11 @@ __export(capability_mapper_exports, {
|
|
|
23
23
|
buildCloudStateDefs: () => buildCloudStateDefs,
|
|
24
24
|
buildLanStateDefs: () => buildLanStateDefs,
|
|
25
25
|
getDefaultLanStates: () => getDefaultLanStates,
|
|
26
|
+
getMusicModeOptions: () => getMusicModeOptions,
|
|
26
27
|
hasDynamicSceneCapability: () => hasDynamicSceneCapability,
|
|
27
28
|
mapCapabilities: () => mapCapabilities,
|
|
28
29
|
mapCloudStateValue: () => mapCloudStateValue,
|
|
30
|
+
musicModeNameUsesRgb: () => musicModeNameUsesRgb,
|
|
29
31
|
planCloudCapabilityWrites: () => planCloudCapabilityWrites
|
|
30
32
|
});
|
|
31
33
|
module.exports = __toCommonJS(capability_mapper_exports);
|
|
@@ -94,7 +96,7 @@ function hasDynamicSceneCapability(capabilities, instance) {
|
|
|
94
96
|
(cap) => typeof (cap == null ? void 0 : cap.type) === "string" && typeof (cap == null ? void 0 : cap.instance) === "string" && (cap.type === import_govee_constants.GOVEE_CAP_TYPE.DYNAMIC_SCENE || cap.type === "dynamic_scene") && cap.instance === instance
|
|
95
97
|
);
|
|
96
98
|
}
|
|
97
|
-
const LAN_STATE_IDS = /* @__PURE__ */ new Set(["power", "brightness", "
|
|
99
|
+
const LAN_STATE_IDS = /* @__PURE__ */ new Set(["power", "brightness", "color_rgb", "color_temperature"]);
|
|
98
100
|
function getDefaultLanStates() {
|
|
99
101
|
return [
|
|
100
102
|
{
|
|
@@ -121,7 +123,7 @@ function getDefaultLanStates() {
|
|
|
121
123
|
capabilityInstance: "brightness"
|
|
122
124
|
},
|
|
123
125
|
{
|
|
124
|
-
id: "
|
|
126
|
+
id: "color_rgb",
|
|
125
127
|
name: (0, import_i18n.tName)("colorRgb"),
|
|
126
128
|
type: "string",
|
|
127
129
|
role: "level.color.rgb",
|
|
@@ -131,7 +133,7 @@ function getDefaultLanStates() {
|
|
|
131
133
|
capabilityInstance: "colorRgb"
|
|
132
134
|
},
|
|
133
135
|
{
|
|
134
|
-
id: "
|
|
136
|
+
id: "color_temperature",
|
|
135
137
|
name: (0, import_i18n.tName)("colorTemperature"),
|
|
136
138
|
type: "number",
|
|
137
139
|
role: "level.color.temperature",
|
|
@@ -252,7 +254,7 @@ function mapColorSetting(cap) {
|
|
|
252
254
|
if (cap.instance === "colorRgb") {
|
|
253
255
|
return [
|
|
254
256
|
{
|
|
255
|
-
id: "
|
|
257
|
+
id: "color_rgb",
|
|
256
258
|
name: (0, import_i18n.tName)("colorRgb"),
|
|
257
259
|
type: "string",
|
|
258
260
|
role: "level.color.rgb",
|
|
@@ -267,7 +269,7 @@ function mapColorSetting(cap) {
|
|
|
267
269
|
const range = (_a = cap.parameters) == null ? void 0 : _a.range;
|
|
268
270
|
return [
|
|
269
271
|
{
|
|
270
|
-
id: "
|
|
272
|
+
id: "color_temperature",
|
|
271
273
|
name: (0, import_i18n.tName)("colorTemperature"),
|
|
272
274
|
type: "number",
|
|
273
275
|
role: "level.color.temperature",
|
|
@@ -336,6 +338,8 @@ function mapProperty(cap) {
|
|
|
336
338
|
role,
|
|
337
339
|
write: false,
|
|
338
340
|
unit: (_b = normalizeUnit((_a = cap.parameters) == null ? void 0 : _a.unit)) != null ? _b : unit,
|
|
341
|
+
def: 0,
|
|
342
|
+
// avoid null in vis until the first sensor reading (consistency — B11)
|
|
339
343
|
capabilityType: cap.type,
|
|
340
344
|
capabilityInstance: cap.instance,
|
|
341
345
|
channel: "sensor"
|
|
@@ -496,6 +500,25 @@ function mapEvent(cap) {
|
|
|
496
500
|
}
|
|
497
501
|
];
|
|
498
502
|
}
|
|
503
|
+
function musicModeNameUsesRgb(name) {
|
|
504
|
+
if (typeof name !== "string") {
|
|
505
|
+
return false;
|
|
506
|
+
}
|
|
507
|
+
const n = name.trim().toLowerCase();
|
|
508
|
+
return n === "spectrum" || n === "rolling";
|
|
509
|
+
}
|
|
510
|
+
function getMusicModeOptions(cap) {
|
|
511
|
+
var _a;
|
|
512
|
+
const fields = (_a = cap.parameters) == null ? void 0 : _a.fields;
|
|
513
|
+
if (!Array.isArray(fields)) {
|
|
514
|
+
return [];
|
|
515
|
+
}
|
|
516
|
+
const modeField = fields.find((f) => f && typeof f.fieldName === "string" && f.fieldName === "musicMode");
|
|
517
|
+
if (!(modeField == null ? void 0 : modeField.options) || !Array.isArray(modeField.options)) {
|
|
518
|
+
return [];
|
|
519
|
+
}
|
|
520
|
+
return modeField.options.filter((o) => !!o && typeof o.name === "string");
|
|
521
|
+
}
|
|
499
522
|
function mapMusicSetting(cap) {
|
|
500
523
|
var _a;
|
|
501
524
|
const fields = (_a = cap.parameters) == null ? void 0 : _a.fields;
|
|
@@ -503,22 +526,15 @@ function mapMusicSetting(cap) {
|
|
|
503
526
|
return [];
|
|
504
527
|
}
|
|
505
528
|
const states = [];
|
|
506
|
-
const
|
|
507
|
-
if (
|
|
508
|
-
const modeStates = { 0: "---" };
|
|
509
|
-
for (const opt of modeField.options) {
|
|
510
|
-
if (!opt || typeof opt.name !== "string") {
|
|
511
|
-
continue;
|
|
512
|
-
}
|
|
513
|
-
modeStates[safeStringify(opt.value)] = opt.name;
|
|
514
|
-
}
|
|
529
|
+
const modeOptions = getMusicModeOptions(cap);
|
|
530
|
+
if (modeOptions.length > 0) {
|
|
515
531
|
states.push({
|
|
516
532
|
id: "music_mode",
|
|
517
533
|
name: (0, import_i18n.tName)("musicMode"),
|
|
518
534
|
type: "mixed",
|
|
519
535
|
role: "state",
|
|
520
536
|
write: true,
|
|
521
|
-
states:
|
|
537
|
+
states: (0, import_types.buildUniqueLabelMap)(modeOptions),
|
|
522
538
|
def: "0",
|
|
523
539
|
capabilityType: cap.type,
|
|
524
540
|
capabilityInstance: cap.instance
|
|
@@ -560,11 +576,11 @@ function mapMusicSetting(cap) {
|
|
|
560
576
|
}
|
|
561
577
|
function applyQuirksToStates(sku, states, log) {
|
|
562
578
|
for (const state of states) {
|
|
563
|
-
if (state.id === "
|
|
579
|
+
if (state.id === "color_temperature" && state.min != null && state.max != null) {
|
|
564
580
|
const corrected = (0, import_device_registry.applyColorTempQuirk)(sku, state.min, state.max);
|
|
565
581
|
if (corrected.min !== state.min || corrected.max !== state.max) {
|
|
566
582
|
log.debug(
|
|
567
|
-
`Quirk applied for ${sku}:
|
|
583
|
+
`Quirk applied for ${sku}: color_temperature range ${state.min}-${state.max}K \u2192 ${corrected.min}-${corrected.max}K`
|
|
568
584
|
);
|
|
569
585
|
}
|
|
570
586
|
state.min = corrected.min;
|
|
@@ -617,7 +633,7 @@ function mapCloudStateValue(cap) {
|
|
|
617
633
|
if (cap.instance === "colorRgb") {
|
|
618
634
|
const num = (_b = coerceNum(raw)) != null ? _b : 0;
|
|
619
635
|
return {
|
|
620
|
-
stateId: "
|
|
636
|
+
stateId: "color_rgb",
|
|
621
637
|
value: (0, import_types.rgbToHex)(num >> 16 & 255, num >> 8 & 255, num & 255)
|
|
622
638
|
};
|
|
623
639
|
}
|
|
@@ -626,7 +642,7 @@ function mapCloudStateValue(cap) {
|
|
|
626
642
|
if (n === null) {
|
|
627
643
|
return null;
|
|
628
644
|
}
|
|
629
|
-
return { stateId: "
|
|
645
|
+
return { stateId: "color_temperature", value: n };
|
|
630
646
|
}
|
|
631
647
|
return null;
|
|
632
648
|
case "toggle":
|
|
@@ -640,6 +656,9 @@ function mapCloudStateValue(cap) {
|
|
|
640
656
|
}
|
|
641
657
|
return null;
|
|
642
658
|
case "dynamic_scene":
|
|
659
|
+
if (cap.instance === "snapshot") {
|
|
660
|
+
return null;
|
|
661
|
+
}
|
|
643
662
|
return {
|
|
644
663
|
stateId: sanitizeId(cap.instance),
|
|
645
664
|
value: safeStringify(raw)
|
|
@@ -737,7 +756,7 @@ function buildLanStateDefs(device, log) {
|
|
|
737
756
|
return stateDefs;
|
|
738
757
|
}
|
|
739
758
|
function buildDiagStateDefs(tierDef) {
|
|
740
|
-
|
|
759
|
+
const defs = [
|
|
741
760
|
{
|
|
742
761
|
id: "export",
|
|
743
762
|
name: (0, import_i18n.tName)("exportDiagnostics"),
|
|
@@ -759,8 +778,10 @@ function buildDiagStateDefs(tierDef) {
|
|
|
759
778
|
capabilityType: "local",
|
|
760
779
|
capabilityInstance: "diagnosticsResult",
|
|
761
780
|
channel: "diag"
|
|
762
|
-
}
|
|
763
|
-
|
|
781
|
+
}
|
|
782
|
+
];
|
|
783
|
+
if (tierDef !== null) {
|
|
784
|
+
defs.push({
|
|
764
785
|
id: "tier",
|
|
765
786
|
name: (0, import_i18n.tName)("deviceTier"),
|
|
766
787
|
type: "string",
|
|
@@ -776,8 +797,9 @@ function buildDiagStateDefs(tierDef) {
|
|
|
776
797
|
capabilityType: "local",
|
|
777
798
|
capabilityInstance: "diagnosticsTier",
|
|
778
799
|
channel: "diag"
|
|
779
|
-
}
|
|
780
|
-
|
|
800
|
+
});
|
|
801
|
+
}
|
|
802
|
+
return defs;
|
|
781
803
|
}
|
|
782
804
|
function buildCloudStateDefs(device, log, localSnapshots, memberDevices) {
|
|
783
805
|
if (device.sku === "BaseGroup") {
|
|
@@ -974,7 +996,7 @@ function buildGroupStateDefs(members) {
|
|
|
974
996
|
});
|
|
975
997
|
}
|
|
976
998
|
}
|
|
977
|
-
stateDefs.push(...buildDiagStateDefs(
|
|
999
|
+
stateDefs.push(...buildDiagStateDefs(null));
|
|
978
1000
|
return stateDefs;
|
|
979
1001
|
}
|
|
980
1002
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -984,9 +1006,11 @@ function buildGroupStateDefs(members) {
|
|
|
984
1006
|
buildCloudStateDefs,
|
|
985
1007
|
buildLanStateDefs,
|
|
986
1008
|
getDefaultLanStates,
|
|
1009
|
+
getMusicModeOptions,
|
|
987
1010
|
hasDynamicSceneCapability,
|
|
988
1011
|
mapCapabilities,
|
|
989
1012
|
mapCloudStateValue,
|
|
1013
|
+
musicModeNameUsesRgb,
|
|
990
1014
|
planCloudCapabilityWrites
|
|
991
1015
|
});
|
|
992
1016
|
//# sourceMappingURL=capability-mapper.js.map
|