electrolux2mqtt

electrolux2mqtt

Docker app from ripleyxlr8's Repository

Overview

Bridges connected Electrolux, AEG, Frigidaire and +home appliances to your MQTT broker, using Home Assistant style discovery. Your appliances then show up on their own in Jeedom, Home Assistant, or any other MQTT Discovery consumer. EVERY APPLIANCE, NOT JUST ONE FAMILY: Entities are derived from the capabilities the appliance itself declares, so ovens, hobs, hoods, fridges, dishwashers, washers, dryers, air conditioners, purifiers, dehumidifiers and robot vacuums all work - programs, states, temperatures, food probe, door, remaining time, alerts, and the settings your own appliance exposes. Verified against the capability sets of 14 appliance families shipped with the official Electrolux SDK. REAL TIME, NO POLLING: State changes arrive as a push over the API's Server-Sent Events livestream, so the cloud is never polled in a loop. A full re-read every 15 minutes acts as a safety net. The bridge is built on electrolux-group-developer-sdk, the SDK published by Electrolux itself. ROBUST: Discovery, states and command subscriptions are replayed on every reconnection to the broker, so a broker restart cannot leave the bridge publishing states while silently ignoring commands. An MQTT Last Will reports the bridge going down. Electrolux rotates the refresh token on every renewal, so the current pair is persisted in the config folder - a restart never leaves you locked out with a spent token. REQUIREMENTS: An MQTT broker, and credentials from https://developer.electrolux.one/dashboard : create an API key, then generate an access token / refresh token pair. The appliance must first be paired and named in the Electrolux or AEG mobile app. A note on control: monitoring always works, but commands are gated by the appliance. On ovens and hobs, remote operation must be enabled on the appliance's own display and switches itself off after a while, which is a safety requirement, not a limitation of this bridge. A read-only mode is available. Not affiliated with, endorsed by, or supported by Electrolux Group.

electrolux2mqtt
electrolux2mqtt

Electrolux Group API → MQTT bridge, with Home Assistant style discovery.
Brings connected Electrolux, AEG, Frigidaire and +home appliances into Jeedom, Home Assistant, or anything else that speaks MQTT Discovery — in real time, without polling the cloud.


Why

Electrolux appliances are cloud-only: there is no local API, and no Matter. Since late 2024 the group runs an official developer portal, so an integration no longer has to reverse-engineer the mobile app.

Home Assistant users have community integrations. Jeedom has nothing — no Electrolux plugin exists on the market, and the HomeConnect plugin covers the BSH platform (Bosch, Siemens, Neff, Gaggenau), not this one. This bridge fills that gap, and works for any MQTT-Discovery consumer.

It is built on electrolux-group-developer-sdk, the SDK published by Electrolux itself, rather than on a hand-rolled HTTP client — so it inherits the official data model, token handling and event stream.

Features

  • Real-time, no polling. State changes arrive as a push over the API's Server-Sent Events livestream. A single full re-read every 15 minutes (configurable, and disableable) acts as a safety net — that is 96 API calls a day, whatever your appliance does.
  • Every appliance, not just one family. Entities are derived from the capabilities the appliance itself declares, so ovens, hobs, hoods, fridges, dishwashers, washers, dryers, air conditioners, purifiers, dehumidifiers and robot vacuums all work, and a property Electrolux adds tomorrow shows up without a code change. Verified against the capability sets of 14 appliance families shipped with the official SDK.
  • Auto-discovery. Entities appear on their own, grouped as one device, with proper components: measurements as sensors, on/off properties as switches, enumerations as selects, ranges as numbers, and write-only commands (START, STOPRESET, …) as buttons.
  • Sensible by default. Temperatures are published in one unit, not twice; maintenance counters and algorithm internals are filtered out; end-of-cycle time is derived from the remaining seconds, because 20:45 beats 4380 s on a dashboard.
  • 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.
  • Token-safe. Electrolux rotates the refresh token on every renewal. The current pair is persisted, so a container restart does not leave you locked out with a spent token.
  • Read-only mode. One switch to expose states and no commands at all — worth considering on an oven or a hob.

About remote control

