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.
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.
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.
| Where | How it combines | Result | When it fits |
|---|---|---|---|
| An empty Include array | No matcher runs | Every registered entity starts out included | A blocklist strategy driven entirely by Exclude |
Include + any | OR | Any one Include matcher is enough | Including several domains, areas or labels at once |
Include + all | AND | Every Include matcher has to match | Requiring the light domain and a given area at the same time |
| Exclude | Always ANY / OR | Any one Exclude matcher removes the entity | Excluding diagnostic, test, or sensitive-action entities |
| Include and Exclude both match | Exclude wins | The entity is not included | Include 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.
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"]
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.
| type | Data matched | Exact behavior and caveats |
|---|---|---|
pattern | entity_id | A 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_* |
regex | entity_id | Builds 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_.* |
domain | The part of entity_id before the dot | An exact, case-sensitive match, for example light; no comma-separated list, no wildcard |
platform | Entity Registry platform | An exact match on the integration string, for example mqtt; the value Filter Reference shows is the authoritative one |
label | The entity's own labels | Deprecated. Behaves exactly like entity_label. Old configurations still read; new rules should migrate |
entity_label | Entity labels | Includes 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_label | Device labels | When a device label matches, every candidate entity under that device matches too. Enter the display name or the label_id |
entity_label_regex | Slug and display name of every entity label | Matches when any assigned label satisfies the RegExp; no labels, or an invalid RegExp, is no match |
device_label_regex | Slug and display name of every device label | Any matching device label makes that device's entities match; good for managing a whole device by naming convention |
any_field_regex | A single-line key=value haystack | Checks entity_id, domain, platform, area, entity_category, device_class, entity/device label slugs and names, device_name, product_name, and manufacturer all at once |
area | The entity area, otherwise the device area | Takes the entity's area_id first and falls back to the device's area_id; an exact match on the area slug |
entity_category | Entity Registry category | An exact match, for example config or diagnostic; usually placed in Exclude |
device_name | name_by_user → name → default_name | Without *, a case-insensitive substring; with *, a case-insensitive wildcard anchored across the whole value |
product_name | model → default_model | Same case-insensitive substring, or an anchored wildcard when it contains * |
manufacturer | manufacturer → default_manufacturer | Same substring or wildcard rule; no match at all when there is no device registry data |
device_class | The current state's attributes.device_class | An exact match, for example temperature or motion; neither the entity domain nor the Matter device type |
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".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."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.
| Requirement | Recommended matcher | Why |
|---|---|---|
| A known set of entity_id prefixes | pattern | Easier to read than a regex, and anchored end to end |
| The entity_id structure of two domains | regex | Alternation on entity_id only, so the scope stays explicit |
| One entity label | entity_label | Will not drag in a whole device by accident |
| A whole device and all its entities | device_label | More stable in meaning than several entity_id rules |
| domain and area both true | Two rows under Include ALL | Easier to maintain than an any-field lookahead |
| Complex OR / AND across fields | any_field_regex | Only 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"]
Build the rule, then trust the Preview over your memory
-
Step 1
Open the bridge edit page
Select the target bridge on Bridges and open Edit. Write down the current Include, Exclude and
includeModefirst, and do not change feature flags at the same time. -
Step 2
Choose the Include Mode
Under Include or exclude entities, set Include Mode to
anyorall. ANY suits "any one of these categories"; ALL suits "all of these conditions at once." -
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.
-
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. -
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.
-
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.
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"]
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.
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.| Field | Schema / scope | Purpose and how far you may change it |
|---|---|---|
name | Required string, 1–32 characters | The bridge name in the interface. In Server Mode the first entity also drives node identity and type — do not confuse the two |
port | Required number, minimum 1 | The 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 |
filter | Required object | Holds the required include and exclude arrays plus the optional includeMode — everything from the sections above |
featureFlags | Optional object | Listed 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 |
countryCode | Optional string, 2–3 characters | An 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 |
icon | Optional enum | For 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 |
priority | 1–999, default 100 | Startup precedence — the lower the number, the earlier it starts. An order, not a controller priority |
serialNumberSuffix | Optional, up to 16 characters | Appended to the serial number of every entity on this bridge; can make a controller bypass an old cache and treat devices as new |
uniqueIdSuffix | Optional, up to 16 characters | Mixed into the uniqueId of every bridged device in standard bridge mode, effective after a restart. Server Mode falls outside the scope its comment names |
sessionMaxAgeHours | 0–168 hours | Rebuilds 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
| flag | Default / maturity | Exact behavior |
|---|---|---|
includeHiddenEntities | false; mature | Lets a hidden Home Assistant entity that the filter matches into the bridge. Does not undo a disabled setting in Entity Mapping |
serverMode | false; experimental in Stable | Exposes 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 |
autoBatteryMapping | false; mature | Attaches the battery sensor of the same HA device to the primary entity, so it does not turn into a separate device in the controller |
autoHumidityMapping | true; mature | Composes humidity and temperature from the same HA device automatically. The code tests for "not explicitly false," so leaving it out also enables it |
autoPressureMapping | true; mature | Composes pressure and temperature from the same HA device automatically; leaving it out also counts as enabled |
autoComposedDevices | false; mature | The master toggle for composed devices — enables battery, humidity, pressure, power, and energy automatic mappings together. More clusters means more data to sync |
autoForceSync | false; a mature workaround | Every 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 |
productNameFromNodeLabel | false; mature | Reports the resolved nodeLabel as the productName, for controllers that use productName as the device name; a per-entity customProductName wins |
preferEntityRegistryName | false; a mature workaround | Changes 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 |
useHaRegistrySerial | false; mature | Where 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 |
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.A feature flag is a workaround sized for one controller, not a switch to turn on everywhere
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.
| flag | Effect | Controller limits |
|---|---|---|
coverDoNotInvertPercentage | Skips Matter's standard percentage inversion so the number matches HA; the schema says plainly this does not conform to Matter | Use only once you have confirmed you need those value semantics — not the same as reversing the commands |
coverUseHomeAssistantPercentage | Shows 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 closed | The schema marks it Alexa-friendly, but the difference in meaning is still there |
coverSwapOpenClose | Swaps the open and close commands and inverts the position report | Use only when a spoken "close" opens the cover instead; a per-entity override of the same name can handle a single cover first |
coverSliderDebounceMs | 0 keeps the built-in two stages of 400/150 ms; above 0 becomes a single wait window, range 0–5000 ms | For Apple Home sending a continuous stream of slider updates; a per-entity value for one cover wins |
fanSliderDebounceMs | Waits for the last fan-speed write before sending it to HA, range 0–10000 ms; 0 sends every one immediately | Suits 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 |
vacuumOnOff | Adds an OnOff cluster for an RVC, with no schema default | The 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 |
alexaPreserveBrightnessOnTurnOn | Ignores 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 renewal | Only on an Alexa-only bridge. It breaks the room-level "set to 100%" Siri command in Apple Home |
vacuumIncludeUnnamedRooms | Present in the type declaration in bridge-data.ts | The 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:
| Profile | What it turns on |
|---|---|
| Apple Home | Composed, battery, humidity, and pressure |
| Google Home | Adds autoForceSync |
| Amazon Alexa | autoForceSync, battery, humidity, and pressure, plus the HA cover percentage (coverUseHomeAssistantPercentage) |
| Multi-Controller | Keeps 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.
Five mechanisms, three different layers — do not turn them all on to fix one symptom
| Setting | Trigger | Handles / does not handle |
|---|---|---|
stableIdentity | Once enabled, anchors the endpoint id, uniqueId, and serialNumber to the HA entity registry unique_id | When 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 |
fastSessionRecovery | A controller loses all of its subscriptions | Clears 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 |
wedgeWatchdog | The subscription is still alive, but no inbound Interaction Model request has arrived for about 45 minutes | Rotates 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 |
sessionMaxAgeHours | A session is older than the age you set | A blind rotation by age that prompts a re-subscription; 0 turns it off. A top-level field, not a feature flag |
autoForceSync | A 90-second cycle | Pushes 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"]
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 symptom | Assess first | Do not do at the same time |
|---|---|---|
| The controller rebuilds devices after an entity_id change in HA | stableIdentity | Changing 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 subscription | fastSessionRecovery, then assess autoForceSync if you still need it | Mistaking an unreachable network for a subscription problem |
| An Apple tile shows Updating for a long time and the subscription is still there | wedgeWatchdog, or plan a session-age rotation | Going 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 on | alexaPreserveBrightnessOnTurnOn on an Alexa-only bridge | Turning it on for a bridge that also serves Apple Home |
| Voice open and close are reversed on a cover | coverSwapOpenClose, per-entity first for a single device | Changing the percentage flags first — command direction and percentage display are different things |
| Dragging a fan or cover slider produces repeated commands | The matching debounce, tested first as a single-entity override | Treating the update throttle as an inbound command debounce |
Switch safely between the field editor and raw JSON
-
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.
-
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, andfilter.exclude. -
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. -
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.
-
Step 5
Switch back to the form and cross-check
Confirm the fields still show the values you expect. Check in particular that
vacuumOnOffis explicitly true only where Alexa needs it, and that the icon has been kept by its own separate control. -
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.
The pitfalls that actually happen, filter and bridge settings both
| Symptom | Likely cause | What to do |
|---|---|---|
| Include ALL returns zero rows | Usually "area A or area B" set to ALL by mistake, or invalid regex syntax | Temporarily keep one row at a time and check the Preview, confirming each row matches the same entity alone |
| A label brings in only one entity | You used entity_label where you meant a whole device | Assign 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 match | Wrong slug, or the entity area overrides the device area | Copy 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 bridge | Hidden state, includeHiddenEntities, a disabled Entity Mapping flag, or an unsupported domain | Check all four plus the bridge's failed entities — Filter Preview only proves the filter decision, nothing downstream of it |
| Exclude did not block an entity | The matcher's type points at the wrong field | Exclude 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 rows | That is the interface truncating, not a filter limit | Read 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 disabled | An invalid name length, duplicate port, missing filter array, bad enum, out-of-range debounce/session value, or an unknown top-level key | Switch back to the form and read the validation. Do not bypass the schema and edit storage directly |
| A vacuum does not appear after Alexa commissioning | vacuumOnOff was left unset | Set 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 working | alexaPreserveBrightnessOnTurnOn is on for a bridge that includes Apple | Turn 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 change | That is exactly what minting a fresh identity produces | Restore 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 offline | It only pushes state on a schedule | Look 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 fan | A bridge-level workaround is too broad for one device | Clear 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 |
Filter Engine and bridge settings, the questions that recur
Does leaving Include empty mean no entity is included?
Can Exclude be set to ALL as well?
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?
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?
If the controller does not show it, is the matcher wrong?
Is Server Mode in the Stable channel production-grade?
Is vacuumOnOff: false the same as leaving it out?
Does Auto Composed Devices cover every manual linked field?
Do I still need a suffix change once stable identity is on?
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?
Where to go from here
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 guidePart 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