load(JON, 20); load(JOFF, 40); load(MON, 10); load(MOFF, 30); load(DON, 10); load(DOFF, 30); logn(JON, "-", JOFF, " ", MON, "-", MOFF, " ", DON, "-", DOFF); DRY = 1; BLOW = 11; BCLR = 12; BDELAY = 10000; STATUS = 30000; OFF = 0; AUTO = 1; MAN = 2; S_OFF = 0; S_RUN = 1; S_STOP = 2; S_FAULT = 3; mul = 30; p = 0; b = 0; w = 0; dry = 0; blo = 0; jm = OFF; mm = OFF; dm = OFF; js = S_OFF; ms = S_OFF; ds = S_OFF; error = 0; every(5000) { logn("Pressure: ", p, " mul:", mul); } every(30000) { // simulator switch (mul) { case 30: { mul = 10; break; } case 10: { mul = 6; break; } case 6: { mul = 3; break; } case 3: { mul = 30; break; } default: { mul = 30; break; } } } every(200) { p = ain(1) / mul + 10; b = ain(2) * 20 / 4; w = ain(3) / mul; tm1ok = !in(7); tm2ok = !in(8); if (in(2)) { jm = MAN; } else { if (!in(1)) { jm = AUTO; } else { jm = OFF; } } if (in(4)) { mm = MAN; } else { if (!in(3)) { mm = AUTO; } else { mm = OFF; } } if (in(6)) { dm = MAN; } else { if (!in(5)) { dm = AUTO; } else { dm = OFF; } } pump = out(1) || out(2) || out(3); // dry-run detection: if water low while pump on for BDELAY if (ton("dry_run", w < DRY && pump, BDELAY)) { dry = 1; out(1) = 0; out(2) = 0; out(3) = 0; publish("alarm", "DRY_RUN"); } // clear dry on positive edge of in(8) and water recovered if (p_edge(in(8)) && w >= DRY) { dry = 0; t_reset("dry_run"); } // battery low warning with delay if (ton("batt_low", b < BLOW, BDELAY)) { if (blo == 0) { blo = 1; publish("warning", "BATT_LOW"); } } if (b >= BCLR) { blo = 0; t_reset("batt_low"); } if (dry) { out(1) = 0; out(2) = 0; out(3) = 0; js = S_FAULT; ms = S_FAULT; ds = S_FAULT; } else { if (tm1ok) { if (jm == MAN) { out(1) = 1; js = S_RUN; } else { if (jm == AUTO) { if (p < JON) { out(1) = 1; js = S_RUN; } else { if (p > JOFF) { out(1) = 0; js = S_STOP; } } } else { out(1) = 0; js = S_OFF; } } } else { js = S_FAULT; } if (tm2ok) { if (mm == MAN) { out(2) = 1; ms = S_RUN; } else { if (mm == AUTO) { if (p < MON) { out(2) = 1; ms = S_RUN; } else { if (p > MOFF) { out(2) = 0; ms = S_STOP; } } } else { out(2) = 0; ms = S_OFF; } } } else { ms = S_FAULT; } if (dm == MAN) { out(3) = 1; ds = S_RUN; } else { if (dm == AUTO) { if (p < DON) { out(3) = 1; ds = S_RUN; } else { if (p > DOFF) { out(3) = 0; ds = S_STOP; } } } else { out(3) = 0; ds = S_OFF; } } } if (dry || blo || ms == S_FAULT || js == S_FAULT) { out(4) = 1; error = 1; } else { out(4) = 0; error = 0; } if (ton("status_tick", 1, STATUS)) { t_reset("status_tick"); publish("status", "pressure", p, "battery", b, "water", w, "jockey_mode", jm, "main_mode", mm, "diesel_mode", dm, "jockey_state", js, "main_state", ms, "diesel_state", ds, "jockey_on", JON, "jockey_off", JOFF, "main_on", MON, "main_off", MOFF, "diesel_on", DON, "diesel_off", DOFF, "dry_run_fault", dry, "batt_low", blo, "error", error); } } onmqtt("JON_script") { if (msg_is_number) { logn("Saving JON value"); JON = msg_value; save(JON); } } // NVS writes are limited; avoid frequent SAVE calls. onmqtt("JOFF_script") { if (msg_is_number) { logn("Saving JOFF value"); JOFF = msg_value; save(JOFF); } } // NVS writes are limited; avoid frequent SAVE calls. onmqtt("MON_script") { if (msg_is_number) { logn("Saving MON value"); MON = msg_value; save(MON); } } // NVS writes are limited; avoid frequent SAVE calls. onmqtt("MOFF_script") { if (msg_is_number) { logn("Saving MOFF value"); MOFF = msg_value; save(MOFF); } } // NVS writes are limited; avoid frequent SAVE calls. onmqtt("DON_script") { if (msg_is_number) { logn("Saving DON value"); DON = msg_value; save(DON); } } // NVS writes are limited; avoid frequent SAVE calls. onmqtt("DOFF_script") { if (msg_is_number) { logn("Saving DOFF value"); DOFF = msg_value; save(DOFF); } } // NVS writes are limited; avoid frequent SAVE calls.