Wave 3 #52: Connection: Approach lights (welcome-home exterior + underbody lighting) (tier-b) — vendor-neutral light/switch scene + camera-override soft-deterrent - #55
Merged
Conversation
Promote the legacy tier-c docs/catalog/water/water-tanks.md spec (~25
lines, originally listed as "Support tier: C (manual / varies)" with
no recipe + no contract + no automations — just a placeholder that
said "add your preferred sensors/integration, then wire the resulting
entities into your dashboard") into a tier-b recipe connection at
connections/water-tanks/.
Three install paths (operator picks based on hardware ownership +
ESPHome familiarity + vendor preference):
- Path A — ESPHome tank sensor node (recommended for ESPHome-friendly
installs). One ESP32 per node, ultrasonic probe (JSNSR04T /
HC-SR04 waterproof) wired into GPIO for each tank; the ESPHome YAML
exposes sensor.<node>_fresh_level_pct +
sensor.<node>_fresh_distance_cm +
sensor.<node>_grey_level_pct +
sensor.<node>_grey_distance_cm. Optional
binary_sensor.<node>_pump_running (sense the pump's +12 V wire via
a CT clamp on the same ESP32) + sensor.<node>_fresh_temperature_c
(DS18B20 in tank bay) + binary_sensor.<node>_leak_detected.
- Path B — Generic resistive / 4–20 mA / voltage probe via Shelly
UNI ADC (no ESPHome). Probe wired into a Shelly UNI's ADC input;
the Shelly integration exposes sensor.<tank>_voltage; the HA
template: integration translates voltage to percentage via a
calibration curve.
- Path C — Cloud-bridged level sensor (SeeLevel / Garnet SeeLevel II
709-BTG / Mopeka Pro Check / Lippert). Vendor integration in HA
core or HACS exposes the level directly; the RoamCore recipe maps
the vendor entity to the contract tile.
All three paths land on the same 17 rc_water_* contract tiles:
sensor.rc_water_fresh_level_pct / _fresh_level_l /
_fresh_days_remaining / _grey_level_pct / _grey_level_l +
binary_sensor.rc_water_grey_full_warning / _fresh_low_warning /
_fresh_empty_warning / _pump_running / _pump_running_too_long /
_leak_detected / _freeze_risk + sensor.rc_water_fresh_temperature_c
+ sensor.rc_water_pump_runtime_min_last_24h +
number.rc_water_fresh_tank_size_l / _grey_tank_size_l +
select.rc_water_mode.
Five MANDATORY safety interlocks (§7, MANDATORY before first use):
- Leak detected — ANY leak sensor reports water → immediately stop
the pump + send a HIGH-PRIORITY push notification (leaks in a van
ruin everything).
- Freeze risk — sensor.rc_water_fresh_temperature_c < 2 °C → fire
binary_sensor.rc_water_freeze_risk + cross-reference the heated-
floors + hvac-basics connections' frost-warning path.
- Fresh empty warning — sensor.rc_water_fresh_level_pct < 5 % →
surface prominently on the dashboard.
- Pump running too long — binary_sensor.rc_water_pump_running
continuously TRUE for > 10 min → auto-stop the pump (a stuck pump
drains the fresh tank onto the floor + drains the battery bank).
- Mode-aware lockouts — Stealth auto-mutes warnings / Sleep silently
drops warning thresholds by 10 % / Boost disables ALL mode-aware
lockouts (operator-tunable via select.rc_water_mode + Stealth/Sleep/
Boost from select.rc_mode).
Six §8 automations: auto-push on fresh low / auto-push on grey full /
auto-stop pump when pump running too long / auto-push critical on
leak detected / auto-engage heated-floors on freeze risk when SOC >
50 % / mode-aware scheduling so warnings auto-mute in Stealth silent
hours unless they hit the leak / freeze / empty thresholds.
Eight §9 troubleshooting entries: sensor reading 0 % when tank is
full (wiring fault / empty-voltage calibration wrong) / sensor
reading 100 % when tank is empty (full-voltage calibration wrong) /
pump_running not toggling (CT clamp orientation / sense resistor too
small) / leak sensor always-on (probe wet + needs drying + salt
bridge on the contacts) / ESPHome device offline (Wi-Fi + USB-C
power) / Shelly UNI not discovered (mDNS / IGMP snooping) /
temperature reading -40 °C (DS18B20 wiring fault — check 4.7 kΩ
pull-up) / fresh_days_remaining negative (calibration drift /
tank-size misconfigured).
§10 privacy (no telemetry beyond local level + pump runtime +
temperature; no cloud call home; the leak sensors are local).
§11 promoting to tier-a (real tank + ESPHome + Shelly UNI bench on
CI + RoamCore-owned operator-wired setup flow).
Supersedes the legacy docs/catalog/water/water-tanks.md (which now
carries a SUPERSEDED banner pointing at the new connection folder).
The `water` subsystem was added to the Allowed subsystems list in
docs/reference/rc-entity-naming.md alongside this slice (mirrors how
`media` was added by the Music Assistant slice + how `presence` was
backfilled alongside the bluetooth-wifi-presence slice + how
`bed_lift` was added alongside the happijac slice + how `hvac` was
added alongside the heated-floors slice + how `safety` was added
alongside the smoke-co-gas-sensors slice).
Files added (5):
- connections/water-tanks/connection.yml (187 lines; tier-b
manifest; 17 contract tiles + 14 OpenClaw queries + 12 OpenClaw
summary keys + 4 tier_warnings honesty markers)
- connections/water-tanks/__init__.py (193 lines; DOMAIN =
"water_tanks" marker stub; verbose module docstring describing
all 3 paths + contract tile flow + safety interlocks; explicitly
avoids the config_flow substring per the happijac defensive
lesson)
- connections/water-tanks/README.md (56 lines; folder overview +
setup recipe + cross-references to 7 sibling slices)
- connections/water-tanks/docs/recipe.md (706 lines; 11-section
full howto mirroring hvac-basics §1–§11 shape)
- connections/water-tanks/tests/test_connection_yml.py (639 lines;
7 manifest-honesty tests)
Files modified (4):
- scripts/check.sh (added 2-line run_if_present entry after the
hvac-basics entry on line 111)
- docs/catalog/water/water-tanks.md (added SUPERSEDED banner +
Replaced by pointer + Recipe link; legacy content preserved for
historical context)
- docs/reference/rc-entity-naming.md (added `water` to Allowed
subsystems list between `time` and `system`)
- docs/mvp/features-build-status.md (added Shipped (repo) row for
Wave 3 #50 mirroring the hvac-basics row shape with the
17-tile contract entity list + vendor-neutrality list +
cross-references to HVAC basics + heated-floors + Victron +
smoke-co-gas-sensors + deadbolts + mode-automation-builder
sibling slices + PR #51 link)
Files added (1 handoff):
- Cron-handoff/2026-07-30-water-tanks-connection.md (slice
summary with Context / Changes / Verification / Rollback)
Verification:
- python3 -m pytest connections/water-tanks/tests/ -v → 7/7 PASS
- bash scripts/check.sh --core-only → exit 0
("✓ all requested smoke checks passed.")
PR #51.
… cron-handoff)
…-b) — auto tank routing + safety interlocks
…rbody lighting) (tier-b) — vendor-neutral light/switch scene + camera-override soft-deterrent Promote the legacy tier-c docs/catalog/lighting/approach-and-underbody-lights.md spec (24-line placeholder, no recipe + no contract + no automations) into a tier-b recipe connection at connections/approach-lights/. Follows the same pattern proven by the Wave 3 #35 Frigate / #42 bluetooth-wifi-presence / #44 heated-floors / #45 smoke-co-gas / #50 water-tanks / #51 electronic- valves slices. Three install paths (operator picks based on hardware ownership + vendor preference): - Path A — Smart switches / smart bulbs (recommended for operators with existing smart lighting). Vendor: Shelly 1 / Shelly Plus 1 / Zooz ZEN17 / Aeotec Nano Switch (A1 wired switches) + Philips Hue / LIFX / IKEA TRÅDFRI (A2 smart bulbs) + generic-Zigbee / generic-Z-Wave / Tuya (A3 vendor-neutral). The vendor integration exposes light.* or switch.* entities; the recipe maps each via HA core template: light wrappers or HA core light: group (since 2022.x). - Path B — Generic relay + HA template light (no smart bulb; just a 12 V underbody LED strip + a relay-driven entry light). Vendor: Shelly 1 / Shelly Plus 1 / Zooz ZEN17 / Aeotec Nano Switch (HA core, GUI flow since 2022.x) wired into the 12 V / 24 V LED driver; HA core template: light wraps the relay into a virtual light.entry + light.underbody + light.soft_interior. - Path C — All-in-one smart scene controller (Hue Bridge / Lutron Caséta / IKEA TRÅDFRI / Bond Home for ceiling-fan-light combos). Vendor: any hub that exposes all lights as light.*; the recipe walks the operator through grouping the approach lights into a light.approach_scene group entity (HA light: group domain since 2022.x). All three paths land on the same 12 rc_lighting_* contract tiles (per docs/reference/rc-entity-naming.md §lighting subsystem — NEW — added by this slice, mirroring how media was added by Music Assistant Wave 3 #41 + how presence was added by bluetooth-wifi-presence Wave 3 #42 + how water was added by water-tanks Wave 3 #50 + how bed_lift was added by happijac Wave 3 #43 + how hvac was added by heated-floors Wave 3 #44 + how safety was added by smoke-co-gas-sensors Wave 3 #45): - binary_sensor.rc_lighting_approach_active (approach scene running) - binary_sensor.rc_lighting_approach_available (meta-gate) - binary_sensor.rc_lighting_underbody_state (per-zone state mirror) - binary_sensor.rc_lighting_entry_state (per-zone state mirror) - binary_sensor.rc_lighting_soft_interior_state (per-zone state mirror) - sensor.rc_lighting_approach_minutes_remaining (countdown remaining) - sensor.rc_lighting_last_approach_trigger_minutes_ago (last-triggered badge) - binary_sensor.rc_lighting_dark_outside (sun.sun OR sensor.rc_weather_light_lux < 50 lx) - select.rc_lighting_approach_mode (auto / dark_only / stealth_only / disabled) - number.rc_lighting_approach_duration_min (default 2; range 1-10) - button.rc_lighting_run_approach_now (HA button: integration since 2023.x) - binary_sensor.rc_lighting_camera_override (TRUE for 30 seconds on Frigate person detection in entry zone after dark) The 5 §7 automations (MANDATORY before first use): 1. First-arrival-after-dark — trigger when binary_sensor.rc_presence_all_away (from bluetooth-wifi-presence Wave 3 #42) transitions TRUE → FALSE AND binary_sensor.rc_lighting_dark_outside is TRUE AND select.rc_lighting_approach_mode != disabled AND select.rc_mode (from mode/automation-builder) != stealth. 2. Run-on-demand — trigger on button.rc_lighting_run_approach_now press. 3. Auto-stop-after-N-min — trigger on the HA timer: N-minute countdown fire; fire light.turn_off for each approach light. 4. Camera-override-on-frigate-person — trigger on a Frigate person detection in the entry zone after dark (cross-references Frigate Wave 3 #35); fire binary_sensor.rc_lighting_camera_override TRUE for 30 seconds + set underbody lights to full brightness. 5. Stealth-mode-suppression — when select.rc_mode == stealth, suppress ALL approach lighting (don't fire the §7.1 first-arrival- after-dark automation). New docs/reference/rc-entity-naming.md §lighting subsystem (one-line addition: 'lighting' — exterior + interior lights + lighting scenes + lighting mode overrides; vendor-neutral rc_lighting_* ids). Files added: - connections/approach-lights/connection.yml (tier-b manifest; 12 contract tiles + 11 OpenClaw queries + 11 OpenClaw summary keys + 5 tier_warnings honesty markers) - connections/approach-lights/__init__.py (DOMAIN = 'approach_lights' marker stub; the docstring's single config_flow.py mention was rephrased to 'operator-wired setup flow' to avoid the substring trap that the happijac slice was bitten by — the test caught the substring before commit) - connections/approach-lights/README.md (folder overview + supersession pointer) - connections/approach-lights/docs/recipe.md (~1083-line howto, 11 §sections; mirrors electronic-valves §1-§11 shape with approach- lights substitutions) - connections/approach-lights/tests/test_connection_yml.py (7 manifest-honesty tests; 7/7 PASS via bash scripts/check.sh --core-only) - Cron-handoff/2026-07-30-approach-lights-connection.md (Context / Changes / Verification / Rollback) Files modified: - scripts/check.sh (append run_if_present entry for connections/ approach-lights/tests/test_connection_yml.py directly after the existing electronic-valves entry) - docs/catalog/lighting/approach-and-underbody-lights.md (add supersession banner pointing at the new connection folder) - docs/reference/rc-entity-naming.md (add 'lighting' subsystem to the Allowed subsystems list) - docs/mvp/features-build-status.md (add 'Shipped (repo)' row for Wave 3 #52 mirroring the electronic-valves row shape; PR #55 link; Last updated: 2026-08-02)
This was referenced Aug 2, 2026
Merged
bernardc6
pushed a commit
that referenced
this pull request
Aug 3, 2026
…mic) (tier-c) — NTP-synchronized time with offline-resilience [PR #59]
bernardc6
pushed a commit
that referenced
this pull request
Aug 3, 2026
… with on-device person/car/animal/package detection + 12 rc_security_* + rc_storage_recording_* contract tiles Tier-b recipe connection that RECIPES over the upstream HA core `frigate` integration (since 2022.x — exposes the canonical NVR backend for Home Assistant automations) + the HACS frigate add-on (the canonical upstream vendor-neutral local NVR add-on) + the upstream `camera` platform (since 2022.x) + the HA core `recorder` integration (since 2022.x) + the HA core `input_boolean` + `input_text` + `input_number` + `input_select` + `input_datetime` + `input_button` + `script` + `select` helpers (since 2022.x) + the HA core `template:` sensor + binary_sensor wrappers (since 2022.x) + the HA core `logbook` integration (since 2022.x) + the upstream `script:` integration (since 2022.x). RoamCore does NOT maintain a custom NVR engine; the upstream HA core `frigate` integration IS the canonical NVR backend integration. Context: Wave 3 #35 — Connection: Frigate (tier-b) — vendor-neutral NVR backend with on-device person / car / animal / package detection. Changes (file by file): - `connections/frigate/connection.yml` (new) — the source-of-truth tier-b manifest. category=cctv, tier=b, status=beta, install.config_flow=true (HA core exposes GUI flow since 2022.x), install.hacs=true (recommended Path A HACS frigate add-on), wizard.one_tap=false (the recipe is the FIVE-step operator-pickable NVR flow). 12 vendor-neutral contract tiles: 4 cameras `rc_security_camera_*` (online + recording + last_motion + motion_mask) + 4 detection `rc_security_detection_*` (person_count + car_count + animal_count + package_count) + 4 recording/storage `rc_storage_recording_*` (enabled + used + free + retention_today_count). 4 tier_requirements + 5 tier_warnings. Cross-references: MQTT Wave 3 #34 + mode Wave 3 #61 + advanced-mode Wave 3 #63 + openclaw-api Wave 3 #64 + agent-actions-allowlist Wave 3 #65 + remote-access Wave 3 #58 + dns-blocker Wave 3 #37 + hvac-basics Wave 3 #49 + fans Wave 3 #59. - `connections/frigate/__init__.py` (new) — `DOMAIN = "frigate"` marker for the audit. Marker-only stub; no native integration code. The module docstring rephrases 'config_flow.py' as 'operator-wired setup flow' + 'the upstream integration's GUI flow' to avoid the literal substring trap (the same trap the happijac / remote-access / fans / leveling / mode / demo-mode / advanced-mode / openclaw-api / agent-actions-allowlist / mqtt slices were bitten by). - `connections/frigate/README.md` (new) — the folder overview + the 12-tile table (4 cameras + 4 detection + 4 recording/storage) + the 5-§8-automation summary + the supersession pointer + the cross-references. - `connections/frigate/docs/recipe.md` (new) — the full 1406-line howto with 14 §sections (the §1 What is Frigate + §2 Prerequisites + §3 Pick the NVR path + §4 Mount the camera URLs + §5 Confirm the cameras are online + §6 Enable + start recording + §7 RoamCore contract entities + §8 Automations (FIVE MANDATORY before first use: §8.1 per-camera offline guard + §8.2 cameras-online guard + §8.3 per-camera motion-mask guard + §8.4 storage-full guard + §8.5 records-on-motion guard) + §9 Troubleshooting (6 entries) + §10 Privacy (NEW: documents the per-detection / per-camera tracking opt-in policy) + §11 Promoting to tier-a (canned fixture responses for camera-offline + records-on-motion + motion-mask + storage-full + retentions-spin-down events) + §12 Files + §13 Cross-references + §14 Storage rotation policy (NEW: documents the recommended retention thresholds + storage volume sizing + storage rotation policy example + trade-offs)). - `connections/frigate/tests/test_connection_yml.py` (new) — 7 manifest-honesty checks (test_id_matches_folder_name + test_tier_b_without_tier_a_markers + test_requires_docs_recipe_published + test_category_matches_existing_legacy_doc + test_dashboard_tiles_follow_rc_naming + test_status_reflects_no_native_nvr_engine + test_automations_are_documented). Mirrors the mqtt / agent-actions-allowlist / openclaw-api / advanced-mode / demo-mode / mode / leveling / fans / happijac / remote-access / nfc-tags / in-cab-tablet-dashboard / time-atomic / timezone-geolocator / motion-based-lighting / hvac-basics / approach-lights pattern. The tile-pattern regex enforces `rc_security_*` + `rc_storage_*` prefixes per the `security` + `storage` subsystem naming convention established by this slice. - `scripts/check.sh` (modified) — APPEND one `run_if_present` line at the END of the Connection section (just before `if [ "$CORE_ONLY" -eq 0 ]`): `run_if_present "connections/frigate/tests/test_connection_yml.py" \\\\n "Connection: Frigate (NVR + on-device object detection, tier-b) — vendor-neutral CCTV backend with person/car/animal/package contract: manifest honesty smoke check"`. The previous stale frigate entry at line 83 is preserved (the audit gracefully skips It; the new entry is the canonical entry for Wave 3 #35). - `docs/catalog/cctv/frigate.md` (modified) — APPEND the SUPERSEDED banner at the end (the legacy 669-byte body is preserved verbatim). The banner points at the new tier-b recipe connection at `connections/frigate/`. - `docs/reference/rc-entity-naming.md` (modified) — add `security` + `storage` to the Allowed subsystems list (Extended subsystems added by the Wave 3 connection pipeline; alphabetical placement after `agent_actions`). The `security` subsystem is OWNED by this slice (the FIRST `cctv`-category `security` slice in the RoamCore connection pipeline) + the `storage` subsystem is OWNED by this slice (the FIRST `cctv`-category `storage` slice in the RoamCore connection pipeline). - `docs/mvp/features-build-status.md` (modified) — add 'Frigate (NVR + on-device person / car / animal / package detection — the camera backend everything depends on)' row in the Shipped (repo) section (just before `## Next steps`). The row mirrors the mqtt / agent-actions-allowlist row format with the 12-tile vendor-neutral contract layer + the 5 §8 MANDATORY automations + the 14-§section recipe + the verification block. - `docs/catalog/_inventory.yml` + `docs/catalog/index.md` + `docs/catalog/security/index.md` + `docs/catalog/security/frigate.md` (regenerated via `python3 scripts/build_catalog.py`) — auto-generated catalog page + inventory entry for the new connection. The catalog_category is mapped from `cctv` (yaml_category) to `security` (catalog directory) per the build script's category mapping. - `connections/_all_connections_inventory.yml` + `docs/catalog/.build_catalog_manifest.txt` (regenerated) — auto-generated developer references. Verification: - `bash scripts/check.sh --core-only` EXIT=0 - `python3 -m pytest connections/frigate/tests/ -v` → 7/7 PASS (test_id_matches_folder_name + test_tier_b_without_tier_a_markers + test_requires_docs_recipe_published + test_category_matches_existing_legacy_doc + test_dashboard_tiles_follow_rc_naming + test_status_reflects_no_native_nvr_engine + test_automations_are_documented) - `git ls-remote origin feat/connections/frigate` → confirm the new branch is published Rollback: `git push origin :feat/connections/frigate` + `gh pr close <NEW>` (the new connection lives ONLY on this branch; no impact on main until merged). The legacy catalog page at `docs/catalog/cctv/frigate.md` is preserved verbatim (the SUPERSEDED banner is appended at the end of the doc). Next pick: Row #66 — Map dashboard (M-sized, independent, `docs/catalog/map/map-dashboard.md` → `connections/map-dashboard/tier-c` tier-c recipe connection). Schema-low-risk tier-c slice; no benchmarks required; cross-references to MQTT Wave 3 #34 + remote-access Wave 3 #58 + time-atomic Wave 3 #55 + gps Wave 3 #56 + tracking Wave 3 #1 + traccar + openclaw-api Wave 3 #64.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Promote the legacy tier-c
docs/catalog/lighting/approach-and-underbody-lights.mdspec (24-line placeholder, no recipe + no contract + no automations) into a tier-b recipe connection atconnections/approach-lights/. Follows the same pattern proven by the Wave 3 #35 Frigate / #42 bluetooth-wifi-presence / #44 heated-floors / #45 smoke-co-gas / #50 water-tanks / #51 electronic-valves slices.What this slice ships
Three install paths (operator picks based on hardware ownership + vendor preference):
light.*orswitch.*entities; the recipe maps each via HA coretemplate:light wrappers or HA corelight:group (since 2022.x).template:light wraps the relay into a virtuallight.entry+light.underbody+light.soft_interior.light.*; the recipe walks the operator through grouping the approach lights into alight.approach_scenegroup entity (HAlight:group domain since 2022.x).All three paths land on the same 12
rc_lighting_*contract tiles (perdocs/reference/rc-entity-naming.md§lighting subsystem — NEW — added by this slice, mirroring howmediawas added by Music Assistant Wave 3 #41 + howpresencewas added by bluetooth-wifi-presence Wave 3 #42 + howwaterwas added by water-tanks Wave 3 #50 + howbed_liftwas added by happijac Wave 3 #43 + howhvacwas added by heated-floors Wave 3 #44 + howsafetywas added by smoke-co-gas-sensors Wave 3 #45):binary_sensor.rc_lighting_approach_active(approach scene running)binary_sensor.rc_lighting_approach_available(meta-gate)binary_sensor.rc_lighting_underbody_state(per-zone state mirror)binary_sensor.rc_lighting_entry_state(per-zone state mirror)binary_sensor.rc_lighting_soft_interior_state(per-zone state mirror)sensor.rc_lighting_approach_minutes_remaining(countdown remaining)sensor.rc_lighting_last_approach_trigger_minutes_ago(last-triggered badge)binary_sensor.rc_lighting_dark_outside(sun.sunORsensor.rc_weather_light_lux< 50 lx)select.rc_lighting_approach_mode(auto / dark_only / stealth_only / disabled)number.rc_lighting_approach_duration_min(default 2; range 1–10)button.rc_lighting_run_approach_now(HAbutton:integration since 2023.x)binary_sensor.rc_lighting_camera_override(TRUE for 30 seconds on Frigatepersondetection in entry zone after dark)The 5 §7 automations (MANDATORY before first use):
binary_sensor.rc_presence_all_away(from bluetooth-wifi-presence Wave 3 Wave 3 #38: Connection: NAS (tier-b) — Synology / QNAP / SMB local storage #42) transitions TRUE → FALSE ANDbinary_sensor.rc_lighting_dark_outsideis TRUE ANDselect.rc_lighting_approach_mode!=disabledANDselect.rc_mode(from mode/automation-builder) !=stealth.button.rc_lighting_run_approach_nowpress.timer:N-minute countdown fire; firelight.turn_offfor each approach light.persondetection in the entry zone after dark (cross-references Frigate Wave 3 Wave 2 #10: PWA scaffold (real install + offline detection + push notifications) #35); firebinary_sensor.rc_lighting_camera_overrideTRUE for 30 seconds + set underbody lights to full brightness.select.rc_mode==stealth, suppress ALL approach lighting (don't fire the §7.1 first-arrival-after-dark automation).New
lightingsubsystem indocs/reference/rc-entity-naming.md(one-line addition:lighting— exterior + interior lights + lighting scenes + lighting mode overrides; vendor-neutralrc_lighting_*ids).Cross-references
binary_sensor.rc_presence_all_away+binary_sensor.rc_presence_anyone_home. Connection:connections/bluetooth-wifi-presence/.select.rc_mode. Connection:connections/mode-automation-builder/.binary_sensor.<camera>_<zone>_person_detected. Connection:connections/frigate/.sun.sun(HA core, GUI flow since 2022.x) ORsensor.rc_weather_light_lux(fromhomeassistant/packages/roamcore_weather_time.yaml).lightingsubsystem prefix.Files
New (6):
connections/approach-lights/connection.yml(tier-b manifest; 12 contract tiles + 11 OpenClaw queries + 11 OpenClaw summary keys + 5tier_warningshonesty markers)connections/approach-lights/__init__.py(DOMAIN = "approach_lights"marker stub)connections/approach-lights/README.md(folder overview + supersession pointer)connections/approach-lights/docs/recipe.md(~1083-line howto, 11 §sections; mirrors electronic-valves §1–§11 shape)connections/approach-lights/tests/test_connection_yml.py(7 manifest-honesty tests; 7/7 PASS viabash scripts/check.sh --core-only)Cron-handoff/2026-07-30-approach-lights-connection.md(Context / Changes / Verification / Rollback)Modified (4):
scripts/check.sh(appendrun_if_presententry for the new approach-lights smoke check directly after the existing electronic-valves entry)docs/catalog/lighting/approach-and-underbody-lights.md(add supersession banner pointing at the new connection folder; legacy content preserved for historical context)docs/reference/rc-entity-naming.md(addlightingsubsystem to the Allowed subsystems list)docs/mvp/features-build-status.md(add "Shipped (repo)" row for Wave 3 Wave 3 #48: Connection: Deadbolts (tier-b) — smart lock control for van doors #52 mirroring the electronic-valves row shape)Verification
bash scripts/check.sh --core-only— exit 0; ✓ all requested smoke checks passedconnections/approach-lights/tests/test_connection_yml.py): test_id_matches_folder_name, test_tier_b_without_tier_a_markers (with explicitconfig_flowsubstring guard for the init.py docstring, mirroring the happijac defensive lesson — the test caught the rephrasing before commit), test_requires_docs_recipe_published (recipe is ~1083 lines, all 11 §sections present), test_category_matches_existing_legacy_doc (category=lighting, legacy doc has SUPERSEDED banner pointing atconnections/approach-lights/), test_dashboard_tiles_follow_rc_naming (12 tiles; vendor name absolute-forbidden — shelly / hue / lifx / tradfri / ikea / philips / zigbee / zha / zwave / tuya / lutron / bond / sonoff / nous / aqara / 12v / 24v / led / led_ / relay / bulb / driver / strip / sensor_ / binary_sensor_), test_status_reflects_no_real_approach_lights (status=beta, all 5 honesty warnings in tier_warnings), test_automations_are_documented (all 5 §7 automations documented — first-arrival-after-dark + run-on-demand + auto-stop-after-N-min + camera-override-on-frigate-person + stealth-mode-suppression — plus cross-references to bluetooth-wifi-presence + Frigate + mode/automation-builder + time/weather contract + the "MANDATORY before first use" emphasis)Why tier-b, not tier-a
Tier-a requires a working RoamCore-owned
config_flow.py, integration tests against a real approach-light bench (a Shelly 1 + a 12 V / 24 V LED strip + Hue Bridge + Frigate entry zone, all wired together in a controlled environment), andwizard.one_tap: true. We have no operator-side approach-light bench on the CI to integration-test against (the bench requires physical hardware + a way to simulate the first-arrival / dark / Frigatepersontrigger conditions). So this connection is honestly beta-tier: the recipe is sound but we cannot claim one-tap automation.