Skip to content

[Feature]: Tighten settings labels for iOS-style consistency #28

@tashda

Description

@tashda

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:

  1. Negated toggles (disable_automatic_update_check, force_disable_retain, disable_led) rendered as "Disable …" labels — backwards compared to every iOS-stock toggle.
  2. Truncated labels in narrow rows (e.g. "Transfer Request Ti…" / "Delay Between Bloc…").
  3. Units in parentheses inside the label ("Max Packet Size (bytes)") instead of trailing the value.
  4. Redundant unit wordsInlineIntField already shows the unit, so labels like "Reconnect Attempts" + unit attempts read as "5 attempts attempts".
  5. 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).
  6. Verb-prefixed toggles ("Use Legacy Action Sensor") — iOS toggles are nouns.
  7. 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).

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions