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
    maxclaudiM
    @Murphy-0 sagte: @maxclaudi Habe dein zURLtool geladen und installiert. Die Freischaltung mit den von dir gesendeten Daten funzt perfekt. zURLtool funktioniert ! Vielen Dank für deine Arbeit !!! Hallo Murphy, vielen Dank für deine Rückmeldung und den erfolgreichen Testlauf. Genau so soll es sein: Eintragen, Freischalten und direkt loslegen! Viel Spaß beim Optimieren deines Scripts!
  • Hilfe für Skripterstellung mit Blockly

    7k 80k
    7k Themen
    80k Beiträge
    Murphy 0M
    @tourer4778 Das ist ganz einfach. Du addierst die Leistung deiner Wechselrichter als maxSolarPower. Dieser Wert wird dann für die Formel zur Berechnung genommen und du bekommst automatisch die Leistung die jeder deiner Wechselrichter haben muss. [image: 1786870575867-img_4130.jpeg] Diese Leistung übergibst du dann nacheinander an deine Wechselrichter. In meinem Blockly unten benutze ich noch einen Korrekturwert für die Leistung. Das liegt an der unterschiedlichen Ausrichtung der Panele und berücksichtigt die unterschiedlich Leistung der Wechselrichter. Der Multiplikator ist mit Pfeil markiert. [image: 1786870876025-img_4128.jpeg] Den Multiplikator brauche ich um die erzielte Leistung jedes Wechselrichters mit dem Bedarf abzugleichen. Meine Nulleinspeisung ist auf ca. -50 Watt ausgelegt. Akku wird nicht geladen. [image: 1786871273695-img_4132.jpeg] Akku wird geladen. Wegen Wolken reicht die Leistung gerade nicht für die gesamt benötigte Menge an Strom. [image: 1786871362148-img_4133.jpeg]
  • 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.
  • $ Selector für rpc.0 und .LOWBAT

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    1k Aufrufe
    F
    Das läuft prima. Super und Danke!! ! Hat denn keiner mal Lust mit das zu erklären? Das JS ist ja kein Problem - ich komme nur nicht dahinter, was Bluefox da geschaffen hat. ! Das ist total frustierend! ! Genau dieses Beispiel: Ich habe Stunden verbracht die Doku zu lesen und zu testen. Ich habe hierfür http://forum.iobroker.net/viewtopic.php?f=20&t=2329&p=30842&hilit=Servicemeldungen#p20332 dazu genommen. ! Dann stelle ich fest, dass meine CuxD Geräte Probleme machen - Also einen weiteren Filter. Dann sehe ich diese Beispiele auf der JS Adapter Seite und nichts funktioniert. ! Dann stellt man die Frage hier im Forum und bekommt eine ganz andere Lösung. Oft dann noch der Hinweis, das steht doch da so. :shock: :shock: :shock: ! Ich finde aber wirklich nirgends einen Hinweis, wann wie welcher Selektor welcher ist. Beispiel: bei "enum Name" soll ich von alleine darauf kommen, dass ich hier z.B. nur "function" eintrage. Habe ich sogar geschafft. Was ist aber ein commonAttr? Welche Dinger passen da rein, welche nicht? ! Wann nehme ich channel (so wie im genannten Servicemeldungen Skript) und wann nehme ich nun state (so wie jetzt total überraschend von pix in meinem Beispiel)? ! Ist ja nun nicht so, dass ich im Skripteprogrammieren neu bin. Das mache ich schon etliche Jahre mit Perl, Bash, Bat, SQL usw. ! Achso - warum will ich überhaupt diese Anpassungen… na weil bei mir meistens die Skripte, die es hier so funktionierend von anderen gibt, bei mir nicht laufen. Auch nicht auf einer nagelneuen Installation. Keine Ahnung, ob es an der Masse meiner Aktoren liegt oder nicht. Immer wieder nur rote Zeilen im loggging. ! Ich hatte schon mehrfach Leuten sogar Geld für eine 30-60 Minuten Schulung geboten. Aber nix, hat keiner Interesse. :evil: Muss ich halt blöd bleiben. Danke dennoch nochmal pix.
  • Raffstore script Beispiel

    Verschoben
    6
    0 Stimmen
    6 Beiträge
    3k Aufrufe
    M
    @Fitti: Mich würde auch noch etwas mehr Details interessieren aus Eigennutz, was du exakt für ein Stoff und Motor hast. Gerne per PM. Suche nämlich sowas. 8-) Also du hast einen normalen HomeMatic Funk-RolladenAktor drannen, richtig? Und den kannst Du auch von der CCU z. B. steuern? Oder hast Du dazu noch einen Funktaster? Oder hast du den Unterputz RolladenAktor, wo du die Taster direkt anchließt? Sei es drum. Eigentlich müsste es doch so gehen, dass du immer nur auf bestimmte Positinen fährst. Den Rolladenaktor hast du entsprechend mit der Zeit programmiert, richtig? Also z. B. 0% ist der Store komplett offen, das Fenster ist vollkommen frei. Bei 100 % ist der Store vollkommen vor dem Fenster. Jetzt kann man ja diesen Store ankippen, auch wenn der Store z. B. nur das halbe Fenster verdeckt, richtig? Das willst du? Das ist durch eine Logik machbar: Man müsste also den aktuellen Wert erst auslesen und dann ein paar Prozent rauf oder runter rechnen. Also z. B. lese ich erst mal aus, dass der Store bei 43% steht (0.43). Jetzt musst du ausprobieren, wieviel % du benötigst, damit er einmal seine Blick-Position umdreht. Sagen wir 5%. Dann setzt du den Store auf den Wert 0.48 (48%) mit setState(xxx.. Jetzt sehe ich nur noch ein kleines Problem, nämlich ob der Store vorher geöffnet oder geschlossen wurde. Demnach müsstest Du was addieren oder abziehen. Bevor jetzt noch weitere Vorschläge kommen - ist das so ungefähr was bei Dir ist und die rein theoretische Lösung geht in die richtige Richtung? So long, Fitti ` Hallo Fitti genau so sollte es funktonieren einfach irgendwo mitten drinnen kurz mal umsteuern und dann weiter nach unten fahren Gruesse Mario
  • Heizungssteuerung

    Verschoben
    9
    0 Stimmen
    9 Beiträge
    2k Aufrufe
    S
    ich denke grad für eine Heizungssteuerung wäre OCC sehr gut geeignet. Leider bring ich die alte Version nicht ans Laufen, und die neue Version verzögert sich - also ist Geduld angesagt.
  • Und oder Verknüpfung

    Verschoben
    11
    0 Stimmen
    11 Beiträge
    7k Aufrufe
    HomoranH
    Habt ihr mal im JavaScript Adapter nachgesehen? Da gibt es jetzt die ersten Ansätze von blockly. Dies wird der Ersatz für die scriptGUI Gruß Rainer
  • 0 Stimmen
    8 Beiträge
    3k Aufrufe
    etvE
    ….nein gleich danach nicht, hat er auch so übernommen. Fehler war, dass die Datei nach dem Kopieren falsche Zugriffsrechte hatte und erst nach dem Ändern dieser ist es dann gegangen und anscheinend sind genau in dieser Zeit die letzten Fehler ausgeworfen worden... Aber nun klappt's perfekt! Danke nochmal für die rasche Hilfe!! Grüße Tom
  • Anderung in Hm rega überwachen

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    947 Aufrufe
    paul53P
    Rechne besser die aktuelle Uhrzeit in ms um, dann kann man einfach substrahieren: schedule ("* * * * *",function(){ var act = getState("hm-rega.0.7761"/*Anwesenheit.string*/).ts; // letzte Aktualisierung var change = getState("hm-rega.0.7761"/*Anwesenheit.string*/).lc; var date =new Date(); date = date.getTime(); // ms seit 1.1.1970 setState ("javascript.0.hmpdetect.neu"/*hmpdetect.neu*/,act); log("act " +act + " change " +change + " date "+date ); var diff = (date - act) / 60000; // Differenz in Minuten });
  • Neuling hat probleme bei Script ausführen

    Verschoben
    7
    0 Stimmen
    7 Beiträge
    3k Aufrufe
    M
    Hallo Pix mal einen Herzlichen Dank für deine Geduld und Hilfe hab das script ein wenig umbebaut ,leider funktioniert das mit dem Widget noch ned so richtig kommt nur eine kurze bestätigung ,also das script bleibt auf false hab sicher da irgendwo nen fehler drinnen ..vielleicht kannst du noch mal kurz drüber schauen Gruesse Mario66 createState('RolAlleHoch', false); /* besser createState('RolAlleHoch', { type: 'boolean', def: false }); */ on("javascript.0.RolAlleHoch", function (obj) { if (obj.state.val) { // kann so abgekürzt werden. newState = state, "===true" kann man weglassen setStateDelayed("hm-rpc.0.MEQ1309974.1.LEVEL"/*Jalousien/Wohnzimmer TV.LEVEL*/, 100); // Wert 100 setStateDelayed("hm-rpc.0.MEQ1310286.1.LEVEL"/*Jalousien/Wohnzimmer/Strasse.LEVEL*/, 100); // Wert 100 setStateDelayed("hm-rpc.0.NEQ0111918.1.LEVEL"/*Jalousien/Esszimmer.LEVEL*/, 100); // Wert 100 log('Alle Rollläden werden hochgefahren'); // optional - damit du siehst, wann das Skript greift. } }); on({id: /.MEQ1309974.1.LEVEL|.MEQ1310286.1.LEVEL|.NEQ0111918.1.LEVEL/, // Rolläden werden bei Bewegung abgefragt change: 'ne' }, function(obj) { if (getState("hm-rpc.0.MEQ1309974.1.LEVEL").val === 100 && getState("hm-rpc.0.MEQ1310286.1.LEVEL").val === 100 && getState("hm-rpc.0.NEQ0111918.1.LEVEL").val === 100) setState("javascript.0.RolAlleHoch", false); });
  • Hile node-red läuft 2mal ?

    Verschoben
    1
    0 Stimmen
    1 Beiträge
    1k Aufrufe
    Niemand hat geantwortet
  • SSH-Befehle als Skript in ioBroker ausführen

    Verschoben javascript
    6
    0 Stimmen
    6 Beiträge
    8k Aufrufe
    K
    Danke euch beiden für die Tipps! Das mit der Skriptdatei werde ich ausprobieren. Sorry für die Anfänger-Fragen, bin einfach kaum Linux-Erfahren und da fehlen mir häufig Basics. Unter Windows wäre das ja alles kein Problem 8-)
  • Blockly

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    2k Aufrufe
    BluefoxB
    Es geht schon einiges und zum Spielen reich es aus: [image: 48_2016-07-21_17_40_03-iobroker.admin.png] Ich habe aber das Problem, dass die Projekte nicht immer abgespeichert werden. Also .. nur spielen ;)
  • GetObject liefert falsche Daten (Ziel: Raum zu Gerät finden)

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    936 Aufrufe
    P
    Tatsächlich habe ich jetzt nochmal recherchiert und mir alle enums zu den Objekten anzeigen lassen. Die problematischen Geräte sind noch in Favoriten der CCU enthalten und somit unter enum.favorites aufgeführt. Scheinbar wird dann etwas durcheinander geworfen. Da ich die Favoriten nicht mehr nutze, habe ich sie jetzt gelöscht und alles funktioniert korrekt.
  • Setzen von HM Systemvariablen mit JS

    Verschoben
    27
    0 Stimmen
    27 Beiträge
    7k Aufrufe
    D
    Hallo paul53, danke. Da lag wohl ein kleiner Denkfehler meinerseits vor. Gruß, Thorsten
  • [ERLEDIGT]Hilfe zur Fehlermeldung.

    Verschoben
    8
    0 Stimmen
    8 Beiträge
    1k Aufrufe
    blauholstenB
    @Bluefox: @blauholsten: Hi Pix, Der wird doch neu gestartet oder? ;) Hi, ja die Instanz startet dann neu durch. Ich werde dieses Verhalten bei zukünftigen Skripten beachten, und dann entweder pix seinen Vorschlag nehmen oder für solche Anwendungen eine separate Instanz anlegen. Thanks @all…..
  • Anfängerproblem: Skript zur automatischen Abschaltung nach definierter Zeit

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    992 Aufrufe
    P
    Die Steuerung per Skript ist natürlich die sichere Variante und definitiv vorzuziehen. Soll aber wirklich nur dann automatisch verzögert abgeschaltet werden, wenn per VIS der Einschaltbefehl gegeben wurde, eignet sich auch ein ctrl Bool Widget wie dieses: [image: 261_bildschirmfoto_2016-07-18_um_13.57.40.jpg] Der Screenshot erklärt sich selbst. Auto AUS ist hier die Lösung. Gruß Pix
  • Sunny Webbox direkt auslesen auch einzelne Geräte (GetProcessData + GetPlantOverview)

    Verschoben
    1
    1
    0 Stimmen
    1 Beiträge
    2k Aufrufe
    Niemand hat geantwortet
  • Variablen Setzen und an andere Node übergeben.

    Verschoben
    1
    0 Stimmen
    1 Beiträge
    1k Aufrufe
    Niemand hat geantwortet
  • Daten aus den C.M.I Modul von der Technischen Alternative auslesen.

    Verschoben
    1
    1
    0 Stimmen
    1 Beiträge
    2k Aufrufe
    Niemand hat geantwortet
  • In ioBroker mit js eine XML Datei auf den Raspberry speichern

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    1k Aufrufe
    T
    Super, genau diesen Hinweis brauchte ich. Hab es gerade getestet, funktioniert. Wenn ich das JS fertige habe, werde ich es hier posten, vielleicht kann das ja mal jemand gebrauchen. DANKE. :)
  • [FIXED] Problem mit Javascript und View Change

    Verschoben
    15
    0 Stimmen
    15 Beiträge
    3k Aufrufe
    F
    @blauholsten: @firstfreak: ein Problem ist aber noch, es schaltet jetzt wie es soll, aber ich habe die zeit sogar von 60000 auf 90000 geändert aber es schaltet immer noch ein paar Sekunden zurück. Wo kann da noch der Fehler sein ? on({id: "hm-rpc.0.KEQ0058102.2.PRESS_LONG", change: "any"}, function (obj){ //View wechseln setState("vis.0.control.command", '{"instance": "FFFFFFFF", "data": "Tuerklingel", "command": "changeView"}'); //Nach 60 Sekunden wieder Haupt-View anzeigen setTimeout(function () { setState("vis.0.control.command", '{"instance": "FFFFFFFF", "data": "Allgemein", "command": "changeView"}'); }, 90000); }); ```` ` Weiß nicht ob es hilft, aber leere mal den Browser Cache… ` Das hat funktioniert, vielen Dank
  • IP Türsprechanlage

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    930 Aufrufe
    F
    Hi Michael, schaue dir mal die Android App Mediaplayer24 an. Bei dieser kannst Du mit einem Webaufruf eine bestimmte Datei auswählen, die du zuvor auf dem oder dieTablet(s) gespeichert hast. Dann schreibst Du ein JavaScript mit einem on({id:"Deine Variable mit ID Selector einfügen) usw. und sendest die 3 urls zu Deinen Tablets. Dazu findest Du hier bestimmt Beispiele, habe gearde keines Parat. Den URL Aufruf zeigt dir der MediaPlayer24 meine ich sogar an. Du musst dann aber sicherstellen, dass deine Tablets immer die gleiche IP erhalten. Vorteil: Mit dem ioBroker sayit Adapter kannst Du dann auch gleich schöne individuelle Sprachausgaben realisieren. Vielleicht ist das auch schon für Dich die Lösung, da Deine mp3s in Wirklichkeit sprachsamples sind? Dann würde ich eh zum SayIt raten, da individuelle Ansagen nett sind. So long, Fitti

505

Online

33.0k

Benutzer

83.6k

Themen

1.3m

Beiträge