# numbers_log for 012-unit12-capstone (rerun 2026-10-11 03:17)

===== analysis_trace.py (exit 0, 6.4 s)
R4 node battery life (U2 power budget, 2000 mAh, 80% usable) by sampling period:
  period    60 s: average 3.210 mA, life   20.8 days, share of charge in the 2 s awake: 99.7%
  period   120 s: average 1.610 mA, life   41.4 days, share of charge in the 2 s awake: 99.4%
  period   300 s: average 0.650 mA, life  102.6 days, share of charge in the 2 s awake: 98.5%
  period   600 s: average 0.330 mA, life  202.0 days, share of charge in the 2 s awake: 97.0%
  period  1800 s: average 0.117 mA, life  571.5 days, share of charge in the 2 s awake: 91.4%
ABLATION on the sampling period, tuned detector (threshold 0.33), p_loss 0.10, 40 days each:
  period    60 s: success 100.0%  dry plant-h  0.00  litres  5.38  messages/day   2902  bytes/day   74520  uplink p95 1.16 s
  period   120 s: success 100.0%  dry plant-h  0.00  litres  5.15  messages/day   1460  bytes/day   37658  uplink p95 1.16 s
  period   300 s: success 100.0%  dry plant-h  0.01  litres  4.76  messages/day    594  bytes/day   15482  uplink p95 1.16 s
  period   600 s: success  99.6%  dry plant-h  0.21  litres  4.30  messages/day    304  bytes/day    8028  uplink p95 1.17 s
  period  1800 s: success  54.9%  dry plant-h  6.25  litres  3.33  messages/day    107  bytes/day    2895  uplink p95 1.17 s
R14 delivered fraction at p = 0.10 with QoS 1 (5 attempts): 100.000% of 12155 messages; theory 1 - p^5 = 99.999%; QoS 0 would give 90.0%
R2 sensor to cloud latency (s): {'p50': 0.162, 'p95': 1.168, 'p99': 1.631, 'p99.9': 2.861} ; command latency (s): {'p50': 0.164, 'p95': 1.171, 'p99': 1.416} ; share of uplink messages over 2 s: 0.964 %
  loss 0.1: share of delivered uplink messages over 2 s 0.96%  p99 1.63 s
  loss 0.3: share of delivered uplink messages over 2 s 8.48%  p99 3.19 s
  loss 0.5: share of delivered uplink messages over 2 s 21.79%  p99 4.21 s
R6 plants watered when dry: success 99.6 % within 30 min; dry plant-hours per day 0.21 ; events per day 2.58 ; legs failed per day 0.125
R2 retry timer sweep at p = 0.10 (QoS 1 retry interval): share of uplink messages over 2 s, p95, p99:
  retry 1.0 s: over 2 s 0.964%  p95 1.168 s  p99 1.631 s ; bytes per message 26.4 B
  retry 0.5 s: over 2 s 0.026%  p95 0.674 s  p99 1.086 s ; bytes per message 26.4 B
  retry 0.3 s: over 2 s 0.000%  p95 0.508 s  p99 0.740 s ; bytes per message 26.4 B
  retry 0.2 s: over 2 s 0.000%  p95 0.450 s  p99 0.631 s ; bytes per message 26.4 B
  retry 0.3 s at loss 0.3: over 2 s 0.00%  p99 1.11 s
  retry 0.3 s at loss 0.5: over 2 s 0.00%  p99 1.42 s
ODOMETRY-ONLY navigation inside the system: success 0.0%, dry plant-h 39.44, leg failures per day 66.6, trips 66.6, energy 270 mAh = 13% of the usable pack
EKF-quality navigation: success 99.6%, dry plant-h 0.21, leg failures per day 0.125
rover battery: days per charge with the event system 6.9 ; energy per watering 17.58 mAh

===== fig01_architecture.py (exit 0, 1.3 s)
payload bytes json/cbor/packed: {'json': 54, 'cbor': 51, 'packed': 7} ; MQTT PUBLISH (QoS 1, 7 B payload): 23 B
longest leg: (4, 2) 12.58 m ; dock to P4: 8.21 m ; cells expanded dock to P4: 5627
ping budget stop (42.5 ms ping + 15 ms edge): 5.0 cm ; watchdog 0.2 s: 12.9 cm ; cruise battery current motors: 127.3 mA
forgery probability (8-byte tag): 5.421010862427522e-20

