PLC application sources (NVL, rooms, boiler), HA/Node-RED integration guide, and NVL patch utilities. Co-authored-by: Cursor <cursoragent@cursor.com>
58 lines
1.5 KiB
Smalltalk
58 lines
1.5 KiB
Smalltalk
(* === DECLARATION === *)
|
|
FUNCTION_BLOCK fb_light
|
|
VAR_INPUT
|
|
// Home Assistant Commands
|
|
ha_on: BOOL; // HA command: Turn ON
|
|
ha_off: BOOL; // HA command: Turn OFF
|
|
|
|
// Zigbee Switch Input
|
|
zigbee_sw: BOOL; // Zigbee switch (edge detected)
|
|
|
|
// Status Feedback
|
|
relay_status: BOOL; // Actual relay state (read from EtherCAT)
|
|
END_VAR
|
|
VAR_OUTPUT
|
|
light_output: BOOL; // Control output to relay
|
|
light_status: BOOL; // Status to send back (actual relay state)
|
|
END_VAR
|
|
VAR
|
|
// Edge triggers
|
|
r_trig_ha_on: R_TRIG;
|
|
r_trig_ha_off: R_TRIG;
|
|
r_trig_zigbee: R_TRIG;
|
|
|
|
// Internal state
|
|
light_state: BOOL := FALSE;
|
|
END_VAR
|
|
|
|
(* === IMPLEMENTATION === *)
|
|
// =====================================================
|
|
// fb_light - Implementation (per redesign)
|
|
// =====================================================
|
|
// Priority (highest to lowest):
|
|
// 1. HA OFF command - Always turns light OFF
|
|
// 2. HA ON command - Always turns light ON
|
|
// 3. Zigbee toggle - Toggles current state
|
|
// 4. Maintain current state
|
|
// =====================================================
|
|
|
|
// Edge detection for commands
|
|
r_trig_ha_on(CLK := ha_on);
|
|
r_trig_ha_off(CLK := ha_off);
|
|
r_trig_zigbee(CLK := zigbee_sw);
|
|
|
|
// State machine
|
|
IF r_trig_ha_off.Q THEN
|
|
light_state := FALSE;
|
|
ELSIF r_trig_ha_on.Q THEN
|
|
light_state := TRUE;
|
|
ELSIF r_trig_zigbee.Q THEN
|
|
light_state := NOT light_state;
|
|
END_IF;
|
|
|
|
// Output assignment
|
|
light_output := light_state;
|
|
|
|
// Status feedback (read from actual relay)
|
|
light_status := relay_status;
|