From 9ce95cc4bb6bbbe89ffae22cd8665d4106a3ec8c Mon Sep 17 00:00:00 2001 From: Michael Scheidel Date: Sat, 27 Dec 2025 19:10:31 +0100 Subject: [PATCH] Dateien nach "workflow/n8n/workflows" hochladen --- workflow/n8n/workflows/CMI Canbus.json | 273 +++++++++++++++++++++++++ 1 file changed, 273 insertions(+) create mode 100644 workflow/n8n/workflows/CMI Canbus.json diff --git a/workflow/n8n/workflows/CMI Canbus.json b/workflow/n8n/workflows/CMI Canbus.json new file mode 100644 index 0000000..8b42968 --- /dev/null +++ b/workflow/n8n/workflows/CMI Canbus.json @@ -0,0 +1,273 @@ +{ + "name": "CMI Canbus", + "nodes": [ + { + "parameters": { + "rule": { + "interval": [ + { + "field": "minutes" + } + ] + } + }, + "type": "n8n-nodes-base.scheduleTrigger", + "typeVersion": 1.2, + "position": [ + -672, + 288 + ], + "id": "dcd1c622-b477-485f-8d04-ea672a82ad4d", + "name": "Schedule Trigger" + }, + { + "parameters": { + "url": "http://192.168.2.186/INCLUDE/devpagex.cgi?pagex2=01025800&_=1759560490401", + "authentication": "genericCredentialType", + "genericAuthType": "httpBasicAuth", + "sendQuery": true, + "queryParameters": { + "parameters": [ + { + "name": "admin", + "value": "admin" + } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [ + -448, + 288 + ], + "id": "a6b369cd-d21d-4da7-8480-30e1f30f824b", + "name": "get Data from CMI Interface local", + "credentials": { + "httpBasicAuth": { + "id": "iJkXePPAceSyENTx", + "name": "CMI CAN Bus local" + } + } + }, + { + "parameters": { + "jsCode": "// INPUT: items = [{ json: { data: \"
...\" } }]\n// OUTPUT: [{ json: { flat, units, items } }]\n\nfunction parseValue(raw) {\n if (!raw) return { value: null, unit: null, state: null, on: null };\n const t = raw.trim().replace(/ /g, ' ');\n if (/^(AUS|OFF|EIN|ON)$/i.test(t)) {\n return { value: null, unit: null, state: t.toUpperCase(), on: /^(EIN|ON)$/i.test(t) };\n }\n const m = t.match(/-?\\d+(?:[.,]\\d+)?/);\n const value = m ? parseFloat(m[0].replace(',', '.')) : null;\n const unit = m ? t.replace(m[0], '').trim() : null;\n return { value, unit: unit || null, state: null, on: null };\n}\n\nfunction toKey(label) {\n return label\n .normalize('NFD').replace(/[\\u0300-\\u036f]/g, '')\n .replace(/ä/g,'ae').replace(/ö/g,'oe').replace(/ü/g,'ue')\n .replace(/Ä/g,'Ae').replace(/Ö/g,'Oe').replace(/Ü/g,'Ue')\n .replace(/ß/g,'ss')\n .replace(/[^A-Za-z0-9]+/g,'_')\n .replace(/^_+|_+$/g,'');\n}\n\n// 1) HTML aus allen Eingangs-Items zusammenführen (meist ist es nur eines)\nconst html = items.map(i => i.json?.data ?? i.json?.body ?? i.json?.html ?? '').join('\\n');\n\n// 2) BOXEN parsen\nconst re = /
[\\s\\S]*?
(\\d+):\\s*([^<]+)<\\/div>(?:[\\s\\S]*?
\\s*
([^<]*)<\\/div>\\s*<\\/div>)?/g;\n\nconst parsed = [];\nfor (const m of html.matchAll(re)) {\n const index = Number(m[1]);\n const label = m[2].trim();\n const raw = (m[3] ?? '').trim() || null;\n const { value, unit, state, on } = parseValue(raw);\n const key = `${String(index).padStart(2,'0')}_${toKey(label)}`;\n parsed.push({ index, label, key, raw, value, unit, state, on });\n}\n\n// 3) Kompaktes Objekt + Einheiten-Mapping bauen\nconst flat = {};\nconst units = {};\nfor (const p of parsed) {\n flat[p.key] = (p.value ?? p.state ?? p.raw ?? null);\n if (p.unit) units[p.key] = p.unit;\n}\n\n// 4) Ein einziges Ergebnis-Item zurückgeben\nreturn [{ json: { flat, units, items: parsed } }];\n" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + -224, + 288 + ], + "id": "509329e8-02f5-473f-a09c-f334bc441340", + "name": "transfer data to readable format" + }, + { + "parameters": { + "url": "http://192.168.2.68:8093/v1/state/0_userdata.0.haus.heizung.pelletheizung.hot_water_temperature", + "sendQuery": true, + "queryParameters": { + "parameters": [ + { + "name": "value", + "value": "={{ $('transfer data to readable format').item.json.flat['08_unbenutzt']" + } + ] + }, + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "value", + "value": "={{ $('transfer data to readable format').item.json.flat['08_unbenutzt'] }}" + } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [ + 0, + 384 + ], + "id": "ee3b68e3-7b85-41c8-9a2d-276e8bb8da17", + "name": "set Warmwasser Temperatur" + }, + { + "parameters": { + "url": "http://192.168.2.68:8093/v1/state/0_userdata.0.haus.heizung.pelletheizung.heating_circuit_temperature", + "sendQuery": true, + "queryParameters": { + "parameters": [ + { + "name": "value", + "value": "={{ $('transfer data to readable format').item.json.flat['03_unbenutzt'] }}" + } + ] + }, + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "value", + "value": "={{ $('transfer data to readable format').item.json.flat['03_unbenutzt'] }}" + } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [ + 0, + 576 + ], + "id": "5b95f25f-a896-46ef-a455-cb915a76b388", + "name": "set Heizkreis Temperatur" + }, + { + "parameters": { + "url": "http://192.168.2.68:8093/v1/state/0_userdata.0.haus.heizung.pelletheizung.heat_pump_consumption", + "sendQuery": true, + "queryParameters": { + "parameters": [ + { + "name": "value", + "value": "={{ $json.flat['16_Stromzahler_WP'] }}" + } + ] + }, + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "value", + "value": "={{ $json.flat['16_Stromzahler_WP'] }}" + } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [ + 0, + 192 + ], + "id": "52d65947-58f8-423d-a746-ba108d74dd06", + "name": "set Verbrauch Waermepumpe" + }, + { + "parameters": { + "url": "http://192.168.2.68:8093/v1/state/0_userdata.0.haus.heizung.outer_temperature", + "sendQuery": true, + "queryParameters": { + "parameters": [ + { + "name": "value", + "value": "={{ $json.flat['06_T_Aussen'] }}" + } + ] + }, + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "value", + "value": "={{ $json.flat['06_T_Aussen'] }}" + } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [ + 0, + 0 + ], + "id": "e895b3a4-620c-4623-9267-6cab2d353f50", + "name": "set outer temperature" + } + ], + "pinData": {}, + "connections": { + "Schedule Trigger": { + "main": [ + [ + { + "node": "get Data from CMI Interface local", + "type": "main", + "index": 0 + } + ] + ] + }, + "get Data from CMI Interface local": { + "main": [ + [ + { + "node": "transfer data to readable format", + "type": "main", + "index": 0 + } + ] + ] + }, + "transfer data to readable format": { + "main": [ + [ + { + "node": "set Warmwasser Temperatur", + "type": "main", + "index": 0 + }, + { + "node": "set Verbrauch Waermepumpe", + "type": "main", + "index": 0 + }, + { + "node": "set Heizkreis Temperatur", + "type": "main", + "index": 0 + }, + { + "node": "set outer temperature", + "type": "main", + "index": 0 + } + ] + ] + } + }, + "active": true, + "settings": { + "executionOrder": "v1", + "timeSavedMode": "fixed", + "callerPolicy": "workflowsFromSameOwner", + "availableInMCP": false + }, + "versionId": "ff580cc5-a6c7-49be-8ac9-7a607d4537ed", + "meta": { + "instanceId": "3cc6c4256e2bbdec1b3708c49dc3889c7266357f3e239651c157c2de760e6c65" + }, + "id": "ygJYiiFM97WiWeY5", + "tags": [ + { + "updatedAt": "2025-12-20T20:03:34.739Z", + "createdAt": "2025-12-20T20:03:34.739Z", + "id": "i5rtQijMRj2sx5Zj", + "name": "Heizung" + }, + { + "updatedAt": "2025-12-20T19:56:59.512Z", + "createdAt": "2025-12-20T19:56:59.512Z", + "id": "9G8OthZJpXo6BPbV", + "name": "Smart Home" + } + ] +} \ No newline at end of file