===== fig02_legs.py (exit 0, 2.1 s)
odom  : mean success over the 20 legs 0.002; mean arrival error 65.8 cm; legs with success below 0.9: 20; collision probability averaged 0.620; mean leg time 15.29 s  (0 s to compute)
ekf   : mean success over the 20 legs 0.993; mean arrival error 7.1 cm; legs with success below 0.9: 0; collision probability averaged 0.000; mean leg time 15.01 s  (0 s to compute)
oracle: mean success over the 20 legs 1.000; mean arrival error 4.9 cm; legs with success below 0.9: 0; collision probability averaged 0.000; mean leg time 15.25 s  (0 s to compute)
planned leg lengths (m): {'dock->P1': 4.46, 'dock->P2': 9.47, 'dock->P3': 3.37, 'dock->P4': 8.21, 'P1->P2': 4.97, 'P1->P3': 5.38, 'P1->P4': 10.48, 'P2->P3': 6.15, 'P2->P4': 12.44, 'P3->P4': 6.55}
leg dock->P4 (8.21 m): success odom 0.00, ekf 1.00, oracle 1.00; arrival error odom 94.1 cm, ekf 7.0 cm, oracle 4.9 cm; time 17.1 s
leg P3->P4 (6.55 m): success odom 0.00, ekf 1.00, oracle 1.00; arrival error odom 55.1 cm, ekf 7.0 cm, oracle 4.9 cm; time 13.7 s
leg P1->P2 (4.97 m): success odom 0.00, ekf 0.97, oracle 1.00; arrival error odom 36.1 cm, ekf 7.1 cm, oracle 4.9 cm; time 10.8 s

===== fig03_day.py (exit 0, 1.3 s)
{'strategy': 'event', 'events': 5, 'served': 5, 'success': 1.0, 'stress_h': 0.0, 'dry_h': 0.367, 'waterings': 17, 'litres': 4.25, 'trips': 17, 'energy_mAh': 304.422, 'moving_s': 458.687, 'dwell_s': 340.0, 'msgs': 305, 'lost': 0, 'bytes_up': 8045, 'leg_failures': 0, 'wait_mean': 178.973}
trips (start s, end s): [(2842, 2881), (4641, 4700), (5841, 5895), (8241, 8276), (8841, 8880), (14241, 14300), (16041, 16080), (19641, 19695), (20842, 20877), (23241, 23280), (23842, 23901), (29841, 29880), (32241, 32276), (32841, 32900), (33441, 33495), (36441, 36480), (41842, 41901)]
uplink latency percentiles (s): {'p50': 0.174, 'p95': 1.153, 'p99': 1.32}  command latency percentiles (s): {'p50': 0.154, 'p95': 1.261, 'p99': 1.37}

===== fig04_compare.py (exit 0, 6.0 s)
strategy          success    dry plant-h       litres    trips     energy mAh  % of usable pack
event naive   77.6 +-  3.3%    4.99 +- 0.21   3.50 +- 0.06   13.1   279.7 +-   1.7         13.4%
event        99.6 +-  0.8%    0.21 +- 0.04   4.30 +- 0.08   15.9   302.4 +-   2.0         14.5%
timer 1 h   100.0 +-  0.0%    0.07 +- 0.04  10.78 +- 0.14   12.0   397.8 +-   3.5         19.1%
timer 2 h    59.8 +-  8.9%    1.61 +- 0.43   4.89 +- 0.10    6.0   258.7 +-   2.7         12.4%
timer 3 h    26.0 +-  3.2%    8.02 +- 0.89   2.92 +- 0.09    4.0   212.3 +-   2.1         10.2%
timer 4 h     8.9 +-  2.3%   15.56 +- 0.69   1.96 +- 0.05    3.0   189.1 +-   2.0          9.1%
timer 6 h     0.0 +-  0.0%   27.11 +- 0.46   1.00 +- 0.00    2.0   166.4 +-   1.2          8.0%
ABLATION (event design, 40 days each): sample period, detector threshold
  sample  600 s, detect below 0.30: success  77.6%  dry plant-h  4.99  litres  3.50  trips  13.1  energy  279.7 mAh  messages   301
  sample  600 s, detect below 0.33: success  99.6%  dry plant-h  0.21  litres  4.30  trips  15.9  energy  302.4 mAh  messages   304
  sample  600 s, detect below 0.36: success 100.0%  dry plant-h  0.00  litres  5.49  trips  20.1  energy  336.4 mAh  messages   308
  sample  300 s, detect below 0.30: success  96.0%  dry plant-h  2.34  litres  3.76  trips  14.5  energy  288.3 mAh  messages   591
  sample  300 s, detect below 0.33: success 100.0%  dry plant-h  0.01  litres  4.76  trips  18.0  energy  315.9 mAh  messages   594
  sample  300 s, detect below 0.36: success 100.0%  dry plant-h  0.00  litres  6.08  trips  22.9  energy  353.9 mAh  messages   599
  sample  120 s, detect below 0.30: success  99.1%  dry plant-h  0.63  litres  4.02  trips  16.0  energy  296.2 mAh  messages  1456
  sample  120 s, detect below 0.33: success 100.0%  dry plant-h  0.00  litres  5.15  trips  20.5  energy  328.8 mAh  messages  1460
  sample  120 s, detect below 0.36: success 100.0%  dry plant-h  0.00  litres  6.71  trips  26.4  energy  373.0 mAh  messages  1466
