// SmartI8 light panel: 8 DI toggle buttons, 8 DO relays. // MQTT keys: light1..light8 (ON/OFF or 1/0). All relay changes delayed by 3 seconds. DELAY_MS = 3000; SCAN_MS = 100; REPORT_MS = 60000; lastMask = 0; macro SetRelay(idx, val) { delay(DELAY_MS) { out(idx) = val; } } macro ToggleRelay(idx) { delay(DELAY_MS) { toggle(idx); } } macro UpdateReportIfChanged() { mask = out(1) + out(2) * 2 + out(3) * 4 + out(4) * 8 + out(5) * 16 + out(6) * 32 + out(7) * 64 + out(8) * 128; if (mask != lastMask) { lastMask = mask; ioreport(); } } every(SCAN_MS) { if (p_edge(in(1))) { ToggleRelay(1); } if (p_edge(in(2))) { ToggleRelay(2); } if (p_edge(in(3))) { ToggleRelay(3); } if (p_edge(in(4))) { ToggleRelay(4); } if (p_edge(in(5))) { ToggleRelay(5); } if (p_edge(in(6))) { ToggleRelay(6); } if (p_edge(in(7))) { ToggleRelay(7); } if (p_edge(in(8))) { ToggleRelay(8); } UpdateReportIfChanged(); } every(REPORT_MS) { ioreport(); } onmqtt("light1_script") { if (msg_is_on) { SetRelay(1, 1); } if (msg_is_off) { SetRelay(1, 0); } if (msg_is_number) { if (msg_value > 0) { SetRelay(1, 1); } else { SetRelay(1, 0); } } } onmqtt("light2_script") { if (msg_is_on) { SetRelay(2, 1); } if (msg_is_off) { SetRelay(2, 0); } if (msg_is_number) { if (msg_value > 0) { SetRelay(2, 1); } else { SetRelay(2, 0); } } } onmqtt("light3_script") { if (msg_is_on) { SetRelay(3, 1); } if (msg_is_off) { SetRelay(3, 0); } if (msg_is_number) { if (msg_value > 0) { SetRelay(3, 1); } else { SetRelay(3, 0); } } } onmqtt("light4_script") { if (msg_is_on) { SetRelay(4, 1); } if (msg_is_off) { SetRelay(4, 0); } if (msg_is_number) { if (msg_value > 0) { SetRelay(4, 1); } else { SetRelay(4, 0); } } } onmqtt("light5_script") { if (msg_is_on) { SetRelay(5, 1); } if (msg_is_off) { SetRelay(5, 0); } if (msg_is_number) { if (msg_value > 0) { SetRelay(5, 1); } else { SetRelay(5, 0); } } } onmqtt("light6_script") { if (msg_is_on) { SetRelay(6, 1); } if (msg_is_off) { SetRelay(6, 0); } if (msg_is_number) { if (msg_value > 0) { SetRelay(6, 1); } else { SetRelay(6, 0); } } } onmqtt("light7_script") { if (msg_is_on) { SetRelay(7, 1); } if (msg_is_off) { SetRelay(7, 0); } if (msg_is_number) { if (msg_value > 0) { SetRelay(7, 1); } else { SetRelay(7, 0); } } } onmqtt("light8_script") { if (msg_is_on) { SetRelay(8, 1); } if (msg_is_off) { SetRelay(8, 0); } if (msg_is_number) { if (msg_value > 0) { SetRelay(8, 1); } else { SetRelay(8, 0); } } } onmqtt("all_on_script") { SetRelay(1, 1); SetRelay(2, 1); SetRelay(3, 1); SetRelay(4, 1); SetRelay(5, 1); SetRelay(6, 1); SetRelay(7, 1); SetRelay(8, 1); } onmqtt("all_off_script") { SetRelay(1, 0); SetRelay(2, 0); SetRelay(3, 0); SetRelay(4, 0); SetRelay(5, 0); SetRelay(6, 0); SetRelay(7, 0); SetRelay(8, 0); }