NEWS
function-node aktivieren/deaktivieren
-
Hallo,
bin neu in Node-Red.
Ich will eine Anwesenheitssimulation machen. Letztendlich gehn die "Daten" an KNX-Geräte. Das funktioniert schon mal.Meine "Hauptproblem" boolsche Logiken/Nodes vermisse ich in Node-Red im Vergleich zu andern Systemen.
Ich will, dass der Funktionsnode nur dann ausgeführt wird, wenn eine externe boolsche Bedingung erfüllt ist. z.B. ein Schalter oder bestimmte Uhrzeiten um die Anwesenheitssimulation zu aktivieren.Mein Code funktioniert ja nicht, weil am Eingang der Funktion der Payload zyklisch durch den Taktgeber wieder überschrieben wird. Chat GPT hat zwar Vorschläge, die funktionieren aber nicht oder ich verstehe sie nicht.
Danke schon mal....
[ { "id": "db744027d9c55da8", "type": "tab", "label": "Anwesenheitssimulation", "disabled": false, "info": "" }, { "id": "6e26b231fd24ccf9", "type": "inject", "z": "db744027d9c55da8", "name": "Taktgeber", "props": [], "repeat": "1", "crontab": "", "once": true, "onceDelay": "0.1", "topic": "", "x": 330, "y": 260, "wires": [ [ "cddee6fc22707fa6", "9571faaa2cace06b" ] ] }, { "id": "cddee6fc22707fa6", "type": "function", "z": "db744027d9c55da8", "name": "Zufällige Lampe", "func": "// Überprüfen, ob die Anwesenheitssimulation aktiv ist\nif (msg.payload) { // msg.payload ist true, wenn aktiv\n // Zufällige Lampe auswählen\n let randomLamp = Math.floor(Math.random() * 3); // Zufällige Lampe (0, 1 oder 2)\n\n // Zufällige Lampe und Zustand initialisieren\n let lampStates = [\"OFF\", \"OFF\", \"OFF\"]; // Standardmäßig sind alle Lampen aus\n\n // Eine zufällige Lampe auf \"ON\" setzen\n lampStates[randomLamp] = \"ON\";\n\n // Sicherstellen, dass mindestens eine Lampe \"ON\" ist\n if (Math.random() < 0.5) { // 50% Chance, eine andere Lampe ebenfalls \"ON\" zu setzen\n let secondLamp = (randomLamp + 1) % 3; // Eine andere Lampe auswählen\n lampStates[secondLamp] = \"ON\"; // Diese Lampe auf \"ON\" setzen\n }\n\n // Die Lampenstatus in die Payload einfügen\n msg.payload = [\n { lamp: 0, state: lampStates[0] },\n { lamp: 1, state: lampStates[1] },\n { lamp: 2, state: lampStates[2] }\n ];\n\n return msg; // Nachricht zurückgeben, wenn aktiv\n} else {\n // Wenn nicht aktiv, keine Veränderung an den Lampen\n return null; // Nachricht nicht zurückgeben\n}\n", "outputs": 1, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 620, "y": 260, "wires": [ [ "f1c40d8b.b6d9e" ] ] }, { "id": "c1d9777a0b7e722d", "type": "switch", "z": "db744027d9c55da8", "name": "Lampensteuerung", "property": "payload.lamp", "propertyType": "msg", "rules": [ { "t": "eq", "v": "0", "vt": "num" }, { "t": "eq", "v": "1", "vt": "num" }, { "t": "eq", "v": "2", "vt": "num" } ], "checkall": "true", "repair": false, "outputs": 3, "x": 1210, "y": 260, "wires": [ [ "acd34ee251bf299d" ], [ "1a1e642005d4f084" ], [ "d56321d052bed130" ] ] }, { "id": "acd34ee251bf299d", "type": "change", "z": "db744027d9c55da8", "name": "Status für Lampe 1", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "payload.state", "tot": "msg" } ], "action": "", "property": "", "x": 1570, "y": 260, "wires": [ [ "97f2e503ce554a63" ] ] }, { "id": "97f2e503ce554a63", "type": "ui-led", "z": "db744027d9c55da8", "name": "Lampe 11", "group": "eae2e6e4e2b30e79", "order": 3, "width": 0, "height": 0, "label": "Lampe 11", "labelPlacement": "left", "labelAlignment": "flex-end", "states": [ { "value": "ON", "valueType": "str", "color": "#ffff00" }, { "value": "OFF", "valueType": "str", "color": "#808000" } ], "shape": "square", "showBorder": true, "showGlow": true, "x": 1960, "y": 260, "wires": [] }, { "id": "1a1e642005d4f084", "type": "change", "z": "db744027d9c55da8", "name": "Status für Lampe 2", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "payload.state", "tot": "msg" } ], "action": "", "property": "", "x": 1570, "y": 320, "wires": [ [ "9f4c1f52e7edc3cc" ] ] }, { "id": "d56321d052bed130", "type": "change", "z": "db744027d9c55da8", "name": "Status für Lampe 3", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "payload.state", "tot": "msg" } ], "action": "", "property": "", "x": 1570, "y": 380, "wires": [ [ "3412a2106c836d52" ] ] }, { "id": "9f4c1f52e7edc3cc", "type": "ui-led", "z": "db744027d9c55da8", "name": "Lampe 12", "group": "eae2e6e4e2b30e79", "order": 4, "width": 0, "height": 0, "label": "Lampe 12", "labelPlacement": "left", "labelAlignment": "flex-end", "states": [ { "value": "ON", "valueType": "str", "color": "#ffff00" }, { "value": "OFF", "valueType": "str", "color": "#808000" } ], "shape": "square", "showBorder": true, "showGlow": true, "x": 1960, "y": 320, "wires": [] }, { "id": "3412a2106c836d52", "type": "ui-led", "z": "db744027d9c55da8", "name": "Lampe 13", "group": "eae2e6e4e2b30e79", "order": 5, "width": 0, "height": 0, "label": "Lampe 13", "labelPlacement": "left", "labelAlignment": "flex-end", "states": [ { "value": "ON", "valueType": "str", "color": "#ffff00" }, { "value": "OFF", "valueType": "str", "color": "#808000" } ], "shape": "square", "showBorder": true, "showGlow": true, "x": 1960, "y": 380, "wires": [] }, { "id": "f1c40d8b.b6d9e", "type": "split", "z": "db744027d9c55da8", "name": "Split Lampenstatus", "splt": "\\n", "spltType": "auto", "arraySplt": "1", "arraySpltType": "len", "stream": false, "addname": "", "property": "payload", "x": 890, "y": 260, "wires": [ [ "c1d9777a0b7e722d" ] ] }, { "id": "9571faaa2cace06b", "type": "function", "z": "db744027d9c55da8", "name": "Uhrzeit prüfen", "func": "const currentTime = new Date();\nconst hours = currentTime.getHours();\n\nif (hours >= 18 && hours < 23) {\n // Zwischen 18 und 23 Uhr\n msg.payload = \"Lampen einschalten\"; // oder eine spezifische Steuerung für die Lampen\n} else {\n // Außerhalb der erlaubten Zeiten\n msg.payload = \"Lampen ausschalten\"; // oder eine spezifische Steuerung für die Lampen\n}\n\nreturn msg;\n", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 620, "y": 360, "wires": [ [] ] }, { "id": "cc2b6675dc1a6ce3", "type": "ui-switch", "z": "db744027d9c55da8", "name": "", "label": "switch", "group": "eae2e6e4e2b30e79", "order": 0, "width": 0, "height": 0, "passthru": false, "decouple": false, "topic": "payload", "topicType": "msg", "style": "", "className": "", "layout": "row-spread", "clickableArea": "switch", "onvalue": "{\"simulation\": true}", "onvalueType": "json", "onicon": "", "oncolor": "", "offvalue": "{\"simulation\": false}", "offvalueType": "json", "officon": "", "offcolor": "", "x": 310, "y": 160, "wires": [ [ "cddee6fc22707fa6" ] ] }, { "id": "eae2e6e4e2b30e79", "type": "ui-group", "name": "Group 1", "page": "a3e6081f6177718a", "width": "2", "height": 1, "order": 1, "showTitle": true, "className": "", "visible": "true", "disabled": "false", "groupType": "default" }, { "id": "a3e6081f6177718a", "type": "ui-page", "name": "Page 1", "ui": "e0f1fa3c5c6ad564", "path": "/page1", "icon": "home", "layout": "grid", "theme": "8077bd265499d558", "breakpoints": [ { "name": "Default", "px": "0", "cols": "3" }, { "name": "Tablet", "px": "576", "cols": "6" }, { "name": "Small Desktop", "px": "768", "cols": "9" }, { "name": "Desktop", "px": "1024", "cols": "12" } ], "order": 1, "className": "", "visible": "true", "disabled": "false" }, { "id": "e0f1fa3c5c6ad564", "type": "ui-base", "name": "My Dashboard", "path": "/dashboard", "appIcon": "", "includeClientData": true, "acceptsClientConfig": [ "ui-notification", "ui-control" ], "showPathInSidebar": false, "headerContent": "page", "navigationStyle": "default", "titleBarStyle": "default", "showReconnectNotification": true, "notificationDisplayTime": 1, "showDisconnectNotification": true, "allowInstall": true }, { "id": "8077bd265499d558", "type": "ui-theme", "name": "Default Theme", "colors": { "surface": "#ffffff", "primary": "#0094CE", "bgPage": "#eeeeee", "groupBg": "#ffffff", "groupOutline": "#cccccc" }, "sizes": { "density": "default", "pagePadding": "12px", "groupGap": "12px", "groupBorderRadius": "4px", "widgetGap": "12px" } }, { "id": "1bc863875cde0fe8", "type": "global-config", "env": [], "modules": { "@flowfuse/node-red-dashboard-2-ui-led": "1.1.0", "@flowfuse/node-red-dashboard": "1.26.0" } } ]
-
hier hat @mickym mal AND und OR beschrieben
https://forum.iobroker.net/topic/51180/boolean-logic-problem/5?_=1756650577534 -
@mark_in-dark Also entweder Du prüfst diverse Eigenschaften eines Nachrichtenobjektes ab, dann kannst Du Change oder function Nodes machen oder wenn Du externe Bedingungen nehmen willst, wie Uhrzeit nimmst, dann prüfst du die innerhalb des Flows ab. Wenn Du bestimmte Schalter zusätzlich abprüfen willst, machst Du das auch in dem Flow oder speicherst den Status im Kontext.
Wenn Du also die Uhrzeit abprüfen willst, dann musst Du es halt in den Flow hängen - wenn Du die Nodes parallel machst dann ist es wie eine ODER Bedingung. Ich würde generell keine function Nodes verwenden, wenn möglich.
Oder mit anderen Worten auf die Überschrift angewandt: Du musst halt vor die function Node eine Node setzen, die den Flow blockiert, sodass die function Node gar nicht mehr angesteuert wird.
-
@mickym
Danke für die Antwort.
Auch wenn ich gerade noch nicht konkret duchblicke, muss ich wohl noch etwas Grundlagenforschung machen, obwohl ich eher ein einmaliges Projekt habe und darum nicht zu viel Zeit in die Einarbeitung in Node-Red stecken möchte.function-Node finde ich eigentlich praktisch, denn da hätte ich in den einen noch mehr hineingepackt, eben auch die Uhrzeitabfrage. Warum man functions-nodes nicht unbedingt verwenden soll, verstehe ich gerade nicht.
-
weil du dann node-red nicht benötigst, sondern einfach nur javascript schreibst und das dann direkt im javascript adapter ausführen könntest.
node-red ist ja eher eine no-code (evtl low-code) Umgebung.
die function node ist eher die notlösung um lücken zu füllen, die node-red nicht unterstützt oder es keine nodes zum nachinstallieren gibt.die grafische nachvollziehbarkeit von abläufen geht dann auch verloren.
-
@oliverio
ja da hast du auch wieder recht. Sehe aber in Node-Red den Vorteil, dass ich ein Lauzeitplattform, eine Webseite habe und meine KNX-Anbindung fertig funktionsfähig ist.
Kann meine Gewünschte Anwesenheitssimulation gerne mit grafischen Nodes machen. Bin froh im irgendwelche Tipps. Vielleicht wäre eine andere Lösung als Node-Red besser geeignet für mein Vorhaben? -
daher solltest.
KNX funktioniert ja im iobroker grundsätzlich auch, aber halt mit entsprechenden Lizenzbeschränkungen.
Keine node-red Polizei wird dir das verbieten -
@oliverio
Danke, iobroker kenne ich noch weniger, Du meinst damit wäre es einfacher meine Wünsch zu erfüllen, darf ruhige etwas kosten... -
du kannst ja mal probeweise installieren
https://github.com/ioBroker/ioBroker.knx?tab=readme-ov-file#license-requirementsbis zu einer grenze ist er kostenlos
dann noch den javascript adapter dazu
https://github.com/ioBroker/ioBroker.javascriptich selbst habe kein knx. daher weiß ich nicht was wirklich einfacher ist
-
Super! Herzlichen Dank, ich schaue es mir mal an.
Schönen Abend!