dry events per day (event run): 2.58 ; mean wait of served+unserved events (s): 222.0
event system: unserved events per day 0.03 ; leg failures per day 0.125

===== fig05_network.py (exit 0, 2.5 s)
payload sizes (bytes) JSON / CBOR / packed: {'json': 54, 'cbor': 51, 'packed': 7}
loss 0.0: messages/day 304, lost 0.000% (theory p^5 = 0.000%), uplink latency p50/p95/p99 0.15/0.38/0.55 s, command p95 0.36 s, success 99.2%, dry plant-h 0.20, bytes/day 7220
loss 0.1: messages/day 304, lost 0.000% (theory p^5 = 0.001%), uplink latency p50/p95/p99 0.16/1.17/1.95 s, command p95 1.18 s, success 99.4%, dry plant-h 0.20, bytes/day 8031
loss 0.3: messages/day 304, lost 0.263% (theory p^5 = 0.243%), uplink latency p50/p95/p99 0.21/2.16/3.18 s, command p95 2.19 s, success 100.0%, dry plant-h 0.27, bytes/day 10250
loss 0.5: messages/day 304, lost 2.706% (theory p^5 = 3.125%), uplink latency p50/p95/p99 0.37/3.20/4.20 s, command p95 3.15 s, success 98.9%, dry plant-h 0.36, bytes/day 13675
loss 0.7: messages/day 305, lost 15.688% (theory p^5 = 16.807%), uplink latency p50/p95/p99 1.16/4.13/4.28 s, command p95 4.15 s, success 94.9%, dry plant-h 0.93, bytes/day 20024
MQTT PUBLISH sizes with a 10-byte topic, QoS 1: packed 7-byte payload 23 B; CBOR 51 B 67 B; JSON 54 B 70 B (application layer only, retransmissions counted, no TCP/IP headers)
per PUBLISH, JSON / packed = 3.04 times the bytes: about 24443 bytes/day at 10% loss if readings were JSON, against 8031 packed (command messages included in both)

===== fig06_energy_security.py (exit 0, 1.9 s)
currents: moving 502 mA (motors 127 + computer 375); watering 675 mA; idle listening 15 mA; idle timer 10 mA; usable pack 2080 mAh
event     : moving 439 s -> 61.2 mAh ; watering 344 s -> 64.5 mAh ; idle 11.78 h -> 176.7 mAh ; total 302.4 mAh = 14.5% of the usable pack
timer 2 h : moving 380 s -> 53.0 mAh ; watering 470 s -> 88.0 mAh ; idle 11.76 h -> 117.6 mAh ; total 258.7 mAh = 12.4% of the usable pack
event, no sleep: moving 439 s -> 61.2 mAh ; watering 344 s -> 64.5 mAh ; idle 11.78 h -> 4418.5 mAh ; total 4544.2 mAh = 218.5% of the usable pack
computer left on all day while docked (no sleep):  4500.0 mAh per 12 h, i.e. 216 % of the usable pack
days of operation per charge, event / timer: 6.9 / 8.0
security: {'genuine_accepted': True, 'replay_reason': 'replay', 'forged_sent': 5000, 'forged_accepted': 0, 'forgery_probability': 5.421010862427522e-20}
with a 1-byte tag (for comparison): forged accepted 20 of 5000 ; probability per guess 0.00390625
