iobroker.tint
v0.4.16
Published
Control Müller Licht tint Zigbee lights via deCONZ/ConBee
Readme

ioBroker.tint
Tests:
tint adapter for ioBroker
Control Müller Licht tint Zigbee smart lights via a deCONZ / ConBee gateway. This adapter provides full control over individual lights, light groups, and scenes, and decodes every button and color-wheel event from the Tint remote control.
DISCLAIMER
The name Müller Licht and the product name tint are trademarks of Müller-Licht International GmbH. This adapter is an independent, community project and is not affiliated with or endorsed by Müller-Licht. The adapter communicates exclusively through the open deCONZ REST API provided by dresden elektronik.
Features
- Lights – switch, dim, change color temperature (2000–6500 K), set RGB color (hex, XY, hue/saturation)
- Light effects – colorloop, sunset, party, worklight, campfire, romance, nightlight
- Groups – control all lights in a group with a single state
- Scenes – recall named scenes per group
- Tint remote – full decoding of button events (short press, hold, release) and zone selection (1–3 / all)
- Color wheel – CIE XY coordinates and hex color derived from every wheel position change; optional auto-apply to the active zone
- Color temperature wheel – color temperature value in Kelvin delivered per remote event
- Real-time push – deCONZ WebSocket for instant state updates (no polling delay)
- Fallback polling – configurable REST polling interval for resilience
- Battery & reachability – monitored for every remote
Requirements
- deCONZ / ConBee gateway (ConBee I/II/III or RaspBee) with deCONZ software ≥ 2.x
- Müller Licht tint bulbs already paired to the deCONZ gateway
- deCONZ API key (unlock via the deCONZ app or Phoscon web interface)
- Node.js ≥ 20
Installation
Install via the ioBroker admin panel (search for tint) or from the command line:
iobroker add tintConfiguration
Object structure
Lights (lights.<id>.*)
| State | Type | R/W | Description |
|---|---|---|---|
| info.name | string | R | Light name from deCONZ |
| info.modelid | string | R | Model identifier |
| info.manufacturer | string | R | Manufacturer name |
| info.reachable | boolean | R | Zigbee reachability |
| info.uniqueid | string | R | Zigbee IEEE address |
| state.on | boolean | R/W | On / off |
| state.brightness | number (%) | R/W | Brightness 0–100 % |
| state.colorTemp | number (K) | R/W | Color temperature 2000–6500 K |
| state.hue | number | R/W | Hue 0–65535 |
| state.saturation | number | R/W | Saturation 0–254 |
| state.hex | string | R/W | RGB color as #RRGGBB hex string |
| state.x | number | R/W | CIE x chromaticity (raw) |
| state.y | number | R/W | CIE y chromaticity (raw) |
| state.colorMode | string | R | Active color mode (ct, xy, hs) |
| state.effect | string | R/W | Light effect (none, colorloop, …) |
| state.effectSpeed | number | R/W | Effect speed 0–255 |
| state.transitionTime | number (×100 ms) | R/W | Per-light transition time override |
Groups (groups.<id>.*)
| State | Type | R/W | Description |
|---|---|---|---|
| info.name | string | R | Group name |
| info.memberCount | number | R | Number of lights in the group |
| info.allOn | boolean | R | true when all lights in the group are on |
| info.anyOn | boolean | R | true when at least one light is on |
| action.on | boolean | R/W | Switch all lights in the group |
| action.brightness | number (%) | R/W | Group brightness 0–100 % |
| action.colorTemp | number (K) | R/W | Group color temperature 2000–6500 K |
| action.hex | string | R/W | Group RGB color as #RRGGBB |
| action.effect | string | R/W | Group light effect |
| action.transitionTime | number (×100 ms) | R/W | Group transition time override |
| action.activateScene | string | R/W | Write a scene name to recall it |
| scenes.<name> | boolean | R/W | Set to true to recall this scene |
Remotes (remotes.<id>.*)
| State | Type | R/W | Description |
|---|---|---|---|
| info.name | string | R | Remote name |
| info.battery | number (%) | R | Battery charge level |
| info.reachable | boolean | R | Zigbee reachability |
| info.lastSeen | string | R | Last seen timestamp |
| button.lastEvent | number | R | Raw deCONZ button event code |
| button.lastEventName | string | R | Human-readable event name |
| button.pressType | string | R | short, hold, or release |
| button.activeZone | number | R | Active zone: 0 = all, 1–3 = zone 1–3 |
| colorWheel.angle | number (°) | R | Color wheel angle 0–359 ° |
| colorWheel.x | number | R | CIE x of the selected color |
| colorWheel.y | number | R | CIE y of the selected color |
| colorWheel.hex | string | R | Selected color as #RRGGBB |
| colorWheel.triggered | boolean | R | Pulses true on each wheel event |
| colorTemp.value | number (K) | R | Selected color temperature in Kelvin |
| colorTemp.mired | number | R | Selected color temperature in mired |
| colorTemp.pressType | string | R | short or hold |
Plugs (plugs.<id>.*)
| State | Type | R/W | Description |
|---|---|---|---|
| info.name | string | R | Plug name from deCONZ |
| info.modelid | string | R | Model identifier |
| info.manufacturer | string | R | Manufacturer name |
| info.reachable | boolean | R | Zigbee reachability |
| info.uniqueid | string | R | Zigbee IEEE address |
| state.on | boolean | R/W | On / off |
Covers (covers.<id>.*)
| State | Type | R/W | Description |
|---|---|---|---|
| info.name | string | R | Cover name from deCONZ |
| info.modelid | string | R | Model identifier |
| info.manufacturer | string | R | Manufacturer name |
| info.reachable | boolean | R | Zigbee reachability |
| info.uniqueid | string | R | Zigbee IEEE address |
| state.position | number (%) | R/W | Cover position, 0 = closed, 100 = open |
| state.stop | boolean | R/W | Write true to stop movement |
Switches (switches.<id>.*)
| State | Type | R/W | Description |
|---|---|---|---|
| info.name | string | R | Switch name from deCONZ |
| info.battery | number (%) | R | Battery charge level |
| info.reachable | boolean | R | Zigbee reachability |
| info.lastSeen | string | R | Last seen timestamp |
| button.lastEvent | number | R | Raw deCONZ button event code |
| button.lastEventName | string | R | Human-readable event name |
Sensors (sensors.<id>.*)
| State | Type | R/W | Description |
|---|---|---|---|
| info.name | string | R | Sensor name from deCONZ |
| info.battery | number (%) | R | Battery charge level |
| info.reachable | boolean | R | Zigbee reachability |
| info.lastSeen | string | R | Last seen timestamp |
| value.temperature | number (°C) | R | Temperature (ZHATemperature sensors) |
| value.humidity | number (%) | R | Humidity (ZHAHumidity sensors) |
| value.pressure | number (hPa) | R | Air pressure (ZHAPressure sensors) |
| value.open | boolean | R | Open/close state (ZHAOpenClose sensors) |
| value.presence | boolean | R | Motion detected (ZHAPresence sensors) |
| value.brightness | number (lux) | R | Light level (ZHALightLevel sensors) |
| value.power | number (W) | R | Power draw (ZHAPower sensors) |
| value.consumption | number (kWh) | R | Energy consumption (ZHAConsumption sensors) |
| value.raw | mixed | R | Raw value fallback for unrecognized sensor types |
Thermostats (thermostats.<id>.*)
| State | Type | R/W | Description |
|---|---|---|---|
| info.name | string | R | Thermostat name from deCONZ |
| info.battery | number (%) | R | Battery charge level |
| info.reachable | boolean | R | Zigbee reachability |
| state.temperature | number (°C) | R | Measured temperature |
| state.valve | number (%) | R | Valve opening percentage |
| state.setpoint | number (°C) | R/W | Target temperature, 5–32 °C |
Changelog
0.4.16 (2026-07-05)
- (ssbingo) Add README.md and doc/ to npm package files[] so localised documentation is included in the published tarball; fixes ioBroker checker E6001
0.4.15 (2026-07-05)
- (ssbingo) Upgrade axios to ^1.18.1, @module-federation/vite to ^1.16.12, @vitejs/plugin-react to ^6.0.3; update dependabot.yml React ignore comment to document MF constraint; react/react-dom intentionally kept at ^18.x (React 19 incompatible with ioBroker Admin's MF webpack↔vite bridge)
0.4.14 (2026-07-03)
- (ssbingo) Use adapter-tracked clearTimeout in DeconzWebSocket (pass clearTimeout option alongside setTimeout); update package.json description to English; limit transitionTime config field max to 300 (= 30 s)
0.4.13 (2026-07-03)
- (ssbingo) Add transitionTime handling to light/group command handlers (was defined as writable but ignored); remove unused watchdogMinutes config parameter and admin UI field; add hyperlinks to Müller-Licht and dresden elektronik in README DISCLAIMER; remove unused i18n keys colAllOn, colAnyOn, stateYes, msgDeleting, watchdogMinutes
0.4.12 (2026-06-29)
- (ssbingo) Fix E1011/E1008/E1009/W1001 checker errors: replace unknown roles (info.hardware.model/serial, info.address.ieee) with 'text'; change role from 'value' to 'level' for writable number states (effectSpeed, transitionTime, x, y); change sensor fallback type from mixed to string with role 'text'; add all 11 language keys to info.connection name in io-package.json
0.4.11 (2026-06-29)
- (ssbingo) Fix E3009 object structure errors: add top-level namespace folder objects (lights, groups, plugs, covers, remotes, switches, sensors, thermostats) created before child device objects; add info channel to instanceObjects
0.4.10 (2026-06-29)
- (ssbingo) Fix React error #31 crash in adapter settings panels: downgrade React devDep back to ^18.3.1; ioBroker Admin uses React 18 and the webpack↔vite Module Federation bridge cannot share React between host and remote, so the bundled React version must be compatible with Admin's renderer
0.4.9 (2026-06-29)
- (ssbingo) Fix React error #31 crash in adapter settings panels: switch panels build to classic JSX runtime so JSX compiles to React.createElement() using Admin's shared React 18 singleton; React 19's automatic jsx-runtime uses Symbol('react.transitional.element') which Admin's React 18 renderer does not recognize
0.4.8 (2026-06-29)
- (ssbingo) Fix React error #31 crash in adapter settings panels: add react/jsx-runtime to Module Federation shared config so panels use Admin's React 18 runtime instead of the bundled React 19 runtime
0.4.7 (2026-06-28)
- (ssbingo) Fix admin tab language detection: read language from system config via connection when URL parameter is absent; swap tab order so Groups appears before Lights
0.4.6 (2026-06-28)
- (ssbingo) Bump dependabot/fetch-metadata GitHub Action v2 → v3; add dependabot ignore rules for @mui/material, @emotion/react, @emotion/styled major versions (must stay at MUI v6 / Emotion v11 to match ioBroker Admin MF singleton)
0.4.5 (2026-06-28)
- (ssbingo) Bump React to 19.2.7, @types/react to 19.2.17, @types/react-dom to 19.2.3 (minor updates within React 19); add .github/auto-merge.yml for Dependabot automerge configuration (S8914)
0.4.4 (2026-06-28)
- (ssbingo) Fix dependabot.yml cooldown syntax: correct key is "default-days" (object property per schema) instead of integer or "default"
0.4.3 (2026-06-28)
- (ssbingo) Fix: replace @ts-ignore with @ts-expect-error (ESLint ban-ts-comment rule); fix dependabot.yml cooldown to use scalar integer instead of nested object
0.4.2 (2026-06-28)
- (ssbingo) Upgrade React devDep to 19 and TypeScript to 6 to satisfy ioBroker checker W0083; fix tsconfig.check.json (exclude admin/src JSX files, add mocha types, disable strictNullChecks for JS files); fix type errors in main.js (Number cast for CIE xy coords, String cast for sceneId, JSDoc for _set val param)
0.4.1 (2026-06-28)
- (ssbingo) Fix: remove non-published 0.3.9 from news (E2004); add 7-day dependabot cooldown (E8915); downgrade @types/node to ^22 to match Node.js 22 engine target (W0066); bump @iobroker/types to 7.2.2 with null guards for getGroups/getSensors
0.4.0 (2026-06-28)
- (ssbingo) Add interactive controls to admin tab: on/off toggle switches for lights, plugs and groups; open/stop/close buttons for covers; setpoint ±0.5 °C adjustment for thermostats; fix connection lifecycle (registerConnectionHandler) so devices load reliably after tab opens
0.3.9 (2026-06-28)
- (ssbingo) Fix: downgrade @mui/material devDep from v9 to v6 — v9 fallback bundle crashed Admin Emotion v6 during MF shared-module negotiation, preventing adapter settings from opening
0.3.8 (2026-06-28)
- (ssbingo) Add admin sidebar tab for device control (Lights, Groups, Plugs, Covers, Switches, Sensors, Thermostats); activate via "enableAdminTab" in adapter settings Connection tab
0.3.7 (2026-06-28)
- (ssbingo) Fix: add xs/md/lg/xl grid attributes to jsonConfig staticText items (E5507); add deCONZ Pairing i18n key (E5612); pass adapter.setTimeout to DeconzWebSocket (E5005); update CI Node.js to 24 and add needs: check-and-lint for adapter-tests (E3022/E3014); add dependabot cooldown and @types/node major-version ignore rule (E8917/E8915)
0.3.6 (2026-06-28)
- (ssbingo) Fix: set repository URL to HTTPS format in package.json so the ioBroker adapter checker can resolve the GitHub raw file URL
0.3.5 (2026-06-28)
- (ssbingo) Dependency updates: vite 8.1, @vitejs/plugin-react v6 (Vite 8 compatibility), @module-federation/vite 1.16.10, @mui/material devDep 9.1.2, axios 1.18.1, @types/node 26, CI testing-action-check v2
0.3.4 (2026-06-23)
- (ssbingo) Fix: logo (admin/tint.png) was 300×358 (not square), which the repository checker flags; padded to 358×358 with a transparent border, no content cropped or distorted
Documentation
- 🇩🇪 Deutsche Dokumentation
- 🇷🇺 Документация на русском
- 🇳🇱 Nederlandse documentatie
- 🇫🇷 Documentation française
- 🇮🇹 Documentazione italiana
- 🇪🇸 Documentación en español
- 🇵🇱 Dokumentacja polska
- 🇵🇹 Documentação portuguesa
- 🇺🇦 Документація українською
- 🇨🇳 简体中文文档
Older changelogs can be found in CHANGELOG_OLD.md.
License
MIT License
Copyright (c) 2026 ssbingo [email protected]
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

