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.
  • Wie kann man States übergeben

    Verschoben
    7
    0 Stimmen
    7 Beiträge
    1k Aufrufe
    A
    Das ist für mich eine völlig neue Art zu programmieren, da muss ich mich wirklich erst einarbeiten. Bin eher ein "traditioneller" Coder;). Aber ist schon klasse was ihr da so entwickelt. Gesendet von meinem GT-N8000 mit Tapatalk
  • URL mit Tastendruck aufrufen

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    2k Aufrufe
    P
    Hallo ianmoone, lies mal hier: http://forum.iobroker.net/viewtopic.php?t=1115#p8984 Gruß Pix
  • DWD Warnungen ein/ausblenden

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    1k Aufrufe
    andreA
    Also hier gleich mal vorweg meine Widgets: ! [{"tpl":"tplDwdAdapter","data":{"visibility-cond":"==","visibility-val":"false","oid-begin":"dwd.0.warning.begin","oid-end":"dwd.0.warning.end","oid-headline":"dwd.0.warning.headline","oid":"dwd.0.warning.description","oid-severity":"dwd.0.warning.severity","visibility-oid":"javascript.0.vis.wetterwarnung.bestaetigung1","name":"Popup - Wetterwarnung 1","gestures-offsetX":0,"gestures-offsetY":0,"signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false},"style":{"left":"235px","top":"635px","color":"","width":"895px","height":"128px","background-color":"","padding":"","margin-top":"","font-size":"medium","z-index":"10","border-radius":"25px","border-style":"none","padding-top":""},"widgetSet":"dwd"},{"tpl":"tplMetroTileToggle","data":{"oid":"javascript.0.vis.wetterwarnung.bestaetigung1","visibility-cond":"==","visibility-val":"false","hover":false,"transform":false,"bg_class_false":"","bg_class_true":"","icon_class_false":"","icon_class_true":"","icon_badge_false":"","icon_badge_true":"","badge_bg_class_false":"","badge_bg_class_true":"","brand_bg_class_false":"","brand_bg_class_true":"","badge_top":"0","badge_left":"0","gestures-offsetX":0,"gestures-offsetY":0,"visibility-oid":"javascript.0.vis.wetterwarnung.bestaetigung1","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"name":"Popup - Bestätigung Wetterwarnung 1"},"style":{"left":"235px","top":"635px","padding":"0px","width":"895px","height":"128px","z-index":"11","opacity":"0"},"widgetSet":"metro"}] ! Zwei Widgets. Das DWD Widget für die Warnung selbst, das Tile Toggle Widget zum manuellen bestätigen der Warnung oben drüber. Mit dem Script wird es jetzt ein bisschen komplizierter. :( Da ich mir bis zu drei Wetterwarnungen anzeigen lasse, ebenso wie eine Meldung "Keine Wetterwarnungen vorhanden", ist in dem Script auch noch eine Variable enthalten, die mir Sagt ob überhaupt eine Wetterwarnung vorhanden ist. Hier mal das Script mit kurzen Kommentaren: ! // Datenpunkte anlegen createState('vis.wetterwarnung.vorhanden', false, {name: 'Liegt mindestens eine Wetterwarnung vor?'}); // Variable für "Ist eine Wetterwarnung vorhanden?" createState('vis.wetterwarnung.bestaetigung1', false, {name: 'Bestätigung der Wetterwarnung1'}); // Variablen für die Bestätigung und damit die Sichtbarkeit der einzelnen Warnungen createState('vis.wetterwarnung.bestaetigung2', false, {name: 'Bestätigung der Wetterwarnung2'}); createState('vis.wetterwarnung.bestaetigung3', false, {name: 'Bestätigung der Wetterwarnung3'}); ! // Datenpunkt-IDs var idVorhanden = "vis.wetterwarnung.vorhanden"; var idBestaetigung1 = "vis.wetterwarnung.bestaetigung1"; var idWarnung1 = "dwd.0.warning.severity"; var idBestaetigung2 = "vis.wetterwarnung.bestaetigung2"; var idWarnung2 = "dwd.0.warning2.severity"; var idBestaetigung3 = "vis.wetterwarnung.bestaetigung3"; var idWarnung3 = "dwd.0.warning3.severity"; ! // Variablendeklaration und Initialisierung bei Scriptstart var stateVorhanden = getState(idVorhanden).val; var stateBestaetigung1 = getState(idBestaetigung1).val; var stateWarnung1 = getState(idWarnung1).val; var stateBestaetigung2 = getState(idBestaetigung2).val; var stateWarnung2 = getState(idWarnung1).val; var stateBestaetigung3 = getState(idBestaetigung3).val; var stateWarnung3 = getState(idWarnung1).val; ! // Funktion zum Ermitteln ob Wetterwarnungen vorliegen function setvorhanden() { if (stateWarnung1 !== 0 || stateWarnung2 !== 0 || stateWarnung3 !== 0) { // Wenn severity bei einer Warnung ungleich 0, dann liegt mindestens eine Warnung vor. setState(idVorhanden, true); } else { setState(idVorhanden, false); } } ! // Funktionsaufruf bei Scriptstart setvorhanden(); ! // Funktionsaufruf bei Änderung der Stati on(idWarnung1, function(dp) { // Wenn severity sich ändert... stateWarnung1 = dp.newState.val; // Neuen severity Wert in den state schreiben... setState(idBestaetigung1, false); // Bestätigung auf "nicht bestätigt setzten" setvorhanden(); // Funktion zum Vorhandensein aufrufen um auch den Status für das Vorhandensein einer Warnung zu aktualisieren }); on(idWarnung2, function(dp) { stateWarnung2 = dp.newState.val; setState(idBestaetigung2, false); setvorhanden(); }); on(idWarnung3, function(dp) { stateWarnung3 = dp.newState.val; setState(idBestaetigung3, false); setvorhanden(); }); ! Wo ich das hier aber gerade so nochmal durchdenke und teste fällt mir auf, dass in meinem Script noch ein Denkfehler ist. So wird aktuell der Status für die Bestätigung auch auf false gesetzt wenn eine Warnung aufgehoben wird (also z.B. severity von 1 auf 0 gesetzt wird). Das fällt bei mir in vis aber nicht auf, da in diesem Fall meine Widgets sowieso durchsichtig sind… :) Werde das nochmal ein bisschen umkonfigurieren müssen... MfG, André
  • Zugriff auf Objektstruktur / Ermitteln ob History aktiviert

    Verschoben
    21
    0 Stimmen
    21 Beiträge
    4k Aufrufe
    ThisoftT
    Danke, Bluefox, für die Erklärung. Jetzt hab ich's :) Aber in der Tat - da muss man erstmal drauf kommen ;)
  • Thermostate HM-CC-RT-DM in Party/Urlaubsmode setzen

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    2k Aufrufe
    D
    Hi ehome, gegen das Problem mit dem zu schnell senden habe ich folgende Lösung mit setStateDelayed irgendwann mal hier im Forum gefunden. Ich benutze es zum Beispiel um alle Lichter auszuschalten … var idx = 0; /* Index-Zähler */ var interval = 300; /* 300ms Abstand */ $('channel[state.id=*.STATE](functions=Beleuchtung)').each(function (id, i) { var obj = getObject(id); if (getState(id).val){ setStateDelayed(id, false, (idx++) * interval); /* Zähler erhöhen, mit Interval multipliziert */ log('switch off: ' + obj.common.name); } }); Habe noch etwas gefunden wegen dem Party-Mode im https://forum.homegear.eu/viewtopic.php?t=115#p736 ` > Es macht gegenüber den einzelnen Party-Mode-Variablen auf jeden Fall Sinn, PARTY_MODE_SUBMIT zu verwenden, weil dann nur ein einziges Paket an den Stellantrieb gesendet werden muss. An PARTY_MODE_SUBMIT übergibst du einen String mit folgenden kommagetrennten Elementen: Partytemperatur (z. B. 21.5 - nicht mit Komma schreiben) Start-Uhrzeit in Minuten seit 0 Uhr mit einer Auflösung von 30 Minuten (also zum Beispiel 1020 für 17 Uhr) Starttag (z. B. 21) Startmonat (z. B. 5) Letzte zwei Ziffern des Startjahres (z. B. 14 für 2014) End-Uhrzeit in Minuten seit 0 Uhr wieder mit einer Auflösung von 30 Minuten (z. B. 1380 für 23 Uhr) Endtag Endmonat Letzte zwei Ziffern des Endjahres ` Gruß Philippe
  • Push mit WindowsPhone + Toasty

    Verschoben
    1
    0 Stimmen
    1 Beiträge
    629 Aufrufe
    Niemand hat geantwortet
  • Widget CAM/Video Object Dialog

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    936 Aufrufe
    andreA
    Da schließe ich mich mal an… Habe es derzeit anders gelöst. Nutze für meinen Livestream das HTML Widget welches über meinen anderen Wigets liegt und steuere das mit der Sichtbarkeit. Funktioniert soweit ganz gut. Nur im Editor muss ich es halt immer verschieben wenn ich an die Widgets darunter möchte. Hier greift ja logischer Weise die Sichtbarkeit nicht. :) MfG, Andre PS: Das gleiche Verfahren nutze ich auch beim Callmonitor und bei den Wetterwarnungen :) Geschrieben mit Tapatalk
  • [gelöst] Rollo Script / Wie kann ich das Script kürzen?

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    992 Aufrufe
    M
    Danke funktioniert super.
  • [gelöst] Überwachung im Garten aktivieren

    Verschoben
    21
    0 Stimmen
    21 Beiträge
    6k Aufrufe
    N
    @mike2712: Hallo, der Haken war gesetzt, aber mit == TRUE funktioniert das.Wenn ich EG Flur schalte, kommt, schaltet OG1 Flur jetzt wollte ich ein Vergleicher mit hinzu nehmen, wie muss den dann der Switch konfiguriert werden wenn z.B Licht Schlafen bei 30% das OG1 Flur Licht geschaltet werden soll ? ` Ich gehe mal davon aus, dass der Vergleich im Switch-Node nicht das tut, was er soll. Es gibt in Javascript unterschiedliche Operatoren für Vergleiche. == z.B. überprüft nur den Wert, nicht aber den Datentyp. Falls möglich wird der Datentyp für den Vergleich implizit konvertiert. Mit === wird auch der Datentyp mit überprüft. Wenn einer der Werte eine Zeichenkette ist wird bei == eigentlich immer der andere auch in eine Zeichenkette konvertiert und dann diese verglichen. Man Gibt im Switch-Node den Datentyp auch an: [image: 632_example.png] Wenn du nun nicht auf Gleichheit sondern z.B. auf größer oder kleiner prüfen möchtest geht das so nicht, da dieser bei Zeichenketten nicht das gewünschte Ergebnis haben wird. Die einfachste Lösung ist, den Haken einfach weg zu machen. Dann kommt der Level-Wert direkt als Zahl und man kann dann mit Zahlen vergleichen. Ansonsten müsste man den String zuerst in einem Function-Node erst mittels Javascript in eine Zahl umwandeln.
  • SetStateDelayed funktioniert nicht

    Verschoben
    11
    0 Stimmen
    11 Beiträge
    2k Aufrufe
    Z
    Sorry für die späte Antwort, aber war in Urlaub und habe irgendwie versucht das Problem zu analysieren. War etwas schwierig da es manchmal geht und manchmal nicht. Letzendlich habe ich jetzt herausgefunden das die Ursache für mein Problem in einem request(url) Kommando liegt. Hier sollte ein JSON Befehl an einen PC gesendet werden auf dem XBMC läuft und die Musik stoppen. Wenn der PC an ist. Funktioniert das setStateDelayed. Wenn er aus ist, geht es nicht. Keine Ahnung warum das so ist. Aber seit dem ich die dementsprechenden Zeilen auskommentiert habe, geht es immer. Hier das jetzt momentan gültige Script /* Programm Abwesend Kurz Ablösen des CCU2 Programms Mit Hilfe von Jey Cee, Pix und Paul53 */ // Abfrage der Abwesenheit Kurz: var idAbwesendKurzVariable = 'hm-rega.0.2330'; // System Variable CCU2 Abwesend Kurz var idAnwesenheit = getState('hm-rega.0.950').val; // zur besseren Übersicht Anwesenheit in eine lokale Variable geschrieben var idBalkonTuer = getState("hm-rpc.0.MEQ0816190.1.STATE").val; //Türkontakt Balkontür.STATE var idBewegungsmelder = 'hm-rega.0.18930'; // lange, ausführliche Schreibweise on({ id: idAbwesendKurzVariable, // Datenpunkt der Überwachung change: 'ne' // auf Änderung }, function (obj1) { // den neuen Wert der Änderung checken if (obj1.state.val === true) { // wenn neuer Wert true // aktuelle Abfrage der zweiten Variable - also nur prüfen if (idAnwesenheit === true) { // wenn Anwesenheit auch wahr ist if (idBalkonTuer === false) { // wenn Balkontür ist zu starteAktion(); // Funktion aufrufen } else { starteAktion1(); }} } }); // Ausführung function starteAktion() { // Definiere Variablen // var url ='http://192.168.33.212:8081/jsonrpc?request={%22jsonrpc%22:%222.0%22,%22method%22:%22Player.Stop%22,%22params%22:{%22playerid%22:%200},%22id%22:1}}}'; // Aspire Musik Aus // Aktionen setState("hm-rpc.0.MEQ0484756.1.STATE", false); // Taster Deckenlicht Arbeitszimmer setState("hm-rpc.0.KEQ0025668.1.STATE", false); // Red Bull Kühlschrank Licht.STATE setState("hm-rpc.0.KEQ0196838.1.STATE", false); // Schlafzimmer Deckenlampe.STATE setState("hm-rpc.1.CUX4000002.2.PRESS_LONG", true); // (Gruppe) Deko Licht An/Aus.PRESS_LONG setState("hm-rpc.1.CUX4000002.10.PRESS_SHORT", true); // (Gruppe) Dimmer (Diele, Essbereich, Küche, Esstisc.PRESS_SHORT setState("hm-rpc.1.CUX4000002.1.PRESS_LONG", true); // (Gruppe) Steckdosenleiste 1+2 An/Aus.PRESS_LONG setState("hm-rpc.0.KEQ0964652.1.STATE", false); // Stehlampe Wohnzimmer Tür.STATE setState("hm-rpc.0.KEQ0196897.1.STATE", false); // Nachttischlampe1 Schlafzimmer.STATE setState("hm-rpc.0.JEQ0740381.1.LEVEL", 0); // Dimmer Bad Einbaustrahler.LEVEL setState("hm-rpc.0.LEQ0187095.1.LEVEL", 0); // Dimmer Bad LED-Stripe Spiegel.LEVEL setState("hm-rpc.0.KEQ0926570.2.STATE", false); // Springbrunnen.STATE setState("hm-rpc.0.KEQ0926589.1.STATE", false); // Lichtschlauch Balkon.STATE setState("hm-rpc.0.KEQ0926589.2.STATE", false); // Teichlicht.STATE setState("hm-rpc.0.MEQ1739011.1.STATE", false); // LED-Unterschrank weiß (16A).STATE setState("hm-rpc.1.CUX4000001.6.PRESS_SHORT", true); // Lenovo-Q180 Standby.PRESS_SHORT setState("hm-rpc.0.LEQ0236668.1.STATE", false); // Duftnebler Bad.STATE setState("hm-rpc.0.MEQ1711639.1.STATE", false); //Balkon (Kugelnlampen):1.STATE setState("hm-rpc.0.KEQ0926570.2.STATE", false); //Balkon (BlumenRGB-Stripe):1.STATE setState("hm-rpc.0.NEQ0132493.1.STATE", false); //Taster Balkonlicht.STATE setState("hm-rpc.0.MEQ1711639.2.STATE", false); //Balkon (LED-Stripe):2.STATE*/) setState("hm-rega.0.18930", false); // Bewegungsmelder aktiv ist falsch setState("hm-rega.0.42725", true); // Automatik Lichthelligkeit An/Aus setState("hm-rpc.0.NEQ0018993.2.SUBMIT","0.7,1,108000,20"); // MP3 Funkgong // verzögerte Aktionen einfügen setStateDelayed(idBewegungsmelder, true, 300000, true, function() {log('Bewegungsmelder Aktiv'); // Bewegungsmelder nach 5 Min aktiv setzen }); setStateDelayed("hm-rega.0.56542", false, 2000); // Lichthelligkeit Anzeige Aus Trigger nach 2 Sekunden setStateDelayed("hm-rpc.1.CUX4000001.11.PRESS_SHORT", true, 5000); // PCs Aus/WoL:11.PRESS_SHORT Aspire Standbye nach 5 Sekunden // request = require('request'), // request(url); } function starteAktion1() { // Definiere Variablen // var url ='http://192.168.33.212:8081/jsonrpc?request={%22jsonrpc%22:%222.0%22,%22method%22:%22Player.Stop%22,%22params%22:{%22playerid%22:%200},%22id%22:1}}}'; // Aspire Musik Aus // Aktionen setState("hm-rpc.0.MEQ0484756.1.STATE", false); // Taster Deckenlicht Arbeitszimmer setState("hm-rpc.0.KEQ0025668.1.STATE", false); // Red Bull Kühlschrank Licht.STATE setState("hm-rpc.0.KEQ0196838.1.STATE", false); // Schlafzimmer Deckenlampe.STATE setState("hm-rpc.1.CUX4000002.2.PRESS_LONG", true); // (Gruppe) Deko Licht An/Aus.PRESS_LONG setState("hm-rpc.1.CUX4000002.10.PRESS_SHORT", true); // (Gruppe) Dimmer (Diele, Essbereich, Küche, Esstisc.PRESS_SHORT setState("hm-rpc.1.CUX4000002.1.PRESS_LONG", true); // (Gruppe) Steckdosenleiste 1+2 An/Aus.PRESS_LONG setState("hm-rpc.0.KEQ0964652.1.STATE", false); // Stehlampe Wohnzimmer Tür.STATE setState("hm-rpc.0.KEQ0196897.1.STATE", false); // Nachttischlampe1 Schlafzimmer.STATE setState("hm-rpc.0.JEQ0740381.1.LEVEL", 0); // Dimmer Bad Einbaustrahler.LEVEL setState("hm-rpc.0.LEQ0187095.1.LEVEL", 0); // Dimmer Bad LED-Stripe Spiegel.LEVEL setState("hm-rpc.0.KEQ0926570.2.STATE", false); // Springbrunnen.STATE setState("hm-rpc.0.KEQ0926589.1.STATE", false); // Lichtschlauch Balkon.STATE setState("hm-rpc.0.KEQ0926589.2.STATE", false); // Teichlicht.STATE setState("hm-rpc.0.MEQ1739011.1.STATE", false); // LED-Unterschrank weiß (16A).STATE setState("hm-rpc.1.CUX4000001.6.PRESS_SHORT", true); // Lenovo-Q180 Standby.PRESS_SHORT setState("hm-rpc.0.LEQ0236668.1.STATE", false); // Duftnebler Bad.STATE setState("hm-rpc.0.MEQ1711639.1.STATE", false); //Balkon (Kugelnlampen):1.STATE setState("hm-rpc.0.NEQ0132493.1.STATE", false); //Taster Balkonlicht.STATE setState("hm-rpc.0.MEQ1711639.2.STATE", false); //Balkon (LED-Stripe):2.STATE*/) setState("hm-rega.0.18930", false); // Bewegungsmelder aktiv ist falsch setState("hm-rega.0.42725", true); // Automatik Lichthelligkeit An/Aus setState("hm-rpc.0.NEQ0018993.2.SUBMIT","0.7,1,108000, 16, 20"); // MP3 Funkgong // verzögerte Aktionen einfügen setStateDelayed(idBewegungsmelder, true, 300000, true, function() {log('Bewegungsmelder Aktiv'); // Bewegungsmelder nach 5 Min aktiv setzen }); setStateDelayed("hm-rega.0.56542", false, 2000); // Lichthelligkeit Anzeige Aus Trigger nach 2 Sekunden setStateDelayed("hm-rpc.1.CUX4000001.11.PRESS_SHORT", true, 5000); // PCs Aus/WoL:11.PRESS_SHORT Aspire Standbye nach 5 Sekunden // request = require('request'), // request(url); } Vielleicht hat ja jemand eine Idee warum sich das so verhält. Dann weiß ich zumindest beim nächsten mal wie ich das umgehen kann. Danke Gruß Zippolighter
  • [gelöst]formatDate(obj.newState.ts - obj.oldState.ts, "ss")

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    1k Aufrufe
    S
    Ok, blöder Denkfehler…Danke euch beiden, so funktionierts.
  • Problem im Skript mit Variablen

    Verschoben
    7
    0 Stimmen
    7 Beiträge
    2k Aufrufe
    BluefoxB
    @erh_stgt: Ich hab den Hinweis auf den State erst nicht verstanden - dann aber kapiert was gemeint war. was ich nicht verstehe - warum ist das Ergebnis 4 wenn ich bei getState mit *1 multipliziere - aber 31 wenn ich nicht mit *1 multipliziere. ` "3" + 1 = "31" "3" * 1 = 3 "3" * 1 + 1 = 4 Weil deine Variable String ist. Ganz richtig ist: BewDauerKorr = parseFloat(getState("vis.0.Bewaesserungsdauer").val) + 1;
  • [gelöst] Radio Lautstärke per Widget und Javascript steuern

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    3k Aufrufe
    P
    Schön, dass ich helfen konnte. Die Fehler im Skript kommen leider eben daher, dass ich es nicht ausprobiert habe. Ist praktisch der erste Blitz, der mir durch den Kopf schoss. Natürlich summiert sich die Variable auf, das hast du genau richtig gelöst. Try & Catch sollten nur verhindern, dass gleich die ganze Instanz abschmiert, wenn mit der Adresse oder der Erreichbarkeit des Radios was nicht stimmt. Gruß Pix
  • Eigenschaften eines Widget per Script ändern

    Verschoben
    1
    0 Stimmen
    1 Beiträge
    776 Aufrufe
    Niemand hat geantwortet
  • Funktion scriptübergreifend aufrufen?

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    4k Aufrufe
    S
    Danke Hermann, der Trick mit dem "global" war's :) Und vielen Dank an pix, der Fehler ist mir noch gar nicht aufgefallen! :)
  • Timer in Scipt einbauen…

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    803 Aufrufe
    etvE
    …gute Idee!! Danke, das macht's dann einfacher! Liebe Grüße Tom
  • Prüfen ob auf einer IP-Adresse etwas gesendet wird

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    815 Aufrufe
    ThisoftT
    Also pcap gibt's auch für Windows - heißt dann WinPCAP https://www.winpcap.org/install/default.htm
  • [gelöst]Roomba xml oder json Datei auslesen und auswerten

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    1k Aufrufe
    coyoteC
    Danke Dir Pix, das sieht sehr gut aus, damit kann ich arbeiten. Genau so hatte ich mir das vorgestellt.
  • Auslösen bei Level aus einer Variablen?

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    1k Aufrufe
    P
    Jetzt verstehe ich, was du meinst. Und das wird schwer :roll: Alternativ geht es so: Du erzeugst eine zusätzliche Variable, die nach dem Verursacher der Rollladenbewegung gesetzt wird. Ähnlich einer Ereignisliste "Letzte Bewegung erzeugt durch Beschattung (Uhrzeit). Ist-Level: 30%, Tagszeitsoll: 100%" Gruß Pix
  • IPad und Script Editor…

    Verschoben
    11
    0 Stimmen
    11 Beiträge
    3k Aufrufe
    S
    Hallo zusammen und Danke für Eure Meinungen. Nur um das klarzustellen, mit diesem Fred ging es mir nicht um den Sinn oder Unsinn mit dem iPad eine View zu erstellen. Das ist sicher auf einem Pc mit Maus und Tastatur effektiver! Es geht mir um die schlechte Unterstützung des iPad im Script Editor des Javascript-Adapters! Der "Rest" von iobroker ist m.M. gut mit dem iPad zu bedienen, nur irgendwie hakt es im besagten Editor. Lg

516

Online

33.0k

Benutzer

83.6k

Themen

1.3m

Beiträge