# numbers_log for 006-unit6-data-cloud-edge (rerun 2026-10-11 02:10)

===== analysis_numbers.py (exit 0, 0.5 s)
JSON long   payload  70 B  persistent QoS1 wire  181 B   fresh  606 B
JSON short  payload  50 B  persistent QoS1 wire  161 B   fresh  586 B
CBOR short  payload  39 B  persistent QoS1 wire  150 B   fresh  575 B
CBOR int    payload  20 B  persistent QoS1 wire  131 B   fresh  556 B
binary      payload  11 B  persistent QoS1 wire  122 B   fresh  547 B
persistent saving JSON long -> binary: 59 B of 181 = 32.6 percent
quantisation: temperature step 0.01 C -> max error 0.005 ; battery 1 mV -> 0.5 mV; temp range int16 in 0.01 C: +-327.67 C
-- alert fatigue
k=3.0: P(|Z|>k)=2.70e-03  false alarms per day for 6 sensors at 1/min: 23.326; for 10 sensors: 38.877
k=3.5: P(|Z|>k)=4.65e-04  false alarms per day for 6 sensors at 1/min: 4.020; for 10 sensors: 6.700
k=4.0: P(|Z|>k)=6.33e-05  false alarms per day for 6 sensors at 1/min: 0.547; for 10 sensors: 0.912
k=4.5: P(|Z|>k)=6.80e-06  false alarms per day for 6 sensors at 1/min: 0.059; for 10 sensors: 0.098
k for under 1 false alarm per day with 6 sensors at 1/min: 3.85  P= 1.16e-04
-- EWMA lam=0.1 L=3: steady limit (units of sigma) 0.6882  step 1.5: samples to cross: 5.83  spike 7: peak lam*7 = 0.7  ramp 0.02/sample: steady lag 0.18 sigma; crossing time approx 43.4
-- twin residual: expected noise std 0.2805  shift per on-minute at power p: p=0.7 -0.1488  p=0.5 -0.2479
-- z-score example: (22.2-21.0)/0.3 = 3.999999999999998
-- EWMA lam 0.2 sigma 0.5 L 3: steady limit 0.5  t=1 limit 0.29999999999999993
-- P4: 200 nodes, persistent connection QoS1, 1/min: JSON long vs binary MB/day: 52.1 35.1
-- aggregation: 10 samples -> mean change of a +3 spike: 0.3

===== fig01_payload.py (exit 0, 0.8 s)
JSON, long keys 70 B wire 606
JSON, short keys 50 B wire 586
CBOR, short keys 39 B wire 575
CBOR, integer keys 20 B wire 556
packed binary 11 B wire 547
JSON long: {"zone":1,"soil_raw":1832,"temp_c":21.5,"batt_v":3.71,"ts":1760000000}
CBOR int keys hex: a50101021907280318d704190e7e051a68e77800
saving on wire verbose->binary: 59 B = 9.7 percent; per day at 1/min kB: [872.6, 843.8, 828.0, 800.6, 787.7]

===== fig02_downsample.py (exit 0, 0.8 s)
points raw 360 -> aggregated 36 ; bucket containing the glitch: mean 21.285 max 23.996 ; neighbour bucket mean 20.963 max 21.732
glitch amplitude seen in mean (C): 0.304 seen in max: 2.334

===== fig03_detectors.py (exit 0, 1.7 s)
spike  fixed limit +-3  detected 100.0%  mean delay     0.0  false alarms/1000   2.88
spike  z-score (60, 3)  detected 100.0%  mean delay     0.0  false alarms/1000   3.74
spike  EWMA (0.1, 3)    detected  68.3%  mean delay    19.7  false alarms/1000   3.19
step   fixed limit +-3  detected 100.0%  mean delay    13.5  false alarms/1000   2.88
step   z-score (60, 3)  detected  85.3%  mean delay    69.8  false alarms/1000   3.74
step   EWMA (0.1, 3)    detected 100.0%  mean delay     5.4  false alarms/1000   3.19
drift  fixed limit +-3  detected 100.0%  mean delay    58.9  false alarms/1000   2.88
drift  z-score (60, 3)  detected  91.0%  mean delay   103.0  false alarms/1000   3.74
drift  EWMA (0.1, 3)    detected 100.0%  mean delay    36.1  false alarms/1000   3.19

===== fig04_twin.py (exit 0, 1.6 s)
fault-free: std of temperature 0.447  std of residual on on-minutes 0.292  mean residual on on-minutes 0.0565
expected residual per on-minute under 70 percent heater: -0.1488
fault-free 480-min runs with a twin alarm: 0 of 100
stat detected 85 of 100, mean delay (min) 104.4 ; runs with a false alarm before the fault: 7
twin detected 100 of 100, mean delay (min) 25.4 ; runs with a false alarm before the fault: 0
example run: first twin alarm minute 203  first stat alarm None

===== fig05_edge.py (exit 0, 1.0 s)
raw: bytes/day 77760000.0 MB/day 77.76 GB/month 2.33 msgs/month 4320000 cost/month 4.53
window 60 s: bytes/day 4728960 MB/day 4.729 msgs/month 43200 cost/month 0.056 reduction x 16.4
window 300 s: bytes/day 945792 MB/day 0.946 msgs/month 8640 cost/month 0.0112 reduction x 82.2
window 600 s: bytes/day 472896 MB/day 0.473 msgs/month 4320 cost/month 0.0056 reduction x 164.4
window 1800 s: bytes/day 157632 MB/day 0.158 msgs/month 1440 cost/month 0.0019 reduction x 493.3
window 3600 s: bytes/day 78816 MB/day 0.079 msgs/month 720 cost/month 0.0009 reduction x 986.6

===== fig06_dashboard.py (exit 0, 1.5 s)
topics 6 alerts 5 [('limit', 'greenhouse/zone2/temp', 44.0), ('outlier', 'greenhouse/zone2/temp', 44.0), ('outlier', 'greenhouse/zone1/soil', 43.2), ('outlier', 'greenhouse/zone2/soil', 43.8), ('outlier', 'greenhouse/zone3/soil', 43.7)]
stale: ['greenhouse/zone3/soil', 'greenhouse/zone3/temp']

===== selection_bias_check.py (exit 0, 1.8 s)
baseline 0.0: fault-free runs with an alarm 2/100; fault detected 100/100, mean delay 54.6 min
baseline 0.0565: fault-free runs with an alarm 0/100; fault detected 100/100, mean delay 25.7 min
