From c8f709f863b24711310dcce12805a22bc4419735 Mon Sep 17 00:00:00 2001 From: Michael Scheidel Date: Sat, 27 Dec 2025 19:16:04 +0100 Subject: [PATCH] Dateien nach "workflow/Heizung" hochladen --- workflow/Heizung/CMI Canbus.json | 273 +++++++++ .../Pelletheizung_ Abfrage Kessel.json | 195 ++++++ .../Pelletheizung_ Abfrage Verbrauch.json | 461 ++++++++++++++ .../Wasser_ Abfrage Verbrauch (2).json | 538 ++++++++++++++++ .../Heizung/Wärmepumpe_ Tagesverbrauch.json | 576 ++++++++++++++++++ 5 files changed, 2043 insertions(+) create mode 100644 workflow/Heizung/CMI Canbus.json create mode 100644 workflow/Heizung/Pelletheizung_ Abfrage Kessel.json create mode 100644 workflow/Heizung/Pelletheizung_ Abfrage Verbrauch.json create mode 100644 workflow/Heizung/Wasser_ Abfrage Verbrauch (2).json create mode 100644 workflow/Heizung/Wärmepumpe_ Tagesverbrauch.json diff --git a/workflow/Heizung/CMI Canbus.json b/workflow/Heizung/CMI Canbus.json new file mode 100644 index 0000000..8b42968 --- /dev/null +++ b/workflow/Heizung/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 diff --git a/workflow/Heizung/Pelletheizung_ Abfrage Kessel.json b/workflow/Heizung/Pelletheizung_ Abfrage Kessel.json new file mode 100644 index 0000000..6ecd2bc --- /dev/null +++ b/workflow/Heizung/Pelletheizung_ Abfrage Kessel.json @@ -0,0 +1,195 @@ +{ + "name": "Pelletheizung: Abfrage Kessel", + "nodes": [ + { + "parameters": { + "url": "https://stokercloud.dk/v16bckbeta/dataout2/controllerdata2.php?screen=b1,0,b2,5,b3,4,b4,6,b5,12,b6,14,b7,15,b8,16,b9,9,b10,0,d1,3,d2,4,d3,0,d4,0,d5,0,d6,0,d7,0,d8,0,d9,0,d10,0,h1,2,h2,3,h3,4,h4,7,h5,8,h6,1,h7,5,h8,13,h9,0,h10,0,w1,2,w2,3,w3,9,w4,0,w5,0&token=958f4bcf6d8251da548e773176ca0925ff7840bdce7daeb8bcf72f00cf5201087fd760aeae882f66729695445feb8bbd55307f9279da03ae211ce9e4dd5229f7e950b3008574b55ea095001693fa7765fe09a1ab6553a3a8d8e70a4cb1916d43", + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [ + -224, + 192 + ], + "id": "ae5635a9-5b88-485d-8d46-b20bee634452", + "name": "get Values from Stokercloud" + }, + { + "parameters": { + "url": "http://192.168.2.68:8093/v1/state/0_userdata.0.haus.heizung.pelletheizung.boiler_temperature", + "sendQuery": true, + "queryParameters": { + "parameters": [ + { + "name": "value", + "value": "={{ $json.frontdata[1].value }}" + } + ] + }, + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "value", + "value": "={{ $json.frontdata[1].value }}" + } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [ + 0, + 0 + ], + "id": "23782057-3c0d-4a49-b475-d74abcc4a459", + "name": "set boiler temperature" + }, + { + "parameters": { + "url": "http://192.168.2.68:8093/v1/state/0_userdata.0.haus.heizung.pelletheizung.boiler_power", + "sendQuery": true, + "queryParameters": { + "parameters": [ + { + "name": "value", + "value": "={{ $json.boilerdata[1].value }}" + } + ] + }, + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "value", + "value": "={{ $json.boilerdata[1].value }}" + } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [ + 0, + 192 + ], + "id": "eaffbad5-8bb2-484a-8cd5-34fca3c97f23", + "name": "set boiler power" + }, + { + "parameters": { + "rule": { + "interval": [ + { + "field": "minutes" + } + ] + } + }, + "type": "n8n-nodes-base.scheduleTrigger", + "typeVersion": 1.2, + "position": [ + -448, + 192 + ], + "id": "6f6781a6-95fa-4ad7-991d-deb66d86be90", + "name": "Trigger 5 minutes" + }, + { + "parameters": { + "url": "http://192.168.2.68:8093/v1/state/0_userdata.0.haus.heizung.pelletheizung.boiler_power_kw", + "sendQuery": true, + "queryParameters": { + "parameters": [ + { + "name": "value", + "value": "={{ $json.boilerdata[0].value }}" + } + ] + }, + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "value", + "value": "={{ $json.boilerdata[0].value }}" + } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [ + 0, + 384 + ], + "id": "7826f720-ad10-487c-95b3-6b21a74c2284", + "name": "set boiler power kw" + } + ], + "pinData": {}, + "connections": { + "get Values from Stokercloud": { + "main": [ + [ + { + "node": "set boiler temperature", + "type": "main", + "index": 0 + }, + { + "node": "set boiler power", + "type": "main", + "index": 0 + }, + { + "node": "set boiler power kw", + "type": "main", + "index": 0 + } + ] + ] + }, + "Trigger 5 minutes": { + "main": [ + [ + { + "node": "get Values from Stokercloud", + "type": "main", + "index": 0 + } + ] + ] + } + }, + "active": true, + "settings": { + "executionOrder": "v1", + "timeSavedMode": "fixed", + "callerPolicy": "workflowsFromSameOwner", + "availableInMCP": false + }, + "versionId": "4d76bfdb-5d2c-4eae-8d58-14d28cb18a7d", + "meta": { + "instanceId": "3cc6c4256e2bbdec1b3708c49dc3889c7266357f3e239651c157c2de760e6c65" + }, + "id": "L5LZdEzKKQZWaHMd", + "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 diff --git a/workflow/Heizung/Pelletheizung_ Abfrage Verbrauch.json b/workflow/Heizung/Pelletheizung_ Abfrage Verbrauch.json new file mode 100644 index 0000000..d6a872b --- /dev/null +++ b/workflow/Heizung/Pelletheizung_ Abfrage Verbrauch.json @@ -0,0 +1,461 @@ +{ + "name": "Pelletheizung: Abfrage Verbrauch", + "nodes": [ + { + "parameters": { + "url": "https://stokercloud.dk/v16bckbeta/dataout2/controllerdata2.php?screen=b1,0,b2,5,b3,4,b4,6,b5,12,b6,14,b7,15,b8,16,b9,9,b10,0,d1,3,d2,4,d3,0,d4,0,d5,0,d6,0,d7,0,d8,0,d9,0,d10,0,h1,2,h2,3,h3,4,h4,7,h5,8,h6,1,h7,5,h8,13,h9,0,h10,0,w1,2,w2,3,w3,9,w4,0,w5,0&token=958f4bcf6d8251da548e773176ca0925ff7840bdce7daeb8bcf72f00cf5201087fd760aeae882f66729695445feb8bbd55307f9279da03ae211ce9e4dd5229f7e950b3008574b55ea095001693fa7765fe09a1ab6553a3a8d8e70a4cb1916d43", + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [ + -224, + 288 + ], + "id": "c09de7e8-760d-4716-a908-382d43c2258a", + "name": "HTTP Request" + }, + { + "parameters": { + "chatId": "749279624", + "text": "=Der aktuelle Füllstand des Pelletsilos beträgt {{ $('HTTP Request').item.json.hopperdata[5].value }} kg. Der heutige Verbrauch liegt bei {{ $('HTTP Request').item.json.hopperdata[1].value }} kg.", + "additionalFields": {} + }, + "type": "n8n-nodes-base.telegram", + "typeVersion": 1.2, + "position": [ + 224, + 576 + ], + "id": "953efaeb-f1e5-4515-b58a-46cbc6b72fbc", + "name": "Telegram", + "webhookId": "ddd87e24-21a8-4037-a549-8991f0c31d97", + "credentials": { + "telegramApi": { + "id": "EUy2hT71fSdnEr2w", + "name": "Telegram account" + } + }, + "disabled": true + }, + { + "parameters": { + "operation": "upsert", + "table": { + "__rl": true, + "value": "Pellets", + "mode": "list", + "cachedResultName": "Pellets" + }, + "dataMode": "defineBelow", + "columnToMatchOn": "Datum", + "valueToMatchOn": "={{ $now.toFormat('yyyy-MM-dd')}}", + "valuesToSend": { + "values": [ + { + "column": "Datum", + "value": "={{ $now.toFormat('yyyy-MM-dd')}}" + }, + { + "column": "Fuellstand", + "value": "={{ $json.hopperdata[5].value }}" + }, + { + "column": "Pellets Verbrauch [kg]", + "value": "={{ $json.hopperdata[1].value }}" + } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.mySql", + "typeVersion": 2.4, + "position": [ + 0, + 576 + ], + "id": "25651cad-8917-4aff-a0e7-9aff0dd9352f", + "name": "MySQL", + "credentials": { + "mySql": { + "id": "GvOnFzLTFlbKtgUM", + "name": "MySQL account - homelab" + } + } + }, + { + "parameters": { + "url": "http://192.168.2.68:8093/v1/state/0_userdata.0.haus.heizung.pelletheizung.pellet_fuellstand_silo", + "sendQuery": true, + "queryParameters": { + "parameters": [ + { + "name": "value", + "value": "={{ $json.hopperdata[5].value }}" + } + ] + }, + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "value", + "value": "={{ $json.hopperdata[5].value }}" + } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [ + 0, + 384 + ], + "id": "d365485b-573f-4a41-b139-81d64160cd58", + "name": "schreibe Füllstand Silo" + }, + { + "parameters": { + "url": "http://192.168.2.68:8093/v1/state/0_userdata.0.haus.heizung.pelletheizung.pellet_verbrauch_tag", + "sendQuery": true, + "queryParameters": { + "parameters": [ + { + "name": "value", + "value": "={{ $json.hopperdata[1].value }}" + } + ] + }, + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "value", + "value": "={{ $json.hopperdata[5].value }}" + } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [ + 0, + 192 + ], + "id": "2111a02b-c534-4d47-85c2-0df590f91cb4", + "name": "schreibe Verbrauch 24h" + }, + { + "parameters": { + "rule": { + "interval": [ + { + "triggerAtHour": 23, + "triggerAtMinute": 59 + } + ] + } + }, + "type": "n8n-nodes-base.scheduleTrigger", + "typeVersion": 1.2, + "position": [ + -448, + 384 + ], + "id": "6aa9d692-e5c7-488e-a9cd-c9999852fa59", + "name": "Trigger 23:59" + }, + { + "parameters": { + "rule": { + "interval": [ + { + "field": "minutes", + "minutesInterval": 30 + } + ] + } + }, + "type": "n8n-nodes-base.scheduleTrigger", + "typeVersion": 1.2, + "position": [ + -448, + 192 + ], + "id": "9f19dd5b-d172-4668-9325-829f8278fdec", + "name": "Trigger 30 minutes" + }, + { + "parameters": { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "loose", + "version": 2 + }, + "conditions": [ + { + "id": "b00d73a4-b3aa-496e-9730-fb3110944925", + "leftValue": "={{ $('HTTP Request').item.json.hopperdata[5].value }}", + "rightValue": 1000, + "operator": { + "type": "number", + "operation": "lt" + } + } + ], + "combinator": "and" + }, + "looseTypeValidation": true, + "options": {} + }, + "type": "n8n-nodes-base.if", + "typeVersion": 2.2, + "position": [ + 224, + 384 + ], + "id": "a091b1e3-bad8-4e2a-9fa5-3892fa8eb3d9", + "name": "If1" + }, + { + "parameters": { + "fromEmail": "pelletlager@scheidel.biz", + "toEmail": "michael.scheidel@scheidel.biz", + "subject": "=Es ist Zeit Pellets nachzubestellen. Stand: {{ $('HTTP Request').item.json.hopperdata[5].value }} kg", + "html": "=Der aktuelle Silostand liegt bei {{ $('HTTP Request').item.json.hopperdata[5].value }} kg. Es ist Zeit nachzubestllen", + "options": {} + }, + "type": "n8n-nodes-base.emailSend", + "typeVersion": 2.1, + "position": [ + 448, + 384 + ], + "id": "7f87bdc8-a659-401a-9d92-8751587aded2", + "name": "Send email", + "webhookId": "3ea799df-e2df-4291-a530-7534fd6edd34", + "credentials": { + "smtp": { + "id": "wgI3pOhkySCL5ngP", + "name": "SMTP account" + } + } + }, + { + "parameters": { + "url": "http://192.168.2.68:8093/v1/state/0_userdata.0.haus.heizung.pelletheizung.connection_status", + "sendQuery": true, + "queryParameters": { + "parameters": [ + { + "name": "value", + "value": "={{ $json.notconnected }}" + } + ] + }, + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "value", + "value": "={{ $json.notconnected }}" + } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [ + 0, + 0 + ], + "id": "3859cbb8-e79d-4852-8dec-735d725e5c8e", + "name": "schreibe connection_staus" + }, + { + "parameters": { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "loose", + "version": 2 + }, + "conditions": [ + { + "id": "d887854d-7feb-480e-8adc-d8352db92ef2", + "leftValue": "={{ $json.val }}", + "rightValue": 0, + "operator": { + "type": "number", + "operation": "notEquals" + } + } + ], + "combinator": "and" + }, + "looseTypeValidation": true, + "options": {} + }, + "type": "n8n-nodes-base.if", + "typeVersion": 2.2, + "position": [ + 224, + 0 + ], + "id": "4668bc29-c9f1-4820-980f-f0f999887da9", + "name": "If2" + }, + { + "parameters": { + "chatId": "749279624", + "text": "=Die Netzverbindung zur Heizung ist unterbrochen!", + "additionalFields": {} + }, + "type": "n8n-nodes-base.telegram", + "typeVersion": 1.2, + "position": [ + 448, + 0 + ], + "id": "741ca3bb-f78c-4027-ac72-4f9220b1bd91", + "name": "Telegram1", + "webhookId": "ddd87e24-21a8-4037-a549-8991f0c31d97", + "credentials": { + "telegramApi": { + "id": "EUy2hT71fSdnEr2w", + "name": "Telegram account" + } + } + } + ], + "pinData": {}, + "connections": { + "HTTP Request": { + "main": [ + [ + { + "node": "MySQL", + "type": "main", + "index": 0 + }, + { + "node": "schreibe Füllstand Silo", + "type": "main", + "index": 0 + }, + { + "node": "schreibe Verbrauch 24h", + "type": "main", + "index": 0 + }, + { + "node": "schreibe connection_staus", + "type": "main", + "index": 0 + } + ] + ] + }, + "MySQL": { + "main": [ + [ + { + "node": "Telegram", + "type": "main", + "index": 0 + } + ] + ] + }, + "schreibe Füllstand Silo": { + "main": [ + [ + { + "node": "If1", + "type": "main", + "index": 0 + } + ] + ] + }, + "Trigger 23:59": { + "main": [ + [ + { + "node": "HTTP Request", + "type": "main", + "index": 0 + } + ] + ] + }, + "Trigger 30 minutes": { + "main": [ + [ + { + "node": "HTTP Request", + "type": "main", + "index": 0 + } + ] + ] + }, + "If1": { + "main": [ + [ + { + "node": "Send email", + "type": "main", + "index": 0 + } + ] + ] + }, + "schreibe connection_staus": { + "main": [ + [ + { + "node": "If2", + "type": "main", + "index": 0 + } + ] + ] + }, + "If2": { + "main": [ + [ + { + "node": "Telegram1", + "type": "main", + "index": 0 + } + ] + ] + } + }, + "active": true, + "settings": { + "executionOrder": "v1" + }, + "versionId": "ef221069-21a2-4c44-b925-b20fb23cf4a4", + "meta": { + "templateCredsSetupCompleted": true, + "instanceId": "3cc6c4256e2bbdec1b3708c49dc3889c7266357f3e239651c157c2de760e6c65" + }, + "id": "t3q9pyWyzAdiHiyl", + "tags": [ + { + "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 diff --git a/workflow/Heizung/Wasser_ Abfrage Verbrauch (2).json b/workflow/Heizung/Wasser_ Abfrage Verbrauch (2).json new file mode 100644 index 0000000..d4615dd --- /dev/null +++ b/workflow/Heizung/Wasser_ Abfrage Verbrauch (2).json @@ -0,0 +1,538 @@ +{ + "name": "Wasser: Abfrage Verbrauch", + "nodes": [ + { + "parameters": { + "triggerTimes": { + "item": [ + { + "hour": 23, + "minute": 59 + } + ] + } + }, + "id": "561d1d2d-fac6-4d96-a2df-663a619aeda2", + "name": "Daily Trigger", + "type": "n8n-nodes-base.cron", + "typeVersion": 1, + "position": [ + 1648, + 448 + ] + }, + { + "parameters": { + "operation": "upsert", + "table": { + "__rl": true, + "value": "Wasser", + "mode": "list", + "cachedResultName": "Wasser" + }, + "dataMode": "defineBelow", + "columnToMatchOn": "Datum", + "valueToMatchOn": "={{ $now.toFormat('yyyy-MM-dd')}}", + "valuesToSend": { + "values": [ + { + "column": "Verbrauch", + "value": "={{ $json.val }}" + } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.mySql", + "typeVersion": 2.4, + "position": [ + 2096, + 352 + ], + "id": "a1ebe79e-110a-433f-ad4a-5f4f0064a76e", + "name": "update data to homelab \"Wasser\"", + "credentials": { + "mySql": { + "id": "GvOnFzLTFlbKtgUM", + "name": "MySQL account - homelab" + } + } + }, + { + "parameters": { + "url": "http://192.168.2.68:8093/v1/state/0_userdata.0.haus.wasser.zaehlerstand.aktuell", + "sendQuery": true, + "queryParameters": { + "parameters": [ + { + "name": "value", + "value": "={{ $json['Abgelesener Zählerstand'] }}" + } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [ + 1424, + 352 + ], + "id": "ecea6f2f-5db3-4be3-8584-f8c0f83329ff", + "name": "HTTP Request set_zahlerstand" + }, + { + "parameters": { + "url": "http://192.168.2.68:8093/v1/state/sourceanalytix.0.0_userdata__0__haus__wasser__verbrauch__2025.currentYear.consumed.01_currentDay/subscribe?method=polling", + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [ + 1872, + 352 + ], + "id": "d12d4357-f936-4642-ad2b-847f1971ddc8", + "name": "get vebrauch/tag via http request" + }, + { + "parameters": { + "formTitle": "Aktualisiere Zählerstand Wasser", + "formFields": { + "values": [ + { + "fieldLabel": "Abgelesener Zählerstand", + "fieldType": "number", + "requiredField": true + } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.formTrigger", + "typeVersion": 2.2, + "position": [ + 1200, + 352 + ], + "id": "f6552cf5-f2d8-4acc-871e-2641bacaee16", + "name": "On form submission", + "webhookId": "dfcbaead-1bae-429e-87f9-2ef05ede4c1b" + }, + { + "parameters": {}, + "type": "n8n-nodes-base.wait", + "typeVersion": 1.1, + "position": [ + 1648, + 256 + ], + "id": "05cece8c-fd2a-4ee7-8293-77c986c990f6", + "name": "Wait", + "webhookId": "e6ff339c-03cc-4b01-8b04-c63fc292d787" + }, + { + "parameters": { + "path": "c599093d-5857-4a17-af99-837210d3b258", + "options": { + "binaryPropertyName": "value" + } + }, + "type": "n8n-nodes-base.webhook", + "typeVersion": 2, + "position": [ + 64, + 256 + ], + "id": "226e5bd3-686c-4306-94c5-afb7396799a1", + "name": "Webhook", + "webhookId": "c599093d-5857-4a17-af99-837210d3b258" + }, + { + "parameters": { + "promptType": "define", + "text": "=Passe das bild an so dass man wert eindeutig erkennen kann. danach gibst du mir nur den wert im format xxx.xxx zurück, kein zusätzlicher Text! Wenn der ermittelte Wert kleiner als {{ $json.val }} ist, dann gib den Wert {{ $json.val }} zurück. ", + "options": {} + }, + "type": "@n8n/n8n-nodes-langchain.agent", + "typeVersion": 2, + "position": [ + 736, + 160 + ], + "id": "eb8a9ee9-57d9-4cf3-8c7f-2bb3fd2636df", + "name": "AI Agent", + "alwaysOutputData": false + }, + { + "parameters": { + "model": { + "__rl": true, + "value": "chatgpt-4o-latest", + "mode": "list", + "cachedResultName": "chatgpt-4o-latest" + }, + "options": {} + }, + "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi", + "typeVersion": 1.2, + "position": [ + 800, + 384 + ], + "id": "dc33f2a4-29df-45f8-a5f0-44c0f87901d5", + "name": "OpenAI Chat Model", + "credentials": { + "openAiApi": { + "id": "Xx2EBW5wfs9Rj7ma", + "name": "OpenAi account" + } + } + }, + { + "parameters": { + "rule": { + "interval": [ + { + "field": "minutes", + "minutesInterval": 30 + } + ] + } + }, + "type": "n8n-nodes-base.scheduleTrigger", + "typeVersion": 1.2, + "position": [ + 64, + 64 + ], + "id": "31c4c63e-17a1-44b2-bf2e-39616bc9d975", + "name": "Schedule Trigger" + }, + { + "parameters": { + "url": "http://192.168.2.68:8093/v1/state/0_userdata.0.haus.wasser.zaehlerstand.aktuell", + "sendQuery": true, + "queryParameters": { + "parameters": [ + { + "name": "value", + "value": "={{ $json.output }}" + } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [ + 288, + 160 + ], + "id": "e46fbeb6-5986-4aaa-a8b2-a6530503181e", + "name": "get zaehlerstand aktuell" + }, + { + "parameters": { + "url": "http://192.168.2.68:8093/v1/state/0_userdata.0.haus.wasser.zaehlerstand.aktuell", + "sendQuery": true, + "queryParameters": { + "parameters": [ + { + "name": "value", + "value": "={{ $json.output }}" + } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [ + 1424, + 160 + ], + "id": "8279f731-f448-414d-89d7-b40a0bc69475", + "name": "write zaehlerstand new" + }, + { + "parameters": { + "chatId": "749279624", + "text": "=Der Wasserverbrauch am {{ $now.toFormat('dd.MM.yyyy')}} liegt aktuell bei {{ $('get vebrauch/tag via http request').item.json.val }}m³.", + "additionalFields": {} + }, + "type": "n8n-nodes-base.telegram", + "typeVersion": 1.2, + "position": [ + 2320, + 352 + ], + "id": "5db04ba0-de8d-4753-91a9-87808c298cef", + "name": "Send a text message", + "webhookId": "7ca1953d-706e-4850-aabb-677b554c7b62", + "disabled": true + }, + { + "parameters": { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "loose", + "version": 2 + }, + "conditions": [ + { + "id": "6fd25c16-6aa5-45ee-95b6-53572a43e47d", + "leftValue": "={{ $json.output }}", + "rightValue": "={{ $('get zaehlerstand aktuell').item.json.val }}", + "operator": { + "type": "number", + "operation": "lte" + } + }, + { + "id": "1188485d-85b5-4c87-afd1-e86898d5c44e", + "leftValue": "={{ $json.output }}", + "rightValue": "={{ $('get zaehlerstand aktuell').item.json.val * 1.005}} ", + "operator": { + "type": "number", + "operation": "gt" + } + } + ], + "combinator": "or" + }, + "looseTypeValidation": true, + "options": {} + }, + "type": "n8n-nodes-base.if", + "typeVersion": 2.2, + "position": [ + 1200, + 160 + ], + "id": "91b87624-647e-4c86-8c99-47e937358da2", + "name": "If" + }, + { + "parameters": { + "content": "Via Web Form", + "height": 220, + "width": 460 + }, + "type": "n8n-nodes-base.stickyNote", + "typeVersion": 1, + "position": [ + 1136, + 288 + ], + "id": "b68aba50-dc47-4010-a3e8-c1ed610c8d27", + "name": "Sticky Note" + }, + { + "parameters": { + "content": "Via KI ", + "height": 400, + "width": 1480 + }, + "type": "n8n-nodes-base.stickyNote", + "typeVersion": 1, + "position": [ + 48, + 16 + ], + "id": "d8a1355c-2e01-40fb-8d7a-da0bf0d34f60", + "name": "Sticky Note1" + }, + { + "parameters": { + "url": "http://192.168.2.22/img_tmp/alg_roi.jpg", + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [ + 512, + 160 + ], + "id": "d4eac2d6-527e-46e6-b6e3-ae59f2e8d5f2", + "name": "get zaehlerstand from photo" + } + ], + "pinData": {}, + "connections": { + "Daily Trigger": { + "main": [ + [ + { + "node": "get vebrauch/tag via http request", + "type": "main", + "index": 0 + } + ] + ] + }, + "update data to homelab \"Wasser\"": { + "main": [ + [ + { + "node": "Send a text message", + "type": "main", + "index": 0 + } + ] + ] + }, + "get vebrauch/tag via http request": { + "main": [ + [ + { + "node": "update data to homelab \"Wasser\"", + "type": "main", + "index": 0 + } + ] + ] + }, + "On form submission": { + "main": [ + [ + { + "node": "HTTP Request set_zahlerstand", + "type": "main", + "index": 0 + } + ] + ] + }, + "HTTP Request set_zahlerstand": { + "main": [ + [ + { + "node": "Wait", + "type": "main", + "index": 0 + } + ] + ] + }, + "Wait": { + "main": [ + [ + { + "node": "get vebrauch/tag via http request", + "type": "main", + "index": 0 + } + ] + ] + }, + "Webhook": { + "main": [ + [ + { + "node": "get zaehlerstand aktuell", + "type": "main", + "index": 0 + } + ] + ] + }, + "OpenAI Chat Model": { + "ai_languageModel": [ + [ + { + "node": "AI Agent", + "type": "ai_languageModel", + "index": 0 + } + ] + ] + }, + "AI Agent": { + "main": [ + [ + { + "node": "If", + "type": "main", + "index": 0 + } + ] + ] + }, + "Schedule Trigger": { + "main": [ + [ + { + "node": "get zaehlerstand aktuell", + "type": "main", + "index": 0 + } + ] + ] + }, + "get zaehlerstand aktuell": { + "main": [ + [ + { + "node": "get zaehlerstand from photo", + "type": "main", + "index": 0 + } + ] + ] + }, + "write zaehlerstand new": { + "main": [ + [ + { + "node": "Wait", + "type": "main", + "index": 0 + } + ] + ] + }, + "If": { + "main": [ + [], + [ + { + "node": "write zaehlerstand new", + "type": "main", + "index": 0 + } + ] + ] + }, + "get zaehlerstand from photo": { + "main": [ + [ + { + "node": "AI Agent", + "type": "main", + "index": 0 + } + ] + ] + } + }, + "active": true, + "settings": { + "executionOrder": "v1" + }, + "versionId": "5e8ac774-c1c1-4d97-a446-e3fe3a523d72", + "meta": { + "instanceId": "3cc6c4256e2bbdec1b3708c49dc3889c7266357f3e239651c157c2de760e6c65" + }, + "id": "suIqhSRRO2zhzLmy", + "tags": [ + { + "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 diff --git a/workflow/Heizung/Wärmepumpe_ Tagesverbrauch.json b/workflow/Heizung/Wärmepumpe_ Tagesverbrauch.json new file mode 100644 index 0000000..d747c79 --- /dev/null +++ b/workflow/Heizung/Wärmepumpe_ Tagesverbrauch.json @@ -0,0 +1,576 @@ +{ + "name": "Wärmepumpe: Tagesverbrauch", + "nodes": [ + { + "parameters": { + "jsCode": "// INPUT: items = [{ json: { data: \"
...
\" } }]\n// OUTPUT: items = [{ json: { Adresse, Bezeichnung, Wert, Einheit, Waehrung, Raw, Key } }, ...]\n\n// kleine Helfer\nfunction slug(s) {\n return String(s)\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 .toLowerCase();\n}\n\nfunction parseNumUnit(raw) {\n if (!raw) return { value: null, unit: null, currency: null };\n let t = raw.replace(/ /g, ' ').trim();\n\n // Währung vorne oder hinten (€, $, £)\n let currency = null;\n const curLead = t.match(/^[€$£]/);\n const curTrail = t.match(/[€$£]$/);\n if (curLead) { currency = curLead[0]; t = t.slice(1).trim(); }\n else if (curTrail) { currency = curTrail[0]; t = t.slice(0, -1).trim(); }\n\n // Zahl (Komma oder Punkt)\n const numMatch = t.match(/-?\\d+(?:[.,]\\d+)?/);\n const value = numMatch ? parseFloat(numMatch[0].replace(',', '.')) : null;\n const unit = numMatch ? (t.replace(numMatch[0], '').trim() || null) : null;\n\n return { value, unit, currency };\n}\n\n// 1) HTML einsammeln (idR nur ein Item)\nconst html = items.map(i => i.json?.data ?? i.json?.body ?? i.json?.html ?? '').join('\\n');\n\n// 2) VALUE-Blöcke parsen\nconst re = /
\\s*