Skip to Content

Decide what's in the bridge, then decide how it behaves

in, out, and how it behaves
Matter Hub Guide · Part 4

Decide what's in the bridge, then decide how it behaves

The previous part walked you through creating a bridge. A bridge with no filter set is a door with nobody standing at it — by default, nearly everything Home Assistant knows about tries to walk through. This part gives you the two tools that turn that open door into something predictable: the Filter Engine, which decides which entities are even candidates for this bridge, and the advanced bridge settings, the feature flags that decide how those entities behave once a controller is talking to them.

16
Distinct matcher types the Filter Engine supports in Stable 2.0.55, from a simple domain check to a full any-field regex
100 rows
The most Filter Preview ever lists at once, even when the total count above it says there are more matches than that
10 devices
The cap per node once Server Mode is on — a feature that ships in the Stable channel while still being explicitly experimental
Why a rule beats a guess

Turn "which entities get bridged" into a rule you can predict

The Filter Engine decides whether an entity in the Home Assistant registry is even eligible for this one bridge to build a Matter endpoint from. It is not the room filter inside a controller, and it changes nothing in Home Assistant itself — it only controls the candidate set for the bridge you have open. Include every entity outright in a house with lights, diagnostic sensors, scripts and integrations from several brands, and you tend to push out things you never meant to expose, or that no controller supports anyway.

The dependable order is: write the include conditions first, then the always-exclude conditions, and check the result in the Preview last. The whole decision can be written as one sentence: an entity is a candidate when Include is empty or evaluates true, and nothing in Exclude matches it. An empty Include array places no restriction at all; only a non-empty Include is evaluated against includeMode. Exclude, on the other hand, always removes an entity the instant any single rule inside it matches — there is no ALL setting for Exclude.

In plain terms

An empty Include list is not a guest list with zero names on it — it is no guest list at all. No list posted at the door means the door has nobody standing at it, and everybody walks straight through. It is only Exclude, working alone, that behaves like a bouncer checking names against a list on the way in.

WhereHow it combinesResultWhen it fits
An empty Include arrayNo matcher runsEvery registered entity starts out includedA blocklist strategy driven entirely by Exclude
Include + anyORAny one Include matcher is enoughIncluding several domains, areas or labels at once
Include + allANDEvery Include matcher has to matchRequiring the light domain and a given area at the same time
ExcludeAlways ANY / ORAny one Exclude matcher removes the entityExcluding diagnostic, test, or sensitive-action entities
Include and Exclude both matchExclude winsThe entity is not includedInclude broadly first, then add safety guards on top

includeMode applies to Include only, and defaults to any when you leave it out. Exclude calls the matcher test with no mode at all, so it always behaves as any. ALL does not mean the several values of one matcher are ANDed together — each row still carries exactly one type and one value, and ALL requires every row, not every value, to succeed.

In plain terms

ANY is being let through if you can show a staff badge or a visitor pass — either one is enough. ALL is needing the staff badge and the visitor pass at the same time. Missing either one, no matter how convincing the other looks, and you are not through.

Hidden entities are a second, separate layer of the decision. Even when a matcher matches, an entity Home Assistant marks as hidden is skipped by default; it only comes in once the bridge's includeHiddenEntities feature flag is turned on. An entity marked disabled in Entity Mapping should likewise not be treated as a usable endpoint. The filter, the hidden flag, and the Entity Mapping disable are three separate switches — do not run them together as if they were one.

flowchart TD
  A["Entity in the Home Assistant registry"] --> B{"Is Include empty?"}
  B -->|"yes, treated as included"| E{"Does any Exclude rule match?"}
  B -->|"no"| C{"Include Mode ANY or ALL satisfied?"}
  C -->|"no"| X["Not a candidate for this bridge"]
  C -->|"yes"| E
  E -->|"yes"| X
  E -->|"no"| F{"Hidden entity, and includeHiddenEntities is off?"}
  F -->|"yes"| X
  F -->|"no"| G["Candidate entity for this bridge"]
