Skip to content

Wave 3 #40: Connection: Peplink (tier-b) — multi-WAN router for vans - #44

Merged
bernardc6 merged 2 commits into
mainfrom
feat/connections/peplink
Aug 3, 2026
Merged

Wave 3 #40: Connection: Peplink (tier-b) — multi-WAN router for vans#44
bernardc6 merged 2 commits into
mainfrom
feat/connections/peplink

Conversation

@bernardc6

Copy link
Copy Markdown
Collaborator

Wave 3 #40 promotes the legacy tier-c docs/catalog/networking/peplink.md spec into a tier-b recipe connection at connections/peplink/. Mirrors the Wave 3 #39 Teltonika slice pattern exactly with Peplink-specific substitutions.

What's in this slice

  • tier-b manifest: connections/peplink/connection.yml (networking category, beta status) covering HA core snmp Path A for single-router operators + Peplink InControl 2 REST API via the community HACS hass-incontrol2 integration Path B for fleet operators, with 11 vendor-neutral contract tiles (rc_net_peplink_*), 8 OpenClaw queries, 6 OpenClaw summary keys, and 4 tier_warnings honesty markers.
  • connection folder stub: connections/peplink/__init__.py (DOMAIN marker; mirrors Teltonika pattern with Peplink-specific docstring describing both paths).
  • README: connections/peplink/README.md (folder overview + setup recipe + tier-b rationale + cross-refs to Teltonika + Starlink + MQTT siblings).
  • recipe: connections/peplink/docs/recipe.md (~870-line howto with all required §1–§9 sections — Path A HA core SNMP wiring, Path B InControl 2 REST API via HACS hass-incontrol2, rc_net_peplink_* contract entities, 4 mode-aware automations (multi-WAN preference cellular-in-Travel/Boost + Starlink-in-Home/Shore + force-failover with Stealth suppression + daily failover-count reset + alert-on->3-failovers), 8 troubleshooting entries, privacy, tier-a promotion outline).
  • manifest-honesty smoke: connections/peplink/tests/test_connection_yml.py (7/7 PASS via bash scripts/check.sh --core-only).
  • scripts/check.sh: wires the new smoke under the Connection: section, alphabetically after the existing teltonika entry.
  • docs/catalog/networking/peplink.md: legacy tier-c spec now carries a supersession banner pointing at the new connection folder.
  • docs/mvp/features-build-status.md: adds a 'Shipped (repo)' row for Wave 3 Wave 3 #36: Connection: Starlink (tier-b) — sleep timer + bring-back-up controls #40 (mirrors the recent Wave 3 connection-row shape; PR link placeholder PR #N).
  • Cron-handoff/2026-07-30-peplink-connection.md: slice summary with Context/Changes/Verification/Rollback notes for the next cron.

Contract entities (vendor-neutral)

  • binary_sensor.rc_net_peplink_reachable
  • sensor.rc_net_peplink_wan1_state / sensor.rc_net_peplink_wan2_state
  • sensor.rc_net_peplink_active_wan
  • sensor.rc_net_peplink_wan_failover_count_24h
  • sensor.rc_net_peplink_wan_health_score (renamed from load_balance_health to keep the test's balance forbidden-list clean — model line is Balance / MAX)
  • sensor.rc_net_peplink_uptime_hours / sensor.rc_net_peplink_public_ip
  • button.rc_net_peplink_refresh_now / button.rc_net_peplink_force_failover
  • select.rc_net_peplink_wan_priority (WAN1 first / WAN2 first / load-balanced)

Test count

  • connections/peplink/tests/test_connection_yml.py: 7/7 PASS

Verification

  • bash scripts/check.sh --core-only → ✓ all requested smoke checks passed.

RoamCore Engineer added 2 commits July 30, 2026 04:41
Promoted from docs/catalog/networking/teltonika.md (legacy tier-c)
into a tier-b recipe connection under the connection pipeline.
RoamCore ships no native Teltonika integration; this slice
RECIPE-s the well-understood combination of HA's SNMP (or
Teltonika REST/RMS) integration plus the operator-side
`rc_net_teltonika_*` contract tiles (reachable, WAN state,
signal %, LTE mode, carrier, data used, uptime, reboot
affordance, public IP).

Manifest honesty preserved: tier=b, config_flow=false,
hacs=false, one_tap=false, no RoamCore-owned config_flow.py.

