Skip to content

test(f461): add live F461 2026-10-18 trace for F411/4 lights, F411/2 5s shutter, and Expose bus verification - #753

Merged
GreenGrassBlueOcean merged 1 commit into
v2-phase1-architecturefrom
test/f461-live-shutter-expose-trace
Oct 19, 2026
Merged

GreenGrassBlueOcean merged 1 commit into
v2-phase1-architecturefrom
test/f461-live-shutter-expose-trace

Conversation

@GreenGrassBlueOcean

Copy link
Copy Markdown
Contributor

Summary

Adds the 2026-10-18 live physical BTicino F461 (firmware 2.0.11 / WHO=13 model code 200 / WHO=1013 code 134, 134.15.5.0) multi-session (cmd + evt) capture and replay test suite covering the expanded physical test plant and empirical bus verification of PR #750 declarative Expose:

  • Fixture: tests/fixtures/traces/f461_live_2026-10-18/myhome_trace_F461_live_2026-10-18.json (73 evt frames in frames, 294 chronological tx / rx / result entries in rows, RFC 5737 scrubbed IP 192.0.2.92 and MAC 00:03:50:00:04:97)
  • Documentation: tests/fixtures/traces/f461_live_2026-10-18/README.md
  • Replay Suite: tests/test_f461_live_shutter_expose_trace.py

Plant Topology (2026-10-18)

Device Model Bus Address Configuration
TCP/SCS Gateway BTicino F461 — Firmware 2.0.11 (WHO=13 code 200, WHO=1013 134.15.5.0)
4-Channel Light Actuator BTicino BT-F411/4 WHERE="06", WHERE="07" Assigned to Light 1 (06) and Light 2 (07), Group #1, and General 0
2-Channel Timed Shutter Actuator BTicino BT-F411/2 WHERE="05" Configured as shutter with 5 s hardware travel cutoff
Standalone Thermostat + Actuators KW4691 + BT-F430/2 + BT-F430/4 Zone 2 Heating + Cooling standalone thermostat with 2-relay heating and 4-relay fan-coil actuators

Key Empirical Hardware Findings

1. WHO=1 Physical F411/4 Lights (WHERE="06", "07"), Group #1 Dim 15 & General 0 (run1_lights_group_and_general)

  • Switching either 06 or 07 ON causes the F411/4 / F461 to emit the individual status frame (*1*1*06## / *1*1*07##) followed immediately by the Group #1 aggregate status frame *#1*#1*15*1## (at least one light in Group #1 is ON), and *#1*#1*15*0## when all members of Group #1 are OFF.
  • Polling Group #1 (*#1*#1##) returns both individual point states (['*1*0*06##', '*1*0*07##']).
  • Group #1 commands (*1*1*#1##, *1*0*#1##) emit individual point status frames for both 06 and 07 (*1*1*06##, *1*1*07##) plus *#1*#1*15*1## / *#1*#1*15*0##.
  • General 0 commands (*1*1*0##, *1*0*0##) physically switch both F411/4 channels (06 and 07) and emit *1*1*0## + *#1*#1*15*1## on evt without individual point frames; subsequent point resync polls (*#1*06##, *#1*07##) confirm both relays switched.

2. WHO=2 Physical F411/2 5-Second Timed Shutter (WHERE="05") (run2_shutter_05_travel_and_reversal)

  • Raising the shutter (*2*1*05##) emits a 4-frame sequence on evt:
    ['*2*1000#0*05##', '*2*0*05##', '*2*1000#1*05##', '*2*1*05##'] (gateway pre-move STOP command translation, actuator STOP confirmation, UP command translation, and actuator UP confirmation).
  • Stopping after 2.0 s (*2*0*05##) emits ['*2*1000#0*05##', '*2*0*05##'].
  • Mid-flight reversal (*2*1*05## $\rightarrow$ 1.5 s $\rightarrow$ *2*2*05##) emits ['*2*1000#0*05##', '*2*0*05##', '*2*1000#2*05##', '*2*2*05##'], followed 5.0 s later (dt = 6.22 s total) by the physical F411/2 actuator's spontaneous hardware end-of-travel *2*0*05## frame on evt.

3. Live F461 Verification of PR #750 Declarative Expose (run4_expose_virtual_bus_verification)

  • WHO=2 Virtual Cover (WHERE="25"): Sending s:*2*1*25##, s:*2*2*25##, or s:*2*0*25## for an unpopulated virtual cover immediately broadcasts ['*2*1000#0*25##', '*2*1000#1*25##'], ['*2*1000#0*25##', '*2*1000#2*25##'], and ['*2*1000#0*25##'] on the event monitor session before returning NACK (~0.55 s) on the command session. Replaying these exact evt bursts through ExposeManager confirms that _pre_move_stop_guard and _tx_echo_guard absorb both frames without triggering self-oscillating cover.stop_cover / cover.open_cover calls.
  • WHO=1 Virtual Light (WHERE="08" vs Populated "06"): Populated 06 ACKs in ~215 ms and echoes *1*1*06## / *1*0*06## on evt. Unpopulated 08 transmits on the 2-wire SCS bus and returns NACK after 2.06 s on *1*1*08## / *1*0*08## / *1*5*08## (no retry when marked is_exposed), whereas Dimension #1 write *#1*08*#1*150*0## is ACKed in 126 ms.
  • WHO=4 Virtual Temperature Probe: bt_termo on F461 parses *#4*W*0*TTTT## (without #0) as a Dimension 0 read request (*#4*2*0*0999## returns Zone 2's actual measured temperature *#4*2*0*0249##; unpopulated 50/000/102 time out after 2.1 s with NACK), whereas OWNHeatingCommand.write_temperature("50", 21.5) (*#4*50*#0*0215##, with #0 on a 2-digit probe address) is ACKed in 155 ms.
  • WHO=13 Bus Clock & WHO=18 Virtual Energy Meter (WHERE="51"): WHO=13 clock queries (0, 1, 22) and #0 writes (*#13**#0*...##) ACK and echo on evt; bt_energy ACKs *#18*51*113*450##, *#18*51*51*12345##, *#18*51*54*320##, *#18*51*#1200#1*1##, *#18*51*#1200#1*0##, and *#18*51*113## in ~140–200 ms.

Verification

  • pytest tests/test_f461_live_shutter_expose_trace.py tests/test_device_health_corpus.py tests/test_trace_oracle_validation.py
  • ruff check custom_components tests scripts
  • scripts/verify_ha_standards.py & scripts/sync_documentation.py --check

@codecov-commenter

Copy link
Copy Markdown

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@GreenGrassBlueOcean
GreenGrassBlueOcean merged commit 0f7ae38 into v2-phase1-architecture Oct 19, 2026
16 checks passed
@GreenGrassBlueOcean
GreenGrassBlueOcean deleted the test/f461-live-shutter-expose-trace branch October 19, 2026 08:15
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.

2 participants