code wiki / (root) / nx_ac_monitor_demo.nx

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}