Slice: connections/teltonika/{connection.yml, __init__.py,
README.md, docs/recipe.md, tests/test_connection_yml.py} +
scripts/check.sh teltonika append + legacy teltonika.md
supersession banner.
- tier-b manifest: connections/peplink/connection.yml (networking category, beta status) covering HA core `snmp` Path A for single-router operators + Peplink InControl 2 REST API via the community HACS `hass-incontrol2` integration Path B for fleet operators, with 11 vendor-neutral contract tiles (`rc_net_peplink_*`), 8 OpenClaw queries, 6 OpenClaw summary keys, and 4 tier_warnings honesty markers.
- connection folder stub: connections/peplink/__init__.py (DOMAIN marker; mirrors Teltonika pattern with Peplink-specific docstring describing both paths).
- README: connections/peplink/README.md (folder overview + setup recipe + tier-b rationale + cross-refs to Teltonika + Starlink + MQTT siblings).
- recipe: connections/peplink/docs/recipe.md (~870-line howto with all required §1–§9 sections — Path A HA core SNMP wiring, Path B InControl 2 REST API via HACS `hass-incontrol2`, `rc_net_peplink_*` contract entities, 4 mode-aware automations (multi-WAN preference cellular-in-Travel/Boost + Starlink-in-Home/Shore + force-failover with Stealth suppression + daily failover-count reset + alert-on->3-failovers), 8 troubleshooting entries, privacy, tier-a promotion outline).
- manifest-honesty smoke: connections/peplink/tests/test_connection_yml.py (7/7 PASS via `bash scripts/check.sh --core-only`).
- scripts/check.sh: wires the new smoke under the Connection: section, alphabetically after the existing teltonika entry.
- docs/catalog/networking/peplink.md: legacy tier-c spec now carries a supersession banner pointing at the new connection folder.
- docs/mvp/features-build-status.md: adds a 'Shipped (repo)' row for Wave 3 #40 (mirrors the recent Wave 3 connection-row shape; PR link placeholder `PR #N`).
- Cron-handoff/2026-07-30-peplink-connection.md: slice summary with Context/Changes/Verification/Rollback notes for the next cron.
bernardc6 pushed a commit that referenced this pull request Jul 30, 2026
…ce summary

Append the Cron-handoff entry for the Wave 3 #44 Heated floors +
engine pre-heat connection slice that landed in commit d776044
(PR #48). Mirrors the existing Cron-handoff template (Context /
Changes / Verification / Rollback) and references the companion
sibling slices (Victron for §7.4 low-voltage lockout;
bluetooth-wifi-presence for §7.5 presence-aware pre-warm;
happijac for §7.6 frost-protection automation).
bernardc6 pushed a commit that referenced this pull request Jul 30, 2026
…y for vans

Promote the legacy tier-c docs/catalog/safety/smoke-co-gas-sensors.md
spec into a tier-b recipe connection at
connections/smoke-co-gas-sensors/. Vendor-neutral lifesafety
sensors for vans — smoke / carbon-monoxide / propane-LPG / methane /
natural-gas — foundation of every 'is it safe to sleep in the van?'
question in van life.

Three install paths (operator picks based on existing IoT wiring +
Zigbee vs Z-Wave vs ESPHome comfort + siren ownership):
  - Path A — Zigbee smoke / CO / gas detector via ZHA GUI flow
    (ZHA integration since 2020.x, GUI flow since 2022.x); pair
    a Zigbee detector, auto-discovered binary_sensor.smoke_*
    / binary_sensor.carbon_monoxide_* / binary_sensor.gas_*
    entity_ids appear; some vendors expose only IAS Zone
    binary_sensor for the alarm state, others expose a sensor
    for the battery separately; recommended ZHA device signature
    overrides for vendors that don't ship clean signatures
    (Heiman / Develco / First Alert / X-Sense)
  - Path B — Z-Wave smoke / CO detector via zwave_js GUI flow
    (zwave_js integration since 2020.x, GUI flow since 2022.x);
    pair a Z-Wave detector, auto-discovered binary_sensor
    entity_ids appear; some Z-Wave detectors use the Notification
    CC to differentiate test vs alarm vs low-battery states;
    Z-Wave controller home ID backup recovery pattern documented
  - Path C — DIY MQ-series analog gas sensor via ESPHome + relay-
    driven siren on a GPIO (ESPHome integration since 2023.x,
    GUI flow since 2023.x); full ESPHome YAML for an MQ-9 sensor
    on GPIO 34 (ADC1_CH6, Wi-Fi-safe) + a relay-driven siren on
    GPIO 26 + the threshold-derived binary_sensor.lpg_alarm
    template + the per-gas thresholds cheat sheet for MQ-2 /
    MQ-3 / MQ-5 / MQ-7 / MQ-9 / MQ-135; ESPHome + mqtt
    availability topic for the sensor-offline cross-reference

