All apps · 0 apps
liebherr2mqtt
Docker app from ripleyxlr8's Repository
Overview
Readme
View on GitHub

liebherr2mqtt
Liebherr SmartDevice HomeAPI → MQTT bridge, with Home Assistant style discovery.
Brings a connected Liebherr fridge or freezer into Jeedom, Home Assistant,
or anything else that speaks MQTT Discovery — in real time, without polling the cloud.
Why
Liebherr appliances fitted with a SmartDeviceBox are cloud-only in practice. The box does contain a LocalAPI, but Liebherr disables it remotely on consumer appliances — it is only enabled on the SmartModule of their professional ranges. The remaining option is the official SmartDevice HomeAPI, published in beta in April 2025.
Home Assistant has had a first-class integration for it since 2026.3. Jeedom has nothing. This bridge fills that gap, and works for any MQTT-Discovery consumer.
It is built on pyliebherrhomeapi, the library
behind Home Assistant's official liebherr integration, rather than on a hand-rolled HTTP client —
so it inherits that project's data model, error taxonomy and SSE reconnection logic.
Features
- Real-time, no polling. State changes arrive as a push over Server-Sent Events
(
/v1/sse/devices/{id}/controls). Liebherr rate-limits the HomeAPI and has been known to block calling IP addresses; this bridge simply does not hammer it. A single full re-read every 15 minutes (configurable, and disableable) acts as a safety net. - Auto-discovery. Entities appear on their own in Jeedom or Home Assistant, grouped as one device, with proper units, ranges and icons.
- Reconnection-proof. Discovery, states and command subscriptions are replayed on every MQTT (re)connection. This is the failure mode that silently breaks a lot of home-made bridges: with a non-persistent session the broker drops your subscriptions on any disconnect, and a bridge that only subscribes at startup keeps publishing states while quietly ignoring every command.
- Last Will. If the container dies, the appliance's online indicator flips to off by itself.
- Only what your appliance actually has. Entities are built from the controls the device declares, not from a hard-coded model list.
Supported controls
| HomeAPI control | Published as | Notes |
|---|---|---|
temperature |
sensor (measured) + number (setpoint) |
Uses the device's own min/max. Becomes a select if the appliance only accepts discrete steps. |
supercool |
switch |
Per zone |
superfrost |
switch |
Per zone |
partymode |
switch |
Whole appliance. ⚠️ Runs SuperCool/SuperFrost for 24 h |
nightmode |
switch |
Whole appliance |
holidaymode, bottletimer |
switch |
Whole appliance |
presentationlight |
number |
Brightness, 0…max |
icemaker |
select |
Off / On / MaxIce, MaxIce only if supported |
hydrobreeze |
select |
Off / Low / Medium / High |
biofreshplus |
select |
Only the modes the appliance reports as supported |
autodoor |
sensor (state) + switch (open) |
|
| — | binary_sensor "online" |
Connectivity, backed by the MQTT Last Will |
Multi-zone appliances get one entity per zone, suffixed with the zone position.
❌ Door state and door alarms are not available. They are not part of the HomeAPI — the mobile app reads them from a separate, undocumented internal API.
Getting an API key
In the SmartDevice mobile app:
Settings → Become a beta tester → Activate the HomeAPI interface → Generate a new key
⚠️ The key can only be copied once. Copy it before leaving that screen.
Running it
Docker
docker run -d \
--name liebherr2mqtt \
--restart unless-stopped \
-e LIEBHERR_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
-e MQTT_HOST=192.168.1.10 \
-e MQTT_USER=mqttuser \
-e MQTT_PASSWORD=mqttpassword \
ghcr.io/ripleyxlr8/liebherr2mqtt:latest
Unraid
Install it from Community Applications — open the Apps tab and search for liebherr2mqtt.
Every setting is a field in the UI, and the API key field is masked.
The CA template lives in ripleyXLR8/unraid-templates, which is the repository Community Applications indexes.
Configuration
Everything can be set through environment variables, or through a
/config/liebherr2mqtt.conf file (see liebherr2mqtt.conf.template).
Environment variables win over the file, and the file is entirely optional.
| Variable | Default | Meaning |
|---|---|---|
LIEBHERR_API_KEY |
— | Required. HomeAPI key from the app |
LIEBHERR_REFRESH_INTERVAL |
900 |
Seconds between full re-reads; 0 disables |
MQTT_HOST / MQTT_PORT |
127.0.0.1 / 1883 |
Broker |
MQTT_USER / MQTT_PASSWORD |
empty | Leave empty for an anonymous broker |
MQTT_CLIENT_ID |
liebherr2mqtt |
|
MQTT_DISCOVERY_PREFIX |
homeassistant |
Where discovery messages go |
MQTT_TOPIC_PREFIX |
liebherr |
Root of state and command topics |
LOG_LEVEL |
INFO |
DEBUG, INFO, WARNING, ERROR |
Topics
liebherr/<device>/availability online | offline
liebherr/<device>/<entity>/state current value (retained)
liebherr/<device>/<entity>/set command
homeassistant/<component>/liebherr_<device>/<entity>/config discovery (retained)
Jeedom notes
Install the MQTT Discovery plugin, point it at your broker, and the appliance shows up on its own. Two traps worth knowing:
- ⚠️ Add
liebherrto the plugin's "data topics" setting. The plugin checks that the root of a discovery message's state topic is in that list, and silently ignores the message otherwise — it merely records the unknown root indiscovered_data_topics. Nothing appears, and nothing explains why. - The plugin renames a command after the discovery
device_class, which is why the setpoint here deliberately carries nodevice_class: it would be created as a second command named "Temperature" instead of "Setpoint".
Home Assistant notes
If you use Home Assistant, prefer its
official liebherr integration — it
talks to the same API directly, with no broker in between. This bridge is for everything else.
License
MIT — see LICENSE.
Not affiliated with, endorsed by, or supported by Liebherr. "Liebherr", "SmartDevice", "BioFresh", "SuperCool" and "SuperFrost" are trademarks of their respective owners.
Install Liebherr2mqtt on Unraid in a few clicks.
Find Liebherr2mqtt in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.
Requirements
Categories
Related apps
Explore more like this
Explore allDetails
ghcr.io/ripleyxlr8/liebherr2mqtt:latestRuntime arguments
- Network
bridge- Shell
sh- Privileged
- false
Template configuration
Generated in the Liebherr SmartDevice mobile app: Settings > Become a beta tester > Activate the HomeAPI interface > Generate a new key. The key can only be copied once, so save it somewhere before leaving that screen.
- Target
- LIEBHERR_API_KEY
IP address or hostname of your MQTT broker.
- Target
- MQTT_HOST
Port of your MQTT broker.
- Target
- MQTT_PORT
- Default
- 1883
Leave empty if your broker allows anonymous connections.
- Target
- MQTT_USER
Leave empty if your broker allows anonymous connections.
- Target
- MQTT_PASSWORD
Where discovery messages are published. Must match what your consumer listens on: homeassistant for Home Assistant, or the configuration topic of the Jeedom MQTT Discovery plugin.
- Target
- MQTT_DISCOVERY_PREFIX
- Default
- homeassistant
Root of the state and command topics. Jeedom users: this prefix must ALSO be listed in the data topics setting of the MQTT Discovery plugin, otherwise the plugin silently ignores the discovery messages.
- Target
- MQTT_TOPIC_PREFIX
- Default
- liebherr
Seconds between two full re-reads of the appliance state, 0 disables it. Changes normally arrive as a push, so this is only a safety net. Do not lower it much: Liebherr rate-limits the HomeAPI.
- Target
- LIEBHERR_REFRESH_INTERVAL
- Default
- 900
Only change this if another client already uses that id on your broker.
- Target
- MQTT_CLIENT_ID
- Default
- liebherr2mqtt
DEBUG, INFO, WARNING or ERROR.
- Target
- LOG_LEVEL
- Default
- INFO
Timezone used for the timestamps in the container log.
- Target
- TZ
- Default
- Europe/Paris
Optional. Lets you supply a liebherr2mqtt.conf file instead of the variables above. The variables take precedence over the file, so you can leave this unset.
- Target
- /config