Skip to main content

MQTT topics

The table lists every topic the hub reads or writes, with its default prefix. "In" means the hub subscribes; "out" means the hub publishes. A prefix is shown in <angle brackets> or as its default, and the last column names the setting that moves it (see the Settings reference). Settings in the last column are written [section] field: [topics], [watchdog.gateway] and [watchdog.acl] are in the advanced settings, [groups] and [alarm] too (see the Settings reference); [weather] is Settings → Weather, [solcast] Settings → Solar forecast, [frigate] Settings → Cameras, [push] Settings → Notifications, [climate] the Climate card of the setup wizard; [mqtt] send_ha_birth and ha_status_topic are in the mqtt object of data/hub.json. The broker user (the MQTT user of Settings → Broker) needs read and/or write on each topic accordingly.

TopicDirectionRetainedPayloadMoved by
<discovery prefix>/<component>/[<node_id>/]<object_id>/config, default oikos/…inyes (by the publisher)Home Assistant discovery JSON; an empty payload removes the entity[topics] discovery_prefixes
Device state topics named by the discovery configsinby the deviceDevice state; subscribed on demanddiscovery
Device command topics named by the discovery configsoutonly when the config says "retain": trueThe device's command payloaddiscovery
<z2m_base>/bridge/devices, /info, /stateinyes (by Zigbee2MQTT)Zigbee2MQTT device list, bridge info and state[topics] z2m_base
<ha_status_topic>, default homeassistant/statusoutnoonline, once per connect[mqtt] send_ha_birth, [mqtt] ha_status_topic
oikos/ui/<entity id>in, outyesThe entity's override JSON; empty clears it[topics] ui_prefix
oikos/ui/_areasin, outyesThe declared rooms ({"areas": […]})[topics] ui_prefix
oikos/ui/_homein, outyesThe home settings ({"eco_setpoint", "mode_entity", "indoor_entity"}); an empty payload means defaults[topics] ui_prefix
oikos/ui/_typesoutyesThe whole type table[topics] ui_prefix
oikos/ui/dashboards/<id>in, outyesA dashboard definition; empty removes it[topics] ui_prefix
oikos/ui/ambiances/<id>in, outyesAn ambiance definition; empty deletes it[topics] ui_prefix
oikos/automation/<flow id>in, outyesA flow document; empty removes it[topics] automation_prefix
<first discovery prefix>/<switch|number|button|select>/virtual/<id>/configoutyesDiscovery of a virtual entity[topics] discovery_prefixes (first entry)
<first discovery prefix>/virtual/<id>in, outyes for a switch, number or select; no for a buttonON / OFF, a number, an option name, or PRESS; the state and the command topic[topics] discovery_prefixes (first entry)
<first discovery prefix>/<sensor|binary_sensor>/weather/<key>/configoutyesDiscovery of a weather entity (19 keys, one device)[topics] discovery_prefixes (first entry), [weather]
<first discovery prefix>/weather/<key>outyesA weather value: a number, an enum name or ON / OFF; None (unknown) once the source stops reporting a value that was published[topics] discovery_prefixes (first entry), [weather]
<first discovery prefix>/weather/availabilityoutyesonline once weather was fetched, offline before the first fetch and after an hour without one[topics] discovery_prefixes (first entry), [weather]
<first discovery prefix>/sensor/solar/<key>/configoutyesDiscovery of a solar forecast entity (10 keys, one device)[topics] discovery_prefixes (first entry), [solcast]
<first discovery prefix>/solar/<key>outyesA solar forecast value: a number in kWh or kW, or an RFC 3339 UTC time for the peak time[topics] discovery_prefixes (first entry), [solcast]
<first discovery prefix>/solar/availabilityoutyesonline once a forecast covers now, offline otherwise (see Solar forecast)[topics] discovery_prefixes (first entry), [solcast]
<first discovery prefix>/solar/cacheout, inyesThe retained forecast and call count, so a restart does not spend calls; never the API key[topics] discovery_prefixes (first entry), [solcast]
<first discovery prefix>/<component>/group/<id>/configoutyesDiscovery of a group entity[groups] enabled, [topics] discovery_prefixes
<first discovery prefix>/group/<id>in, outyes (state)The combined state; commands arrive here as JSON[groups] enabled
<first discovery prefix>/group/<id>/definitionin, outyes{kind, name, members, hideMembers}[groups] enabled
<first discovery prefix>/group/<id>/availoutyesonline[groups] enabled
<first discovery prefix>/group/_migratedin, outyes1, the marker that the one-time room-group migration ran[groups] enabled
oikos/push/notification/<source>innoAn alert, v1 or legacy payload[push] prefix
oikos/push/tokens/<installId>in; out to clearyes{token, device_name, lang, updated_at}; empty unregisters. The hub publishes an empty payload to clear a dead token[push] prefix
oikos/push/responsesin (climate and alarm), outno{id, action, install_id, ts}, a tapped alert button[push] prefix
oikos/push/historyin, outyesJSON array of the normalised alerts, newest first[push] prefix
oikos-push/notification/+, oikos-push/tokens/+, oikos-push/historyin; out to clear tokensas aboveOikosPush's topics, read during the switch-over. The hub only ever publishes an empty retained payload on oikos-push/tokens/<id> to clear a dead token[push] legacy_prefix (empty turns them off)
oikos/climate/housein, outyesThe house settings document[climate] prefix
oikos/climate/zone/<zone>/<doc>, <doc> being settings, proposal, override, decision or eco ({until, set_at}, the zone's eco until a date; the hub deletes it once ended)in, outyesA zone document[climate] prefix
<prefix>/settings (alarm)in, outyesThe alarm settings document; enabled defaults to false. Default prefix oikos/alarm[alarm] prefix
<prefix>/state (alarm)in, outyesThe alarm's runtime: state, mode, source, timers, motion hits, open sensors and the open alert[alarm] prefix
<prefix>/panel (alarm)outyesThe panel entity's state: disarmed, arming, armed_away, armed_home, armed_night, pending or triggered[alarm] prefix
<prefix>/panel/attributes (alarm)outyesThe panel's JSON attributes: source, since, deadline, cause, open_at_arm[alarm] prefix
<prefix>/panel/set (alarm)innoThe panel's commands: ARM_AWAY, ARM_HOME, ARM_NIGHT or DISARM. A retained replay is never acted on[alarm] prefix
<first discovery prefix>/alarm_control_panel/alarm/house/configoutyesDiscovery of the alarm panel, entity oikos_alarm_house. Published while the alarm is on; an empty payload removes it[topics] discovery_prefixes (first entry), [alarm] prefix
<topic_prefix>/events, default frigate/eventsinnoFrigate event JSON; subscribed only with the bridge on[frigate] bridge, [frigate] topic_prefix
<prefix>/+, default encryption-gateway/health/+inyes (by the gateway){"status": "ok" | "fail" | "config_error", …} per component[watchdog.gateway] enabled, prefix
$SYS/broker/log/#innoMosquitto log lines[watchdog.acl] source = "topic", log_topic

Notes​

  • Reserved sub-trees. Under a discovery prefix, the segments ui, automation, virtual, push, weather and solar are reserved: never publish discovery there. A topic in them is never read as discovery and never shows under GET /api/v1/ignored.
  • Climate documents never end in /config. They cannot be read as discovery. The hub subscribes to <prefix>/house and <prefix>/zone/+/+, never <prefix>/#. oikos/push/responses is always subscribed: a reply whose id starts with alarm- goes to the alarm, and the others (a tapped proposal button, for example) go to the climate engine when it is on.
  • Overlapping subscriptions. The hub subscribes to <discovery prefix>/#, <z2m_base>/bridge/#, <ui_prefix>/# and <automation_prefix>/#. A push filter that falls inside one of those wildcards (the default oikos/push/… under oikos/#) is left out, so the broker does not deliver a notification twice.
  • Alerts raised inside the hub (the Frigate bridge, watchdogs, flows, MCP) go to the push service in process, without the broker.
  • Retained history. oikos/push/history is the history itself: the hub adopts it at its first sync, and only when that topic holds no list yet does it seed it once from oikos-push/history.
  • After each (re)connect the hub waits for its subscription to be acknowledged, then 2 s more for the retained tokens, before it sends; alerts arriving meanwhile wait in the queue.
  • Flows and dashboards read as written. An invalid flow or dashboard document is kept and shown with its reason, never run.
  • Broker permissions. Give the hub user read and write on oikos/# (or the narrower sets above), read on <topic_prefix>/events and <gateway prefix>/+, and for the ACL watchdog read on $SYS/broker/log/#. Mosquitto denies silently.