Three ways in, one way outThree separate checks — a failed Include, a matching Exclude, or a hidden entity with the flag off — all feed the same Not a candidate box. Only an entity that clears all three in turn reaches Candidate entity, the diagram's only other endpoint.
A match only means the entity joins the candidate set. It does not guarantee any particular controller can show its Home Assistant domain, its device class, or the Matter device type you override it to. Release channel, feature maturity, and controller support are three different facts, and none of them is decided by the Filter Engine.
Every matcher, one field each

Sixteen matcher types, and which one you actually want

Every type below checks exactly one field, and the exact behavior differs more than the short names suggest — the difference between a substring and a wildcard match, for instance, decides whether a rename quietly breaks your rule.

typeData matchedExact behavior and caveats
patternentity_idA wildcard expands only * into an arbitrary string, and the whole value is anchored at both ends; every other regex character is escaped. Example: light.demo_*
regexentity_idBuilds a JavaScript RegExp directly and tests entity_id only; invalid syntax returns no match and never falls back to another field. Example: ^(light|switch)\.demo_.*
domainThe part of entity_id before the dotAn exact, case-sensitive match, for example light; no comma-separated list, no wildcard
platformEntity Registry platformAn exact match on the integration string, for example mqtt; the value Filter Reference shows is the authoritative one
labelThe entity's own labelsDeprecated. Behaves exactly like entity_label. Old configurations still read; new rules should migrate
entity_labelEntity labelsIncludes only entities that carry the label directly; does not pull in other entities on the same device. Enter the display name or the label_id
device_labelDevice labelsWhen a device label matches, every candidate entity under that device matches too. Enter the display name or the label_id
entity_label_regexSlug and display name of every entity labelMatches when any assigned label satisfies the RegExp; no labels, or an invalid RegExp, is no match
device_label_regexSlug and display name of every device labelAny matching device label makes that device's entities match; good for managing a whole device by naming convention
any_field_regexA single-line key=value haystackChecks entity_id, domain, platform, area, entity_category, device_class, entity/device label slugs and names, device_name, product_name, and manufacturer all at once
areaThe entity area, otherwise the device areaTakes the entity's area_id first and falls back to the device's area_id; an exact match on the area slug
entity_categoryEntity Registry categoryAn exact match, for example config or diagnostic; usually placed in Exclude
device_namename_by_user → name → default_nameWithout *, a case-insensitive substring; with *, a case-insensitive wildcard anchored across the whole value
product_namemodel → default_modelSame case-insensitive substring, or an anchored wildcard when it contains *
manufacturermanufacturer → default_manufacturerSame substring or wildcard rule; no match at all when there is no device registry data
device_classThe current state's attributes.device_classAn exact match, for example temperature or motion; neither the entity domain nor the Matter device type
Term: the schema calls pattern a wildcard pattern and defines regex as an entity ID regex. The interface has no separate type named entityIdRegex — in v2.0.55 that name from other requirements documents refers to exactly type: "regex".
You wantEvery light in one area, and nothing else — Include Mode all, one row of area set to the area slug, a second row of domain set to light. Not the same thing as "area or light."
You wantOne office fan a voice controller may touch, not the whole device it sits on — put an entity label on that entity in Home Assistant and use entity_label, not device_label.

Regex, labels, and the any-field haystack

The label matchers first look the value up by display name, case-insensitively, and turn it into a label_id when they find one. When they do not, the code normalizes your input: it strips combining diacritics, lowercases, turns every non-alphanumeric character into an underscore, and clears leading and trailing underscores. The most reliable route stays copying the real label_id from Filter Reference in the sidebar, so a renamed label cannot change what the rule does.

The haystack for any_field_regex is one line of key=value fields joined by spaces. You can express OR with alternation, and require one entity to satisfy several fields at once with a positive lookahead — documented as (?=.*domain=light)(?=.*area=demo_room). Label arrays are joined with commas, so test any boundary construct against your real slugs. The engine builds the rule with new RegExp(pattern) and adds no case-insensitive flag; cover casing explicitly in the pattern when you need it.

