Commit 342d64b
RoamCore Engineer
Wave 3 #43: Connection: Happijac bed lift (tier-b) — van bed up/down control
Context: Promote the legacy tier-c docs/catalog/bed-lift/happijac.md
spec into a tier-b recipe connection at connections/happijac/.
Follows the same pattern proven by Wave 3 #35 Frigate / #36
Starlink / #37 DNS blocker / #38 NAS / #39 Teltonika / #40
Peplink / #41 Music Assistant / #42 Bluetooth-Wi-Fi presence.
Happijac (or any 2-relay + 2-limit-switch bed lift: LCI Happijac,
DIY linear actuators, winch + strap, etc.) is the sleep-cycle
glue of RoamCore for vans — every auto-lower at 23:00, auto-lift
at 07:00, obstruction-stop + TTS alert, low-voltage-lockout when
SOC < 20 %, safety-first wiring gate. Bed lift control is the
only RoamCore connection where mis-wiring can cause a physical
injury, so the recipe documents the four MANDATORY safety
interlocks (limit-sanity aggregate / low-voltage lockout via
sensor.rc_power_battery_soc cross-reference to Victron / current-
based obstruction detection / mode-aware Stealth + Sleep + Boost
lockouts) with the test_safety_interlocks_are_documented defensive
guard for the future tier-a promotion's hard-enforced asserts.
Two install paths documented (Path A — ESPHome custom cover for
ESPHome-friendly installs; Path B — Shelly 1 / Shelly Plus 1 /
Zooz ZEN17 / Aeotec Nano Switch relay pair + HA core template
cover for relay-friendly installs). Both paths land on the same
12 rc_bed_lift_* contract tiles (cover.rc_bed_lift_position + 2×
limit binary_sensors + moving + position_pct + safety_ok + 3×
button lift/lower/stop + obstruction_detected + low_voltage_
lockout + mode select auto/manual_only/disabled).
Subsystem addition: docs/reference/rc-entity-naming.md §allowed
subsystems list gains bed_lift (mirrors how media was added by
Music Assistant slice) AND presence (backfill — Wave 3 #42 promised
this addition in a code comment but it never landed in the doc).
Changes:
- connections/happijac/connection.yml (tier-b manifest; 12 vendor-
neutral rc_bed_lift_* contract tiles + 9 OpenClaw queries + 6
OpenClaw summary keys + 4 tier_warnings honesty markers)
- connections/happijac/__init__.py (DOMAIN = 'happijac' marker
stub; mirrors bluetooth-wifi-presence __init__.py shape)
- connections/happijac/README.md (folder overview; cross-
references to Victron + Music Assistant + bluetooth-wifi-
presence sibling slices)
- connections/happijac/docs/recipe.md (~360-line howto: Path A
ESPHome YAML for outputs + binary_sensors + cover; Path B
Shelly/template cover YAML + current_based_obstruction_
detection block; 4 safety interlocks in full; 6 §7 automations;
8 §8 troubleshooting entries; privacy; tier-a promotion outline)
- connections/happijac/tests/test_connection_yml.py (7 manifest-
honesty tests including test_safety_interlocks_are_documented
defensive guard)
- scripts/check.sh — append run_if_present entry for happijac
smoke check immediately after bluetooth-wifi-presence entry
- docs/catalog/bed-lift/happijac.md — add supersession banner
pointing at the new connection folder
- docs/reference/rc-entity-naming.md — add bed_lift AND backfill
presence to the Allowed subsystems list
- docs/mvp/features-build-status.md — add Shipped (repo) row
for Wave 3 #43 mirroring the bluetooth-wifi-presence row shape
Verification:
- bash scripts/check.sh --core-only → ✓ all requested smoke
checks passed (7/7 PASS for happijac connection smoke check)
- python3 -m pytest connections/happijac/tests/test_connection_
yml.py -v → 7 passed in 0.04s
- python3 -c 'import yaml; ...' (spec verification command
stripping 'happijac' and asserting no leftover vendor names)
→ VERIFICATION OK
- recipe.md 12 §sections present (§1–§10)
- 12 contract tiles all rc_bed_lift_* (no vendor names outside
the subsystem prefix)
Out of scope: bluetooth-wifi-presence/connection.yml and all
other connection folders.1 parent a19b8cf commit 342d64b
9 files changed
Lines changed: 2014 additions & 0 deletions
File tree
- connections/happijac
- docs
- tests
- docs
- catalog/bed-lift
- mvp
- reference
- scripts
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
0 commit comments