Monitoring always works. Commands are gated by the appliance itself: on ovens and hobs, remote operation has to be enabled on the appliance's own display, and EU regulations make it switch itself off again after a while. When a command is rejected, the bridge logs the reason and points at the current remoteControl value, which is published as an entity of its own.

Getting your credentials

  1. Pair the appliance in the Electrolux (or AEG) mobile app, and give it a name.
  2. Go to https://developer.electrolux.one/dashboard, sign in with the same account.
  3. Create an API key, then generate an access token / refresh token pair.

--dump prints everything the API knows about your appliances — including the full capability tree — which is the fastest way to see what the bridge will produce:

docker run --rm \
  -e ELECTROLUX_API_KEY=... -e ELECTROLUX_REFRESH_TOKEN=... \
  ghcr.io/ripleyxlr8/electrolux2mqtt:latest --dump

Running it

Docker

docker run -d --name electrolux2mqtt \
  -e ELECTROLUX_API_KEY=... \
  -e ELECTROLUX_REFRESH_TOKEN=... \
  -e MQTT_HOST=192.168.1.10 \
  -v /path/to/config:/config \
  ghcr.io/ripleyxlr8/electrolux2mqtt:latest

Mounting /config is not strictly required, but strongly recommended: that is where the rotating token pair is stored.

Unraid

The template is in ripleyXLR8/unraid-templates, and the app is listed in Community Applications.

Configuration

Everything can be set through environment variables, or through electrolux2mqtt.conf in the mounted /config folder. Variables win over the file.

Variable Default What it does
ELECTROLUX_API_KEY API key from the developer portal (required)
ELECTROLUX_REFRESH_TOKEN Refresh token from the developer portal (required)
ELECTROLUX_ACCESS_TOKEN Optional; obtained from the refresh token when absent
ELECTROLUX_TOKEN_FILE /config/electrolux_token.json Where the rotating pair is persisted
ELECTROLUX_REFRESH_INTERVAL 900 Seconds between safety re-reads, 0 disables
ELECTROLUX_TEMPERATURE_UNIT auto auto, C or F
ELECTROLUX_READ_ONLY false true publishes states only
ELECTROLUX_EXCLUDE / ELECTROLUX_INCLUDE Shell-style patterns on property paths
MQTT_HOST / MQTT_PORT 127.0.0.1 / 1883 Broker
MQTT_USER / MQTT_PASSWORD Leave empty for an anonymous broker
MQTT_DISCOVERY_PREFIX homeassistant Where discovery messages go
MQTT_TOPIC_PREFIX electrolux Root of state and command topics
MQTT_CLIENT_ID electrolux2mqtt
LOG_LEVEL INFO DEBUG also logs every raw event

Topics

electrolux/<appliance>/<entity>/state          state
electrolux/<appliance>/<entity>/set            command
electrolux/<appliance>/availability            online / offline
homeassistant/<component>/electrolux_<appliance>/<entity>/config   discovery (retained)

Jeedom notes

  • The plugin only creates equipment for topic roots listed in its data topics setting, so electrolux has to be there. You do not have to type it: start the plugin daemon, wait a minute, refresh its configuration page, and the roots it has discovered but that are not configured yet are offered with a + button. This is deliberate and documented — the plugin does not auto-enable everything it finds, because that would create a lot of equipment nobody asked for.
  • The plugin renames a command after its device_class only when the discovery payload carries no name. Since the MQTT Discovery beta of 2026-09-05 a published name wins, so the bridge no longer strips duplicate classes: an appliance with two temperature entities keeps its own labels, and every command still gets the generic_type and default widget the class brings.
  • A number component creates two Jeedom commands: the hidden info, and a slider action.
  • Command names are only set on creation: renaming one in Jeedom is permanent, and a re-publication will not overwrite it. The same is true of the display defaults the plugin derives from device_class — they are applied when the command is created, never on a later re-discovery.
  • ⚠️ The core::alert widget is red on 0 and green on 1, which is the opposite of what its name suggests — Jeedom defines it in core/config/jeedom.config.php with #_icon_on_# as a green check and #_icon_off_# as a red alert. This bridge follows the Home Assistant conventions: device_class: connectivity is ON while the link is up, and device_class: problem is ON while there is a problem. The plugin maps neither class, so if you put those commands on core::alert, tick "invert binary" by hand on the descaling and cleaning reminders and leave it off on the online indicator. Backwards, an oven that is asking for a cleaning cycle shows up green.

