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
    Murphy 0M
    @martinp Das Problem ist nicht dass der Akku altert. Das Problem ist dass das Relais in der Steuerung (Hyper etc.) alle Minute zwischen Laden und entladen schaltet. Und obendrein noch völlig unnötig, da der Hyper zwischen dem Umschalten 20 Sekunden Pause macht um genau dieses Relais zu schonen. Mein E-Herd pulst wenn er warm ist ca. alle 30 Sekunden. Das kann man nicht sinnvoll steuern wegen der Regelgeschwindigkeit. In dem Skript kann man festlegen ob während dem Pulsen weder geladen noch entladen werden soll, oder man kann festlegen dass z.B. nur geladen oder entladen wird. Dann entfällt auf jeden Fall das Schalten des Relais und die 20 Sekunden Pause fällt auch weg. Ich habe im Haus nur den E-Herd der pulst. Meine anderen großen Verbraucher machen das nicht, gottseidank. Um meine Hardware zu schonen lasse ich sie nicht über jedes Stöckchen springen. Meine Steuerung ist um die Nulleinspeisung mit einer Totzone +- 5 Watt versehen und mit einer Hysterese von +/- 30 Watt. Hier im Zendure Forum https://flarum-eu.zendure.tech/d/18132 oder im Photovoltaikforum https://www.photovoltaikforum.com/thread/241094-zendure-hyper-2000-reaktionszeiten-massiv-verschlechtert/
  • Hilfe für Skripterstellung mit Blockly

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

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

    Verschoben
    6
    0 Stimmen
    6 Beiträge
    1k Aufrufe
    BluefoxB
    @Zipkart: @Jeeper.at: Hallo. Ich denke du meinst folgendes. Wenn du exakt 16:00 vergleichst, dann klappt es normalerweise nicht. Grund ist das im Hintergrund auch Sekunden und evt. Millisekunden abgefragt werden. Und es ist sehr unwahrscheinlich das du da genau vorbeikommst. Frage immer ein Intervall ab. Also Zwischen 16:00 und 16:01 Dann klappt es. Lg Günther ` Hallo Günther. Danke für den Tipp. Das war Genau dass was ich gesucht habe. Somit habe ich Sonnen Problem lösen können, wobei ich es schon etwas umständlich fand. Aber die Lampen schalten nun so zeitlich wie sie sollen. Gesendet von iPhone mit Tapatalk ` Genau dafür gibt es schedule Kommando: https://github.com/ioBroker/ioBroker.ja … e-schedule schedule('0 16 * * *', function () { setState('lampe', true); });
  • Tasterbetrieb mit Node Red

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    3k Aufrufe
    E
    Super danke, das hilft mir weiter
  • Script zum Hochzählen bzw. Rundzählen einer Variable

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    5k Aufrufe
    paul53P
    Timer stoppt man mit clearTimeout(timer) bzw. clearInterval(timer): ... var stateView = 0; var max = 4; var timer = null; function counter() { if(stateView < max) stateView++; else stateView = 0; setState(idView, stateView); } function pushbutton () { if (stateButton0 === true) { stateAuto = false; stateView = 0; if(timer) clearInterval(timer); } else { stateAuto = true; timer = setInterval(counter, 10000); // alle 10 s[ } setState(idAuto, stateAuto); setState(idView, stateView); }
  • [Fixed] Skripte weg

    Verschoben
    6
    1
    0 Stimmen
    6 Beiträge
    1k Aufrufe
    DirkKD
    Hallo Bluefox, kommando zurück, geht wieder alles, war ein aktualiesierungsproblem, trotzdem danke für deine Mühe.
  • [Gelöst] Ordner auslesen und jüngstes File finden

    Verschoben
    7
    0 Stimmen
    7 Beiträge
    2k Aufrufe
    T
    @Jey Cee: Ich bin mir ziemlich sicher das deine pfad angabe nicht wie von FS erwartet ist. Es macht auch einen unterschied ob Windows oder Linux verwendet wird, da die beiden Systeme unterschiedliche Pfad Angaben haben. ` Stimmt! Danke nochmals! Grüße, Torsten
  • IP Cam snapshot per mail

    Verschoben
    9
    0 Stimmen
    9 Beiträge
    3k Aufrufe
    R
    Mal schauen :) :) :)
  • Mit Blockly set state und create state erstellen

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    4k Aufrufe
    rantanplanR
    @charlyphyro: Ich bekomme es hin ein zustand zu erzeugen (createstate). Im Bild deaktviert ist es das "Lichter.an_aus". Wird auch in den Objekten im java angezeigt. Das problem ist nur es zu füllen :?: Wollte eigentlich das beim Prüfen der Lichter in eine Liste erstellt wird welche an sind und welche aus… Habe das jetzt so gelöst :) Aber für die Zukunft wäre es hilfreich :) Viele Grüße Charly Edit: wäre auch nicht schlecht um im vis Beispiel ein: Jqui Button State zu ändern! ` Hallo charlyphyro Wie versprochen, melde ich mich kurz. Deine erzeugten Objekte kannst Du wie alle anderen ioBroker Objekte abfragen und ändern. " steuere Lichter.an_aus mit …..." Wenn Du in einem Baustein die ObjektID anwählst, findest Du "Lichter.an_aus" unter Deiner Javascript-Instanz (z.B. Javasricpt.0) In VIS geht das genauso. Dein "Prüfen Lichter an" kannst Du noch etwas vereinfachen. Du kannst den Zustand der Lampen direkt der Variablen übergeben. "setze Licht Theke auf Wert vom Objekt ID Licht Theke.State" Grüße
  • Sayit Skript startet nicht selbst und hackt Text ab

    Verschoben
    8
    0 Stimmen
    8 Beiträge
    2k Aufrufe
    N
    @pix: Hallo Nordlicht, ich würde die für die beschriebene Aufgabe das Skript auch deutlich kürzen, um so Fehler auszuschließen. Wenn das Skript immer um 15 Uhr startet, dann lass doch das Errechnen der Zeit und vor allem des Datums. Schreib einfach:var ansage = "Hallihallo, es ist schon wieder drei Uhr ....";Dann kannst du alles darüber von//Wochentag ermitteln bis```` mi = d.getMinutes() Gruß Pix ` Hi Pix, danke, ich hab das mal so übernommen und werde sehen was passiert. Wenn in einer Ansage jedoch die Uhrzeit mit dabei sein muss, dann wäre das Skript schon richtig, oder ist es dann trotzdem zu lang? Gruß NordlichtHH
  • Skript zur Prüfung der Erreichbarkeit eines Dienst per Telnet (Port 80)

    Verschoben
    4
    2
    0 Stimmen
    4 Beiträge
    1k Aufrufe
    ruhr70R
    @simpixo: Hallo ruhr70 Wie erstellst du eigentlich diese Eventliste? Sowas hätte ich auch gern… Danke und Gruß Adrian ` Ich habe Skript laufen, welches einen Datenpunkt überwacht. Wenn sich bei dem Datenpunkt etwas ändert, wird die Eventliste den Inhalt des Datenpunks um einen Eintrag erweitert. Skript und Beschreibung, siehe: http://forum.iobroker.net/viewtopic.php … ent#p39480 Dazu gibt es dann ein globales "Skript" event(), damit aus jedem beliebigen Skript ein Ereignis erzeugt werden kann. Das globale "Skript": function event(text) { log("Event: " + text); setState("javascript.0.Ereignisliste.event",text); } Wenn man nun in einem Skript event("ein **neuer** Tag beginnt"); schreibt, wird die Ereignisliste um den Eintrag 05.12. 17:42 ein neuer Tag beginnt erweitert. Man könnte auch mehrere Listen beschreiben. Dann brächte man für jede Liste ein Event-Skript und die globale event() Funktion müsste so erweitert werden, dass man auswählen kann, welche Liste gemeint ist, z.B.: event("Eintrag in die Hauptliste (Default"); event("Eintrag in Liste 1",1); event("Eintrag in Liste Systemereignisse","Systemevents"); Das muss dann halt angepasst werden.
  • Klingel / view umschaltung bei Betätigung… nur wie ?

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    825 Aufrufe
    S
    Hallo Rubi, ich nutze so etwas ähnliches wie du beschreibst. Ich lasse von meiner Klingel eine Variable auf "true" setzen wenn jemand klingelt. Diese nutze ich dann um in meinem "Homeview" ein widget mit dem Inhalt "Es ist jemand an der Haustür" anzeigen zu lassen. Dafür habe ich ein neues VIEW mit den folgenden Widgets erstellt: [{"tpl":"tplHtml","data":{"hm_id":65535,"digits":"","factor":1,"min":0,"max":1,"step":0.01,"html":"Da ist jemand an der Haustür","visibility-cond":"==","visibility-val":1,"refreshInterval":"0","views":["OG","Garten"],"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,"visibility-groups-action":"hide"},"style":{"left":"0px","top":"15px","width":"392px","height":"160px","text-shadow":"","color":"darkred","font-size":"45px","font-family":"Tahoma, Geneva, sans-serif","line-height":"","font-weight":"700","padding":"","text-align":"center"},"widgetSet":"basic"},{"tpl":"tplBasicState","data":{"oid":"hm-rega.0.16791","visibility-cond":"==","visibility-val":1,"gestures-offsetX":0,"gestures-offsetY":0,"value":"false","html":"Schließen","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,"visibility-groups-action":"hide","views":["Wetter"]},"style":{"left":"12px","top":"588px","color":"darkred","width":"370px","height":"44px","font-size":"xx-large","text-align":"center","background":"white","font-weight":"bold","font-family":"Tahoma, Geneva, sans-serif"},"widgetSet":"basic"}] Dann habe ich auf dem Hauptview noch das folgende Widget erstellt: [{"tpl":"tplContainerView","data":{"visibility-cond":"==","visibility-val":"true","gestures-offsetX":0,"gestures-offsetY":0,"contains_view":"Haustuer","visibility-oid":"hm-rega.0.16791","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,"visibility-groups-action":"hide"},"style":{"left":"490px","top":"104px","width":"390px","height":"680px","z-index":"10"},"widgetSet":"basic"}] Ich hoffe das hilft dir schon mal ein wenig in die richtige Richtung die du möchtest. Gruß Sven
  • Triggern von Scripten

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    4k Aufrufe
    P
    Hallo zusammen, wenn ich die Skripte richtig lese, dann wird die Anwesenheit auf CCU2 auf true gesetzt, wenn sich die Anwesenheit auf CCU1 ändert. Also bei jeder Änderung, auch bei Änderung zu false. @hmanfred: CCU1 auf die CCU2 "spiegeln". ` Laut iobroker.javascript-Github readme ist die einfachste Art, zwei States zu synchronisieren doch so (vom ersten zum zweiten State): on("hm-rega.0.41913"/*Anwesend*/, "hm-rega.1.1881"/*Anwesend*/); ````oder für mehr Übersichtlichkeit: var ccu1anwesenheit = "hm-rega.0.41913"/Anwesend/, ccu2anwesenheit = "hm-rega.1.1881"/Anwesend/; on(ccu1anwesenheit, ccu2anwesenheit); Gruß Pix
  • Mein Javascript global und neue Art js-scripte zu schreiben

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    4k Aufrufe
    frankjokeF
    Hallo ruhr! Kein Problem, können/sollen auch sehr wohl Fragen gestellt werden! Man ist ja selbst immer 'betriebsblind'. Nach der kleinen Zwangspause gehts weiter. Habe eins vergessen: Wie schaut ihr welche Node-Version ihr habt? mit node -v geht das ganz leicht. Hatte gestern einen Raspi 3 mit dem neuen Jessie-Image von letzter Woche gestartet und war geschockt dass da noch 0.10.irgendwas dabei war. Das wird in einigen Wochen nicht mehr supported! Um am Raspi (oder anderen Debian Linux) ein neueres node zu installieren lädt man die nodesource mit curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash - oder curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - sudo apt-get install nodejs Die 6er ist die letztgültige Long-Time-Support-Version (Boron). Es gibt auch 7er aber das ist nur für developers da sie nach Erscheinen der 8ter (nächstes halbes Jahr) dann nicht mehr supported werden. Unter Windows rate ich auf https://nodejs.org/de/download/ sich die letzte oder andere Versionen wie 4.6.x dort zu suchen https://nodejs.org/en/download/releases/. Ja, so machen wir mal weiter. In vielen Scripten muss man Variablen anlegen. Ich habe mir das so angewöhnt: function createStates () { "use strict"; // Die Funktion returniert eine Promise damit sie verschachtelt werden kann!, 'use strict' erlaubt verwendung von let usw. _D("Create States"); const states = [ // Ich kreiere eine objekt-Array mit allen zu erzeugenden Objekten { id: alarm, val: false, common: {type: 'boolean',name:alarm, unit: '',role: 'state',write:true}}, { id: alarmPot, val: "", common: {type: 'string',name:alarmPot, unit: '',role: 'state',write:true}}, { id: alarmState, val: 0, common: {type: 'number',name:alarmState, unit: '',role: 'state',write:true,max:2,min:0,states:'0:Aus;1:Nacht;2:Ein'}}, ]; for (let i=0; i<3;i++) // muss 3 Variablem programmatisch anlegen, können ja auch von aussen kommen states.push({ id: dpPfad+'Var_'+i , val: i, common: {type: 'number',name:`${dpPfad}Variable ${i}`, unit: '',role: 'state',write:true}}); return pSeries(states, (item) => pCst(item.id,item.val,item.common,{}).then(() => item.id), 10) // cSt ist die in Promise umgewandelte Form von createState, ruft pSeries ruft es für jedes array-item auf und fügt zwischen den items 10ms Pause ein .then(x => wait(100,_D('end created states:'+_O(x),x))); // am Ende wird die Liste der angelegten ID's ausgegeben und 100ms gewartet } Damit erzeuge ich erstmals ein array von Objekten die die Variablen beschreiben, entweder hard-coded oder programmatisch und dann kreiere ich alle Variablen mittels pSeries. pSeries(iterable, functionPromise, delay) durchläuft die iterable (kann ein Objekt oder Array sein) und ruft functionPromis(item) für jedes item auf. Die Funktion muß eione Promise zurückgeben. Falls delay angegeben wird wird so viele ms gewartet und dann (sonst sofort) das nächste item aufgerufen. der Teil '(item) => pCst(item.id,item.val,item.common,{}).then(() => item.id)' verwendet die umgewandelte createState und gibt eine id and pSeries zurück. pSeries sammelt alle returnbieren Arguimente und wenn es durch ist giebt sie al array zurück. Damit kann '.then(x =>…' dieses Array anzeigen, warten und selbst dann zurückgegeben werden. Am Ende unseres scripts steht die Folge: wait(100) .then(() => createStates()) .then(() => onAnlegen()) // ist ähnlich wie createStates aufgebaut. .then(() => main()) // test functions .catch(error => _W(_O(error))) // war da ein Fehler? .then(() => _I(`Finished Initialization and running ${instanz}${name}`)); Damit wird beim Start des scriptes zuerst 100ms gewartet, dann dies Variablen kreiert, dann onAnlegen ausgeführt, dann main ausgeführte, dann auf eventuellen Fehlern in einigen der vorigen Routinen geprüft und dann die info ausgegeben dass das Script jetzt läuft! Was kann man sonst noch machen? Ich zeig mal ein Beispiel welches fast gleich ich einen Adapter eingeflossen ist (hab dort nur einen cache eingebaut um nicht alle x Sekunden das selbe abzufragen): arp-scan kann unter linux mit sudo apt-get install arp-scan installiert werden uns scannt das lokale Netz nach angeschlossenen/laufenden Geräten. const dns = require('dns'); // inkludiere die 'dns'-funktionen pExec('arp-scan -lgq --retry=10') // rufe arp-scan auf .then(res => res && res.match(/(\d*\.){3}\d*\s*([\dA-F]{2}\:){5}[\dA-F]{2}/gi)) // gib ein Array aus die aus den IP und MAC-Adressen besteht die gefunden wurden .then(res => pSeries(res, item => { // Für jedes gefundene IP/MAC-Paar const s = item.split('\t'); // splitte die IP von der MAC-Adresse, diese sind durch \t getrennt return pGet('http://api.macvendors.com/'+s[1]) // nun prüfe mittels einer web-Api wer der Erzeuge für die HW ist mit dieser Mac-Adresse .then(x => x.trim(), err => 'Vendor not found') // wenn ein Fehler auftritt und der Hersteller nicht gefunden wird gib 'Vendor not found' zurück .then(x => s.push(x) && c2pP(dns.reverse)(s[0])) // hänge an das split array den Herstellernamen an und versuche einen dns.reverse call mit der IP-Adresse um den Namen am lokalen DNS-Server zu erfahren .then(nam => s.concat(nam), err => s.concat(['N/A'])) // Hänge den Namen oder 'N/A' an wenn er nicht gefunden wurde .then(res => res.join('; ')); // Mach aus dem Array ein String mit '; ' getrennt },10)) // warte 10ms nach jedem gefundenen Paar .then(res => pSeries(res,item => _D(_O(item),Promise.resolve()))); // Zeig alle Ergebnisse an. Promise.resolve returniert eine Promise die sofort 'Erfolg' bestätigt. Warum verwende ich lieber const/let? Es reduziert die Proigrammierfehler! Mit const s = xxx sag ich dass ich s diesen Block definiere und es nicht neu zugewiesen werden darf. Mit s.push() kann ich den Inhalt veändern aber ich darf s nich mit s = x neu zuweisen. Mit let definiert man variablen die auch nur in diesem Block gültig sind, also ist `var k = [1,2,3]; for (let i in k) { let j = k[i]; for(let k of [11,22,33]) _D(`${k}:${j}`); } _D(k);` immer eine neue Variable i,j und k und das 'var k' bleibt so wie es ist. Aber Vorsicht: Wenn ihr Node Version 4.x oder darunter (0.12) verwendet ist let nur anwendbar wenn '"use strict";' auf Funktionslevel angewendet wird. Wenn ihr Version 6.9.x verwendet (die momentane Note-LTS = Long Time Support-Version) dann ist let auch im gesamten schript ohne '"use strict";' möglich. In einer weiteren Folge weden wir dann einige weiteren Tricks beleuchten! Liebe Grüße Frank[/i]
  • Scriptersatz für direkte Verknüpfung in iobroker?

    Verschoben
    9
    0 Stimmen
    9 Beiträge
    2k Aufrufe
    B
    Naja, da sind deiner Logik keine Grenzen gesetzt. Gäste, Abwesenheit usw sind Variablen die abgeprüft werden. Morgens hoch hängt davon ab wie die realen Lichtverhältnisse sind (Bewegungsmelder oder Lichtsensor außen), abends automatisch runter mögen wir nicht. Drücken beim Schlafen gehen eine zentrale Taste. Laufen lasse ich alles auf der CCU, dafür ist sie da und das funktioniert auch alles. Zu den Berechnungen gibt's im Homematic Forum viele Threads. Das Tageszeiten Script würde ich noch empfehlen. Das gliedert den Tag abhängig von Sonnen auf / Untergang ganz sinnvoll. Grüße Brati von unterwegs gesendet.
  • Optimaler Umgang mit Request Fehlern

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    2k Aufrufe
    blauholstenB
    Hi, Hier ist Recht gut beschrieben warum das mit try…Catch nicht funktioniert. <url url="http://m.heise.de/developer/artikel/Einfuehrung-in-die-asynchrone-JavaScript-Programmierung-2752531.html">~~[http://m.heise.de/developer/artikel/Einfuehrung-in-die-asynchrone-JavaScript-Programmierung-2752531.html" target="_blank">](</s><LINK_TEXT text=)~~ [<link_text text=" http://m.heise.de/developer/artikel/Ei … 52531.html">http://m.heise.de/developer/artikel/Einfuehrung-in-die-asynchrone-JavaScript-Programmierung-2752531.html</link_text>](</s><LINK_TEXT text=)</url>
  • Durchschnittswerte errechnen

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    899 Aufrufe
    paul53P
    Du kannst sicherlich die Energiewerte (Einspeisung, Verbrauch) täglich zu einer festen Uhrzeit (schedule) abfragen. Die durchschnittliche Leistung eines Tages lässt sich daraus einfach berechnen: 24-h-Durchschnitts-Leistung = (Energie_heute - Energie_gestern) / 24 h
  • Suche einige Funktionen.

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    653 Aufrufe
    eric2905E
    Hi, @ThomasD: Danke erst einmal, aber wie führe ich die Kommandos im Javascript aus? ` einmal die Suche genutzt und schon was passendes gefunden ;-) http://forum.iobroker.net/viewtopic.php?t=3228 Gruß, Eric
  • [erledigt]Zeichenkette zerlegen

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    761 Aufrufe
    blauholstenB
    Hi, danke für deine schnelle Antwort. Hatte das mit dem Objekt Zugriff auch schon vorhin probiert. Aber das mit dem // Falls es ein JSON-string ist ist mir nicht eingefallen, darum ging es nicht. :oops: DANKE NOCHMAL
  • String in 2 Variable/Objekte

    Verschoben
    7
    0 Stimmen
    7 Beiträge
    4k Aufrufe
    M
    Danke für die ausführliche Antwort, hatte die Anzahl der Ausgänge nur auf 2 erhöht. Werde das heute Abend nochmal versuchen. Gruß Micha Gesendet von iPhone mit Tapatalk
  • Fritzbox bedienen

    Verschoben
    6
    0 Stimmen
    6 Beiträge
    2k Aufrufe
    L
    Morgen, Hat jemand schon ne Möglichkeit gefunden die Anrufliste im der Fritzbox per HTTP zu löschen? Oder per Command im TR064 Adapter? Mfg Sven
  • Widget Bars Filter

    Verschoben
    6
    0 Stimmen
    6 Beiträge
    2k Aufrufe
    M
    Ich habe es wie PIX es bereits beschrieben hat mit 5 Views übereinander realisiert. Ich habe eine Standard View "3". Sollte eine Kamera eine Bewegung fest stellen ändert sich der Wert einer Variablen und das einsprechende View wird sichtbar. Nach zwei Minuten wird dann wieder auf die Standardview umgeschaltet. Läuft sehr gut. Ein Tip vielleicht noch: Im Vis unter Setup habe die Einstellung "Löschen aus RAM nicht aktive Views: nie" gesetzt. Sonst passiert es das auf eine View geschaltet wird und du hast zuerst ein "leeres Bild". Gruß Michael [image: 326_unbenannt.jpg]

435

Online

33.0k

Benutzer

83.6k

Themen

1.3m

Beiträge