- 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>
8.4 KiB
8.4 KiB
Structure Comparison - Visual Guide
Current Structure (Room-Centric)
CODESYS:
┌─────────────────────────────────────┐
│ masterBedroom: fb_switch │
│ ├─ l_1 (Light 1) │
│ ├─ l_2 (Light 2) │
│ ├─ l_3 (Light 3) │
│ ├─ l_4 (Light 4) │
│ ├─ l_5 (Light 5) │
│ └─ l_6 (Light 6) │
└─────────────────────────────────────┘
Network Variable:
l_masterBedroom.l_1
l_masterBedroom.l_2
...
Home Assistant:
light.master_bedroom_l1
light.master_bedroom_l2
light.master_bedroom_l3
...
Problems:
- ❌ Generic names (l_1, l_2)
- ❌ Fixed 6 lights per room
- ❌ Wasted space (most rooms don't use all 6)
- ❌ Hard to identify which light is which
Option 1: Flat Light-Centric
CODESYS:
┌─────────────────────────────────────┐
│ lights: struct_all_lights │
│ ├─ kitchen_main │
│ ├─ kitchen_under_cabinet │
│ ├─ master_bedroom_main │
│ ├─ master_bedroom_bedside_left │
│ ├─ master_bedroom_bedside_right │
│ └─ ... (all lights flat) │
└─────────────────────────────────────┘
Network Variable:
lights.kitchen_main.on
lights.kitchen_main.state
lights.master_bedroom_main.on
...
Home Assistant:
light.kitchen_main
light.kitchen_under_cabinet
light.master_bedroom_main
light.master_bedroom_bedside_left
Benefits:
- ✅ Clear, descriptive names
- ✅ Easy to find lights
- ✅ No wasted space
- ✅ Perfect for HA organization
Option 4: Hybrid (Recommended)
CODESYS (Room-organized):
┌─────────────────────────────────────┐
│ rooms: struct_rooms │
│ ├─ kitchen │
│ │ ├─ main │
│ │ ├─ under_cabinet │
│ │ └─ island │
│ ├─ master_bedroom │
│ │ ├─ main │
│ │ ├─ bedside_left │
│ │ └─ bedside_right │
│ └─ ... │
└─────────────────────────────────────┘
Network Variable:
rooms.kitchen.main.on
rooms.kitchen.main.state
rooms.master_bedroom.main.on
...
Node-RED (Flattened):
kitchen_main → HA
kitchen_under_cabinet → HA
master_bedroom_main → HA
master_bedroom_bedside_left → HA
Home Assistant:
light.kitchen_main
light.kitchen_under_cabinet
light.master_bedroom_main
light.master_bedroom_bedside_left
Benefits:
- ✅ Organized in CODESYS (by room)
- ✅ Flat in Home Assistant (by light)
- ✅ Descriptive names
- ✅ Easy to add lights
- ✅ Best of both worlds
Real-World Example Comparison
Scenario: Kitchen with 3 lights
Current Structure:
kitchen: fb_switch
l_1 = ??? (which light?)
l_2 = ??? (which light?)
l_3 = ??? (which light?)
l_4 = unused
l_5 = unused
l_6 = unused
Hybrid Structure:
rooms.kitchen:
main = Main ceiling light
under_cabinet = Under cabinet lights
island = Island pendant
(no unused slots)
Home Assistant:
Current:
light.kitchen_l1 ← What is this?
light.kitchen_l2 ← What is this?
light.kitchen_l3 ← What is this?
Hybrid:
light.kitchen_main ← Clear!
light.kitchen_under_cabinet ← Clear!
light.kitchen_island ← Clear!
MQTT Topic Comparison
Current
homeassistant/light/master_bedroom_l1/state
homeassistant/light/master_bedroom_l2/state
homeassistant/light/kitchen_l1/state
Problems: Generic, hard to identify
Hybrid
homeassistant/light/kitchen_main/state
homeassistant/light/kitchen_under_cabinet/state
homeassistant/light/master_bedroom_main/state
homeassistant/light/master_bedroom_bedside_left/state
Benefits: Self-documenting, clear purpose
Home Assistant Dashboard Comparison
Current
Kitchen
├─ Light 1 ← What is this?
├─ Light 2 ← What is this?
└─ Light 3 ← What is this?
Master Bedroom
├─ Light 1 ← What is this?
├─ Light 2 ← What is this?
└─ Light 3 ← What is this?
Hybrid
Kitchen
├─ Main Light
├─ Under Cabinet
└─ Island
Master Bedroom
├─ Main Light
├─ Bedside Left
└─ Bedside Right
Much clearer!
Network Variable Efficiency
Current
- 15 rooms × 6 lights = 90 potential lights
- Most rooms use 2-3 lights
- Waste: ~60 unused light slots
- Network traffic: Sends all 90 values every 50ms
Hybrid
- Only define lights that exist
- Kitchen: 3 lights (not 6)
- Master Bedroom: 3 lights (not 6)
- Efficiency: ~50% less network traffic
- Clarity: Only relevant data
Scalability Comparison
Adding a New Light
Current:
- Find unused
l_Xslot in room - Hope it's available
- Update documentation
- Update HA manually
Hybrid:
- Add
new_light: struct_light_controlto room - Done! Auto-discovered in HA
Adding a New Room
Current:
- Add new room structure
- Add all 6 light slots (even if unused)
- Update network variables
- Update HA manually
Hybrid:
- Add room with only needed lights
- Done! Auto-discovered in HA
Implementation Example
Hybrid Structure in CODESYS
TYPE struct_light_control :
STRUCT
on: BOOL;
off: BOOL;
toggle: BOOL;
state: BOOL;
relay_status: BOOL;
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;
END_STRUCT
END_TYPE
VAR_GLOBAL
rooms: STRUCT
kitchen: STRUCT
main: struct_light_control;
under_cabinet: struct_light_control;
island: struct_light_control;
END_STRUCT;
master_bedroom: STRUCT
main: struct_light_control;
bedside_left: struct_light_control;
bedside_right: struct_light_control;
END_STRUCT;
// ... other rooms
END_STRUCT;
END_VAR
Node-RED Transformation
// Transform room-based to flat structure for HA
function transformToHA(msg) {
const rooms = msg.payload.rooms;
const result = {};
for (const [roomName, roomLights] of Object.entries(rooms)) {
for (const [lightName, lightControl] of Object.entries(roomLights)) {
const lightId = `${roomName}_${lightName}`;
result[lightId] = {
on: lightControl.on,
off: lightControl.off,
state: lightControl.state,
status: lightControl.relay_status
};
}
}
return { payload: result };
}
Home Assistant Auto-Discovery
# Node-RED publishes this automatically
homeassistant/light/kitchen_main/config:
name: "Kitchen Main"
unique_id: "kitchen_main"
state_topic: "homeassistant/light/kitchen_main/state"
command_topic: "homeassistant/light/kitchen_main/set"
state_value_template: "{{ value_json.state }}"
command_on_template: '{"on":true}'
command_off_template: '{"off":true}'
Recommendation Summary
Use Hybrid Structure (Option 4) because:
- ✅ Best Organization: Room-based in CODESYS, flat in HA
- ✅ Clear Naming:
kitchen_mainvsl_1 - ✅ Efficiency: Only define existing lights
- ✅ Scalability: Easy to add lights/rooms
- ✅ Maintainability: Self-documenting structure
- ✅ HA Integration: Perfect for Home Assistant
- ✅ Future-Proof: Easy to extend
Key Changes:
- Replace
l_1,l_2with descriptive names - Use function-based naming:
main,secondary,task, etc. - Flatten structure in Node-RED for HA
- Only define lights that exist
- Add metadata for better organization
See: Full Structure Redesign Analysis for complete details.