RequirementRecommended matcherWhy
A known set of entity_id prefixespatternEasier to read than a regex, and anchored end to end
The entity_id structure of two domainsregexAlternation on entity_id only, so the scope stays explicit
One entity labelentity_labelWill not drag in a whole device by accident
A whole device and all its entitiesdevice_labelMore stable in meaning than several entity_id rules
domain and area both trueTwo rows under Include ALLEasier to maintain than an any-field lookahead
Complex OR / AND across fieldsany_field_regexOnly it sees the whole haystack inside a single matcher
flowchart TD
  A["An invalid regex pattern"] --> B{"Where is this matcher used?"}
  B -->|"Include, mode all"| C["This row never matches"]
  C --> D["The whole Include ALL fails"]
  B -->|"Exclude"| E["This row never matches"]
  E --> F["The exclude guard you expected silently does nothing"]
Same mistake, two different failuresBoth branches start from one invalid pattern. Used inside an Include ALL row it fails the whole Include; used inside Exclude it removes a guard without raising anything. Neither path throws an error — the Preview is the only place either outcome shows up.
An invalid regex silently turns into "no match." In ALL mode that fails the whole Include; in Exclude it can cost you a guard you believed was there. Look at the Preview every time you change a regex.
Build it, then trust the Preview

Build the rule, then trust the Preview over your memory

  1. Step 1

    Open the bridge edit page

    Select the target bridge on Bridges and open Edit. Write down the current Include, Exclude and includeMode first, and do not change feature flags at the same time.

  2. Step 2

    Choose the Include Mode

    Under Include or exclude entities, set Include Mode to any or all. ANY suits "any one of these categories"; ALL suits "all of these conditions at once."

  3. Step 3

    Add Include rows one at a time

    Use the Include add control, then pick a Type and fill in a Value for each row. Copy label, area, and platform values from Filter Reference in the sidebar rather than guessing them from the displayed text.

  4. Step 4

    Add Exclude guards

    Put the categories you should not expose into Exclude — a category of diagnostic, say, or an explicit test-entity pattern. A single Exclude match beats Include.

  5. Step 5

    Check Preview Matching Entities

    Wait about 800 ms for the automatic refresh, or press Preview Matching Entities. Check the count, the domain chips, the names, and the entity_ids; the preview lists at most the first 100 rows, and total is the real number of matches.

  6. Step 6

    Save and verify

    Press Save only once the preview matches what you expect and the form is valid. Then check the actual endpoints and the failed entities back on Bridge / Devices — do not treat "the controller shows it immediately" as your only success criterion.

Filter Preview runs the same matcher logic against the current Home Assistant entity, device, state, and label registries, and sorts the result by entity_id. It also flags a large entity count, an unsupported domain, or a vacuum situation; those hints are planning information and never rewrite the configuration on their own.

Rules that stay maintainable

A room-specific bridge

Include Mode all, an area row using the documented area slug, and a domain row limited to light. That is not "area or light." Want switches too? Express light or switch as one entity ID regex and put it under ALL alongside the area, or reorganize with entity or device labels instead.

A voice-device allowlist

Put an entity label directly on the entities you are willing to hand to a voice controller, and use entity_label in Include. Reach for device_label only when you need every entity on a device. Do not build new configurations on the deprecated label.

Include broadly, exclude precisely

Leave Include empty and add entity_category=config, entity_category=diagnostic, and a test-naming pattern to Exclude. This strategy widens on its own as Home Assistant gains entities — check the Preview again after every new integration.

Splitting by brand or model

Use manufacturer, product_name, or device_name. All three do a case-insensitive substring match, switching to a whole-value match only when they contain a wildcard. An entity with no device registry data will not match — use the Preview to find the gaps rather than assuming platform equals manufacturer.

