nx_ac_monitor_demo.nx source
↩ module page · 112 lines · 3790 B
1// nx_ac_monitor_demo.nx -- render a multi-unit AC Health Monitor dashboard to
2// web_assets/ac_monitor_demo.html, driving each card through the real product
3// brain (nx_ac_monitor). Shows the full alert range: HEALTHY / NOTICE /
4// SERVICE SOON / CRITICAL / UNVERIFIED. expect_exit: 0 license_tier: ORIGINAL
5
6import "nx_ac_monitor_page.nx"
7const DEMO_MAGIC_12000: i64 = 12000
8const DEMO_MAGIC_24000: i64 = 24000
9const DEMO_MAGIC_1200: i64 = 1200
10const DEMO_MAGIC_13000: i64 = 13000
11const DEMO_MAGIC_5000: i64 = 5000
12const DEMO_MAGIC_39000: i64 = 39000
13const DEMO_MAGIC_44000: i64 = 44000
14const DEMO_MAGIC_35000: i64 = 35000
15const DEMO_MAGIC_3000: i64 = 3000
16const DEMO_MAGIC_24050: i64 = 24050
17const DEMO_MAGIC_8333: i64 = 8333
18const DEMO_MAGIC_2778: i64 = 2778
19const DEMO_MAGIC_5556: i64 = 5556
20const DEMO_MAGIC_13889: i64 = 13889
21const DEMO_MAGIC_25000: i64 = 25000
22const DEMO_MAGIC_20000: i64 = 20000
23const DEMO_MAGIC_42000: i64 = 42000
24const DEMO_MAGIC_2000: i64 = 2000
25const DEMO_MAGIC_27000: i64 = 27000
26
27const DEMO_OUT: *u8 = "web_assets/ac_monitor_demo.html"
28
29func d_rd(r: *AcReading) -> i64 {
30 r.mode = NX_HVAC_MODE_COOL
31 r.t_supply_mC = DEMO_MAGIC_12000
32 r.rh_supply_pm = 900
33 r.t_return_mC = DEMO_MAGIC_24000
34 r.rh_return_pm = 500
35 r.airflow_cfm = DEMO_MAGIC_1200
36 r.rho_gm3 = DEMO_MAGIC_1200
37 r.t_suction_mC = DEMO_MAGIC_13000
38 r.t_sat_evap_mC = DEMO_MAGIC_5000
39 r.t_liquid_mC = DEMO_MAGIC_39000
40 r.t_sat_cond_mC = DEMO_MAGIC_44000
41 r.t_outdoor_mC = DEMO_MAGIC_35000
42 r.p_elec_w = DEMO_MAGIC_3000
43 r.t_return_b_mC = DEMO_MAGIC_24050
44 r.return_a_src = 1
45 r.return_b_src = 2
46 r.return_tol_mC = 500
47 return 0
48}
49func d_th(t: *FddThresh) -> i64 {
50 t.target_superheat_mC = DEMO_MAGIC_8333
51 t.superheat_band_mC = DEMO_MAGIC_2778
52 t.target_subcool_mC = DEMO_MAGIC_5556
53 t.subcool_band_mC = DEMO_MAGIC_2778
54 t.split_ceiling_mC = DEMO_MAGIC_13889
55 t.cond_over_ambient_ceiling_mC = DEMO_MAGIC_25000
56 t.cfm_per_ton_floor = 350
57 t.max_cph_x10 = 35
58 t.freeze_suction_sat_mC = 0
59 return 0
60}
61
62func main() -> i64 {
63 let r: *AcReading = sys_mmap(256) as *AcReading
64 let av: *AcVerify = sys_mmap(128) as *AcVerify
65 let fin: *FddInput = sys_mmap(128) as *FddInput
66 let th: *FddThresh = sys_mmap(128) as *FddThresh
67 let fout: *FddOut = sys_mmap(64) as *FddOut
68 let res: *MonitorResult = sys_mmap(64) as *MonitorResult
69 let h: *u8 = sys_mmap(MP_CAP)
70 d_th(th)
71 var w: i64 = 0
72 w = mp_head(h, w)
73
74 // 1. HEALTHY (corroborated by 2 sensors)
75 d_rd(r)
76 nx_ac_monitor(r, av, fin, th, fout, 360, 150, 80, res)
77 w = mp_card(h, w, "Living Room AC" as *u8, res)
78
79 // 2. SERVICE SOON -- undercharge / refrigerant leak
80 d_rd(r)
81 r.t_suction_mC = DEMO_MAGIC_20000
82 r.t_sat_evap_mC = DEMO_MAGIC_3000
83 r.t_liquid_mC = DEMO_MAGIC_42000
84 r.t_sat_cond_mC = DEMO_MAGIC_44000
85 nx_ac_monitor(r, av, fin, th, fout, 360, 150, 80, res)
86 w = mp_card(h, w, "Upstairs Heat Pump" as *u8, res)
87
88 // 3. CRITICAL -- frozen evaporator coil
89 d_rd(r)
90 r.t_sat_evap_mC = -DEMO_MAGIC_2000
91 nx_ac_monitor(r, av, fin, th, fout, 360, 150, 80, res)
92 w = mp_card(h, w, "Garage Mini-Split" as *u8, res)
93
94 // 4. NOTICE -- mild efficiency drift vs baseline
95 d_rd(r)
96 nx_ac_monitor(r, av, fin, th, fout, 420, 150, 80, res)
97 w = mp_card(h, w, "Office Rooftop Unit" as *u8, res)
98
99 // 5. UNVERIFIED -- independent sensors disagree (liar-killer)
100 d_rd(r)
101 r.t_return_b_mC = DEMO_MAGIC_27000
102 nx_ac_monitor(r, av, fin, th, fout, 360, 150, 80, res)
103 w = mp_card(h, w, "Bedroom Sensor" as *u8, res)
104
105 w = mp_foot(h, w)
106
107 let fd: i64 = sys_openat_wr(DEMO_OUT, 0x1A4)
108 if fd < 0 { return 1 }
109 sys_write(fd, h, w)
110 sys_close(fd)
111 return 0
112}