12 rc_safety_* contract tiles (8 binary_sensor + 1 sensor + 2
button + 1 select):
  - binary_sensor.rc_safety_smoke_detected
  - binary_sensor.rc_safety_co_detected
  - binary_sensor.rc_safety_gas_detected
  - binary_sensor.rc_safety_any_alarm_active (aggregate)
  - binary_sensor.rc_safety_siren_active
  - binary_sensor.rc_safety_alarm_in_test_mode
  - binary_sensor.rc_safety_low_battery_warning (< 20 %)
  - binary_sensor.rc_safety_sensor_offline (heartbeat window)
  - sensor.rc_safety_lowest_battery_pct
  - button.rc_safety_silence_alarm
  - button.rc_safety_test_alarm
  - select.rc_safety_alarm_mode (armed | night_only | silenced |
    disabled)

4 MANDATORY §6 lifesafety interlocks documented in recipe:
  - sensor-not-offline detection via mqtt availability topic
    (a silent safety sensor is the most dangerous kind)
  - low-battery pre-warning (any sensor battery < 20 %)
  - any-alarm aggregate (single subscription point for
    downstream sirens + notifications + smart-cooking-aware
    silencing)
  - mode-aware lockout when alarm_mode=disabled suppresses
    sirens + notifications (service only)

7 automations (loud siren + phone notification / auto-unlock
deadbolts + flash all lights on CO for emergency egress /
low-battery Sunday pre-warning / sensor offline detection via
mqtt last_seen + availability topic / monthly test cycle via
button.rc_safety_test_alarm / night-only mode gate /
smart-cooking integration).

install.config_flow: true is honest because the UPSTREAM HA core
zha + zwave_js + esphome + binary_sensor + mqtt + template
integrations ALL expose a GUI flow since 2022.x / 2023.x; no
RoamCore-owned wrapper / no native integration code is shipped
— all three paths recipe over upstream ZHA / zwave_js / ESPHome
+ HA core binary_sensor / mqtt / template integrations. Tier-a
promotion outline in recipe §10 describes the bench +
config_flow + integration tests required.

DOMAIN = 'smoke_co_gas' (matches folder name 'smoke-co-gas-
sensors' with hyphens replaced by underscores, per the audit
convention); the __init__.py module docstring rephrases
'config_flow' as 'GUI flow' or 'the vendor integration's GUI
flow' to avoid the forbidden substring trap the happijac slice
was bitten by.

Tier-warnings (5): no_real_smoke_co_gas_sensor_for_integration_test
/ recipe_depends_on_user_running_zigbee_or_zwave_or_esphome_
sensor_plus_siren / optional_siren_hardware_required /
optional_zigbee_vs_zwave_vs_esphome_choice /
requires_operator_testing_alarm_cycle_before_first_use.

Adds 'safety' to docs/reference/rc-entity-naming.md allowed
subsystems (between hvac and system, mirroring 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). Adds a 'Shipped
(repo)' row to docs/mvp/features-build-status.md for Wave 3 #45
with cross-refs to Deadbolts (Wave 3 #48) + Smart automations
(Wave 3 #46) + Heated floors (Wave 3 #44) + Happijac (Wave 3
#43) + Bluetooth/Wi-Fi presence (Wave 3 #42). Adds a
supersession banner to the legacy tier-c catalog page pointing
at the new connection folder. Wires the new smoke into
scripts/check.sh directly after the heated-floors entry.

Manifest-honesty smoke: connections/smoke-co-gas-sensors/tests/
test_connection_yml.py — 7/7 PASS via bash scripts/check.sh
--core-only, including test_safety_interlocks_are_documented
defensive guard for the future tier-a promotion's hard-enforced
lifesafety-interlock asserts.

PR #49 (Wave 3 #45).
@bernardc6
bernardc6 merged commit befa522 into main Aug 3, 2026
2 checks passed
bernardc6 pushed a commit that referenced this pull request Aug 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant