What problem does this solve?
A handful of bridge settings in Shellbee are translated 1:1 from the Z2M schema, which doesn't follow iOS Settings conventions. The result is a mix of:
- Negated toggles (
disable_automatic_update_check, force_disable_retain, disable_led) rendered as "Disable …" labels — backwards compared to every iOS-stock toggle.
- Truncated labels in narrow rows (e.g. "Transfer Request Ti…" / "Delay Between Bloc…").
- Units in parentheses inside the label ("Max Packet Size (bytes)") instead of trailing the value.
- Redundant unit words —
InlineIntField already shows the unit, so labels like "Reconnect Attempts" + unit attempts read as "5 attempts attempts".
- Section/row redundancy — section header repeats inside the row label ("Recent Events on Home" inside the "Home" section, two "Offline Timeout" rows under "Mains-Powered" and "Battery-Powered" sections).
- Verb-prefixed toggles ("Use Legacy Action Sensor") — iOS toggles are nouns.
- Sentence-case stragglers ("Automatically share crash reports") in an otherwise Title Case Settings app.
What would you like Shellbee to do?
Apply the iOS-stock conventions everywhere without losing Z2M-native vocabulary on the wire.
Negated toggles → positive labels with inverted binding:
| Page |
Before |
After |
| OTA → Automatic Updates |
Disable Automatic Checks |
Enable Automatic Checks |
| MQTT → Advanced |
Disable Message Retain |
Retain Messages |
| Adapter → Hardware |
Disable Adapter LED |
Adapter LED (default ON) |
Underlying flags (disable_automatic_update_check, force_disable_retain, disable_led) stay Z2M-canonical on the wire; only the UI binding flips.
Truncated labels → shorter:
| Page |
Before |
After |
| OTA → Transfer Timing |
Transfer Request Timeout |
Request Timeout |
| OTA → Transfer Timing |
Delay Between Blocks |
Block Delay |
Units alongside the value, never in the label:
| Page |
Before |
After |
| MQTT → Advanced |
Max Packet Size (bytes) — custom row |
Max Packet Size — InlineIntField with unit bytes |
Redundant unit words removed:
| Page |
Before |
After |
| App → General |
Reconnect Attempts (unit attempts) |
Reconnect Limit |
| App → Performance |
Concurrent Requests (unit requests) |
Concurrency |
| Availability → Mains-Powered |
Pause After Retries (unit retries) |
Pause After |
Section/row redundancy collapsed:
| Page |
Before |
After |
| App → General |
Section "Home" / row "Recent Events on Home" |
row "Recent Events" |
| Availability |
row "Offline Timeout" in both sections |
row "Timeout" (sections disambiguate) |
| Health Checks |
Section "Health Check Interval" / row "Check Interval" |
Section "Interval" / row "Check Interval" |
| Network & Hardware |
Section "Hardware Tuning" |
Section "Adapter Tuning" |
| Adapter |
Section "Adapter" containing "Adapter Type" + Baud + RTS/CTS |
Section "Connection" |
Verb-prefixed toggles → noun:
| Page |
Before |
After |
| Home Assistant → Compatibility |
Use Legacy Action Sensor |
Legacy Action Sensor |
| Home Assistant → Compatibility |
Use Event Entities |
Event Entities |
Sentence-case fix:
| Page |
Before |
After |
| App → General → Diagnostics |
Automatically share crash reports |
Automatically Share Crash Reports |
Intentionally left unchanged (Z2M identity, or borderline negative whose user-goal is the negative action):
- "Serve API Only" (
disable_ui_serving) — reads positively as the user's intent.
- "QoS Level" picker rows (
QoS 0 — At most once).
- All Z2M-native vocabulary on the wire (passlist/blocklist, base_topic, retain, etc.) and on screen where it's the canonical name (Touchlink, Allow List / Block List).
Add UI tests asserting both the new labels exist and the legacy ones are gone, so future Z2M schema syncs can't reintroduce them.
Does the Z2M web frontend already do this?
Partially — Z2M does something similar
Alternatives you've considered
Mirroring the Z2M schema labels verbatim (rejected — produces backwards toggles and breaks iOS conventions). Hiding the affected settings (rejected — they're useful when needed).
What problem does this solve?
A handful of bridge settings in Shellbee are translated 1:1 from the Z2M schema, which doesn't follow iOS Settings conventions. The result is a mix of:
disable_automatic_update_check,force_disable_retain,disable_led) rendered as "Disable …" labels — backwards compared to every iOS-stock toggle.InlineIntFieldalready shows the unit, so labels like "Reconnect Attempts" + unitattemptsread as "5 attempts attempts".What would you like Shellbee to do?
Apply the iOS-stock conventions everywhere without losing Z2M-native vocabulary on the wire.
Negated toggles → positive labels with inverted binding:
Underlying flags (
disable_automatic_update_check,force_disable_retain,disable_led) stay Z2M-canonical on the wire; only the UI binding flips.Truncated labels → shorter:
Units alongside the value, never in the label:
InlineIntFieldwith unitbytesRedundant unit words removed:
attempts)requests)retries)Section/row redundancy collapsed:
Verb-prefixed toggles → noun:
Sentence-case fix:
Intentionally left unchanged (Z2M identity, or borderline negative whose user-goal is the negative action):
disable_ui_serving) — reads positively as the user's intent.QoS 0 — At most once).Add UI tests asserting both the new labels exist and the legacy ones are gone, so future Z2M schema syncs can't reintroduce them.
Does the Z2M web frontend already do this?
Partially — Z2M does something similar
Alternatives you've considered
Mirroring the Z2M schema labels verbatim (rejected — produces backwards toggles and breaks iOS conventions). Hiding the affected settings (rejected — they're useful when needed).