Dateien nach "workflow/Heizung" hochladen

This commit is contained in:
2025-12-27 19:16:04 +01:00
parent 15188ed250
commit c8f709f863
5 changed files with 2043 additions and 0 deletions

View File

@@ -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: \"<div class=...>...\" } }]\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(/&nbsp;/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 = /<div class=\"BOX BOX_IN\">[\\s\\S]*?<div class=\"bez\">(\\d+):\\s*([^<]+)<\\/div>(?:[\\s\\S]*?<div class=\"val\">\\s*<div>([^<]*)<\\/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"
}
]
}

View File

@@ -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"
}
]
}

View File

@@ -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"
}
]
}

View File

@@ -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"
}
]
}

View File

@@ -0,0 +1,576 @@
{
"name": "Wärmepumpe: Tagesverbrauch",
"nodes": [
{
"parameters": {
"jsCode": "// INPUT: items = [{ json: { data: \"<div id='centerf'>...</div>\" } }]\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(/&nbsp;/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 = /<div class=\"VALUE\">\\s*<div class=\"VALUE_LINK L2\"\\s+adresse=\"([^\"]+)\">([^<]+)<\\/div>\\s*<div class=\"VALUE_B\">([^<]+)<\\/div>\\s*<\\/div>/g;\n\nconst rows = [];\nfor (const m of html.matchAll(re)) {\n const adresse = m[1].trim();\n const label = m[2].trim();\n const raw = m[3].trim();\n\n const { value, unit, currency } = parseNumUnit(raw);\n const key = slug(label);\n\n rows.push({\n Adresse: adresse,\n Bezeichnung: label,\n Wert: (value !== null ? value : raw), // Zahl bevorzugt, sonst Rohstring\n Einheit: unit || '',\n Waehrung: currency || '',\n Raw: raw,\n Key: key\n });\n}\n\n// 3) Als **einzelne Items** zurückgeben (ein Item pro Wert/Zeile)\nreturn rows.map(r => ({ json: r }));\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
224,
0
],
"id": "05b8699b-62c3-4f52-9829-03ebba00f470",
"name": "Code in JavaScript"
},
{
"parameters": {
"jsCode": "// INPUT: 19 Items vom Parser (Adresse, Bezeichnung, Wert, Einheit, Waehrung, Key)\n// OUTPUT: 1 Item mit vielen Feldern: leistung, tageszaehlerstand, ...\n\nconst out = {};\nconst units = {}; // falls du Einheiten brauchst\n\nfor (const it of items) {\n const j = it.json;\n // Zahl bevorzugt, sonst Rohstring\n out[j.Key] = (j.Wert ?? j.Raw ?? null);\n if (j.Einheit) units[j.Key] = j.Einheit;\n if (j.Waehrung) units[j.Key] = (units[j.Key] ? units[j.Key] + ' ' : '') + j.Waehrung;\n}\n\n// Ein einziges Item zurückgeben\nreturn [{ json: { ...out, _units: units } }];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
448,
0
],
"id": "61d9d196-8224-4363-b46c-2186979f9d4e",
"name": "Code in JavaScript1"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "minutes"
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
-224,
96
],
"id": "8c6654b8-560d-4126-96d4-372d2567e8e0",
"name": "Schedule Trigger"
},
{
"parameters": {
"url": "http://192.168.2.68:8093/v1/state/0_userdata.0.haus.heizung.waermepumpe.heat_pump_daily_consumption",
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "value",
"value": "={{ $('Code in JavaScript1').item.json.tageszahlerstand }}"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
896,
0
],
"id": "ab729e47-cce9-4cf0-a5b3-56c8e5c1def3",
"name": "update Tageszählerstand iobroker"
},
{
"parameters": {
"url": "http://192.168.2.186/INCLUDE/devpagex.cgi?pagex2=01055c07&_=1759570693948",
"authentication": "genericCredentialType",
"genericAuthType": "httpBasicAuth",
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "admin",
"value": "admin"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
0,
0
],
"id": "59028407-fb4b-4ee0-a539-3505cf2fffd3",
"name": "get Tageszählerstand WP",
"credentials": {
"httpBasicAuth": {
"id": "iJkXePPAceSyENTx",
"name": "CMI CAN Bus local"
}
}
},
{
"parameters": {
"url": "http://192.168.2.186/INCLUDE/devpagex.cgi?pagex2=01145c07&_=1759576852400",
"authentication": "genericCredentialType",
"genericAuthType": "httpBasicAuth",
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "admin",
"value": "admin"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
0,
192
],
"id": "545bac82-ea34-461d-955e-9ceebe4dc82a",
"name": "get Tageszählerstand PV WP",
"credentials": {
"httpBasicAuth": {
"id": "iJkXePPAceSyENTx",
"name": "CMI CAN Bus local"
}
}
},
{
"parameters": {
"jsCode": "// INPUT: items = [{ json: { data: \"<div id='centerf'>...</div>\" } }]\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(/&nbsp;/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 = /<div class=\"VALUE\">\\s*<div class=\"VALUE_LINK L2\"\\s+adresse=\"([^\"]+)\">([^<]+)<\\/div>\\s*<div class=\"VALUE_B\">([^<]+)<\\/div>\\s*<\\/div>/g;\n\nconst rows = [];\nfor (const m of html.matchAll(re)) {\n const adresse = m[1].trim();\n const label = m[2].trim();\n const raw = m[3].trim();\n\n const { value, unit, currency } = parseNumUnit(raw);\n const key = slug(label);\n\n rows.push({\n Adresse: adresse,\n Bezeichnung: label,\n Wert: (value !== null ? value : raw), // Zahl bevorzugt, sonst Rohstring\n Einheit: unit || '',\n Waehrung: currency || '',\n Raw: raw,\n Key: key\n });\n}\n\n// 3) Als **einzelne Items** zurückgeben (ein Item pro Wert/Zeile)\nreturn rows.map(r => ({ json: r }));\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
224,
192
],
"id": "8f08ee8b-d3eb-4d7e-baa7-6fad114e40b0",
"name": "Code in JavaScript2"
},
{
"parameters": {
"jsCode": "// INPUT: 19 Items vom Parser (Adresse, Bezeichnung, Wert, Einheit, Waehrung, Key)\n// OUTPUT: 1 Item mit vielen Feldern: leistung, tageszaehlerstand, ...\n\nconst out = {};\nconst units = {}; // falls du Einheiten brauchst\n\nfor (const it of items) {\n const j = it.json;\n // Zahl bevorzugt, sonst Rohstring\n out[j.Key] = (j.Wert ?? j.Raw ?? null);\n if (j.Einheit) units[j.Key] = j.Einheit;\n if (j.Waehrung) units[j.Key] = (units[j.Key] ? units[j.Key] + ' ' : '') + j.Waehrung;\n}\n\n// Ein einziges Item zurückgeben\nreturn [{ json: { ...out, _units: units } }];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
448,
192
],
"id": "d1a4e45e-854b-4359-8da0-3e85f0c41dc4",
"name": "Code in JavaScript3"
},
{
"parameters": {
"operation": "upsert",
"table": {
"__rl": true,
"value": "Waermepumpe",
"mode": "list",
"cachedResultName": "Waermepumpe"
},
"dataMode": "defineBelow",
"columnToMatchOn": "Datum",
"valueToMatchOn": "={{ $now.toFormat('yyyy-MM-dd')}}",
"valuesToSend": {
"values": [
{
"column": "Tagesverbrauch",
"value": "={{ $json.tageszahlerstand }}"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.mySql",
"typeVersion": 2.5,
"position": [
672,
0
],
"id": "797700c3-040b-4a27-b621-68e806b65730",
"name": "update Tagesverbrauch mysql",
"credentials": {
"mySql": {
"id": "GvOnFzLTFlbKtgUM",
"name": "MySQL account - homelab"
}
}
},
{
"parameters": {
"operation": "upsert",
"table": {
"__rl": true,
"value": "Waermepumpe",
"mode": "list",
"cachedResultName": "Waermepumpe"
},
"dataMode": "defineBelow",
"columnToMatchOn": "Datum",
"valueToMatchOn": "={{ $now.toFormat('yyyy-MM-dd')}}",
"valuesToSend": {
"values": [
{
"column": "Anteil PV",
"value": "={{ $json.tageszahlerstand }}"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.mySql",
"typeVersion": 2.5,
"position": [
672,
192
],
"id": "7546d115-42c1-4cf9-ae9c-9030a86f9a7c",
"name": "update Tagesverbrauch PV mysql",
"credentials": {
"mySql": {
"id": "GvOnFzLTFlbKtgUM",
"name": "MySQL account - homelab"
}
}
},
{
"parameters": {
"operation": "select",
"table": {
"__rl": true,
"value": "Waermepumpe",
"mode": "list",
"cachedResultName": "Waermepumpe"
},
"where": {
"values": [
{
"column": "Datum",
"value": "={{ $now.toFormat('yyyy-MM-dd')}}"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.mySql",
"typeVersion": 2.5,
"position": [
1344,
96
],
"id": "6c0fce95-29f5-4c9a-bd06-6ce474207b01",
"name": "Select rows from a table",
"credentials": {
"mySql": {
"id": "GvOnFzLTFlbKtgUM",
"name": "MySQL account - homelab"
}
}
},
{
"parameters": {
"operation": "update",
"table": {
"__rl": true,
"value": "Waermepumpe",
"mode": "list",
"cachedResultName": "Waermepumpe"
},
"dataMode": "defineBelow",
"columnToMatchOn": "Datum",
"valueToMatchOn": "={{ $now.toFormat('yyyy-MM-dd')}}",
"valuesToSend": {
"values": [
{
"column": "Anteil Netzbezug",
"value": "={{ $json['Anteil Netzbezug'] }}"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.mySql",
"typeVersion": 2.5,
"position": [
1792,
96
],
"id": "b0e2962f-490d-4f17-be1c-0f8bbe80d510",
"name": "Update rows in a table",
"credentials": {
"mySql": {
"id": "GvOnFzLTFlbKtgUM",
"name": "MySQL account - homelab"
}
}
},
{
"parameters": {
"mode": "chooseBranch",
"useDataOfInput": 2
},
"type": "n8n-nodes-base.merge",
"typeVersion": 3.2,
"position": [
1120,
96
],
"id": "e3aedba7-b520-40c7-b0ac-80c231bafbd8",
"name": "Merge"
},
{
"parameters": {
"jsCode": "// Verarbeite alle eingehenden Items\nreturn $input.all().map(item => {\n const tagesverbrauch = Number(item.json[\"Tagesverbrauch\"]) || 0;\n const anteilPV = Number(item.json[\"Anteil PV\"]) || 0;\n\n // Berechnung\n const anteilNetzbezug = tagesverbrauch - anteilPV;\n\n // Neues Feld hinzufügen\n item.json[\"Anteil Netzbezug\"] = anteilNetzbezug;\n\n return item;\n});\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1568,
96
],
"id": "b709fffd-4cf1-46ae-839e-fb72a4902b0b",
"name": "calculate Netzbezug"
},
{
"parameters": {
"url": "http://192.168.2.68:8093/v1/state/0_userdata.0.haus.heizung.waermepumpe.heat_pump_daily_consumption_pv",
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "value",
"value": "={{ $('Code in JavaScript3').item.json.tageszahlerstand }}"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
896,
192
],
"id": "a0db8fee-4d48-49b0-a329-80c90783e530",
"name": "update Tagesverbrauch PV"
},
{
"parameters": {
"url": "http://192.168.2.68:8093/v1/state/0_userdata.0.haus.heizung.waermepumpe.heat_pump_daily_consumption_power",
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "value",
"value": "={{ $('calculate Netzbezug').item.json['Anteil Netzbezug'] }}"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
2016,
96
],
"id": "6dcc484c-e75a-46b2-9049-87a4e48d2d1d",
"name": "update Netzbezug"
}
],
"pinData": {},
"connections": {
"Code in JavaScript": {
"main": [
[
{
"node": "Code in JavaScript1",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript1": {
"main": [
[
{
"node": "update Tagesverbrauch mysql",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "get Tageszählerstand WP",
"type": "main",
"index": 0
},
{
"node": "get Tageszählerstand PV WP",
"type": "main",
"index": 0
}
]
]
},
"get Tageszählerstand WP": {
"main": [
[
{
"node": "Code in JavaScript",
"type": "main",
"index": 0
}
]
]
},
"get Tageszählerstand PV WP": {
"main": [
[
{
"node": "Code in JavaScript2",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript2": {
"main": [
[
{
"node": "Code in JavaScript3",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript3": {
"main": [
[
{
"node": "update Tagesverbrauch PV mysql",
"type": "main",
"index": 0
}
]
]
},
"update Tagesverbrauch mysql": {
"main": [
[
{
"node": "update Tageszählerstand iobroker",
"type": "main",
"index": 0
}
]
]
},
"Select rows from a table": {
"main": [
[
{
"node": "calculate Netzbezug",
"type": "main",
"index": 0
}
]
]
},
"Update rows in a table": {
"main": [
[
{
"node": "update Netzbezug",
"type": "main",
"index": 0
}
]
]
},
"update Tageszählerstand iobroker": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"update Tagesverbrauch PV mysql": {
"main": [
[
{
"node": "update Tagesverbrauch PV",
"type": "main",
"index": 0
}
]
]
},
"Merge": {
"main": [
[
{
"node": "Select rows from a table",
"type": "main",
"index": 0
}
]
]
},
"calculate Netzbezug": {
"main": [
[
{
"node": "Update rows in a table",
"type": "main",
"index": 0
}
]
]
},
"update Tagesverbrauch PV": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
}
},
"active": true,
"settings": {
"executionOrder": "v1"
},
"versionId": "8b467f30-717c-41e3-9051-236e31116740",
"meta": {
"templateCredsSetupCompleted": true,
"instanceId": "3cc6c4256e2bbdec1b3708c49dc3889c7266357f3e239651c157c2de760e6c65"
},
"id": "bKlJd68Ba0ZWBnNS",
"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"
}
]
}