Most home routers with a zone-based firewall block a whole traffic category for an entire network in one rule. Social media, gaming, whatever. Sooner or later one device needs an exception without lifting the block for everyone else. The obvious fix is a more specific "allow" rule. That has a real, non-obvious catch on at least one popular controller's API.
Zone-based firewalls match traffic by app or traffic category, not just IP and port. UniFi, pfSense, OPNsense and similar. "Block this entire network from reaching anything tagged Social Media", for example. It is a clean way to apply a blanket restriction without maintaining a domain or IP blocklist by hand. Parental controls, focus rules, whatever the reason. The rule's source is the network as a whole, its destination is the traffic category, and the action is block.
The obvious way to carve out one exception is a second rule. Match that specific device by its client identity, not the whole network, against the same category, action allow. Then make sure it evaluates before the broad block. Zone-based firewalls stop at the first matching rule, so a specific allow ranked ahead of a broad block does exactly what you expect. Everyone else still hits the block. This one device hits the allow first and never reaches it.
Confirm that before you debug anything else. Pull the full rule list back down and sort by whatever priority field the API returns. If your specific-allow rule has a higher index number than the broad block it is supposed to preempt, that is the whole problem. The rule content is fine. The position is wrong.
New rules always append to the end of the chain, so use that. Create your specific exception rule first. Then delete the broad block rule and immediately recreate it with identical settings. The recreated block gets a fresh append-to-the-end placement, which now lands it after your exception rule, because that one was created first and already occupies an earlier slot. No drag-and-drop reordering. No manual index math. Delete then recreate, in the right sequence.
Re-fetch the full rule list after recreating the block and confirm the final order directly. Do not infer it from "the delete succeeded" and "the create succeeded" individually. Then test from the exempted device itself, not by reading the config back. Load something that falls under the blocked category and confirm it loads. A correctly ordered rule set that does not match the traffic the way you assumed is still a failure. Just a quieter one.
There is a second way to solve this. Instead of a higher-priority allow for the one device you want to exempt, flip the broad block's own source from "the whole network" to "every device on this network except the one I want exempted". That works and it does not scale. You maintain an explicit list of every other device's identity by hand. On any network with phones or tablets using per-network randomized identifiers, that list drifts out of date as those identifiers rotate, silently un-blocking devices that were supposed to stay restricted. Exempting the one device you care about, rather than enumerating everyone else, is less work and does not rot.