diff --git a/tests/fixtures/traces/f461_actuators_live_2026-10-25/README.md b/tests/fixtures/traces/f461_actuators_live_2026-10-25/README.md new file mode 100644 index 00000000..c60e61e4 --- /dev/null +++ b/tests/fixtures/traces/f461_actuators_live_2026-10-25/README.md @@ -0,0 +1,115 @@ +# Live capture: BTicino F461 (firmware 2.0.11), 2026-10-25, actuator status at startup and valve switching on zone 2 + +Every frame the physical F461 gateway put on its event session on 2026-10-25 between 08:31:43 and 08:35:57 UTC +while the actuator-switching capture asked for in [review 5642758778](https://github.com/OpenWebNet-HA/MyHOME/pull/792#pullrequestreview-5642758778) +of MyHOME #792 was run: a local Home Assistant running the integration at the head of #792 (`0e44bcd7`, PyPI OWNd +pin) was restarted with an event-only listener on the bus; its startup sweep of the Living Now KW4691 standalone +thermostat at zone 2 was followed by the all-zones actuator request `*#4*#0*20##` that #792 adds, answered by both +actuators within 0.13 s; then `climate.set_temperature` 26.0 made the heating valve (actuator 1) report itself on +2.2 s after the setpoint echo, and `climate.set_temperature` 23.5 made it report itself off 2.1 s after the echo. +The fan coil (actuator 2) sent nothing but its startup reply. Nothing is synthetic except the gateway's MAC and +LAN address in the `gateway` block (no WHO 13 frame was exchanged); the HMAC handshakes are not included. Recorded +with OWNd master (`OWNEventSession`). + +The same plant's earlier captures are `tests/fixtures/traces/f461_live_2026-10-15/`, `f461_live_2026-10-18/`, +`f461_live_2026-10-23/` (run 6 holds the previous `*#4*2#1*20*0##` / `*#4*2#2*20*5##` pair, 2.2 s after a zone +poll, and the plant table in full), `f461_live_2026-10-24/` and `f461_presets_live_2026-10-24/` (both hold a valve +off report 3 - 43 s after a Home Assistant write; none holds the valve switching on). + +## Plant + +| Item | Value | +|---|---| +| Gateway | F461, firmware 2.0.11 (`*#13**16*2*0*11##`), kernel 5.10.35, distribution 2.26.4, WHO 13 device type `200`, WHO 1013 object model `134.15.5.0`, HMAC SHA-256 on both sessions (identified in `f461_live_2026-10-23`) | +| Climate | Living Now KW4691 standalone thermostat at zone 2 with a BT-F430/2 heating valve (actuator 1) and a BT-F430/4 fan coil (actuator 2); heating season; no central unit; zone 2 is the only WHO 4 device; measured 24.0 throughout | +| Home Assistant | a local instance with the integration at #792's head (`0e44bcd7`) and the PyPI OWNd pin, started 12 s before the first row; `climate.climate_zone_2` = zone 2 (`heat` + `cool`, standalone); every request in the archive is its own, taken from its debug log (not included) | +| Cover | the BT-F411/2 timed shutter `05` answers Home Assistant's post-discovery poll `*#2*05##` (the first row); lights 06 / 07 / 09 are not involved | + +## File format: `myhome_trace_F461_actuators_live_2026-10-25.json` + +Standard `MyHOME` derived trace archive, in the layout of `f461_presets_live_2026-10-24`: + +- `capture` and `gateway`: metadata with the RFC 5737 documentation IP `192.0.2.92` and the synthetic MAC + `00:03:50:00:10:25` (the gateway of `f461_live_2026-10-23` / `-24`, a new synthetic MAC for this capture). + `capture.listener` is the event-only listener (`evt.jsonl`, started 08:31:36.5 UTC for 3600 s) and how Home + Assistant's log was placed on its clock; `capture.runs` lists each run with its UTC window, `t_offset`, purpose + and `home_assistant_requests` (the frames Home Assistant sent in it). There is no probe command session in this + capture, so there are no `probe_segments`. `capture.home_assistant_entity_states` holds the climate entity's + service calls and state changes as recorded from Home Assistant's event bus for the first write (UTC wall clock, + `hvac_action` and the `actuators` attribute of #792); the harness's first restore call (08:33:59 UTC) was dropped + by Home Assistant (the websocket message reused an id, so no service ran and nothing reached the bus) and its + record is listed with that note; the restore that reached the bus went through the REST API at 08:35:55 UTC and + its state change (idle at 08:35:57.464 UTC) was read back, not recorded, so it is not listed. +- `frames`: the 20 event-session `rx` frames (`timestamp`, `direction: "rx"`, `raw`, `run`, `session: "evt"`), + replayed by `test_device_health_corpus.py` and parsed by `test_trace_oracle_validation.py` (tier 4). +- `rows`: the 51 session-log entries in capture order: + +| `dir` | Meaning | Fields | +|---|---|---| +| `tx` | frame Home Assistant wrote on its command session | `frame`, `is_status_request` (how OWNd classifies it), `source: "home_assistant"`, `t_estimated: true` | +| `rx` | frame read; `session: "cmd"` for the replies and the closing `*#*1##` (from Home Assistant's log, `source` / `t_estimated` as above), `session: "evt"` for the listener | `frame`; event rows also carry `ownd_class` and `ownd_log`, what OWNd master made of the frame at capture time. Unlike the probe captures, the command-session replies sit at the time the log collected each one (the F461 delivers them one by one), between the request and its ACK | +| `result` | what the command session returned for the `tx` | `ack` (always true here), `reply_time_s`, `replies`, `events_after` (only the event-session frames that arrived while the request was pending, `tx.t <= t <= result.t`), `utc`, `note` on every request (what it established) | + +Sessions and timing: the listener's `t` is the archive's axis, shifted so that `t = 0` is the first row (Home +Assistant's `*#2*05##`, whose reply is the listener's first frame). Home Assistant's debug log (local clock, UTC + +2 h, millisecond resolution) was placed on that axis through the 14 frames both logs hold (log seconds - listener +`t` = 36.544 - 36.547 s), so every `tx` / command-session `rx` / `result` row carries `t_estimated: true`: `tx.t` is +when the worker handed the frame to the session ("unqueued"), `result.t` the ACK ("successfully sent"), each +reply the moment the log collected it. The two setpoint writes opened a new command session first (the previous +one had been closed idle 15 s after the startup); their `reply_time_s` includes that HMAC handshake (24 - 27 ms). +`capture.runs[].t_offset` gives each run's first row. `step` is the request in flight. + +## The runs + +| `run` | UTC | What it was | +|---|---|---| +| `run1_startup_sweep_and_actuator_request` | 08:31:43-08:31:48 | Home Assistant's startup, 12 s after the climate entity was added: `*#2*05##` (cover 05 stopped), `*#4*2##` (`0`, `12` = 23.5, `*4*1*2##`, `14` = 23.5, `13` in 1.31 s), `*#4*2*60##` (34 %, 124 ms), `*#4*2*19##` (`*#4*2*19*5*0##`, 103 ms), then `*#4*#0*20##` 0.75 s later: `*#4*2#2*20*5##` at +88 ms, `*#4*2#1*20*0##` at +128 ms, ACK at +2.13 s; the command session was closed idle 15 s later | +| `run2_setpoint_26_0_valve_on` | 08:32:59-08:33:02 | `climate.set_temperature` 26.0 from 23.5 (measured 24.0): `*#4*2*#14*0260*3##` ACKed in 90 ms with no reply, echoed 26 ms after the ACK as `*#4*2*12*0260*3##`, `*4*1*2##`, `*#4*2*0*0240##`; 2.2 s after the echo `*#4*2#1*#20*1##`, then `*#4*2#1*20*1##` 37 ms later | +| `run3_restore_23_5_valve_off` | 08:35:55-08:35:57 | `climate.set_temperature` 23.5: `*#4*2*#14*0235*3##` ACKed in 104 ms with no reply, echoed 50 ms after the ACK as `*#4*2*12*0235*3##`, `*4*1*2##`, `*#4*2*0*0240##`; 2.1 s after the echo `*#4*2#1*#20*0##`, then `*#4*2#1*20*0##` 3 ms later; the listener saw nothing else until it was stopped at 08:37 UTC | + +Home Assistant's requests before the listener started (`*#1*0##`, `*#2*0##`, the `*#4*0##` and `*#16*0*5##` +NACKs, the WHO 18 meter reads) are not in the archive. + +## What the plant established (each row has its frames in the archive) + +* **The all-zones actuator request is answered by both actuators within 0.2 s.** `*#4*#0*20##`, sent 0.75 s + after the startup sweep's last ACK (2.4 s after `*#4*2##` went out), was answered on both sessions by + `*#4*2#2*20*5##` (the fan coil, off) at +88 ms and `*#4*2#1*20*0##` (the valve, off) at +128 ms; the ACK came + 2.13 s after the request, 2.0 s after the last reply (the gateway closes the all-zones batch on a timeout, as the + MyHomeServer1's 43-actuator reply of `myhomeserver1_live_2026-10-24` did not). With #792 the entity showed + `hvac_action: idle` and `actuators: {"1": "off", "2": "off"}` 12.1 s after it was added; on the previous build + the first dimension 20 frame after a start was the F461's periodic broadcast, 56 min later (not in the archive). +* **A setpoint write above the measured temperature switches the valve on 2.2 s after the echo.** + `*#4*2*#14*0260*3##` (ACK 90 ms, no reply) was echoed as `*#4*2*12*0260*3##`, `*4*1*2##`, `*#4*2*0*0240##` (no + dimension 14 frame, as every dimension 14 write of `f461_live_2026-10-24`); 2.203 s after the echo the valve + reported itself on, first in the command form `*#4*2#1*#20*1##` and 37 ms later in the status form + `*#4*2#1*20*1##`. The same 2.2 s separated the setpoint echo and the valve report on the old build the evening + before, so the delay is the thermostat's, not the integration's. +* **The restore switches it off 2.1 s after the echo.** `*#4*2*#14*0235*3##` (ACK 104 ms) was echoed the same + way with 23.5; 2.126 s later `*#4*2#1*#20*0##`, then `*#4*2#1*20*0##` 3 ms later. +* **The fan coil stays 5 / off.** Actuator 2's only frame is the startup reply `*#4*2#2*20*5##`; `*#4*2*19*5*0##` + (cooling fan coil off, heating valve off) says the fan coil is the cooling side. The valve's two switches are the + only dimension 20 frames outside the startup reply. +* **The `#20` command form.** Each spontaneous switch arrives twice: `*#4*2#1*#20*V##` (the dimension written as + `#20`, the form a write would use) 3 - 37 ms before `*#4*2#1*20*V##`; the startup reply has no command form. + The pinned OWNd parses the command form as `OWNHeatingCommand` with no zone, so the integration logs it as + unsupported and the entity acts on the status form only (no OWNd change decodes the `#20` write-form + echo yet; the tests accept an event decoding as well). +* **Entity replay (base branch, pinned OWNd).** Fed the event frames, the climate entity shows `hvac_action` + `None` until `*#4*2*19*5*0##`, then `idle` through both startup actuator replies, `heating` on `*#4*2#1*20*1##` + and `idle` on `*#4*2#1*20*0##`; the setpoint follows the dimension 12 echoes 23.5 -> 26.0 -> 23.5 in `heat`; + `fan_coil_cooling: true`, `fan_mode: auto`, `running_fan_speed: off`, humidity 34 %. Pinned in the tests; the + `actuators` attribute is asserted only when the entity exposes it (#792). +* **Timings.** `*#4*2##` 1.314 s, `*#4*2*60##` 124 ms, `*#4*2*19##` 103 ms, the two writes 90 / 104 ms including + the session handshake; every reply reached the listener 1 - 3 ms before Home Assistant's log collected it. + +## What this capture backs + +| Pull request / issue | Frames in this archive | +|---|---| +| MyHOME #792 (actuator status request after the startup sweep, `hvac_action` and `actuators` from dimension 20; review 5642758778 asked for this capture) | run 1: `*#4*#0*20##` -> `*#4*2#2*20*5##`, `*#4*2#1*20*0##` within 0.13 s; runs 2 / 3: `*#4*2#1*20*1##` 2.2 s after `*#4*2*12*0260*3##`, `*#4*2#1*20*0##` 2.1 s after `*#4*2*12*0235*3##`; `capture.home_assistant_entity_states` | +| MyHOME #791 (the setpoint in force is dimension 12; merged) | the two write echoes carry dimension 12 and the season frame, no dimension 14 frame | +| OpenWebNet-HA/OWNd#140 (`actuators_status` builder); the `#20` write-form echoes have no OWNd decoder yet | `*#4*#0*20##` sent by the integration (`is_status_request: false`); `*#4*2#1*#20*1##` / `*#4*2#1*#20*0##` parsed as commands by the pinned OWNd | +| own-firmware-oracle#60 (`*#4*#0*20##` forwarding matrix) | the physical F461's reply order (fan coil first) and the 2.13 s ACK | + +Tests: `tests/test_f461_actuators_live_2026_10_25_trace.py`. diff --git a/tests/fixtures/traces/f461_actuators_live_2026-10-25/myhome_trace_F461_actuators_live_2026-10-25.json b/tests/fixtures/traces/f461_actuators_live_2026-10-25/myhome_trace_F461_actuators_live_2026-10-25.json new file mode 100644 index 00000000..ad0d4aae --- /dev/null +++ b/tests/fixtures/traces/f461_actuators_live_2026-10-25/myhome_trace_F461_actuators_live_2026-10-25.json @@ -0,0 +1,846 @@ +{ + "capture": { + "kind": "derived_trace_archive", + "started_at": "2026-10-25T08:31:43+00:00", + "notes": "Live BTicino F461 (firmware 2.0.11 / WHO 13 device type 200 / WHO 1013 134.15.5.0) WHO 4 capture of 2026-10-25, 08:31-08:36 UTC, on the physical test plant's Living Now KW4691 standalone thermostat at Zone 2 (BT-F430/2 heating valve as actuator 1, BT-F430/4 fan coil as actuator 2, heating season, no central unit), recorded with OWNd master. Purpose: the actuator-switching capture asked for in review 5642758778 of MyHOME pull request 792 (actuator status at startup and hvac_action from dimension 20): a local Home Assistant running the integration at the head of pull request 792 (0e44bcd7, PyPI OWNd pin) was restarted with an event-only listener on the bus; its startup sweep (*#4*2##, *#4*2*60##, *#4*2*19##) was followed by the all-zones actuator request *#4*#0*20##, answered by both actuators within 0.13 s; then climate.set_temperature 26.0 (*#4*2*#14*0260*3##) made the heating valve report itself on 2.2 s after the echo (*#4*2#1*#20*1##, then *#4*2#1*20*1##), and climate.set_temperature 23.5 made it report itself off 2.2 s after the echo (*#4*2#1*#20*0##, *#4*2#1*20*0##); the fan coil (actuator 2) sent nothing but its startup reply *#4*2#2*20*5##. Sessions: one event-only listener (evt.jsonl, started 08:31:36.5 UTC for 3600 s, stopped at 08:37 UTC); no probe command session: every request is Home Assistant's, on its own command session, taken from its debug log (not included), hence source = home_assistant and t_estimated = true on every tx / command-session rx / result row: tx.t is when the worker handed the frame to the session, result.t the ACK, command-session rx rows sit at the time the log collected each reply (the F461 delivers them one by one), and the log's local clock was placed on the listener's axis through the 14 frames both logs hold (spread 3 ms). The two setpoint writes opened a new command session first (the previous one had been closed idle); their reply_time_s includes that handshake (24 - 27 ms). Timing: t is one monotonic axis over the three runs (capture.runs[].t_offset is each run's first row; t = 0 is Home Assistant's *#2*05## cover poll, whose reply is the listener's first frame); result.events_after holds only the event-session frames that arrived while the request was pending (tx.t <= t <= result.t). capture.home_assistant_entity_states lists the climate entity's service calls and state changes recorded from Home Assistant's event bus (UTC wall clock) for the first write; the restore was requested over the REST API and its state change (idle at 08:35:57.464 UTC) was read back, not recorded, so it is not listed. The listener's frames after 08:35:57 UTC (none until it was stopped at 08:37) and Home Assistant's requests before the listener started (*#1*0##, *#2*0##, the *#4*0## and *#16*0*5## NACKs, the WHO 18 meter reads) are not included.", + "window": { + "first": "2026-10-25T08:31:43+00:00", + "last": "2026-10-25T08:35:57+00:00", + "frames": 20, + "rows": 51 + }, + "listener": { + "file": "evt.jsonl", + "started_utc": "08:31:36.5", + "duration_s": 3600, + "stopped_utc": "08:37", + "home_assistant_log_alignment": "listener t = Home Assistant log seconds (local, UTC + 2 h) - 36.546, checked on the 14 frames both logs hold (36.544 - 36.547)" + }, + "runs": [ + { + "run": "run1_startup_sweep_and_actuator_request", + "listener": "evt.jsonl", + "utc": "08:31:43-08:31:48", + "t_offset": 0.0, + "rows": 35, + "frames": 10, + "home_assistant_requests": [ + "*#2*05##", + "*#4*2##", + "*#4*2*60##", + "*#4*2*19##", + "*#4*#0*20##" + ], + "purpose": "Home Assistant's startup, 12.1 s after the climate entity was added: the cover 05 post-discovery poll, *#4*2## (0, 12 = 23.5, *4*1*2##, 14 = 23.5, 13 in 1.31 s), *#4*2*60## (34 %), *#4*2*19## (*#4*2*19*5*0##: cooling fan coil off, heating valve off), then *#4*#0*20##, answered by the fan coil (*#4*2#2*20*5##, +88 ms) and the valve (*#4*2#1*20*0##, +128 ms) and ACKed 2.13 s after it was sent; the command session was closed idle 15 s later" + }, + { + "run": "run2_setpoint_26_0_valve_on", + "listener": "evt.jsonl", + "utc": "08:32:59-08:33:02", + "t_offset": 76.431, + "rows": 8, + "frames": 5, + "home_assistant_requests": [ + "*#4*2*#14*0260*3##" + ], + "purpose": "climate.set_temperature 26.0 from 23.5 (measured 24.0): *#4*2*#14*0260*3## ACKed in 90 ms with no reply, echoed on the event session as *#4*2*12*0260*3##, *4*1*2##, *#4*2*0*0240## 26 ms after the ACK (no dimension 14 frame); 2.2 s after the echo the heating valve reported itself on, first as *#4*2#1*#20*1## then 37 ms later as *#4*2#1*20*1##; the fan coil sent nothing" + }, + { + "run": "run3_restore_23_5_valve_off", + "listener": "evt.jsonl", + "utc": "08:35:55-08:35:57", + "t_offset": 251.82, + "rows": 8, + "frames": 5, + "home_assistant_requests": [ + "*#4*2*#14*0235*3##" + ], + "purpose": "climate.set_temperature 23.5 (restore): *#4*2*#14*0235*3## ACKed in 104 ms with no reply, echoed as *#4*2*12*0235*3##, *4*1*2##, *#4*2*0*0240## 50 ms after the ACK; 2.1 s after the echo the valve reported itself off, *#4*2#1*#20*0## then *#4*2#1*20*0## 3 ms later" + } + ], + "home_assistant_entity_states": [ + { + "utc": "08:32:59.787", + "kind": "service_call", + "service": "climate.set_temperature", + "temperature": 26.0 + }, + { + "utc": "08:32:59.910", + "kind": "state", + "last_updated_utc": "08:32:59.908", + "hvac_mode": "heat", + "hvac_action": "idle", + "actuators": { + "1": "off", + "2": "off" + }, + "temperature": 26.0, + "local_target": 26.0, + "fan": "off" + }, + { + "utc": "08:33:02.150", + "kind": "state", + "last_updated_utc": "08:33:02.148", + "hvac_mode": "heat", + "hvac_action": "heating", + "actuators": { + "1": "on", + "2": "off" + }, + "temperature": 26.0, + "local_target": 26.0, + "fan": "off" + }, + { + "utc": "08:33:59.788", + "kind": "service_call", + "service": "climate.set_temperature", + "temperature": 23.5, + "note": "not delivered: this row is the harness's record of the websocket call it sent; it reused a message id and Home Assistant dropped the message, so no service ran, no state changed and nothing reached the gateway or the bus. The restore reached the bus through a REST call at 08:35:55 UTC (run 3), whose state change was read back (hvac_action idle, last_updated 08:35:57.464 UTC), not recorded" + } + ] + }, + "gateway": { + "model": "F461", + "manufacturer": "BTicino", + "firmware": "2.0.11", + "kernel": "5.10.35", + "distribution": "2.26.4", + "ip": "192.0.2.92", + "mac": "00:03:50:00:10:25", + "identification": { + "model": "F461", + "who13_code": "200", + "who13_model_name": "F461", + "who1013_code": "134" + } + }, + "frames": [ + { + "timestamp": 0.07, + "direction": "rx", + "raw": "*2*0*05##", + "run": "run1_startup_sweep_and_actuator_request", + "session": "evt" + }, + { + "timestamp": 0.711, + "direction": "rx", + "raw": "*#4*2*0*0240##", + "run": "run1_startup_sweep_and_actuator_request", + "session": "evt" + }, + { + "timestamp": 1.017, + "direction": "rx", + "raw": "*#4*2*12*0235*3##", + "run": "run1_startup_sweep_and_actuator_request", + "session": "evt" + }, + { + "timestamp": 1.018, + "direction": "rx", + "raw": "*4*1*2##", + "run": "run1_startup_sweep_and_actuator_request", + "session": "evt" + }, + { + "timestamp": 1.344, + "direction": "rx", + "raw": "*#4*2*14*0235*3##", + "run": "run1_startup_sweep_and_actuator_request", + "session": "evt" + }, + { + "timestamp": 1.437, + "direction": "rx", + "raw": "*#4*2*13*00##", + "run": "run1_startup_sweep_and_actuator_request", + "session": "evt" + }, + { + "timestamp": 1.613, + "direction": "rx", + "raw": "*#4*2*60*34##", + "run": "run1_startup_sweep_and_actuator_request", + "session": "evt" + }, + { + "timestamp": 1.766, + "direction": "rx", + "raw": "*#4*2*19*5*0##", + "run": "run1_startup_sweep_and_actuator_request", + "session": "evt" + }, + { + "timestamp": 2.613, + "direction": "rx", + "raw": "*#4*2#2*20*5##", + "run": "run1_startup_sweep_and_actuator_request", + "session": "evt" + }, + { + "timestamp": 2.653, + "direction": "rx", + "raw": "*#4*2#1*20*0##", + "run": "run1_startup_sweep_and_actuator_request", + "session": "evt" + }, + { + "timestamp": 76.547, + "direction": "rx", + "raw": "*#4*2*12*0260*3##", + "run": "run2_setpoint_26_0_valve_on", + "session": "evt" + }, + { + "timestamp": 76.549, + "direction": "rx", + "raw": "*4*1*2##", + "run": "run2_setpoint_26_0_valve_on", + "session": "evt" + }, + { + "timestamp": 76.611, + "direction": "rx", + "raw": "*#4*2*0*0240##", + "run": "run2_setpoint_26_0_valve_on", + "session": "evt" + }, + { + "timestamp": 78.75, + "direction": "rx", + "raw": "*#4*2#1*#20*1##", + "run": "run2_setpoint_26_0_valve_on", + "session": "evt" + }, + { + "timestamp": 78.787, + "direction": "rx", + "raw": "*#4*2#1*20*1##", + "run": "run2_setpoint_26_0_valve_on", + "session": "evt" + }, + { + "timestamp": 251.974, + "direction": "rx", + "raw": "*#4*2*12*0235*3##", + "run": "run3_restore_23_5_valve_off", + "session": "evt" + }, + { + "timestamp": 251.976, + "direction": "rx", + "raw": "*4*1*2##", + "run": "run3_restore_23_5_valve_off", + "session": "evt" + }, + { + "timestamp": 252.03, + "direction": "rx", + "raw": "*#4*2*0*0240##", + "run": "run3_restore_23_5_valve_off", + "session": "evt" + }, + { + "timestamp": 254.1, + "direction": "rx", + "raw": "*#4*2#1*#20*0##", + "run": "run3_restore_23_5_valve_off", + "session": "evt" + }, + { + "timestamp": 254.103, + "direction": "rx", + "raw": "*#4*2#1*20*0##", + "run": "run3_restore_23_5_valve_off", + "session": "evt" + } + ], + "rows": [ + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 0.0, + "t_estimated": true, + "source": "home_assistant", + "step": "startup_sweep", + "dir": "tx", + "session": "cmd", + "frame": "*#2*05##", + "is_status_request": true + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 0.07, + "step": "startup_sweep", + "dir": "rx", + "session": "evt", + "frame": "*2*0*05##", + "ownd_class": "OWNAutomationEvent", + "ownd_log": "Cover 05 stopped." + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 0.071, + "t_estimated": true, + "source": "home_assistant", + "step": "startup_sweep", + "dir": "rx", + "session": "cmd", + "frame": "*2*0*05##" + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 0.074, + "t_estimated": true, + "source": "home_assistant", + "step": "startup_sweep", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 0.074, + "t_estimated": true, + "source": "home_assistant", + "utc": "08:31:43", + "step": "startup_sweep", + "dir": "result", + "frame": "*#2*05##", + "ack": true, + "reply_time_s": 0.074, + "replies": [ + "*2*0*05##" + ], + "events_after": [ + "*2*0*05##" + ], + "note": "cover_05_post_discovery_poll_stopped" + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 0.126, + "t_estimated": true, + "source": "home_assistant", + "step": "startup_sweep", + "dir": "tx", + "session": "cmd", + "frame": "*#4*2##", + "is_status_request": true + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 0.711, + "step": "startup_sweep", + "dir": "rx", + "session": "evt", + "frame": "*#4*2*0*0240##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 2's main sensor is reporting a temperature of 24.0°C." + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 0.713, + "t_estimated": true, + "source": "home_assistant", + "step": "startup_sweep", + "dir": "rx", + "session": "cmd", + "frame": "*#4*2*0*0240##" + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 1.017, + "step": "startup_sweep", + "dir": "rx", + "session": "evt", + "frame": "*#4*2*12*0235*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 2's local target temperature is set to 23.5°C." + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 1.018, + "step": "startup_sweep", + "dir": "rx", + "session": "evt", + "frame": "*4*1*2##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 2's season is heating." + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 1.019, + "t_estimated": true, + "source": "home_assistant", + "step": "startup_sweep", + "dir": "rx", + "session": "cmd", + "frame": "*#4*2*12*0235*3##" + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 1.019, + "t_estimated": true, + "source": "home_assistant", + "step": "startup_sweep", + "dir": "rx", + "session": "cmd", + "frame": "*4*1*2##" + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 1.344, + "step": "startup_sweep", + "dir": "rx", + "session": "evt", + "frame": "*#4*2*14*0235*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 2's target temperature is set to 23.5°C." + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 1.345, + "t_estimated": true, + "source": "home_assistant", + "step": "startup_sweep", + "dir": "rx", + "session": "cmd", + "frame": "*#4*2*14*0235*3##" + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 1.437, + "step": "startup_sweep", + "dir": "rx", + "session": "evt", + "frame": "*#4*2*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 2's local offset is set to 0°C." + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 1.439, + "t_estimated": true, + "source": "home_assistant", + "step": "startup_sweep", + "dir": "rx", + "session": "cmd", + "frame": "*#4*2*13*00##" + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 1.44, + "t_estimated": true, + "source": "home_assistant", + "step": "startup_sweep", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 1.44, + "t_estimated": true, + "source": "home_assistant", + "utc": "08:31:44", + "step": "startup_sweep", + "dir": "result", + "frame": "*#4*2##", + "ack": true, + "reply_time_s": 1.314, + "replies": [ + "*#4*2*0*0240##", + "*#4*2*12*0235*3##", + "*4*1*2##", + "*#4*2*14*0235*3##", + "*#4*2*13*00##" + ], + "events_after": [ + "*#4*2*0*0240##", + "*#4*2*12*0235*3##", + "*4*1*2##", + "*#4*2*14*0235*3##", + "*#4*2*13*00##" + ], + "note": "zone_status_12_eq_14_0235_heating_order_0_12_season_14_13" + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 1.491, + "t_estimated": true, + "source": "home_assistant", + "step": "startup_sweep", + "dir": "tx", + "session": "cmd", + "frame": "*#4*2*60##", + "is_status_request": false + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 1.613, + "step": "startup_sweep", + "dir": "rx", + "session": "evt", + "frame": "*#4*2*60*34##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 2's main sensor is reporting a humidity of 34.0%." + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 1.614, + "t_estimated": true, + "source": "home_assistant", + "step": "startup_sweep", + "dir": "rx", + "session": "cmd", + "frame": "*#4*2*60*34##" + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 1.615, + "t_estimated": true, + "source": "home_assistant", + "step": "startup_sweep", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 1.615, + "t_estimated": true, + "source": "home_assistant", + "utc": "08:31:44", + "step": "startup_sweep", + "dir": "result", + "frame": "*#4*2*60##", + "ack": true, + "reply_time_s": 0.124, + "replies": [ + "*#4*2*60*34##" + ], + "events_after": [ + "*#4*2*60*34##" + ], + "note": "humidity_34" + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 1.668, + "t_estimated": true, + "source": "home_assistant", + "step": "startup_sweep", + "dir": "tx", + "session": "cmd", + "frame": "*#4*2*19##", + "is_status_request": false + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 1.766, + "step": "startup_sweep", + "dir": "rx", + "session": "evt", + "frame": "*#4*2*19*5*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 2's cooling fan is off; heating valve is off." + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 1.768, + "t_estimated": true, + "source": "home_assistant", + "step": "startup_sweep", + "dir": "rx", + "session": "cmd", + "frame": "*#4*2*19*5*0##" + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 1.771, + "t_estimated": true, + "source": "home_assistant", + "step": "startup_sweep", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 1.771, + "t_estimated": true, + "source": "home_assistant", + "utc": "08:31:45", + "step": "startup_sweep", + "dir": "result", + "frame": "*#4*2*19##", + "ack": true, + "reply_time_s": 0.103, + "replies": [ + "*#4*2*19*5*0##" + ], + "events_after": [ + "*#4*2*19*5*0##" + ], + "note": "valves_status_cooling_fan_coil_off_5_heating_valve_off_0" + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 2.525, + "t_estimated": true, + "source": "home_assistant", + "step": "startup_actuator_request", + "dir": "tx", + "session": "cmd", + "frame": "*#4*#0*20##", + "is_status_request": false + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 2.613, + "step": "startup_actuator_request", + "dir": "rx", + "session": "evt", + "frame": "*#4*2#2*20*5##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 2's fan is off." + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 2.614, + "t_estimated": true, + "source": "home_assistant", + "step": "startup_actuator_request", + "dir": "rx", + "session": "cmd", + "frame": "*#4*2#2*20*5##" + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 2.653, + "step": "startup_actuator_request", + "dir": "rx", + "session": "evt", + "frame": "*#4*2#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 2's actuator 1 is off." + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 2.654, + "t_estimated": true, + "source": "home_assistant", + "step": "startup_actuator_request", + "dir": "rx", + "session": "cmd", + "frame": "*#4*2#1*20*0##" + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 4.659, + "t_estimated": true, + "source": "home_assistant", + "step": "startup_actuator_request", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run1_startup_sweep_and_actuator_request", + "t": 4.659, + "t_estimated": true, + "source": "home_assistant", + "utc": "08:31:48", + "step": "startup_actuator_request", + "dir": "result", + "frame": "*#4*#0*20##", + "ack": true, + "reply_time_s": 2.134, + "replies": [ + "*#4*2#2*20*5##", + "*#4*2#1*20*0##" + ], + "events_after": [ + "*#4*2#2*20*5##", + "*#4*2#1*20*0##" + ], + "note": "all_zones_actuator_status_both_actuators_answer_within_0_13_s_fan_coil_first_ack_after_2_13_s" + }, + { + "run": "run2_setpoint_26_0_valve_on", + "t": 76.431, + "t_estimated": true, + "source": "home_assistant", + "step": "setpoint_write_26_0", + "dir": "tx", + "session": "cmd", + "frame": "*#4*2*#14*0260*3##", + "is_status_request": false + }, + { + "run": "run2_setpoint_26_0_valve_on", + "t": 76.521, + "t_estimated": true, + "source": "home_assistant", + "step": "setpoint_write_26_0", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_setpoint_26_0_valve_on", + "t": 76.521, + "t_estimated": true, + "source": "home_assistant", + "utc": "08:32:59", + "step": "setpoint_write_26_0", + "dir": "result", + "frame": "*#4*2*#14*0260*3##", + "ack": true, + "reply_time_s": 0.09, + "replies": [], + "events_after": [], + "note": "climate_set_temperature_26_0_no_reply_echo_12_season_0_after_ack_valve_on_2_2_s_later" + }, + { + "run": "run2_setpoint_26_0_valve_on", + "t": 76.547, + "step": "setpoint_write_26_0", + "dir": "rx", + "session": "evt", + "frame": "*#4*2*12*0260*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 2's local target temperature is set to 26.0°C." + }, + { + "run": "run2_setpoint_26_0_valve_on", + "t": 76.549, + "step": "setpoint_write_26_0", + "dir": "rx", + "session": "evt", + "frame": "*4*1*2##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 2's season is heating." + }, + { + "run": "run2_setpoint_26_0_valve_on", + "t": 76.611, + "step": "setpoint_write_26_0", + "dir": "rx", + "session": "evt", + "frame": "*#4*2*0*0240##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 2's main sensor is reporting a temperature of 24.0°C." + }, + { + "run": "run2_setpoint_26_0_valve_on", + "t": 78.75, + "step": "setpoint_write_26_0", + "dir": "rx", + "session": "evt", + "frame": "*#4*2#1*#20*1##", + "ownd_class": "OWNHeatingCommand", + "ownd_log": "*#4*2#1*#20*1##" + }, + { + "run": "run2_setpoint_26_0_valve_on", + "t": 78.787, + "step": "setpoint_write_26_0", + "dir": "rx", + "session": "evt", + "frame": "*#4*2#1*20*1##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 2's actuator 1 is on." + }, + { + "run": "run3_restore_23_5_valve_off", + "t": 251.82, + "t_estimated": true, + "source": "home_assistant", + "step": "setpoint_write_23_5", + "dir": "tx", + "session": "cmd", + "frame": "*#4*2*#14*0235*3##", + "is_status_request": false + }, + { + "run": "run3_restore_23_5_valve_off", + "t": 251.924, + "t_estimated": true, + "source": "home_assistant", + "step": "setpoint_write_23_5", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run3_restore_23_5_valve_off", + "t": 251.924, + "t_estimated": true, + "source": "home_assistant", + "utc": "08:35:55", + "step": "setpoint_write_23_5", + "dir": "result", + "frame": "*#4*2*#14*0235*3##", + "ack": true, + "reply_time_s": 0.104, + "replies": [], + "events_after": [], + "note": "climate_set_temperature_23_5_no_reply_echo_12_season_0_after_ack_valve_off_2_2_s_later" + }, + { + "run": "run3_restore_23_5_valve_off", + "t": 251.974, + "step": "setpoint_write_23_5", + "dir": "rx", + "session": "evt", + "frame": "*#4*2*12*0235*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 2's local target temperature is set to 23.5°C." + }, + { + "run": "run3_restore_23_5_valve_off", + "t": 251.976, + "step": "setpoint_write_23_5", + "dir": "rx", + "session": "evt", + "frame": "*4*1*2##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 2's season is heating." + }, + { + "run": "run3_restore_23_5_valve_off", + "t": 252.03, + "step": "setpoint_write_23_5", + "dir": "rx", + "session": "evt", + "frame": "*#4*2*0*0240##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 2's main sensor is reporting a temperature of 24.0°C." + }, + { + "run": "run3_restore_23_5_valve_off", + "t": 254.1, + "step": "setpoint_write_23_5", + "dir": "rx", + "session": "evt", + "frame": "*#4*2#1*#20*0##", + "ownd_class": "OWNHeatingCommand", + "ownd_log": "*#4*2#1*#20*0##" + }, + { + "run": "run3_restore_23_5_valve_off", + "t": 254.103, + "step": "setpoint_write_23_5", + "dir": "rx", + "session": "evt", + "frame": "*#4*2#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 2's actuator 1 is off." + } + ] +} diff --git a/tests/fixtures/traces/myhomeserver1_live_2026-10-25/README.md b/tests/fixtures/traces/myhomeserver1_live_2026-10-25/README.md new file mode 100644 index 00000000..8894e1cf --- /dev/null +++ b/tests/fixtures/traces/myhomeserver1_live_2026-10-25/README.md @@ -0,0 +1,94 @@ +# Live capture: Legrand / BTicino MyHomeServer1 (firmware 3.87.13), 2026-10-25, actuator, valve, fan-speed and humidity reads per zone + +Status reads only (no command was sent) against the physical MyHomeServer1 of `myhomeserver1_live_2026-10-24` +(a large home plant, WHO 4 zones 35-70), 2026-10-25 10:46 to 11:02 UTC, recorded with OWNd master +(`OWNCommandSession` + `OWNEventSession`, `tools/probe.py` as for the F461 captures). The purpose: the reads +behind MyHOME #792 (actuator status at startup, `hvac_action` from dimension 20) and #793 (humidity gate) on +a second gateway family, next to `f461_actuators_live_2026-10-25`: the all-zones actuator request, then for +every zone the valve status (dimension 19), the actuator status (20), the fan speed (11) and the humidity (60), +then the general humidity read and a 600 s listen. Every actuator of the plant was off at capture time. + +Two caveats that apply to every row: the firmware oracle (`own-firmware-oracle`) emulates MyHomeServer1 +**2.82.06**, this unit runs **3.87.13**; and the gateway's identity (`*#13**15##`, `*#13**27##`, `*#1013**1##`) +was not re-read here, the `gateway.identification` block repeats `myhomeserver1_live_2026-10-24`. The MAC and +LAN address in the `gateway` block are synthetic (`00:03:50:00:10:26`, `192.0.2.9`); no WHO 13 dimension 12 +frame was exchanged. + +## Plant + +| Item | Value | +|---|---| +| Gateway | MyHomeServer1, firmware 3.87.13 (`*#13**16*3*87*13##`), WHO 13 device type `200`, WHO 1013 object model `67.15.5.0`, clock time zone `999` (identified in `myhomeserver1_live_2026-10-24`) | +| Thermoregulation | WHO 4 zones 35-70: 34 zones answer (54 and 56 do not exist), every one with a valve actuator `Z#1`; five (47, 48, 57, 60, 70) also have a fan coil `Z#2` (the cooling side, `*#4*Z*19*5*0##`); zone 0 has the pumps `0#1`-`0#4`; 17 zones (39, 40, 41, 42, 43, 47, 48, 53, 55, 57, 58, 59, 60, 61, 68, 69, 70) have a humidity probe; the plant broadcasts a periodic sweep (season, dimensions 12 / 14 / 13, setpoints as dimension 7, temperatures, dimension 5, humidity) and the valves' off reports | +| Lighting | WHO 1 traffic of the house during the capture (168 frames in the listen); not involved | + +## File format: `myhome_trace_MyHomeServer1_live_2026-10-25.json` + +Standard `MyHOME` derived trace archive, the same layout as `myhomeserver1_live_2026-10-24` (see +`f461_live_2026-10-23` for the field table): `capture` (with `runs` and `probe`), `gateway`, `frames` (677 +event-session `rx` frames) and `rows` (1224 `tx` / `rx` / `result` entries; `result.replies` are the frames +collected on the command session, `result.events_after` only the event-session frames that arrived while the +request was pending, `tx.t <= t <= result.t`). Command-session `rx` rows carry `t_estimated: true` and sit at +their request's `t` (the session hands the replies over as a batch with the ACK / NACK); `tx.t` is +reconstructed from the probe record (record time - the 1.2 s pause - `reply_time_s`) and `result.t` = `tx.t` + +`reply_time_s`; `t` is one monotonic axis over the four runs (`capture.runs[].t_offset` gives each run's first +row; `t = 0` is the `*#13**16##` request). `step` is the request in flight (`zone_Z` for the per-zone reads, +`listen` in run 4). + +## The runs + +| `run` | UTC | What it was | +|---|---|---| +| `run1_identify_and_all_zones_actuators` | 10:46:46-10:46:50 | `*#13**16##` (3.87.13, 27 ms), `*#13**0##` (20 ms, echoed on the event session), `*#4*#0*20##` | +| `run2_per_zone_reads_19_20_11_60` | 10:46:52-10:52:53 | for each zone 35..70, one request at a time with a 1.2 s pause: `*#4*Z*19##`, `*#4*Z*20##`, `*#4*Z*11##`, `*#4*Z*60##` (144 requests); the house's spontaneous frames meanwhile | +| `run3_general_humidity` | 10:52:55-10:52:56 | `*#4*0*60##` | +| `run4_listen_600_s` | 10:54:02-11:02:48 | no request pending: the house's own WHO 4 and WHO 1 traffic and the 13:00 (local) clock broadcast | + +## What the plant established (each row has its frames in the archive) + +* **`*#4*#0*20##` is answered by every actuator of the plant, pumps included, and the ACK does not wait for + the burst.** ACK in 0.50 s with 8 frames collected on the command session; the event session received 47 + frames from +0.18 s to +1.91 s after the request (39 of them after the ACK), 43 distinct: 34 `Z#1` (zones + 35-70 but 54 and 56), the 5 `Z#2` fan coils at 5 (off) and `*#4*0#1*20*0##` ... `*#4*0#4*20*0##`; zones + 35-38 answered twice. Every value was 0 (valve off) or 5 (fan coil off): no actuator was on. The same 43 + frames as `myhomeserver1_live_2026-10-24` run 2. +* **Dimensions 19 and 20 per zone: ACK on the 34 zones in 0.16-0.25 s, NACK after 2.1 s on 54 and 56.** + A valve zone reads `*#4*Z*19*0*0##` and answers `*#4*Z#1*20*0##`; a fan-coil zone reads `*#4*Z*19*5*0##` + (fan coil off, valve off) and answers `*#4*Z#2*20*5##` and `*#4*Z#1*20*0##` on the event session (one of + them collected on the command session). Zones 35, 40, 42, 51 and 64 echoed their dimension 20 reply twice on the event session (for 51 and 64 both copies arrived before the ACK). +* **Dimension 11 is refused on every zone.** `*#4*Z*11##` NACKs on all 36 zones (31 of them in 2.09-2.19 s, + five between 2.85 and 5.81 s), fan-coil zones included, and no dimension 11 frame ever appears on the event session: the + fan-speed dimension is refused where a valve is the actuator, the split the F461's KW4691 showed in its + heating season (`f461_live_2026-10-15`, `probe_fancoil`: NACK in heating, ACK in cooling). +* **Humidity is answered only where a probe exists.** `*#4*Z*60##` ACKs on the 17 zones with a probe in + 0.19-0.29 s (39: 47 %, 40: 48, 41: 43, 42: 51, 43: 55, 47: 58, 48: 53, 53: 60, 55: 49, 57: 51, 58: 57, 59: 66, + 60: 54, 61: 52, 68: 55, 69: 52, 70: 68) and NACKs after 2.1-3.1 s on the other 19; `*#4*0*60##` is ACKed in 0.66 s + and answered by the same 17 zones (8 collected on the command session, the last on the event session 0.3 s after + the ACK) with the same values six minutes later, zones 39, 42 and 61 one point apart. The listen's + humidity pushes come from the same 17 zones. +* **The house's own traffic.** Nine spontaneous valve off reports, each `*#4*Z#1*#20*0##` (the dimension + written as `#20`, parsed as `OWNHeatingCommand` with no zone by the pinned OWNd; no OWNd decoder yet) + followed within 50 ms by `*#4*Z#1*20*0##`, each about 2 s after the zone's pump call (`*4*4002#Z*0#N##` then + `*4*4002*Z##`: zone 35 calls pump 1, 46 and 43 pump 2, 53, 55, 70 and 51 pump 3, 64 and 68 pump 4). The + listen holds the periodic sweep (`*4*1*Z##` and dimensions 12 / 14 / 13 for each of the 34 zones, 47 + dimension 7 setpoints, 82 temperatures, 17 dimension 5 frames, 17 humidity pushes), 168 WHO 1 frames and + the 13:00 local clock broadcast (`*#13**#1*00*25*10*2026##`, `*#13**#0*13*00*00*##`). No actuator switched + on during the capture. +* **Entity replay (base branch, pinned OWNd).** Zones 35 (valve) and 47 (valve + fan coil) configured; the + burst routed as the platform routes it (`_zone_route_keys`): zone 35 `hvac_action: idle` with actuator 1 + off, zone 47 idle with actuators 1 and 2 off, `fan_mode: auto`, `running_fan_speed: off`; the pump frames + `0#1`-`0#4` have no route key and reach no entity (no zone 0 is created); the per-zone reads keep both + idle, give zone 47 its humidity (58 %) and the fan-coil side, zone 35 none; the listen gives both their + heating season. Pinned in the tests; the `actuators` attribute is asserted only when the entity exposes it + (#792). + +## What this capture backs + +| Pull request / issue | Frames in this archive | +|---|---| +| MyHOME #792 (actuator status request after the startup sweep, `hvac_action` and `actuators` from dimension 20; dimension 19 / 11 fan-coil side) | run 1: `*#4*#0*20##` -> 43 distinct actuator frames, all off, pumps included; run 2: `*#4*Z*19##` / `*#4*Z*20##` on 34 zones, `*#4*Z*11##` refused on all 36 | +| MyHOME #793 (humidity poll gate) | run 2 / 3: `*#4*Z*60##` ACK on 17 zones, NACK on 19; `*#4*0*60##` answers the same 17 | +| OpenWebNet-HA/OWNd#140 (`actuators_status` builder); the `#20` write-form echoes have no OWNd decoder yet | `*#4*#0*20##` sent as a status request; the nine `*#4*Z#1*#20*0##` command forms | +| own-firmware-oracle#60 (`*#4*#0*20##` forwarding matrix) | the physical MyHomeServer1's 0.50 s ACK ahead of a 1.9 s burst | + +Tests: `tests/test_myhomeserver1_live_2026_10_25_trace.py`. diff --git a/tests/fixtures/traces/myhomeserver1_live_2026-10-25/myhome_trace_MyHomeServer1_live_2026-10-25.json b/tests/fixtures/traces/myhomeserver1_live_2026-10-25/myhome_trace_MyHomeServer1_live_2026-10-25.json new file mode 100644 index 00000000..5995f6d2 --- /dev/null +++ b/tests/fixtures/traces/myhomeserver1_live_2026-10-25/myhome_trace_MyHomeServer1_live_2026-10-25.json @@ -0,0 +1,17515 @@ +{ + "capture": { + "kind": "derived_trace_archive", + "started_at": "2026-10-25T10:46:46+00:00", + "notes": "Live Legrand/BTicino MyHomeServer1 (firmware 3.87.13 / WHO 13 device type 200 / WHO 1013 67.15.5.0, identified in myhomeserver1_live_2026-10-24) WHO 4 capture of 2026-10-25, 10:46-11:02 UTC, recorded with OWNd master on the same large home plant as myhomeserver1_live_2026-10-24 (WHO 4 zones 35-70, actuators Z#1 on 34 zones, fan coils Z#2 on five, zone-0 pumps 0#1..0#4, humidity probes on 17 zones). Status reads only, no command. Purpose: the per-zone actuator, valve, fan-speed and humidity reads behind MyHOME pull request 792 (actuator status at startup, hvac_action from dimension 20) and 793 (humidity gate) on a second gateway family, next to the F461 capture f461_actuators_live_2026-10-25: *#13**16## and *#13**0##, *#4*#0*20## (the all-zones actuator request), then for every zone 35..70 *#4*Z*19##, *#4*Z*20##, *#4*Z*11## and *#4*Z*60##, then *#4*0*60##, then a 600 s listen with the house's own WHO 4 and WHO 1 traffic and the gateway clock broadcasts. Every actuator reported off (0 / fan 5) at capture time; no actuator was on. Sessions: one probe with its own command and event session (mhs1_actuators_reads.jsonl); the probe waited 1.2 s after each request and 1 s between zones. Timing: t is one monotonic axis over the four runs (capture.runs[].t_offset is each run's first row); tx.t is reconstructed from the probe record (record time - 1.2 s pause - reply_time_s) and result.t = tx.t + reply_time_s; command-session rx rows carry t_estimated = true because the session hands the replies over as a batch with the ACK / NACK, so they are placed at their request's t; result.events_after holds only the event-session frames that arrived while the request was pending (tx.t <= t <= result.t). The MAC and LAN address in the gateway block are synthetic; no WHO 13 dimension 12 frame was exchanged. The firmware oracle emulates MyHomeServer1 2.82.06; this unit runs 3.87.13.", + "window": { + "first": "2026-10-25T10:46:46+00:00", + "last": "2026-10-25T11:02:48+00:00", + "frames": 677, + "rows": 1224 + }, + "probe": { + "file": "mhs1_actuators_reads.jsonl", + "probe_wait_s": 1.2, + "pause_between_zones_s": 1.0, + "listen_s": 600 + }, + "runs": [ + { + "run": "run1_identify_and_all_zones_actuators", + "source": "mhs1_actuators_reads.jsonl", + "utc": "10:46:46-10:46:50", + "t_offset": 0.0, + "rows": 68, + "frames": 49, + "purpose": "*#13**16## (3.87.13), *#13**0## (echoed on the event session), then *#4*#0*20##: ACKed in 0.5 s with 8 replies on the command session while the event session received the whole burst (34 Z#1, 5 Z#2 fan coils at 5, the pumps 0#1..0#4; some zones twice); every actuator off" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "source": "mhs1_actuators_reads.jsonl", + "utc": "10:46:52-10:52:53", + "t_offset": 6.148, + "rows": 643, + "frames": 126, + "purpose": "for each zone 35..70, one at a time: *#4*Z*19## (ACK on 34 zones, NACK after 2.1 s on 54 and 56), *#4*Z*20## (ACK 34 / NACK 2, the five fan-coil zones answer Z#2 then Z#1), *#4*Z*11## (NACK after 2.1 s on all 36: the fan-speed dimension is refused on a valve zone, as the F461's heating-season NACK in f461_live_2026-10-15), *#4*Z*60## (ACK on the 17 zones with a humidity probe, NACK after 2.1 s on 19); the house's spontaneous frames meanwhile (valve reports *#4*Z#1*#20*0## / *#4*Z#1*20*0##, a pump call *4*4002#64*0#4##, the 12:50 clock)" + }, + { + "run": "run3_general_humidity", + "source": "mhs1_actuators_reads.jsonl", + "utc": "10:52:55-10:52:56", + "t_offset": 369.609, + "rows": 28, + "frames": 17, + "purpose": "*#4*0*60##: ACKed in 0.66 s, the 17 zones with a probe answer on both sessions (8 of them collected on the command session)" + }, + { + "run": "run4_listen_600_s", + "source": "mhs1_actuators_reads.jsonl", + "utc": "10:54:02-11:02:48", + "t_offset": 436.573, + "rows": 485, + "frames": 485, + "purpose": "600 s listen with no request pending: the house's own WHO 4 traffic (temperatures, dimension 7 setpoints, 12 / 14 / 13 and season frames of a periodic zone sweep, dimension 5, humidity), four valve off reports, WHO 1 light frames and the 13:00 clock broadcast" + } + ] + }, + "gateway": { + "model": "MyHomeServer1", + "manufacturer": "Legrand / BTicino", + "firmware": "3.87.13", + "ip": "192.0.2.9", + "mac": "00:03:50:00:10:26", + "identification": { + "model": "MyHomeServer1", + "who13_code": "200", + "who13_model_name": "MyHomeServer1", + "who1013_code": "67" + }, + "identification_note": "who13_code, who13_model_name and who1013_code from myhomeserver1_live_2026-10-24 (the same unit); this capture read dimensions 16 and 0 only", + "oracle_note": "own-firmware-oracle emulates MyHomeServer1 2.82.06; this unit runs 3.87.13" + }, + "frames": [ + { + "timestamp": 0.025, + "direction": "rx", + "raw": "*#13**16*3*87*13##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 1.245, + "direction": "rx", + "raw": "*#13**0*12*46*47*999##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 2.634, + "direction": "rx", + "raw": "*#4*47#2*20*5##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 2.652, + "direction": "rx", + "raw": "*#4*53#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 2.694, + "direction": "rx", + "raw": "*#4*39#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 2.735, + "direction": "rx", + "raw": "*#4*57#2*20*5##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 2.795, + "direction": "rx", + "raw": "*#4*35#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 2.844, + "direction": "rx", + "raw": "*#4*49#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 2.871, + "direction": "rx", + "raw": "*#4*48#2*20*5##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 2.917, + "direction": "rx", + "raw": "*#4*51#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 2.981, + "direction": "rx", + "raw": "*#4*36#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.02, + "direction": "rx", + "raw": "*#4*43#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.058, + "direction": "rx", + "raw": "*#4*40#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.083, + "direction": "rx", + "raw": "*#4*60#2*20*5##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.105, + "direction": "rx", + "raw": "*#4*47#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.138, + "direction": "rx", + "raw": "*#4*37#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.17, + "direction": "rx", + "raw": "*#4*70#2*20*5##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.216, + "direction": "rx", + "raw": "*#4*38#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.248, + "direction": "rx", + "raw": "*#4*60#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.281, + "direction": "rx", + "raw": "*#4*48#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.313, + "direction": "rx", + "raw": "*#4*61#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.335, + "direction": "rx", + "raw": "*#4*44#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.367, + "direction": "rx", + "raw": "*#4*0#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.412, + "direction": "rx", + "raw": "*#4*35#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.445, + "direction": "rx", + "raw": "*#4*41#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.477, + "direction": "rx", + "raw": "*#4*0#3*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.498, + "direction": "rx", + "raw": "*#4*64#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.549, + "direction": "rx", + "raw": "*#4*36#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.563, + "direction": "rx", + "raw": "*#4*65#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.616, + "direction": "rx", + "raw": "*#4*0#4*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.64, + "direction": "rx", + "raw": "*#4*57#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.673, + "direction": "rx", + "raw": "*#4*37#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.705, + "direction": "rx", + "raw": "*#4*52#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.738, + "direction": "rx", + "raw": "*#4*0#2*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.771, + "direction": "rx", + "raw": "*#4*70#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.809, + "direction": "rx", + "raw": "*#4*38#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.842, + "direction": "rx", + "raw": "*#4*50#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.88, + "direction": "rx", + "raw": "*#4*58#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.919, + "direction": "rx", + "raw": "*#4*68#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.959, + "direction": "rx", + "raw": "*#4*66#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 3.998, + "direction": "rx", + "raw": "*#4*55#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 4.036, + "direction": "rx", + "raw": "*#4*69#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 4.079, + "direction": "rx", + "raw": "*#4*59#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 4.12, + "direction": "rx", + "raw": "*#4*42#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 4.159, + "direction": "rx", + "raw": "*#4*67#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 4.2, + "direction": "rx", + "raw": "*#4*62#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 4.244, + "direction": "rx", + "raw": "*#4*63#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 4.3, + "direction": "rx", + "raw": "*#4*45#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 4.359, + "direction": "rx", + "raw": "*#4*46#1*20*0##", + "run": "run1_identify_and_all_zones_actuators", + "session": "evt" + }, + { + "timestamp": 6.31, + "direction": "rx", + "raw": "*#4*35*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 7.695, + "direction": "rx", + "raw": "*#4*35#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 7.733, + "direction": "rx", + "raw": "*#4*35#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 16.791, + "direction": "rx", + "raw": "*#4*36*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 18.171, + "direction": "rx", + "raw": "*#4*36#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 27.195, + "direction": "rx", + "raw": "*#4*37*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 28.575, + "direction": "rx", + "raw": "*#4*37#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 37.601, + "direction": "rx", + "raw": "*#4*38*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 38.984, + "direction": "rx", + "raw": "*#4*38#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 48.058, + "direction": "rx", + "raw": "*#4*39*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 49.435, + "direction": "rx", + "raw": "*#4*39#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 54.145, + "direction": "rx", + "raw": "*#4*39*60*47##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 55.705, + "direction": "rx", + "raw": "*4*4002#35*0#1##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 55.741, + "direction": "rx", + "raw": "*4*4002*35##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 56.545, + "direction": "rx", + "raw": "*#4*40*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 57.689, + "direction": "rx", + "raw": "*#4*35#1*#20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 57.727, + "direction": "rx", + "raw": "*#4*35#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 57.907, + "direction": "rx", + "raw": "*#4*40#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 57.951, + "direction": "rx", + "raw": "*#4*40#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 62.707, + "direction": "rx", + "raw": "*#4*40*60*48##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 65.087, + "direction": "rx", + "raw": "*#4*41*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 66.465, + "direction": "rx", + "raw": "*#4*41#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 69.275, + "direction": "rx", + "raw": "*1*1000#1*63##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 69.295, + "direction": "rx", + "raw": "*1*1*63##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 72.695, + "direction": "rx", + "raw": "*#4*41*60*43##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 75.098, + "direction": "rx", + "raw": "*#4*42*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 76.465, + "direction": "rx", + "raw": "*#4*42#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 76.531, + "direction": "rx", + "raw": "*#4*42#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 81.213, + "direction": "rx", + "raw": "*#4*42*60*51##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 83.606, + "direction": "rx", + "raw": "*#4*43*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 84.994, + "direction": "rx", + "raw": "*#4*43#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 86.974, + "direction": "rx", + "raw": "*1*1000#0*63##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 87.035, + "direction": "rx", + "raw": "*1*0*63##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 90.475, + "direction": "rx", + "raw": "*#4*43*60*55##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 92.898, + "direction": "rx", + "raw": "*#4*44*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 94.258, + "direction": "rx", + "raw": "*#4*44#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 103.287, + "direction": "rx", + "raw": "*#4*45*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 104.675, + "direction": "rx", + "raw": "*#4*45#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 105.432, + "direction": "rx", + "raw": "*4*4002#53*0#3##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 105.507, + "direction": "rx", + "raw": "*4*4002*53##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 107.454, + "direction": "rx", + "raw": "*#4*53#1*#20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 107.489, + "direction": "rx", + "raw": "*#4*53#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 115.213, + "direction": "rx", + "raw": "*#4*46*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 116.626, + "direction": "rx", + "raw": "*#4*46#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 121.958, + "direction": "rx", + "raw": "*#4*53*60*60##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 126.358, + "direction": "rx", + "raw": "*#4*47*19*5*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 127.726, + "direction": "rx", + "raw": "*#4*47#2*20*5##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 127.781, + "direction": "rx", + "raw": "*#4*47#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 132.424, + "direction": "rx", + "raw": "*#4*47*60*58##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 134.81, + "direction": "rx", + "raw": "*#4*48*19*5*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 136.202, + "direction": "rx", + "raw": "*#4*48#2*20*5##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 136.245, + "direction": "rx", + "raw": "*#4*48#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 140.956, + "direction": "rx", + "raw": "*#4*48*60*53##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 143.385, + "direction": "rx", + "raw": "*#4*49*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 144.786, + "direction": "rx", + "raw": "*#4*49#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 153.868, + "direction": "rx", + "raw": "*#4*50*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 155.275, + "direction": "rx", + "raw": "*#4*50#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 164.365, + "direction": "rx", + "raw": "*#4*51*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 165.776, + "direction": "rx", + "raw": "*#4*51#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 165.808, + "direction": "rx", + "raw": "*#4*51#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 174.887, + "direction": "rx", + "raw": "*#4*52*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 176.289, + "direction": "rx", + "raw": "*#4*52#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 185.368, + "direction": "rx", + "raw": "*#4*53*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 186.776, + "direction": "rx", + "raw": "*#4*53#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 191.566, + "direction": "rx", + "raw": "*#4*53*60*60##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 193.906, + "direction": "rx", + "raw": "*#13**#1*00*25*10*2026##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 193.914, + "direction": "rx", + "raw": "*#13**#0*12*50*00*##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 208.311, + "direction": "rx", + "raw": "*#4*55*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 209.712, + "direction": "rx", + "raw": "*#4*55#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 214.458, + "direction": "rx", + "raw": "*#4*55*60*49##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 225.676, + "direction": "rx", + "raw": "*4*4002#64*0#4##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 225.714, + "direction": "rx", + "raw": "*4*4002*64##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 227.669, + "direction": "rx", + "raw": "*#4*64#1*#20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 227.718, + "direction": "rx", + "raw": "*#4*64#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 232.127, + "direction": "rx", + "raw": "*#4*57*19*5*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 233.542, + "direction": "rx", + "raw": "*#4*57#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 233.586, + "direction": "rx", + "raw": "*#4*57#2*20*5##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 238.335, + "direction": "rx", + "raw": "*#4*57*60*51##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 240.75, + "direction": "rx", + "raw": "*#4*58*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 242.155, + "direction": "rx", + "raw": "*#4*58#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 246.93, + "direction": "rx", + "raw": "*#4*58*60*57##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 249.345, + "direction": "rx", + "raw": "*#4*59*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 250.771, + "direction": "rx", + "raw": "*#4*59#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 255.535, + "direction": "rx", + "raw": "*#4*59*60*66##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 257.946, + "direction": "rx", + "raw": "*#4*60*19*5*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 259.326, + "direction": "rx", + "raw": "*#4*60#2*20*5##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 259.39, + "direction": "rx", + "raw": "*#4*60#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 264.081, + "direction": "rx", + "raw": "*#4*60*60*54##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 266.487, + "direction": "rx", + "raw": "*#4*61*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 267.913, + "direction": "rx", + "raw": "*#4*61#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 272.676, + "direction": "rx", + "raw": "*#4*61*60*52##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 275.125, + "direction": "rx", + "raw": "*#4*62*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 276.521, + "direction": "rx", + "raw": "*#4*62#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 285.625, + "direction": "rx", + "raw": "*#4*63*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 287.056, + "direction": "rx", + "raw": "*#4*63#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 296.161, + "direction": "rx", + "raw": "*#4*64*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 297.589, + "direction": "rx", + "raw": "*#4*64#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 297.608, + "direction": "rx", + "raw": "*#4*64#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 306.68, + "direction": "rx", + "raw": "*#4*65*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 308.104, + "direction": "rx", + "raw": "*#4*65#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 317.256, + "direction": "rx", + "raw": "*#4*66*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 318.642, + "direction": "rx", + "raw": "*#4*66#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 327.719, + "direction": "rx", + "raw": "*#4*67*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 329.123, + "direction": "rx", + "raw": "*#4*67#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 332.091, + "direction": "rx", + "raw": "*4*4002#55*0#3##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 332.117, + "direction": "rx", + "raw": "*4*4002*55##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 332.166, + "direction": "rx", + "raw": "*4*4002*55##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 334.126, + "direction": "rx", + "raw": "*#4*55#1*#20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 334.128, + "direction": "rx", + "raw": "*#4*55#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 341.934, + "direction": "rx", + "raw": "*#4*68*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 343.356, + "direction": "rx", + "raw": "*#4*68#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 348.139, + "direction": "rx", + "raw": "*#4*68*60*55##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 348.392, + "direction": "rx", + "raw": "*1*1000#1*63##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 348.424, + "direction": "rx", + "raw": "*1*1*63##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 350.534, + "direction": "rx", + "raw": "*#4*69*19*0*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 351.982, + "direction": "rx", + "raw": "*#4*69#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 353.274, + "direction": "rx", + "raw": "*4*4002#68*0#4##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 353.302, + "direction": "rx", + "raw": "*4*4002*68##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 355.251, + "direction": "rx", + "raw": "*#4*68#1*#20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 355.264, + "direction": "rx", + "raw": "*#4*68#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 358.784, + "direction": "rx", + "raw": "*#4*69*60*52##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 361.223, + "direction": "rx", + "raw": "*#4*70*19*5*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 362.605, + "direction": "rx", + "raw": "*#4*70#1*20*0##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 362.653, + "direction": "rx", + "raw": "*#4*70#2*20*5##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 362.702, + "direction": "rx", + "raw": "*#4*70#2*20*5##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 367.378, + "direction": "rx", + "raw": "*#4*70*60*68##", + "run": "run2_per_zone_reads_19_20_11_60", + "session": "evt" + }, + { + "timestamp": 369.795, + "direction": "rx", + "raw": "*#4*42*60*52##", + "run": "run3_general_humidity", + "session": "evt" + }, + { + "timestamp": 369.833, + "direction": "rx", + "raw": "*#4*40*60*48##", + "run": "run3_general_humidity", + "session": "evt" + }, + { + "timestamp": 369.875, + "direction": "rx", + "raw": "*#4*47*60*58##", + "run": "run3_general_humidity", + "session": "evt" + }, + { + "timestamp": 369.923, + "direction": "rx", + "raw": "*#4*43*60*55##", + "run": "run3_general_humidity", + "session": "evt" + }, + { + "timestamp": 370.023, + "direction": "rx", + "raw": "*#4*41*60*43##", + "run": "run3_general_humidity", + "session": "evt" + }, + { + "timestamp": 370.065, + "direction": "rx", + "raw": "*#4*61*60*53##", + "run": "run3_general_humidity", + "session": "evt" + }, + { + "timestamp": 370.183, + "direction": "rx", + "raw": "*#4*48*60*53##", + "run": "run3_general_humidity", + "session": "evt" + }, + { + "timestamp": 370.233, + "direction": "rx", + "raw": "*#4*57*60*51##", + "run": "run3_general_humidity", + "session": "evt" + }, + { + "timestamp": 370.283, + "direction": "rx", + "raw": "*#4*59*60*66##", + "run": "run3_general_humidity", + "session": "evt" + }, + { + "timestamp": 370.314, + "direction": "rx", + "raw": "*#4*60*60*54##", + "run": "run3_general_humidity", + "session": "evt" + }, + { + "timestamp": 370.366, + "direction": "rx", + "raw": "*#4*70*60*68##", + "run": "run3_general_humidity", + "session": "evt" + }, + { + "timestamp": 370.409, + "direction": "rx", + "raw": "*#4*69*60*52##", + "run": "run3_general_humidity", + "session": "evt" + }, + { + "timestamp": 370.436, + "direction": "rx", + "raw": "*#4*53*60*60##", + "run": "run3_general_humidity", + "session": "evt" + }, + { + "timestamp": 370.477, + "direction": "rx", + "raw": "*#4*68*60*55##", + "run": "run3_general_humidity", + "session": "evt" + }, + { + "timestamp": 370.517, + "direction": "rx", + "raw": "*#4*55*60*49##", + "run": "run3_general_humidity", + "session": "evt" + }, + { + "timestamp": 370.541, + "direction": "rx", + "raw": "*#4*58*60*57##", + "run": "run3_general_humidity", + "session": "evt" + }, + { + "timestamp": 370.591, + "direction": "rx", + "raw": "*#4*39*60*48##", + "run": "run3_general_humidity", + "session": "evt" + }, + { + "timestamp": 436.573, + "direction": "rx", + "raw": "*#4*39*5*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 436.681, + "direction": "rx", + "raw": "*#4*40*5*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 436.793, + "direction": "rx", + "raw": "*#4*41*5*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 436.994, + "direction": "rx", + "raw": "*#4*43*5*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 437.097, + "direction": "rx", + "raw": "*#4*42*5*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 437.366, + "direction": "rx", + "raw": "*#4*47*5*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 437.503, + "direction": "rx", + "raw": "*#4*48*5*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 438.042, + "direction": "rx", + "raw": "*#4*53*5*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 438.232, + "direction": "rx", + "raw": "*#4*55*5*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 438.402, + "direction": "rx", + "raw": "*#4*57*5*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 438.49, + "direction": "rx", + "raw": "*#4*59*5*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 438.584, + "direction": "rx", + "raw": "*#4*60*5*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 438.678, + "direction": "rx", + "raw": "*#4*61*5*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 438.772, + "direction": "rx", + "raw": "*#4*58*5*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 439.361, + "direction": "rx", + "raw": "*#4*69*5*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 439.386, + "direction": "rx", + "raw": "*#4*68*5*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 439.438, + "direction": "rx", + "raw": "*#4*70*5*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 440.788, + "direction": "rx", + "raw": "*#4*35*7*1*1*0200##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 440.79, + "direction": "rx", + "raw": "*#4*35*0*0225##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 440.813, + "direction": "rx", + "raw": "*#4*36*7*1*1*0225##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 440.886, + "direction": "rx", + "raw": "*#4*36*0*0226##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 440.888, + "direction": "rx", + "raw": "*#4*37*7*1*1*0130##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 440.932, + "direction": "rx", + "raw": "*#4*37*0*0206##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 440.934, + "direction": "rx", + "raw": "*#4*38*7*1*1*0225##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 441.013, + "direction": "rx", + "raw": "*#4*39*7*1*1*0220##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 441.144, + "direction": "rx", + "raw": "*#4*39*0*0221##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 441.203, + "direction": "rx", + "raw": "*#4*40*7*1*1*0225##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 441.256, + "direction": "rx", + "raw": "*#4*40*0*0226##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 441.271, + "direction": "rx", + "raw": "*#4*41*7*1*1*0130##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 441.362, + "direction": "rx", + "raw": "*#4*38*0*0252##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 441.434, + "direction": "rx", + "raw": "*#4*41*0*0210##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 441.473, + "direction": "rx", + "raw": "*#4*45*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 441.575, + "direction": "rx", + "raw": "*#4*46*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 441.576, + "direction": "rx", + "raw": "*#4*45*0*0242##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 441.677, + "direction": "rx", + "raw": "*#4*46*0*0238##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 441.693, + "direction": "rx", + "raw": "*#4*44*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 441.795, + "direction": "rx", + "raw": "*#4*48*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 441.807, + "direction": "rx", + "raw": "*#4*49*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 441.922, + "direction": "rx", + "raw": "*#4*47*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 442.005, + "direction": "rx", + "raw": "*#4*42*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 442.095, + "direction": "rx", + "raw": "*#4*42*0*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 442.218, + "direction": "rx", + "raw": "*#4*49*0*0262##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 442.324, + "direction": "rx", + "raw": "*#4*48*0*0232##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 442.346, + "direction": "rx", + "raw": "*#4*47*0*0236##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 442.453, + "direction": "rx", + "raw": "*#4*44*0*0239##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 442.492, + "direction": "rx", + "raw": "*#4*57*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 442.573, + "direction": "rx", + "raw": "*#4*50*7*1*1*0225##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 442.675, + "direction": "rx", + "raw": "*#4*51*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 442.707, + "direction": "rx", + "raw": "*#4*51*0*0253##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 442.806, + "direction": "rx", + "raw": "*#4*53*7*1*1*0225##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 442.837, + "direction": "rx", + "raw": "*#4*57*0*0237##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 442.918, + "direction": "rx", + "raw": "*#4*58*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 442.966, + "direction": "rx", + "raw": "*#4*50*0*0250##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 443.237, + "direction": "rx", + "raw": "*#4*55*7*1*1*0225##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 443.241, + "direction": "rx", + "raw": "*#4*59*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 443.269, + "direction": "rx", + "raw": "*#4*62*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 443.337, + "direction": "rx", + "raw": "*#4*59*0*0237##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 443.424, + "direction": "rx", + "raw": "*#4*63*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 443.45, + "direction": "rx", + "raw": "*#4*61*7*1*1*0225##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 443.515, + "direction": "rx", + "raw": "*#4*52*7*1*1*0225##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 443.524, + "direction": "rx", + "raw": "*#4*63*0*0231##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 443.624, + "direction": "rx", + "raw": "*#4*52*0*0243##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 443.656, + "direction": "rx", + "raw": "*#4*61*0*0237##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 443.744, + "direction": "rx", + "raw": "*#4*55*0*0246##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 443.858, + "direction": "rx", + "raw": "*#4*53*0*0228##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 443.884, + "direction": "rx", + "raw": "*#4*58*0*0231##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 443.898, + "direction": "rx", + "raw": "*#4*66*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 443.995, + "direction": "rx", + "raw": "*#4*66*0*0250##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 444.074, + "direction": "rx", + "raw": "*#4*65*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 444.172, + "direction": "rx", + "raw": "*#4*70*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 444.26, + "direction": "rx", + "raw": "*#4*52*7*1*1*0225##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 444.361, + "direction": "rx", + "raw": "*#4*52*0*0243##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 444.402, + "direction": "rx", + "raw": "*#4*70*0*0231##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 444.492, + "direction": "rx", + "raw": "*#4*60*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 444.574, + "direction": "rx", + "raw": "*#4*55*7*1*1*0225##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 444.674, + "direction": "rx", + "raw": "*#4*62*0*0249##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 444.733, + "direction": "rx", + "raw": "*#4*62*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 444.804, + "direction": "rx", + "raw": "*#4*67*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 444.853, + "direction": "rx", + "raw": "*#4*67*0*0242##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 444.944, + "direction": "rx", + "raw": "*#4*68*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 445.043, + "direction": "rx", + "raw": "*#4*60*0*0242##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 445.074, + "direction": "rx", + "raw": "*#4*64*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 445.174, + "direction": "rx", + "raw": "*#4*68*0*0231##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 445.254, + "direction": "rx", + "raw": "*#4*63*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 445.335, + "direction": "rx", + "raw": "*#4*62*0*0249##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 445.433, + "direction": "rx", + "raw": "*#4*64*0*0232##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 445.481, + "direction": "rx", + "raw": "*#4*69*7*1*1*0225##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 445.514, + "direction": "rx", + "raw": "*#4*69*0*0235##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 445.584, + "direction": "rx", + "raw": "*#4*66*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 445.633, + "direction": "rx", + "raw": "*#4*60*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 445.676, + "direction": "rx", + "raw": "*#4*69*7*1*1*0225##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 445.722, + "direction": "rx", + "raw": "*#4*69*0*0235##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 445.763, + "direction": "rx", + "raw": "*#4*61*7*1*1*0225##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 445.806, + "direction": "rx", + "raw": "*#4*55*0*0246##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 445.849, + "direction": "rx", + "raw": "*#4*61*0*0237##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 445.898, + "direction": "rx", + "raw": "*#4*60*0*0242##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 445.913, + "direction": "rx", + "raw": "*#4*66*0*0250##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 445.962, + "direction": "rx", + "raw": "*#4*67*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 446.013, + "direction": "rx", + "raw": "*#4*65*0*0235##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 446.046, + "direction": "rx", + "raw": "*#4*67*0*0242##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 446.081, + "direction": "rx", + "raw": "*#4*70*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 446.134, + "direction": "rx", + "raw": "*#4*65*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 446.176, + "direction": "rx", + "raw": "*#4*64*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 446.219, + "direction": "rx", + "raw": "*#4*65*0*0235##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 446.257, + "direction": "rx", + "raw": "*#4*64*0*0232##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 446.306, + "direction": "rx", + "raw": "*#4*68*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 446.364, + "direction": "rx", + "raw": "*#4*59*7*1*1*0230##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 446.414, + "direction": "rx", + "raw": "*#4*68*0*0231##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 446.463, + "direction": "rx", + "raw": "*#4*70*0*0231##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 446.505, + "direction": "rx", + "raw": "*#4*59*0*0237##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 446.541, + "direction": "rx", + "raw": "*#4*63*0*0231##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 455.573, + "direction": "rx", + "raw": "*#4*43*0*0226##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 598.56, + "direction": "rx", + "raw": "*1*0*14##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 598.592, + "direction": "rx", + "raw": "*1*0*25##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 598.617, + "direction": "rx", + "raw": "*1*0*0415##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 598.649, + "direction": "rx", + "raw": "*1*0*0211##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 598.69, + "direction": "rx", + "raw": "*1*0*21##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 598.733, + "direction": "rx", + "raw": "*1*0*49##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 598.759, + "direction": "rx", + "raw": "*1*0*0010##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 598.795, + "direction": "rx", + "raw": "*1*0*0212##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 598.832, + "direction": "rx", + "raw": "*1*0*0115##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 598.873, + "direction": "rx", + "raw": "*1*0*0312##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 598.913, + "direction": "rx", + "raw": "*1*0*0014##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 598.943, + "direction": "rx", + "raw": "*1*0*29##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 598.974, + "direction": "rx", + "raw": "*1*0*17##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.013, + "direction": "rx", + "raw": "*1*0*26##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.054, + "direction": "rx", + "raw": "*1*0*61##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.079, + "direction": "rx", + "raw": "*1*0*0210##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.124, + "direction": "rx", + "raw": "*1*0*0313##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.161, + "direction": "rx", + "raw": "*1*0*37##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.197, + "direction": "rx", + "raw": "*1*0*0012##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.234, + "direction": "rx", + "raw": "*1*0*0410##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.264, + "direction": "rx", + "raw": "*1*0*0310##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.313, + "direction": "rx", + "raw": "*1*0*24##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.353, + "direction": "rx", + "raw": "*1*0*18##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.379, + "direction": "rx", + "raw": "*1*0*0315##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.413, + "direction": "rx", + "raw": "*1*0*64##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.443, + "direction": "rx", + "raw": "*1*0*43##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.503, + "direction": "rx", + "raw": "*1*1*27##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.527, + "direction": "rx", + "raw": "*1*0*0015##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.563, + "direction": "rx", + "raw": "*1*0*0515##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.599, + "direction": "rx", + "raw": "*1*0*0314##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.645, + "direction": "rx", + "raw": "*1*0*0011##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.673, + "direction": "rx", + "raw": "*1*0*33##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.705, + "direction": "rx", + "raw": "*1*0*65##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.736, + "direction": "rx", + "raw": "*1*0*0411##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.769, + "direction": "rx", + "raw": "*1*0*0215##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.804, + "direction": "rx", + "raw": "*1*0*0311##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.843, + "direction": "rx", + "raw": "*1*0*0513##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.883, + "direction": "rx", + "raw": "*1*0*34##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.923, + "direction": "rx", + "raw": "*1*0*19##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.951, + "direction": "rx", + "raw": "*1*0*0213##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 599.995, + "direction": "rx", + "raw": "*1*0*41##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.023, + "direction": "rx", + "raw": "*1*0*28##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.061, + "direction": "rx", + "raw": "*1*0*0510##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.094, + "direction": "rx", + "raw": "*1*0*42##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.13, + "direction": "rx", + "raw": "*1*0*0110##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.173, + "direction": "rx", + "raw": "*1*0*44##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.198, + "direction": "rx", + "raw": "*1*0*0511##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.232, + "direction": "rx", + "raw": "*1*0*0512##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.264, + "direction": "rx", + "raw": "*1*1*62##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.298, + "direction": "rx", + "raw": "*1*0*31##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.335, + "direction": "rx", + "raw": "*1*0*16##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.373, + "direction": "rx", + "raw": "*1*0*45##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.423, + "direction": "rx", + "raw": "*1*0*0013##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.444, + "direction": "rx", + "raw": "*1*0*38##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.474, + "direction": "rx", + "raw": "*1*1*63##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.509, + "direction": "rx", + "raw": "*1*0*0514##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.55, + "direction": "rx", + "raw": "*1*0*0111##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.6, + "direction": "rx", + "raw": "*1*0*0112##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.641, + "direction": "rx", + "raw": "*1*0*11##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.675, + "direction": "rx", + "raw": "*1*0*0214##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.714, + "direction": "rx", + "raw": "*1*0*0113##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.744, + "direction": "rx", + "raw": "*1*0*39##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.792, + "direction": "rx", + "raw": "*1*0*0114##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.823, + "direction": "rx", + "raw": "*1*0*32##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.872, + "direction": "rx", + "raw": "*1*0*66##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.904, + "direction": "rx", + "raw": "*1*0*12##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.943, + "direction": "rx", + "raw": "*1*0*36##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 600.983, + "direction": "rx", + "raw": "*1*1*13##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 601.017, + "direction": "rx", + "raw": "*1*0*46##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 601.073, + "direction": "rx", + "raw": "*1*0*0413##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 601.106, + "direction": "rx", + "raw": "*1*0*33##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 601.149, + "direction": "rx", + "raw": "*1*0*47##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 601.193, + "direction": "rx", + "raw": "*1*0*34##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 601.227, + "direction": "rx", + "raw": "*1*0*48##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 601.293, + "direction": "rx", + "raw": "*1*0*68##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 601.317, + "direction": "rx", + "raw": "*1*0*36##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 601.372, + "direction": "rx", + "raw": "*1*0*69##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 603.209, + "direction": "rx", + "raw": "*1*0*0014##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 603.244, + "direction": "rx", + "raw": "*1*0*0514##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 603.264, + "direction": "rx", + "raw": "*1*0*0211##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 603.303, + "direction": "rx", + "raw": "*1*0*17##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 603.344, + "direction": "rx", + "raw": "*1*0*0115##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 603.374, + "direction": "rx", + "raw": "*1*0*0215##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 603.422, + "direction": "rx", + "raw": "*1*0*18##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 603.449, + "direction": "rx", + "raw": "*1*0*33##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 603.488, + "direction": "rx", + "raw": "*1*0*0010##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 603.519, + "direction": "rx", + "raw": "*1*0*29##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 603.553, + "direction": "rx", + "raw": "*1*0*0111##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 603.588, + "direction": "rx", + "raw": "*1*0*25##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 603.623, + "direction": "rx", + "raw": "*1*0*11##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 603.658, + "direction": "rx", + "raw": "*1*0*34##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 603.696, + "direction": "rx", + "raw": "*1*0*0513##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 603.729, + "direction": "rx", + "raw": "*1*0*49##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 603.772, + "direction": "rx", + "raw": "*1*0*0112##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 603.801, + "direction": "rx", + "raw": "*1*0*0314##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 603.843, + "direction": "rx", + "raw": "*1*0*19##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 603.873, + "direction": "rx", + "raw": "*1*0*26##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 603.904, + "direction": "rx", + "raw": "*1*0*64##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 603.939, + "direction": "rx", + "raw": "*1*0*0312##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 603.973, + "direction": "rx", + "raw": "*1*0*0110##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.022, + "direction": "rx", + "raw": "*1*0*0210##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.049, + "direction": "rx", + "raw": "*1*0*14##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.085, + "direction": "rx", + "raw": "*1*0*0313##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.125, + "direction": "rx", + "raw": "*1*0*0113##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.159, + "direction": "rx", + "raw": "*1*0*45##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.203, + "direction": "rx", + "raw": "*1*0*0114##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.224, + "direction": "rx", + "raw": "*1*0*37##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.273, + "direction": "rx", + "raw": "*1*0*0415##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.3, + "direction": "rx", + "raw": "*1*0*0512##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.342, + "direction": "rx", + "raw": "*1*0*65##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.375, + "direction": "rx", + "raw": "*1*0*0212##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.414, + "direction": "rx", + "raw": "*1*0*46##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.444, + "direction": "rx", + "raw": "*1*0*0311##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.484, + "direction": "rx", + "raw": "*1*0*0315##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.513, + "direction": "rx", + "raw": "*1*0*0515##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.563, + "direction": "rx", + "raw": "*1*0*36##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.593, + "direction": "rx", + "raw": "*1*0*0012##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.623, + "direction": "rx", + "raw": "*1*0*38##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.664, + "direction": "rx", + "raw": "*1*0*0013##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.694, + "direction": "rx", + "raw": "*1*0*39##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.734, + "direction": "rx", + "raw": "*1*0*12##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.773, + "direction": "rx", + "raw": "*1*0*41##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.813, + "direction": "rx", + "raw": "*1*0*0015##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.839, + "direction": "rx", + "raw": "*1*0*0410##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.878, + "direction": "rx", + "raw": "*1*0*21##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.91, + "direction": "rx", + "raw": "*1*0*0213##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.944, + "direction": "rx", + "raw": "*1*1*13##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 604.974, + "direction": "rx", + "raw": "*1*0*66##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.011, + "direction": "rx", + "raw": "*1*0*61##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.045, + "direction": "rx", + "raw": "*1*0*31##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.081, + "direction": "rx", + "raw": "*1*0*0011##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.114, + "direction": "rx", + "raw": "*1*0*47##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.162, + "direction": "rx", + "raw": "*1*0*16##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.195, + "direction": "rx", + "raw": "*1*0*32##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.234, + "direction": "rx", + "raw": "*1*0*0014##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.264, + "direction": "rx", + "raw": "*1*0*0215##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.322, + "direction": "rx", + "raw": "*1*0*0015##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.349, + "direction": "rx", + "raw": "*1*0*48##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.395, + "direction": "rx", + "raw": "*1*0*42##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.423, + "direction": "rx", + "raw": "*1*0*0011##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.457, + "direction": "rx", + "raw": "*1*0*43##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.493, + "direction": "rx", + "raw": "*1*0*44##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.534, + "direction": "rx", + "raw": "*1*0*0512##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.569, + "direction": "rx", + "raw": "*1*0*0214##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.611, + "direction": "rx", + "raw": "*1*1*62##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.652, + "direction": "rx", + "raw": "*1*0*0211##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.69, + "direction": "rx", + "raw": "*1*0*31##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.726, + "direction": "rx", + "raw": "*1*0*0212##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.767, + "direction": "rx", + "raw": "*1*0*0310##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.813, + "direction": "rx", + "raw": "*1*1*63##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.846, + "direction": "rx", + "raw": "*1*0*24##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.89, + "direction": "rx", + "raw": "*1*0*32##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.923, + "direction": "rx", + "raw": "*1*1*27##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 605.982, + "direction": "rx", + "raw": "*1*0*28##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 606.02, + "direction": "rx", + "raw": "*1*0*0510##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 606.049, + "direction": "rx", + "raw": "*1*0*0213##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 606.099, + "direction": "rx", + "raw": "*1*0*0511##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 606.122, + "direction": "rx", + "raw": "*1*0*0214##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 606.171, + "direction": "rx", + "raw": "*1*0*16##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 606.203, + "direction": "rx", + "raw": "*1*0*0415##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 606.263, + "direction": "rx", + "raw": "*1*0*0413##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 606.302, + "direction": "rx", + "raw": "*1*0*0411##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 606.354, + "direction": "rx", + "raw": "*1*0*61##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 606.394, + "direction": "rx", + "raw": "*1*0*0510##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 606.448, + "direction": "rx", + "raw": "*1*0*0511##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 606.504, + "direction": "rx", + "raw": "*1*0*68##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 606.564, + "direction": "rx", + "raw": "*1*0*69##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 612.923, + "direction": "rx", + "raw": "*#1*06*4*100*4##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 613.57, + "direction": "rx", + "raw": "*#4*40*0*0226##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 613.873, + "direction": "rx", + "raw": "*#4*40*12*0225*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 613.877, + "direction": "rx", + "raw": "*4*1*40##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 614.153, + "direction": "rx", + "raw": "*#4*40*14*0225*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 614.274, + "direction": "rx", + "raw": "*#4*40*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 614.474, + "direction": "rx", + "raw": "*#4*40*60*48##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 615.153, + "direction": "rx", + "raw": "*#4*59*0*0237##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 615.443, + "direction": "rx", + "raw": "*#4*59*12*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 615.487, + "direction": "rx", + "raw": "*4*1*59##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 615.744, + "direction": "rx", + "raw": "*#4*59*14*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 615.844, + "direction": "rx", + "raw": "*#4*59*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 616.099, + "direction": "rx", + "raw": "*#4*59*60*66##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 616.773, + "direction": "rx", + "raw": "*#4*58*0*0231##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 617.072, + "direction": "rx", + "raw": "*#4*58*12*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 617.083, + "direction": "rx", + "raw": "*4*1*58##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 617.355, + "direction": "rx", + "raw": "*#4*58*14*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 617.461, + "direction": "rx", + "raw": "*#4*58*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 617.713, + "direction": "rx", + "raw": "*#4*58*60*57##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 618.389, + "direction": "rx", + "raw": "*#4*53*0*0228##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 618.694, + "direction": "rx", + "raw": "*#4*53*12*0225*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 618.704, + "direction": "rx", + "raw": "*4*1*53##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 618.983, + "direction": "rx", + "raw": "*#4*53*14*0225*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 619.088, + "direction": "rx", + "raw": "*#4*53*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 619.314, + "direction": "rx", + "raw": "*#4*53*60*60##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 619.995, + "direction": "rx", + "raw": "*#4*55*0*0246##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 620.293, + "direction": "rx", + "raw": "*#4*55*12*0225*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 620.313, + "direction": "rx", + "raw": "*4*1*55##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 620.584, + "direction": "rx", + "raw": "*#4*55*14*0225*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 620.704, + "direction": "rx", + "raw": "*#4*55*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 620.934, + "direction": "rx", + "raw": "*#4*55*60*49##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 621.616, + "direction": "rx", + "raw": "*#4*39*0*0221##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 621.914, + "direction": "rx", + "raw": "*#4*39*12*0220*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 621.931, + "direction": "rx", + "raw": "*4*1*39##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 622.203, + "direction": "rx", + "raw": "*#4*39*14*0220*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 622.264, + "direction": "rx", + "raw": "*#4*39*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 622.494, + "direction": "rx", + "raw": "*#4*39*60*48##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 623.195, + "direction": "rx", + "raw": "*#4*68*0*0232##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 623.473, + "direction": "rx", + "raw": "*#4*68*12*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 623.502, + "direction": "rx", + "raw": "*4*1*68##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 623.773, + "direction": "rx", + "raw": "*#4*68*14*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 623.865, + "direction": "rx", + "raw": "*#4*68*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 624.106, + "direction": "rx", + "raw": "*#4*68*60*55##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 624.793, + "direction": "rx", + "raw": "*#4*61*0*0237##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 625.095, + "direction": "rx", + "raw": "*#4*61*12*0225*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 625.113, + "direction": "rx", + "raw": "*4*1*61##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 625.383, + "direction": "rx", + "raw": "*#4*61*14*0225*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 625.528, + "direction": "rx", + "raw": "*#4*61*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 625.781, + "direction": "rx", + "raw": "*#4*61*60*52##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 626.458, + "direction": "rx", + "raw": "*#4*43*0*0226##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 626.781, + "direction": "rx", + "raw": "*#4*43*12*0225*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 626.782, + "direction": "rx", + "raw": "*4*1*43##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 627.053, + "direction": "rx", + "raw": "*#4*43*14*0225*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 627.124, + "direction": "rx", + "raw": "*#4*43*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 627.352, + "direction": "rx", + "raw": "*#4*43*60*55##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 628.017, + "direction": "rx", + "raw": "*#4*42*0*0231##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 628.328, + "direction": "rx", + "raw": "*#4*42*12*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 628.342, + "direction": "rx", + "raw": "*4*1*42##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 628.624, + "direction": "rx", + "raw": "*#4*42*14*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 628.703, + "direction": "rx", + "raw": "*#4*42*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 628.904, + "direction": "rx", + "raw": "*#4*42*60*52##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 629.583, + "direction": "rx", + "raw": "*#4*41*0*0210##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 629.886, + "direction": "rx", + "raw": "*#4*41*12*0130*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 629.896, + "direction": "rx", + "raw": "*4*1*41##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 630.173, + "direction": "rx", + "raw": "*#4*41*14*0130*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 630.241, + "direction": "rx", + "raw": "*#4*41*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 630.425, + "direction": "rx", + "raw": "*#4*41*60*44##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 631.128, + "direction": "rx", + "raw": "*#4*65*0*0235##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 631.423, + "direction": "rx", + "raw": "*#4*65*12*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 631.453, + "direction": "rx", + "raw": "*4*1*65##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 631.723, + "direction": "rx", + "raw": "*#4*65*14*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 631.823, + "direction": "rx", + "raw": "*#4*65*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 632.483, + "direction": "rx", + "raw": "*#4*49*0*0262##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 632.775, + "direction": "rx", + "raw": "*#4*49*12*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 632.801, + "direction": "rx", + "raw": "*4*1*49##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 633.061, + "direction": "rx", + "raw": "*#4*49*14*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 633.203, + "direction": "rx", + "raw": "*#4*49*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 633.84, + "direction": "rx", + "raw": "*#4*52*0*0243##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 634.134, + "direction": "rx", + "raw": "*#4*52*12*0225*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 634.153, + "direction": "rx", + "raw": "*4*1*52##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 634.424, + "direction": "rx", + "raw": "*#4*52*14*0225*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 634.524, + "direction": "rx", + "raw": "*#4*52*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 635.174, + "direction": "rx", + "raw": "*#4*46*0*0238##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 635.464, + "direction": "rx", + "raw": "*#4*46*12*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 635.49, + "direction": "rx", + "raw": "*4*1*46##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 635.763, + "direction": "rx", + "raw": "*#4*46*14*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 635.819, + "direction": "rx", + "raw": "*#4*46*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 636.458, + "direction": "rx", + "raw": "*#4*66*0*0250##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 636.773, + "direction": "rx", + "raw": "*#4*66*12*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 636.782, + "direction": "rx", + "raw": "*4*1*66##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 637.053, + "direction": "rx", + "raw": "*#4*66*14*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 637.173, + "direction": "rx", + "raw": "*#4*66*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 637.82, + "direction": "rx", + "raw": "*#4*51*0*0253##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 638.115, + "direction": "rx", + "raw": "*#4*51*12*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 638.133, + "direction": "rx", + "raw": "*4*1*51##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 638.414, + "direction": "rx", + "raw": "*#4*51*14*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 638.514, + "direction": "rx", + "raw": "*#4*51*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 639.144, + "direction": "rx", + "raw": "*#4*63*0*0231##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 639.452, + "direction": "rx", + "raw": "*#4*63*12*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 639.469, + "direction": "rx", + "raw": "*4*1*63##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 639.743, + "direction": "rx", + "raw": "*#4*63*14*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 639.853, + "direction": "rx", + "raw": "*#4*63*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 640.494, + "direction": "rx", + "raw": "*#4*36*0*0226##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 640.809, + "direction": "rx", + "raw": "*#4*36*12*0225*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 640.823, + "direction": "rx", + "raw": "*4*1*36##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 641.084, + "direction": "rx", + "raw": "*#4*36*14*0225*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 641.143, + "direction": "rx", + "raw": "*#4*36*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 641.788, + "direction": "rx", + "raw": "*#4*67*0*0242##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 642.093, + "direction": "rx", + "raw": "*#4*67*12*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 642.112, + "direction": "rx", + "raw": "*4*1*67##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 642.383, + "direction": "rx", + "raw": "*#4*67*14*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 642.513, + "direction": "rx", + "raw": "*#4*67*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 643.164, + "direction": "rx", + "raw": "*#4*50*0*0250##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 643.464, + "direction": "rx", + "raw": "*#4*50*12*0225*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 643.477, + "direction": "rx", + "raw": "*4*1*50##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 643.745, + "direction": "rx", + "raw": "*#4*50*14*0225*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 643.842, + "direction": "rx", + "raw": "*#4*50*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 644.499, + "direction": "rx", + "raw": "*#4*44*0*0239##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 644.785, + "direction": "rx", + "raw": "*#4*44*12*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 644.788, + "direction": "rx", + "raw": "*4*1*44##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 645.074, + "direction": "rx", + "raw": "*#4*44*14*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 645.144, + "direction": "rx", + "raw": "*#4*44*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 645.791, + "direction": "rx", + "raw": "*#4*38*0*0251##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 646.084, + "direction": "rx", + "raw": "*#4*38*12*0225*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 646.093, + "direction": "rx", + "raw": "*4*1*38##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 646.373, + "direction": "rx", + "raw": "*#4*38*14*0225*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 646.444, + "direction": "rx", + "raw": "*#4*38*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 647.093, + "direction": "rx", + "raw": "*#4*45*0*0242##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 647.385, + "direction": "rx", + "raw": "*#4*45*12*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 647.397, + "direction": "rx", + "raw": "*4*1*45##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 647.684, + "direction": "rx", + "raw": "*#4*45*14*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 647.748, + "direction": "rx", + "raw": "*#4*45*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 648.386, + "direction": "rx", + "raw": "*#4*37*0*0206##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 648.684, + "direction": "rx", + "raw": "*#4*37*12*0130*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 648.695, + "direction": "rx", + "raw": "*4*1*37##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 648.967, + "direction": "rx", + "raw": "*#4*37*14*0130*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 649.04, + "direction": "rx", + "raw": "*#4*37*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 649.703, + "direction": "rx", + "raw": "*#4*35*0*0224##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 649.995, + "direction": "rx", + "raw": "*#4*35*12*0200*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 650.01, + "direction": "rx", + "raw": "*4*1*35##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 650.281, + "direction": "rx", + "raw": "*#4*35*14*0200*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 650.342, + "direction": "rx", + "raw": "*#4*35*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 650.983, + "direction": "rx", + "raw": "*#4*64*0*0232##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 651.283, + "direction": "rx", + "raw": "*#4*64*12*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 651.303, + "direction": "rx", + "raw": "*4*1*64##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 651.575, + "direction": "rx", + "raw": "*#4*64*14*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 651.694, + "direction": "rx", + "raw": "*#4*64*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 652.344, + "direction": "rx", + "raw": "*#4*62*0*0249##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 652.643, + "direction": "rx", + "raw": "*#4*62*12*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 652.656, + "direction": "rx", + "raw": "*4*1*62##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 652.925, + "direction": "rx", + "raw": "*#4*62*14*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 653.021, + "direction": "rx", + "raw": "*#4*62*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 653.682, + "direction": "rx", + "raw": "*#4*69*0*0235##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 653.974, + "direction": "rx", + "raw": "*#4*69*12*0225*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 653.994, + "direction": "rx", + "raw": "*4*1*69##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 654.265, + "direction": "rx", + "raw": "*#4*69*14*0225*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 654.375, + "direction": "rx", + "raw": "*#4*69*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 654.623, + "direction": "rx", + "raw": "*#4*69*60*52##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 655.323, + "direction": "rx", + "raw": "*#4*48*0*0233##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 655.614, + "direction": "rx", + "raw": "*#4*48*12*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 655.626, + "direction": "rx", + "raw": "*4*1*48##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 655.894, + "direction": "rx", + "raw": "*#4*48*14*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 655.965, + "direction": "rx", + "raw": "*#4*48*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 656.163, + "direction": "rx", + "raw": "*#4*48*60*54##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 656.873, + "direction": "rx", + "raw": "*#4*47*0*0236##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 657.146, + "direction": "rx", + "raw": "*#4*47*12*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 657.163, + "direction": "rx", + "raw": "*4*1*47##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 657.443, + "direction": "rx", + "raw": "*#4*47*14*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 657.514, + "direction": "rx", + "raw": "*#4*47*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 657.734, + "direction": "rx", + "raw": "*#4*47*60*57##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 658.424, + "direction": "rx", + "raw": "*#4*60*0*0242##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 658.724, + "direction": "rx", + "raw": "*#4*60*12*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 658.739, + "direction": "rx", + "raw": "*4*1*60##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 659.014, + "direction": "rx", + "raw": "*#4*60*14*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 659.106, + "direction": "rx", + "raw": "*#4*60*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 659.334, + "direction": "rx", + "raw": "*#4*60*60*54##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 660.012, + "direction": "rx", + "raw": "*#4*70*0*0231##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 660.331, + "direction": "rx", + "raw": "*#4*70*12*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 660.343, + "direction": "rx", + "raw": "*4*1*70##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 660.614, + "direction": "rx", + "raw": "*#4*70*14*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 660.703, + "direction": "rx", + "raw": "*#4*70*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 660.946, + "direction": "rx", + "raw": "*#4*70*60*68##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 661.624, + "direction": "rx", + "raw": "*#4*57*0*0236##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 661.933, + "direction": "rx", + "raw": "*#4*57*12*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 661.948, + "direction": "rx", + "raw": "*4*1*57##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 662.215, + "direction": "rx", + "raw": "*#4*57*14*0230*3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 662.323, + "direction": "rx", + "raw": "*#4*57*13*00##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 662.575, + "direction": "rx", + "raw": "*#4*57*60*51##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 664.411, + "direction": "rx", + "raw": "*4*4002#70*0#3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 664.467, + "direction": "rx", + "raw": "*4*4002*70##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 666.399, + "direction": "rx", + "raw": "*#4*70#1*#20*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 666.445, + "direction": "rx", + "raw": "*#4*70#1*20*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 783.938, + "direction": "rx", + "raw": "*4*4002#51*0#3##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 783.977, + "direction": "rx", + "raw": "*4*4002*51##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 785.953, + "direction": "rx", + "raw": "*#4*51#1*#20*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 785.984, + "direction": "rx", + "raw": "*#4*51#1*20*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 793.954, + "direction": "rx", + "raw": "*#13**#1*00*25*10*2026##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 793.963, + "direction": "rx", + "raw": "*#13**#0*13*00*00*##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 838.501, + "direction": "rx", + "raw": "*4*4002#46*0#2##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 838.538, + "direction": "rx", + "raw": "*4*4002*46##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 840.475, + "direction": "rx", + "raw": "*#4*46#1*#20*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 840.52, + "direction": "rx", + "raw": "*#4*46#1*20*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 960.212, + "direction": "rx", + "raw": "*4*4002#43*0#2##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 960.26, + "direction": "rx", + "raw": "*4*4002*43##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 962.309, + "direction": "rx", + "raw": "*#4*43#1*#20*0##", + "run": "run4_listen_600_s", + "session": "evt" + }, + { + "timestamp": 962.35, + "direction": "rx", + "raw": "*#4*43#1*20*0##", + "run": "run4_listen_600_s", + "session": "evt" + } + ], + "rows": [ + { + "run": "run1_identify_and_all_zones_actuators", + "t": 0.0, + "step": "identify", + "dir": "tx", + "session": "cmd", + "frame": "*#13**16##", + "is_status_request": true + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 0.0, + "t_estimated": true, + "step": "identify", + "dir": "rx", + "session": "cmd", + "frame": "*#13**16*3*87*13##" + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 0.0, + "t_estimated": true, + "step": "identify", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 0.025, + "step": "identify", + "dir": "rx", + "session": "evt", + "frame": "*#13**16*3*87*13##", + "ownd_class": "OWNGatewayEvent", + "ownd_log": "Gateway's firmware version is: 3.87.13." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 0.027, + "utc": "10:46:46", + "step": "identify", + "dir": "result", + "frame": "*#13**16##", + "ack": true, + "reply_time_s": 0.027, + "replies": [ + "*#13**16*3*87*13##" + ], + "events_after": [ + "*#13**16*3*87*13##" + ], + "note": "who13_firmware_3_87_13" + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 1.228, + "step": "identify", + "dir": "tx", + "session": "cmd", + "frame": "*#13**0##", + "is_status_request": true + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 1.228, + "t_estimated": true, + "step": "identify", + "dir": "rx", + "session": "cmd", + "frame": "*#13**0*12*46*47*999##" + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 1.228, + "t_estimated": true, + "step": "identify", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 1.245, + "step": "identify", + "dir": "rx", + "session": "evt", + "frame": "*#13**0*12*46*47*999##", + "ownd_class": "OWNGatewayEvent", + "ownd_log": "Gateway's internal time is: 12:46:47." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 1.248, + "utc": "10:46:47", + "step": "identify", + "dir": "result", + "frame": "*#13**0##", + "ack": true, + "reply_time_s": 0.02, + "replies": [ + "*#13**0*12*46*47*999##" + ], + "events_after": [ + "*#13**0*12*46*47*999##" + ], + "note": "who13_time_echoed_on_evt" + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 2.45, + "step": "all_zones_actuators", + "dir": "tx", + "session": "cmd", + "frame": "*#4*#0*20##", + "is_status_request": true + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 2.45, + "t_estimated": true, + "step": "all_zones_actuators", + "dir": "rx", + "session": "cmd", + "frame": "*#4*47#2*20*5##" + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 2.45, + "t_estimated": true, + "step": "all_zones_actuators", + "dir": "rx", + "session": "cmd", + "frame": "*#4*53#1*20*0##" + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 2.45, + "t_estimated": true, + "step": "all_zones_actuators", + "dir": "rx", + "session": "cmd", + "frame": "*#4*39#1*20*0##" + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 2.45, + "t_estimated": true, + "step": "all_zones_actuators", + "dir": "rx", + "session": "cmd", + "frame": "*#4*57#2*20*5##" + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 2.45, + "t_estimated": true, + "step": "all_zones_actuators", + "dir": "rx", + "session": "cmd", + "frame": "*#4*35#1*20*0##" + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 2.45, + "t_estimated": true, + "step": "all_zones_actuators", + "dir": "rx", + "session": "cmd", + "frame": "*#4*49#1*20*0##" + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 2.45, + "t_estimated": true, + "step": "all_zones_actuators", + "dir": "rx", + "session": "cmd", + "frame": "*#4*48#2*20*5##" + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 2.45, + "t_estimated": true, + "step": "all_zones_actuators", + "dir": "rx", + "session": "cmd", + "frame": "*#4*51#1*20*0##" + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 2.45, + "t_estimated": true, + "step": "all_zones_actuators", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 2.634, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*47#2*20*5##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 47's fan is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 2.652, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*53#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 53's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 2.694, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*39#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 39's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 2.735, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*57#2*20*5##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 57's fan is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 2.795, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*35#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 35's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 2.844, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*49#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 49's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 2.871, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*48#2*20*5##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 48's fan is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 2.917, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*51#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 51's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 2.946, + "utc": "10:46:48", + "step": "all_zones_actuators", + "dir": "result", + "frame": "*#4*#0*20##", + "ack": true, + "reply_time_s": 0.496, + "replies": [ + "*#4*47#2*20*5##", + "*#4*53#1*20*0##", + "*#4*39#1*20*0##", + "*#4*57#2*20*5##", + "*#4*35#1*20*0##", + "*#4*49#1*20*0##", + "*#4*48#2*20*5##", + "*#4*51#1*20*0##" + ], + "events_after": [ + "*#4*47#2*20*5##", + "*#4*53#1*20*0##", + "*#4*39#1*20*0##", + "*#4*57#2*20*5##", + "*#4*35#1*20*0##", + "*#4*49#1*20*0##", + "*#4*48#2*20*5##", + "*#4*51#1*20*0##" + ], + "note": "all_zones_actuators_ack_0_5_s_8_replies_on_cmd_38_distinct_actuator_frames_on_evt_all_off_zone_0_pumps_included" + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 2.981, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*36#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 36's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.02, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*43#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 43's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.058, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*40#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 40's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.083, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*60#2*20*5##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 60's fan is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.105, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*47#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 47's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.138, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*37#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 37's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.17, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*70#2*20*5##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 70's fan is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.216, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*38#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 38's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.248, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*60#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 60's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.281, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*48#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 48's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.313, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*61#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 61's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.335, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*44#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 44's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.367, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*0#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 0's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.412, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*35#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 35's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.445, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*41#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 41's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.477, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*0#3*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 0's actuator 3 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.498, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*64#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 64's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.549, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*36#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 36's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.563, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*65#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 65's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.616, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*0#4*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 0's actuator 4 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.64, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*57#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 57's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.673, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*37#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 37's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.705, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*52#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 52's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.738, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*0#2*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 0's actuator 2 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.771, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*70#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 70's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.809, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*38#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 38's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.842, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*50#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 50's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.88, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*58#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 58's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.919, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*68#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 68's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.959, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*66#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 66's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 3.998, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*55#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 55's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 4.036, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*69#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 69's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 4.079, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*59#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 59's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 4.12, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*42#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 42's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 4.159, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*67#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 67's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 4.2, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*62#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 62's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 4.244, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*63#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 63's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 4.3, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*45#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 45's actuator 1 is off." + }, + { + "run": "run1_identify_and_all_zones_actuators", + "t": 4.359, + "step": "all_zones_actuators", + "dir": "rx", + "session": "evt", + "frame": "*#4*46#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 46's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 6.148, + "step": "zone_35", + "dir": "tx", + "session": "cmd", + "frame": "*#4*35*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 6.148, + "t_estimated": true, + "step": "zone_35", + "dir": "rx", + "session": "cmd", + "frame": "*#4*35*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 6.148, + "t_estimated": true, + "step": "zone_35", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 6.31, + "step": "zone_35", + "dir": "rx", + "session": "evt", + "frame": "*#4*35*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 35's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 6.332, + "utc": "10:46:52", + "step": "zone_35", + "dir": "result", + "frame": "*#4*35*19##", + "ack": true, + "reply_time_s": 0.184, + "replies": [ + "*#4*35*19*0*0##" + ], + "events_after": [ + "*#4*35*19*0*0##" + ], + "note": "zone_35_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 7.534, + "step": "zone_35", + "dir": "tx", + "session": "cmd", + "frame": "*#4*35*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 7.534, + "t_estimated": true, + "step": "zone_35", + "dir": "rx", + "session": "cmd", + "frame": "*#4*35#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 7.534, + "t_estimated": true, + "step": "zone_35", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 7.695, + "step": "zone_35", + "dir": "rx", + "session": "evt", + "frame": "*#4*35#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 35's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 7.726, + "utc": "10:46:53", + "step": "zone_35", + "dir": "result", + "frame": "*#4*35*20##", + "ack": true, + "reply_time_s": 0.192, + "replies": [ + "*#4*35#1*20*0##" + ], + "events_after": [ + "*#4*35#1*20*0##" + ], + "note": "zone_35_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 7.733, + "step": "zone_35", + "dir": "rx", + "session": "evt", + "frame": "*#4*35#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 35's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 8.93, + "step": "zone_35", + "dir": "tx", + "session": "cmd", + "frame": "*#4*35*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 8.93, + "t_estimated": true, + "step": "zone_35", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 11.069, + "utc": "10:46:57", + "step": "zone_35", + "dir": "result", + "frame": "*#4*35*11##", + "ack": false, + "reply_time_s": 2.139, + "replies": [], + "events_after": [], + "note": "zone_35_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 12.27, + "step": "zone_35", + "dir": "tx", + "session": "cmd", + "frame": "*#4*35*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 12.27, + "t_estimated": true, + "step": "zone_35", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 14.425, + "utc": "10:47:00", + "step": "zone_35", + "dir": "result", + "frame": "*#4*35*60##", + "ack": false, + "reply_time_s": 2.155, + "replies": [], + "events_after": [], + "note": "zone_35_humidity_nack_no_probe" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 16.627, + "step": "zone_36", + "dir": "tx", + "session": "cmd", + "frame": "*#4*36*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 16.627, + "t_estimated": true, + "step": "zone_36", + "dir": "rx", + "session": "cmd", + "frame": "*#4*36*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 16.627, + "t_estimated": true, + "step": "zone_36", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 16.791, + "step": "zone_36", + "dir": "rx", + "session": "evt", + "frame": "*#4*36*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 36's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 16.83, + "utc": "10:47:02", + "step": "zone_36", + "dir": "result", + "frame": "*#4*36*19##", + "ack": true, + "reply_time_s": 0.203, + "replies": [ + "*#4*36*19*0*0##" + ], + "events_after": [ + "*#4*36*19*0*0##" + ], + "note": "zone_36_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 18.032, + "step": "zone_36", + "dir": "tx", + "session": "cmd", + "frame": "*#4*36*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 18.032, + "t_estimated": true, + "step": "zone_36", + "dir": "rx", + "session": "cmd", + "frame": "*#4*36#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 18.032, + "t_estimated": true, + "step": "zone_36", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 18.171, + "step": "zone_36", + "dir": "rx", + "session": "evt", + "frame": "*#4*36#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 36's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 18.19, + "utc": "10:47:04", + "step": "zone_36", + "dir": "result", + "frame": "*#4*36*20##", + "ack": true, + "reply_time_s": 0.158, + "replies": [ + "*#4*36#1*20*0##" + ], + "events_after": [ + "*#4*36#1*20*0##" + ], + "note": "zone_36_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 19.391, + "step": "zone_36", + "dir": "tx", + "session": "cmd", + "frame": "*#4*36*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 19.391, + "t_estimated": true, + "step": "zone_36", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 21.496, + "utc": "10:47:07", + "step": "zone_36", + "dir": "result", + "frame": "*#4*36*11##", + "ack": false, + "reply_time_s": 2.105, + "replies": [], + "events_after": [], + "note": "zone_36_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 22.698, + "step": "zone_36", + "dir": "tx", + "session": "cmd", + "frame": "*#4*36*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 22.698, + "t_estimated": true, + "step": "zone_36", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 24.816, + "utc": "10:47:10", + "step": "zone_36", + "dir": "result", + "frame": "*#4*36*60##", + "ack": false, + "reply_time_s": 2.118, + "replies": [], + "events_after": [], + "note": "zone_36_humidity_nack_no_probe" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 27.018, + "step": "zone_37", + "dir": "tx", + "session": "cmd", + "frame": "*#4*37*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 27.018, + "t_estimated": true, + "step": "zone_37", + "dir": "rx", + "session": "cmd", + "frame": "*#4*37*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 27.018, + "t_estimated": true, + "step": "zone_37", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 27.195, + "step": "zone_37", + "dir": "rx", + "session": "evt", + "frame": "*#4*37*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 37's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 27.226, + "utc": "10:47:13", + "step": "zone_37", + "dir": "result", + "frame": "*#4*37*19##", + "ack": true, + "reply_time_s": 0.208, + "replies": [ + "*#4*37*19*0*0##" + ], + "events_after": [ + "*#4*37*19*0*0##" + ], + "note": "zone_37_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 28.427, + "step": "zone_37", + "dir": "tx", + "session": "cmd", + "frame": "*#4*37*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 28.427, + "t_estimated": true, + "step": "zone_37", + "dir": "rx", + "session": "cmd", + "frame": "*#4*37#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 28.427, + "t_estimated": true, + "step": "zone_37", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 28.575, + "step": "zone_37", + "dir": "rx", + "session": "evt", + "frame": "*#4*37#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 37's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 28.611, + "utc": "10:47:14", + "step": "zone_37", + "dir": "result", + "frame": "*#4*37*20##", + "ack": true, + "reply_time_s": 0.184, + "replies": [ + "*#4*37#1*20*0##" + ], + "events_after": [ + "*#4*37#1*20*0##" + ], + "note": "zone_37_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 29.812, + "step": "zone_37", + "dir": "tx", + "session": "cmd", + "frame": "*#4*37*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 29.812, + "t_estimated": true, + "step": "zone_37", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 31.916, + "utc": "10:47:17", + "step": "zone_37", + "dir": "result", + "frame": "*#4*37*11##", + "ack": false, + "reply_time_s": 2.104, + "replies": [], + "events_after": [], + "note": "zone_37_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 33.118, + "step": "zone_37", + "dir": "tx", + "session": "cmd", + "frame": "*#4*37*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 33.118, + "t_estimated": true, + "step": "zone_37", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 35.236, + "utc": "10:47:21", + "step": "zone_37", + "dir": "result", + "frame": "*#4*37*60##", + "ack": false, + "reply_time_s": 2.118, + "replies": [], + "events_after": [], + "note": "zone_37_humidity_nack_no_probe" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 37.438, + "step": "zone_38", + "dir": "tx", + "session": "cmd", + "frame": "*#4*38*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 37.438, + "t_estimated": true, + "step": "zone_38", + "dir": "rx", + "session": "cmd", + "frame": "*#4*38*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 37.438, + "t_estimated": true, + "step": "zone_38", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 37.601, + "step": "zone_38", + "dir": "rx", + "session": "evt", + "frame": "*#4*38*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 38's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 37.628, + "utc": "10:47:23", + "step": "zone_38", + "dir": "result", + "frame": "*#4*38*19##", + "ack": true, + "reply_time_s": 0.19, + "replies": [ + "*#4*38*19*0*0##" + ], + "events_after": [ + "*#4*38*19*0*0##" + ], + "note": "zone_38_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 38.829, + "step": "zone_38", + "dir": "tx", + "session": "cmd", + "frame": "*#4*38*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 38.829, + "t_estimated": true, + "step": "zone_38", + "dir": "rx", + "session": "cmd", + "frame": "*#4*38#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 38.829, + "t_estimated": true, + "step": "zone_38", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 38.984, + "step": "zone_38", + "dir": "rx", + "session": "evt", + "frame": "*#4*38#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 38's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 39.0, + "utc": "10:47:25", + "step": "zone_38", + "dir": "result", + "frame": "*#4*38*20##", + "ack": true, + "reply_time_s": 0.171, + "replies": [ + "*#4*38#1*20*0##" + ], + "events_after": [ + "*#4*38#1*20*0##" + ], + "note": "zone_38_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 40.201, + "step": "zone_38", + "dir": "tx", + "session": "cmd", + "frame": "*#4*38*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 40.201, + "t_estimated": true, + "step": "zone_38", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 42.326, + "utc": "10:47:28", + "step": "zone_38", + "dir": "result", + "frame": "*#4*38*11##", + "ack": false, + "reply_time_s": 2.125, + "replies": [], + "events_after": [], + "note": "zone_38_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 43.527, + "step": "zone_38", + "dir": "tx", + "session": "cmd", + "frame": "*#4*38*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 43.527, + "t_estimated": true, + "step": "zone_38", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 45.665, + "utc": "10:47:31", + "step": "zone_38", + "dir": "result", + "frame": "*#4*38*60##", + "ack": false, + "reply_time_s": 2.138, + "replies": [], + "events_after": [], + "note": "zone_38_humidity_nack_no_probe" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 47.867, + "step": "zone_39", + "dir": "tx", + "session": "cmd", + "frame": "*#4*39*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 47.867, + "t_estimated": true, + "step": "zone_39", + "dir": "rx", + "session": "cmd", + "frame": "*#4*39*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 47.867, + "t_estimated": true, + "step": "zone_39", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 48.058, + "step": "zone_39", + "dir": "rx", + "session": "evt", + "frame": "*#4*39*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 39's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 48.083, + "utc": "10:47:34", + "step": "zone_39", + "dir": "result", + "frame": "*#4*39*19##", + "ack": true, + "reply_time_s": 0.216, + "replies": [ + "*#4*39*19*0*0##" + ], + "events_after": [ + "*#4*39*19*0*0##" + ], + "note": "zone_39_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 49.284, + "step": "zone_39", + "dir": "tx", + "session": "cmd", + "frame": "*#4*39*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 49.284, + "t_estimated": true, + "step": "zone_39", + "dir": "rx", + "session": "cmd", + "frame": "*#4*39#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 49.284, + "t_estimated": true, + "step": "zone_39", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 49.435, + "step": "zone_39", + "dir": "rx", + "session": "evt", + "frame": "*#4*39#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 39's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 49.464, + "utc": "10:47:35", + "step": "zone_39", + "dir": "result", + "frame": "*#4*39*20##", + "ack": true, + "reply_time_s": 0.18, + "replies": [ + "*#4*39#1*20*0##" + ], + "events_after": [ + "*#4*39#1*20*0##" + ], + "note": "zone_39_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 50.665, + "step": "zone_39", + "dir": "tx", + "session": "cmd", + "frame": "*#4*39*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 50.665, + "t_estimated": true, + "step": "zone_39", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 52.764, + "utc": "10:47:38", + "step": "zone_39", + "dir": "result", + "frame": "*#4*39*11##", + "ack": false, + "reply_time_s": 2.099, + "replies": [], + "events_after": [], + "note": "zone_39_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 53.965, + "step": "zone_39", + "dir": "tx", + "session": "cmd", + "frame": "*#4*39*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 53.965, + "t_estimated": true, + "step": "zone_39", + "dir": "rx", + "session": "cmd", + "frame": "*#4*39*60*47##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 53.965, + "t_estimated": true, + "step": "zone_39", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 54.145, + "step": "zone_39", + "dir": "rx", + "session": "evt", + "frame": "*#4*39*60*47##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 39's main sensor is reporting a humidity of 47.0%." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 54.18, + "utc": "10:47:40", + "step": "zone_39", + "dir": "result", + "frame": "*#4*39*60##", + "ack": true, + "reply_time_s": 0.215, + "replies": [ + "*#4*39*60*47##" + ], + "events_after": [ + "*#4*39*60*47##" + ], + "note": "zone_39_humidity_ack_47" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 55.705, + "step": "zone_39", + "dir": "rx", + "session": "evt", + "frame": "*4*4002#35*0#1##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 0's mode is unknown." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 55.741, + "step": "zone_39", + "dir": "rx", + "session": "evt", + "frame": "*4*4002*35##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 35's mode is unknown." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 56.382, + "step": "zone_40", + "dir": "tx", + "session": "cmd", + "frame": "*#4*40*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 56.382, + "t_estimated": true, + "step": "zone_40", + "dir": "rx", + "session": "cmd", + "frame": "*#4*40*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 56.382, + "t_estimated": true, + "step": "zone_40", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 56.545, + "step": "zone_40", + "dir": "rx", + "session": "evt", + "frame": "*#4*40*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 40's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 56.57, + "utc": "10:47:42", + "step": "zone_40", + "dir": "result", + "frame": "*#4*40*19##", + "ack": true, + "reply_time_s": 0.188, + "replies": [ + "*#4*40*19*0*0##" + ], + "events_after": [ + "*#4*40*19*0*0##" + ], + "note": "zone_40_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 57.689, + "step": "zone_40", + "dir": "rx", + "session": "evt", + "frame": "*#4*35#1*#20*0##", + "ownd_class": "OWNHeatingCommand", + "ownd_log": "*#4*35#1*#20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 57.727, + "step": "zone_40", + "dir": "rx", + "session": "evt", + "frame": "*#4*35#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 35's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 57.771, + "step": "zone_40", + "dir": "tx", + "session": "cmd", + "frame": "*#4*40*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 57.771, + "t_estimated": true, + "step": "zone_40", + "dir": "rx", + "session": "cmd", + "frame": "*#4*40#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 57.771, + "t_estimated": true, + "step": "zone_40", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 57.907, + "step": "zone_40", + "dir": "rx", + "session": "evt", + "frame": "*#4*40#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 40's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 57.937, + "utc": "10:47:43", + "step": "zone_40", + "dir": "result", + "frame": "*#4*40*20##", + "ack": true, + "reply_time_s": 0.166, + "replies": [ + "*#4*40#1*20*0##" + ], + "events_after": [ + "*#4*40#1*20*0##" + ], + "note": "zone_40_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 57.951, + "step": "zone_40", + "dir": "rx", + "session": "evt", + "frame": "*#4*40#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 40's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 59.138, + "step": "zone_40", + "dir": "tx", + "session": "cmd", + "frame": "*#4*40*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 59.138, + "t_estimated": true, + "step": "zone_40", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 61.325, + "utc": "10:47:47", + "step": "zone_40", + "dir": "result", + "frame": "*#4*40*11##", + "ack": false, + "reply_time_s": 2.187, + "replies": [], + "events_after": [], + "note": "zone_40_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 62.526, + "step": "zone_40", + "dir": "tx", + "session": "cmd", + "frame": "*#4*40*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 62.526, + "t_estimated": true, + "step": "zone_40", + "dir": "rx", + "session": "cmd", + "frame": "*#4*40*60*48##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 62.526, + "t_estimated": true, + "step": "zone_40", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 62.707, + "step": "zone_40", + "dir": "rx", + "session": "evt", + "frame": "*#4*40*60*48##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 40's main sensor is reporting a humidity of 48.0%." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 62.735, + "utc": "10:47:48", + "step": "zone_40", + "dir": "result", + "frame": "*#4*40*60##", + "ack": true, + "reply_time_s": 0.209, + "replies": [ + "*#4*40*60*48##" + ], + "events_after": [ + "*#4*40*60*48##" + ], + "note": "zone_40_humidity_ack_48" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 64.936, + "step": "zone_41", + "dir": "tx", + "session": "cmd", + "frame": "*#4*41*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 64.936, + "t_estimated": true, + "step": "zone_41", + "dir": "rx", + "session": "cmd", + "frame": "*#4*41*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 64.936, + "t_estimated": true, + "step": "zone_41", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 65.087, + "step": "zone_41", + "dir": "rx", + "session": "evt", + "frame": "*#4*41*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 41's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 65.106, + "utc": "10:47:51", + "step": "zone_41", + "dir": "result", + "frame": "*#4*41*19##", + "ack": true, + "reply_time_s": 0.17, + "replies": [ + "*#4*41*19*0*0##" + ], + "events_after": [ + "*#4*41*19*0*0##" + ], + "note": "zone_41_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 66.307, + "step": "zone_41", + "dir": "tx", + "session": "cmd", + "frame": "*#4*41*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 66.307, + "t_estimated": true, + "step": "zone_41", + "dir": "rx", + "session": "cmd", + "frame": "*#4*41#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 66.307, + "t_estimated": true, + "step": "zone_41", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 66.465, + "step": "zone_41", + "dir": "rx", + "session": "evt", + "frame": "*#4*41#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 41's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 66.489, + "utc": "10:47:52", + "step": "zone_41", + "dir": "result", + "frame": "*#4*41*20##", + "ack": true, + "reply_time_s": 0.182, + "replies": [ + "*#4*41#1*20*0##" + ], + "events_after": [ + "*#4*41#1*20*0##" + ], + "note": "zone_41_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 67.69, + "step": "zone_41", + "dir": "tx", + "session": "cmd", + "frame": "*#4*41*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 67.69, + "t_estimated": true, + "step": "zone_41", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 69.275, + "step": "zone_41", + "dir": "rx", + "session": "evt", + "frame": "*1*1000#1*63##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "*1*1000#1*63##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 69.295, + "step": "zone_41", + "dir": "rx", + "session": "evt", + "frame": "*1*1*63##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 63 is switched on." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 71.327, + "utc": "10:47:57", + "step": "zone_41", + "dir": "result", + "frame": "*#4*41*11##", + "ack": false, + "reply_time_s": 3.637, + "replies": [], + "events_after": [ + "*1*1000#1*63##", + "*1*1*63##" + ], + "note": "zone_41_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 72.528, + "step": "zone_41", + "dir": "tx", + "session": "cmd", + "frame": "*#4*41*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 72.528, + "t_estimated": true, + "step": "zone_41", + "dir": "rx", + "session": "cmd", + "frame": "*#4*41*60*43##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 72.528, + "t_estimated": true, + "step": "zone_41", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 72.695, + "step": "zone_41", + "dir": "rx", + "session": "evt", + "frame": "*#4*41*60*43##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 41's main sensor is reporting a humidity of 43.0%." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 72.731, + "utc": "10:47:58", + "step": "zone_41", + "dir": "result", + "frame": "*#4*41*60##", + "ack": true, + "reply_time_s": 0.203, + "replies": [ + "*#4*41*60*43##" + ], + "events_after": [ + "*#4*41*60*43##" + ], + "note": "zone_41_humidity_ack_43" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 74.933, + "step": "zone_42", + "dir": "tx", + "session": "cmd", + "frame": "*#4*42*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 74.933, + "t_estimated": true, + "step": "zone_42", + "dir": "rx", + "session": "cmd", + "frame": "*#4*42*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 74.933, + "t_estimated": true, + "step": "zone_42", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 75.098, + "step": "zone_42", + "dir": "rx", + "session": "evt", + "frame": "*#4*42*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 42's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 75.13, + "utc": "10:48:01", + "step": "zone_42", + "dir": "result", + "frame": "*#4*42*19##", + "ack": true, + "reply_time_s": 0.197, + "replies": [ + "*#4*42*19*0*0##" + ], + "events_after": [ + "*#4*42*19*0*0##" + ], + "note": "zone_42_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 76.331, + "step": "zone_42", + "dir": "tx", + "session": "cmd", + "frame": "*#4*42*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 76.331, + "t_estimated": true, + "step": "zone_42", + "dir": "rx", + "session": "cmd", + "frame": "*#4*42#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 76.331, + "t_estimated": true, + "step": "zone_42", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 76.465, + "step": "zone_42", + "dir": "rx", + "session": "evt", + "frame": "*#4*42#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 42's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 76.508, + "utc": "10:48:02", + "step": "zone_42", + "dir": "result", + "frame": "*#4*42*20##", + "ack": true, + "reply_time_s": 0.177, + "replies": [ + "*#4*42#1*20*0##" + ], + "events_after": [ + "*#4*42#1*20*0##" + ], + "note": "zone_42_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 76.531, + "step": "zone_42", + "dir": "rx", + "session": "evt", + "frame": "*#4*42#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 42's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 77.709, + "step": "zone_42", + "dir": "tx", + "session": "cmd", + "frame": "*#4*42*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 77.709, + "t_estimated": true, + "step": "zone_42", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 79.815, + "utc": "10:48:05", + "step": "zone_42", + "dir": "result", + "frame": "*#4*42*11##", + "ack": false, + "reply_time_s": 2.106, + "replies": [], + "events_after": [], + "note": "zone_42_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 81.017, + "step": "zone_42", + "dir": "tx", + "session": "cmd", + "frame": "*#4*42*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 81.017, + "t_estimated": true, + "step": "zone_42", + "dir": "rx", + "session": "cmd", + "frame": "*#4*42*60*51##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 81.017, + "t_estimated": true, + "step": "zone_42", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 81.213, + "step": "zone_42", + "dir": "rx", + "session": "evt", + "frame": "*#4*42*60*51##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 42's main sensor is reporting a humidity of 51.0%." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 81.251, + "utc": "10:48:07", + "step": "zone_42", + "dir": "result", + "frame": "*#4*42*60##", + "ack": true, + "reply_time_s": 0.234, + "replies": [ + "*#4*42*60*51##" + ], + "events_after": [ + "*#4*42*60*51##" + ], + "note": "zone_42_humidity_ack_51" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 83.453, + "step": "zone_43", + "dir": "tx", + "session": "cmd", + "frame": "*#4*43*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 83.453, + "t_estimated": true, + "step": "zone_43", + "dir": "rx", + "session": "cmd", + "frame": "*#4*43*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 83.453, + "t_estimated": true, + "step": "zone_43", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 83.606, + "step": "zone_43", + "dir": "rx", + "session": "evt", + "frame": "*#4*43*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 43's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 83.633, + "utc": "10:48:09", + "step": "zone_43", + "dir": "result", + "frame": "*#4*43*19##", + "ack": true, + "reply_time_s": 0.18, + "replies": [ + "*#4*43*19*0*0##" + ], + "events_after": [ + "*#4*43*19*0*0##" + ], + "note": "zone_43_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 84.834, + "step": "zone_43", + "dir": "tx", + "session": "cmd", + "frame": "*#4*43*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 84.834, + "t_estimated": true, + "step": "zone_43", + "dir": "rx", + "session": "cmd", + "frame": "*#4*43#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 84.834, + "t_estimated": true, + "step": "zone_43", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 84.994, + "step": "zone_43", + "dir": "rx", + "session": "evt", + "frame": "*#4*43#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 43's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 85.015, + "utc": "10:48:11", + "step": "zone_43", + "dir": "result", + "frame": "*#4*43*20##", + "ack": true, + "reply_time_s": 0.181, + "replies": [ + "*#4*43#1*20*0##" + ], + "events_after": [ + "*#4*43#1*20*0##" + ], + "note": "zone_43_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 86.215, + "step": "zone_43", + "dir": "tx", + "session": "cmd", + "frame": "*#4*43*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 86.215, + "t_estimated": true, + "step": "zone_43", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 86.974, + "step": "zone_43", + "dir": "rx", + "session": "evt", + "frame": "*1*1000#0*63##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "*1*1000#0*63##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 87.035, + "step": "zone_43", + "dir": "rx", + "session": "evt", + "frame": "*1*0*63##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 63 is switched off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 89.066, + "utc": "10:48:15", + "step": "zone_43", + "dir": "result", + "frame": "*#4*43*11##", + "ack": false, + "reply_time_s": 2.851, + "replies": [], + "events_after": [ + "*1*1000#0*63##", + "*1*0*63##" + ], + "note": "zone_43_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 90.267, + "step": "zone_43", + "dir": "tx", + "session": "cmd", + "frame": "*#4*43*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 90.267, + "t_estimated": true, + "step": "zone_43", + "dir": "rx", + "session": "cmd", + "frame": "*#4*43*60*55##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 90.267, + "t_estimated": true, + "step": "zone_43", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 90.475, + "step": "zone_43", + "dir": "rx", + "session": "evt", + "frame": "*#4*43*60*55##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 43's main sensor is reporting a humidity of 55.0%." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 90.529, + "utc": "10:48:16", + "step": "zone_43", + "dir": "result", + "frame": "*#4*43*60##", + "ack": true, + "reply_time_s": 0.262, + "replies": [ + "*#4*43*60*55##" + ], + "events_after": [ + "*#4*43*60*55##" + ], + "note": "zone_43_humidity_ack_55" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 92.731, + "step": "zone_44", + "dir": "tx", + "session": "cmd", + "frame": "*#4*44*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 92.731, + "t_estimated": true, + "step": "zone_44", + "dir": "rx", + "session": "cmd", + "frame": "*#4*44*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 92.731, + "t_estimated": true, + "step": "zone_44", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 92.898, + "step": "zone_44", + "dir": "rx", + "session": "evt", + "frame": "*#4*44*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 44's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 92.916, + "utc": "10:48:18", + "step": "zone_44", + "dir": "result", + "frame": "*#4*44*19##", + "ack": true, + "reply_time_s": 0.185, + "replies": [ + "*#4*44*19*0*0##" + ], + "events_after": [ + "*#4*44*19*0*0##" + ], + "note": "zone_44_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 94.117, + "step": "zone_44", + "dir": "tx", + "session": "cmd", + "frame": "*#4*44*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 94.117, + "t_estimated": true, + "step": "zone_44", + "dir": "rx", + "session": "cmd", + "frame": "*#4*44#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 94.117, + "t_estimated": true, + "step": "zone_44", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 94.258, + "step": "zone_44", + "dir": "rx", + "session": "evt", + "frame": "*#4*44#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 44's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 94.277, + "utc": "10:48:20", + "step": "zone_44", + "dir": "result", + "frame": "*#4*44*20##", + "ack": true, + "reply_time_s": 0.16, + "replies": [ + "*#4*44#1*20*0##" + ], + "events_after": [ + "*#4*44#1*20*0##" + ], + "note": "zone_44_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 95.478, + "step": "zone_44", + "dir": "tx", + "session": "cmd", + "frame": "*#4*44*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 95.478, + "t_estimated": true, + "step": "zone_44", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 97.572, + "utc": "10:48:23", + "step": "zone_44", + "dir": "result", + "frame": "*#4*44*11##", + "ack": false, + "reply_time_s": 2.094, + "replies": [], + "events_after": [], + "note": "zone_44_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 98.772, + "step": "zone_44", + "dir": "tx", + "session": "cmd", + "frame": "*#4*44*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 98.772, + "t_estimated": true, + "step": "zone_44", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 100.917, + "utc": "10:48:26", + "step": "zone_44", + "dir": "result", + "frame": "*#4*44*60##", + "ack": false, + "reply_time_s": 2.145, + "replies": [], + "events_after": [], + "note": "zone_44_humidity_nack_no_probe" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 103.119, + "step": "zone_45", + "dir": "tx", + "session": "cmd", + "frame": "*#4*45*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 103.119, + "t_estimated": true, + "step": "zone_45", + "dir": "rx", + "session": "cmd", + "frame": "*#4*45*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 103.119, + "t_estimated": true, + "step": "zone_45", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 103.287, + "step": "zone_45", + "dir": "rx", + "session": "evt", + "frame": "*#4*45*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 45's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 103.332, + "utc": "10:48:29", + "step": "zone_45", + "dir": "result", + "frame": "*#4*45*19##", + "ack": true, + "reply_time_s": 0.213, + "replies": [ + "*#4*45*19*0*0##" + ], + "events_after": [ + "*#4*45*19*0*0##" + ], + "note": "zone_45_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 104.534, + "step": "zone_45", + "dir": "tx", + "session": "cmd", + "frame": "*#4*45*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 104.534, + "t_estimated": true, + "step": "zone_45", + "dir": "rx", + "session": "cmd", + "frame": "*#4*45#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 104.534, + "t_estimated": true, + "step": "zone_45", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 104.675, + "step": "zone_45", + "dir": "rx", + "session": "evt", + "frame": "*#4*45#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 45's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 104.713, + "utc": "10:48:30", + "step": "zone_45", + "dir": "result", + "frame": "*#4*45*20##", + "ack": true, + "reply_time_s": 0.179, + "replies": [ + "*#4*45#1*20*0##" + ], + "events_after": [ + "*#4*45#1*20*0##" + ], + "note": "zone_45_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 105.432, + "step": "zone_45", + "dir": "rx", + "session": "evt", + "frame": "*4*4002#53*0#3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 0's mode is unknown." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 105.507, + "step": "zone_45", + "dir": "rx", + "session": "evt", + "frame": "*4*4002*53##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 53's mode is unknown." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 105.912, + "step": "zone_45", + "dir": "tx", + "session": "cmd", + "frame": "*#4*45*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 105.912, + "t_estimated": true, + "step": "zone_45", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 107.454, + "step": "zone_45", + "dir": "rx", + "session": "evt", + "frame": "*#4*53#1*#20*0##", + "ownd_class": "OWNHeatingCommand", + "ownd_log": "*#4*53#1*#20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 107.489, + "step": "zone_45", + "dir": "rx", + "session": "evt", + "frame": "*#4*53#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 53's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 109.491, + "utc": "10:48:35", + "step": "zone_45", + "dir": "result", + "frame": "*#4*45*11##", + "ack": false, + "reply_time_s": 3.579, + "replies": [], + "events_after": [ + "*#4*53#1*#20*0##", + "*#4*53#1*20*0##" + ], + "note": "zone_45_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 110.692, + "step": "zone_45", + "dir": "tx", + "session": "cmd", + "frame": "*#4*45*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 110.692, + "t_estimated": true, + "step": "zone_45", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 112.845, + "utc": "10:48:38", + "step": "zone_45", + "dir": "result", + "frame": "*#4*45*60##", + "ack": false, + "reply_time_s": 2.153, + "replies": [], + "events_after": [], + "note": "zone_45_humidity_nack_no_probe" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 115.047, + "step": "zone_46", + "dir": "tx", + "session": "cmd", + "frame": "*#4*46*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 115.047, + "t_estimated": true, + "step": "zone_46", + "dir": "rx", + "session": "cmd", + "frame": "*#4*46*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 115.047, + "t_estimated": true, + "step": "zone_46", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 115.213, + "step": "zone_46", + "dir": "rx", + "session": "evt", + "frame": "*#4*46*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 46's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 115.269, + "utc": "10:48:41", + "step": "zone_46", + "dir": "result", + "frame": "*#4*46*19##", + "ack": true, + "reply_time_s": 0.222, + "replies": [ + "*#4*46*19*0*0##" + ], + "events_after": [ + "*#4*46*19*0*0##" + ], + "note": "zone_46_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 116.47, + "step": "zone_46", + "dir": "tx", + "session": "cmd", + "frame": "*#4*46*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 116.47, + "t_estimated": true, + "step": "zone_46", + "dir": "rx", + "session": "cmd", + "frame": "*#4*46#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 116.47, + "t_estimated": true, + "step": "zone_46", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 116.626, + "step": "zone_46", + "dir": "rx", + "session": "evt", + "frame": "*#4*46#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 46's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 116.65, + "utc": "10:48:42", + "step": "zone_46", + "dir": "result", + "frame": "*#4*46*20##", + "ack": true, + "reply_time_s": 0.18, + "replies": [ + "*#4*46#1*20*0##" + ], + "events_after": [ + "*#4*46#1*20*0##" + ], + "note": "zone_46_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 117.851, + "step": "zone_46", + "dir": "tx", + "session": "cmd", + "frame": "*#4*46*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 117.851, + "t_estimated": true, + "step": "zone_46", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 119.966, + "utc": "10:48:45", + "step": "zone_46", + "dir": "result", + "frame": "*#4*46*11##", + "ack": false, + "reply_time_s": 2.115, + "replies": [], + "events_after": [], + "note": "zone_46_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 121.166, + "step": "zone_46", + "dir": "tx", + "session": "cmd", + "frame": "*#4*46*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 121.166, + "t_estimated": true, + "step": "zone_46", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 121.958, + "step": "zone_46", + "dir": "rx", + "session": "evt", + "frame": "*#4*53*60*60##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 53's main sensor is reporting a humidity of 60.0%." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 123.972, + "utc": "10:48:49", + "step": "zone_46", + "dir": "result", + "frame": "*#4*46*60##", + "ack": false, + "reply_time_s": 2.806, + "replies": [], + "events_after": [ + "*#4*53*60*60##" + ], + "note": "zone_46_humidity_nack_no_probe" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 126.174, + "step": "zone_47", + "dir": "tx", + "session": "cmd", + "frame": "*#4*47*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 126.174, + "t_estimated": true, + "step": "zone_47", + "dir": "rx", + "session": "cmd", + "frame": "*#4*47*19*5*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 126.174, + "t_estimated": true, + "step": "zone_47", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 126.358, + "step": "zone_47", + "dir": "rx", + "session": "evt", + "frame": "*#4*47*19*5*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 47's cooling fan is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 126.386, + "utc": "10:48:52", + "step": "zone_47", + "dir": "result", + "frame": "*#4*47*19##", + "ack": true, + "reply_time_s": 0.212, + "replies": [ + "*#4*47*19*5*0##" + ], + "events_after": [ + "*#4*47*19*5*0##" + ], + "note": "zone_47_valves_status_ack_5_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 127.589, + "step": "zone_47", + "dir": "tx", + "session": "cmd", + "frame": "*#4*47*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 127.589, + "t_estimated": true, + "step": "zone_47", + "dir": "rx", + "session": "cmd", + "frame": "*#4*47#2*20*5##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 127.589, + "t_estimated": true, + "step": "zone_47", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 127.726, + "step": "zone_47", + "dir": "rx", + "session": "evt", + "frame": "*#4*47#2*20*5##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 47's fan is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 127.762, + "utc": "10:48:53", + "step": "zone_47", + "dir": "result", + "frame": "*#4*47*20##", + "ack": true, + "reply_time_s": 0.173, + "replies": [ + "*#4*47#2*20*5##" + ], + "events_after": [ + "*#4*47#2*20*5##" + ], + "note": "zone_47_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 127.781, + "step": "zone_47", + "dir": "rx", + "session": "evt", + "frame": "*#4*47#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 47's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 128.963, + "step": "zone_47", + "dir": "tx", + "session": "cmd", + "frame": "*#4*47*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 128.963, + "t_estimated": true, + "step": "zone_47", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 131.066, + "utc": "10:48:57", + "step": "zone_47", + "dir": "result", + "frame": "*#4*47*11##", + "ack": false, + "reply_time_s": 2.103, + "replies": [], + "events_after": [], + "note": "zone_47_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 132.268, + "step": "zone_47", + "dir": "tx", + "session": "cmd", + "frame": "*#4*47*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 132.268, + "t_estimated": true, + "step": "zone_47", + "dir": "rx", + "session": "cmd", + "frame": "*#4*47*60*58##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 132.268, + "t_estimated": true, + "step": "zone_47", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 132.424, + "step": "zone_47", + "dir": "rx", + "session": "evt", + "frame": "*#4*47*60*58##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 47's main sensor is reporting a humidity of 58.0%." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 132.459, + "utc": "10:48:58", + "step": "zone_47", + "dir": "result", + "frame": "*#4*47*60##", + "ack": true, + "reply_time_s": 0.191, + "replies": [ + "*#4*47*60*58##" + ], + "events_after": [ + "*#4*47*60*58##" + ], + "note": "zone_47_humidity_ack_58" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 134.66, + "step": "zone_48", + "dir": "tx", + "session": "cmd", + "frame": "*#4*48*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 134.66, + "t_estimated": true, + "step": "zone_48", + "dir": "rx", + "session": "cmd", + "frame": "*#4*48*19*5*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 134.66, + "t_estimated": true, + "step": "zone_48", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 134.81, + "step": "zone_48", + "dir": "rx", + "session": "evt", + "frame": "*#4*48*19*5*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 48's cooling fan is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 134.855, + "utc": "10:49:00", + "step": "zone_48", + "dir": "result", + "frame": "*#4*48*19##", + "ack": true, + "reply_time_s": 0.195, + "replies": [ + "*#4*48*19*5*0##" + ], + "events_after": [ + "*#4*48*19*5*0##" + ], + "note": "zone_48_valves_status_ack_5_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 136.057, + "step": "zone_48", + "dir": "tx", + "session": "cmd", + "frame": "*#4*48*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 136.057, + "t_estimated": true, + "step": "zone_48", + "dir": "rx", + "session": "cmd", + "frame": "*#4*48#2*20*5##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 136.057, + "t_estimated": true, + "step": "zone_48", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 136.202, + "step": "zone_48", + "dir": "rx", + "session": "evt", + "frame": "*#4*48#2*20*5##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 48's fan is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 136.234, + "utc": "10:49:02", + "step": "zone_48", + "dir": "result", + "frame": "*#4*48*20##", + "ack": true, + "reply_time_s": 0.177, + "replies": [ + "*#4*48#2*20*5##" + ], + "events_after": [ + "*#4*48#2*20*5##" + ], + "note": "zone_48_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 136.245, + "step": "zone_48", + "dir": "rx", + "session": "evt", + "frame": "*#4*48#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 48's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 137.434, + "step": "zone_48", + "dir": "tx", + "session": "cmd", + "frame": "*#4*48*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 137.434, + "t_estimated": true, + "step": "zone_48", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 139.555, + "utc": "10:49:05", + "step": "zone_48", + "dir": "result", + "frame": "*#4*48*11##", + "ack": false, + "reply_time_s": 2.121, + "replies": [], + "events_after": [], + "note": "zone_48_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 140.757, + "step": "zone_48", + "dir": "tx", + "session": "cmd", + "frame": "*#4*48*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 140.757, + "t_estimated": true, + "step": "zone_48", + "dir": "rx", + "session": "cmd", + "frame": "*#4*48*60*53##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 140.757, + "t_estimated": true, + "step": "zone_48", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 140.956, + "step": "zone_48", + "dir": "rx", + "session": "evt", + "frame": "*#4*48*60*53##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 48's main sensor is reporting a humidity of 53.0%." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 140.992, + "utc": "10:49:07", + "step": "zone_48", + "dir": "result", + "frame": "*#4*48*60##", + "ack": true, + "reply_time_s": 0.235, + "replies": [ + "*#4*48*60*53##" + ], + "events_after": [ + "*#4*48*60*53##" + ], + "note": "zone_48_humidity_ack_53" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 143.194, + "step": "zone_49", + "dir": "tx", + "session": "cmd", + "frame": "*#4*49*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 143.194, + "t_estimated": true, + "step": "zone_49", + "dir": "rx", + "session": "cmd", + "frame": "*#4*49*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 143.194, + "t_estimated": true, + "step": "zone_49", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 143.385, + "step": "zone_49", + "dir": "rx", + "session": "evt", + "frame": "*#4*49*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 49's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 143.417, + "utc": "10:49:09", + "step": "zone_49", + "dir": "result", + "frame": "*#4*49*19##", + "ack": true, + "reply_time_s": 0.223, + "replies": [ + "*#4*49*19*0*0##" + ], + "events_after": [ + "*#4*49*19*0*0##" + ], + "note": "zone_49_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 144.618, + "step": "zone_49", + "dir": "tx", + "session": "cmd", + "frame": "*#4*49*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 144.618, + "t_estimated": true, + "step": "zone_49", + "dir": "rx", + "session": "cmd", + "frame": "*#4*49#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 144.618, + "t_estimated": true, + "step": "zone_49", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 144.786, + "step": "zone_49", + "dir": "rx", + "session": "evt", + "frame": "*#4*49#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 49's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 144.811, + "utc": "10:49:10", + "step": "zone_49", + "dir": "result", + "frame": "*#4*49*20##", + "ack": true, + "reply_time_s": 0.193, + "replies": [ + "*#4*49#1*20*0##" + ], + "events_after": [ + "*#4*49#1*20*0##" + ], + "note": "zone_49_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 146.012, + "step": "zone_49", + "dir": "tx", + "session": "cmd", + "frame": "*#4*49*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 146.012, + "t_estimated": true, + "step": "zone_49", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 148.116, + "utc": "10:49:14", + "step": "zone_49", + "dir": "result", + "frame": "*#4*49*11##", + "ack": false, + "reply_time_s": 2.104, + "replies": [], + "events_after": [], + "note": "zone_49_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 149.318, + "step": "zone_49", + "dir": "tx", + "session": "cmd", + "frame": "*#4*49*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 149.318, + "t_estimated": true, + "step": "zone_49", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 151.467, + "utc": "10:49:17", + "step": "zone_49", + "dir": "result", + "frame": "*#4*49*60##", + "ack": false, + "reply_time_s": 2.149, + "replies": [], + "events_after": [], + "note": "zone_49_humidity_nack_no_probe" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 153.668, + "step": "zone_50", + "dir": "tx", + "session": "cmd", + "frame": "*#4*50*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 153.668, + "t_estimated": true, + "step": "zone_50", + "dir": "rx", + "session": "cmd", + "frame": "*#4*50*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 153.668, + "t_estimated": true, + "step": "zone_50", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 153.868, + "step": "zone_50", + "dir": "rx", + "session": "evt", + "frame": "*#4*50*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 50's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 153.901, + "utc": "10:49:19", + "step": "zone_50", + "dir": "result", + "frame": "*#4*50*19##", + "ack": true, + "reply_time_s": 0.233, + "replies": [ + "*#4*50*19*0*0##" + ], + "events_after": [ + "*#4*50*19*0*0##" + ], + "note": "zone_50_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 155.103, + "step": "zone_50", + "dir": "tx", + "session": "cmd", + "frame": "*#4*50*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 155.103, + "t_estimated": true, + "step": "zone_50", + "dir": "rx", + "session": "cmd", + "frame": "*#4*50#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 155.103, + "t_estimated": true, + "step": "zone_50", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 155.275, + "step": "zone_50", + "dir": "rx", + "session": "evt", + "frame": "*#4*50#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 50's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 155.307, + "utc": "10:49:21", + "step": "zone_50", + "dir": "result", + "frame": "*#4*50*20##", + "ack": true, + "reply_time_s": 0.204, + "replies": [ + "*#4*50#1*20*0##" + ], + "events_after": [ + "*#4*50#1*20*0##" + ], + "note": "zone_50_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 156.508, + "step": "zone_50", + "dir": "tx", + "session": "cmd", + "frame": "*#4*50*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 156.508, + "t_estimated": true, + "step": "zone_50", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 158.627, + "utc": "10:49:24", + "step": "zone_50", + "dir": "result", + "frame": "*#4*50*11##", + "ack": false, + "reply_time_s": 2.119, + "replies": [], + "events_after": [], + "note": "zone_50_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 159.827, + "step": "zone_50", + "dir": "tx", + "session": "cmd", + "frame": "*#4*50*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 159.827, + "t_estimated": true, + "step": "zone_50", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 161.957, + "utc": "10:49:27", + "step": "zone_50", + "dir": "result", + "frame": "*#4*50*60##", + "ack": false, + "reply_time_s": 2.13, + "replies": [], + "events_after": [], + "note": "zone_50_humidity_nack_no_probe" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 164.159, + "step": "zone_51", + "dir": "tx", + "session": "cmd", + "frame": "*#4*51*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 164.159, + "t_estimated": true, + "step": "zone_51", + "dir": "rx", + "session": "cmd", + "frame": "*#4*51*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 164.159, + "t_estimated": true, + "step": "zone_51", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 164.365, + "step": "zone_51", + "dir": "rx", + "session": "evt", + "frame": "*#4*51*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 51's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 164.397, + "utc": "10:49:30", + "step": "zone_51", + "dir": "result", + "frame": "*#4*51*19##", + "ack": true, + "reply_time_s": 0.238, + "replies": [ + "*#4*51*19*0*0##" + ], + "events_after": [ + "*#4*51*19*0*0##" + ], + "note": "zone_51_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 165.599, + "step": "zone_51", + "dir": "tx", + "session": "cmd", + "frame": "*#4*51*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 165.599, + "t_estimated": true, + "step": "zone_51", + "dir": "rx", + "session": "cmd", + "frame": "*#4*51#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 165.599, + "t_estimated": true, + "step": "zone_51", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 165.776, + "step": "zone_51", + "dir": "rx", + "session": "evt", + "frame": "*#4*51#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 51's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 165.808, + "step": "zone_51", + "dir": "rx", + "session": "evt", + "frame": "*#4*51#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 51's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 165.819, + "utc": "10:49:31", + "step": "zone_51", + "dir": "result", + "frame": "*#4*51*20##", + "ack": true, + "reply_time_s": 0.22, + "replies": [ + "*#4*51#1*20*0##" + ], + "events_after": [ + "*#4*51#1*20*0##", + "*#4*51#1*20*0##" + ], + "note": "zone_51_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 167.02, + "step": "zone_51", + "dir": "tx", + "session": "cmd", + "frame": "*#4*51*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 167.02, + "t_estimated": true, + "step": "zone_51", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 169.127, + "utc": "10:49:35", + "step": "zone_51", + "dir": "result", + "frame": "*#4*51*11##", + "ack": false, + "reply_time_s": 2.107, + "replies": [], + "events_after": [], + "note": "zone_51_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 170.327, + "step": "zone_51", + "dir": "tx", + "session": "cmd", + "frame": "*#4*51*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 170.327, + "t_estimated": true, + "step": "zone_51", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 172.466, + "utc": "10:49:38", + "step": "zone_51", + "dir": "result", + "frame": "*#4*51*60##", + "ack": false, + "reply_time_s": 2.139, + "replies": [], + "events_after": [], + "note": "zone_51_humidity_nack_no_probe" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 174.668, + "step": "zone_52", + "dir": "tx", + "session": "cmd", + "frame": "*#4*52*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 174.668, + "t_estimated": true, + "step": "zone_52", + "dir": "rx", + "session": "cmd", + "frame": "*#4*52*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 174.668, + "t_estimated": true, + "step": "zone_52", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 174.887, + "step": "zone_52", + "dir": "rx", + "session": "evt", + "frame": "*#4*52*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 52's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 174.917, + "utc": "10:49:40", + "step": "zone_52", + "dir": "result", + "frame": "*#4*52*19##", + "ack": true, + "reply_time_s": 0.249, + "replies": [ + "*#4*52*19*0*0##" + ], + "events_after": [ + "*#4*52*19*0*0##" + ], + "note": "zone_52_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 176.118, + "step": "zone_52", + "dir": "tx", + "session": "cmd", + "frame": "*#4*52*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 176.118, + "t_estimated": true, + "step": "zone_52", + "dir": "rx", + "session": "cmd", + "frame": "*#4*52#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 176.118, + "t_estimated": true, + "step": "zone_52", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 176.289, + "step": "zone_52", + "dir": "rx", + "session": "evt", + "frame": "*#4*52#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 52's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 176.309, + "utc": "10:49:42", + "step": "zone_52", + "dir": "result", + "frame": "*#4*52*20##", + "ack": true, + "reply_time_s": 0.191, + "replies": [ + "*#4*52#1*20*0##" + ], + "events_after": [ + "*#4*52#1*20*0##" + ], + "note": "zone_52_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 177.512, + "step": "zone_52", + "dir": "tx", + "session": "cmd", + "frame": "*#4*52*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 177.512, + "t_estimated": true, + "step": "zone_52", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 179.617, + "utc": "10:49:45", + "step": "zone_52", + "dir": "result", + "frame": "*#4*52*11##", + "ack": false, + "reply_time_s": 2.105, + "replies": [], + "events_after": [], + "note": "zone_52_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 180.818, + "step": "zone_52", + "dir": "tx", + "session": "cmd", + "frame": "*#4*52*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 180.818, + "t_estimated": true, + "step": "zone_52", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 182.967, + "utc": "10:49:48", + "step": "zone_52", + "dir": "result", + "frame": "*#4*52*60##", + "ack": false, + "reply_time_s": 2.149, + "replies": [], + "events_after": [], + "note": "zone_52_humidity_nack_no_probe" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 185.172, + "step": "zone_53", + "dir": "tx", + "session": "cmd", + "frame": "*#4*53*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 185.172, + "t_estimated": true, + "step": "zone_53", + "dir": "rx", + "session": "cmd", + "frame": "*#4*53*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 185.172, + "t_estimated": true, + "step": "zone_53", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 185.368, + "step": "zone_53", + "dir": "rx", + "session": "evt", + "frame": "*#4*53*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 53's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 185.407, + "utc": "10:49:51", + "step": "zone_53", + "dir": "result", + "frame": "*#4*53*19##", + "ack": true, + "reply_time_s": 0.235, + "replies": [ + "*#4*53*19*0*0##" + ], + "events_after": [ + "*#4*53*19*0*0##" + ], + "note": "zone_53_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 186.607, + "step": "zone_53", + "dir": "tx", + "session": "cmd", + "frame": "*#4*53*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 186.607, + "t_estimated": true, + "step": "zone_53", + "dir": "rx", + "session": "cmd", + "frame": "*#4*53#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 186.607, + "t_estimated": true, + "step": "zone_53", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 186.776, + "step": "zone_53", + "dir": "rx", + "session": "evt", + "frame": "*#4*53#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 53's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 186.815, + "utc": "10:49:52", + "step": "zone_53", + "dir": "result", + "frame": "*#4*53*20##", + "ack": true, + "reply_time_s": 0.208, + "replies": [ + "*#4*53#1*20*0##" + ], + "events_after": [ + "*#4*53#1*20*0##" + ], + "note": "zone_53_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 188.015, + "step": "zone_53", + "dir": "tx", + "session": "cmd", + "frame": "*#4*53*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 188.015, + "t_estimated": true, + "step": "zone_53", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 190.135, + "utc": "10:49:56", + "step": "zone_53", + "dir": "result", + "frame": "*#4*53*11##", + "ack": false, + "reply_time_s": 2.12, + "replies": [], + "events_after": [], + "note": "zone_53_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 191.336, + "step": "zone_53", + "dir": "tx", + "session": "cmd", + "frame": "*#4*53*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 191.336, + "t_estimated": true, + "step": "zone_53", + "dir": "rx", + "session": "cmd", + "frame": "*#4*53*60*60##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 191.336, + "t_estimated": true, + "step": "zone_53", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 191.566, + "step": "zone_53", + "dir": "rx", + "session": "evt", + "frame": "*#4*53*60*60##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 53's main sensor is reporting a humidity of 60.0%." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 191.589, + "utc": "10:49:57", + "step": "zone_53", + "dir": "result", + "frame": "*#4*53*60##", + "ack": true, + "reply_time_s": 0.253, + "replies": [ + "*#4*53*60*60##" + ], + "events_after": [ + "*#4*53*60*60##" + ], + "note": "zone_53_humidity_ack_60" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 193.792, + "step": "zone_54", + "dir": "tx", + "session": "cmd", + "frame": "*#4*54*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 193.792, + "t_estimated": true, + "step": "zone_54", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 193.906, + "step": "zone_54", + "dir": "rx", + "session": "evt", + "frame": "*#13**#1*00*25*10*2026##", + "ownd_class": "OWNGatewayCommand", + "ownd_log": "Gateway broadcasting internal date: 2026-10-25." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 193.914, + "step": "zone_54", + "dir": "rx", + "session": "evt", + "frame": "*#13**#0*12*50*00*##", + "ownd_class": "OWNGatewayCommand", + "ownd_log": "Gateway broadcasting internal time: 12:50:00." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 195.904, + "utc": "10:50:01", + "step": "zone_54", + "dir": "result", + "frame": "*#4*54*19##", + "ack": false, + "reply_time_s": 2.112, + "replies": [], + "events_after": [ + "*#13**#1*00*25*10*2026##", + "*#13**#0*12*50*00*##" + ], + "note": "zone_54_valves_status_nack_no_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 197.105, + "step": "zone_54", + "dir": "tx", + "session": "cmd", + "frame": "*#4*54*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 197.105, + "t_estimated": true, + "step": "zone_54", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 199.229, + "utc": "10:50:05", + "step": "zone_54", + "dir": "result", + "frame": "*#4*54*20##", + "ack": false, + "reply_time_s": 2.124, + "replies": [], + "events_after": [], + "note": "zone_54_actuators_nack_no_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 200.43, + "step": "zone_54", + "dir": "tx", + "session": "cmd", + "frame": "*#4*54*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 200.43, + "t_estimated": true, + "step": "zone_54", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 202.554, + "utc": "10:50:08", + "step": "zone_54", + "dir": "result", + "frame": "*#4*54*11##", + "ack": false, + "reply_time_s": 2.124, + "replies": [], + "events_after": [], + "note": "zone_54_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 203.755, + "step": "zone_54", + "dir": "tx", + "session": "cmd", + "frame": "*#4*54*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 203.755, + "t_estimated": true, + "step": "zone_54", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 205.902, + "utc": "10:50:11", + "step": "zone_54", + "dir": "result", + "frame": "*#4*54*60##", + "ack": false, + "reply_time_s": 2.147, + "replies": [], + "events_after": [], + "note": "zone_54_humidity_nack_no_probe" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 208.104, + "step": "zone_55", + "dir": "tx", + "session": "cmd", + "frame": "*#4*55*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 208.104, + "t_estimated": true, + "step": "zone_55", + "dir": "rx", + "session": "cmd", + "frame": "*#4*55*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 208.104, + "t_estimated": true, + "step": "zone_55", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 208.311, + "step": "zone_55", + "dir": "rx", + "session": "evt", + "frame": "*#4*55*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 55's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 208.332, + "utc": "10:50:14", + "step": "zone_55", + "dir": "result", + "frame": "*#4*55*19##", + "ack": true, + "reply_time_s": 0.228, + "replies": [ + "*#4*55*19*0*0##" + ], + "events_after": [ + "*#4*55*19*0*0##" + ], + "note": "zone_55_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 209.532, + "step": "zone_55", + "dir": "tx", + "session": "cmd", + "frame": "*#4*55*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 209.532, + "t_estimated": true, + "step": "zone_55", + "dir": "rx", + "session": "cmd", + "frame": "*#4*55#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 209.532, + "t_estimated": true, + "step": "zone_55", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 209.712, + "step": "zone_55", + "dir": "rx", + "session": "evt", + "frame": "*#4*55#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 55's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 209.731, + "utc": "10:50:15", + "step": "zone_55", + "dir": "result", + "frame": "*#4*55*20##", + "ack": true, + "reply_time_s": 0.199, + "replies": [ + "*#4*55#1*20*0##" + ], + "events_after": [ + "*#4*55#1*20*0##" + ], + "note": "zone_55_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 210.932, + "step": "zone_55", + "dir": "tx", + "session": "cmd", + "frame": "*#4*55*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 210.932, + "t_estimated": true, + "step": "zone_55", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 213.034, + "utc": "10:50:19", + "step": "zone_55", + "dir": "result", + "frame": "*#4*55*11##", + "ack": false, + "reply_time_s": 2.102, + "replies": [], + "events_after": [], + "note": "zone_55_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 214.234, + "step": "zone_55", + "dir": "tx", + "session": "cmd", + "frame": "*#4*55*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 214.234, + "t_estimated": true, + "step": "zone_55", + "dir": "rx", + "session": "cmd", + "frame": "*#4*55*60*49##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 214.234, + "t_estimated": true, + "step": "zone_55", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 214.458, + "step": "zone_55", + "dir": "rx", + "session": "evt", + "frame": "*#4*55*60*49##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 55's main sensor is reporting a humidity of 49.0%." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 214.489, + "utc": "10:50:20", + "step": "zone_55", + "dir": "result", + "frame": "*#4*55*60##", + "ack": true, + "reply_time_s": 0.255, + "replies": [ + "*#4*55*60*49##" + ], + "events_after": [ + "*#4*55*60*49##" + ], + "note": "zone_55_humidity_ack_49" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 216.69, + "step": "zone_56", + "dir": "tx", + "session": "cmd", + "frame": "*#4*56*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 216.69, + "t_estimated": true, + "step": "zone_56", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 218.796, + "utc": "10:50:24", + "step": "zone_56", + "dir": "result", + "frame": "*#4*56*19##", + "ack": false, + "reply_time_s": 2.106, + "replies": [], + "events_after": [], + "note": "zone_56_valves_status_nack_no_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 219.997, + "step": "zone_56", + "dir": "tx", + "session": "cmd", + "frame": "*#4*56*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 219.997, + "t_estimated": true, + "step": "zone_56", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 222.117, + "utc": "10:50:28", + "step": "zone_56", + "dir": "result", + "frame": "*#4*56*20##", + "ack": false, + "reply_time_s": 2.12, + "replies": [], + "events_after": [], + "note": "zone_56_actuators_nack_no_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 223.317, + "step": "zone_56", + "dir": "tx", + "session": "cmd", + "frame": "*#4*56*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 223.317, + "t_estimated": true, + "step": "zone_56", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 225.456, + "utc": "10:50:31", + "step": "zone_56", + "dir": "result", + "frame": "*#4*56*11##", + "ack": false, + "reply_time_s": 2.139, + "replies": [], + "events_after": [], + "note": "zone_56_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 225.676, + "step": "zone_56", + "dir": "rx", + "session": "evt", + "frame": "*4*4002#64*0#4##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 0's mode is unknown." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 225.714, + "step": "zone_56", + "dir": "rx", + "session": "evt", + "frame": "*4*4002*64##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 64's mode is unknown." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 226.656, + "step": "zone_56", + "dir": "tx", + "session": "cmd", + "frame": "*#4*56*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 226.656, + "t_estimated": true, + "step": "zone_56", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 227.669, + "step": "zone_56", + "dir": "rx", + "session": "evt", + "frame": "*#4*64#1*#20*0##", + "ownd_class": "OWNHeatingCommand", + "ownd_log": "*#4*64#1*#20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 227.718, + "step": "zone_56", + "dir": "rx", + "session": "evt", + "frame": "*#4*64#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 64's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 229.728, + "utc": "10:50:35", + "step": "zone_56", + "dir": "result", + "frame": "*#4*56*60##", + "ack": false, + "reply_time_s": 3.072, + "replies": [], + "events_after": [ + "*#4*64#1*#20*0##", + "*#4*64#1*20*0##" + ], + "note": "zone_56_humidity_nack_no_probe" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 231.93, + "step": "zone_57", + "dir": "tx", + "session": "cmd", + "frame": "*#4*57*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 231.93, + "t_estimated": true, + "step": "zone_57", + "dir": "rx", + "session": "cmd", + "frame": "*#4*57*19*5*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 231.93, + "t_estimated": true, + "step": "zone_57", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 232.127, + "step": "zone_57", + "dir": "rx", + "session": "evt", + "frame": "*#4*57*19*5*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 57's cooling fan is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 232.165, + "utc": "10:50:38", + "step": "zone_57", + "dir": "result", + "frame": "*#4*57*19##", + "ack": true, + "reply_time_s": 0.235, + "replies": [ + "*#4*57*19*5*0##" + ], + "events_after": [ + "*#4*57*19*5*0##" + ], + "note": "zone_57_valves_status_ack_5_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 233.365, + "step": "zone_57", + "dir": "tx", + "session": "cmd", + "frame": "*#4*57*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 233.365, + "t_estimated": true, + "step": "zone_57", + "dir": "rx", + "session": "cmd", + "frame": "*#4*57#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 233.365, + "t_estimated": true, + "step": "zone_57", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 233.542, + "step": "zone_57", + "dir": "rx", + "session": "evt", + "frame": "*#4*57#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 57's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 233.578, + "utc": "10:50:39", + "step": "zone_57", + "dir": "result", + "frame": "*#4*57*20##", + "ack": true, + "reply_time_s": 0.213, + "replies": [ + "*#4*57#1*20*0##" + ], + "events_after": [ + "*#4*57#1*20*0##" + ], + "note": "zone_57_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 233.586, + "step": "zone_57", + "dir": "rx", + "session": "evt", + "frame": "*#4*57#2*20*5##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 57's fan is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 234.78, + "step": "zone_57", + "dir": "tx", + "session": "cmd", + "frame": "*#4*57*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 234.78, + "t_estimated": true, + "step": "zone_57", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 236.886, + "utc": "10:50:42", + "step": "zone_57", + "dir": "result", + "frame": "*#4*57*11##", + "ack": false, + "reply_time_s": 2.106, + "replies": [], + "events_after": [], + "note": "zone_57_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 238.087, + "step": "zone_57", + "dir": "tx", + "session": "cmd", + "frame": "*#4*57*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 238.087, + "t_estimated": true, + "step": "zone_57", + "dir": "rx", + "session": "cmd", + "frame": "*#4*57*60*51##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 238.087, + "t_estimated": true, + "step": "zone_57", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 238.335, + "step": "zone_57", + "dir": "rx", + "session": "evt", + "frame": "*#4*57*60*51##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 57's main sensor is reporting a humidity of 51.0%." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 238.349, + "utc": "10:50:44", + "step": "zone_57", + "dir": "result", + "frame": "*#4*57*60##", + "ack": true, + "reply_time_s": 0.262, + "replies": [ + "*#4*57*60*51##" + ], + "events_after": [ + "*#4*57*60*51##" + ], + "note": "zone_57_humidity_ack_51" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 240.55, + "step": "zone_58", + "dir": "tx", + "session": "cmd", + "frame": "*#4*58*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 240.55, + "t_estimated": true, + "step": "zone_58", + "dir": "rx", + "session": "cmd", + "frame": "*#4*58*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 240.55, + "t_estimated": true, + "step": "zone_58", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 240.75, + "step": "zone_58", + "dir": "rx", + "session": "evt", + "frame": "*#4*58*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 58's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 240.772, + "utc": "10:50:46", + "step": "zone_58", + "dir": "result", + "frame": "*#4*58*19##", + "ack": true, + "reply_time_s": 0.222, + "replies": [ + "*#4*58*19*0*0##" + ], + "events_after": [ + "*#4*58*19*0*0##" + ], + "note": "zone_58_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 241.973, + "step": "zone_58", + "dir": "tx", + "session": "cmd", + "frame": "*#4*58*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 241.973, + "t_estimated": true, + "step": "zone_58", + "dir": "rx", + "session": "cmd", + "frame": "*#4*58#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 241.973, + "t_estimated": true, + "step": "zone_58", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 242.155, + "step": "zone_58", + "dir": "rx", + "session": "evt", + "frame": "*#4*58#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 58's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 242.185, + "utc": "10:50:48", + "step": "zone_58", + "dir": "result", + "frame": "*#4*58*20##", + "ack": true, + "reply_time_s": 0.212, + "replies": [ + "*#4*58#1*20*0##" + ], + "events_after": [ + "*#4*58#1*20*0##" + ], + "note": "zone_58_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 243.386, + "step": "zone_58", + "dir": "tx", + "session": "cmd", + "frame": "*#4*58*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 243.386, + "t_estimated": true, + "step": "zone_58", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 245.488, + "utc": "10:50:51", + "step": "zone_58", + "dir": "result", + "frame": "*#4*58*11##", + "ack": false, + "reply_time_s": 2.102, + "replies": [], + "events_after": [], + "note": "zone_58_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 246.688, + "step": "zone_58", + "dir": "tx", + "session": "cmd", + "frame": "*#4*58*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 246.688, + "t_estimated": true, + "step": "zone_58", + "dir": "rx", + "session": "cmd", + "frame": "*#4*58*60*57##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 246.688, + "t_estimated": true, + "step": "zone_58", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 246.93, + "step": "zone_58", + "dir": "rx", + "session": "evt", + "frame": "*#4*58*60*57##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 58's main sensor is reporting a humidity of 57.0%." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 246.957, + "utc": "10:50:52", + "step": "zone_58", + "dir": "result", + "frame": "*#4*58*60##", + "ack": true, + "reply_time_s": 0.269, + "replies": [ + "*#4*58*60*57##" + ], + "events_after": [ + "*#4*58*60*57##" + ], + "note": "zone_58_humidity_ack_57" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 249.16, + "step": "zone_59", + "dir": "tx", + "session": "cmd", + "frame": "*#4*59*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 249.16, + "t_estimated": true, + "step": "zone_59", + "dir": "rx", + "session": "cmd", + "frame": "*#4*59*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 249.16, + "t_estimated": true, + "step": "zone_59", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 249.345, + "step": "zone_59", + "dir": "rx", + "session": "evt", + "frame": "*#4*59*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 59's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 249.368, + "utc": "10:50:55", + "step": "zone_59", + "dir": "result", + "frame": "*#4*59*19##", + "ack": true, + "reply_time_s": 0.208, + "replies": [ + "*#4*59*19*0*0##" + ], + "events_after": [ + "*#4*59*19*0*0##" + ], + "note": "zone_59_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 250.568, + "step": "zone_59", + "dir": "tx", + "session": "cmd", + "frame": "*#4*59*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 250.568, + "t_estimated": true, + "step": "zone_59", + "dir": "rx", + "session": "cmd", + "frame": "*#4*59#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 250.568, + "t_estimated": true, + "step": "zone_59", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 250.771, + "step": "zone_59", + "dir": "rx", + "session": "evt", + "frame": "*#4*59#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 59's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 250.794, + "utc": "10:50:56", + "step": "zone_59", + "dir": "result", + "frame": "*#4*59*20##", + "ack": true, + "reply_time_s": 0.226, + "replies": [ + "*#4*59#1*20*0##" + ], + "events_after": [ + "*#4*59#1*20*0##" + ], + "note": "zone_59_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 251.996, + "step": "zone_59", + "dir": "tx", + "session": "cmd", + "frame": "*#4*59*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 251.996, + "t_estimated": true, + "step": "zone_59", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 254.106, + "utc": "10:51:00", + "step": "zone_59", + "dir": "result", + "frame": "*#4*59*11##", + "ack": false, + "reply_time_s": 2.11, + "replies": [], + "events_after": [], + "note": "zone_59_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 255.306, + "step": "zone_59", + "dir": "tx", + "session": "cmd", + "frame": "*#4*59*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 255.306, + "t_estimated": true, + "step": "zone_59", + "dir": "rx", + "session": "cmd", + "frame": "*#4*59*60*66##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 255.306, + "t_estimated": true, + "step": "zone_59", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 255.535, + "step": "zone_59", + "dir": "rx", + "session": "evt", + "frame": "*#4*59*60*66##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 59's main sensor is reporting a humidity of 66.0%." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 255.567, + "utc": "10:51:01", + "step": "zone_59", + "dir": "result", + "frame": "*#4*59*60##", + "ack": true, + "reply_time_s": 0.261, + "replies": [ + "*#4*59*60*66##" + ], + "events_after": [ + "*#4*59*60*66##" + ], + "note": "zone_59_humidity_ack_66" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 257.769, + "step": "zone_60", + "dir": "tx", + "session": "cmd", + "frame": "*#4*60*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 257.769, + "t_estimated": true, + "step": "zone_60", + "dir": "rx", + "session": "cmd", + "frame": "*#4*60*19*5*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 257.769, + "t_estimated": true, + "step": "zone_60", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 257.946, + "step": "zone_60", + "dir": "rx", + "session": "evt", + "frame": "*#4*60*19*5*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 60's cooling fan is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 257.972, + "utc": "10:51:03", + "step": "zone_60", + "dir": "result", + "frame": "*#4*60*19##", + "ack": true, + "reply_time_s": 0.203, + "replies": [ + "*#4*60*19*5*0##" + ], + "events_after": [ + "*#4*60*19*5*0##" + ], + "note": "zone_60_valves_status_ack_5_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 259.173, + "step": "zone_60", + "dir": "tx", + "session": "cmd", + "frame": "*#4*60*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 259.173, + "t_estimated": true, + "step": "zone_60", + "dir": "rx", + "session": "cmd", + "frame": "*#4*60#2*20*5##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 259.173, + "t_estimated": true, + "step": "zone_60", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 259.326, + "step": "zone_60", + "dir": "rx", + "session": "evt", + "frame": "*#4*60#2*20*5##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 60's fan is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 259.368, + "utc": "10:51:05", + "step": "zone_60", + "dir": "result", + "frame": "*#4*60*20##", + "ack": true, + "reply_time_s": 0.195, + "replies": [ + "*#4*60#2*20*5##" + ], + "events_after": [ + "*#4*60#2*20*5##" + ], + "note": "zone_60_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 259.39, + "step": "zone_60", + "dir": "rx", + "session": "evt", + "frame": "*#4*60#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 60's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 260.57, + "step": "zone_60", + "dir": "tx", + "session": "cmd", + "frame": "*#4*60*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 260.57, + "t_estimated": true, + "step": "zone_60", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 262.677, + "utc": "10:51:08", + "step": "zone_60", + "dir": "result", + "frame": "*#4*60*11##", + "ack": false, + "reply_time_s": 2.107, + "replies": [], + "events_after": [], + "note": "zone_60_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 263.877, + "step": "zone_60", + "dir": "tx", + "session": "cmd", + "frame": "*#4*60*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 263.877, + "t_estimated": true, + "step": "zone_60", + "dir": "rx", + "session": "cmd", + "frame": "*#4*60*60*54##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 263.877, + "t_estimated": true, + "step": "zone_60", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 264.081, + "step": "zone_60", + "dir": "rx", + "session": "evt", + "frame": "*#4*60*60*54##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 60's main sensor is reporting a humidity of 54.0%." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 264.106, + "utc": "10:51:10", + "step": "zone_60", + "dir": "result", + "frame": "*#4*60*60##", + "ack": true, + "reply_time_s": 0.229, + "replies": [ + "*#4*60*60*54##" + ], + "events_after": [ + "*#4*60*60*54##" + ], + "note": "zone_60_humidity_ack_54" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 266.311, + "step": "zone_61", + "dir": "tx", + "session": "cmd", + "frame": "*#4*61*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 266.311, + "t_estimated": true, + "step": "zone_61", + "dir": "rx", + "session": "cmd", + "frame": "*#4*61*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 266.311, + "t_estimated": true, + "step": "zone_61", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 266.487, + "step": "zone_61", + "dir": "rx", + "session": "evt", + "frame": "*#4*61*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 61's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 266.529, + "utc": "10:51:12", + "step": "zone_61", + "dir": "result", + "frame": "*#4*61*19##", + "ack": true, + "reply_time_s": 0.218, + "replies": [ + "*#4*61*19*0*0##" + ], + "events_after": [ + "*#4*61*19*0*0##" + ], + "note": "zone_61_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 267.732, + "step": "zone_61", + "dir": "tx", + "session": "cmd", + "frame": "*#4*61*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 267.732, + "t_estimated": true, + "step": "zone_61", + "dir": "rx", + "session": "cmd", + "frame": "*#4*61#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 267.732, + "t_estimated": true, + "step": "zone_61", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 267.913, + "step": "zone_61", + "dir": "rx", + "session": "evt", + "frame": "*#4*61#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 61's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 267.943, + "utc": "10:51:13", + "step": "zone_61", + "dir": "result", + "frame": "*#4*61*20##", + "ack": true, + "reply_time_s": 0.211, + "replies": [ + "*#4*61#1*20*0##" + ], + "events_after": [ + "*#4*61#1*20*0##" + ], + "note": "zone_61_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 269.145, + "step": "zone_61", + "dir": "tx", + "session": "cmd", + "frame": "*#4*61*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 269.145, + "t_estimated": true, + "step": "zone_61", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 271.259, + "utc": "10:51:17", + "step": "zone_61", + "dir": "result", + "frame": "*#4*61*11##", + "ack": false, + "reply_time_s": 2.114, + "replies": [], + "events_after": [], + "note": "zone_61_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 272.462, + "step": "zone_61", + "dir": "tx", + "session": "cmd", + "frame": "*#4*61*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 272.462, + "t_estimated": true, + "step": "zone_61", + "dir": "rx", + "session": "cmd", + "frame": "*#4*61*60*52##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 272.462, + "t_estimated": true, + "step": "zone_61", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 272.676, + "step": "zone_61", + "dir": "rx", + "session": "evt", + "frame": "*#4*61*60*52##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 61's main sensor is reporting a humidity of 52.0%." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 272.735, + "utc": "10:51:18", + "step": "zone_61", + "dir": "result", + "frame": "*#4*61*60##", + "ack": true, + "reply_time_s": 0.273, + "replies": [ + "*#4*61*60*52##" + ], + "events_after": [ + "*#4*61*60*52##" + ], + "note": "zone_61_humidity_ack_52" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 274.939, + "step": "zone_62", + "dir": "tx", + "session": "cmd", + "frame": "*#4*62*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 274.939, + "t_estimated": true, + "step": "zone_62", + "dir": "rx", + "session": "cmd", + "frame": "*#4*62*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 274.939, + "t_estimated": true, + "step": "zone_62", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 275.125, + "step": "zone_62", + "dir": "rx", + "session": "evt", + "frame": "*#4*62*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 62's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 275.164, + "utc": "10:51:21", + "step": "zone_62", + "dir": "result", + "frame": "*#4*62*19##", + "ack": true, + "reply_time_s": 0.225, + "replies": [ + "*#4*62*19*0*0##" + ], + "events_after": [ + "*#4*62*19*0*0##" + ], + "note": "zone_62_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 276.366, + "step": "zone_62", + "dir": "tx", + "session": "cmd", + "frame": "*#4*62*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 276.366, + "t_estimated": true, + "step": "zone_62", + "dir": "rx", + "session": "cmd", + "frame": "*#4*62#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 276.366, + "t_estimated": true, + "step": "zone_62", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 276.521, + "step": "zone_62", + "dir": "rx", + "session": "evt", + "frame": "*#4*62#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 62's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 276.549, + "utc": "10:51:22", + "step": "zone_62", + "dir": "result", + "frame": "*#4*62*20##", + "ack": true, + "reply_time_s": 0.183, + "replies": [ + "*#4*62#1*20*0##" + ], + "events_after": [ + "*#4*62#1*20*0##" + ], + "note": "zone_62_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 277.751, + "step": "zone_62", + "dir": "tx", + "session": "cmd", + "frame": "*#4*62*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 277.751, + "t_estimated": true, + "step": "zone_62", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 279.855, + "utc": "10:51:25", + "step": "zone_62", + "dir": "result", + "frame": "*#4*62*11##", + "ack": false, + "reply_time_s": 2.104, + "replies": [], + "events_after": [], + "note": "zone_62_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 281.056, + "step": "zone_62", + "dir": "tx", + "session": "cmd", + "frame": "*#4*62*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 281.056, + "t_estimated": true, + "step": "zone_62", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 283.214, + "utc": "10:51:29", + "step": "zone_62", + "dir": "result", + "frame": "*#4*62*60##", + "ack": false, + "reply_time_s": 2.158, + "replies": [], + "events_after": [], + "note": "zone_62_humidity_nack_no_probe" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 285.417, + "step": "zone_63", + "dir": "tx", + "session": "cmd", + "frame": "*#4*63*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 285.417, + "t_estimated": true, + "step": "zone_63", + "dir": "rx", + "session": "cmd", + "frame": "*#4*63*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 285.417, + "t_estimated": true, + "step": "zone_63", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 285.625, + "step": "zone_63", + "dir": "rx", + "session": "evt", + "frame": "*#4*63*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 63's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 285.661, + "utc": "10:51:31", + "step": "zone_63", + "dir": "result", + "frame": "*#4*63*19##", + "ack": true, + "reply_time_s": 0.244, + "replies": [ + "*#4*63*19*0*0##" + ], + "events_after": [ + "*#4*63*19*0*0##" + ], + "note": "zone_63_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 286.862, + "step": "zone_63", + "dir": "tx", + "session": "cmd", + "frame": "*#4*63*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 286.862, + "t_estimated": true, + "step": "zone_63", + "dir": "rx", + "session": "cmd", + "frame": "*#4*63#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 286.862, + "t_estimated": true, + "step": "zone_63", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 287.056, + "step": "zone_63", + "dir": "rx", + "session": "evt", + "frame": "*#4*63#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 63's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 287.078, + "utc": "10:51:33", + "step": "zone_63", + "dir": "result", + "frame": "*#4*63*20##", + "ack": true, + "reply_time_s": 0.216, + "replies": [ + "*#4*63#1*20*0##" + ], + "events_after": [ + "*#4*63#1*20*0##" + ], + "note": "zone_63_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 288.28, + "step": "zone_63", + "dir": "tx", + "session": "cmd", + "frame": "*#4*63*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 288.28, + "t_estimated": true, + "step": "zone_63", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 290.382, + "utc": "10:51:36", + "step": "zone_63", + "dir": "result", + "frame": "*#4*63*11##", + "ack": false, + "reply_time_s": 2.102, + "replies": [], + "events_after": [], + "note": "zone_63_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 291.583, + "step": "zone_63", + "dir": "tx", + "session": "cmd", + "frame": "*#4*63*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 291.583, + "t_estimated": true, + "step": "zone_63", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 293.729, + "utc": "10:51:39", + "step": "zone_63", + "dir": "result", + "frame": "*#4*63*60##", + "ack": false, + "reply_time_s": 2.146, + "replies": [], + "events_after": [], + "note": "zone_63_humidity_nack_no_probe" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 295.931, + "step": "zone_64", + "dir": "tx", + "session": "cmd", + "frame": "*#4*64*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 295.931, + "t_estimated": true, + "step": "zone_64", + "dir": "rx", + "session": "cmd", + "frame": "*#4*64*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 295.931, + "t_estimated": true, + "step": "zone_64", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 296.161, + "step": "zone_64", + "dir": "rx", + "session": "evt", + "frame": "*#4*64*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 64's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 296.18, + "utc": "10:51:42", + "step": "zone_64", + "dir": "result", + "frame": "*#4*64*19##", + "ack": true, + "reply_time_s": 0.249, + "replies": [ + "*#4*64*19*0*0##" + ], + "events_after": [ + "*#4*64*19*0*0##" + ], + "note": "zone_64_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 297.382, + "step": "zone_64", + "dir": "tx", + "session": "cmd", + "frame": "*#4*64*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 297.382, + "t_estimated": true, + "step": "zone_64", + "dir": "rx", + "session": "cmd", + "frame": "*#4*64#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 297.382, + "t_estimated": true, + "step": "zone_64", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 297.589, + "step": "zone_64", + "dir": "rx", + "session": "evt", + "frame": "*#4*64#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 64's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 297.608, + "step": "zone_64", + "dir": "rx", + "session": "evt", + "frame": "*#4*64#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 64's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 297.62, + "utc": "10:51:43", + "step": "zone_64", + "dir": "result", + "frame": "*#4*64*20##", + "ack": true, + "reply_time_s": 0.238, + "replies": [ + "*#4*64#1*20*0##" + ], + "events_after": [ + "*#4*64#1*20*0##", + "*#4*64#1*20*0##" + ], + "note": "zone_64_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 298.821, + "step": "zone_64", + "dir": "tx", + "session": "cmd", + "frame": "*#4*64*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 298.821, + "t_estimated": true, + "step": "zone_64", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 300.93, + "utc": "10:51:46", + "step": "zone_64", + "dir": "result", + "frame": "*#4*64*11##", + "ack": false, + "reply_time_s": 2.109, + "replies": [], + "events_after": [], + "note": "zone_64_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 302.132, + "step": "zone_64", + "dir": "tx", + "session": "cmd", + "frame": "*#4*64*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 302.132, + "t_estimated": true, + "step": "zone_64", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 304.269, + "utc": "10:51:50", + "step": "zone_64", + "dir": "result", + "frame": "*#4*64*60##", + "ack": false, + "reply_time_s": 2.137, + "replies": [], + "events_after": [], + "note": "zone_64_humidity_nack_no_probe" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 306.47, + "step": "zone_65", + "dir": "tx", + "session": "cmd", + "frame": "*#4*65*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 306.47, + "t_estimated": true, + "step": "zone_65", + "dir": "rx", + "session": "cmd", + "frame": "*#4*65*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 306.47, + "t_estimated": true, + "step": "zone_65", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 306.68, + "step": "zone_65", + "dir": "rx", + "session": "evt", + "frame": "*#4*65*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 65's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 306.707, + "utc": "10:51:52", + "step": "zone_65", + "dir": "result", + "frame": "*#4*65*19##", + "ack": true, + "reply_time_s": 0.237, + "replies": [ + "*#4*65*19*0*0##" + ], + "events_after": [ + "*#4*65*19*0*0##" + ], + "note": "zone_65_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 307.908, + "step": "zone_65", + "dir": "tx", + "session": "cmd", + "frame": "*#4*65*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 307.908, + "t_estimated": true, + "step": "zone_65", + "dir": "rx", + "session": "cmd", + "frame": "*#4*65#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 307.908, + "t_estimated": true, + "step": "zone_65", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 308.104, + "step": "zone_65", + "dir": "rx", + "session": "evt", + "frame": "*#4*65#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 65's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 308.122, + "utc": "10:51:54", + "step": "zone_65", + "dir": "result", + "frame": "*#4*65*20##", + "ack": true, + "reply_time_s": 0.214, + "replies": [ + "*#4*65#1*20*0##" + ], + "events_after": [ + "*#4*65#1*20*0##" + ], + "note": "zone_65_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 309.325, + "step": "zone_65", + "dir": "tx", + "session": "cmd", + "frame": "*#4*65*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 309.325, + "t_estimated": true, + "step": "zone_65", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 311.496, + "utc": "10:51:57", + "step": "zone_65", + "dir": "result", + "frame": "*#4*65*11##", + "ack": false, + "reply_time_s": 2.171, + "replies": [], + "events_after": [], + "note": "zone_65_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 312.698, + "step": "zone_65", + "dir": "tx", + "session": "cmd", + "frame": "*#4*65*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 312.698, + "t_estimated": true, + "step": "zone_65", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 314.833, + "utc": "10:52:00", + "step": "zone_65", + "dir": "result", + "frame": "*#4*65*60##", + "ack": false, + "reply_time_s": 2.135, + "replies": [], + "events_after": [], + "note": "zone_65_humidity_nack_no_probe" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 317.034, + "step": "zone_66", + "dir": "tx", + "session": "cmd", + "frame": "*#4*66*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 317.034, + "t_estimated": true, + "step": "zone_66", + "dir": "rx", + "session": "cmd", + "frame": "*#4*66*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 317.034, + "t_estimated": true, + "step": "zone_66", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 317.256, + "step": "zone_66", + "dir": "rx", + "session": "evt", + "frame": "*#4*66*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 66's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 317.281, + "utc": "10:52:03", + "step": "zone_66", + "dir": "result", + "frame": "*#4*66*19##", + "ack": true, + "reply_time_s": 0.247, + "replies": [ + "*#4*66*19*0*0##" + ], + "events_after": [ + "*#4*66*19*0*0##" + ], + "note": "zone_66_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 318.482, + "step": "zone_66", + "dir": "tx", + "session": "cmd", + "frame": "*#4*66*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 318.482, + "t_estimated": true, + "step": "zone_66", + "dir": "rx", + "session": "cmd", + "frame": "*#4*66#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 318.482, + "t_estimated": true, + "step": "zone_66", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 318.642, + "step": "zone_66", + "dir": "rx", + "session": "evt", + "frame": "*#4*66#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 66's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 318.676, + "utc": "10:52:04", + "step": "zone_66", + "dir": "result", + "frame": "*#4*66*20##", + "ack": true, + "reply_time_s": 0.194, + "replies": [ + "*#4*66#1*20*0##" + ], + "events_after": [ + "*#4*66#1*20*0##" + ], + "note": "zone_66_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 319.877, + "step": "zone_66", + "dir": "tx", + "session": "cmd", + "frame": "*#4*66*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 319.877, + "t_estimated": true, + "step": "zone_66", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 321.983, + "utc": "10:52:07", + "step": "zone_66", + "dir": "result", + "frame": "*#4*66*11##", + "ack": false, + "reply_time_s": 2.106, + "replies": [], + "events_after": [], + "note": "zone_66_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 323.186, + "step": "zone_66", + "dir": "tx", + "session": "cmd", + "frame": "*#4*66*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 323.186, + "t_estimated": true, + "step": "zone_66", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 325.318, + "utc": "10:52:11", + "step": "zone_66", + "dir": "result", + "frame": "*#4*66*60##", + "ack": false, + "reply_time_s": 2.132, + "replies": [], + "events_after": [], + "note": "zone_66_humidity_nack_no_probe" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 327.52, + "step": "zone_67", + "dir": "tx", + "session": "cmd", + "frame": "*#4*67*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 327.52, + "t_estimated": true, + "step": "zone_67", + "dir": "rx", + "session": "cmd", + "frame": "*#4*67*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 327.52, + "t_estimated": true, + "step": "zone_67", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 327.719, + "step": "zone_67", + "dir": "rx", + "session": "evt", + "frame": "*#4*67*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 67's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 327.744, + "utc": "10:52:13", + "step": "zone_67", + "dir": "result", + "frame": "*#4*67*19##", + "ack": true, + "reply_time_s": 0.224, + "replies": [ + "*#4*67*19*0*0##" + ], + "events_after": [ + "*#4*67*19*0*0##" + ], + "note": "zone_67_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 328.946, + "step": "zone_67", + "dir": "tx", + "session": "cmd", + "frame": "*#4*67*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 328.946, + "t_estimated": true, + "step": "zone_67", + "dir": "rx", + "session": "cmd", + "frame": "*#4*67#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 328.946, + "t_estimated": true, + "step": "zone_67", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 329.123, + "step": "zone_67", + "dir": "rx", + "session": "evt", + "frame": "*#4*67#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 67's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 329.149, + "utc": "10:52:15", + "step": "zone_67", + "dir": "result", + "frame": "*#4*67*20##", + "ack": true, + "reply_time_s": 0.203, + "replies": [ + "*#4*67#1*20*0##" + ], + "events_after": [ + "*#4*67#1*20*0##" + ], + "note": "zone_67_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 330.35, + "step": "zone_67", + "dir": "tx", + "session": "cmd", + "frame": "*#4*67*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 330.35, + "t_estimated": true, + "step": "zone_67", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 332.091, + "step": "zone_67", + "dir": "rx", + "session": "evt", + "frame": "*4*4002#55*0#3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 0's mode is unknown." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 332.117, + "step": "zone_67", + "dir": "rx", + "session": "evt", + "frame": "*4*4002*55##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 55's mode is unknown." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 332.166, + "step": "zone_67", + "dir": "rx", + "session": "evt", + "frame": "*4*4002*55##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 55's mode is unknown." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 334.126, + "step": "zone_67", + "dir": "rx", + "session": "evt", + "frame": "*#4*55#1*#20*0##", + "ownd_class": "OWNHeatingCommand", + "ownd_log": "*#4*55#1*#20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 334.128, + "step": "zone_67", + "dir": "rx", + "session": "evt", + "frame": "*#4*55#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 55's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 336.162, + "utc": "10:52:22", + "step": "zone_67", + "dir": "result", + "frame": "*#4*67*11##", + "ack": false, + "reply_time_s": 5.812, + "replies": [], + "events_after": [ + "*4*4002#55*0#3##", + "*4*4002*55##", + "*4*4002*55##", + "*#4*55#1*#20*0##", + "*#4*55#1*20*0##" + ], + "note": "zone_67_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 337.363, + "step": "zone_67", + "dir": "tx", + "session": "cmd", + "frame": "*#4*67*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 337.363, + "t_estimated": true, + "step": "zone_67", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 339.554, + "utc": "10:52:25", + "step": "zone_67", + "dir": "result", + "frame": "*#4*67*60##", + "ack": false, + "reply_time_s": 2.191, + "replies": [], + "events_after": [], + "note": "zone_67_humidity_nack_no_probe" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 341.756, + "step": "zone_68", + "dir": "tx", + "session": "cmd", + "frame": "*#4*68*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 341.756, + "t_estimated": true, + "step": "zone_68", + "dir": "rx", + "session": "cmd", + "frame": "*#4*68*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 341.756, + "t_estimated": true, + "step": "zone_68", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 341.934, + "step": "zone_68", + "dir": "rx", + "session": "evt", + "frame": "*#4*68*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 68's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 341.96, + "utc": "10:52:27", + "step": "zone_68", + "dir": "result", + "frame": "*#4*68*19##", + "ack": true, + "reply_time_s": 0.204, + "replies": [ + "*#4*68*19*0*0##" + ], + "events_after": [ + "*#4*68*19*0*0##" + ], + "note": "zone_68_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 343.161, + "step": "zone_68", + "dir": "tx", + "session": "cmd", + "frame": "*#4*68*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 343.161, + "t_estimated": true, + "step": "zone_68", + "dir": "rx", + "session": "cmd", + "frame": "*#4*68#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 343.161, + "t_estimated": true, + "step": "zone_68", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 343.356, + "step": "zone_68", + "dir": "rx", + "session": "evt", + "frame": "*#4*68#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 68's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 343.374, + "utc": "10:52:29", + "step": "zone_68", + "dir": "result", + "frame": "*#4*68*20##", + "ack": true, + "reply_time_s": 0.213, + "replies": [ + "*#4*68#1*20*0##" + ], + "events_after": [ + "*#4*68#1*20*0##" + ], + "note": "zone_68_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 344.576, + "step": "zone_68", + "dir": "tx", + "session": "cmd", + "frame": "*#4*68*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 344.576, + "t_estimated": true, + "step": "zone_68", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 346.68, + "utc": "10:52:32", + "step": "zone_68", + "dir": "result", + "frame": "*#4*68*11##", + "ack": false, + "reply_time_s": 2.104, + "replies": [], + "events_after": [], + "note": "zone_68_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 347.881, + "step": "zone_68", + "dir": "tx", + "session": "cmd", + "frame": "*#4*68*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 347.881, + "t_estimated": true, + "step": "zone_68", + "dir": "rx", + "session": "cmd", + "frame": "*#4*68*60*55##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 347.881, + "t_estimated": true, + "step": "zone_68", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 348.139, + "step": "zone_68", + "dir": "rx", + "session": "evt", + "frame": "*#4*68*60*55##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 68's main sensor is reporting a humidity of 55.0%." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 348.171, + "utc": "10:52:34", + "step": "zone_68", + "dir": "result", + "frame": "*#4*68*60##", + "ack": true, + "reply_time_s": 0.29, + "replies": [ + "*#4*68*60*55##" + ], + "events_after": [ + "*#4*68*60*55##" + ], + "note": "zone_68_humidity_ack_55" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 348.392, + "step": "zone_68", + "dir": "rx", + "session": "evt", + "frame": "*1*1000#1*63##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "*1*1000#1*63##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 348.424, + "step": "zone_68", + "dir": "rx", + "session": "evt", + "frame": "*1*1*63##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 63 is switched on." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 350.372, + "step": "zone_69", + "dir": "tx", + "session": "cmd", + "frame": "*#4*69*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 350.372, + "t_estimated": true, + "step": "zone_69", + "dir": "rx", + "session": "cmd", + "frame": "*#4*69*19*0*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 350.372, + "t_estimated": true, + "step": "zone_69", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 350.534, + "step": "zone_69", + "dir": "rx", + "session": "evt", + "frame": "*#4*69*19*0*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 69's cooling valve is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 350.576, + "utc": "10:52:36", + "step": "zone_69", + "dir": "result", + "frame": "*#4*69*19##", + "ack": true, + "reply_time_s": 0.204, + "replies": [ + "*#4*69*19*0*0##" + ], + "events_after": [ + "*#4*69*19*0*0##" + ], + "note": "zone_69_valves_status_ack_0_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 351.778, + "step": "zone_69", + "dir": "tx", + "session": "cmd", + "frame": "*#4*69*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 351.778, + "t_estimated": true, + "step": "zone_69", + "dir": "rx", + "session": "cmd", + "frame": "*#4*69#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 351.778, + "t_estimated": true, + "step": "zone_69", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 351.982, + "step": "zone_69", + "dir": "rx", + "session": "evt", + "frame": "*#4*69#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 69's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 352.003, + "utc": "10:52:38", + "step": "zone_69", + "dir": "result", + "frame": "*#4*69*20##", + "ack": true, + "reply_time_s": 0.225, + "replies": [ + "*#4*69#1*20*0##" + ], + "events_after": [ + "*#4*69#1*20*0##" + ], + "note": "zone_69_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 353.203, + "step": "zone_69", + "dir": "tx", + "session": "cmd", + "frame": "*#4*69*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 353.203, + "t_estimated": true, + "step": "zone_69", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 353.274, + "step": "zone_69", + "dir": "rx", + "session": "evt", + "frame": "*4*4002#68*0#4##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 0's mode is unknown." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 353.302, + "step": "zone_69", + "dir": "rx", + "session": "evt", + "frame": "*4*4002*68##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 68's mode is unknown." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 355.251, + "step": "zone_69", + "dir": "rx", + "session": "evt", + "frame": "*#4*68#1*#20*0##", + "ownd_class": "OWNHeatingCommand", + "ownd_log": "*#4*68#1*#20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 355.264, + "step": "zone_69", + "dir": "rx", + "session": "evt", + "frame": "*#4*68#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 68's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 357.373, + "utc": "10:52:43", + "step": "zone_69", + "dir": "result", + "frame": "*#4*69*11##", + "ack": false, + "reply_time_s": 4.17, + "replies": [], + "events_after": [ + "*4*4002#68*0#4##", + "*4*4002*68##", + "*#4*68#1*#20*0##", + "*#4*68#1*20*0##" + ], + "note": "zone_69_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 358.574, + "step": "zone_69", + "dir": "tx", + "session": "cmd", + "frame": "*#4*69*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 358.574, + "t_estimated": true, + "step": "zone_69", + "dir": "rx", + "session": "cmd", + "frame": "*#4*69*60*52##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 358.574, + "t_estimated": true, + "step": "zone_69", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 358.784, + "step": "zone_69", + "dir": "rx", + "session": "evt", + "frame": "*#4*69*60*52##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 69's main sensor is reporting a humidity of 52.0%." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 358.815, + "utc": "10:52:44", + "step": "zone_69", + "dir": "result", + "frame": "*#4*69*60##", + "ack": true, + "reply_time_s": 0.241, + "replies": [ + "*#4*69*60*52##" + ], + "events_after": [ + "*#4*69*60*52##" + ], + "note": "zone_69_humidity_ack_52" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 361.017, + "step": "zone_70", + "dir": "tx", + "session": "cmd", + "frame": "*#4*70*19##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 361.017, + "t_estimated": true, + "step": "zone_70", + "dir": "rx", + "session": "cmd", + "frame": "*#4*70*19*5*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 361.017, + "t_estimated": true, + "step": "zone_70", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 361.223, + "step": "zone_70", + "dir": "rx", + "session": "evt", + "frame": "*#4*70*19*5*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 70's cooling fan is off; heating valve is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 361.246, + "utc": "10:52:47", + "step": "zone_70", + "dir": "result", + "frame": "*#4*70*19##", + "ack": true, + "reply_time_s": 0.229, + "replies": [ + "*#4*70*19*5*0##" + ], + "events_after": [ + "*#4*70*19*5*0##" + ], + "note": "zone_70_valves_status_ack_5_0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 362.447, + "step": "zone_70", + "dir": "tx", + "session": "cmd", + "frame": "*#4*70*20##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 362.447, + "t_estimated": true, + "step": "zone_70", + "dir": "rx", + "session": "cmd", + "frame": "*#4*70#1*20*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 362.447, + "t_estimated": true, + "step": "zone_70", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 362.605, + "step": "zone_70", + "dir": "rx", + "session": "evt", + "frame": "*#4*70#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 70's actuator 1 is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 362.653, + "step": "zone_70", + "dir": "rx", + "session": "evt", + "frame": "*#4*70#2*20*5##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 70's fan is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 362.659, + "utc": "10:52:48", + "step": "zone_70", + "dir": "result", + "frame": "*#4*70*20##", + "ack": true, + "reply_time_s": 0.212, + "replies": [ + "*#4*70#1*20*0##" + ], + "events_after": [ + "*#4*70#1*20*0##", + "*#4*70#2*20*5##" + ], + "note": "zone_70_actuators_ack_1_reply" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 362.702, + "step": "zone_70", + "dir": "rx", + "session": "evt", + "frame": "*#4*70#2*20*5##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 70's fan is off." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 363.86, + "step": "zone_70", + "dir": "tx", + "session": "cmd", + "frame": "*#4*70*11##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 363.86, + "t_estimated": true, + "step": "zone_70", + "dir": "rx", + "session": "cmd", + "frame": "*#*0##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 365.961, + "utc": "10:52:51", + "step": "zone_70", + "dir": "result", + "frame": "*#4*70*11##", + "ack": false, + "reply_time_s": 2.101, + "replies": [], + "events_after": [], + "note": "zone_70_fan_speed_nack_valve_zone" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 367.162, + "step": "zone_70", + "dir": "tx", + "session": "cmd", + "frame": "*#4*70*60##", + "is_status_request": true + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 367.162, + "t_estimated": true, + "step": "zone_70", + "dir": "rx", + "session": "cmd", + "frame": "*#4*70*60*68##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 367.162, + "t_estimated": true, + "step": "zone_70", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 367.378, + "step": "zone_70", + "dir": "rx", + "session": "evt", + "frame": "*#4*70*60*68##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 70's main sensor is reporting a humidity of 68.0%." + }, + { + "run": "run2_per_zone_reads_19_20_11_60", + "t": 367.407, + "utc": "10:52:53", + "step": "zone_70", + "dir": "result", + "frame": "*#4*70*60##", + "ack": true, + "reply_time_s": 0.245, + "replies": [ + "*#4*70*60*68##" + ], + "events_after": [ + "*#4*70*60*68##" + ], + "note": "zone_70_humidity_ack_68" + }, + { + "run": "run3_general_humidity", + "t": 369.609, + "step": "general_humidity", + "dir": "tx", + "session": "cmd", + "frame": "*#4*0*60##", + "is_status_request": true + }, + { + "run": "run3_general_humidity", + "t": 369.609, + "t_estimated": true, + "step": "general_humidity", + "dir": "rx", + "session": "cmd", + "frame": "*#4*42*60*52##" + }, + { + "run": "run3_general_humidity", + "t": 369.609, + "t_estimated": true, + "step": "general_humidity", + "dir": "rx", + "session": "cmd", + "frame": "*#4*40*60*48##" + }, + { + "run": "run3_general_humidity", + "t": 369.609, + "t_estimated": true, + "step": "general_humidity", + "dir": "rx", + "session": "cmd", + "frame": "*#4*47*60*58##" + }, + { + "run": "run3_general_humidity", + "t": 369.609, + "t_estimated": true, + "step": "general_humidity", + "dir": "rx", + "session": "cmd", + "frame": "*#4*43*60*55##" + }, + { + "run": "run3_general_humidity", + "t": 369.609, + "t_estimated": true, + "step": "general_humidity", + "dir": "rx", + "session": "cmd", + "frame": "*#4*41*60*43##" + }, + { + "run": "run3_general_humidity", + "t": 369.609, + "t_estimated": true, + "step": "general_humidity", + "dir": "rx", + "session": "cmd", + "frame": "*#4*61*60*53##" + }, + { + "run": "run3_general_humidity", + "t": 369.609, + "t_estimated": true, + "step": "general_humidity", + "dir": "rx", + "session": "cmd", + "frame": "*#4*48*60*53##" + }, + { + "run": "run3_general_humidity", + "t": 369.609, + "t_estimated": true, + "step": "general_humidity", + "dir": "rx", + "session": "cmd", + "frame": "*#4*57*60*51##" + }, + { + "run": "run3_general_humidity", + "t": 369.609, + "t_estimated": true, + "step": "general_humidity", + "dir": "rx", + "session": "cmd", + "frame": "*#*1##" + }, + { + "run": "run3_general_humidity", + "t": 369.795, + "step": "general_humidity", + "dir": "rx", + "session": "evt", + "frame": "*#4*42*60*52##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 42's main sensor is reporting a humidity of 52.0%." + }, + { + "run": "run3_general_humidity", + "t": 369.833, + "step": "general_humidity", + "dir": "rx", + "session": "evt", + "frame": "*#4*40*60*48##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 40's main sensor is reporting a humidity of 48.0%." + }, + { + "run": "run3_general_humidity", + "t": 369.875, + "step": "general_humidity", + "dir": "rx", + "session": "evt", + "frame": "*#4*47*60*58##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 47's main sensor is reporting a humidity of 58.0%." + }, + { + "run": "run3_general_humidity", + "t": 369.923, + "step": "general_humidity", + "dir": "rx", + "session": "evt", + "frame": "*#4*43*60*55##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 43's main sensor is reporting a humidity of 55.0%." + }, + { + "run": "run3_general_humidity", + "t": 370.023, + "step": "general_humidity", + "dir": "rx", + "session": "evt", + "frame": "*#4*41*60*43##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 41's main sensor is reporting a humidity of 43.0%." + }, + { + "run": "run3_general_humidity", + "t": 370.065, + "step": "general_humidity", + "dir": "rx", + "session": "evt", + "frame": "*#4*61*60*53##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 61's main sensor is reporting a humidity of 53.0%." + }, + { + "run": "run3_general_humidity", + "t": 370.183, + "step": "general_humidity", + "dir": "rx", + "session": "evt", + "frame": "*#4*48*60*53##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 48's main sensor is reporting a humidity of 53.0%." + }, + { + "run": "run3_general_humidity", + "t": 370.233, + "step": "general_humidity", + "dir": "rx", + "session": "evt", + "frame": "*#4*57*60*51##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 57's main sensor is reporting a humidity of 51.0%." + }, + { + "run": "run3_general_humidity", + "t": 370.267, + "utc": "10:52:56", + "step": "general_humidity", + "dir": "result", + "frame": "*#4*0*60##", + "ack": true, + "reply_time_s": 0.658, + "replies": [ + "*#4*42*60*52##", + "*#4*40*60*48##", + "*#4*47*60*58##", + "*#4*43*60*55##", + "*#4*41*60*43##", + "*#4*61*60*53##", + "*#4*48*60*53##", + "*#4*57*60*51##" + ], + "events_after": [ + "*#4*42*60*52##", + "*#4*40*60*48##", + "*#4*47*60*58##", + "*#4*43*60*55##", + "*#4*41*60*43##", + "*#4*61*60*53##", + "*#4*48*60*53##", + "*#4*57*60*51##" + ], + "note": "general_humidity_ack_17_zones_answer" + }, + { + "run": "run3_general_humidity", + "t": 370.283, + "step": "general_humidity", + "dir": "rx", + "session": "evt", + "frame": "*#4*59*60*66##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 59's main sensor is reporting a humidity of 66.0%." + }, + { + "run": "run3_general_humidity", + "t": 370.314, + "step": "general_humidity", + "dir": "rx", + "session": "evt", + "frame": "*#4*60*60*54##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 60's main sensor is reporting a humidity of 54.0%." + }, + { + "run": "run3_general_humidity", + "t": 370.366, + "step": "general_humidity", + "dir": "rx", + "session": "evt", + "frame": "*#4*70*60*68##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 70's main sensor is reporting a humidity of 68.0%." + }, + { + "run": "run3_general_humidity", + "t": 370.409, + "step": "general_humidity", + "dir": "rx", + "session": "evt", + "frame": "*#4*69*60*52##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 69's main sensor is reporting a humidity of 52.0%." + }, + { + "run": "run3_general_humidity", + "t": 370.436, + "step": "general_humidity", + "dir": "rx", + "session": "evt", + "frame": "*#4*53*60*60##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 53's main sensor is reporting a humidity of 60.0%." + }, + { + "run": "run3_general_humidity", + "t": 370.477, + "step": "general_humidity", + "dir": "rx", + "session": "evt", + "frame": "*#4*68*60*55##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 68's main sensor is reporting a humidity of 55.0%." + }, + { + "run": "run3_general_humidity", + "t": 370.517, + "step": "general_humidity", + "dir": "rx", + "session": "evt", + "frame": "*#4*55*60*49##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 55's main sensor is reporting a humidity of 49.0%." + }, + { + "run": "run3_general_humidity", + "t": 370.541, + "step": "general_humidity", + "dir": "rx", + "session": "evt", + "frame": "*#4*58*60*57##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 58's main sensor is reporting a humidity of 57.0%." + }, + { + "run": "run3_general_humidity", + "t": 370.591, + "step": "general_humidity", + "dir": "rx", + "session": "evt", + "frame": "*#4*39*60*48##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 39's main sensor is reporting a humidity of 48.0%." + }, + { + "run": "run4_listen_600_s", + "t": 436.573, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*39*5*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 39's local control (dimension 5) is 0." + }, + { + "run": "run4_listen_600_s", + "t": 436.681, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*40*5*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 40's local control (dimension 5) is 0." + }, + { + "run": "run4_listen_600_s", + "t": 436.793, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*41*5*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 41's local control (dimension 5) is 0." + }, + { + "run": "run4_listen_600_s", + "t": 436.994, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*43*5*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 43's local control (dimension 5) is 0." + }, + { + "run": "run4_listen_600_s", + "t": 437.097, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*42*5*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 42's local control (dimension 5) is 0." + }, + { + "run": "run4_listen_600_s", + "t": 437.366, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*47*5*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 47's local control (dimension 5) is 0." + }, + { + "run": "run4_listen_600_s", + "t": 437.503, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*48*5*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 48's local control (dimension 5) is 0." + }, + { + "run": "run4_listen_600_s", + "t": 438.042, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*53*5*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 53's local control (dimension 5) is 0." + }, + { + "run": "run4_listen_600_s", + "t": 438.232, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*55*5*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 55's local control (dimension 5) is 0." + }, + { + "run": "run4_listen_600_s", + "t": 438.402, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*57*5*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 57's local control (dimension 5) is 0." + }, + { + "run": "run4_listen_600_s", + "t": 438.49, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*59*5*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 59's local control (dimension 5) is 0." + }, + { + "run": "run4_listen_600_s", + "t": 438.584, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*60*5*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 60's local control (dimension 5) is 0." + }, + { + "run": "run4_listen_600_s", + "t": 438.678, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*61*5*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 61's local control (dimension 5) is 0." + }, + { + "run": "run4_listen_600_s", + "t": 438.772, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*58*5*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 58's local control (dimension 5) is 0." + }, + { + "run": "run4_listen_600_s", + "t": 439.361, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*69*5*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 69's local control (dimension 5) is 0." + }, + { + "run": "run4_listen_600_s", + "t": 439.386, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*68*5*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 68's local control (dimension 5) is 0." + }, + { + "run": "run4_listen_600_s", + "t": 439.438, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*70*5*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 70's local control (dimension 5) is 0." + }, + { + "run": "run4_listen_600_s", + "t": 440.788, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*35*7*1*1*0200##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 35 is in heating setpoint at 20.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 440.79, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*35*0*0225##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 35's main sensor is reporting a temperature of 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 440.813, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*36*7*1*1*0225##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 36 is in heating setpoint at 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 440.886, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*36*0*0226##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 36's main sensor is reporting a temperature of 22.6°C." + }, + { + "run": "run4_listen_600_s", + "t": 440.888, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*37*7*1*1*0130##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 37 is in heating setpoint at 13.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 440.932, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*37*0*0206##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 37's main sensor is reporting a temperature of 20.6°C." + }, + { + "run": "run4_listen_600_s", + "t": 440.934, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*38*7*1*1*0225##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 38 is in heating setpoint at 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 441.013, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*39*7*1*1*0220##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 39 is in heating setpoint at 22.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 441.144, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*39*0*0221##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 39's main sensor is reporting a temperature of 22.1°C." + }, + { + "run": "run4_listen_600_s", + "t": 441.203, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*40*7*1*1*0225##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 40 is in heating setpoint at 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 441.256, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*40*0*0226##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 40's main sensor is reporting a temperature of 22.6°C." + }, + { + "run": "run4_listen_600_s", + "t": 441.271, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*41*7*1*1*0130##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 41 is in heating setpoint at 13.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 441.362, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*38*0*0252##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 38's main sensor is reporting a temperature of 25.2°C." + }, + { + "run": "run4_listen_600_s", + "t": 441.434, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*41*0*0210##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 41's main sensor is reporting a temperature of 21.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 441.473, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*45*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 45 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 441.575, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*46*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 46 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 441.576, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*45*0*0242##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 45's main sensor is reporting a temperature of 24.2°C." + }, + { + "run": "run4_listen_600_s", + "t": 441.677, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*46*0*0238##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 46's main sensor is reporting a temperature of 23.8°C." + }, + { + "run": "run4_listen_600_s", + "t": 441.693, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*44*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 44 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 441.795, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*48*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 48 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 441.807, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*49*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 49 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 441.922, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*47*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 47 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 442.005, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*42*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 42 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 442.095, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*42*0*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 42's main sensor is reporting a temperature of 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 442.218, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*49*0*0262##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 49's main sensor is reporting a temperature of 26.2°C." + }, + { + "run": "run4_listen_600_s", + "t": 442.324, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*48*0*0232##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 48's main sensor is reporting a temperature of 23.2°C." + }, + { + "run": "run4_listen_600_s", + "t": 442.346, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*47*0*0236##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 47's main sensor is reporting a temperature of 23.6°C." + }, + { + "run": "run4_listen_600_s", + "t": 442.453, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*44*0*0239##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 44's main sensor is reporting a temperature of 23.9°C." + }, + { + "run": "run4_listen_600_s", + "t": 442.492, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*57*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 57 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 442.573, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*50*7*1*1*0225##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 50 is in heating setpoint at 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 442.675, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*51*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 51 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 442.707, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*51*0*0253##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 51's main sensor is reporting a temperature of 25.3°C." + }, + { + "run": "run4_listen_600_s", + "t": 442.806, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*53*7*1*1*0225##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 53 is in heating setpoint at 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 442.837, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*57*0*0237##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 57's main sensor is reporting a temperature of 23.7°C." + }, + { + "run": "run4_listen_600_s", + "t": 442.918, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*58*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 58 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 442.966, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*50*0*0250##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 50's main sensor is reporting a temperature of 25.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 443.237, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*55*7*1*1*0225##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 55 is in heating setpoint at 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 443.241, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*59*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 59 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 443.269, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*62*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 62 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 443.337, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*59*0*0237##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 59's main sensor is reporting a temperature of 23.7°C." + }, + { + "run": "run4_listen_600_s", + "t": 443.424, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*63*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 63 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 443.45, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*61*7*1*1*0225##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 61 is in heating setpoint at 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 443.515, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*52*7*1*1*0225##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 52 is in heating setpoint at 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 443.524, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*63*0*0231##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 63's main sensor is reporting a temperature of 23.1°C." + }, + { + "run": "run4_listen_600_s", + "t": 443.624, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*52*0*0243##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 52's main sensor is reporting a temperature of 24.3°C." + }, + { + "run": "run4_listen_600_s", + "t": 443.656, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*61*0*0237##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 61's main sensor is reporting a temperature of 23.7°C." + }, + { + "run": "run4_listen_600_s", + "t": 443.744, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*55*0*0246##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 55's main sensor is reporting a temperature of 24.6°C." + }, + { + "run": "run4_listen_600_s", + "t": 443.858, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*53*0*0228##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 53's main sensor is reporting a temperature of 22.8°C." + }, + { + "run": "run4_listen_600_s", + "t": 443.884, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*58*0*0231##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 58's main sensor is reporting a temperature of 23.1°C." + }, + { + "run": "run4_listen_600_s", + "t": 443.898, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*66*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 66 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 443.995, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*66*0*0250##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 66's main sensor is reporting a temperature of 25.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 444.074, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*65*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 65 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 444.172, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*70*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 70 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 444.26, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*52*7*1*1*0225##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 52 is in heating setpoint at 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 444.361, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*52*0*0243##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 52's main sensor is reporting a temperature of 24.3°C." + }, + { + "run": "run4_listen_600_s", + "t": 444.402, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*70*0*0231##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 70's main sensor is reporting a temperature of 23.1°C." + }, + { + "run": "run4_listen_600_s", + "t": 444.492, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*60*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 60 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 444.574, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*55*7*1*1*0225##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 55 is in heating setpoint at 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 444.674, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*62*0*0249##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 62's main sensor is reporting a temperature of 24.9°C." + }, + { + "run": "run4_listen_600_s", + "t": 444.733, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*62*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 62 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 444.804, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*67*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 67 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 444.853, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*67*0*0242##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 67's main sensor is reporting a temperature of 24.2°C." + }, + { + "run": "run4_listen_600_s", + "t": 444.944, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*68*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 68 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 445.043, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*60*0*0242##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 60's main sensor is reporting a temperature of 24.2°C." + }, + { + "run": "run4_listen_600_s", + "t": 445.074, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*64*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 64 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 445.174, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*68*0*0231##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 68's main sensor is reporting a temperature of 23.1°C." + }, + { + "run": "run4_listen_600_s", + "t": 445.254, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*63*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 63 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 445.335, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*62*0*0249##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 62's main sensor is reporting a temperature of 24.9°C." + }, + { + "run": "run4_listen_600_s", + "t": 445.433, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*64*0*0232##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 64's main sensor is reporting a temperature of 23.2°C." + }, + { + "run": "run4_listen_600_s", + "t": 445.481, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*69*7*1*1*0225##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 69 is in heating setpoint at 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 445.514, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*69*0*0235##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 69's main sensor is reporting a temperature of 23.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 445.584, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*66*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 66 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 445.633, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*60*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 60 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 445.676, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*69*7*1*1*0225##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 69 is in heating setpoint at 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 445.722, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*69*0*0235##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 69's main sensor is reporting a temperature of 23.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 445.763, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*61*7*1*1*0225##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 61 is in heating setpoint at 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 445.806, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*55*0*0246##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 55's main sensor is reporting a temperature of 24.6°C." + }, + { + "run": "run4_listen_600_s", + "t": 445.849, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*61*0*0237##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 61's main sensor is reporting a temperature of 23.7°C." + }, + { + "run": "run4_listen_600_s", + "t": 445.898, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*60*0*0242##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 60's main sensor is reporting a temperature of 24.2°C." + }, + { + "run": "run4_listen_600_s", + "t": 445.913, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*66*0*0250##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 66's main sensor is reporting a temperature of 25.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 445.962, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*67*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 67 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 446.013, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*65*0*0235##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 65's main sensor is reporting a temperature of 23.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 446.046, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*67*0*0242##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 67's main sensor is reporting a temperature of 24.2°C." + }, + { + "run": "run4_listen_600_s", + "t": 446.081, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*70*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 70 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 446.134, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*65*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 65 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 446.176, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*64*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 64 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 446.219, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*65*0*0235##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 65's main sensor is reporting a temperature of 23.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 446.257, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*64*0*0232##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 64's main sensor is reporting a temperature of 23.2°C." + }, + { + "run": "run4_listen_600_s", + "t": 446.306, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*68*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 68 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 446.364, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*59*7*1*1*0230##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 59 is in heating setpoint at 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 446.414, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*68*0*0231##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 68's main sensor is reporting a temperature of 23.1°C." + }, + { + "run": "run4_listen_600_s", + "t": 446.463, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*70*0*0231##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 70's main sensor is reporting a temperature of 23.1°C." + }, + { + "run": "run4_listen_600_s", + "t": 446.505, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*59*0*0237##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 59's main sensor is reporting a temperature of 23.7°C." + }, + { + "run": "run4_listen_600_s", + "t": 446.541, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*63*0*0231##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 63's main sensor is reporting a temperature of 23.1°C." + }, + { + "run": "run4_listen_600_s", + "t": 455.573, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*43*0*0226##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 43's main sensor is reporting a temperature of 22.6°C." + }, + { + "run": "run4_listen_600_s", + "t": 598.56, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*14##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 14 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 598.592, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*25##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 25 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 598.617, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0415##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0415 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 598.649, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0211##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0211 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 598.69, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*21##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 21 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 598.733, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*49##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 49 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 598.759, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0010##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0010 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 598.795, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0212##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0212 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 598.832, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0115##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0115 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 598.873, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0312##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0312 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 598.913, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0014##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0014 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 598.943, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*29##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 29 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 598.974, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*17##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 17 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.013, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*26##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 26 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.054, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*61##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 61 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.079, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0210##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0210 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.124, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0313##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0313 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.161, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*37##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 37 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.197, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0012##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0012 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.234, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0410##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0410 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.264, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0310##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0310 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.313, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*24##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 24 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.353, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*18##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 18 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.379, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0315##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0315 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.413, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*64##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 64 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.443, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*43##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 43 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.503, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*1*27##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 27 is switched on." + }, + { + "run": "run4_listen_600_s", + "t": 599.527, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0015##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0015 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.563, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0515##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0515 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.599, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0314##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0314 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.645, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0011##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0011 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.673, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*33##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 33 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.705, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*65##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 65 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.736, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0411##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0411 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.769, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0215##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0215 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.804, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0311##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0311 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.843, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0513##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0513 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.883, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*34##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 34 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.923, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*19##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 19 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.951, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0213##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0213 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 599.995, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*41##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 41 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.023, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*28##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 28 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.061, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0510##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0510 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.094, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*42##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 42 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.13, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0110##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0110 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.173, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*44##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 44 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.198, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0511##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0511 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.232, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0512##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0512 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.264, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*1*62##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 62 is switched on." + }, + { + "run": "run4_listen_600_s", + "t": 600.298, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*31##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 31 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.335, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*16##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 16 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.373, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*45##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 45 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.423, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0013##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0013 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.444, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*38##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 38 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.474, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*1*63##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 63 is switched on." + }, + { + "run": "run4_listen_600_s", + "t": 600.509, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0514##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0514 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.55, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0111##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0111 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.6, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0112##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0112 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.641, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*11##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 11 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.675, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0214##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0214 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.714, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0113##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0113 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.744, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*39##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 39 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.792, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0114##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0114 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.823, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*32##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 32 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.872, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*66##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 66 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.904, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*12##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 12 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.943, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*36##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 36 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 600.983, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*1*13##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 13 is switched on." + }, + { + "run": "run4_listen_600_s", + "t": 601.017, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*46##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 46 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 601.073, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0413##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0413 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 601.106, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*33##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 33 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 601.149, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*47##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 47 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 601.193, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*34##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 34 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 601.227, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*48##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 48 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 601.293, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*68##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 68 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 601.317, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*36##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 36 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 601.372, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*69##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 69 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 603.209, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0014##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0014 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 603.244, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0514##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0514 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 603.264, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0211##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0211 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 603.303, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*17##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 17 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 603.344, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0115##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0115 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 603.374, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0215##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0215 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 603.422, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*18##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 18 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 603.449, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*33##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 33 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 603.488, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0010##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0010 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 603.519, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*29##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 29 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 603.553, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0111##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0111 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 603.588, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*25##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 25 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 603.623, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*11##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 11 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 603.658, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*34##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 34 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 603.696, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0513##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0513 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 603.729, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*49##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 49 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 603.772, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0112##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0112 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 603.801, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0314##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0314 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 603.843, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*19##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 19 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 603.873, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*26##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 26 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 603.904, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*64##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 64 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 603.939, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0312##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0312 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 603.973, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0110##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0110 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.022, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0210##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0210 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.049, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*14##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 14 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.085, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0313##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0313 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.125, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0113##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0113 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.159, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*45##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 45 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.203, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0114##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0114 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.224, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*37##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 37 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.273, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0415##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0415 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.3, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0512##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0512 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.342, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*65##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 65 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.375, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0212##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0212 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.414, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*46##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 46 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.444, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0311##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0311 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.484, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0315##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0315 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.513, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0515##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0515 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.563, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*36##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 36 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.593, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0012##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0012 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.623, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*38##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 38 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.664, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0013##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0013 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.694, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*39##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 39 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.734, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*12##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 12 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.773, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*41##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 41 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.813, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0015##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0015 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.839, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0410##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0410 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.878, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*21##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 21 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.91, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0213##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0213 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 604.944, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*1*13##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 13 is switched on." + }, + { + "run": "run4_listen_600_s", + "t": 604.974, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*66##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 66 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 605.011, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*61##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 61 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 605.045, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*31##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 31 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 605.081, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0011##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0011 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 605.114, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*47##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 47 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 605.162, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*16##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 16 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 605.195, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*32##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 32 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 605.234, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0014##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0014 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 605.264, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0215##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0215 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 605.322, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0015##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0015 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 605.349, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*48##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 48 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 605.395, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*42##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 42 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 605.423, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0011##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0011 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 605.457, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*43##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 43 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 605.493, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*44##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 44 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 605.534, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0512##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0512 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 605.569, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0214##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0214 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 605.611, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*1*62##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 62 is switched on." + }, + { + "run": "run4_listen_600_s", + "t": 605.652, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0211##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0211 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 605.69, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*31##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 31 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 605.726, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0212##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0212 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 605.767, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0310##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0310 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 605.813, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*1*63##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 63 is switched on." + }, + { + "run": "run4_listen_600_s", + "t": 605.846, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*24##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 24 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 605.89, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*32##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 32 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 605.923, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*1*27##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 27 is switched on." + }, + { + "run": "run4_listen_600_s", + "t": 605.982, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*28##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 28 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 606.02, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0510##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0510 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 606.049, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0213##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0213 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 606.099, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0511##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0511 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 606.122, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0214##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0214 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 606.171, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*16##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 16 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 606.203, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0415##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0415 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 606.263, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0413##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0413 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 606.302, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0411##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0411 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 606.354, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*61##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 61 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 606.394, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0510##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0510 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 606.448, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*0511##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 0511 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 606.504, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*68##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 68 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 606.564, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*1*0*69##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 69 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 612.923, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#1*06*4*100*4##", + "ownd_class": "OWNLightingEvent", + "ownd_log": "Light 06 is switched off." + }, + { + "run": "run4_listen_600_s", + "t": 613.57, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*40*0*0226##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 40's main sensor is reporting a temperature of 22.6°C." + }, + { + "run": "run4_listen_600_s", + "t": 613.873, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*40*12*0225*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 40's local target temperature is set to 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 613.877, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*40##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 40's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 614.153, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*40*14*0225*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 40's target temperature is set to 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 614.274, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*40*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 40's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 614.474, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*40*60*48##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 40's main sensor is reporting a humidity of 48.0%." + }, + { + "run": "run4_listen_600_s", + "t": 615.153, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*59*0*0237##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 59's main sensor is reporting a temperature of 23.7°C." + }, + { + "run": "run4_listen_600_s", + "t": 615.443, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*59*12*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 59's local target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 615.487, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*59##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 59's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 615.744, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*59*14*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 59's target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 615.844, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*59*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 59's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 616.099, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*59*60*66##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 59's main sensor is reporting a humidity of 66.0%." + }, + { + "run": "run4_listen_600_s", + "t": 616.773, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*58*0*0231##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 58's main sensor is reporting a temperature of 23.1°C." + }, + { + "run": "run4_listen_600_s", + "t": 617.072, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*58*12*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 58's local target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 617.083, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*58##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 58's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 617.355, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*58*14*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 58's target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 617.461, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*58*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 58's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 617.713, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*58*60*57##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 58's main sensor is reporting a humidity of 57.0%." + }, + { + "run": "run4_listen_600_s", + "t": 618.389, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*53*0*0228##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 53's main sensor is reporting a temperature of 22.8°C." + }, + { + "run": "run4_listen_600_s", + "t": 618.694, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*53*12*0225*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 53's local target temperature is set to 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 618.704, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*53##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 53's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 618.983, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*53*14*0225*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 53's target temperature is set to 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 619.088, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*53*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 53's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 619.314, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*53*60*60##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 53's main sensor is reporting a humidity of 60.0%." + }, + { + "run": "run4_listen_600_s", + "t": 619.995, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*55*0*0246##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 55's main sensor is reporting a temperature of 24.6°C." + }, + { + "run": "run4_listen_600_s", + "t": 620.293, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*55*12*0225*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 55's local target temperature is set to 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 620.313, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*55##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 55's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 620.584, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*55*14*0225*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 55's target temperature is set to 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 620.704, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*55*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 55's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 620.934, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*55*60*49##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 55's main sensor is reporting a humidity of 49.0%." + }, + { + "run": "run4_listen_600_s", + "t": 621.616, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*39*0*0221##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 39's main sensor is reporting a temperature of 22.1°C." + }, + { + "run": "run4_listen_600_s", + "t": 621.914, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*39*12*0220*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 39's local target temperature is set to 22.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 621.931, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*39##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 39's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 622.203, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*39*14*0220*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 39's target temperature is set to 22.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 622.264, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*39*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 39's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 622.494, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*39*60*48##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 39's main sensor is reporting a humidity of 48.0%." + }, + { + "run": "run4_listen_600_s", + "t": 623.195, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*68*0*0232##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 68's main sensor is reporting a temperature of 23.2°C." + }, + { + "run": "run4_listen_600_s", + "t": 623.473, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*68*12*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 68's local target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 623.502, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*68##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 68's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 623.773, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*68*14*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 68's target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 623.865, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*68*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 68's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 624.106, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*68*60*55##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 68's main sensor is reporting a humidity of 55.0%." + }, + { + "run": "run4_listen_600_s", + "t": 624.793, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*61*0*0237##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 61's main sensor is reporting a temperature of 23.7°C." + }, + { + "run": "run4_listen_600_s", + "t": 625.095, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*61*12*0225*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 61's local target temperature is set to 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 625.113, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*61##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 61's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 625.383, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*61*14*0225*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 61's target temperature is set to 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 625.528, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*61*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 61's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 625.781, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*61*60*52##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 61's main sensor is reporting a humidity of 52.0%." + }, + { + "run": "run4_listen_600_s", + "t": 626.458, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*43*0*0226##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 43's main sensor is reporting a temperature of 22.6°C." + }, + { + "run": "run4_listen_600_s", + "t": 626.781, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*43*12*0225*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 43's local target temperature is set to 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 626.782, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*43##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 43's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 627.053, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*43*14*0225*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 43's target temperature is set to 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 627.124, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*43*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 43's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 627.352, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*43*60*55##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 43's main sensor is reporting a humidity of 55.0%." + }, + { + "run": "run4_listen_600_s", + "t": 628.017, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*42*0*0231##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 42's main sensor is reporting a temperature of 23.1°C." + }, + { + "run": "run4_listen_600_s", + "t": 628.328, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*42*12*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 42's local target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 628.342, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*42##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 42's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 628.624, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*42*14*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 42's target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 628.703, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*42*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 42's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 628.904, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*42*60*52##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 42's main sensor is reporting a humidity of 52.0%." + }, + { + "run": "run4_listen_600_s", + "t": 629.583, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*41*0*0210##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 41's main sensor is reporting a temperature of 21.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 629.886, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*41*12*0130*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 41's local target temperature is set to 13.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 629.896, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*41##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 41's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 630.173, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*41*14*0130*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 41's target temperature is set to 13.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 630.241, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*41*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 41's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 630.425, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*41*60*44##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 41's main sensor is reporting a humidity of 44.0%." + }, + { + "run": "run4_listen_600_s", + "t": 631.128, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*65*0*0235##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 65's main sensor is reporting a temperature of 23.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 631.423, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*65*12*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 65's local target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 631.453, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*65##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 65's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 631.723, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*65*14*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 65's target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 631.823, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*65*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 65's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 632.483, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*49*0*0262##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 49's main sensor is reporting a temperature of 26.2°C." + }, + { + "run": "run4_listen_600_s", + "t": 632.775, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*49*12*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 49's local target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 632.801, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*49##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 49's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 633.061, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*49*14*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 49's target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 633.203, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*49*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 49's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 633.84, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*52*0*0243##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 52's main sensor is reporting a temperature of 24.3°C." + }, + { + "run": "run4_listen_600_s", + "t": 634.134, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*52*12*0225*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 52's local target temperature is set to 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 634.153, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*52##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 52's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 634.424, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*52*14*0225*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 52's target temperature is set to 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 634.524, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*52*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 52's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 635.174, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*46*0*0238##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 46's main sensor is reporting a temperature of 23.8°C." + }, + { + "run": "run4_listen_600_s", + "t": 635.464, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*46*12*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 46's local target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 635.49, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*46##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 46's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 635.763, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*46*14*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 46's target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 635.819, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*46*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 46's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 636.458, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*66*0*0250##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 66's main sensor is reporting a temperature of 25.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 636.773, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*66*12*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 66's local target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 636.782, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*66##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 66's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 637.053, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*66*14*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 66's target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 637.173, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*66*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 66's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 637.82, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*51*0*0253##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 51's main sensor is reporting a temperature of 25.3°C." + }, + { + "run": "run4_listen_600_s", + "t": 638.115, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*51*12*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 51's local target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 638.133, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*51##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 51's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 638.414, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*51*14*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 51's target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 638.514, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*51*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 51's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 639.144, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*63*0*0231##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 63's main sensor is reporting a temperature of 23.1°C." + }, + { + "run": "run4_listen_600_s", + "t": 639.452, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*63*12*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 63's local target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 639.469, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*63##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 63's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 639.743, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*63*14*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 63's target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 639.853, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*63*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 63's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 640.494, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*36*0*0226##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 36's main sensor is reporting a temperature of 22.6°C." + }, + { + "run": "run4_listen_600_s", + "t": 640.809, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*36*12*0225*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 36's local target temperature is set to 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 640.823, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*36##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 36's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 641.084, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*36*14*0225*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 36's target temperature is set to 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 641.143, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*36*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 36's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 641.788, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*67*0*0242##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 67's main sensor is reporting a temperature of 24.2°C." + }, + { + "run": "run4_listen_600_s", + "t": 642.093, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*67*12*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 67's local target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 642.112, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*67##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 67's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 642.383, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*67*14*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 67's target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 642.513, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*67*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 67's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 643.164, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*50*0*0250##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 50's main sensor is reporting a temperature of 25.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 643.464, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*50*12*0225*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 50's local target temperature is set to 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 643.477, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*50##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 50's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 643.745, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*50*14*0225*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 50's target temperature is set to 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 643.842, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*50*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 50's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 644.499, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*44*0*0239##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 44's main sensor is reporting a temperature of 23.9°C." + }, + { + "run": "run4_listen_600_s", + "t": 644.785, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*44*12*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 44's local target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 644.788, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*44##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 44's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 645.074, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*44*14*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 44's target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 645.144, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*44*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 44's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 645.791, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*38*0*0251##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 38's main sensor is reporting a temperature of 25.1°C." + }, + { + "run": "run4_listen_600_s", + "t": 646.084, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*38*12*0225*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 38's local target temperature is set to 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 646.093, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*38##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 38's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 646.373, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*38*14*0225*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 38's target temperature is set to 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 646.444, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*38*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 38's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 647.093, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*45*0*0242##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 45's main sensor is reporting a temperature of 24.2°C." + }, + { + "run": "run4_listen_600_s", + "t": 647.385, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*45*12*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 45's local target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 647.397, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*45##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 45's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 647.684, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*45*14*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 45's target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 647.748, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*45*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 45's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 648.386, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*37*0*0206##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 37's main sensor is reporting a temperature of 20.6°C." + }, + { + "run": "run4_listen_600_s", + "t": 648.684, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*37*12*0130*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 37's local target temperature is set to 13.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 648.695, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*37##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 37's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 648.967, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*37*14*0130*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 37's target temperature is set to 13.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 649.04, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*37*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 37's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 649.703, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*35*0*0224##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 35's main sensor is reporting a temperature of 22.4°C." + }, + { + "run": "run4_listen_600_s", + "t": 649.995, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*35*12*0200*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 35's local target temperature is set to 20.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 650.01, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*35##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 35's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 650.281, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*35*14*0200*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 35's target temperature is set to 20.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 650.342, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*35*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 35's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 650.983, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*64*0*0232##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 64's main sensor is reporting a temperature of 23.2°C." + }, + { + "run": "run4_listen_600_s", + "t": 651.283, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*64*12*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 64's local target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 651.303, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*64##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 64's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 651.575, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*64*14*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 64's target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 651.694, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*64*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 64's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 652.344, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*62*0*0249##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 62's main sensor is reporting a temperature of 24.9°C." + }, + { + "run": "run4_listen_600_s", + "t": 652.643, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*62*12*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 62's local target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 652.656, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*62##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 62's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 652.925, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*62*14*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 62's target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 653.021, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*62*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 62's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 653.682, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*69*0*0235##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 69's main sensor is reporting a temperature of 23.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 653.974, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*69*12*0225*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 69's local target temperature is set to 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 653.994, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*69##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 69's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 654.265, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*69*14*0225*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 69's target temperature is set to 22.5°C." + }, + { + "run": "run4_listen_600_s", + "t": 654.375, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*69*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 69's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 654.623, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*69*60*52##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 69's main sensor is reporting a humidity of 52.0%." + }, + { + "run": "run4_listen_600_s", + "t": 655.323, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*48*0*0233##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 48's main sensor is reporting a temperature of 23.3°C." + }, + { + "run": "run4_listen_600_s", + "t": 655.614, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*48*12*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 48's local target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 655.626, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*48##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 48's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 655.894, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*48*14*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 48's target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 655.965, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*48*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 48's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 656.163, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*48*60*54##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 48's main sensor is reporting a humidity of 54.0%." + }, + { + "run": "run4_listen_600_s", + "t": 656.873, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*47*0*0236##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 47's main sensor is reporting a temperature of 23.6°C." + }, + { + "run": "run4_listen_600_s", + "t": 657.146, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*47*12*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 47's local target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 657.163, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*47##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 47's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 657.443, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*47*14*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 47's target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 657.514, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*47*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 47's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 657.734, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*47*60*57##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 47's main sensor is reporting a humidity of 57.0%." + }, + { + "run": "run4_listen_600_s", + "t": 658.424, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*60*0*0242##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 60's main sensor is reporting a temperature of 24.2°C." + }, + { + "run": "run4_listen_600_s", + "t": 658.724, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*60*12*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 60's local target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 658.739, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*60##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 60's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 659.014, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*60*14*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 60's target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 659.106, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*60*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 60's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 659.334, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*60*60*54##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 60's main sensor is reporting a humidity of 54.0%." + }, + { + "run": "run4_listen_600_s", + "t": 660.012, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*70*0*0231##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 70's main sensor is reporting a temperature of 23.1°C." + }, + { + "run": "run4_listen_600_s", + "t": 660.331, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*70*12*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 70's local target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 660.343, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*70##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 70's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 660.614, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*70*14*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 70's target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 660.703, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*70*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 70's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 660.946, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*70*60*68##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 70's main sensor is reporting a humidity of 68.0%." + }, + { + "run": "run4_listen_600_s", + "t": 661.624, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*57*0*0236##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 57's main sensor is reporting a temperature of 23.6°C." + }, + { + "run": "run4_listen_600_s", + "t": 661.933, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*57*12*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 57's local target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 661.948, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*1*57##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 57's season is heating." + }, + { + "run": "run4_listen_600_s", + "t": 662.215, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*57*14*0230*3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 57's target temperature is set to 23.0°C." + }, + { + "run": "run4_listen_600_s", + "t": 662.323, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*57*13*00##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 57's local offset is set to 0°C." + }, + { + "run": "run4_listen_600_s", + "t": 662.575, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*57*60*51##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 57's main sensor is reporting a humidity of 51.0%." + }, + { + "run": "run4_listen_600_s", + "t": 664.411, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*4002#70*0#3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 0's mode is unknown." + }, + { + "run": "run4_listen_600_s", + "t": 664.467, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*4002*70##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 70's mode is unknown." + }, + { + "run": "run4_listen_600_s", + "t": 666.399, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*70#1*#20*0##", + "ownd_class": "OWNHeatingCommand", + "ownd_log": "*#4*70#1*#20*0##" + }, + { + "run": "run4_listen_600_s", + "t": 666.445, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*70#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 70's actuator 1 is off." + }, + { + "run": "run4_listen_600_s", + "t": 783.938, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*4002#51*0#3##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 0's mode is unknown." + }, + { + "run": "run4_listen_600_s", + "t": 783.977, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*4002*51##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 51's mode is unknown." + }, + { + "run": "run4_listen_600_s", + "t": 785.953, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*51#1*#20*0##", + "ownd_class": "OWNHeatingCommand", + "ownd_log": "*#4*51#1*#20*0##" + }, + { + "run": "run4_listen_600_s", + "t": 785.984, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*51#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 51's actuator 1 is off." + }, + { + "run": "run4_listen_600_s", + "t": 793.954, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#13**#1*00*25*10*2026##", + "ownd_class": "OWNGatewayCommand", + "ownd_log": "Gateway broadcasting internal date: 2026-10-25." + }, + { + "run": "run4_listen_600_s", + "t": 793.963, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#13**#0*13*00*00*##", + "ownd_class": "OWNGatewayCommand", + "ownd_log": "Gateway broadcasting internal time: 13:00:00." + }, + { + "run": "run4_listen_600_s", + "t": 838.501, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*4002#46*0#2##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 0's mode is unknown." + }, + { + "run": "run4_listen_600_s", + "t": 838.538, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*4002*46##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 46's mode is unknown." + }, + { + "run": "run4_listen_600_s", + "t": 840.475, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*46#1*#20*0##", + "ownd_class": "OWNHeatingCommand", + "ownd_log": "*#4*46#1*#20*0##" + }, + { + "run": "run4_listen_600_s", + "t": 840.52, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*46#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 46's actuator 1 is off." + }, + { + "run": "run4_listen_600_s", + "t": 960.212, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*4002#43*0#2##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 0's mode is unknown." + }, + { + "run": "run4_listen_600_s", + "t": 960.26, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*4*4002*43##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 43's mode is unknown." + }, + { + "run": "run4_listen_600_s", + "t": 962.309, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*43#1*#20*0##", + "ownd_class": "OWNHeatingCommand", + "ownd_log": "*#4*43#1*#20*0##" + }, + { + "run": "run4_listen_600_s", + "t": 962.35, + "step": "listen", + "dir": "rx", + "session": "evt", + "frame": "*#4*43#1*20*0##", + "ownd_class": "OWNHeatingEvent", + "ownd_log": "Zone 43's actuator 1 is off." + } + ] +} diff --git a/tests/test_f461_actuators_live_2026_10_25_trace.py b/tests/test_f461_actuators_live_2026_10_25_trace.py new file mode 100644 index 00000000..85c7402e --- /dev/null +++ b/tests/test_f461_actuators_live_2026_10_25_trace.py @@ -0,0 +1,540 @@ +"""Replay and verification tests for the 2026-10-25 live BTicino F461 actuator-switching capture. + +Fixture: + tests/fixtures/traces/f461_actuators_live_2026-10-25/myhome_trace_F461_actuators_live_2026-10-25.json + +The capture is the one asked for in review 5642758778 of #792 (actuator status at startup and +``hvac_action`` from dimension 20): a local Home Assistant running the integration at the head of +#792 was restarted with an event-only listener on the bus of the F461 2.0.11 plant (Living Now +KW4691 standalone thermostat at zone 2, BT-F430/2 heating valve as actuator 1, BT-F430/4 fan coil +as actuator 2, heating season, no central unit). Every request is Home Assistant's, taken from its +debug log and placed on the listener's clock (``source: home_assistant``, ``t_estimated``); the +frames are the listener's. Every test pins a fact of the trace itself (a frame present, an order, +an ACK, a timing) or replays the event-session frames through the climate entity as it is on the +base branch with the pinned OWNd. + +What the plant said: + +- Startup: ``*#4*2##`` answered ``0``, ``12`` = 23.5, ``*4*1*2##``, ``14`` = 23.5, ``13`` in 1.31 s; + ``*#4*2*60##`` 34 % in 124 ms; ``*#4*2*19##`` -> ``*#4*2*19*5*0##`` in 103 ms; then + ``*#4*#0*20##`` was answered by the fan coil (``*#4*2#2*20*5##``, +88 ms) and the valve + (``*#4*2#1*20*0##``, +128 ms) and ACKed 2.13 s after it was sent. +- ``climate.set_temperature`` 26.0 (``*#4*2*#14*0260*3##``, ACK 90 ms, no reply): echo + ``*#4*2*12*0260*3##``, ``*4*1*2##``, ``*#4*2*0*0240##`` 26 ms after the ACK, no dimension 14 + frame; 2.2 s after the echo the valve reported itself on, ``*#4*2#1*#20*1##`` then 37 ms later + ``*#4*2#1*20*1##``. +- ``climate.set_temperature`` 23.5 (``*#4*2*#14*0235*3##``, ACK 104 ms, no reply): the same echo + with 23.5, 50 ms after the ACK; 2.1 s after the echo ``*#4*2#1*#20*0##`` then ``*#4*2#1*20*0##``. +- The fan coil (actuator 2) sent nothing but its startup reply; the valve's two switches are the + only dimension 20 frames outside the startup reply. +- ``*#4*2#1*#20*1##`` / ``*#4*2#1*#20*0##`` (the dimension written as ``#20``) parse in the pinned + OWNd as ``OWNHeatingCommand`` with no zone, so the integration logs them as unsupported and the + entity only sees the status form that follows (no OWNd change decodes the ``#20`` write-form echo + yet); the tests accept an event decoding of them as well. +""" + +from __future__ import annotations + +import asyncio +import json +import re +from pathlib import Path +from types import SimpleNamespace +from unittest.mock import AsyncMock, MagicMock, patch + +import pytest +from homeassistant.components.climate import HVACAction, HVACMode +from homeassistant.core import HomeAssistant +from OWNd.message import OWNCommand, OWNMessage +from OWNd.profiles import F461Profile + +from custom_components.myhome.const import CONF_ENTITY, CONF_PLATFORMS, DOMAIN +from tests.conftest import attach_platform, attach_runtime + +MAC = "00:03:50:00:10:25" +FIXTURE = ( + Path(__file__).resolve().parent + / "fixtures" + / "traces" + / "f461_actuators_live_2026-10-25" + / "myhome_trace_F461_actuators_live_2026-10-25.json" +) + +RUN1 = "run1_startup_sweep_and_actuator_request" +RUN2 = "run2_setpoint_26_0_valve_on" +RUN3 = "run3_restore_23_5_valve_off" +ALL_RUNS = (RUN1, RUN2, RUN3) + +COVER_POLL = "*#2*05##" +COVER_STOPPED = "*2*0*05##" +ZONE_STATUS = "*#4*2##" +HUMIDITY_READ = "*#4*2*60##" +VALVES_READ = "*#4*2*19##" +ACTUATORS_REQUEST = "*#4*#0*20##" +WRITE_26 = "*#4*2*#14*0260*3##" +WRITE_23_5 = "*#4*2*#14*0235*3##" +SEASON = "*4*1*2##" +TEMPERATURE = "*#4*2*0*0240##" +HUMIDITY = "*#4*2*60*34##" +VALVES = "*#4*2*19*5*0##" +OFFSET = "*#4*2*13*00##" +FAN_COIL_OFF = "*#4*2#2*20*5##" +VALVE_OFF = "*#4*2#1*20*0##" +VALVE_ON = "*#4*2#1*20*1##" +VALVE_ON_CMD_FORM = "*#4*2#1*#20*1##" +VALVE_OFF_CMD_FORM = "*#4*2#1*#20*0##" +ACK = "*#*1##" + + +def dim(number: int, value: str) -> str: + return f"*#4*2*{number}*{value}*3##" + + +@pytest.fixture(scope="module") +def trace_payload() -> dict: + """Load the 2026-10-25 F461 actuator trace archive.""" + assert FIXTURE.is_file(), FIXTURE + return json.loads(FIXTURE.read_text(encoding="utf-8")) + + +@pytest.fixture(scope="module") +def rows(trace_payload: dict) -> list[dict]: + """Return the chronological session log rows.""" + return trace_payload["rows"] + + +@pytest.fixture(scope="module") +def frames(trace_payload: dict) -> list[dict]: + """Return the event-session frames.""" + return trace_payload["frames"] + + +def _results(rows: list[dict], run: str | None = None, frame: str | None = None) -> list[dict]: + return [r for r in rows if r["dir"] == "result" and (run is None or r["run"] == run) and (frame is None or r["frame"] == frame)] + + +def _result(rows: list[dict], run: str, frame: str) -> dict: + found = _results(rows, run, frame) + assert len(found) == 1, (run, frame, len(found)) + return found[0] + + +def _tx(rows: list[dict], run: str, frame: str) -> dict: + found = [r for r in rows if r["dir"] == "tx" and r["run"] == run and r["frame"] == frame] + assert len(found) == 1, (run, frame, len(found)) + return found[0] + + +def _evt(rows: list[dict], run: str | None = None) -> list[dict]: + return [r for r in rows if (run is None or r["run"] == run) and r["dir"] == "rx" and r["session"] == "evt"] + + +def _evt_after(rows: list[dict], run: str, frame: str) -> list[dict]: + """Event-session rows of ``run`` from the request ``frame`` until the next request of that run.""" + run_rows = [r for r in rows if r["run"] == run] + start = next(i for i, r in enumerate(run_rows) if r["dir"] == "tx" and r["frame"] == frame) + out: list[dict] = [] + for r in run_rows[start + 1 :]: + if r["dir"] == "tx": + break + if r["dir"] == "rx" and r["session"] == "evt": + out.append(r) + return out + + +def _gateway() -> MagicMock: + gw = MagicMock() + gw.mac = MAC + gw.unique_id = MAC + gw.bus_group = MAC + gw.primary_gateway_mac = None + gw.delegated_whos = set() + gw.delegated_away_whos = set() + gw.log_id = "[F461 actuators live 2026-10-25]" + gw.model = "F461" + gw.has_central_unit = False + gw.supports_zone_status = True + gw.initial_discovery_pending = False + gw.is_connected = True + gw.profile = F461Profile() + gw._gateway = SimpleNamespace(profile=gw.profile) + gw.sent: list[str] = [] + + async def _send(cmd, *a, **k): + gw.sent.append(str(cmd)) + fut: asyncio.Future[bool] = asyncio.get_running_loop().create_future() + fut.set_result(True) + return fut + + gw.send = AsyncMock(side_effect=_send) + gw.send_status_request = AsyncMock(side_effect=_send) + return gw + + +async def _setup_zone_2(hass: HomeAssistant): + from custom_components.myhome.climate import async_setup_entry as climate_setup + + gw = _gateway() + platforms_cfg = { + "climate": { + "climate_zone_2": { + "who": "4", + "zone": "2", + "name": "Climate Zone 2", + "heat": True, + "cool": True, + "standalone": True, + "central": False, + "manufacturer": "BTicino", + "model": "F461", + } + }, + } + hass.data = {DOMAIN: {MAC: {CONF_ENTITY: gw, CONF_PLATFORMS: platforms_cfg}}} + entry = MagicMock() + entry.data = {"mac": MAC} + entry.entry_id = "f461_actuators_live_2026_10_25" + entry.options = {} + attach_runtime(hass, entry, MAC, gw) + climates: list = [] + with ( + patch("custom_components.myhome.discovery.er.async_entries_for_config_entry", return_value=[]), + patch("custom_components.myhome.discovery.er.async_get", return_value=MagicMock()), + ): + await climate_setup(hass, entry, climates.extend) + assert len(climates) == 1 + zone = climates[0] + zone.hass = hass + zone.entity_id = f"climate.{zone._device_id}" + zone.async_write_ha_state = MagicMock() + zone.async_schedule_update_ha_state = MagicMock() + attach_platform(zone, entry) + return zone + + +def _replay(zone, evt_rows: list[dict]) -> list[tuple[str, str | None, float | None, str | None]]: + """Feed the zone-2 heating events of ``evt_rows`` to the entity as the gateway handler does. + + Returns (frame, hvac_action, shown target, hvac_mode) after each frame the entity received. + A frame the pinned OWNd parses as a command (the ``#20`` forms) is not an event and is not + routed to the entity; a later OWNd that decodes it as a zone-2 event is replayed like the rest. + """ + seen: list[tuple[str, str | None, float | None, str | None]] = [] + for r in evt_rows: + msg = OWNMessage.parse(r["frame"]) + assert msg is not None, r + if getattr(msg, "who", None) == 4 and getattr(msg, "zone", None) == 2 and msg.__class__.__name__ == "OWNHeatingEvent": + zone.handle_event(msg) + seen.append((r["frame"], zone.hvac_action, zone.target_temperature, zone.hvac_mode)) + return seen + + +# --------------------------------------------------------------- schema, privacy, parsing + + +def test_schema_runs_and_synthetic_identity(trace_payload: dict, rows: list[dict], frames: list[dict]) -> None: + """Fixture metadata, synthetic identity, run names and counts, one monotonic time axis.""" + gw = trace_payload["gateway"] + assert gw["model"] == "F461" and gw["firmware"] == "2.0.11" + assert gw["ip"] == "192.0.2.92" and gw["mac"] == MAC + assert gw["identification"] == {"model": "F461", "who13_code": "200", "who13_model_name": "F461", "who1013_code": "134"} + capture = trace_payload["capture"] + assert capture["kind"] == "derived_trace_archive" + assert [r["run"] for r in capture["runs"]] == list(ALL_RUNS) + assert capture["runs"][0]["t_offset"] == 0.0 + assert [r["listener"] for r in capture["runs"]] == ["evt.jsonl"] * 3 + assert capture["listener"]["file"] == "evt.jsonl" and capture["listener"]["duration_s"] == 3600 + assert capture["window"] == {"first": "2026-10-25T08:31:43+00:00", "last": "2026-10-25T08:35:57+00:00", "frames": 20, "rows": 51} + assert len(frames) == 20 and len(rows) == 51 + assert {r["run"] for r in rows} == set(ALL_RUNS) + assert [(r["run"], r["utc"], r["rows"], r["frames"], r["home_assistant_requests"]) for r in capture["runs"]] == [ + (RUN1, "08:31:43-08:31:48", 35, 10, [COVER_POLL, ZONE_STATUS, HUMIDITY_READ, VALVES_READ, ACTUATORS_REQUEST]), + (RUN2, "08:32:59-08:33:02", 8, 5, [WRITE_26]), + (RUN3, "08:35:55-08:35:57", 8, 5, [WRITE_23_5]), + ] + assert [r["t_offset"] for r in capture["runs"]] == [0.0, 76.431, 251.82] + ts = [f["timestamp"] for f in frames] + assert ts == sorted(ts), "one monotonic time axis across the runs" + assert all(a["t"] <= b["t"] for a, b in zip(rows, rows[1:], strict=False)) + assert all(f["direction"] == "rx" and f["session"] == "evt" for f in frames) + assert [r["frame"] for r in rows if r["dir"] == "rx" and r["session"] == "evt"] == [f["raw"] for f in frames] + assert [(r["t"], r["run"]) for r in _evt(rows)] == [(f["timestamp"], f["run"]) for f in frames] + # every request is Home Assistant's, from its debug log: no probe command session in this capture + for r in rows: + if r["dir"] == "tx" or r["dir"] == "result" or (r["dir"] == "rx" and r["session"] == "cmd"): + assert r["source"] == "home_assistant" and r["t_estimated"] is True, r + else: + assert "source" not in r and "t_estimated" not in r, r + assert "probe_segments" not in json.dumps(capture) + # the entity's recorded service calls and state changes (UTC wall clock), generic entity, #792 head + states = capture["home_assistant_entity_states"] + assert [(s["utc"], s["kind"]) for s in states] == [ + ("08:32:59.787", "service_call"), + ("08:32:59.910", "state"), + ("08:33:02.150", "state"), + ("08:33:59.788", "service_call"), + ] + assert [s.get("temperature") for s in states] == [26.0, 26.0, 26.0, 23.5] + assert [(s["hvac_action"], s["actuators"]) for s in states if s["kind"] == "state"] == [ + ("idle", {"1": "off", "2": "off"}), + ("heating", {"1": "on", "2": "off"}), + ] + assert states[3]["note"].startswith("not delivered"), "the harness's first restore call was dropped by Home Assistant: nothing reached the bus" + # privacy: the only MAC-like string is the synthetic one, no LAN address, no local path, no room name + text = json.dumps(trace_payload) + assert set(re.findall(r"(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}", text)) == {MAC} + assert not re.search(r"192[.*]168", text) and "/Users/" not in text and "\\\\" not in text, "no LAN address, no local path" + assert not re.search(r"climate\.(?!set_temperature\b)\w+", text), "no entity id in the archive (the service name is the only 'climate.' string)" + assert not any(f["raw"].startswith("*#13**") for f in frames), "no WHO 13 identity or clock frame was exchanged" + # WHO 4 zone 2 and the cover 05 poll's reply are all the capture holds + assert {re.match(r"^\*#?(\d+)\*", f["raw"]).group(1) for f in frames} == {"2", "4"} + assert [f["raw"] for f in frames if not f["raw"].startswith(("*#4*2", "*4*1*2"))] == [COVER_STOPPED] + + +def test_every_frame_parses_in_ownd(rows: list[dict], frames: list[dict]) -> None: + """Every rx frame parses in the pinned OWNd; every tx frame parses as a command.""" + for item in frames: + assert OWNMessage.parse(item["raw"]) is not None, f"Failed to parse evt frame: {item['raw']}" + for r in rows: + if r["dir"] == "tx": + cmd = OWNCommand.parse(r["frame"]) + assert cmd is not None, r + # the archive row pins what the pinned OWNd classified; a later OWNd may class a + # dimension read as a status request, so that is accepted too + assert bool(cmd.is_status_request) == r["is_status_request"] or bool( + getattr(cmd, "is_dimension_request", False) + ), r + elif r["dir"] == "rx" and r["frame"] != ACK: + assert OWNMessage.parse(r["frame"]) is not None, r + # the status form of dimension 20: zone 2, actuator in the WHERE parameter, is_active from the value + for raw, active, log in ( + (VALVE_OFF, False, "Zone 2's actuator 1 is off."), + (VALVE_ON, True, "Zone 2's actuator 1 is on."), + (FAN_COIL_OFF, False, "Zone 2's fan is off."), + ): + msg = OWNMessage.parse(raw) + assert msg is not None and msg.zone == 2 and msg.dimension == 20 + assert msg.__class__.__name__ == "OWNHeatingEvent" and msg.is_active() is active + assert msg.human_readable_log == log + assert OWNMessage.parse(FAN_COIL_OFF).fan_on is False, "value 5 is the fan-coil side off (OWNd's dimension 20 >= 5 rule)" + # the '#20' command form the F461 emits 3 - 37 ms before each status form: the pinned OWNd + # (<= 2.0.0b11) parses it as a command with no zone (the integration logs "Unsupported message + # type" and the entity never sees it); no OWNd change decodes the '#20' write-form echo yet. + # An event decoding is accepted too, so OWNd's MyHOME conformance gate stays green if one lands. + for raw, active in ((VALVE_ON_CMD_FORM, True), (VALVE_OFF_CMD_FORM, False)): + msg = OWNMessage.parse(raw) + assert msg is not None and msg.who == 4 and msg.dimension == 20 + if msg.__class__.__name__ == "OWNHeatingCommand": + assert getattr(msg, "zone", None) is None + assert msg.human_readable_log == raw + else: + assert msg.__class__.__name__ == "OWNHeatingEvent" and msg.zone == 2 and msg.is_active() is active + assert [r["ownd_class"] for r in _evt(rows) if r["frame"].startswith("*#4*2#")] == [ + "OWNHeatingEvent", "OWNHeatingEvent", "OWNHeatingCommand", "OWNHeatingEvent", "OWNHeatingCommand", "OWNHeatingEvent", + ] # fmt: skip + valves = OWNMessage.parse(VALVES) + assert valves is not None and valves.dimension == 19 and valves.is_active() is False + assert valves.human_readable_log == "Zone 2's cooling fan is off; heating valve is off." + assert OWNMessage.parse(SEASON).human_readable_log == "Zone 2's season is heating." + assert OWNMessage.parse(COVER_STOPPED).human_readable_log == "Cover 05 stopped." + + +def test_result_rows_are_consistent_with_their_tx_and_cmd_rx_rows(rows: list[dict]) -> None: + """Each result row follows its tx row; the replies sit between the request and its ACK; ACK is logged.""" + assert all(r["ack"] is True for r in _results(rows)), "every request of this capture was ACKed" + assert [r["frame"] for r in _results(rows)] == [COVER_POLL, ZONE_STATUS, HUMIDITY_READ, VALVES_READ, ACTUATORS_REQUEST, WRITE_26, WRITE_23_5] + for run in ALL_RUNS: + run_rows = [r for r in rows if r["run"] == run] + for i, r in enumerate(run_rows): + if r["dir"] != "result": + continue + tx_i = next(j for j in range(i - 1, -1, -1) if run_rows[j]["dir"] == "tx") + tx = run_rows[tx_i] + assert tx["frame"] == r["frame"] and tx["step"] == r["step"] + assert tx["t"] <= r["t"] + assert abs((r["t"] - tx["t"]) - r["reply_time_s"]) < 0.002 + cmd_rx = [x for x in run_rows[tx_i + 1 : i] if x["dir"] == "rx" and x["session"] == "cmd"] + # the F461 delivers the replies one by one: the log collected each at its own time, + # between the request and the ACK, which closes the batch + assert [x["frame"] for x in cmd_rx] == [*r["replies"], ACK] + assert all(tx["t"] <= x["t"] <= r["t"] for x in cmd_rx) + assert cmd_rx[-1]["t"] == r["t"] + assert all(a["t"] <= b["t"] for a, b in zip(cmd_rx, cmd_rx[1:], strict=False)) + pending = [x["frame"] for x in run_rows[tx_i + 1 : i] if x["dir"] == "rx" and x["session"] == "evt" and x["t"] <= r["t"]] + assert r["events_after"] == pending + # a read is delivered on both sessions: what the command session returned is also in + # the event frames of the pending window; a dimension 14 write has no reply and its + # echo arrived after the ACK + if r["frame"].startswith("*#4*2*#14*"): + assert r["replies"] == [] and pending == [], r + else: + assert r["replies"] == pending, r + # every event frame reached the listener 1 - 3 ms before the log collected the reply + for x in cmd_rx[:-1]: + evt_t = next(y["t"] for y in run_rows[tx_i + 1 : i] if y["dir"] == "rx" and y["session"] == "evt" and y["frame"] == x["frame"]) + assert 0.0 <= x["t"] - evt_t <= 0.003, (x, evt_t) + + +# --------------------------------------------------------------- run 1: the startup + + +def test_startup_sweep_zone_status_humidity_and_valves(rows: list[dict]) -> None: + """*#4*2## (0, 12 = 23.5, season, 14 = 23.5, 13 in 1.31 s), then *#4*2*60## and *#4*2*19## one at a time.""" + cover = _result(rows, RUN1, COVER_POLL) + assert cover["t"] == 0.074 and cover["replies"] == [COVER_STOPPED] == cover["events_after"], "the post-discovery cover poll opens the capture" + status = _result(rows, RUN1, ZONE_STATUS) + assert _tx(rows, RUN1, ZONE_STATUS)["t"] == 0.126 + assert status["replies"] == [TEMPERATURE, dim(12, "0235"), SEASON, dim(14, "0235"), OFFSET] + assert status["events_after"] == status["replies"] + assert status["reply_time_s"] == pytest.approx(1.314, abs=0.001) + humidity = _result(rows, RUN1, HUMIDITY_READ) + assert humidity["replies"] == [HUMIDITY] and humidity["reply_time_s"] == pytest.approx(0.124, abs=0.001) + valves = _result(rows, RUN1, VALVES_READ) + assert valves["replies"] == [VALVES] and valves["reply_time_s"] == pytest.approx(0.103, abs=0.001) + # the three requests went out back to back, each after the previous ACK (51 - 53 ms later) + assert _tx(rows, RUN1, HUMIDITY_READ)["t"] - status["t"] == pytest.approx(0.051, abs=0.001) + assert _tx(rows, RUN1, VALVES_READ)["t"] - humidity["t"] == pytest.approx(0.053, abs=0.001) + assert [r["frame"] for r in _evt(rows, RUN1)][:7] == [COVER_STOPPED, TEMPERATURE, dim(12, "0235"), SEASON, dim(14, "0235"), OFFSET, HUMIDITY] + assert [r["step"] for r in _evt(rows, RUN1)] == ["startup_sweep"] * 8 + ["startup_actuator_request"] * 2 + + +def test_startup_actuator_request_is_answered_by_both_actuators_within_0_2_s(rows: list[dict]) -> None: + """*#4*#0*20## 0.75 s after the sweep: fan coil (5, off) at +88 ms, valve (0, off) at +128 ms, ACK at +2.13 s.""" + tx = _tx(rows, RUN1, ACTUATORS_REQUEST) + res = _result(rows, RUN1, ACTUATORS_REQUEST) + assert tx["is_status_request"] is False, "sent as a command: OWNd classifies the dimension request as such" + assert tx["t"] - _result(rows, RUN1, VALVES_READ)["t"] == pytest.approx(0.754, abs=0.001) + assert tx["t"] - _tx(rows, RUN1, ZONE_STATUS)["t"] == pytest.approx(2.399, abs=0.001) + assert res["replies"] == [FAN_COIL_OFF, VALVE_OFF] == res["events_after"] + answers = _evt_after(rows, RUN1, ACTUATORS_REQUEST) + assert [r["frame"] for r in answers] == [FAN_COIL_OFF, VALVE_OFF] + assert [round(r["t"] - tx["t"], 3) for r in answers] == [0.088, 0.128] + assert answers[-1]["t"] - tx["t"] < 0.2, "both actuators answered within 0.2 s" + assert res["reply_time_s"] == pytest.approx(2.134, abs=0.001), "the ACK came 2.0 s after the last reply: the gateway closes the all-zones batch on a timeout" + assert res["t"] == max(r["t"] for r in rows if r["run"] == RUN1), "nothing else reached the listener before the command session was closed idle" + assert [r["ownd_log"] for r in answers] == ["Zone 2's fan is off.", "Zone 2's actuator 1 is off."] + + +# --------------------------------------------------------------- run 2 and 3: the writes switch the valve + + +def test_setpoint_26_0_switches_the_valve_on_2_2_s_after_the_echo(rows: list[dict]) -> None: + """*#4*2*#14*0260*3##: ACK 90 ms, no reply; echo 12 / season / 0 after the ACK; *#4*2#1*#20*1## then *#4*2#1*20*1##.""" + tx = _tx(rows, RUN2, WRITE_26) + res = _result(rows, RUN2, WRITE_26) + assert tx["t"] == 76.431 and tx["is_status_request"] is False + assert res["reply_time_s"] == pytest.approx(0.090, abs=0.001) and res["replies"] == [] and res["events_after"] == [] + evt = _evt_after(rows, RUN2, WRITE_26) + assert [r["frame"] for r in evt] == [dim(12, "0260"), SEASON, TEMPERATURE, VALVE_ON_CMD_FORM, VALVE_ON] + assert evt == _evt(rows, RUN2), "the run holds nothing else" + assert evt[0]["t"] - res["t"] == pytest.approx(0.026, abs=0.001), "the echo reached the event session 26 ms after the ACK" + assert not any(r["frame"].startswith("*#4*2*14*") for r in evt), "a dimension 14 write echoes dimension 12, never dimension 14" + assert evt[3]["t"] - evt[0]["t"] == pytest.approx(2.203, abs=0.001), "the valve reported itself on 2.2 s after the echo" + assert evt[4]["t"] - evt[3]["t"] == pytest.approx(0.037, abs=0.001), "the status form follows the '#20' command form" + assert evt[4]["t"] - tx["t"] == pytest.approx(2.356, abs=0.001) + assert [r["ownd_class"] for r in evt[3:]] == ["OWNHeatingCommand", "OWNHeatingEvent"] + assert evt[4]["ownd_log"] == "Zone 2's actuator 1 is on." + # the run starts 71.8 s after the startup's last row + assert tx["t"] - _result(rows, RUN1, ACTUATORS_REQUEST)["t"] == pytest.approx(71.772, abs=0.001) + + +def test_restore_23_5_switches_the_valve_off_2_1_s_after_the_echo(rows: list[dict]) -> None: + """*#4*2*#14*0235*3##: ACK 104 ms, no reply; echo 12 / season / 0; *#4*2#1*#20*0## then *#4*2#1*20*0## 3 ms later.""" + tx = _tx(rows, RUN3, WRITE_23_5) + res = _result(rows, RUN3, WRITE_23_5) + assert tx["t"] == 251.82 and tx["t"] - _tx(rows, RUN2, WRITE_26)["t"] == pytest.approx(175.389, abs=0.001) + assert res["reply_time_s"] == pytest.approx(0.104, abs=0.001) and res["replies"] == [] and res["events_after"] == [] + evt = _evt_after(rows, RUN3, WRITE_23_5) + assert [r["frame"] for r in evt] == [dim(12, "0235"), SEASON, TEMPERATURE, VALVE_OFF_CMD_FORM, VALVE_OFF] + assert evt == _evt(rows, RUN3) + assert evt[0]["t"] - res["t"] == pytest.approx(0.050, abs=0.001) + assert evt[3]["t"] - evt[0]["t"] == pytest.approx(2.126, abs=0.001), "the valve reported itself off 2.1 s after the echo" + assert evt[4]["t"] - evt[3]["t"] == pytest.approx(0.003, abs=0.001) + assert evt[4]["ownd_log"] == "Zone 2's actuator 1 is off." + assert evt[-1]["t"] == max(r["t"] for r in rows), "the valve's off report is the capture's last row" + + +def test_fan_coil_stays_off_and_the_valve_switches_are_the_only_other_dimension_20_frames(rows: list[dict]) -> None: + """Actuator 2 sent *#4*2#2*20*5## once (the startup reply); actuator 1 reported off, on, off.""" + dim20 = [(r["run"], r["frame"]) for r in _evt(rows) if r["frame"].startswith("*#4*2#")] + assert dim20 == [ + (RUN1, FAN_COIL_OFF), + (RUN1, VALVE_OFF), + (RUN2, VALVE_ON_CMD_FORM), + (RUN2, VALVE_ON), + (RUN3, VALVE_OFF_CMD_FORM), + (RUN3, VALVE_OFF), + ] + assert [f for _, f in dim20 if f.startswith("*#4*2#2")] == [FAN_COIL_OFF] + # the startup reply carries no '#20' command form; each spontaneous switch does, 3 - 37 ms before its status form + cmd_forms = [r for r in _evt(rows) if "*#20*" in r["frame"]] + for cmd in cmd_forms: + status = next(r for r in _evt(rows) if r["t"] > cmd["t"] and r["frame"].startswith("*#4*2#1*20*")) + assert status["frame"].endswith(cmd["frame"][-4:]), (cmd["frame"], status["frame"]) + assert 0.003 <= round(status["t"] - cmd["t"], 3) <= 0.037 + # the three setpoint frames of the capture are the startup's 12 / 14 pair and the two write echoes (dimension 12) + assert [r["frame"] for r in _evt(rows) if r["frame"].startswith(("*#4*2*12*", "*#4*2*14*"))] == [ + dim(12, "0235"), dim(14, "0235"), dim(12, "0260"), dim(12, "0235"), + ] # fmt: skip + assert [r["frame"] for r in _evt(rows)].count(SEASON) == 3, "a season frame rides with every dimension 12 frame" + assert all(r["frame"] == TEMPERATURE for r in _evt(rows) if r["frame"].startswith("*#4*2*0*")), "the measured 24.0 never moved" + + +# --------------------------------------------------------------- entity replay + + +@pytest.mark.asyncio +async def test_replay_hvac_action_idle_heating_idle(hass: HomeAssistant, rows: list[dict]) -> None: + """The three runs through the climate entity on the base branch: idle after the startup, heating on the + valve's on report, idle on its off report; 23.5 -> 26.0 -> 23.5 from the dimension 12 echoes.""" + zone = await _setup_zone_2(hass) + seen = _replay(zone, _evt(rows, RUN1)) + assert [frame for frame, *_ in seen] == [TEMPERATURE, dim(12, "0235"), SEASON, dim(14, "0235"), OFFSET, HUMIDITY, VALVES, FAN_COIL_OFF, VALVE_OFF] + assert seen[1][2:] == (23.5, None) and seen[2][2:] == (23.5, HVACMode.HEAT) + assert all(action is None for _, action, *_ in seen[:6]), "nothing before the valves / actuator replies tells the entity whether it is heating" + assert [action for _, action, *_ in seen[6:]] == [HVACAction.IDLE] * 3, "dimension 19 then both actuators: idle" + assert zone.hvac_action == HVACAction.IDLE and zone.hvac_mode == HVACMode.HEAT + assert zone.target_temperature == 23.5 and zone.current_temperature == 24.0 and zone.current_humidity == 34.0 + attrs = zone.extra_state_attributes + assert attrs["season"] == "heating" and attrs["local_target_temperature"] == 23.5 + assert attrs["fan_coil_cooling"] is True and attrs["fan_coil_heating"] is False, "*#4*2*19*5*0##: the fan coil is the cooling side" + assert attrs["fan_mode"] == "auto" and attrs["running_fan_speed"] == "off", "*#4*2#2*20*5##: the fan coil is off" + assert zone._actuator_states["1"] is False and zone._actuator_states["2"] is False + if "actuators" in attrs: # exposed by #792; the base branch keeps the states internal + assert attrs["actuators"] == {"1": "off", "2": "off"} + + seen = _replay(zone, _evt(rows, RUN2)) + assert [frame for frame, *_ in seen if frame != VALVE_ON_CMD_FORM] == [dim(12, "0260"), SEASON, TEMPERATURE, VALVE_ON] + assert seen[0][1:] == (HVACAction.IDLE, 26.0, HVACMode.HEAT), "the echo moves the setpoint, not the action" + assert all(action == HVACAction.IDLE for frame, action, *_ in seen if not frame.startswith("*#4*2#1")), "idle until the valve reports" + assert seen[-1] == (VALVE_ON, HVACAction.HEATING, 26.0, HVACMode.HEAT) + assert zone.hvac_action == HVACAction.HEATING + assert zone._actuator_states["1"] is True and zone._actuator_states["2"] is False # "valve" only on the base branch + if "actuators" in zone.extra_state_attributes: + assert zone.extra_state_attributes["actuators"] == {"1": "on", "2": "off"} + + seen = _replay(zone, _evt(rows, RUN3)) + assert [frame for frame, *_ in seen if frame != VALVE_OFF_CMD_FORM] == [dim(12, "0235"), SEASON, TEMPERATURE, VALVE_OFF] + assert seen[0][1:] == (HVACAction.HEATING, 23.5, HVACMode.HEAT), "the restore echo moves the setpoint while the valve is still open" + assert all(action == HVACAction.HEATING for frame, action, *_ in seen if not frame.startswith("*#4*2#1")) + assert seen[-1] == (VALVE_OFF, HVACAction.IDLE, 23.5, HVACMode.HEAT) + assert zone.hvac_action == HVACAction.IDLE and zone.target_temperature == 23.5 + assert zone._actuator_states["1"] is False and zone._actuator_states["2"] is False + if "actuators" in zone.extra_state_attributes: + assert zone.extra_state_attributes["actuators"] == {"1": "off", "2": "off"} + assert zone.extra_state_attributes["fan_mode"] == "auto" and zone.extra_state_attributes["running_fan_speed"] == "off" + + +@pytest.mark.asyncio +async def test_replay_action_sequence_matches_the_recorded_entity_states(hass: HomeAssistant, rows: list[dict], trace_payload: dict) -> None: + """Over the whole capture the entity's action changes exactly as Home Assistant recorded it live: idle, heating, idle.""" + zone = await _setup_zone_2(hass) + seen = _replay(zone, _evt(rows)) + actions = [action for _, action, *_ in seen if action is not None] + assert [a for i, a in enumerate(actions) if i == 0 or a != actions[i - 1]] == [HVACAction.IDLE, HVACAction.HEATING, HVACAction.IDLE] + targets = [target for _, _, target, _ in seen if target is not None] + assert [t for i, t in enumerate(targets) if i == 0 or t != targets[i - 1]] == [23.5, 26.0, 23.5] + recorded = [s for s in trace_payload["capture"]["home_assistant_entity_states"] if s["kind"] == "state"] + assert [s["hvac_action"] for s in recorded] == ["idle", "heating"], "the live entity went idle -> heating on the first write (the restore's idle was read back, not recorded)" + assert all(s["hvac_mode"] == "heat" and s["fan"] == "off" for s in recorded) + assert zone.hvac_mode == HVACMode.HEAT and zone.hvac_action == HVACAction.IDLE diff --git a/tests/test_myhomeserver1_live_2026_10_25_trace.py b/tests/test_myhomeserver1_live_2026_10_25_trace.py new file mode 100644 index 00000000..8d122e00 --- /dev/null +++ b/tests/test_myhomeserver1_live_2026_10_25_trace.py @@ -0,0 +1,468 @@ +"""Replay and verification tests for the 2026-10-25 live MyHomeServer1 (firmware 3.87.13) per-zone status-read capture. + +Fixture: + tests/fixtures/traces/myhomeserver1_live_2026-10-25/myhome_trace_MyHomeServer1_live_2026-10-25.json + +The second gateway family next to ``f461_actuators_live_2026-10-25`` for the reads behind #792 +(actuator status at startup, ``hvac_action`` from dimension 20) and #793 (humidity gate): on the +large home plant of ``myhomeserver1_live_2026-10-24`` (WHO 4 zones 35-70) the probe sent +``*#4*#0*20##`` and then, zone by zone, ``*#4*Z*19##``, ``*#4*Z*20##``, ``*#4*Z*11##`` and +``*#4*Z*60##``, then ``*#4*0*60##``, and listened for 600 s. Status reads only. Every test pins a +fact of the trace itself or replays event-session frames through the climate entity as it is on +the base branch with the pinned OWNd. + +What the plant said: + +- ``*#4*#0*20##`` was ACKed in 0.50 s with 8 frames on the command session; the event session + received the whole burst, 47 frames from +0.18 s to +1.91 s (39 of them after the ACK), 43 + distinct: 34 ``Z#1`` (zones 35-70 but 54 and 56), 5 ``Z#2`` fan coils (47, 48, 57, 60, 70) and + the pumps ``0#1``-``0#4``; zones 35-38 answered twice. Every actuator was off (0 / fan 5). +- ``*#4*Z*19##`` and ``*#4*Z*20##``: ACK on 34 zones in 0.16-0.25 s, NACK after 2.1 s on 54 and + 56 (no zone); the five fan-coil zones read ``*#4*Z*19*5*0##`` and answer ``Z#2`` and ``Z#1``. +- ``*#4*Z*11##``: NACK on all 36 zones (the fan-speed dimension is refused on a valve zone, the + split the F461 showed in its heating season in ``f461_live_2026-10-15``). +- ``*#4*Z*60##``: ACK on the 17 zones with a humidity probe in 0.19-0.29 s, NACK after 2.1 s on + the other 19; ``*#4*0*60##`` answers the same 17 zones in 0.66 s. +- The listen: the house's periodic zone sweep (season, 12 / 14 / 13, dimension 7 setpoints, + temperatures, dimension 5, humidity), four valve off reports (each ``*#4*Z#1*#20*0##`` then + ``*#4*Z#1*20*0##``), WHO 1 light traffic and the 13:00 clock broadcast; no actuator switched on. +""" + +from __future__ import annotations + +import json +import re +from pathlib import Path +from unittest.mock import MagicMock, patch + +import pytest +from homeassistant.components.climate import HVACAction, HVACMode +from homeassistant.core import HomeAssistant +from OWNd.message import OWNCommand, OWNMessage +from OWNd.profiles import MyHomeServer1Profile + +from custom_components.myhome.climate import _calling_zones, _zone_address, _zone_route_keys +from custom_components.myhome.const import CONF_ENTITY, CONF_PLATFORMS, DOMAIN +from tests.conftest import attach_platform, attach_runtime +from tests.test_f461_actuators_live_2026_10_25_trace import _gateway + +MAC = "00:03:50:00:10:26" +FIXTURE = ( + Path(__file__).resolve().parent + / "fixtures" + / "traces" + / "myhomeserver1_live_2026-10-25" + / "myhome_trace_MyHomeServer1_live_2026-10-25.json" +) + +RUN1 = "run1_identify_and_all_zones_actuators" +RUN2 = "run2_per_zone_reads_19_20_11_60" +RUN3 = "run3_general_humidity" +RUN4 = "run4_listen_600_s" +ALL_RUNS = (RUN1, RUN2, RUN3, RUN4) + +ZONES = tuple(range(35, 71)) +NO_ZONE = (54, 56) +FAN_COIL_ZONES = (47, 48, 57, 60, 70) +HUMIDITY_ZONES = (39, 40, 41, 42, 43, 47, 48, 53, 55, 57, 58, 59, 60, 61, 68, 69, 70) +HUMIDITY = {39: 47, 40: 48, 41: 43, 42: 51, 43: 55, 47: 58, 48: 53, 53: 60, 55: 49, 57: 51, 58: 57, 59: 66, 60: 54, 61: 52, 68: 55, 69: 52, 70: 68} +PUMPS = ("*#4*0#1*20*0##", "*#4*0#2*20*0##", "*#4*0#3*20*0##", "*#4*0#4*20*0##") +ALL_ZONES_REQUEST = "*#4*#0*20##" +GENERAL_HUMIDITY = "*#4*0*60##" + + +@pytest.fixture(scope="module") +def trace_payload() -> dict: + assert FIXTURE.is_file(), FIXTURE + return json.loads(FIXTURE.read_text(encoding="utf-8")) + + +@pytest.fixture(scope="module") +def rows(trace_payload: dict) -> list[dict]: + return trace_payload["rows"] + + +@pytest.fixture(scope="module") +def frames(trace_payload: dict) -> list[dict]: + return trace_payload["frames"] + + +def _results(rows: list[dict], pattern: str) -> list[dict]: + return [r for r in rows if r["dir"] == "result" and re.fullmatch(pattern, r["frame"])] + + +def _result(rows: list[dict], frame: str) -> dict: + found = [r for r in rows if r["dir"] == "result" and r["frame"] == frame] + assert len(found) == 1, (frame, len(found)) + return found[0] + + +def _tx(rows: list[dict], frame: str) -> dict: + found = [r for r in rows if r["dir"] == "tx" and r["frame"] == frame] + assert len(found) == 1, (frame, len(found)) + return found[0] + + +def _evt(rows: list[dict], run: str | None = None) -> list[dict]: + return [r for r in rows if (run is None or r["run"] == run) and r["dir"] == "rx" and r["session"] == "evt"] + + +def _evt_between(rows: list[dict], frame: str) -> list[dict]: + """Event-session rows from the request ``frame`` until the next request.""" + start = next(i for i, r in enumerate(rows) if r["dir"] == "tx" and r["frame"] == frame) + out: list[dict] = [] + for r in rows[start + 1 :]: + if r["dir"] == "tx": + break + if r["dir"] == "rx" and r["session"] == "evt": + out.append(r) + return out + + +def _zone(frame: str) -> int: + return int(re.match(r"^\*#?4\*(\d+)", frame).group(1)) + + +async def _setup_zones(hass: HomeAssistant, zones: tuple[int, ...]): + from custom_components.myhome.climate import async_setup_entry as climate_setup + + gw = _gateway() + gw.mac = gw.unique_id = gw.bus_group = MAC + gw.model = "MyHomeServer1" + gw.log_id = "[MyHomeServer1 live 2026-10-25]" + gw.profile = MyHomeServer1Profile() + gw._gateway.profile = gw.profile + platforms_cfg = { + "climate": { + f"climate_zone_{z}": { + "who": "4", + "zone": str(z), + "name": f"Climate Zone {z}", + "heat": True, + "cool": False, + "standalone": False, + "central": False, + "manufacturer": "Legrand / BTicino", + "model": "MyHomeServer1", + } + for z in zones + }, + } + hass.data = {DOMAIN: {MAC: {CONF_ENTITY: gw, CONF_PLATFORMS: platforms_cfg}}} + entry = MagicMock() + entry.data = {"mac": MAC} + entry.entry_id = "myhomeserver1_live_2026_10_25" + entry.options = {} + attach_runtime(hass, entry, MAC, gw) + climates: list = [] + with ( + patch("custom_components.myhome.discovery.er.async_entries_for_config_entry", return_value=[]), + patch("custom_components.myhome.discovery.er.async_get", return_value=MagicMock()), + ): + await climate_setup(hass, entry, climates.extend) + assert [c._where for c in climates] == [str(z) for z in zones] + for zone in climates: + zone.hass = hass + zone.entity_id = f"climate.{zone._device_id}" + zone.async_write_ha_state = MagicMock() + zone.async_schedule_update_ha_state = MagicMock() + attach_platform(zone, entry) + return {str(z): c for z, c in zip(zones, climates, strict=True)} + + +def _route(entities: dict, evt_rows: list[dict]) -> list[tuple[str, str]]: + """Deliver the WHO 4 events of ``evt_rows`` the way the platform routes them (``_zone_route_keys``). + + Returns (frame, entity WHERE) for every delivery. A pump frame ``0#N`` has no route key and + reaches no zone; a frame the pinned OWNd parses as a command is not an event and is skipped. + """ + delivered: list[tuple[str, str]] = [] + for r in evt_rows: + msg = OWNMessage.parse(r["frame"]) + assert msg is not None, r + if getattr(msg, "who", None) != 4 or msg.__class__.__name__ != "OWNHeatingEvent": + continue + for key in dict.fromkeys(_zone_route_keys(msg, _zone_address(msg))): + if key in entities: + entities[key].handle_event(msg) + delivered.append((r["frame"], key)) + return delivered + + +# --------------------------------------------------------------- schema, privacy, parsing + + +def test_schema_runs_and_synthetic_identity(trace_payload: dict, rows: list[dict], frames: list[dict]) -> None: + gw = trace_payload["gateway"] + assert gw["model"] == "MyHomeServer1" and gw["firmware"] == "3.87.13" + assert gw["ip"] == "192.0.2.9" and gw["mac"] == MAC + assert gw["identification"] == {"model": "MyHomeServer1", "who13_code": "200", "who13_model_name": "MyHomeServer1", "who1013_code": "67"} + assert "myhomeserver1_live_2026-10-24" in gw["identification_note"] and "2.82.06" in gw["oracle_note"] + capture = trace_payload["capture"] + assert capture["kind"] == "derived_trace_archive" + assert [r["run"] for r in capture["runs"]] == list(ALL_RUNS) + assert capture["window"] == {"first": "2026-10-25T10:46:46+00:00", "last": "2026-10-25T11:02:48+00:00", "frames": 677, "rows": 1224} + assert len(frames) == 677 and len(rows) == 1224 + assert [(r["t_offset"], r["rows"], r["frames"], r["utc"]) for r in capture["runs"]] == [ + (0.0, 68, 49, "10:46:46-10:46:50"), + (6.148, 643, 126, "10:46:52-10:52:53"), + (369.609, 28, 17, "10:52:55-10:52:56"), + (436.573, 485, 485, "10:54:02-11:02:48"), + ] + assert capture["probe"] == {"file": "mhs1_actuators_reads.jsonl", "probe_wait_s": 1.2, "pause_between_zones_s": 1.0, "listen_s": 600} + ts = [f["timestamp"] for f in frames] + assert ts == sorted(ts) and all(a["t"] <= b["t"] for a, b in zip(rows, rows[1:], strict=False)) + assert all(f["direction"] == "rx" and f["session"] == "evt" for f in frames) + assert [r["frame"] for r in rows if r["dir"] == "rx" and r["session"] == "evt"] == [f["raw"] for f in frames] + # status reads only: 2 WHO 13, the all-zones request, 36 x 4 per-zone reads, the general humidity read + tx = [r["frame"] for r in rows if r["dir"] == "tx"] + assert len(tx) == 148 and all(f.startswith("*#") for f in tx) + assert all(r["is_status_request"] is True for r in rows if r["dir"] == "tx") + assert tx[:3] == ["*#13**16##", "*#13**0##", ALL_ZONES_REQUEST] and tx[-1] == GENERAL_HUMIDITY + assert tx[3:-1] == [f"*#4*{z}*{d}##" for z in ZONES for d in (19, 20, 11, 60)] + assert not any(r["dir"] == "tx" for r in rows if r["run"] == RUN4), "the listen had no request pending" + # privacy: the only MAC-like string is the synthetic one, no WHO 13 dimension 12 frame, no LAN address, no local path + text = json.dumps(trace_payload) + assert set(re.findall(r"(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}", text)) == {MAC} + assert not any(f["raw"].startswith("*#13**12*") for f in frames) + assert not re.search(r"192[.*]168", text) and "/Users/" not in text + assert {re.match(r"^\*#?(\d+)\*", f["raw"]).group(1) for f in frames} == {"1", "4", "13"} + + +def test_every_frame_parses_in_ownd(rows: list[dict], frames: list[dict]) -> None: + for item in frames: + assert OWNMessage.parse(item["raw"]) is not None, f"Failed to parse evt frame: {item['raw']}" + for r in rows: + if r["dir"] == "tx": + assert OWNCommand.parse(r["frame"]) is not None, r + elif r["dir"] == "rx" and r["frame"] not in ("*#*1##", "*#*0##"): + assert OWNMessage.parse(r["frame"]) is not None, r + # a zone's actuator frame routes to that zone; a pump frame 0#N has no zone and no route key + for raw, zone in (("*#4*35#1*20*0##", 35), ("*#4*47#2*20*5##", 47), ("*#4*70#1*20*0##", 70)): + msg = OWNMessage.parse(raw) + assert msg.zone == zone and msg.is_active() is False + assert _calling_zones(msg) == ([str(zone)], None) and _zone_address(msg) is not None + assert set(_zone_route_keys(msg, _zone_address(msg))) == {str(zone)} + for raw in PUMPS: + msg = OWNMessage.parse(raw) + assert msg.__class__.__name__ == "OWNHeatingEvent" and msg.zone == 0 and msg.is_active() is False + assert _calling_zones(msg) == ([], None) and _zone_address(msg) is None + assert _zone_route_keys(msg, _zone_address(msg)) == [], "a pump frame creates no zone and reaches none" + # a pump call names the calling zone, not zone 0 + msg = OWNMessage.parse("*4*4002#35*0#1##") + assert msg is not None and _calling_zones(msg) == (["35"], None) and _zone_route_keys(msg, _zone_address(msg)) == ["35"] + # the '#20' command form of the spontaneous valve reports: a command with no zone in the pinned + # OWNd (no OWNd change decodes the '#20' write form yet); an event decoding is accepted as well + for raw in sorted({r["frame"] for r in _evt(rows) if "*#20*" in r["frame"]}): + msg = OWNMessage.parse(raw) + assert msg is not None and msg.who == 4 and msg.dimension == 20 + if msg.__class__.__name__ == "OWNHeatingCommand": + assert getattr(msg, "zone", None) is None + else: + assert msg.__class__.__name__ == "OWNHeatingEvent" and msg.zone == _zone(raw) and msg.is_active() is False + + +def test_result_rows_are_consistent_with_their_tx_and_cmd_rx_rows(rows: list[dict]) -> None: + results = [r for r in rows if r["dir"] == "result"] + assert len(results) == 148 + for i, r in enumerate(rows): + if r["dir"] != "result": + continue + tx_i = next(j for j in range(i - 1, -1, -1) if rows[j]["dir"] == "tx") + tx = rows[tx_i] + assert tx["frame"] == r["frame"] and tx["step"] == r["step"] and tx["run"] == r["run"] + assert tx["t"] <= r["t"] + assert abs((r["t"] - tx["t"]) - r["reply_time_s"]) < 0.002 + # the command-session replies sit right after their request, at its t, flagged as estimated + cmd_rx = [x for x in rows[tx_i + 1 : i] if x["dir"] == "rx" and x["session"] == "cmd"] + assert [x["frame"] for x in cmd_rx] == [*r["replies"], "*#*1##" if r["ack"] else "*#*0##"] + assert all(x["t"] == tx["t"] and x["t_estimated"] is True for x in cmd_rx) + assert rows[tx_i + 1 : tx_i + 1 + len(cmd_rx)] == cmd_rx + # events_after holds exactly the event-session frames that arrived while the request was pending + pending = [x["frame"] for x in rows[tx_i + 1 : i] if x["dir"] == "rx" and x["session"] == "evt" and x["t"] <= r["t"]] + assert r["events_after"] == pending + assert (r["replies"] == []) == (not r["ack"]), r + if r["ack"] and r["frame"] not in (ALL_ZONES_REQUEST, GENERAL_HUMIDITY): + assert set(r["replies"]) <= set(pending), r + + +# --------------------------------------------------------------- identification and the all-zones request + + +def test_identify_firmware_and_clock_echoed_on_the_event_session(rows: list[dict]) -> None: + fw = _result(rows, "*#13**16##") + assert fw["replies"] == ["*#13**16*3*87*13##"] == fw["events_after"] and fw["reply_time_s"] == pytest.approx(0.027, abs=0.001) + clock = _result(rows, "*#13**0##") + assert clock["replies"] == ["*#13**0*12*46*47*999##"] == clock["events_after"] and clock["reply_time_s"] == pytest.approx(0.020, abs=0.001) + assert [r["frame"] for r in _evt(rows, RUN1) if r["frame"].startswith("*#13")] == ["*#13**16*3*87*13##", "*#13**0*12*46*47*999##"] + + +def test_all_zones_actuator_request_43_distinct_frames_all_off_pumps_included(rows: list[dict]) -> None: + """*#4*#0*20##: ACK in 0.50 s with 8 replies; the event session gets 47 frames (43 distinct) over 1.9 s.""" + tx = _tx(rows, ALL_ZONES_REQUEST) + res = _result(rows, ALL_ZONES_REQUEST) + assert res["ack"] is True and res["reply_time_s"] == pytest.approx(0.496, abs=0.001) + assert len(res["replies"]) == 8 and res["events_after"] == res["replies"] + burst = _evt_between(rows, ALL_ZONES_REQUEST) + assert burst == [r for r in _evt(rows, RUN1) if r["frame"].startswith("*#4*")] + raws = [r["frame"] for r in burst] + assert len(raws) == 47 and len(set(raws)) == 43 + assert raws[:8] == res["replies"], "the command session collected the first 8 frames of the burst" + assert round(burst[0]["t"] - tx["t"], 3) == 0.184 and round(burst[-1]["t"] - tx["t"], 3) == 1.909 + assert sum(1 for r in burst if r["t"] > res["t"]) == 39, "most of the burst arrived after the ACK" + assert all(re.fullmatch(r"\*#4\*\d+#[1-4]\*20\*[05]##", f) for f in raws), "every actuator off (0) or fan coil off (5)" + valves = sorted(_zone(f) for f in set(raws) if re.fullmatch(r"\*#4\*[1-9]\d*#1\*20\*0##", f)) + assert valves == [z for z in ZONES if z not in NO_ZONE] and len(valves) == 34 + assert sorted(_zone(f) for f in set(raws) if re.fullmatch(r"\*#4\*[1-9]\d*#2\*20\*5##", f)) == list(FAN_COIL_ZONES) + assert sorted(f for f in set(raws) if f.startswith("*#4*0#")) == list(PUMPS) + assert sorted(_zone(f) for f in raws if raws.count(f) == 2) == [35, 35, 36, 36, 37, 37, 38, 38], "zones 35-38 answered twice" + assert res["t"] == tx["t"] + res["reply_time_s"] and max(r["t"] for r in rows if r["run"] == RUN1) == burst[-1]["t"] + + +# --------------------------------------------------------------- per-zone reads + + +def test_dimension_19_and_20_per_zone_ack_on_34_zones_nack_on_54_and_56(rows: list[dict]) -> None: + d19 = _results(rows, r"\*#4\*\d+\*19##") + d20 = _results(rows, r"\*#4\*[1-9]\d*\*20##") + assert [_zone(r["frame"]) for r in d19] == list(ZONES) and [_zone(r["frame"]) for r in d20] == list(ZONES) + for res in (*d19, *d20): + zone = _zone(res["frame"]) + if zone in NO_ZONE: + assert res["ack"] is False and 2.1 < res["reply_time_s"] < 2.13, res + assert not any(f.startswith(f"*#4*{zone}") for f in res["events_after"]), "nothing from a zone that does not exist" + else: + assert res["ack"] is True and 0.15 < res["reply_time_s"] < 0.25, res + # dimension 19: valve zones read 0 / 0, the five fan-coil zones 5 / 0 (fan coil off, valve off) + for res in d19: + if res["ack"]: + zone = _zone(res["frame"]) + expected = f"*#4*{zone}*19*{'5' if zone in FAN_COIL_ZONES else '0'}*0##" + assert res["replies"] == [expected], res + msg = OWNMessage.parse(expected) + assert msg.is_active() is False and msg.is_heating() is False + # dimension 20: a valve zone answers Z#1 once; a fan-coil zone answers Z#2 and Z#1 on the event session + for res in d20: + if not res["ack"]: + continue + zone = _zone(res["frame"]) + evt = [f for f in (r["frame"] for r in _evt_between(rows, res["frame"])) if f.startswith(f"*#4*{zone}#")] + if zone in FAN_COIL_ZONES: + assert set(evt) == {f"*#4*{zone}#2*20*5##", f"*#4*{zone}#1*20*0##"}, res + assert set(res["replies"]) <= set(evt) and len(res["replies"]) == 1 + else: + assert res["replies"] == [f"*#4*{zone}#1*20*0##"] and set(evt) == {f"*#4*{zone}#1*20*0##"}, res + assert sum(1 for r in d20 if r["ack"] and len(r["events_after"]) == 2 and len(set(r["events_after"])) == 1) == 2, "zones 51 and 64 echoed their reply twice before the ACK" + doubled = sorted(_zone(r["frame"]) for r in d20 if r["ack"] and _zone(r["frame"]) not in FAN_COIL_ZONES and [f for f in (x["frame"] for x in _evt_between(rows, r["frame"])) if f.startswith(f"*#4*{_zone(r['frame'])}#")].count(r["replies"][0]) == 2) + assert doubled == [35, 40, 42, 51, 64], "five valve zones echoed their dimension 20 reply twice on the event session" + + +def test_dimension_11_is_refused_on_every_zone(rows: list[dict]) -> None: + """*#4*Z*11## NACKs on all 36 zones: the fan-speed dimension is refused on a valve zone (and on the fan-coil zones too).""" + d11 = _results(rows, r"\*#4\*\d+\*11##") + assert [_zone(r["frame"]) for r in d11] == list(ZONES) + assert all(r["ack"] is False and r["replies"] == [] for r in d11) + assert all(r["reply_time_s"] > 2.09 for r in d11) + late = sorted(r["reply_time_s"] for r in d11 if r["reply_time_s"] > 2.3) + assert len(late) == 5 and late[0] == pytest.approx(2.851, abs=0.001) and late[-1] == pytest.approx(5.812, abs=0.001), "31 NACKs in 2.09-2.19 s, five between 2.85 and 5.81 s" + assert max(r["reply_time_s"] for r in d11 if r["reply_time_s"] <= 2.3) < 2.2 + assert not any(f"*{_zone(r['frame'])}*11*" in f for r in d11 for f in r["events_after"]), "no dimension 11 frame on the event session" + assert not any(re.search(r"\*11\*", r["frame"]) for r in _evt(rows)), "the plant never emits dimension 11" + + +def test_humidity_only_where_a_probe_exists_and_the_general_sweep(rows: list[dict]) -> None: + d60 = _results(rows, r"\*#4\*[1-9]\d*\*60##") + assert [_zone(r["frame"]) for r in d60] == list(ZONES) + assert [_zone(r["frame"]) for r in d60 if r["ack"]] == list(HUMIDITY_ZONES) and len(HUMIDITY_ZONES) == 17 + for res in d60: + zone = _zone(res["frame"]) + if zone in HUMIDITY_ZONES: + assert res["replies"] == [f"*#4*{zone}*60*{HUMIDITY[zone]}##"] and res["reply_time_s"] < 0.3, res + assert OWNMessage.parse(res["replies"][0]).human_readable_log == f"Zone {zone}'s main sensor is reporting a humidity of {HUMIDITY[zone]}.0%." + else: + assert res["ack"] is False and 2.1 < res["reply_time_s"] < 3.1, res + sweep = _result(rows, GENERAL_HUMIDITY) + assert sweep["ack"] is True and sweep["reply_time_s"] == pytest.approx(0.658, abs=0.001) + assert len(sweep["replies"]) == 8 and sweep["events_after"] == sweep["replies"] + answered = [r["frame"] for r in _evt(rows, RUN3)] + assert sorted(_zone(f) for f in answered) == list(HUMIDITY_ZONES), "the same 17 zones answer the general read" + moved = {_zone(f): int(f.split("*")[4].rstrip("#")) - HUMIDITY[_zone(f)] for f in answered if int(f.split("*")[4].rstrip("#")) != HUMIDITY[_zone(f)]} + assert moved == {39: 1, 42: 1, 61: 1}, "the same values as the per-zone reads 6 min earlier, zones 39, 42 and 61 one point up" + assert answered[-1] == "*#4*39*60*48##" and max(r["t"] for r in _evt(rows, RUN3)) - sweep["t"] == pytest.approx(0.324, abs=0.001), "the last zone answered 0.3 s after the ACK" + + +# --------------------------------------------------------------- the house's own traffic + + +def test_spontaneous_valve_reports_pump_calls_and_the_listen(rows: list[dict]) -> None: + evt = _evt(rows) + assert not any(re.fullmatch(r"\*#4\*\d+#\d\*20\*[1-4]##", r["frame"]) for r in evt), "no actuator switched on during the capture" + # every spontaneous valve report: the '#20' command form, then the status form within 50 ms + cmd_forms = [r for r in evt if "*#20*" in r["frame"]] + assert [(r["run"], _zone(r["frame"])) for r in cmd_forms] == [(RUN2, 35), (RUN2, 53), (RUN2, 64), (RUN2, 55), (RUN2, 68), (RUN4, 70), (RUN4, 51), (RUN4, 46), (RUN4, 43)] + for cmd in cmd_forms: + status = next(r for r in evt if r["t"] > cmd["t"] and r["frame"].startswith(f"*#4*{_zone(cmd['frame'])}#1*20*")) + assert status["frame"] == cmd["frame"].replace("*#20*", "*20*") and 0 < status["t"] - cmd["t"] <= 0.05 + # every valve report is preceded by the zone's pump call (*4*4002#Z*0#N## then *4*4002*Z##), about 2 s earlier + pump_calls = [r for r in evt if "4002#" in r["frame"]] + assert [r["frame"] for r in pump_calls] == [ + "*4*4002#35*0#1##", "*4*4002#53*0#3##", "*4*4002#64*0#4##", "*4*4002#55*0#3##", "*4*4002#68*0#4##", + "*4*4002#70*0#3##", "*4*4002#51*0#3##", "*4*4002#46*0#2##", "*4*4002#43*0#2##", + ] # fmt: skip + assert [_zone(r["frame"]) for r in cmd_forms] == [int(r["frame"].split("#")[1].split("*")[0]) for r in pump_calls] + for call, cmd in zip(pump_calls, cmd_forms, strict=True): + zone = _zone(cmd["frame"]) + assert any(r["frame"] == f"*4*4002*{zone}##" and call["t"] < r["t"] < cmd["t"] for r in evt), call + assert 1.9 < cmd["t"] - call["t"] < 2.1, (call["frame"], cmd["t"] - call["t"]) + # the listen: 485 frames in 600 s with no request pending + listen = _evt(rows, RUN4) + assert len(listen) == 485 and listen[0]["step"] == "listen" + assert [r["frame"] for r in listen if r["frame"].startswith("*#13")] == ["*#13**#1*00*25*10*2026##", "*#13**#0*13*00*00*##"] + who4 = [r["frame"] for r in listen if r["frame"].startswith(("*#4*", "*4*"))] + assert sorted(int(f.split("*")[3].rstrip("#")) for f in who4 if re.fullmatch(r"\*4\*1\*\d+##", f)) == [z for z in ZONES if z not in NO_ZONE], "the sweep's heating season frame for every zone" + for dim in (12, 14, 13): + assert sorted(_zone(f) for f in who4 if re.fullmatch(rf"\*#4\*\d+\*{dim}\*.*", f)) == [z for z in ZONES if z not in NO_ZONE] + assert sum(1 for f in who4 if re.fullmatch(r"\*#4\*\d+\*7\*1\*1\*\d{4}##", f)) == 47, "setpoints pushed as dimension 7" + assert sum(1 for f in who4 if re.fullmatch(r"\*#4\*\d+\*0\*\d{4}##", f)) == 82 + assert sorted(_zone(f) for f in who4 if re.fullmatch(r"\*#4\*\d+\*60\*\d+##", f)) == list(HUMIDITY_ZONES), "humidity pushed by the 17 zones with a probe" + assert sum(1 for f in who4 if re.fullmatch(r"\*#4\*\d+\*5\*0##", f)) == 17 + assert sum(1 for r in listen if r["frame"].startswith("*1*")) == 167 and sum(1 for r in listen if r["frame"].startswith("*#1*")) == 1 + assert [f for f in who4 if re.search(r"\*#?20\*", f)] == ["*#4*70#1*#20*0##", "*#4*70#1*20*0##", "*#4*51#1*#20*0##", "*#4*51#1*20*0##", "*#4*46#1*#20*0##", "*#4*46#1*20*0##", "*#4*43#1*#20*0##", "*#4*43#1*20*0##"] + + +# --------------------------------------------------------------- entity replay + + +@pytest.mark.asyncio +async def test_replay_actuator_burst_gives_idle_and_pumps_reach_no_zone(hass: HomeAssistant, rows: list[dict]) -> None: + """Zones 35 (valve) and 47 (valve + fan coil) through the climate entities on the base branch: the burst + leaves both idle with every actuator off; the pump frames 0#1-0#4 are delivered to no entity.""" + entities = await _setup_zones(hass, (35, 47)) + delivered = _route(entities, _evt(rows, RUN1)) + assert [f for f, _ in delivered] == ["*#4*47#2*20*5##", "*#4*35#1*20*0##", "*#4*47#1*20*0##", "*#4*35#1*20*0##"] + assert not any(f.startswith("*#4*0#") for f, _ in delivered) + assert len(entities) == 2 + valve = entities["35"] + assert valve.hvac_action == HVACAction.IDLE and valve._actuator_states == {"1": False} + assert "fan_mode" not in valve.extra_state_attributes + fan_coil = entities["47"] + assert fan_coil.hvac_action == HVACAction.IDLE and fan_coil._actuator_states == {"2": False, "1": False} + assert fan_coil.extra_state_attributes["fan_mode"] == "auto" and fan_coil.extra_state_attributes["running_fan_speed"] == "off" + for zone, expected in ((valve, {"1": "off"}), (fan_coil, {"1": "off", "2": "off"})): + if "actuators" in zone.extra_state_attributes: # exposed by #792; the base branch keeps the states internal + assert zone.extra_state_attributes["actuators"] == expected + # the per-zone reads of run 2: dimension 19 and 20 keep idle, the dimension 11 NACK brings nothing, + # humidity only on zone 47 + _route(entities, [r for r in _evt(rows, RUN2) if r["step"] in ("zone_35", "zone_47")]) + assert valve.hvac_action == HVACAction.IDLE and valve.current_humidity is None + assert valve.extra_state_attributes["fan_coil_heating"] is False and valve.extra_state_attributes["fan_coil_cooling"] is False + assert fan_coil.hvac_action == HVACAction.IDLE and fan_coil.current_humidity == 58.0 + assert fan_coil.extra_state_attributes["fan_coil_cooling"] is True and fan_coil.extra_state_attributes["fan_coil_heating"] is False + assert fan_coil._actuator_states["1"] is False and fan_coil._actuator_states["2"] is False # "valve" only on the base branch + # the listen: the house's sweep gives both zones their season, setpoint and last temperature, nothing switches on + _route(entities, _evt(rows, RUN4)) + for zone, temperature in ((valve, 22.4), (fan_coil, 23.6)): + assert zone.hvac_mode == HVACMode.HEAT and zone.hvac_action == HVACAction.IDLE + assert zone.extra_state_attributes["season"] == "heating" + assert zone.current_temperature == temperature + assert valve.target_temperature == 20.0 and fan_coil.target_temperature == 23.0, "dimension 12 of the sweep" diff --git a/tests/test_trace_oracle_validation.py b/tests/test_trace_oracle_validation.py index 138d0e7a..466560e6 100644 --- a/tests/test_trace_oracle_validation.py +++ b/tests/test_trace_oracle_validation.py @@ -108,7 +108,7 @@ "*#13**11##": "F461 2026-10-15 / 10-23: ACK *#13**11*255*255*255*0##", "*#13**12##": "F461 2026-10-15 / 10-23, MyHomeServer1 3.87.13 2026-10-24: ACK with the MAC (synthetic in the fixtures)", "*#13**19##": "F461 2026-10-15 / 10-23: ACK *#13**19*0*0*38*54## (uptime)", - "*#4*2*60##": "F461 2026-10-15: NACK in run1, ACK *#4*2*60*34## later; 2026-10-23: ACK *#4*2*60*39## in 143 ms", + "*#4*2*60##": "F461 2026-10-15: NACK in run1, ACK *#4*2*60*34## later; 2026-10-23: ACK *#4*2*60*39## in 143 ms; 2026-10-25 (actuators): ACK *#4*2*60*34## in 124 ms (Home Assistant's startup sweep)", "*1*0*#1##": "F461 2026-10-15 / 10-18: ACK (group 1 off)", "*1*0*0##": "F461 2026-10-15 / 10-18: ACK (general off)", "*1*1*#1##": "F461 2026-10-15 / 10-18: ACK (group 1 on)", @@ -165,8 +165,43 @@ "*#4*#0*0*0215##": "F461 2026-10-23: NACK after 4.13 s (central-unit report form, no central unit)", "*#4*0*60##": "F461 2026-10-23: ACK *#4*2*60*39## after 2.13 s; MyHomeServer1 2026-10-24: ACK, 17 zones in 0.5 s", # --- MyHomeServer1 3.87.13, myhomeserver1_live_2026-10-24 (the oracle emulates 2.82.06) - "*#4*35*60##": "MyHomeServer1 2026-10-24: NACK after 2.13 s (no humidity probe in zone 35)", - "*#4*39*60##": "MyHomeServer1 2026-10-24: ACK *#4*39*60*51## in 204 ms", + "*#4*35*60##": "MyHomeServer1 2026-10-24: NACK after 2.13 s (no humidity probe in zone 35); 2026-10-25: NACK after 2.15 s", + "*#4*39*60##": "MyHomeServer1 2026-10-24: ACK *#4*39*60*51## in 204 ms; 2026-10-25: ACK *#4*39*60*47## in 215 ms", + # --- MyHomeServer1 3.87.13, myhomeserver1_live_2026-10-25 (per-zone humidity reads next to the F461 actuator capture; the oracle emulates 2.82.06) + "*#4*36*60##": "MyHomeServer1 2026-10-25: NACK after 2.12 s (no humidity probe in zone 36)", + "*#4*37*60##": "MyHomeServer1 2026-10-25: NACK after 2.12 s (no humidity probe in zone 37)", + "*#4*38*60##": "MyHomeServer1 2026-10-25: NACK after 2.14 s (no humidity probe in zone 38)", + "*#4*40*60##": "MyHomeServer1 2026-10-25: ACK *#4*40*60*48## in 209 ms", + "*#4*41*60##": "MyHomeServer1 2026-10-25: ACK *#4*41*60*43## in 203 ms", + "*#4*42*60##": "MyHomeServer1 2026-10-25: ACK *#4*42*60*51## in 234 ms", + "*#4*43*60##": "MyHomeServer1 2026-10-25: ACK *#4*43*60*55## in 262 ms", + "*#4*44*60##": "MyHomeServer1 2026-10-25: NACK after 2.15 s (no humidity probe in zone 44)", + "*#4*45*60##": "MyHomeServer1 2026-10-25: NACK after 2.15 s (no humidity probe in zone 45)", + "*#4*46*60##": "MyHomeServer1 2026-10-25: NACK after 2.81 s (no humidity probe in zone 46)", + "*#4*47*60##": "MyHomeServer1 2026-10-25: ACK *#4*47*60*58## in 191 ms", + "*#4*48*60##": "MyHomeServer1 2026-10-25: ACK *#4*48*60*53## in 235 ms", + "*#4*49*60##": "MyHomeServer1 2026-10-25: NACK after 2.15 s (no humidity probe in zone 49)", + "*#4*50*60##": "MyHomeServer1 2026-10-25: NACK after 2.13 s (no humidity probe in zone 50)", + "*#4*51*60##": "MyHomeServer1 2026-10-25: NACK after 2.14 s (no humidity probe in zone 51)", + "*#4*52*60##": "MyHomeServer1 2026-10-25: NACK after 2.15 s (no humidity probe in zone 52)", + "*#4*53*60##": "MyHomeServer1 2026-10-25: ACK *#4*53*60*60## in 253 ms", + "*#4*54*60##": "MyHomeServer1 2026-10-25: NACK after 2.15 s (no humidity probe in zone 54)", + "*#4*55*60##": "MyHomeServer1 2026-10-25: ACK *#4*55*60*49## in 255 ms", + "*#4*56*60##": "MyHomeServer1 2026-10-25: NACK after 3.07 s (no humidity probe in zone 56)", + "*#4*57*60##": "MyHomeServer1 2026-10-25: ACK *#4*57*60*51## in 262 ms", + "*#4*58*60##": "MyHomeServer1 2026-10-25: ACK *#4*58*60*57## in 269 ms", + "*#4*59*60##": "MyHomeServer1 2026-10-25: ACK *#4*59*60*66## in 261 ms", + "*#4*60*60##": "MyHomeServer1 2026-10-25: ACK *#4*60*60*54## in 229 ms", + "*#4*61*60##": "MyHomeServer1 2026-10-25: ACK *#4*61*60*52## in 273 ms", + "*#4*62*60##": "MyHomeServer1 2026-10-25: NACK after 2.16 s (no humidity probe in zone 62)", + "*#4*63*60##": "MyHomeServer1 2026-10-25: NACK after 2.15 s (no humidity probe in zone 63)", + "*#4*64*60##": "MyHomeServer1 2026-10-25: NACK after 2.14 s (no humidity probe in zone 64)", + "*#4*65*60##": "MyHomeServer1 2026-10-25: NACK after 2.13 s (no humidity probe in zone 65)", + "*#4*66*60##": "MyHomeServer1 2026-10-25: NACK after 2.13 s (no humidity probe in zone 66)", + "*#4*67*60##": "MyHomeServer1 2026-10-25: NACK after 2.19 s (no humidity probe in zone 67)", + "*#4*68*60##": "MyHomeServer1 2026-10-25: ACK *#4*68*60*55## in 290 ms", + "*#4*69*60##": "MyHomeServer1 2026-10-25: ACK *#4*69*60*52## in 241 ms", + "*#4*70*60##": "MyHomeServer1 2026-10-25: ACK *#4*70*60*68## in 245 ms", }