Skip to content

Node-Red

Hilfe für Skripterstellung mit Node-RED

953 Topics 13.1k Posts

NEWS

  • contrib-amazon-echo: Farbkonvertierung?

    18
    0 Votes
    18 Posts
    3k Views
    B
    Hallo nochmals Zusammen, also als Verständniss vieleicht habe ich mich unklar ausgedrückt es geht um folgende Einstellungen: Wie gebe ich hier dem Amazon Echo Hub z.b die Rückmeldung (angenommen mit der HUE App Lampe eingeschaltet) Lampe EIN. [image: 1674779299410-1.1.png] [image: 1674779310047-5.png] [image: 1674779316806-1.png] [image: 1674779320047-2.png] [image: 1674779323904-3.png] [image: 1674779329472-4.png]
  • Dreifach-Taster TS0043

    2
    2
    0 Votes
    2 Posts
    114 Views
    mickymM
    @gregor37 Sieht so aus, also ob die Datenpunkte noch nicht initialisiert wären. Musst halt mal ein Doppelklick auf einen Taster machen und schauen, ob sich dann der Datenpunkt füllt.
  • Nur eine Lampe ein- und ausschalten...

    Moved
    14
    0 Votes
    14 Posts
    731 Views
    mickymM
    @gregor37 Das eine hat mit dem anderen nichts zu tun. Du kannst über Node-Red mit den iobroker-IN und iobroker-OUT Nodes die Datenpunkte im iobroker beschreiben egal wo. Das zigbee2mqtt hängt nun davon ab, wie Du es verwendest zusammen mit dem iobroker: Wenn Du einen externen mqtt-broker verwendest (zum Beispiel) mosquitto bekommst Du die Datenpunkte in den iobroker mit dem mqtt-Adapter als Client konfiguriert. (so habe ich es gemacht). Wenn Du den mqtt-Adapter als Broker definierst, dann hast Du die datenpunkte direkt und kannst den Broker auch direkt ansprechen. Aus Node-Red kannst Du alle (fast) Datenpunkte im iobroker, via der iobroker Nodes ansprechen, bei mqtt (als zigbee2mqtt) auch noch mit den mqtt-Nodes. Es gibt auch noch einen neuen zigbee2mqtt Adapter, der entweder selbst als mqtt-Broker agiert oder (vorbildlich !) auch einen externen mqtt-Broker nutzen kann. Damit werde die Datenpunkte wieder interpretiert, man kann aber ggf. auch direkt via mqtt zugreifen. Die Fragen stellt sich also nicht, welche Nodes Du verwendest, sondern eher ob Du lieber den zigbee-Adapter oder zigbee2mqtt verwenden willst. Ich bin aus mehrfach schon erwähnten Gründen auf zigbee2mqtt umgestiegen, da ich auch den Conbee2 Stick als Koordinator verwende, der von den zigbee Adapter Entwicklern anfangs nicht voll unterstützt wurde. Inzwischen mag das besser sein. Der zigbee-Adapter greift aber letztlich anscheinend auch nur auf das zurück, was zigbee2mqtt anbietet. Aber wie gesagt, das hat alles nichts mit den Nodes bzw. NodeRed zu tun. NodeRed spielt hier was die Effizienz betrifft gar keine Rolle, sondern eher die ausführende Schickt (zigbee-Adapter oder zigbee2mqtt Service).
  • MQTT out an node-red-contrib-dynamic-thermostat anpassen.

    climate
    5
    0 Votes
    5 Posts
    532 Views
    N
    @mickym Vielen Dank für die Lösung. Hatte es inzwischen mit einem Function Node hinbekommen. Gruß NetFritz
  • Fehlermeldung

    4
    0 Votes
    4 Posts
    134 Views
    S
    @mickym hat sich erledigt, da kam in de Node noch eine andere Nachricht rein die nicht rein sollte. DANKE!
  • Automatisch States anlegen ioBroker out?

    node-red
    13
    2
    0 Votes
    13 Posts
    869 Views
    Werde45W
    @mickym Guten morgen, leider viel Neuschnee in Oberbayern - daher keine Solarleitung aber Zeit... Ich habe die Wandlung nun in eine Funktion geschrieben und es klappt. Und alles im Parser steuerbar. [image: 1674294262193-dec905dd-1048-4ee5-82b3-72ac1e76df2e-image.png] msg.ack = true; msg.Name = msg.topic; msg.topic = "0_userdata.0.Akku." + msg.topic; // Hex in Dezimal wandeln msg.payload = parseInt(msg.payload, 16); return msg; Danke. Ich wünsche ein schönes Wochenende.
  • Einfache Wenn dann Funktion, stehe auf dem Schlauch

    9
    1
    0 Votes
    9 Posts
    674 Views
    J
    @mickym Danke, ich hoffe ich habe es hinbekommen, mal sehen was passiert wenn die Sonne scheint ;)
  • Sonos Lautstärke regeln

    60
    0 Votes
    60 Posts
    4k Views
    S
    @mickym vielen Dank das passt die KNX Node sendet immer sobald man den Button benötigt :-). Jetzt geht es auch mit dem Touch Display.
  • Node-Red an Elfin EW11 Adapter - nicht Modbus

    2
    0 Votes
    2 Posts
    455 Views
    Werde45W
    @werde45 Hallo Alex - Oh das bin ich ja selber. Ich habe für dieses Problem eine Lösung. Bei Bedarf kann ich dir eine PM zum Thema senden.
  • Amis-Zähler auslesen / einbinden ?

    36
    0 Votes
    36 Posts
    7k Views
    mickymM
    Na wenn Du dir sicher bist, dass die Daten in Deinem mqtt_broker sind, musst doch nur die entsprechenden topics subscriben.
  • NSPanel Tasmota Node-Red MQTT

    node-red heating
    4
    0 Votes
    4 Posts
    523 Views
    mickymM
    @netfritz Ok - da ich mich mit dem NSPanel nicht auskenne, kann ich Dir glaub auch nicht weiterhelfen. Ich denke auch nicht dass Du so tief in der cmnd Hierarchie gehen darfst - aber egal. Ich würde aber an Deiner Stelle, das NodeRed aus dem Thread rausmachen - da es unerheblich ist, wie Du den richtigen Datenpunkt in mqtt setzt und es gibt genügend Leute, die vielleicht helfen könnten, aber sobald sie NodeRed lesen, den Thread von vorne herein ignorieren. Wenn Du weisst, welches topic Du setzen musst, kannst Du das ja mit NodeRed machen, aber das Mittel mit dem Du das Topic setzt ist hier erst mal sekundär.
  • Baluberg-Vento, Wie kann ich diesen Knoten benutzen?

    2
    1
    0 Votes
    2 Posts
    201 Views
    mickymM
    @karloslb Ich kann Dir mit der Node auch nichts sagen. In meinen Augen hast Du 2 Möglichkeiten: Du baust ganz von selbst eine low-level Kommunikation auf in dem Du direkt UDP Pakete an Dein Gerät schickst und die Pakete halt nach der verlinkten Kommunikation aufbaust: https://blaubergventilatoren.de/uploads/download/b133_4_1en_01preview.pdf Hier würde ich Dir aber in jedem Fall ein buffer Node mitverwenden. Du nutzt das JS Bibliothek, die Du verlinkt hast direkt in einer function Node: https://github.com/michaelkrog/blaubergventojs zu 1 hab ich mal einen Flow zum Ausprobieren gebastelt - keine Ahnung ob der funktioniert - hab das mal anhand des PDFs zusammengebastelt. Die dyn. Buffer-Node hat mE ein Problem, deswegen habe ich das Parsen alleine mit Javascript gemacht. [image: 1673644385284-bcddf1ff-e314-4462-a1dd-7c67541b788a-image-resized.png] Spoiler [ { "id": "b822a5c6e6e5a711", "type": "buffer-maker", "z": "385f4b8d434f6005", "name": "type, ID und Passwort", "specification": "spec", "specificationType": "ui", "items": [ { "name": "type", "type": "buffer", "length": 1, "dataType": "bin", "data": "[2]" }, { "name": "sizeID", "type": "buffer", "length": 1, "dataType": "bin", "data": "[16]" }, { "name": "ID", "type": "string", "length": 16, "dataType": "msg", "data": "ID" }, { "name": "sizePWD", "type": "byte", "length": 1, "dataType": "jsonata", "data": "$length(password)" }, { "name": "password", "type": "string", "length": -1, "dataType": "msg", "data": "password" } ], "swap1": "", "swap2": "", "swap3": "", "swap1Type": "swap", "swap2Type": "swap", "swap3Type": "swap", "msgProperty": "payload", "msgPropertyType": "str", "x": 340, "y": 80, "wires": [ [ "f8c660323b580df5" ] ] }, { "id": "929cad4e0b9a7443", "type": "inject", "z": "385f4b8d434f6005", "name": "", "props": [ { "p": "ID", "v": "", "vt": "str" }, { "p": "password", "v": "1111", "vt": "str" }, { "p": "FUNC", "v": "1", "vt": "num" }, { "p": "DATA", "v": "[1,2]", "vt": "bin" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "x": 150, "y": 80, "wires": [ [ "b822a5c6e6e5a711" ] ] }, { "id": "f8c660323b580df5", "type": "buffer-maker", "z": "385f4b8d434f6005", "name": "FUNC und DATA", "specification": "spec", "specificationType": "ui", "items": [ { "name": "header", "type": "buffer", "length": -1, "dataType": "msg", "data": "payload" }, { "name": "FUNC", "type": "byte", "length": 1, "dataType": "msg", "data": "FUNC" }, { "name": "DATA", "type": "buffer", "length": -1, "dataType": "msg", "data": "DATA" } ], "swap1": "", "swap2": "", "swap3": "", "swap1Type": "swap", "swap2Type": "swap", "swap3Type": "swap", "msgProperty": "payload", "msgPropertyType": "str", "x": 570, "y": 80, "wires": [ [ "88b327dbfb39ca80" ] ] }, { "id": "d029a20fb5676950", "type": "debug", "z": "385f4b8d434f6005", "name": "Final Packet", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 1210, "y": 120, "wires": [] }, { "id": "88b327dbfb39ca80", "type": "function", "z": "385f4b8d434f6005", "name": "Checksum", "func": "msg.checksum = 0;\nfor (var x of msg.payload.values()) {\n msg.checksum += x;\n}\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 770, "y": 80, "wires": [ [ "19c7a157927761dd" ] ] }, { "id": "19c7a157927761dd", "type": "buffer-maker", "z": "385f4b8d434f6005", "name": "Header und Checksum", "specification": "spec", "specificationType": "ui", "items": [ { "name": "header", "type": "buffer", "length": 2, "dataType": "bin", "data": "[253,253]" }, { "name": "payload", "type": "buffer", "length": -1, "dataType": "msg", "data": "payload" }, { "name": "item3", "type": "uint16le", "length": 1, "dataType": "msg", "data": "checksum" } ], "swap1": "", "swap2": "", "swap3": "", "swap1Type": "swap", "swap2Type": "swap", "swap3Type": "swap", "msgProperty": "payload", "msgPropertyType": "str", "x": 980, "y": 80, "wires": [ [ "d029a20fb5676950", "69e5f16a7ba0a2d7" ] ] }, { "id": "65b737e55abf4055", "type": "udp in", "z": "385f4b8d434f6005", "d": true, "name": "", "iface": "", "port": "4000", "ipv": "udp4", "multicast": "false", "group": "", "datatype": "buffer", "x": 160, "y": 160, "wires": [ [ "78d6d6a15e93d806" ] ] }, { "id": "69e5f16a7ba0a2d7", "type": "udp out", "z": "385f4b8d434f6005", "d": true, "name": "", "addr": "192.168.4.1", "iface": "", "port": "4000", "ipv": "udp4", "outport": "4000", "base64": false, "multicast": "false", "x": 1240, "y": 80, "wires": [] }, { "id": "8c24bc356424c638", "type": "inject", "z": "385f4b8d434f6005", "name": "incoming packet", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "[253,253,2,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,49,49,49,49,1,1,2,222,0]", "payloadType": "bin", "x": 140, "y": 200, "wires": [ [ "78d6d6a15e93d806" ] ] }, { "id": "78d6d6a15e93d806", "type": "function", "z": "385f4b8d434f6005", "name": "parse Buffer", "func": "let buffer=msg.payload;\nlet size_ID = buffer.slice(3).readInt8();\nlet size_PW = buffer.slice(4 + size_ID).readInt8();\nlet object={\n \"TYPE\": buffer.slice(2, 3).readInt8(),\n \"SIZE_ID\": size_ID,\n \"ID\": buffer.slice(4,size_ID + 4).toString(),\n \"SIZE_PW\": size_PW,\n \"PWD\": buffer.slice(4 + size_ID + 1, 4 + size_ID + 1 + size_PW).toString(),\n \"FUNC\": buffer.slice(4 + size_ID + 1 + size_PW).readInt8(),\n \"DATA\": buffer.slice(4 + size_ID + 1 + size_PW+ 1,-2),\n \"Checksum\" : buffer.slice(-2)\n}\n\nmsg.payload = object;\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 350, "y": 200, "wires": [ [ "af96eaba3270a79f" ] ] }, { "id": "af96eaba3270a79f", "type": "debug", "z": "385f4b8d434f6005", "name": "parsed Buffer", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 540, "y": 200, "wires": [] } ]
  • Alexa Sprachausgabe Temperatur und sonstiges

    13
    4
    0 Votes
    13 Posts
    999 Views
    F
    @strobel Hi, wenn du das Klingelsignal im Iobroker hast, ist das kein Problem. Über ne Iobroker In Node den Status des Klingeldatenpunkts überwachen (bei Änderung) dann über nen Switch schauen ob das Signal wahr ist, bzw. was du als Ausgabe hast, dann den passenden Text per Change Node ins payload schreiben und dann per Iobroker Out auf den Speak Command Datenpunkt des Echos geben der es sagen soll, bzw. mehrere anhängen oder ne Gruppe erstellen und den Speak Command nehmen, So ungefähr. [image: 1673368933683-speak.jpg] [ { "id": "4330db7a9b818880", "type": "ioBroker in", "z": "9e1c0edb.e6d2d", "name": "Klingelsignal", "topic": "*", "payloadType": "value", "onlyack": "", "func": "rbe", "gap": "", "fireOnStart": "false", "outFormat": "MQTT", "x": 190, "y": 1480, "wires": [ [ "d5c1511b7b623e08" ] ] }, { "id": "8610433cdd85d9b4", "type": "change", "z": "9e1c0edb.e6d2d", "name": "", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "Hallo, es ist jemand an der Haustür", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 530, "y": 1480, "wires": [ [ "62bce7f956e61d03" ] ] }, { "id": "d5c1511b7b623e08", "type": "switch", "z": "9e1c0edb.e6d2d", "name": "", "property": "payload", "propertyType": "msg", "rules": [ { "t": "true" } ], "checkall": "true", "repair": false, "outputs": 1, "x": 350, "y": 1480, "wires": [ [ "8610433cdd85d9b4" ] ] }, { "id": "62bce7f956e61d03", "type": "ioBroker out", "z": "9e1c0edb.e6d2d", "name": "speak", "topic": "", "ack": "false", "autoCreate": "false", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 710, "y": 1480, "wires": [] } ] Edit: Du solltest noch ne Nachrichtenbegrenzung mit einbauen, damit bei Sturmklingeln nicht haufenweise Nachrichten kommen. Geht mit der delay Node. [image: 1673369599959-speak2.jpg]
  • Node Red und Alex Geräte con/discon

    node-red
    7
    0 Votes
    7 Posts
    496 Views
    L
    @djmarc75 Markise und Badrollo hatte ich als light mit % angaben definiert, da vor allem die markise ja auch halb ausgefahren werden soll. Ich habe dann alles mit switch gemacht aber das Verhalten ändert sich nicht, leider. Man kann kaum was falsch konfigurieren, irgendwas stimm tmit der Alexa nicht, wobei alles andere (Hue) ja funktioniert. Update. Ich hab dann doch mal in den log geschaut und folgendes gesehen: 9 Jan 12:18:39 - [error] [alexa-home-conf:b548f69f29202ae1] Error: read ECONNRESET at TCP.onStreamRead (internal/stream_base_commons.js:209:20) was heisst das? Modell: ARMv7 Processor rev 3 (v7l) RAM: 3.7 GB Node.js: v14.20.0 NPM: v6.14.17 Datenträgergröße: 14.3 GB Freier Festplattenspeicher: 5.6 GB Betriebszeit: 01:00:16 Aktive Instanzen: 38 node Red Version 3.0.2
  • Timer / Count Down Node

    2
    3
    1 Votes
    2 Posts
    597 Views
    mickymM
    EDIT: 23.12.2022 Timer Node wurde angepasst, dass Status der Timer Node sich bei Inaktivität selbst löscht. (leerer String). Falls also jemand die Node bereits importiert hat, selektiv den Subflow ersetzen: Spoiler [ { "id": "1a0828e5a33efb1e", "type": "subflow", "name": "Timer", "info": "# Timer - Countdown\r\n\r\nDieser Subflow bzw. Timer Node triggert zu einem bestimmten Zeitpunkt in der Zukunft.\r\nWird keine payload mitgegeben, triggert die Node ein `false`, anderenfalls wird nach Ablauf des Timers die payload getriggert.\r\n\r\nDer Trigger kann jederzeit mit einer `msg.reset` deaktiviert bzw. zurückgesetzt werden. Wird ein neues timer-Objekt oder date Objekt mitgegeben, so wird dies sofort übernommen und der Timer geändert.\r\n\r\nDer Status des Timers wird im Status der Node angezeigt. Dabei wird die verbleibende Zeit entweder in Textform, wie\r\n`3 Tage 3 Stunden 23 Minuten 43 Sekunden` angegeben oder im Format `1T 10:33:45` angezeigt.\r\nLetzters Format muss über den String `00:00` in der Subflow Node im Parameter `statusFormat` angegeben werden. \r\n### Fixer Timer\r\nDer Timer kann über ein festes Timer-Objekt definiert werden, der zum Zeitpunkt des Triggerns addiert wird. \r\nDas Timerobjekt muss in `msg.timer` definiert werden. \r\n\r\nDas Timerobjekt kann in verschiedenen Zeiteinheiten angegeben werden. \r\n\r\nWill man den Status im Dashboard ausgeben, dann kann man den `status.text` mit Hilfe der Status Node ausgeben.\r\n\r\n`{\r\n \"days\": 1,\r\n \"hours\": 0,\r\n \"minutes\": 1,\r\n \"seconds\": 28\r\n}`\r\n\r\nEs können auch nur einzelne Zeiteinheiten oder eine Mix angegeben werden:\r\n\r\n`{\r\n \"seconds\": 300\r\n}` oder\r\n`{\"minutes\":1,\"seconds\":90}`\r\n\r\n### Fixes Datum\r\nAlternativ zu einem fixen Timerobjekt, kann man auch ein festes Datum in Form eines **moments-Objektes** in der Eigenschaft `msg.date` mitgegeben werden.\r\nFür das lokale Datum bzw. das moments-Objekt muss bei Verwendung der Date/Time Picker des Dashboard utc.(false) mitgegeben werden. ", "category": "function", "in": [ { "x": 60, "y": 160, "wires": [ { "id": "b1979240dabd466b" } ] } ], "out": [ { "x": 1820, "y": 500, "wires": [ { "id": "14d51e8305f08b8d", "port": 0 }, { "id": "daa3497dedc3cdcb", "port": 0 } ] } ], "env": [ { "name": "statusFormat", "type": "str", "value": "00:00" } ], "meta": {}, "color": "#E6E0F8", "icon": "node-red/timer.svg", "status": { "x": 2200, "y": 160, "wires": [ { "id": "deba8660ab037921", "port": 0 } ] } }, { "id": "f6ddd0c99d7a2d0a", "type": "change", "z": "1a0828e5a33efb1e", "name": "Timer läuft ab", "rules": [ { "t": "set", "p": "sendPayload", "pt": "flow", "to": "payload", "tot": "msg" }, { "t": "set", "p": "payload", "pt": "msg", "to": "(\t $x := timer;\t $moment().add($x).format('DD.MM.YYYY HH:mm:ss');\t )", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 360, "y": 280, "wires": [ [ "293b1b773746de7a" ] ], "info": "akzeptiert Datumsformate ('DD.MM.YYYY HH:mm:ss') oder timestamps('x')" }, { "id": "72b3736e35deef67", "type": "trigger", "z": "1a0828e5a33efb1e", "name": "", "op1": "", "op2": "0", "op1type": "pay", "op2type": "str", "duration": "-1", "extend": false, "overrideDelay": false, "units": "s", "reset": "", "bytopic": "all", "topic": "topic", "outputs": 1, "x": 960, "y": 300, "wires": [ [ "b2fea3559b865565", "2d9471332357663a", "7d388c1e34c06775" ] ] }, { "id": "752809bd450b7149", "type": "comment", "z": "1a0828e5a33efb1e", "name": "Timer ausgabe", "info": "", "x": 140, "y": 60, "wires": [] }, { "id": "2d9471332357663a", "type": "switch", "z": "1a0828e5a33efb1e", "name": "Timer abgelaufen?", "property": "$moment(payload,['DD.MM.YYYY HH:mm:ss','x'],'de').isSameOrAfter($moment())", "propertyType": "jsonata", "rules": [ { "t": "false" } ], "checkall": "true", "repair": false, "outputs": 1, "x": 1230, "y": 420, "wires": [ [ "d65b789c451c2d37", "81a2e13297cc62c4" ] ] }, { "id": "d65b789c451c2d37", "type": "change", "z": "1a0828e5a33efb1e", "name": "Timer abgelaufen, dann reset", "rules": [ { "t": "set", "p": "reset", "pt": "msg", "to": "true", "tot": "bool" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 940, "y": 360, "wires": [ [ "72b3736e35deef67" ] ] }, { "id": "b2fea3559b865565", "type": "change", "z": "1a0828e5a33efb1e", "name": "timeA = payload; timeB =payload +x; diff timeB-timeA", "rules": [ { "t": "set", "p": "timeA", "pt": "msg", "to": "$moment().format('DD.MM.YYYY HH:mm:ss')", "tot": "jsonata" }, { "t": "set", "p": "timeB", "pt": "msg", "to": "$moment(payload,['DD.MM.YYYY HH:mm:ss','x'],'de').format('DD.MM.YYYY HH:mm:ss')", "tot": "jsonata" }, { "t": "set", "p": "payload", "pt": "msg", "to": "(\t $b := $moment(timeB,['DD.MM.YYYY HH:mm:ss','x'],'de');\t $a := $moment(timeA,['DD.MM.YYYY HH:mm:ss','x'],'de');\t \t /* $b.diff($a) */\t /* $moment.duration($b.diff($a)); */\t \t /* Kein Zugriff auf duration - also manuell berechnen*/\t \t $days := $b.diff($a, 'days');\t $hours := $b.diff($a, 'hours') - 24 * $b.diff($a, 'days');\t $minutes := $b.diff($a, 'minutes') - 60 * $b.diff($a, 'hours');\t $seconds := $b.diff($a, 'seconds') - 60 * $b.diff($a, 'minutes');\t \t $sec := $b.diff($a)/1000;\t \t\t \t $difference := {\t \"days\": $days,\t \"hours\":$hours,\t \"minutes\": $minutes,\t \"seconds\": $seconds\t }; \t \t\t)", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1340, "y": 260, "wires": [ [ "37327f7c4b6b9696" ] ], "info": "akzeptiert Datumsformate ('DD.MM.YYYY HH:mm:ss') oder timestamps('x')" }, { "id": "cb6b403b7eb1629e", "type": "change", "z": "1a0828e5a33efb1e", "name": "Ausgabe Timer", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "(\t $str := payload.days > 0 ? payload.days & (\t payload.days = 1 ? ' Tag ' : ' Tage ' \t ) : '';\t $str := payload.hours > 0 ? $str & payload.hours & (\t payload.hours = 1 ? ' Stunde ' : ' Stunden ' \t ) : $str & '';\t $str := payload.minutes > 0 ? $str & payload.minutes & (\t payload.minutes = 1 ? ' Minute ' : ' Minuten '\t ) : $str & '';\t $str := payload.seconds > 0 ? $str & payload.seconds & (\t payload.seconds = 1 ? ' Sekunde' : ' Sekunden'\t ) : $str & '';\t $str := (\t $str = '' or str = '-1 Sekunden'\t ) ? '---' : $str;\t $trim($str); \t)", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1920, "y": 320, "wires": [ [ "cf8e255e584ad4cb" ] ] }, { "id": "b1979240dabd466b", "type": "switch", "z": "1a0828e5a33efb1e", "name": "reset?", "property": "reset", "propertyType": "msg", "rules": [ { "t": "nnull" }, { "t": "else" } ], "checkall": "true", "repair": false, "outputs": 2, "x": 210, "y": 160, "wires": [ [ "48535d94822d97bc" ], [ "2491960236814d2b" ] ] }, { "id": "50d3265633dcd9ab", "type": "change", "z": "1a0828e5a33efb1e", "name": "", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1650, "y": 160, "wires": [ [ "deba8660ab037921" ] ] }, { "id": "81a2e13297cc62c4", "type": "change", "z": "1a0828e5a33efb1e", "name": "Timer beendet", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "sendPayload", "tot": "flow" }, { "t": "set", "p": "payload", "pt": "msg", "to": "payload ? payload : false", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1460, "y": 420, "wires": [ [ "14d51e8305f08b8d" ] ] }, { "id": "14d51e8305f08b8d", "type": "trigger", "z": "1a0828e5a33efb1e", "name": "", "op1": "", "op2": "", "op1type": "pay", "op2type": "nul", "duration": "250", "extend": true, "overrideDelay": false, "units": "ms", "reset": "", "bytopic": "all", "topic": "topic", "outputs": 1, "x": 1660, "y": 420, "wires": [ [] ] }, { "id": "37327f7c4b6b9696", "type": "switch", "z": "1a0828e5a33efb1e", "name": "statusFormat ?", "property": "statusFormat", "propertyType": "env", "rules": [ { "t": "eq", "v": "00:00", "vt": "str" }, { "t": "else" } ], "checkall": "true", "repair": false, "outputs": 2, "x": 1660, "y": 260, "wires": [ [ "eba09829a40c8e27" ], [ "cb6b403b7eb1629e" ] ] }, { "id": "eba09829a40c8e27", "type": "change", "z": "1a0828e5a33efb1e", "name": "Ausgabe Timer 00:00", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "(\t $str := payload.days > 0 ? $formatNumber(payload.days,'0T ') : '';\t $str := (payload.hours > 0 or $str != '') ? $str & $formatNumber(payload.hours,'00:') : $str & '';\t $str := $str & $formatNumber(payload.minutes, '00:');\t $str := $str & $formatNumber(payload.seconds, '00');\t $str := (\t $str = '00:00' or str = '-00:01'\t ) ? '00:00' : $str;\t $trim($str); \t)", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1900, "y": 240, "wires": [ [ "cf8e255e584ad4cb" ] ] }, { "id": "2491960236814d2b", "type": "switch", "z": "1a0828e5a33efb1e", "name": "timer?", "property": "timer", "propertyType": "msg", "rules": [ { "t": "nnull" }, { "t": "else" } ], "checkall": "true", "repair": false, "outputs": 2, "x": 170, "y": 340, "wires": [ [ "f6ddd0c99d7a2d0a" ], [ "e0d6c39117aea993" ] ] }, { "id": "e0d6c39117aea993", "type": "change", "z": "1a0828e5a33efb1e", "name": "Timer nach date läuft ab", "rules": [ { "t": "set", "p": "sendPayload", "pt": "flow", "to": "payload", "tot": "msg" }, { "t": "set", "p": "payload", "pt": "msg", "to": "$moment(date).format('DD.MM.YYYY HH:mm:ss')", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 390, "y": 480, "wires": [ [ "7ac035d9c2a79014" ] ], "info": "akzeptiert Datumsformate ('DD.MM.YYYY HH:mm:ss') oder timestamps('x')" }, { "id": "7ac035d9c2a79014", "type": "switch", "z": "1a0828e5a33efb1e", "name": "", "property": "$moment(payload,['DD.MM.YYYY HH:mm:ss','x'],'de').isSameOrAfter($moment())", "propertyType": "jsonata", "rules": [ { "t": "true" }, { "t": "false" } ], "checkall": "true", "repair": false, "outputs": 2, "x": 610, "y": 480, "wires": [ [ "293b1b773746de7a" ], [ "daa3497dedc3cdcb" ] ] }, { "id": "daa3497dedc3cdcb", "type": "change", "z": "1a0828e5a33efb1e", "name": "", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "Datum liegt in der Vergangenheit", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1230, "y": 500, "wires": [ [] ] }, { "id": "7d388c1e34c06775", "type": "trigger", "z": "1a0828e5a33efb1e", "name": "", "op1": "", "op2": "false", "op1type": "nul", "op2type": "bool", "duration": "15", "extend": true, "overrideDelay": false, "units": "s", "reset": "", "bytopic": "all", "topic": "topic", "outputs": 1, "x": 1210, "y": 200, "wires": [ [ "50d3265633dcd9ab" ] ] }, { "id": "48535d94822d97bc", "type": "junction", "z": "1a0828e5a33efb1e", "x": 660, "y": 160, "wires": [ [ "72b3736e35deef67", "50d3265633dcd9ab" ] ] }, { "id": "deba8660ab037921", "type": "junction", "z": "1a0828e5a33efb1e", "x": 2100, "y": 160, "wires": [ [] ] }, { "id": "cf8e255e584ad4cb", "type": "junction", "z": "1a0828e5a33efb1e", "x": 2040, "y": 280, "wires": [ [ "deba8660ab037921" ] ] }, { "id": "293b1b773746de7a", "type": "junction", "z": "1a0828e5a33efb1e", "x": 720, "y": 300, "wires": [ [ "72b3736e35deef67" ] ] }, { "id": "11330a0ee14c2250", "type": "subflow:1a0828e5a33efb1e", "z": "582b1bd74b95c464", "name": "", "x": 730, "y": 1380, "wires": [ [ "cf01b9c525446091" ] ] } ]
  • Node-Red-Contrib-Unifi Special Commands

    17
    0 Votes
    17 Posts
    2k Views
    P
    @mickym danke dir für dein Feedback. Das Problem mit dem Abfragen ist mir bewusst. Hintergrund ist, dass mach das Blocken von einem Endgerät auch über die GUI von Unifi machen kann. Sollte es dort erfolgen bekommt es der Status nicht mit und die Anzeige ist falsch. Ich suche mal weiter nach einer Lösung und danke dir für deine Hilfe. Gruß Andreas
  • Inject Node ausführen per Http in

    3
    0 Votes
    3 Posts
    282 Views
    M
    @mickym das hat so geklappt, vielen Dank dafür
  • Objektdaten beschreiben

    7
    1
    0 Votes
    7 Posts
    593 Views
    Bernd1967B
    @mickym sagte in Objektdaten beschreiben: @bernd1967 definiere vorher die payload als leeres Objekt dann geht das. Allerdings machst du dir dann das Objekt kaputt. Also vorher mit einer get Node einlesen und dann das ganze Objekt schreiben und IOB-Objekte kannst du GAR NICHT beschreiben nur states. Das ist auch so gewollt, das darf nur der Adapter. Vielleicht gibts ja irgendein SendTo Befehl für den Adapter Okay, dann geht es leider nicht, Danke.
  • TR064 - PROBLEME

    24
    0 Votes
    24 Posts
    5k Views
    spicerS
    @spicer besser? Bin als Linuxer halt Handarbeit gewohnt ;)
  • nodeRED KNX Kopplung "On duty"

    node-red
    1
    1
    0 Votes
    1 Posts
    167 Views
    No one has replied

740

Online

32.6k

Users

82.2k

Topics

1.3m

Posts