Maintenance principle. Reach first for the matchers whose meaning is clear — domain, area, entity or device label — and only then for pattern; use an any-field regex only where several ANY / ALL rows cannot express what you need. The shorter the rule, the easier it is to read after a rename or a change of integration.
Every BridgeConfig field

One configuration object, three separate jobs

Bridge settings carry three kinds of responsibility at once: the filter you just finished, the runtime parameters that pin the Matter node's identity and session behavior, and the workarounds you switch on for one controller's particular quirk. These fields can change endpoint identity, cluster composition, sync frequency, or the meaning of a control command — so get a working baseline bridge first, then change one related option at a time.

flowchart TD
  A["One BridgeConfig"] --> B["Candidate filter
include / exclude / includeMode"] A --> C["Runtime identity and session
serialNumberSuffix, uniqueIdSuffix,
stableIdentity, sessionMaxAgeHours"] A --> D["Controller-specific workarounds
coverSwapOpenClose,
alexaPreserveBrightnessOnTurnOn, vacuumOnOff"]
Three jobs, one objectOne BridgeConfig branches into three separate responsibilities. Only the third branch, drawn last, should ever be scoped to a single controller; the first two apply to the whole bridge regardless of who is pairing with it.
In plain terms

Changing serialNumberSuffix or uniqueIdSuffix is like reprinting somebody's ID card with a new number. The person underneath has not changed, but every door that recognized them by that old number now treats them as a stranger who has never walked through before.

Identity risk. serialNumberSuffix, uniqueIdSuffix, and some per-entity identity overrides make a controller treat a device as new, or confuse the cache from an earlier commissioning. Back up the persisted data, record the original values and the controller impact, and plan the restart and rediscovery before you touch either field. Do not make a suffix change your first troubleshooting step.
FieldSchema / scopePurpose and how far you may change it
nameRequired string, 1–32 charactersThe bridge name in the interface. In Server Mode the first entity also drives node identity and type — do not confuse the two
portRequired number, minimum 1The port the bridge listens on. The editor validates against duplicating another bridge; the create flow can find the next free port, but an existing BridgeConfig must carry a value
filterRequired objectHolds the required include and exclude arrays plus the optional includeMode — everything from the sections above
featureFlagsOptional objectListed one by one through the rest of this chapter. Most booleans default to false; there are exceptions, and leaving a flag out carries a meaning of its own
countryCodeOptional string, 2–3 charactersAn ISO 3166-1 alpha-2 country code, needed only when commissioning fails for a missing one. Use the documentation placeholder <COUNTRY_CODE> in your own notes; never copy a value from a live system
iconOptional enumFor interface display only; does not change the Matter device type. Choices: light, switch, climate, cover, fan, lock, sensor, media_player, vacuum, remote, humidifier, speaker, garage, door, window, motion, battery, power, camera, default
priority1–999, default 100Startup precedence — the lower the number, the earlier it starts. An order, not a controller priority
serialNumberSuffixOptional, up to 16 charactersAppended to the serial number of every entity on this bridge; can make a controller bypass an old cache and treat devices as new
uniqueIdSuffixOptional, up to 16 charactersMixed into the uniqueId of every bridged device in standard bridge mode, effective after a restart. Server Mode falls outside the scope its comment names
sessionMaxAgeHours0–168 hoursRebuilds an over-age Matter session and forces a re-subscribe; 0 turns it off. Server Mode rotates every 4 hours by default; a standard bridge only does it when you set this field

The schema sets additionalProperties: false on the top level and on the filter, so a misspelled field is not a comment you can ignore — it is a validation error. The feature flag schema does not spell out additionalProperties false, but you still should not add keys the source never defines. The form hands the icon to a separate Bridge Icon component, so it is kept when you switch between the form and JSON views.

Visibility, composition, sync, and naming flags

flagDefault / maturityExact behavior
includeHiddenEntitiesfalse; matureLets a hidden Home Assistant entity that the filter matches into the bridge. Does not undo a disabled setting in Entity Mapping
serverModefalse; experimental in StableExposes entities as standalone Matter devices instead of bridged devices. Each node carries at most 10 devices; the first is the primary and decides the node name and type. More than one device is still experimental
autoBatteryMappingfalse; matureAttaches the battery sensor of the same HA device to the primary entity, so it does not turn into a separate device in the controller
autoHumidityMappingtrue; matureComposes humidity and temperature from the same HA device automatically. The code tests for "not explicitly false," so leaving it out also enables it
autoPressureMappingtrue; matureComposes pressure and temperature from the same HA device automatically; leaving it out also counts as enabled
autoComposedDevicesfalse; matureThe master toggle for composed devices — enables battery, humidity, pressure, power, and energy automatic mappings together. More clusters means more data to sync
autoForceSyncfalse; a mature workaroundEvery 90 seconds compares and pushes the state of every device, for when Google Home or Alexa loses a subscription. The health check does not depend on this flag
productNameFromNodeLabelfalse; matureReports the resolved nodeLabel as the productName, for controllers that use productName as the device name; a per-entity customProductName wins
preferEntityRegistryNamefalse; a mature workaroundChanges the nodeLabel order to customName → registry name → registry original_name → friendly_name → entity_id, to handle the HA 2026.4 friendly_name prefix change. Matter has no alias; only one name can be reported
useHaRegistrySerialfalse; matureWhere there is no per-entity custom serial, uses the HA device registry serial_number; only when that is missing too does it fall back to an entity-ID-based hash. Changing a serial after commissioning can confuse a controller
Automatic and explicit mapping are not the same layer. These auto flags derive the link from the same HA device; Entity Mapping's batteryEntity, humidityEntity, and the rest are links you state yourself. You cannot tell the two apart by guessing from the controller screen — cross-check the mapping information on the Devices card.
Cover, fan, vacuum, Alexa

A feature flag is a workaround sized for one controller, not a switch to turn on everywhere

In plain terms

A feature flag here is a wrench sized for one bolt. Grabbing every wrench in the box and turning them all on the same bolt at once, hoping one of them fits, just means that when something finally gives, you cannot tell which wrench actually did it.

flagEffectController limits
coverDoNotInvertPercentageSkips Matter's standard percentage inversion so the number matches HA; the schema says plainly this does not conform to MatterUse only once you have confirmed you need those value semantics — not the same as reversing the commands
coverUseHomeAssistantPercentageShows the HA percentage while Open and Close commands stay correct; a high percentage in HA means more open, and Alexa often reads it as more closedThe schema marks it Alexa-friendly, but the difference in meaning is still there
coverSwapOpenCloseSwaps the open and close commands and inverts the position reportUse only when a spoken "close" opens the cover instead; a per-entity override of the same name can handle a single cover first
coverSliderDebounceMs0 keeps the built-in two stages of 400/150 ms; above 0 becomes a single wait window, range 0–5000 msFor Apple Home sending a continuous stream of slider updates; a per-entity value for one cover wins
fanSliderDebounceMsWaits for the last fan-speed write before sending it to HA, range 0–10000 ms; 0 sends every one immediatelySuits devices that beep on every frame over IR or UART; a per-entity value wins, and the Entity Mapping UI caps it at 5000 ms
vacuumOnOffAdds an OnOff cluster for an RVC, with no schema defaultThe actual v2.0.55 registry adds it only on an explicit true, in both bridge and Server Mode; leaving it out and setting false both leave it off. The bridge-data.ts comment and the schema still describe Server Mode adding it automatically when unset, which contradicts the running code — go by the running code. Set true where Alexa needs it; a non-standard cluster can affect Apple and Google
alexaPreserveBrightnessOnTurnOnIgnores a full-brightness command arriving within 200 ms of the same light turning on, so it does not jump to 100% after an Alexa subscription renewalOnly on an Alexa-only bridge. It breaks the room-level "set to 100%" Siri command in Apple Home
vacuumIncludeUnnamedRoomsPresent in the type declaration in bridge-data.tsThe v2.0.55 schema has no such field, and nothing in the packages at this exact commit reads it at runtime. Do not rely on it, and do not claim it is settable in the UI

Controller profiles are a starting suggestion, not a live guarantee

Controller profiles are a suggested combination applied at create time, not a running compatibility check. Apple, Google, and Amazon Alexa differ in what Matter Hub recommends turning on for each, and the source is explicit that these differences are not interchangeable:

ProfileWhat it turns on
Apple HomeComposed, battery, humidity, and pressure
Google HomeAdds autoForceSync
Amazon AlexaautoForceSync, battery, humidity, and pressure, plus the HA cover percentage (coverUseHomeAssistantPercentage)
Multi-ControllerKeeps the standard cover behavior — no cover workaround turned on for any one controller

Once a profile is applied it is still an ordinary BridgeConfig, and you still have to verify it against your actual controller and device types — the profile name is a starting point, never a promise.

One bridge cannot hold two opposite workarounds. One endpoint cannot use the standard cover semantics and a controller-specific inversion at the same time, and cannot both ignore Alexa's full-brightness sequence and keep that same sequence unbroken for Apple. Where one bridge serves Apple, Google, and Alexa at once, start from neutral, Multi-Controller-style settings, and split the bridge the moment you need workarounds that exclude each other.
Identity and session recovery

Five mechanisms, three different layers — do not turn them all on to fix one symptom

SettingTriggerHandles / does not handle
stableIdentityOnce enabled, anchors the endpoint id, uniqueId, and serialNumber to the HA entity registry unique_idWhen an HA entity_id is renamed, the controller can keep its groups, names, and automations. Identity records are seeded from the start, so turning it on later should not re-add existing devices. It does not replace a data backup
fastSessionRecoveryA controller loses all of its subscriptionsClears the dead session and re-announces after 5 seconds instead of 60, shortening the Google offline window. Cannot stop a controller from refusing a subscription
wedgeWatchdogThe subscription is still alive, but no inbound Interaction Model request has arrived for about 45 minutesRotates a single session that looks wedged early, aimed at Apple Home showing Updating. A false positive costs a transparent CASE re-establishment; it does not repair every network fault
sessionMaxAgeHoursA session is older than the age you setA blind rotation by age that prompts a re-subscription; 0 turns it off. A top-level field, not a feature flag
autoForceSyncA 90-second cyclePushes state, which is not the same as clearing a session. Turned on alongside composed devices, it adds traffic
flowchart TD
  R["Something about a controller connection looks wrong"] --> Q1{"HA entity_id renamed?"}
  Q1 -->|"yes"| M1["stableIdentity anchors endpoint id to unique_id"]
  R --> Q2{"A subscription dropped entirely?"}
  Q2 -->|"yes"| M2["fastSessionRecovery re-announces after 5s, not 60"]
  R --> Q3{"Subscribed, but silent for about 45 minutes?"}
  Q3 -->|"yes"| M3["wedgeWatchdog rotates that one session"]
  R --> Q4{"A session is simply older than your limit?"}
  Q4 -->|"yes"| M4["sessionMaxAgeHours rotates by age, 0 = off"]
Four questions, four independent mechanismsFour branches leave the same starting box, and none of the four mechanism boxes connects to another. That independence is the point: turning all four on at once to fix a single symptom makes it impossible to tell afterward which one actually helped.

These mechanisms work at different layers: identity gives device continuity across an HA rename; session rotation, fast recovery, and the watchdog deal with the Matter connection and its subscriptions; autoForceSync deals with pushing state, which is a fifth mechanism again and not drawn above. Do not turn them all on and then try to work out which one helped. A home bridge serving several controllers should especially start from neutral settings, with controller-specific workarounds split onto their own bridge.

Match the smallest setting to the confirmed symptom

Confirmed symptomAssess firstDo not do at the same time
The controller rebuilds devices after an entity_id change in HAstableIdentityChanging the serial or unique suffix at the same time — you then cannot tell where the identity change came from
Google goes offline after cancelling a subscriptionfastSessionRecovery, then assess autoForceSync if you still need itMistaking an unreachable network for a subscription problem
An Apple tile shows Updating for a long time and the subscription is still therewedgeWatchdog, or plan a session-age rotationGoing straight to a reset or a fresh commissioning — look at Health and the redacted logs first
Brightness jumps to full after Alexa turns a light onalexaPreserveBrightnessOnTurnOn on an Alexa-only bridgeTurning it on for a bridge that also serves Apple Home
Voice open and close are reversed on a covercoverSwapOpenClose, per-entity first for a single deviceChanging the percentage flags first — command direction and percentage display are different things
Dragging a fan or cover slider produces repeated commandsThe matching debounce, tested first as a single-entity overrideTreating the update throttle as an inbound command debounce
Field editor and raw JSON

Switch safely between the field editor and raw JSON

  1. Step 1

    Back up the current configuration

    Export from the existing bridge first, or record the non-secret settings some safe way, and confirm the persisted data has a backup you can restore from. Never paste identifying data from a live environment into a document or a ticket.

  2. Step 2

    Open Edit and switch to JSON

    On the bridge edit page, press the editor toggle in the top right to move from the Fields Editor to the JSON Editor. Keep the required name, port, filter.include, and filter.exclude.

  3. Step 3

    Add only keys the schema defines

    Check the structure with documentation placeholders, for example "countryCode": "<COUNTRY_CODE>". Write booleans as true/false, and the debounce and session-age fields as numbers — never a number inside quotes.

  4. Step 4

    Read the live validation output

    Fix errors in JSON syntax, required fields, enums, minimum and maximum values, and additional properties. If another bridge already uses the port, the custom validation blocks the save as well.

  5. Step 5

    Switch back to the form and cross-check

    Confirm the fields still show the values you expect. Check in particular that vacuumOnOff is explicitly true only where Alexa needs it, and that the icon has been kept by its own separate control.

  6. Step 6

    Save one set of changes at a time

    After you press Save, verify at the layer that flag belongs to: for identity, check continuity across a rename; for session, check Health; for cover, fan, and vacuum, check a single test device. An identity suffix that only applies after a restart needs a downtime window arranged first.

Verified is not the same as compatible. Passing the schema only proves the data types and ranges are right; it does not mean the controller supports that endpoint, or that the workaround suits a multi-fabric bridge.
When the result looks wrong

The pitfalls that actually happen, filter and bridge settings both

SymptomLikely causeWhat to do
Include ALL returns zero rowsUsually "area A or area B" set to ALL by mistake, or invalid regex syntaxTemporarily keep one row at a time and check the Preview, confirming each row matches the same entity alone
A label brings in only one entityYou used entity_label where you meant a whole deviceAssign the label to the device in Home Assistant and switch to device_label — an entity label never propagates on its own
An area rule does not matchWrong slug, or the entity area overrides the device areaCopy the area slug from Filter Reference. The engine checks the entity area first, the device area only as a fallback
It is in the Preview but not on the bridgeHidden state, includeHiddenEntities, a disabled Entity Mapping flag, or an unsupported domainCheck all four plus the bridge's failed entities — Filter Preview only proves the filter decision, nothing downstream of it
Exclude did not block an entityThe matcher's type points at the wrong fieldExclude is always ANY. regex looks at entity_id only; to check manufacturer or labels, switch to the dedicated matcher or an any-field regex
The preview shows only 100 rowsThat is the interface truncating, not a filter limitRead total, narrow the rule or split the bridge, then preview again — a healthy first 100 rows can still hide what is at the end
The Save button is disabledAn invalid name length, duplicate port, missing filter array, bad enum, out-of-range debounce/session value, or an unknown top-level keySwitch back to the form and read the validation. Do not bypass the schema and edit storage directly
A vacuum does not appear after Alexa commissioningvacuumOnOff was left unsetSet it explicitly true — in v2.0.55 the running code never adds it automatically. If the same bridge also serves Apple or Google, assess a split before sacrificing the other controllers
Apple room brightness voice commands stop workingalexaPreserveBrightnessOnTurnOn is on for a bridge that includes AppleTurn it off and return to controller-neutral settings. Do not change the light's type or identity at the same time
Duplicate devices appear after a suffix changeThat is exactly what minting a fresh identity producesRestore the original suffix, confirm the original configuration from the backup, then work through your controller's safe-removal process
Auto Force Sync is on and it still shows offlineIt only pushes state on a scheduleLook at the session and subscription in Health and the network status; assess fastSessionRecovery for a lost subscription or wedgeWatchdog for a wedged one
A global value does not suit one cover or fanA bridge-level workaround is too broad for one deviceClear the bridge-level workaround or keep it neutral, and set a per-entity override in Entity Mapping instead — a per-entity setting wins and affects less
FAQ

Filter Engine and bridge settings, the questions that recur

Does leaving Include empty mean no entity is included?
No. In v2.0.55 the decision treats an empty Include array as everything included, and then applies Exclude. For an allowlist, add at least one Include row.
Can Exclude be set to ALL as well?
No. The schema has includeMode only, and the backend uses the default ANY for Exclude. Any single Exclude match excludes the entity.
Which of pattern and regex is case-insensitive?
Neither, on its own. pattern turns * into a wildcard and anchors the value; regex is a JavaScript RegExp. Only device_name, product_name, and manufacturer lowercase the values before comparing.
Does Filter Reference change labels or areas?
No, it is a lookup page. It lists labels, areas, domains, platforms, entity categories, device classes, device names, and product names, and gives you a way to copy each value.
If the controller does not show it, is the matcher wrong?
Not necessarily. Confirm the candidates and endpoints in the Preview and on Devices first, then check controller support for the Matter device type separately — that is not a field the Filter Engine decides on.
Is Server Mode in the Stable channel production-grade?
You can configure Server Mode in Stable 2.0.55, but more than one device on the same node is explicitly marked experimental. Release channel and maturity are two different facts.
Is vacuumOnOff: false the same as leaving it out?
For the decision the actual v2.0.55 registry makes, yes — only an explicit true adds OnOff. The automatic Server Mode default written in the type comment and in the schema contradicts the running code, so this guide does not treat that comment as behavior you can act on.
Does Auto Composed Devices cover every manual linked field?
No. It is the master toggle for automatically composing battery, humidity, pressure, power, and energy on the same HA device; EVSE, the vacuum helpers, utility meter identification, and the rest still need an explicit mapping per device.
Do I still need a suffix change once stable identity is on?
The two should usually not be tied together. stableIdentity aims to keep identity across a rename; a suffix aims to mint a new identity deliberately, or to bypass a cache. They point in opposite directions.
Why does the source list vacuumIncludeUnnamedRooms when the form has no such field?
Because the v2.0.55 bridge-data type carries the name, but neither the schema nor the packages use it at runtime. It is not a feature you can rely on or act on in this version.
Next

Where to go from here

candidates chosen, behavior set

Your bridge now has a predictable guest list and a set of controller-aware settings. Neither one decides how a Home Assistant entity turns into a specific Matter device type.

Part 5 takes that next step: Entity Mapping, where you point an entity at the Matter device type it should become, and composed and linked entities, where several Home Assistant entities merge into the single device a controller actually sees.

Open the full guide

Part 4 of the Home Assistant Matter Hub Complete Guide series on the Apporo blog.

Adapted from the Home Assistant Matter Hub Complete Guide, produced by WoowTech and released under CC BY 4.0. This adaptation is published by Apporo under the same licence.

Light · Air · Water · Control · apporo

The dashboard shell, and building your first bridge