Weiter zum Inhalt

Skripten / Logik

16.7k Themen 216.0k Beiträge

Hilfe zu JavaScript, Blockly, TypeScript, Node-RED, Scenes und text2command

NEWS

Unterkategorien


  • Hilfe für Skripterstellung mit JavaScript

    3k 50k
    3k Themen
    50k Beiträge
    MartinPM
    Hmm, dass ein Akku altert, wenn man ihn Lädt/Entlädt ist allgemein bekannt, aber dass Lastschwankungen ihn schneller altern lassen habe ich noch nie gehört. Hast Du dafür eine Quelle?
  • Hilfe für Skripterstellung mit Blockly

    7k 80k
    7k Themen
    80k Beiträge
    D
    @bullemausberlin ich denke Du hast alles richtig eingebaut. Es liegt vermutlich daran dass Dein Gerät im Json einen anderen Aufbau hat und daher die Reihenfolge der Values angepasst werden muss. Das war es z.B. bei mir. Mit diesen Anpassungen hat es dann funktioniert. Damit du es testen kannst musst du einen wert im Json ändern damit das Skript überhaupt wieder läuft [image: 1786786935571-c72ebed5-1fa5-429c-8268-7634d479d031-image.jpeg] Du siehst in meinem Fall war es 3.value und 3.target für die Temperatur und 2.value für superfrost. Sonst schick doch mal ein Bild von Deinem Json dann kann man das genau sagen.
  • Hilfe für Skripterstellung mit Node-RED

    964 13k
    964 Themen
    13k Beiträge
    A
    @peterfido Hier ist der ganze Flow, den ich unterdessen zusammen habe: [ { "id": "26771494c726dd85", "type": "tab", "label": "Pytes", "disabled": false, "info": "", "env": [] }, { "id": "09a7088a7c52e930", "type": "inject", "z": "26771494c726dd85", "name": "Start Impuls", "props": [ { "p": "payload" } ], "repeat": "900", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "bat", "payloadType": "str", "x": 130, "y": 60, "wires": [ [ "f6f7978549817c9b", "dd20c6bfc8c1643a", "aae8b0af1ff64ae1", "6df4f9bd092fdcd3", "d81970d6d1e4cca6", "c8cc5a91dbf6eb1a", "09faeaa564e7d7ea", "027109f5112c3c3e" ] ] }, { "id": "f6f7978549817c9b", "type": "trigger", "z": "26771494c726dd85", "name": "bat 1", "op1": "bat 1", "op2": "", "op1type": "str", "op2type": "nul", "duration": "250", "extend": false, "overrideDelay": false, "units": "ms", "reset": "", "bytopic": "all", "topic": "topic", "outputs": 1, "x": 690, "y": 60, "wires": [ [ "f1e94e531bb2b4f9" ] ] }, { "id": "f1e94e531bb2b4f9", "type": "serial request", "z": "26771494c726dd85", "name": "BMSMaster", "serial": "d031dd424e7b1ff2", "x": 890, "y": 60, "wires": [ [ "79724f85531596e4", "4b31f05c7b6c5425" ] ] }, { "id": "79724f85531596e4", "type": "function", "z": "26771494c726dd85", "name": "convert to msgs", "func": "const text = msg.payload;\n\nif (typeof text !== \"string\") {\n node.error(\"msg.payload ist kein String\", msg);\n return null;\n}\n\n// In einzelne Zeilen zerlegen\nconst lines = text\n .split(/\\r?\\n/)\n .map(line => line.trim())\n .filter(line => line !== \"\");\n\n// Nur Zeilen berücksichtigen, die mit einer Batterienummer beginnen\nconst dataLines = lines.filter(line => /^\\d+\\s/.test(line));\n\nconst messages = [];\n\nfor (const line of dataLines) {\n\n // Spalten sind durch mindestens 2 Leerzeichen getrennt\n const columns = line.split(/\\s{2,}/);\n\n if (columns.length < 9) {\n node.warn(\"Zeile konnte nicht verarbeitet werden: \" + line);\n continue;\n }\n\n const battery = {\n battery: Number(columns[0]),\n volt: Number(columns[1]),\n tempr: Number(columns[2]),\n baseState: columns[3],\n voltState: columns[4],\n currState: columns[5],\n tempState: columns[6],\n coulomb: Number(columns[7].replace(\"%\", \"\")),\n capacity: Number(columns[8].replace(/[^\\d]/g, \"\"))\n };\n\n messages.push({\n ...msg,\n payload: battery\n });\n}\n\n// Alle Nachrichten nacheinander über denselben Ausgang senden\nreturn [messages];", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1080, "y": 60, "wires": [ [ "4a8dcae7d0f7d8a8" ] ] }, { "id": "68c635b31d513d6d", "type": "debug", "z": "26771494c726dd85", "name": "debug 4", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 1440, "y": 120, "wires": [] }, { "id": "6a16c00e7b0e2997", "type": "ioBroker out", "z": "26771494c726dd85", "name": "", "topic": "", "ack": "true", "autoCreate": "true", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 1460, "y": 60, "wires": [] }, { "id": "4a8dcae7d0f7d8a8", "type": "function", "z": "26771494c726dd85", "name": "function 2", "func": "const battery = msg.payload;\n\nif (!battery || battery.battery === undefined) {\n node.error(\"Ungültiges Battery-Objekt\", msg);\n return null;\n}\n\nconst batteryId = battery.battery;\n\nconst states = [\n {\n id: \"voltage\",\n value: battery.volt,\n name: \"Voltage\",\n role: \"value.voltage\",\n type: \"number\",\n readonly: true,\n unit: \"mV\",\n min: 0\n },\n {\n id: \"temperature\",\n value: battery.tempr / 1000,\n name: \"Temperature\",\n role: \"value.temperature\",\n type: \"number\",\n readonly: true,\n unit: \"°C\"\n },\n {\n id: \"baseState\",\n value: battery.baseState,\n name: \"Base State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"voltageState\",\n value: battery.voltState,\n name: \"Voltage State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"currentState\",\n value: battery.currState,\n name: \"Current State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"temperatureState\",\n value: battery.tempState,\n name: \"Temperature State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"charge\",\n value: battery.coulomb,\n name: \"Charge\",\n role: \"value.battery\",\n type: \"number\",\n readonly: true,\n unit: \"%\",\n min: 0,\n max: 100\n },\n {\n id: \"capacity\",\n value: battery.capacity,\n name: \"Capacity\",\n role: \"value\",\n type: \"number\",\n readonly: true,\n unit: \"mAh\",\n min: 0\n }\n];\n\nconst messages = [];\n\nfor (const state of states) {\n const out = {\n topic: `0_userdata.0.pytes.01.${batteryId}.${state.id}`,\n payload: state.value,\n\n stateName: state.name,\n stateRole: state.role,\n stateType: state.type,\n stateReadonly: state.readonly\n };\n\n if (state.unit !== undefined) {\n out.stateUnit = state.unit;\n }\n\n if (state.min !== undefined) {\n out.stateMin = state.min;\n }\n\n if (state.max !== undefined) {\n out.stateMax = state.max;\n }\n\n messages.push(out);\n}\n\nreturn [messages];", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1260, "y": 60, "wires": [ [ "6a16c00e7b0e2997", "68c635b31d513d6d" ] ] }, { "id": "dd20c6bfc8c1643a", "type": "delay", "z": "26771494c726dd85", "name": "", "pauseType": "delay", "timeout": "1", "timeoutUnits": "minutes", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 520, "y": 200, "wires": [ [ "0dc431cc8e3444fa" ] ] }, { "id": "3cce03774442db86", "type": "debug", "z": "26771494c726dd85", "name": "debug 2", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 1440, "y": 260, "wires": [] }, { "id": "0dc431cc8e3444fa", "type": "trigger", "z": "26771494c726dd85", "name": "bat 2", "op1": "bat 2", "op2": "", "op1type": "str", "op2type": "nul", "duration": "250", "extend": false, "overrideDelay": false, "units": "ms", "reset": "", "bytopic": "all", "topic": "topic", "outputs": 1, "x": 730, "y": 200, "wires": [ [ "72209bb281ee39b7" ] ] }, { "id": "72209bb281ee39b7", "type": "serial request", "z": "26771494c726dd85", "name": "BMSMaster", "serial": "d031dd424e7b1ff2", "x": 890, "y": 200, "wires": [ [ "9441d38d2c549fb8" ] ] }, { "id": "9441d38d2c549fb8", "type": "function", "z": "26771494c726dd85", "name": "convert to msgs", "func": "const text = msg.payload;\n\nif (typeof text !== \"string\") {\n node.error(\"msg.payload ist kein String\", msg);\n return null;\n}\n\n// In einzelne Zeilen zerlegen\nconst lines = text\n .split(/\\r?\\n/)\n .map(line => line.trim())\n .filter(line => line !== \"\");\n\n// Nur Zeilen berücksichtigen, die mit einer Batterienummer beginnen\nconst dataLines = lines.filter(line => /^\\d+\\s/.test(line));\n\nconst messages = [];\n\nfor (const line of dataLines) {\n\n // Spalten sind durch mindestens 2 Leerzeichen getrennt\n const columns = line.split(/\\s{2,}/);\n\n if (columns.length < 9) {\n node.warn(\"Zeile konnte nicht verarbeitet werden: \" + line);\n continue;\n }\n\n const battery = {\n battery: Number(columns[0]),\n volt: Number(columns[1]),\n tempr: Number(columns[2]),\n baseState: columns[3],\n voltState: columns[4],\n currState: columns[5],\n tempState: columns[6],\n coulomb: Number(columns[7].replace(\"%\", \"\")),\n capacity: Number(columns[8].replace(/[^\\d]/g, \"\"))\n };\n\n messages.push({\n ...msg,\n payload: battery\n });\n}\n\n// Alle Nachrichten nacheinander über denselben Ausgang senden\nreturn [messages];", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1080, "y": 200, "wires": [ [ "c7f18bb5735b986f" ] ] }, { "id": "5f5f0afbf22fe52b", "type": "ioBroker out", "z": "26771494c726dd85", "name": "", "topic": "", "ack": "true", "autoCreate": "true", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 1460, "y": 200, "wires": [] }, { "id": "c7f18bb5735b986f", "type": "function", "z": "26771494c726dd85", "name": "function 3", "func": "const battery = msg.payload;\n\nif (!battery || battery.battery === undefined) {\n node.error(\"Ungültiges Battery-Objekt\", msg);\n return null;\n}\n\nconst batteryId = battery.battery;\n\nconst states = [\n {\n id: \"voltage\",\n value: battery.volt,\n name: \"Voltage\",\n role: \"value.voltage\",\n type: \"number\",\n readonly: true,\n unit: \"mV\",\n min: 0\n },\n {\n id: \"temperature\",\n value: battery.tempr / 1000,\n name: \"Temperature\",\n role: \"value.temperature\",\n type: \"number\",\n readonly: true,\n unit: \"°C\"\n },\n {\n id: \"baseState\",\n value: battery.baseState,\n name: \"Base State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"voltageState\",\n value: battery.voltState,\n name: \"Voltage State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"currentState\",\n value: battery.currState,\n name: \"Current State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"temperatureState\",\n value: battery.tempState,\n name: \"Temperature State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"charge\",\n value: battery.coulomb,\n name: \"Charge\",\n role: \"value.battery\",\n type: \"number\",\n readonly: true,\n unit: \"%\",\n min: 0,\n max: 100\n },\n {\n id: \"capacity\",\n value: battery.capacity,\n name: \"Capacity\",\n role: \"value\",\n type: \"number\",\n readonly: true,\n unit: \"mAh\",\n min: 0\n }\n];\n\nconst messages = [];\n\nfor (const state of states) {\n const out = {\n topic: `0_userdata.0.pytes.02.${batteryId}.${state.id}`,\n payload: state.value,\n\n stateName: state.name,\n stateRole: state.role,\n stateType: state.type,\n stateReadonly: state.readonly\n };\n\n if (state.unit !== undefined) {\n out.stateUnit = state.unit;\n }\n\n if (state.min !== undefined) {\n out.stateMin = state.min;\n }\n\n if (state.max !== undefined) {\n out.stateMax = state.max;\n }\n\n messages.push(out);\n}\n\nreturn [messages];", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1260, "y": 200, "wires": [ [ "5f5f0afbf22fe52b", "3cce03774442db86" ] ] }, { "id": "aae8b0af1ff64ae1", "type": "delay", "z": "26771494c726dd85", "name": "", "pauseType": "delay", "timeout": "2", "timeoutUnits": "minutes", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 520, "y": 340, "wires": [ [ "085f008ec32136f1" ] ] }, { "id": "acfcfbc9dab48c55", "type": "debug", "z": "26771494c726dd85", "name": "debug 5", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 1440, "y": 400, "wires": [] }, { "id": "085f008ec32136f1", "type": "trigger", "z": "26771494c726dd85", "name": "bat 3", "op1": "bat 3", "op2": "", "op1type": "str", "op2type": "nul", "duration": "250", "extend": false, "overrideDelay": false, "units": "ms", "reset": "", "bytopic": "all", "topic": "topic", "outputs": 1, "x": 730, "y": 340, "wires": [ [ "7134518ae47c75db" ] ] }, { "id": "7134518ae47c75db", "type": "serial request", "z": "26771494c726dd85", "name": "BMSMaster", "serial": "d031dd424e7b1ff2", "x": 890, "y": 340, "wires": [ [ "2819be0b93263306" ] ] }, { "id": "2819be0b93263306", "type": "function", "z": "26771494c726dd85", "name": "convert to msgs", "func": "const text = msg.payload;\n\nif (typeof text !== \"string\") {\n node.error(\"msg.payload ist kein String\", msg);\n return null;\n}\n\n// In einzelne Zeilen zerlegen\nconst lines = text\n .split(/\\r?\\n/)\n .map(line => line.trim())\n .filter(line => line !== \"\");\n\n// Nur Zeilen berücksichtigen, die mit einer Batterienummer beginnen\nconst dataLines = lines.filter(line => /^\\d+\\s/.test(line));\n\nconst messages = [];\n\nfor (const line of dataLines) {\n\n // Spalten sind durch mindestens 2 Leerzeichen getrennt\n const columns = line.split(/\\s{2,}/);\n\n if (columns.length < 9) {\n node.warn(\"Zeile konnte nicht verarbeitet werden: \" + line);\n continue;\n }\n\n const battery = {\n battery: Number(columns[0]),\n volt: Number(columns[1]),\n tempr: Number(columns[2]),\n baseState: columns[3],\n voltState: columns[4],\n currState: columns[5],\n tempState: columns[6],\n coulomb: Number(columns[7].replace(\"%\", \"\")),\n capacity: Number(columns[8].replace(/[^\\d]/g, \"\"))\n };\n\n messages.push({\n ...msg,\n payload: battery\n });\n}\n\n// Alle Nachrichten nacheinander über denselben Ausgang senden\nreturn [messages];", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1080, "y": 340, "wires": [ [ "ca02643445158e40" ] ] }, { "id": "ea0794a8642caf84", "type": "ioBroker out", "z": "26771494c726dd85", "name": "", "topic": "", "ack": "true", "autoCreate": "true", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 1460, "y": 340, "wires": [] }, { "id": "ca02643445158e40", "type": "function", "z": "26771494c726dd85", "name": "function 4", "func": "const battery = msg.payload;\n\nif (!battery || battery.battery === undefined) {\n node.error(\"Ungültiges Battery-Objekt\", msg);\n return null;\n}\n\nconst batteryId = battery.battery;\n\nconst states = [\n {\n id: \"voltage\",\n value: battery.volt,\n name: \"Voltage\",\n role: \"value.voltage\",\n type: \"number\",\n readonly: true,\n unit: \"mV\",\n min: 0\n },\n {\n id: \"temperature\",\n value: battery.tempr / 1000,\n name: \"Temperature\",\n role: \"value.temperature\",\n type: \"number\",\n readonly: true,\n unit: \"°C\"\n },\n {\n id: \"baseState\",\n value: battery.baseState,\n name: \"Base State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"voltageState\",\n value: battery.voltState,\n name: \"Voltage State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"currentState\",\n value: battery.currState,\n name: \"Current State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"temperatureState\",\n value: battery.tempState,\n name: \"Temperature State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"charge\",\n value: battery.coulomb,\n name: \"Charge\",\n role: \"value.battery\",\n type: \"number\",\n readonly: true,\n unit: \"%\",\n min: 0,\n max: 100\n },\n {\n id: \"capacity\",\n value: battery.capacity,\n name: \"Capacity\",\n role: \"value\",\n type: \"number\",\n readonly: true,\n unit: \"mAh\",\n min: 0\n }\n];\n\nconst messages = [];\n\nfor (const state of states) {\n const out = {\n topic: `0_userdata.0.pytes.03.${batteryId}.${state.id}`,\n payload: state.value,\n\n stateName: state.name,\n stateRole: state.role,\n stateType: state.type,\n stateReadonly: state.readonly\n };\n\n if (state.unit !== undefined) {\n out.stateUnit = state.unit;\n }\n\n if (state.min !== undefined) {\n out.stateMin = state.min;\n }\n\n if (state.max !== undefined) {\n out.stateMax = state.max;\n }\n\n messages.push(out);\n}\n\nreturn [messages];", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1260, "y": 340, "wires": [ [ "ea0794a8642caf84", "acfcfbc9dab48c55" ] ] }, { "id": "6df4f9bd092fdcd3", "type": "delay", "z": "26771494c726dd85", "name": "", "pauseType": "delay", "timeout": "3", "timeoutUnits": "minutes", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 520, "y": 480, "wires": [ [ "a832dedddd9504c7" ] ] }, { "id": "b7c07a571002ad06", "type": "debug", "z": "26771494c726dd85", "name": "debug 6", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 1440, "y": 540, "wires": [] }, { "id": "a832dedddd9504c7", "type": "trigger", "z": "26771494c726dd85", "name": "bat 4", "op1": "bat 4", "op2": "", "op1type": "str", "op2type": "nul", "duration": "250", "extend": false, "overrideDelay": false, "units": "ms", "reset": "", "bytopic": "all", "topic": "topic", "outputs": 1, "x": 730, "y": 480, "wires": [ [ "b82258c553850a68" ] ] }, { "id": "b82258c553850a68", "type": "serial request", "z": "26771494c726dd85", "name": "BMSMaster", "serial": "d031dd424e7b1ff2", "x": 890, "y": 480, "wires": [ [ "4387216c1822cbcf" ] ] }, { "id": "4387216c1822cbcf", "type": "function", "z": "26771494c726dd85", "name": "convert to msgs", "func": "const text = msg.payload;\n\nif (typeof text !== \"string\") {\n node.error(\"msg.payload ist kein String\", msg);\n return null;\n}\n\n// In einzelne Zeilen zerlegen\nconst lines = text\n .split(/\\r?\\n/)\n .map(line => line.trim())\n .filter(line => line !== \"\");\n\n// Nur Zeilen berücksichtigen, die mit einer Batterienummer beginnen\nconst dataLines = lines.filter(line => /^\\d+\\s/.test(line));\n\nconst messages = [];\n\nfor (const line of dataLines) {\n\n // Spalten sind durch mindestens 2 Leerzeichen getrennt\n const columns = line.split(/\\s{2,}/);\n\n if (columns.length < 9) {\n node.warn(\"Zeile konnte nicht verarbeitet werden: \" + line);\n continue;\n }\n\n const battery = {\n battery: Number(columns[0]),\n volt: Number(columns[1]),\n tempr: Number(columns[2]),\n baseState: columns[3],\n voltState: columns[4],\n currState: columns[5],\n tempState: columns[6],\n coulomb: Number(columns[7].replace(\"%\", \"\")),\n capacity: Number(columns[8].replace(/[^\\d]/g, \"\"))\n };\n\n messages.push({\n ...msg,\n payload: battery\n });\n}\n\n// Alle Nachrichten nacheinander über denselben Ausgang senden\nreturn [messages];", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1080, "y": 480, "wires": [ [ "94e6b42f7309c443" ] ] }, { "id": "51c2e01cf0878450", "type": "ioBroker out", "z": "26771494c726dd85", "name": "", "topic": "", "ack": "true", "autoCreate": "true", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 1460, "y": 480, "wires": [] }, { "id": "94e6b42f7309c443", "type": "function", "z": "26771494c726dd85", "name": "function 5", "func": "const battery = msg.payload;\n\nif (!battery || battery.battery === undefined) {\n node.error(\"Ungültiges Battery-Objekt\", msg);\n return null;\n}\n\nconst batteryId = battery.battery;\n\nconst states = [\n {\n id: \"voltage\",\n value: battery.volt,\n name: \"Voltage\",\n role: \"value.voltage\",\n type: \"number\",\n readonly: true,\n unit: \"mV\",\n min: 0\n },\n {\n id: \"temperature\",\n value: battery.tempr / 1000,\n name: \"Temperature\",\n role: \"value.temperature\",\n type: \"number\",\n readonly: true,\n unit: \"°C\"\n },\n {\n id: \"baseState\",\n value: battery.baseState,\n name: \"Base State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"voltageState\",\n value: battery.voltState,\n name: \"Voltage State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"currentState\",\n value: battery.currState,\n name: \"Current State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"temperatureState\",\n value: battery.tempState,\n name: \"Temperature State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"charge\",\n value: battery.coulomb,\n name: \"Charge\",\n role: \"value.battery\",\n type: \"number\",\n readonly: true,\n unit: \"%\",\n min: 0,\n max: 100\n },\n {\n id: \"capacity\",\n value: battery.capacity,\n name: \"Capacity\",\n role: \"value\",\n type: \"number\",\n readonly: true,\n unit: \"mAh\",\n min: 0\n }\n];\n\nconst messages = [];\n\nfor (const state of states) {\n const out = {\n topic: `0_userdata.0.pytes.04.${batteryId}.${state.id}`,\n payload: state.value,\n\n stateName: state.name,\n stateRole: state.role,\n stateType: state.type,\n stateReadonly: state.readonly\n };\n\n if (state.unit !== undefined) {\n out.stateUnit = state.unit;\n }\n\n if (state.min !== undefined) {\n out.stateMin = state.min;\n }\n\n if (state.max !== undefined) {\n out.stateMax = state.max;\n }\n\n messages.push(out);\n}\n\nreturn [messages];", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1260, "y": 480, "wires": [ [ "51c2e01cf0878450", "b7c07a571002ad06" ] ] }, { "id": "d81970d6d1e4cca6", "type": "delay", "z": "26771494c726dd85", "name": "", "pauseType": "delay", "timeout": "4", "timeoutUnits": "minutes", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 520, "y": 620, "wires": [ [ "f1fd5ef8888380ad" ] ] }, { "id": "fb84ec681c169cd6", "type": "debug", "z": "26771494c726dd85", "name": "debug 7", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 1440, "y": 680, "wires": [] }, { "id": "f1fd5ef8888380ad", "type": "trigger", "z": "26771494c726dd85", "name": "bat 5", "op1": "bat 5", "op2": "", "op1type": "str", "op2type": "nul", "duration": "250", "extend": false, "overrideDelay": false, "units": "ms", "reset": "", "bytopic": "all", "topic": "topic", "outputs": 1, "x": 730, "y": 620, "wires": [ [ "75f9d95891961faf" ] ] }, { "id": "75f9d95891961faf", "type": "serial request", "z": "26771494c726dd85", "name": "BMSMaster", "serial": "d031dd424e7b1ff2", "x": 890, "y": 620, "wires": [ [ "c4b473ff613b76e2" ] ] }, { "id": "c4b473ff613b76e2", "type": "function", "z": "26771494c726dd85", "name": "convert to msgs", "func": "const text = msg.payload;\n\nif (typeof text !== \"string\") {\n node.error(\"msg.payload ist kein String\", msg);\n return null;\n}\n\n// In einzelne Zeilen zerlegen\nconst lines = text\n .split(/\\r?\\n/)\n .map(line => line.trim())\n .filter(line => line !== \"\");\n\n// Nur Zeilen berücksichtigen, die mit einer Batterienummer beginnen\nconst dataLines = lines.filter(line => /^\\d+\\s/.test(line));\n\nconst messages = [];\n\nfor (const line of dataLines) {\n\n // Spalten sind durch mindestens 2 Leerzeichen getrennt\n const columns = line.split(/\\s{2,}/);\n\n if (columns.length < 9) {\n node.warn(\"Zeile konnte nicht verarbeitet werden: \" + line);\n continue;\n }\n\n const battery = {\n battery: Number(columns[0]),\n volt: Number(columns[1]),\n tempr: Number(columns[2]),\n baseState: columns[3],\n voltState: columns[4],\n currState: columns[5],\n tempState: columns[6],\n coulomb: Number(columns[7].replace(\"%\", \"\")),\n capacity: Number(columns[8].replace(/[^\\d]/g, \"\"))\n };\n\n messages.push({\n ...msg,\n payload: battery\n });\n}\n\n// Alle Nachrichten nacheinander über denselben Ausgang senden\nreturn [messages];", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1080, "y": 620, "wires": [ [ "4603fd0d509f8f04" ] ] }, { "id": "d35fbb5808f3ecae", "type": "ioBroker out", "z": "26771494c726dd85", "name": "", "topic": "", "ack": "true", "autoCreate": "true", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 1460, "y": 620, "wires": [] }, { "id": "4603fd0d509f8f04", "type": "function", "z": "26771494c726dd85", "name": "function 6", "func": "const battery = msg.payload;\n\nif (!battery || battery.battery === undefined) {\n node.error(\"Ungültiges Battery-Objekt\", msg);\n return null;\n}\n\nconst batteryId = battery.battery;\n\nconst states = [\n {\n id: \"voltage\",\n value: battery.volt,\n name: \"Voltage\",\n role: \"value.voltage\",\n type: \"number\",\n readonly: true,\n unit: \"mV\",\n min: 0\n },\n {\n id: \"temperature\",\n value: battery.tempr / 1000,\n name: \"Temperature\",\n role: \"value.temperature\",\n type: \"number\",\n readonly: true,\n unit: \"°C\"\n },\n {\n id: \"baseState\",\n value: battery.baseState,\n name: \"Base State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"voltageState\",\n value: battery.voltState,\n name: \"Voltage State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"currentState\",\n value: battery.currState,\n name: \"Current State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"temperatureState\",\n value: battery.tempState,\n name: \"Temperature State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"charge\",\n value: battery.coulomb,\n name: \"Charge\",\n role: \"value.battery\",\n type: \"number\",\n readonly: true,\n unit: \"%\",\n min: 0,\n max: 100\n },\n {\n id: \"capacity\",\n value: battery.capacity,\n name: \"Capacity\",\n role: \"value\",\n type: \"number\",\n readonly: true,\n unit: \"mAh\",\n min: 0\n }\n];\n\nconst messages = [];\n\nfor (const state of states) {\n const out = {\n topic: `0_userdata.0.pytes.05.${batteryId}.${state.id}`,\n payload: state.value,\n\n stateName: state.name,\n stateRole: state.role,\n stateType: state.type,\n stateReadonly: state.readonly\n };\n\n if (state.unit !== undefined) {\n out.stateUnit = state.unit;\n }\n\n if (state.min !== undefined) {\n out.stateMin = state.min;\n }\n\n if (state.max !== undefined) {\n out.stateMax = state.max;\n }\n\n messages.push(out);\n}\n\nreturn [messages];", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1260, "y": 620, "wires": [ [ "d35fbb5808f3ecae", "fb84ec681c169cd6" ] ] }, { "id": "c8cc5a91dbf6eb1a", "type": "delay", "z": "26771494c726dd85", "name": "", "pauseType": "delay", "timeout": "5", "timeoutUnits": "minutes", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 520, "y": 760, "wires": [ [ "188d8b0ef9b1ec1c" ] ] }, { "id": "810cc1a467a83b14", "type": "debug", "z": "26771494c726dd85", "name": "debug 8", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 1440, "y": 820, "wires": [] }, { "id": "188d8b0ef9b1ec1c", "type": "trigger", "z": "26771494c726dd85", "name": "bat 6", "op1": "bat 6", "op2": "", "op1type": "str", "op2type": "nul", "duration": "250", "extend": false, "overrideDelay": false, "units": "ms", "reset": "", "bytopic": "all", "topic": "topic", "outputs": 1, "x": 730, "y": 760, "wires": [ [ "2fd087fa4da3841b" ] ] }, { "id": "2fd087fa4da3841b", "type": "serial request", "z": "26771494c726dd85", "name": "BMSMaster", "serial": "d031dd424e7b1ff2", "x": 890, "y": 760, "wires": [ [ "59e325c588ae2c94" ] ] }, { "id": "59e325c588ae2c94", "type": "function", "z": "26771494c726dd85", "name": "convert to msgs", "func": "const text = msg.payload;\n\nif (typeof text !== \"string\") {\n node.error(\"msg.payload ist kein String\", msg);\n return null;\n}\n\n// In einzelne Zeilen zerlegen\nconst lines = text\n .split(/\\r?\\n/)\n .map(line => line.trim())\n .filter(line => line !== \"\");\n\n// Nur Zeilen berücksichtigen, die mit einer Batterienummer beginnen\nconst dataLines = lines.filter(line => /^\\d+\\s/.test(line));\n\nconst messages = [];\n\nfor (const line of dataLines) {\n\n // Spalten sind durch mindestens 2 Leerzeichen getrennt\n const columns = line.split(/\\s{2,}/);\n\n if (columns.length < 9) {\n node.warn(\"Zeile konnte nicht verarbeitet werden: \" + line);\n continue;\n }\n\n const battery = {\n battery: Number(columns[0]),\n volt: Number(columns[1]),\n tempr: Number(columns[2]),\n baseState: columns[3],\n voltState: columns[4],\n currState: columns[5],\n tempState: columns[6],\n coulomb: Number(columns[7].replace(\"%\", \"\")),\n capacity: Number(columns[8].replace(/[^\\d]/g, \"\"))\n };\n\n messages.push({\n ...msg,\n payload: battery\n });\n}\n\n// Alle Nachrichten nacheinander über denselben Ausgang senden\nreturn [messages];", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1080, "y": 760, "wires": [ [ "5d321ccd3cdb9ce7" ] ] }, { "id": "b60baba38d523d1e", "type": "ioBroker out", "z": "26771494c726dd85", "name": "", "topic": "", "ack": "true", "autoCreate": "true", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 1460, "y": 760, "wires": [] }, { "id": "5d321ccd3cdb9ce7", "type": "function", "z": "26771494c726dd85", "name": "function 7", "func": "const battery = msg.payload;\n\nif (!battery || battery.battery === undefined) {\n node.error(\"Ungültiges Battery-Objekt\", msg);\n return null;\n}\n\nconst batteryId = battery.battery;\n\nconst states = [\n {\n id: \"voltage\",\n value: battery.volt,\n name: \"Voltage\",\n role: \"value.voltage\",\n type: \"number\",\n readonly: true,\n unit: \"mV\",\n min: 0\n },\n {\n id: \"temperature\",\n value: battery.tempr / 1000,\n name: \"Temperature\",\n role: \"value.temperature\",\n type: \"number\",\n readonly: true,\n unit: \"°C\"\n },\n {\n id: \"baseState\",\n value: battery.baseState,\n name: \"Base State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"voltageState\",\n value: battery.voltState,\n name: \"Voltage State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"currentState\",\n value: battery.currState,\n name: \"Current State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"temperatureState\",\n value: battery.tempState,\n name: \"Temperature State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"charge\",\n value: battery.coulomb,\n name: \"Charge\",\n role: \"value.battery\",\n type: \"number\",\n readonly: true,\n unit: \"%\",\n min: 0,\n max: 100\n },\n {\n id: \"capacity\",\n value: battery.capacity,\n name: \"Capacity\",\n role: \"value\",\n type: \"number\",\n readonly: true,\n unit: \"mAh\",\n min: 0\n }\n];\n\nconst messages = [];\n\nfor (const state of states) {\n const out = {\n topic: `0_userdata.0.pytes.06.${batteryId}.${state.id}`,\n payload: state.value,\n\n stateName: state.name,\n stateRole: state.role,\n stateType: state.type,\n stateReadonly: state.readonly\n };\n\n if (state.unit !== undefined) {\n out.stateUnit = state.unit;\n }\n\n if (state.min !== undefined) {\n out.stateMin = state.min;\n }\n\n if (state.max !== undefined) {\n out.stateMax = state.max;\n }\n\n messages.push(out);\n}\n\nreturn [messages];", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1260, "y": 760, "wires": [ [ "b60baba38d523d1e", "810cc1a467a83b14" ] ] }, { "id": "09faeaa564e7d7ea", "type": "delay", "z": "26771494c726dd85", "name": "", "pauseType": "delay", "timeout": "6", "timeoutUnits": "minutes", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 520, "y": 900, "wires": [ [ "c0c69b8e170813f8" ] ] }, { "id": "0e613121bc95e046", "type": "debug", "z": "26771494c726dd85", "name": "debug 9", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 1440, "y": 960, "wires": [] }, { "id": "c0c69b8e170813f8", "type": "trigger", "z": "26771494c726dd85", "name": "bat 7", "op1": "bat 7", "op2": "", "op1type": "str", "op2type": "nul", "duration": "250", "extend": false, "overrideDelay": false, "units": "ms", "reset": "", "bytopic": "all", "topic": "topic", "outputs": 1, "x": 730, "y": 900, "wires": [ [ "5e45ba1558c0e2c5" ] ] }, { "id": "5e45ba1558c0e2c5", "type": "serial request", "z": "26771494c726dd85", "name": "BMSMaster", "serial": "d031dd424e7b1ff2", "x": 890, "y": 900, "wires": [ [ "56d333a3d08a8b60" ] ] }, { "id": "56d333a3d08a8b60", "type": "function", "z": "26771494c726dd85", "name": "convert to msgs", "func": "const text = msg.payload;\n\nif (typeof text !== \"string\") {\n node.error(\"msg.payload ist kein String\", msg);\n return null;\n}\n\n// In einzelne Zeilen zerlegen\nconst lines = text\n .split(/\\r?\\n/)\n .map(line => line.trim())\n .filter(line => line !== \"\");\n\n// Nur Zeilen berücksichtigen, die mit einer Batterienummer beginnen\nconst dataLines = lines.filter(line => /^\\d+\\s/.test(line));\n\nconst messages = [];\n\nfor (const line of dataLines) {\n\n // Spalten sind durch mindestens 2 Leerzeichen getrennt\n const columns = line.split(/\\s{2,}/);\n\n if (columns.length < 9) {\n node.warn(\"Zeile konnte nicht verarbeitet werden: \" + line);\n continue;\n }\n\n const battery = {\n battery: Number(columns[0]),\n volt: Number(columns[1]),\n tempr: Number(columns[2]),\n baseState: columns[3],\n voltState: columns[4],\n currState: columns[5],\n tempState: columns[6],\n coulomb: Number(columns[7].replace(\"%\", \"\")),\n capacity: Number(columns[8].replace(/[^\\d]/g, \"\"))\n };\n\n messages.push({\n ...msg,\n payload: battery\n });\n}\n\n// Alle Nachrichten nacheinander über denselben Ausgang senden\nreturn [messages];", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1080, "y": 900, "wires": [ [ "8dc1347bba1166d9" ] ] }, { "id": "a2f16c5161ec9254", "type": "ioBroker out", "z": "26771494c726dd85", "name": "", "topic": "", "ack": "true", "autoCreate": "true", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 1460, "y": 900, "wires": [] }, { "id": "8dc1347bba1166d9", "type": "function", "z": "26771494c726dd85", "name": "function 8", "func": "const battery = msg.payload;\n\nif (!battery || battery.battery === undefined) {\n node.error(\"Ungültiges Battery-Objekt\", msg);\n return null;\n}\n\nconst batteryId = battery.battery;\n\nconst states = [\n {\n id: \"voltage\",\n value: battery.volt,\n name: \"Voltage\",\n role: \"value.voltage\",\n type: \"number\",\n readonly: true,\n unit: \"mV\",\n min: 0\n },\n {\n id: \"temperature\",\n value: battery.tempr / 1000,\n name: \"Temperature\",\n role: \"value.temperature\",\n type: \"number\",\n readonly: true,\n unit: \"°C\"\n },\n {\n id: \"baseState\",\n value: battery.baseState,\n name: \"Base State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"voltageState\",\n value: battery.voltState,\n name: \"Voltage State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"currentState\",\n value: battery.currState,\n name: \"Current State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"temperatureState\",\n value: battery.tempState,\n name: \"Temperature State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"charge\",\n value: battery.coulomb,\n name: \"Charge\",\n role: \"value.battery\",\n type: \"number\",\n readonly: true,\n unit: \"%\",\n min: 0,\n max: 100\n },\n {\n id: \"capacity\",\n value: battery.capacity,\n name: \"Capacity\",\n role: \"value\",\n type: \"number\",\n readonly: true,\n unit: \"mAh\",\n min: 0\n }\n];\n\nconst messages = [];\n\nfor (const state of states) {\n const out = {\n topic: `0_userdata.0.pytes.07.${batteryId}.${state.id}`,\n payload: state.value,\n\n stateName: state.name,\n stateRole: state.role,\n stateType: state.type,\n stateReadonly: state.readonly\n };\n\n if (state.unit !== undefined) {\n out.stateUnit = state.unit;\n }\n\n if (state.min !== undefined) {\n out.stateMin = state.min;\n }\n\n if (state.max !== undefined) {\n out.stateMax = state.max;\n }\n\n messages.push(out);\n}\n\nreturn [messages];", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1260, "y": 900, "wires": [ [ "a2f16c5161ec9254", "0e613121bc95e046" ] ] }, { "id": "027109f5112c3c3e", "type": "delay", "z": "26771494c726dd85", "name": "", "pauseType": "delay", "timeout": "7", "timeoutUnits": "minutes", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 520, "y": 1040, "wires": [ [ "98d31a678f60f56d" ] ] }, { "id": "8ed399995f0adf29", "type": "debug", "z": "26771494c726dd85", "name": "debug 10", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 1440, "y": 1100, "wires": [] }, { "id": "98d31a678f60f56d", "type": "trigger", "z": "26771494c726dd85", "name": "bat 8", "op1": "bat 8", "op2": "", "op1type": "str", "op2type": "nul", "duration": "250", "extend": false, "overrideDelay": false, "units": "ms", "reset": "", "bytopic": "all", "topic": "topic", "outputs": 1, "x": 730, "y": 1040, "wires": [ [ "abed25adf4a19908" ] ] }, { "id": "abed25adf4a19908", "type": "serial request", "z": "26771494c726dd85", "name": "BMSMaster", "serial": "d031dd424e7b1ff2", "x": 890, "y": 1040, "wires": [ [ "dfa2e714a883320c" ] ] }, { "id": "dfa2e714a883320c", "type": "function", "z": "26771494c726dd85", "name": "convert to msgs", "func": "const text = msg.payload;\n\nif (typeof text !== \"string\") {\n node.error(\"msg.payload ist kein String\", msg);\n return null;\n}\n\n// In einzelne Zeilen zerlegen\nconst lines = text\n .split(/\\r?\\n/)\n .map(line => line.trim())\n .filter(line => line !== \"\");\n\n// Nur Zeilen berücksichtigen, die mit einer Batterienummer beginnen\nconst dataLines = lines.filter(line => /^\\d+\\s/.test(line));\n\nconst messages = [];\n\nfor (const line of dataLines) {\n\n // Spalten sind durch mindestens 2 Leerzeichen getrennt\n const columns = line.split(/\\s{2,}/);\n\n if (columns.length < 9) {\n node.warn(\"Zeile konnte nicht verarbeitet werden: \" + line);\n continue;\n }\n\n const battery = {\n battery: Number(columns[0]),\n volt: Number(columns[1]),\n tempr: Number(columns[2]),\n baseState: columns[3],\n voltState: columns[4],\n currState: columns[5],\n tempState: columns[6],\n coulomb: Number(columns[7].replace(\"%\", \"\")),\n capacity: Number(columns[8].replace(/[^\\d]/g, \"\"))\n };\n\n messages.push({\n ...msg,\n payload: battery\n });\n}\n\n// Alle Nachrichten nacheinander über denselben Ausgang senden\nreturn [messages];", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1080, "y": 1040, "wires": [ [ "4127ce3ea3ebf45b" ] ] }, { "id": "9d3e816f7aae72a8", "type": "ioBroker out", "z": "26771494c726dd85", "name": "", "topic": "", "ack": "true", "autoCreate": "true", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 1460, "y": 1040, "wires": [] }, { "id": "4127ce3ea3ebf45b", "type": "function", "z": "26771494c726dd85", "name": "function 9", "func": "const battery = msg.payload;\n\nif (!battery || battery.battery === undefined) {\n node.error(\"Ungültiges Battery-Objekt\", msg);\n return null;\n}\n\nconst batteryId = battery.battery;\n\nconst states = [\n {\n id: \"voltage\",\n value: battery.volt,\n name: \"Voltage\",\n role: \"value.voltage\",\n type: \"number\",\n readonly: true,\n unit: \"mV\",\n min: 0\n },\n {\n id: \"temperature\",\n value: battery.tempr / 1000,\n name: \"Temperature\",\n role: \"value.temperature\",\n type: \"number\",\n readonly: true,\n unit: \"°C\"\n },\n {\n id: \"baseState\",\n value: battery.baseState,\n name: \"Base State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"voltageState\",\n value: battery.voltState,\n name: \"Voltage State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"currentState\",\n value: battery.currState,\n name: \"Current State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"temperatureState\",\n value: battery.tempState,\n name: \"Temperature State\",\n role: \"text\",\n type: \"string\",\n readonly: true\n },\n {\n id: \"charge\",\n value: battery.coulomb,\n name: \"Charge\",\n role: \"value.battery\",\n type: \"number\",\n readonly: true,\n unit: \"%\",\n min: 0,\n max: 100\n },\n {\n id: \"capacity\",\n value: battery.capacity,\n name: \"Capacity\",\n role: \"value\",\n type: \"number\",\n readonly: true,\n unit: \"mAh\",\n min: 0\n }\n];\n\nconst messages = [];\n\nfor (const state of states) {\n const out = {\n topic: `0_userdata.0.pytes.08.${batteryId}.${state.id}`,\n payload: state.value,\n\n stateName: state.name,\n stateRole: state.role,\n stateType: state.type,\n stateReadonly: state.readonly\n };\n\n if (state.unit !== undefined) {\n out.stateUnit = state.unit;\n }\n\n if (state.min !== undefined) {\n out.stateMin = state.min;\n }\n\n if (state.max !== undefined) {\n out.stateMax = state.max;\n }\n\n messages.push(out);\n}\n\nreturn [messages];", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1260, "y": 1040, "wires": [ [ "9d3e816f7aae72a8", "8ed399995f0adf29" ] ] }, { "id": "4b31f05c7b6c5425", "type": "debug", "z": "26771494c726dd85", "name": "debug 11", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "false", "statusVal": "", "statusType": "auto", "x": 1060, "y": 120, "wires": [] }, { "id": "d031dd424e7b1ff2", "type": "serial-port", "name": "Pytes", "serialport": "/dev/serial/by-id/usb-FTDI_USB_Serial_Converter_FTFS8I5L-if00-port0", "serialbaud": "115200", "databits": 8, "parity": "none", "stopbits": 1, "waitfor": "@", "dtr": "none", "rts": "none", "cts": "none", "dsr": "none", "newline": "250", "bin": "false", "out": "time", "addchar": "\\r\\n", "responsetimeout": "250" }, { "id": "655fb8e61b544b29", "type": "global-config", "env": [], "modules": { "node-red-node-serialport": "2.0.3" } } ] Es ist äusserst interessant, ich habe heute mal die Schnittstellen durchreichung in den Iobroker Proxmox LXC neu, mit den offiziellen Proxmox Werkzeugen neu gemacht. Dabei ist mir aufgefallen, das der Flow mehrere male sauber läuft, plötzlich kommt die Meldung: node-red.0 2026-08-15 16:54:00.757 error Node-RED: 15 Aug 16:54:00 - [error] [function:convert to msgs] msg.payload ist kein String und auch im Flow wird dann beim entsprechenden Node aus einem "verbunden" ein "Timeout". Nach einem deaktivieren des ganzen Flow und deploy und anschliessendem aktivieren und deploy läuft er wieder ein paar Stunden ohne irgendwelche Probleme. Beim Fehler kommt scheinbar einfach keine Antwort mehr und der "function-Node" wirft dann den Fehler raus. Ist ja richtig und auch verständlich. Kann es sein, dass es mit meiner vervielfachung auch quasi mehrere offenen Schnittstellen Task gibt? Ich habe mich gefragt ob es allenfalls besser wäre trigger-Node so umzubauen das er eben nicht einfach nur den Text sendet, sondern das er quasi eine Liste mit den Texten abarbeitet. Oder das nach dem function Node ein zusätzlicher Node angestossen würde der die Schnittstelle schliesst? Nur da habe ich bis jetzt keinerlei Hinweise gefunden wie man eine solche serielle Schnittstelle schliessen kann.
  • Objekte für SKripte anlegen…wo?

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    1k Aufrufe
    I
    Danke hab es jetzt hinbekommen :-)
  • Warnung wegen offenen Fenstern

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    1k Aufrufe
    E
    Cool danke das schaue ich mir mal an. Und Frohe Weihnachtstage noch. Gruß, Thorsten
  • Datenpunkt "clearen" - Fritzbox - missedTableHTML

    Verschoben
    7
    0 Stimmen
    7 Beiträge
    1k Aufrufe
    S
    Hallo, danke für das Skript. Kann es erst am Wochenende ausprobieren - werde dann Feedback geben.
  • Sayit mp3 wird nicht (mehr) abgespiel. Hilfe!

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    496 Aufrufe
    Jeeper.atJ
    Ja, es gibt mehr Dinge zwischen 0 und 1 als man glaubt. Lg Günther
  • [gelöst] Sayit –> Keine Ansage wenn Geburtstag/Muell ansteht

    Verschoben
    9
    0 Stimmen
    9 Beiträge
    2k Aufrufe
    wendy2702W
    Hi, Die iPad Ansage funktioniert ja Prinzipiell. Das ich die einzeln ansprechen kann ist erstmal nicht so wichtig. Freue mich auf deine Infos und Skripte. Mirko Gesendet von iPhone mit Tapatalk
  • Bewegungsmelder loggen funktioniert nicht

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    847 Aufrufe
    blauholstenB
    Hi, if(stateBW) sollte reichen. Aber…..probier mal so... var stateBW="hm-rpc.0.LEQ1278626.1.MOTION"; on(stateBW, function(obj) { if (obj.newState.val) { console.log("Bewegung erkannt"); } else { console.log("Der Status ist Unbekannt"); } });
  • Lange Verzögerungen in Script - Ausführung einer Aktion mit mehreren Stunden Verzögerung

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    984 Aufrufe
    P
    Hier werden Funktionen durch Zeit getriggert: http://forum.iobroker.net/viewtopic.php … 0&start=40 Gruß Pix
  • [gelöst] Mit Skript einen Home24 Mediaplayer ansteuern

    Verschoben
    12
    0 Stimmen
    12 Beiträge
    3k Aufrufe
    BluefoxB
    @blauholsten: @Bluefox: Um bombenfest alles absichern braucht man so was: try { request('http://192.168.1.1:50000/tts=' + text, function (error, response, body) { if(error) { log(error, 'error'); } }) .on('error', function (error) { log(error, 'error'); }); } catch (error) { log(error, 'error'); } Ohne Witz ;) Vielleicht mache ich eine Funktion daraus. so was wie getURL(URL, function (error, body){}); ` Danke für deine Erklärung!!! Aber bist du dir sicher, das das mit try..catch geht? Wenn ich mit meinen Laienhaften Wissen richtig verstanden habe, ist solch ein request ASYNCRON. Oder? Ist mit asynchronen functionen ein try…catch möglich? Bitte um Verständnis, aber ich würde gern etwas mehr über das "programmieren" lernen! Danke ` Prinzipiell asynchrone Fehler kann man mit try/catch nicht abfangen, aber man kann damit z.b. Tippfehler abfangen. Z.B.: try { reqqqqqest('http://192.168.1.1:50000/tts=' + text, function (error, response, body) { if(error) { log(error, 'error'); } }) .on('error', function (error) { log(error, 'error'); }); } catch (error) { log(error, 'error'); } Wird trotzdem laufen.
  • Node-red basierter Abruf des Fernsehprogramms von rtv.de

    Verschoben
    10
    2
    0 Stimmen
    10 Beiträge
    5k Aufrufe
    N
    Entschuldige die langen Antwortzeiten aber ich bin zurzeit beruflich ziemlich unter Wasser… Kommen irgendwelche Fehlermeldungen in node-red? Die Version oben ist etwas veraltet. Wenn ich mich richtig erinnere, kommuniziert diese noch direkt mit node-red und geht nicht über den Web-Adapter. Dafür muss unbedingt die url von Nodered richtig eingetragen und anschließend der Schalter Reese gedrückt werden. Ich hab das bei mir alles auf Kommunikation über den js-controller umgestellt, komme aber zurzeit nicht dazu, dies hier rein zu stellen. Da zurzeit auch an einem iobroker Adapter für iobroker gebastelt wird glaube ich auch nicht, dass daran noch viele interessiert sind. Gesendet von meinem GT-N8000 mit Tapatalk
  • [gelöst] javascript Grundlage Berechnung

    Verschoben
    6
    0 Stimmen
    6 Beiträge
    1k Aufrufe
    0
    Super, funktioniert wunderbar :D Danke!
  • Schedule wird mehrfach ausgeführt

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    1k Aufrufe
    B
    Super, hat funktioniert :idea: Danke Daraus hat sich für mich jetzt aber auch noch eine weitere Frage ergeben. Und zwar aktualisiert der iCal Adapter ja genau so oft. Also alle 30min. Ca.20x innerhalb von einer Sekunde. Kann Ich das irgendwo einstellen oder muß Ich , in Zukunft, die Aktualisierung über ein Script (nicht Global :D ) steuern. Wie macht ihr das?
  • JavaScript Adapter Update 3.2.2

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    542 Aufrufe
    BluefoxB
    @pix: Hallo, danke für das Update. Habe es noch nicht probiert, aber die Funktion stopScript() zum Stoppen eines Skriptes finde ich gut. Ich nutze zur Zeit häufig ein Skript, das sich selbst nach X Zeit deaktiviert. Ist das das gleiche? setStateDelayed('javascript.' + instance + '.scriptEnabled.' + name.slice(10), false, 5*1000); Gruß Pix PS: Bei der Formatierung der Readme auf Github ist was schiefgelaufen. ` Ja, genau. Das ist dafür und tut das gleiche. Markdown muss ich schauen. Danke
  • [gelöst] JSON Funktion

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    1k Aufrufe
    M
    So geht es nun :-). body.devices[0].dashboard_data.Temperature
  • On Regexp auf channelName

    Verschoben
    1
    0 Stimmen
    1 Beiträge
    575 Aufrufe
    Niemand hat geantwortet
  • Per SQL eine Differenz für bestimmte Zeitspanne

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    1k Aufrufe
    a200A
    Du kannst es ja direkt in ioBroker machen: ` > function getHistoryRow(date, callback) { var options = { start: date, //end: date, count: 1, aggregate: 'none', ignoreNull: 1 }; sendTo ("sql.1", "getHistory", { id: "<dein_datenpunkt>", options: options }, function(data) { if (data) { var rows = []; rows = rows.concat(data.result); log(targetId + " ts: " + formatDate(rows[0].ts, "DD.MM.YYYY hh:mm:ss") + " val: " + rows[0].val + " datum: " + rows[0].ts); } }); } // und der Aufruf: dStunde = formatDate(new Date(), "JJJJ.MM.TT 00:00:00"); // heute um 00:00 Uhr iStunde = getDateObject(dStunde).getTime() - 86400000; // gestern um 00:00 Uhr getHistoryRow(iStunde);</dein_datenpunkt> ` Darin kannst wiederum neue Datenpunkte erstellen, usw… Gruß, a200.
  • Aufgabe - wie kann ich es lösen?

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    883 Aufrufe
    Jey CeeJ
    @Lenny.CB: es geht hier im eine eBus-Abfrage für meine Vaillant-Heizung. Für mein Model kann ich >160 Werte abfragen. ob man die alle braucht ist noch fraglich. Daher wäre es von Vorteil wenn man die Abfrageparameter über ne txt oder csv einladen könnte. ` Gut bei der Menge an Abfragemöglichkeiten macht es sinn die in eine Textdatei zu schreiben und sie beim Start des skripts in ein oder auch mehrere arrays zu packen. Mehrere Arrays falls du nicht alle werte Minütlich abfragst. In eine Datei schreiben oder daraus lesen geht mit 'fs'. Es gibt auch im Javascript adapter einen befehl um eine Datei ein zu lesen: https://github.com/ioBroker/ioBroker.ja … t#readfile
  • Steuerung Bewässerung / Startschwierigkeiten

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    1k Aufrufe
    S
    Hallo mctom, kannst du beschreiben, wie du das Problem mit der Bewässerung gelöst hast? Auch im VIS mit den Button? Gruss Superdad
  • Starthilfe ? Create state aus JSON, update state (name) + read value = action

    Verschoben
    5
    1
    0 Stimmen
    5 Beiträge
    3k Aufrufe
    DutchmanD
    @paul53: @Dutchman: Wie kan ich nach einen create state den namen wieder aendern ` var obj = getObject(id); obj.common.name = "neuer_name"; setObject(obj); @Dutchman: Wie kan ich auf alle werte unnerhalb einer structur triggern lassen Mit [https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/RegExp](https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/RegExp) in on(). danke dir Paul das hilft weiter auf jeden fall habe ich das mit dem namen hinbekommen. Regexp verstehe ich wie im beispiel ; on(/^ping\.0\.Iobroker-Server\.(192.xxx.xxx.xx1|192.xxx.xxx.xx2) Nur hierin sind ja auch werte definiert, bei mir sollte er triggern auf alles in dem baum (in die variabelen werden dynamisch erzeugt, kan diese also nicht vorab festlegen.) oder verstehe ich das jetzt falsch ? Kanst du mir eventueel auf die sprunge helfen diesen ON richtig um zu stellen ? (der RegExp ist bestimmt falsch da war ein versuch) on({id: "javascript.0.domoticz.7", change: "any", RegExp}, function (obj) { var value = obj.id; log (value); anstatt der ID 7 sollte er halt auf alle ID in dieser structur triggeren. Mit denm obj.id sehe ich ja welche ID getriggerd hat um dan das URL commando zu bauen Edit: Geschafft ! Die loesung war: on({id: RegExp("javascript.0.domoticz."), change: "any"}, function (obj) { var value = obj.id; log (value); });
  • API Codes nutzen, aber wie?

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    1k Aufrufe
    S
    @torstenh: ….also das ist ein tolles Gerät um es in IO Broker einzubinden. Aber du kannst jetzt nicht verlangen das jemand sich die Anleitung durchließt, und dir den Code präsentiert. Es sind viele gute Beispiele in der Berschreibung, welche du erst einmal testen solltest. var pfad = 'javascript.1.funksteckdosen.'; createState(pfad + 'Tauch_Pumpe_Schalter', { id: 'Tauch_Pumpe_Schalter', name: 'Tauch_Pumpe_Schalter', type: 'boolean', def: false }); createState(pfad + 'Tauch_Pumpe_Zustand', { id: 'Tauch_Pumpe_Zustand', name: 'Tauch_Pumpe_Zustand', type: 'boolean', def: false }); //######################################################################################################## var request = require ('request'); var url_on_Tauch_Hand = "http://192.168.xxx.xxx/automatik_set_funk.php?hauscode=00000&ausgang=4&zustand=1"; var url_off_Tauch_Hand = "http://192.168.xxx.xxx/automatik_set_funk.php?hauscode=00000&ausgang=4&zustand=0"; //######################################################################################################## on(pfad + 'Tauch_Pumpe_Schalter' , function (obj_1) { if (obj_1.state.val) { request(url_on_Tauch_Hand); setState(pfad + "Tauch_Pumpe_Zustand", true); log("Tauch an"); } if (!obj_1.state.val) { request(url_off_Tauch_Hand); setState(pfad + 'Tauch_Pumpe_Zustand', false); log("Tauch aus"); } }); …...hier ein anderes Beispiel wie man mit diesen Befehlen in IO Broker umgehen kann. Wenn du es an deine Funktionen anpassen kannst, dann wirst du mehr verstehen und bist ein ganzes Stück weiter. Ein Tip! Example: Switch 1 activation http://10.0.23.193/api/switch/ctrl?switch=1&action=on so und nun bist du dran. Wenn es Probleme gibt bin ich bereit dir zu helfen aber erst muß du selber ran! Schau dich hier mal durch! http://forum.iobroker.net/viewtopic.php?f=21&t=4271 Grüße, Torsten ` Hallo Torsten, vielen Dank für deine Antwort. Sie ist so wie ich gehofft habe. Ich möchte es gerne verstehen, leider fehlte mir aber der generelle Ansatzpunkt. Diesen sollte ich ja nun mit deiner Anleitung haben. Ich versuchte mich damit und melde mich gerne wieder. Vielen Dank für deine Hilfe. Gruß Sven Gesendet von iPhone mit Tapatalk
  • RFLInk: Problem mit Schalten von mehreren Empfängern.

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    1k Aufrufe
    Z
    Das klingt nach einem sehr guten Plan. Wobei ich mich echt frage wie du das alles immer Zeitlich hinbekommst. Ich bin schwer begeistert. Wenn du die Daten hättest könnte man eventuell die Wiederholung schon in den Adapter integrieren. Ich poste nachher mal mein wiederholungsskript vielleicht hast du noch eine bessere Idee. Ich muss allerdings sagen dass pinatic die Sendeleistubg und -Zuverlässigkeit tatsächlich im Griff hatte. Dafür ist nur der RFLInk in der Lage meine Ikea Küchenbeleichtubg und die neuen Rolling Code Steckdosen von Aldi zu schalten. Somit hat jedes System sein für und wieder. [emoji58] Gesendet von iPhone mit Tapatalk

435

Online

33.0k

Benutzer

83.6k

Themen

1.3m

Beiträge