Remove obsolete INFORMATION_NEEDED.md and streamline README.md for clarity

- Deleted the INFORMATION_NEEDED.md file as it was no longer necessary for documentation.
- Revised README.md to enhance the overview of the home automation system, focusing on how services and CODESYS connectivity work.
- Updated project structure in README.md for better organization and clarity, including links to relevant documentation.

This update simplifies the documentation and improves the overall user experience for developers and users of the home automation system.
This commit is contained in:
2026-02-08 17:09:30 +02:00
parent 6ef31cd12a
commit f0d883b8c2
24 changed files with 15006 additions and 3673 deletions

View File

@@ -0,0 +1,33 @@
// Run this AFTER nvl-receive. Syncs all mapped lights from PLC state to HA entities.
// Connect output 1 → Action node (turn_on), output 2 → Action node (turn_off).
// Format matches node-red-contrib-home-assistant-websocket "Action" node: payload.action + payload.target.entity_id (array).
// Only outputs when state changed (per entity). Add more entries to LIGHT_ENTITY_MAP as you add rooms/lights.
// Map: NVL room key (in payload) + light index 1..6 → HA entity_id
const LIGHT_ENTITY_MAP = [
{ room: 'light_livingRoom', light: 1, entityId: 'input_boolean.living_room_new' },
// { room: 'light_livingRoom', light: 2, entityId: 'input_boolean.living_room_2' },
// { room: 'l_kitchen', light: 1, entityId: 'light.kitchen_ceiling' },
];
const payload = msg.payload || {};
const onMsgs = [];
const offMsgs = [];
for (const entry of LIGHT_ENTITY_MAP) {
const room = payload[entry.room] || {};
const isOn = !!(room['l_' + entry.light] || room['l' + entry.light]);
const flowKey = 'nvlToHa_' + entry.entityId.replace(/\./g, '_');
const last = flow.get(flowKey);
if (last === isOn) continue;
flow.set(flowKey, isOn);
const domain = entry.entityId.split('.')[0] || 'input_boolean';
const action = domain + '.' + (isOn ? 'turn_on' : 'turn_off');
const out = { payload: { action: action, target: { entity_id: [entry.entityId] } } };
if (isOn) onMsgs.push(out); else offMsgs.push(out);
}
if (onMsgs.length === 0 && offMsgs.length === 0) return null;
return [onMsgs, offMsgs];