MQTT Topics Documentation¶
Introduction¶
This document describes the MQTT topics published by the Genius Gateway. The gateway supports both Home Assistant auto-discovery and custom MQTT topics for integration with other home automation systems connecting to a MQTT broker.
MQTT Configuration¶
MQTT functionality is mainly configured via web frontend or HTTP API endpoints:
- Framework MQTT Settings:
/rest/mqttSettings- Basic MQTT connection settings - Simple Alarm Publishing:
/rest/alarm-publishing- Genius Gateway specific publishing options
Framework MQTT Topics (ESP32 SvelteKit)¶
Device Status Topic (LWT)¶
Topic
device-mac format
device-mac is the device's MAC address with lowercase hex digits and without any delimiters.
E.g.: 1A:2B:3C:4D:5E:6F 1a2b3c4d5e6f
Description: Framework device online/offline status using MQTT Last Will and Testament (LWT)
QoS: 1
Retain: true
Payloads
Published when device connects to MQTT broker:
Published automatically by broker when device disconnects (LWT message):
Home Assistant Auto-Discovery¶
The gateway supports Home Assistant's MQTT Discovery protocol for automatic device integration.
Gateway Device¶
The Genius Gateway itself is published as a Home Assistant device with diagnostic sensors, remote control buttons, and configuration switches.
Requirements:
- Home Assistant Integration must be enabled
- MQTT broker must be connected
Overview¶
The gateway device publishes:
- 1 Status Sensor - Registers the gateway device in Home Assistant
- 2 Diagnostic Sensors - Free heap memory (%) and core temperature (°C)
- 1 Restart Button - Remote gateway restart capability
- 4 Configuration Switches - Remote control of gateway settings
Topic Structure:
Gateway Device ID Format
The gateway_device_id follows the format genius-gateway-{device-mac}, where device-mac is the device's MAC address with lowercase hex digits and without any delimiters.
E.g.: 1A:2B:3C:4D:5E:6F genius-gateway-1a2b3c4d5e6f
Device Status Sensor¶
Topic
Example: homeassistant/sensor/genius-gateway-1a2b3c4d5e6f/status/config
Description: Device registration sensor that makes the gateway visible in Home Assistant
QoS: 0
Retain: true
Payload
{
"~": "homeassistant/genius-gateway/genius-gateway-1a2b3c4d5e6f",
"name": "Status",
"unique_id": "genius-gateway-1a2b3c4d5e6f_status",
"state_topic": "~/status/state",
"value_template": "{{value_json.state}}",
"icon": "mdi:heart-pulse",
"entity_category": "diagnostic",
"device": {
"identifiers": ["genius-gateway-1a2b3c4d5e6f"],
"name": "Genius Gateway",
"manufacturer": "Genius Gateway Project",
"model": "Genius Gateway",
"sw_version": "1.1.0",
"configuration_url": "http://192.168.1.100"
}
}
Payload Fields
~- Topic prefix (base path for relative references)name- Entity name shown in Home Assistantunique_id- Unique identifier for this sensorstate_topic- Relative path to state topicvalue_template- Jinja2 template to extract state from JSONicon- Material Design icon identifierentity_category- Category (diagnosticfor system status)device- Device information objectidentifiers- Device identifier (array with gateway device ID)name- Device name shown in Home Assistantmanufacturer- Project namemodel- Device modelsw_version- Current firmware versionconfiguration_url- Web interface URL (only included if gateway has valid IP)
State Topic: {discovery_prefix}genius-gateway/{gateway_device_id}/status/state
State Payload
Publishing Behavior
- Published when MQTT connection is established
- Re-published when MQTT settings change
- State published immediately after config
- Published only if Home Assistant Integration is enabled
Home Assistant Integration
- Automatically creates gateway device with all associated entities
- Provides device information panel with manufacturer, model, and firmware version
- Links to gateway web interface via configuration URL
Diagnostic Sensors¶
The gateway publishes two diagnostic sensors that share a common state topic for efficient updates.
Free Heap Sensor¶
Config Topic
Example: homeassistant/sensor/genius-gateway-1a2b3c4d5e6f/free_heap/config
Description: Monitors available heap memory as percentage of total heap
QoS: 0
Retain: true
Config Payload
{
"~": "homeassistant/genius-gateway/genius-gateway-1a2b3c4d5e6f",
"name": "Free Heap",
"unique_id": "genius-gateway-1a2b3c4d5e6f_free_heap",
"state_topic": "~/diagnostics/state",
"value_template": "{{value_json.free_heap_percent|round(1)}}",
"unit_of_measurement": "%",
"state_class": "measurement",
"icon": "mdi:memory",
"entity_category": "diagnostic",
"device": {
"identifiers": ["genius-gateway-1a2b3c4d5e6f"]
}
}
Core Temperature Sensor¶
Config Topic
Example: homeassistant/sensor/genius-gateway-1a2b3c4d5e6f/core_temp/config
Description: Monitors ESP32 internal core temperature
QoS: 0
Retain: true
Config Payload
{
"~": "homeassistant/genius-gateway/genius-gateway-1a2b3c4d5e6f",
"name": "Core Temperature",
"unique_id": "genius-gateway-1a2b3c4d5e6f_core_temp",
"state_topic": "~/diagnostics/state",
"value_template": "{{value_json.core_temp|round(1)}}",
"unit_of_measurement": "°C",
"device_class": "temperature",
"state_class": "measurement",
"icon": "mdi:thermometer",
"entity_category": "diagnostic",
"device": {
"identifiers": ["genius-gateway-1a2b3c4d5e6f"]
}
}
Diagnostic State Topic¶
Topic
Example: homeassistant/genius-gateway/genius-gateway-1a2b3c4d5e6f/diagnostics/state
Description: Combined state topic for both diagnostic sensors
QoS: 0
Retain: false
Payload
Payload Fields
free_heap_percent- Available heap memory as percentage of total heap (float, 0-100)core_temp- ESP32 internal core temperature in degrees Celsius (float)
Publishing Behavior
- Published immediately after config messages (initial state)
- Published every 60 seconds via timer
- Re-published when MQTT connection is established
- Published only if Home Assistant Integration is enabled
Home Assistant Integration
- Automatically creates sensor entities with proper units and device classes
- Enables historical data tracking and graphing
- Can trigger automations based on memory or temperature thresholds
- Useful for monitoring gateway health and detecting potential issues
Restart Button¶
Config Topic
Example: homeassistant/button/genius-gateway/genius-gateway-1a2b3c4d5e6f/restart/config
topicNamespace format
topicNamespace is the slugified device name, e.g. genius-gateway. Together with the device ID, the config topic node becomes genius-gateway/genius-gateway-1a2b3c4d5e6f. This scoping ensures entities from different gateway instances never collide on a shared MQTT broker.
Description: Button entity for remotely restarting the gateway
QoS: 0
Retain: true
Config Payload
{
"~": "homeassistant/genius-gateway/genius-gateway-1a2b3c4d5e6f",
"name": "Restart",
"unique_id": "genius-gateway-1a2b3c4d5e6f_restart",
"command_topic": "~/restart/command",
"payload_press": "PRESS",
"icon": "mdi:restart",
"device": {
"identifiers": ["genius-gateway-1a2b3c4d5e6f"]
}
}
Key Fields
command_topic- Topic where button press commands are publishedpayload_press- Payload sent when button is pressed ("PRESS")icon- Restart icon for visual identification- No
entity_category— Restart appears under Controls on the HA device page
Command Topic: {discovery_prefix}genius-gateway/{gateway_device_id}/restart/command
Command Payload
Publishing Behavior
- Config published when MQTT connection is established
- Config re-published when MQTT settings change
- Gateway subscribes to command topic automatically
- Trigger immediate gateway restart on command reception
Home Assistant Integration
- Automatically creates button entity
- Press button to restart gateway remotely
- Useful for maintenance and troubleshooting without physical access
- Can be used in automations (e.g., scheduled restarts)
Configuration Switches¶
Four switches provide remote control of gateway configuration settings that affect device discovery and alert processing.
Config Topic Pattern
Switch Types:
| Suffix | Display Name | Setting Controlled |
|---|---|---|
alert_unknown | Alert on Unknown Detectors | Process alerts from unregistered smoke detectors |
line_commissioning | Add Line from Commissioning | Auto-add alarm lines from commissioning packets |
line_alarm | Add Line from Alarm | Auto-add alarm lines from alarm packets |
line_test | Add Line from Line Test | Auto-add alarm lines from line test packets |
Config Payload Example (Alert on Unknown Detectors)
{
"~": "homeassistant/genius-gateway/genius-gateway-1a2b3c4d5e6f",
"name": "Alert on Unknown Detectors",
"unique_id": "genius-gateway-1a2b3c4d5e6f_alert_unknown",
"state_topic": "~/gateway/state",
"value_template": "{{ value_json.alert_unknown }}",
"command_topic": "~/gateway/alert_unknown/set",
"icon": "mdi:toggle-switch-off-outline",
"entity_category": "config",
"device": {
"identifiers": ["genius-gateway-1a2b3c4d5e6f"]
}
}
Key Fields
state_topic- Shared JSON topic publishing all switch statesvalue_template- Template to extract specific switch state from JSONcommand_topic- Individual topic acceptingON/OFFcommandsentity_category-configfor configuration entities
Central State Topic:
State Payload (JSON with all switches)
Individual Command Topics:
Examples: - homeassistant/genius-gateway/genius-gateway-1a2b3c4d5e6f/gateway/alert_unknown/set - homeassistant/genius-gateway/genius-gateway-1a2b3c4d5e6f/gateway/line_commissioning/set - homeassistant/genius-gateway/genius-gateway-1a2b3c4d5e6f/gateway/line_alarm/set - homeassistant/genius-gateway/genius-gateway-1a2b3c4d5e6f/gateway/line_test/set
Command Payloads
Turn setting ON:
Turn setting OFF:
Publishing Behavior
- Config published when MQTT connection is established
- Config re-published when MQTT settings change
- Combined JSON state published immediately after configs (initial state)
- Single JSON state published when any setting changes (via web interface or MQTT)
- Gateway subscribes to all individual command topics automatically
Home Assistant Integration
- Automatically creates switch entities grouped under gateway device
- Toggle switches to modify gateway settings remotely
- State synchronization between Home Assistant and gateway web interface
- Can be used in automations for dynamic behavior control
- Useful for temporarily enabling/disabling features without accessing web UI
- Efficient state updates - All switches updated with a single MQTT message
Setting Synchronization
Changes made via Home Assistant switches are immediately reflected in the gateway web interface and vice versa. All settings are synchronized bidirectionally.
Efficient State Updates
All four configuration switches share a single JSON state topic. When any setting changes (even just one), all states are published in a single MQTT message, reducing network traffic and ensuring atomic updates.
Firmware Update Entity¶
The gateway publishes an update entity that integrates with Home Assistant's update functionality to manage firmware updates.
Config Topic
Example: homeassistant/update/genius-gateway-1a2b3c4d5e6f/firmware/config
Description: Update entity for firmware management with automatic version checking
QoS: 0
Retain: true
Config Payload
{
"~": "homeassistant/genius-gateway/genius-gateway-1a2b3c4d5e6f",
"name": "Firmware Update",
"unique_id": "genius-gateway-1a2b3c4d5e6f_firmware_update",
"state_topic": "~/update/state",
"command_topic": "~/update/install",
"payload_install": "INSTALL",
"title": "Genius Gateway Firmware",
"device_class": "firmware",
"entity_category": "config",
"icon": "mdi:cloud-download",
"device": {
"identifiers": ["genius-gateway-1a2b3c4d5e6f"]
}
}
Key Fields
state_topic- Topic publishing firmware version informationcommand_topic- Topic accepting update installation commandspayload_install- Payload to trigger update installation ("INSTALL")device_class- Device class (firmwarefor firmware updates)title- Update entity titleentity_category- Category (configfor configuration entities)
State Topic: {discovery_prefix}genius-gateway/{gateway_device_id}/update/state
State Payload
When no update is available:
{
"installed_version": "1.1.0",
"latest_version": "1.1.0",
"title": "Genius Gateway Firmware 1.1.0",
"release_url": "https://github.com/hmbacher/genius-gateway/releases/latest"
}
When update is available:
{
"installed_version": "1.1.0",
"latest_version": "1.2.0",
"title": "Genius Gateway Firmware 1.2.0",
"release_url": "https://github.com/hmbacher/genius-gateway/releases/latest"
}
State Fields
installed_version- Currently installed firmware versionlatest_version- Latest available firmware version from GitHub releasestitle- Human-readable update titlerelease_url- URL to GitHub releases page
Command Topic: {discovery_prefix}genius-gateway/{gateway_device_id}/update/install
Command Payload
Publishing Behavior
- Config published when MQTT connection is established
- Config re-published when MQTT settings change
- State published after GitHub version check (periodic and on-demand)
- State updated when new firmware version is detected
- Gateway subscribes to command topic automatically
Update Process
- Gateway periodically checks GitHub for new releases
- When update is available, state reflects new version
- User can trigger installation via Home Assistant or web interface
- Gateway downloads firmware from GitHub releases
- Firmware is validated and installed
- Gateway automatically restarts with new version
Home Assistant Integration
- Automatically creates update entity with current and available versions
- Shows "Update Available" badge when new firmware is released
- Links to GitHub releases page for release notes
- Click "Install" in Home Assistant to trigger OTA update
- Progress tracking via web interface and event notifications
Internet Connection Required
Firmware updates require an active internet connection to download from GitHub. The gateway must be able to reach github.com and objects.githubusercontent.com.
Smoke Detectors¶
Each configured smoke detector is published as an HA sub-device nested under the main Genius Gateway device.
Requirements:
- Home Assistant Integration must be enabled
- MQTT broker must be connected
Overview¶
Each smoke detector sub-device publishes:
- 1 binary_sensor (Control) —
smokedevice class, alarm stateON/OFF - 3 binary_sensor (Diagnostic) — battery low, smoke detector fault, radio module fault; available after acoustic readout
- 11 sensor (Diagnostic) — deinstallation count, last service timestamp, radio module model, alarm line ID, alarm line, production date, radio module serial, total alarm count, 3-month alarm count, radio interference; available after acoustic readout
Readout-derived entities (all except the main smoke sensor) report as unavailable until the first acoustic readout is performed via the gateway's SmartSonic interface.
Topic Structure:
All smoke detector topics are nested under the main gateway base topic. The sub-device identifier is based on the stable internal device ID (not the serial number), so topics remain stable across serial-number corrections:
For example, with the default prefix and gateway device ID genius-gateway-aabbcc:
Device ID vs Serial Number
device_id is a stable internal identifier assigned when the detector is first registered. It is independent of the smoke detector serial number and does not change if the serial number is corrected later.
Smoke Alarm Binary Sensor¶
Config Topic Pattern
Example: homeassistant/binary_sensor/genius-1746234159/smoke/config
Description: Main alarm state sensor for the smoke detector
QoS: 0
Retain: true
Config Payload
{
"~": "homeassistant/genius-gateway/genius-gateway-aabbcc/genius-1746234159",
"name": "Smoke Detector",
"unique_id": "genius-1746234159_smoke",
"device_class": "smoke",
"state_topic": "~/smoke/state",
"entity_picture": "http://192.168.1.100/hekatron-genius-plus-x.png",
"device": {
"identifiers": ["genius-1746234159"],
"name": "Genius Plus X",
"manufacturer": "Hekatron Vertriebs GmbH",
"model": "Genius Plus X",
"serial_number": "12345678",
"suggested_area": "Living Room",
"configuration_url": "http://192.168.1.100/gateway/smoke-detectors",
"via_device": "genius-gateway-aabbcc"
}
}
Key Fields
~- Base topic (sub-device path nested under main gateway device)device_class-smokestate_topic- Plain stringON/OFFentity_picture- Detector icon URL (omitted if no valid IP)device.identifiers- Stable device ID (genius-{device_id})device.name/device.model- Smoke detector model name (e.g."Genius Plus X")device.suggested_area- Populated from the detector's configured locationdevice.via_device- Links this sub-device to the main gateway device
State Topic: {base_topic}/genius-{device_id}/smoke/state
State Values
OFF— Not alarmingON— Actively alarming
Publishing Behavior
- Config published when detector is first registered or on MQTT (re)connect
- State published when alarm state changes and on MQTT (re)connect
Readout-Derived Diagnostic Entities¶
All 13 readout-derived diagnostic entities share a single state topic that carries a JSON object with all values. Availability is folded into the same JSON payload — no separate availability topic is needed.
Shared State Topic
QoS: 0 Retain: true
JSON Payload Example:
{
"available": true,
"battery_low": false,
"device_fault": false,
"radio_fault": false,
"deinstall_count": 2,
"last_readout": "2026-04-30T14:22:00",
"radio_module_model": "FM Basis X",
"alarm_line_id": 123456789,
"alarm_line": "A.0",
"production_date": "01.03.22",
"radio_module_serial": 987654321,
"alarm_count_total": 5,
"alarm_count_3m": 1,
"radio_interference": 12.5
}
available is false (and all other fields absent or stale) until the first successful acoustic readout. Each entity's discovery config uses availability_template on this same topic:
availability_topic: "{base_topic}/genius-{device_id}/diagnostics/state"
availability_template: "{{ 'online' if value_json.available else 'offline' }}"
Discovery Config Topic Pattern:
{discovery_prefix}{component}/{topicNamespace}/{gateway_device_id}/genius-{device_id}/{object_id}/config
Diagnostic binary_sensor entities (value_template extracts a boolean as ON/OFF):
| Object ID | Name | Device Class | value_template |
|---|---|---|---|
battery_low | Battery | battery | {{ 'ON' if value_json.battery_low else 'OFF' }} |
device_fault | Smoke Detector State | problem | {{ 'ON' if value_json.device_fault else 'OFF' }} |
radio_fault | Radio Module State | problem | {{ 'ON' if value_json.radio_fault else 'OFF' }} |
Diagnostic sensor entities (value_template extracts the relevant field):
| Object ID | Name | Unit / Class | JSON field |
|---|---|---|---|
deinstallation_count | Deinstallation Count | total_increasing | deinstall_count |
last_readout | Last Service | timestamp | last_readout |
radio_module_model | Radio Module Model | — | radio_module_model |
alarm_line_id | Alarm Line ID | — | alarm_line_id |
alarm_line | Alarm Line | — | alarm_line |
production_date | Production Date | — | production_date |
radio_module_serial | Radio Module Serial | — | radio_module_serial |
alarm_count_total | Alarms (Total) | total_increasing | alarm_count_total |
alarm_count_3m | Alarms (3 Months) | measurement | alarm_count_3m |
radio_interference | Radio Interference | % / measurement | radio_interference |
Publishing Behavior
- Configs published on MQTT (re)connect alongside the main smoke sensor config
- State published immediately after a successful acoustic readout
- State re-published on MQTT (re)connect;
available: falseuntil first readout
Migration from pre-1.x firmware
Firmware upgrading from a version that used per-entity state topics will automatically clear the 13 stale retained state topics and the old readout/avail topic on the first MQTT connect after upgrade. Entity history and customizations in Home Assistant are preserved because all object IDs remain unchanged.
Alarm Lines¶
The following topics enable remote control of alarm line actions (line tests and fire alarm tests) via MQTT.
Requirements:
- Alarm lines must be configured in Genius Gateway
- Home Assistant Integration must be enabled
- MQTT broker must be connected
Overview¶
Each configured alarm line is published as an HA sub-device nested under the main Genius Gateway device. Each sub-device contains:
- 4 Button entities for triggering actions (line test start/stop, fire alarm start/stop)
- 1 Sensor entity for transmission state monitoring
Topic Structure:
All alarm line topics are nested under the main gateway base topic:
For example, with the default prefix and a gateway device ID genius-gateway-aabbcc:
Button Entities Configuration¶
Topic Pattern
{discovery_prefix}button/{topicNamespace}/{gateway_device_id}/genius-alarmline-{line_id}/{object_id}/config
Description: Configuration messages for Home Assistant button discovery
QoS: 0
Retain: true
Button Object IDs:
linetest-start- Start Line Testlinetest-stop- Stop Line Testfirealarm-start- Start Fire Alarmfirealarm-stop- Stop Fire Alarm
Example Payload (Start Line Test)
{
"~": "homeassistant/genius-gateway/genius-gateway-aabbcc/genius-alarmline-123456789",
"name": "Start Line Test",
"unique_id": "genius-alarmline-123456789_linetest-start",
"command_topic": "~/linetest-start/set",
"icon": "mdi:map-marker",
"availability": [{
"topic": "homeassistant/genius-gateway/genius-gateway-aabbcc/genius-alarmline-123456789/transmission/state",
"value_template": "{% if value == 'Nothing' %}online{% else %}offline{% endif %}"
}],
"availability_mode": "all",
"device": {
"identifiers": ["genius-alarmline-123456789"],
"name": "Alarm Line 'First Floor'",
"manufacturer": "Genius Gateway Project",
"model": "Genius Plus X Alarm Line",
"via_device": "genius-gateway-aabbcc"
}
}
Key Fields
~- Base topic (sub-device path nested under main gateway device)name- Button name displayed in Home Assistantunique_id- Unique identifier for this buttoncommand_topic- Topic where HA sends button press commandsicon- Material Design icon identifieravailability- Button unavailable while a transmission is activedevice.via_device- Links this sub-device to the main gateway device in HA
Publishing Behavior
- Published when alarm line is first created
- Re-published on MQTT (re)connect via HA sub-device mechanism
- Published only if Home Assistant Integration is enabled
Home Assistant Integration
- Each alarm line appears as a separate HA sub-device under the gateway
- All 4 buttons and the sensor are grouped on that device's page
- Buttons become unavailable during active transmissions
Command Topics¶
Topic Pattern
Description: HA sends to these topics when a button is pressed in the UI or via automation
QoS: 0
Retain: false
Button Object IDs → Actions:
linetest-start/set→ Start Line Test RF transmissionlinetest-stop/set→ Stop Line Test RF transmissionfirealarm-start/set→ Start Fire Alarm RF transmissionfirealarm-stop/set→ Stop Fire Alarm RF transmission
Command Behavior
- Each button has its own dedicated command topic (no wildcard, no JSON payload parsing)
- Triggers RF transmission immediately if no other transmission is active
- Ignored if a transmission is currently in progress (buttons shown as unavailable via availability topic)
- Updates transmission state sensor on start; resets to
"Nothing"on completion
Transmission Blocking
Only one transmission can be active at a time. Buttons are automatically shown as unavailable in HA while a transmission is in progress.
Transmission State Sensor¶
Config Topic
{discovery_prefix}sensor/{topicNamespace}/{gateway_device_id}/genius-alarmline-{line_id}/transmission/config
Example: homeassistant/sensor/genius-gateway/genius-gateway-aabbcc/genius-alarmline-123456789/transmission/config
State Topic
Example: homeassistant/genius-gateway/genius-gateway-aabbcc/genius-alarmline-123456789/transmission/state
Description: Current transmission status of the alarm line (plain string, not JSON)
QoS: 0
Retain: true
State Values
Nothing— No active transmission, all buttons availableLine Test Start— Line test start transmission in progressLine Test Stop— Line test stop transmission in progressFire Alarm Start— Fire alarm start transmission in progressFire Alarm Stop— Fire alarm stop transmission in progress
Publishing Behavior
- Published when transmission starts (state shows action type)
- Published when transmission completes (state resets to
Nothing) - Published when transmission times out (state resets to
Nothing) - Re-published on MQTT (re)connect via HA sub-device mechanism
- Controls button availability (buttons shown as unavailable when state ≠
Nothing)
Home Assistant Integration
- Appears under the alarm line sub-device as a Diagnostic sensor
- Used by button availability templates
- Can trigger automations based on transmission state changes
Global Alarm State Topic¶
Topic (Default)
Description: Global alarm state aggregated from all smoke detectors
QoS: 0
Retain: true
Payload:
Published if all devices are in standby:
Published when two smoke detectors are alarming (example):
Payload Fields
isAlarming- Global alarm state (boolean)true- At least one smoke detector is alarmingfalse- No smoke detectors alarming
numAlarmingDevices- Number of smoke detectors currently in alarm state (integer)
Publishing Behavior
- Published when an alarm starts on any smoke detector
- Published when an alarm ends on any smoke detector (silenced by detector or manually via the API)
- Published when all alarms are reset at once (via the end alarms API)
- Published when MQTT connection is established or re-established — overwrites any stale retained message left from before a restart
Alarm state after restart
Genius Gateway does not persist the active alarm state across restarts. After a restart, isAlarming is always false and numAlarmingDevices is always 0, regardless of the state before the restart. The retained message on the broker is updated immediately on MQTT connect.
Independent of Home Assistant integration
Simple alarm publishing works independently of the Home Assistant integration. It is controlled solely by the Enable simple alarm publishing toggle and does not require HAIntegrationEnabled.
- Published only if simple alarm publishing is enabled
Integration
This topic enables integration with all smart home systems that support MQTT.