- Reorganized project: codesys/, docs/codesys|redesign|integration|reference/, scripts/ - CODESYS project and exports in codesys/ - Documentation index in docs/README.md - Redesign and light naming configuration - Water boiler control and safety design Co-authored-by: Cursor <cursoragent@cursor.com>
22 KiB
Light Naming Configuration - Hybrid Structure
Overview
This document defines the naming convention and structure for all lights in the home automation system using the Hybrid Structure (Option 4). This will serve as the basis for the redesign.
Structure: Room-organized in CODESYS, flattened for Home Assistant
Naming Convention: {room}_{function} (e.g., kitchen_main, master_bedroom_bedside_left)
Room-by-Room Light Configuration
1. Master Bedroom
Room ID: master_bedroom
Display Name: "Master Bedroom"
Lights:
main- Main ceiling lightbedside_left- Left bedside lampbedside_right- Right bedside lampcloset- Closet lightreading- Reading light (optional)ambient- Ambient/atmospheric lighting (optional)
CODESYS Structure:
rooms.master_bedroom:
main: struct_light_control;
bedside_left: struct_light_control;
bedside_right: struct_light_control;
closet: struct_light_control;
reading: struct_light_control; // Optional
ambient: struct_light_control; // Optional
Home Assistant Entities:
light.master_bedroom_mainlight.master_bedroom_bedside_leftlight.master_bedroom_bedside_rightlight.master_bedroom_closetlight.master_bedroom_reading(if used)light.master_bedroom_ambient(if used)
2. Master Bathroom
Room ID: master_bathroom
Display Name: "Master Bathroom"
Lights:
main- Main ceiling lightmirror- Mirror/vanity lightshower- Shower lightnight_light- Night light (low brightness)
CODESYS Structure:
rooms.master_bathroom:
main: struct_light_control;
mirror: struct_light_control;
shower: struct_light_control;
night_light: struct_light_control;
Home Assistant Entities:
light.master_bathroom_mainlight.master_bathroom_mirrorlight.master_bathroom_showerlight.master_bathroom_night_light
3. Bedroom 1
Room ID: bedroom_1
Display Name: "Bedroom 1"
Lights:
main- Main ceiling lightbedside- Bedside lampdesk- Desk lamp (if applicable)closet- Closet light (if applicable)
CODESYS Structure:
rooms.bedroom_1:
main: struct_light_control;
bedside: struct_light_control;
desk: struct_light_control; // Optional
closet: struct_light_control; // Optional
Home Assistant Entities:
light.bedroom_1_mainlight.bedroom_1_bedsidelight.bedroom_1_desk(if used)light.bedroom_1_closet(if used)
4. Bedroom 2
Room ID: bedroom_2
Display Name: "Bedroom 2"
Lights:
main- Main ceiling lightbedside- Bedside lampdesk- Desk lamp (if applicable)closet- Closet light (if applicable)
CODESYS Structure:
rooms.bedroom_2:
main: struct_light_control;
bedside: struct_light_control;
desk: struct_light_control; // Optional
closet: struct_light_control; // Optional
Home Assistant Entities:
light.bedroom_2_mainlight.bedroom_2_bedsidelight.bedroom_2_desk(if used)light.bedroom_2_closet(if used)
5. Bathroom
Room ID: bathroom
Display Name: "Bathroom"
Lights:
main- Main ceiling lightmirror- Mirror/vanity lightnight_light- Night light
CODESYS Structure:
rooms.bathroom:
main: struct_light_control;
mirror: struct_light_control;
night_light: struct_light_control;
Home Assistant Entities:
light.bathroom_mainlight.bathroom_mirrorlight.bathroom_night_light
6. Kitchen
Room ID: kitchen
Display Name: "Kitchen"
Lights:
main- Main ceiling lightunder_cabinet- Under cabinet task lightingisland- Island pendant lightpantry- Pantry light (if separate from pantry room)sink- Sink area light
CODESYS Structure:
rooms.kitchen:
main: struct_light_control;
under_cabinet: struct_light_control;
island: struct_light_control;
pantry: struct_light_control; // If in kitchen
sink: struct_light_control;
Home Assistant Entities:
light.kitchen_mainlight.kitchen_under_cabinetlight.kitchen_islandlight.kitchen_pantry(if used)light.kitchen_sink
7. Living Room
Room ID: living_room
Display Name: "Living Room"
Lights:
main- Main ceiling lightreading- Reading lamptv- TV area lightingaccent- Accent lightingfireplace- Fireplace area lighting (if applicable)
CODESYS Structure:
rooms.living_room:
main: struct_light_control;
reading: struct_light_control;
tv: struct_light_control;
accent: struct_light_control;
fireplace: struct_light_control; // Optional
Home Assistant Entities:
light.living_room_mainlight.living_room_readinglight.living_room_tvlight.living_room_accentlight.living_room_fireplace(if used)
8. Dining Room
Room ID: dining_room
Display Name: "Dining Room"
Lights:
main- Main chandelier/ceiling lightambient- Ambient lightingbuffet- Buffet/sideboard lighting (if applicable)
CODESYS Structure:
rooms.dining_room:
main: struct_light_control;
ambient: struct_light_control;
buffet: struct_light_control; // Optional
Home Assistant Entities:
light.dining_room_mainlight.dining_room_ambientlight.dining_room_buffet(if used)
9. Hallway
Room ID: hallway
Display Name: "Hallway"
Lights:
main- Main hallway lightsecondary- Secondary hallway light (if long hallway)night_light- Night light
CODESYS Structure:
rooms.hallway:
main: struct_light_control;
secondary: struct_light_control; // Optional
night_light: struct_light_control;
Home Assistant Entities:
light.hallway_mainlight.hallway_secondary(if used)light.hallway_night_light
10. Pantry
Room ID: pantry
Display Name: "Pantry"
Lights:
main- Main pantry light
CODESYS Structure:
rooms.pantry:
main: struct_light_control;
Home Assistant Entities:
light.pantry_main
11. Entrance
Room ID: entrance
Display Name: "Entrance"
Lights:
main- Main entrance lightsecurity- Security/porch light
CODESYS Structure:
rooms.entrance:
main: struct_light_control;
security: struct_light_control;
Home Assistant Entities:
light.entrance_mainlight.entrance_security
12. Guest WC
Room ID: guest_wc
Display Name: "Guest WC"
Lights:
main- Main lightnight_light- Night light
CODESYS Structure:
rooms.guest_wc:
main: struct_light_control;
night_light: struct_light_control;
Home Assistant Entities:
light.guest_wc_mainlight.guest_wc_night_light
13. Outdoor Veranda
Room ID: outdoor_veranda
Display Name: "Outdoor Veranda"
Lights:
main- Main veranda lightambient- Ambient/atmospheric lightingsecurity- Security lighting
CODESYS Structure:
rooms.outdoor_veranda:
main: struct_light_control;
ambient: struct_light_control;
security: struct_light_control;
Home Assistant Entities:
light.outdoor_veranda_mainlight.outdoor_veranda_ambientlight.outdoor_veranda_security
14. Outdoor Front
Room ID: outdoor_front
Display Name: "Outdoor Front"
Lights:
porch- Front porch lightsecurity- Security lightpathway- Pathway lighting
CODESYS Structure:
rooms.outdoor_front:
porch: struct_light_control;
security: struct_light_control;
pathway: struct_light_control;
Home Assistant Entities:
light.outdoor_front_porchlight.outdoor_front_securitylight.outdoor_front_pathway
15. Outdoor Side
Room ID: outdoor_side
Display Name: "Outdoor Side"
Lights:
security- Side security lightpathway- Side pathway lighting
CODESYS Structure:
rooms.outdoor_side:
security: struct_light_control;
pathway: struct_light_control;
Home Assistant Entities:
light.outdoor_side_securitylight.outdoor_side_pathway
16. Outdoor Back
Room ID: outdoor_back
Display Name: "Outdoor Back"
Lights:
patio- Patio/backyard lightsecurity- Back security lightgarden- Garden lighting (if applicable)
CODESYS Structure:
rooms.outdoor_back:
patio: struct_light_control;
security: struct_light_control;
garden: struct_light_control; // Optional
Home Assistant Entities:
light.outdoor_back_patiolight.outdoor_back_securitylight.outdoor_back_garden(if used)
Complete CODESYS Structure Definition
TYPE struct_light_control :
STRUCT
// Control Commands
ha_on: BOOL; // Home Assistant: Turn ON
ha_off: BOOL; // Home Assistant: Turn OFF
zigbee_toggle: BOOL; // Zigbee Switch: Toggle (edge detected)
// Status
state: BOOL; // Current light state
relay_status: BOOL; // Actual relay status (read from EtherCAT)
END_STRUCT
END_TYPE
TYPE struct_room_lights :
STRUCT
main: struct_light_control;
secondary: struct_light_control;
task: struct_light_control;
ambient: struct_light_control;
accent: struct_light_control;
security: struct_light_control;
// Room-specific lights defined per room
END_STRUCT
END_TYPE
VAR_GLOBAL
rooms: STRUCT
master_bedroom: STRUCT
main: struct_light_control;
bedside_left: struct_light_control;
bedside_right: struct_light_control;
closet: struct_light_control;
reading: struct_light_control;
ambient: struct_light_control;
END_STRUCT;
master_bathroom: STRUCT
main: struct_light_control;
mirror: struct_light_control;
shower: struct_light_control;
night_light: struct_light_control;
END_STRUCT;
bedroom_1: STRUCT
main: struct_light_control;
bedside: struct_light_control;
desk: struct_light_control;
closet: struct_light_control;
END_STRUCT;
bedroom_2: STRUCT
main: struct_light_control;
bedside: struct_light_control;
desk: struct_light_control;
closet: struct_light_control;
END_STRUCT;
bathroom: STRUCT
main: struct_light_control;
mirror: struct_light_control;
night_light: struct_light_control;
END_STRUCT;
kitchen: STRUCT
main: struct_light_control;
under_cabinet: struct_light_control;
island: struct_light_control;
pantry: struct_light_control;
sink: struct_light_control;
END_STRUCT;
living_room: STRUCT
main: struct_light_control;
reading: struct_light_control;
tv: struct_light_control;
accent: struct_light_control;
fireplace: struct_light_control;
END_STRUCT;
dining_room: STRUCT
main: struct_light_control;
ambient: struct_light_control;
buffet: struct_light_control;
END_STRUCT;
hallway: STRUCT
main: struct_light_control;
secondary: struct_light_control;
night_light: struct_light_control;
END_STRUCT;
pantry: STRUCT
main: struct_light_control;
END_STRUCT;
entrance: STRUCT
main: struct_light_control;
security: struct_light_control;
END_STRUCT;
guest_wc: STRUCT
main: struct_light_control;
night_light: struct_light_control;
END_STRUCT;
outdoor_veranda: STRUCT
main: struct_light_control;
ambient: struct_light_control;
security: struct_light_control;
END_STRUCT;
outdoor_front: STRUCT
porch: struct_light_control;
security: struct_light_control;
pathway: struct_light_control;
END_STRUCT;
outdoor_side: STRUCT
security: struct_light_control;
pathway: struct_light_control;
END_STRUCT;
outdoor_back: STRUCT
patio: struct_light_control;
security: struct_light_control;
garden: struct_light_control;
END_STRUCT;
END_STRUCT;
END_VAR
Light Function Types Reference
Use these standard function names for consistency:
| Function | Description | Typical Use |
|---|---|---|
main |
Primary/ceiling light | Main illumination in room |
secondary |
Secondary light | Additional main light |
bedside_left |
Left bedside lamp | Bedroom bedside |
bedside_right |
Right bedside lamp | Bedroom bedside |
bedside |
Single bedside lamp | Single bed rooms |
closet |
Closet light | Storage areas |
desk |
Desk lamp | Study/work areas |
reading |
Reading light | Reading areas |
mirror |
Mirror/vanity light | Bathrooms |
shower |
Shower light | Bathroom shower |
night_light |
Night light | Low brightness |
under_cabinet |
Under cabinet | Kitchen task lighting |
island |
Island pendant | Kitchen island |
sink |
Sink area light | Kitchen/bathroom |
tv |
TV area lighting | Living room |
accent |
Accent lighting | Decorative |
ambient |
Ambient lighting | Atmospheric |
fireplace |
Fireplace area | Living room |
buffet |
Buffet/sideboard | Dining room |
porch |
Porch light | Entrance |
patio |
Patio light | Backyard |
security |
Security light | Outdoor security |
pathway |
Pathway lighting | Outdoor paths |
garden |
Garden lighting | Outdoor garden |
Water Boiler Control
Water Boiler Structure
TYPE struct_water_boiler :
STRUCT
// Control Commands
ha_on: BOOL; // Home Assistant: Turn ON
ha_off: BOOL; // Home Assistant: Turn OFF
schedule_on: BOOL; // Scheduled ON (from automation)
schedule_off: BOOL; // Scheduled OFF (from automation)
// Status
state: BOOL; // Current boiler state (ON/OFF)
relay_status: BOOL; // Actual relay status
temperature: REAL; // Water temperature (if sensor available)
// Safety
safety_override: BOOL; // Safety system override (read-only)
error_state: BOOL; // Error state flag
last_error: STRING; // Last error message
END_STRUCT
END_TYPE
VAR_GLOBAL
water_boiler: struct_water_boiler;
END_VAR
Water Boiler Function Block
FUNCTION_BLOCK fb_waterBoiler
VAR_INPUT
// Control
ha_on: BOOL;
ha_off: BOOL;
schedule_on: BOOL;
schedule_off: BOOL;
// Sensors
temperature: REAL; // Water temperature sensor
pressure: REAL; // Water pressure (if available)
// Safety Inputs
emergency_stop: BOOL; // Emergency stop button
flow_sensor: BOOL; // Water flow sensor
overtemp_sensor: BOOL; // Over-temperature sensor
pressure_sensor: BOOL; // Pressure sensor (if available)
// Relay Output
relay_output: BOOL; // Read actual relay state
END_VAR
VAR_OUTPUT
relay_control: BOOL; // Control output to relay
state: BOOL; // Current state
relay_status: BOOL; // Actual relay status
safety_override: BOOL; // Safety override active
error_state: BOOL; // Error detected
error_code: INT; // Error code
error_message: STRING; // Error description
END_VAR
VAR
// Internal State
internal_state: BOOL;
last_state: BOOL;
// Safety Timers
max_on_time: TIME := T#8H; // Maximum ON time (8 hours)
min_off_time: TIME := T#30M; // Minimum OFF time (30 minutes)
on_timer: TON;
off_timer: TON;
// Temperature Limits
max_temp: REAL := 80.0; // Maximum temperature (°C)
min_temp: REAL := 10.0; // Minimum temperature (°C)
// Safety Flags
temp_ok: BOOL;
pressure_ok: BOOL;
flow_ok: BOOL;
time_ok: BOOL;
// Edge Detection
r_trig_ha_on: R_TRIG;
r_trig_ha_off: R_TRIG;
r_trig_schedule_on: R_TRIG;
r_trig_schedule_off: R_TRIG;
r_trig_emergency: R_TRIG;
END_VAR
Safety Logic Implementation
// Edge detection
r_trig_ha_on(CLK := ha_on);
r_trig_ha_off(CLK := ha_off);
r_trig_schedule_on(CLK := schedule_on);
r_trig_schedule_off(CLK := schedule_off);
r_trig_emergency(CLK := emergency_stop);
// Safety Checks
temp_ok := (temperature >= min_temp) AND (temperature <= max_temp);
pressure_ok := pressure_sensor; // Assuming normally closed safety switch
flow_ok := flow_sensor; // Water flow detected
time_ok := NOT on_timer.Q; // Not exceeded max ON time
// Safety Override (highest priority)
IF r_trig_emergency.Q OR NOT temp_ok OR NOT pressure_ok THEN
safety_override := TRUE;
internal_state := FALSE;
error_state := TRUE;
error_code := 1; // Safety override
error_message := 'Safety override active';
ELSIF NOT flow_ok AND internal_state THEN
// No water flow but boiler is on - turn off after delay
off_timer(IN := TRUE, PT := T#5M); // 5 minute delay
IF off_timer.Q THEN
internal_state := FALSE;
error_state := TRUE;
error_code := 2; // No flow
error_message := 'No water flow detected';
END_IF;
ELSIF NOT time_ok THEN
// Maximum ON time exceeded
internal_state := FALSE;
error_state := TRUE;
error_code := 3; // Time exceeded
error_message := 'Maximum ON time exceeded';
ELSE
safety_override := FALSE;
error_state := FALSE;
error_code := 0;
error_message := '';
END_IF;
// Control Logic (only if safety OK)
IF NOT safety_override THEN
// Priority: Emergency OFF > Manual OFF > Scheduled OFF > Manual ON > Scheduled ON
IF r_trig_ha_off.Q OR r_trig_schedule_off.Q THEN
internal_state := FALSE;
ELSIF r_trig_ha_on.Q OR r_trig_schedule_on.Q THEN
IF temp_ok AND flow_ok AND time_ok THEN
internal_state := TRUE;
on_timer(IN := internal_state, PT := max_on_time);
END_IF;
END_IF;
END_IF;
// Update timers
on_timer(IN := internal_state AND NOT safety_override, PT := max_on_time);
off_timer(IN := NOT internal_state, PT := min_off_time);
// Output Assignment
relay_control := internal_state AND NOT safety_override;
state := internal_state;
relay_status := relay_output; // Read from actual relay
Safety Measures
1. Temperature Protection
- Max Temperature: 80°C (configurable)
- Min Temperature: 10°C (freeze protection)
- Action: Auto-shutoff if temperature exceeds limits
2. Time-Based Protection
- Max ON Time: 8 hours (prevents continuous operation)
- Min OFF Time: 30 minutes (prevents rapid cycling)
- Action: Force OFF after max time, prevent ON during min OFF time
3. Flow Detection
- Flow Sensor: Monitors water flow
- Action: Shut off if no flow detected for 5 minutes (dry-run protection)
4. Emergency Stop
- Emergency Button: Physical emergency stop
- Action: Immediate shutdown, requires manual reset
5. Pressure Protection
- Pressure Sensor: Monitors system pressure
- Action: Shut off if pressure abnormal
6. State Monitoring
- Relay Status: Read actual relay state
- Action: Detect relay failures, report status
7. Error Reporting
- Error Codes:
- 0: No error
- 1: Safety override
- 2: No flow
- 3: Time exceeded
- 4: Temperature fault
- 5: Pressure fault
- Error Messages: Human-readable descriptions
Water Boiler Network Variable
// Sent to Node-RED (Status)
VAR_GLOBAL
boiler_status: struct_water_boiler;
END_VAR
// Received from Node-RED (Commands)
VAR_GLOBAL
boiler_commands: STRUCT
ha_on: BOOL;
ha_off: BOOL;
schedule_on: BOOL;
schedule_off: BOOL;
END_STRUCT;
END_VAR
Home Assistant Integration
Entity Type: switch or water_heater
switch:
- platform: mqtt
name: "Water Boiler"
unique_id: "water_boiler"
state_topic: "homeassistant/water_boiler/state"
command_topic: "homeassistant/water_boiler/set"
state_value_template: "{{ value_json.state }}"
command_on_template: '{"ha_on":true}'
command_off_template: '{"ha_off":true}'
qos: 1
retain: true
sensor:
- platform: mqtt
name: "Water Boiler Temperature"
state_topic: "homeassistant/water_boiler/state"
value_template: "{{ value_json.temperature }}"
unit_of_measurement: "°C"
- platform: mqtt
name: "Water Boiler Error"
state_topic: "homeassistant/water_boiler/state"
value_template: "{{ value_json.error_message }}"
Summary
Light Configuration
- Total Rooms: 16 (15 indoor + outdoor areas)
- Total Lights: ~60-70 lights (varies by room)
- Structure: Hybrid (room-organized in CODESYS, flat in HA)
- Naming:
{room}_{function}format
Water Boiler
- Control: ON/OFF with scheduling
- Safety: 7 safety measures implemented
- Monitoring: Temperature, flow, pressure, time
- Error Reporting: Comprehensive error codes and messages
Next Steps
- Review and modify light names per room based on actual installation
- Map lights to relay outputs
- Implement new structure in CODESYS
- Update Node-RED flows
- Configure Home Assistant entities
- Test all safety measures for water boiler
Document Status: Template - Modify with actual light configuration
Last Updated: January 27, 2026