Home Assistant notes

If you already run Home Assistant, its community integrations do this natively and you probably do not need this bridge. It is useful when your controller is Jeedom, openHAB, Node-RED, or anything else on MQTT.

Tests

python tests/test_mapping.py checks the capability-to-entity mapping against a synthetic steam oven — no broker, no credentials, no network.

License

MIT. Not affiliated with, endorsed by, or supported by Electrolux Group.

Install Electrolux2mqtt on Unraid in a few clicks.

Find Electrolux2mqtt 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.

Open the Apps tab on your Unraid server Search Community Apps for Electrolux2mqtt Review the template variables and paths Click Install

Requirements

An MQTT broker, and credentials created at https://developer.electrolux.one/dashboard (an API key, plus an access token / refresh token pair). The appliance must already be paired and named in the Electrolux or AEG mobile app.

Categories

Related apps

Explore more like this

Explore all

Details

Repository
ghcr.io/ripleyxlr8/electrolux2mqtt:latest
Last Updated2026-09-08
First Seen2026-09-04

Runtime arguments

Network
bridge
Shell
sh
Privileged
false

Template configuration

API keyVariable

Created at https://developer.electrolux.one/dashboard, signed in with the same account as the mobile app.

Target
ELECTROLUX_API_KEY
Refresh tokenVariable

Generated on the same portal page as the API key. Only used to bootstrap: the bridge stores the rotating token pair in the config folder.

Target
ELECTROLUX_REFRESH_TOKEN
Access tokenVariable

Optional. Left empty, the bridge obtains one from the refresh token at startup.

Target
ELECTROLUX_ACCESS_TOKEN
MQTT broker hostVariable

IP address or hostname of your MQTT broker.

Target
MQTT_HOST
MQTT broker portVariable

Port of your MQTT broker.

Target
MQTT_PORT
Default
1883
MQTT usernameVariable

Leave empty if your broker allows anonymous connections.

Target
MQTT_USER
MQTT passwordVariable

Leave empty if your broker allows anonymous connections.

Target
MQTT_PASSWORD
Config folderPathrw

Strongly recommended: this is where the rotating token pair is stored. Without it, a container restart may leave the bridge with a spent refresh token.

Target
/config
Read-only modeVariable

true publishes states only and exposes no command at all. Worth considering on an oven or a hob.

Target
ELECTROLUX_READ_ONLY
Default
false
Temperature unitVariable

auto, C or F. Appliances report the same temperature in both units; only one is published.

Target
ELECTROLUX_TEMPERATURE_UNIT
Default
auto
Discovery topic prefixVariable

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
State topic prefixVariable

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 - the plugin only creates equipment for roots listed there. You do not have to type it: once its daemon has run, the plugin offers the roots it has discovered with a + button.

Target
MQTT_TOPIC_PREFIX
Default
electrolux
Safety re-read intervalVariable

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.

Target
ELECTROLUX_REFRESH_INTERVAL
Default
900
Excluded propertiesVariable

Comma separated shell-style patterns matched against property paths, added to the built-in list. Example: networkInterface/*, userSelections/*

Target
ELECTROLUX_EXCLUDE
Included propertiesVariable

Comma separated patterns that win over the exclusions, to bring back a property filtered out by default.

Target
ELECTROLUX_INCLUDE
Token fileVariable

Where the rotating token pair is persisted. Keep it inside the mounted config folder.

Target
ELECTROLUX_TOKEN_FILE
Default
/config/electrolux_token.json
MQTT client idVariable

Only change this if another client already uses that id on your broker.

Target
MQTT_CLIENT_ID
Default
electrolux2mqtt
Log levelVariable

DEBUG, INFO, WARNING or ERROR. DEBUG also logs every raw event received from the cloud.

Target
LOG_LEVEL
Default
INFO
TimezoneVariable

Timezone used for the log timestamps and for the derived end-of-cycle time.

Target
TZ
Default
Europe/Paris