{ "name": "Irrigation Weather Analyses", "nodes": [ { "parameters": { "resource": "state", "entityId": "=sensor.innenstation_regenmesser_niederschlagsmenge_letzte_stunde" }, "name": "Get HA Sensors", "type": "n8n-nodes-base.homeAssistant", "typeVersion": 1, "position": [ -2352, -1248 ], "id": "858084ff-3b5c-41fa-b558-b3c85996bdc6", "credentials": { "homeAssistantApi": { "id": "CASmA2MyiLWSS3RF", "name": "Home Assistant account" } } }, { "parameters": {}, "type": "n8n-nodes-base.manualTrigger", "typeVersion": 1, "position": [ -2656, -944 ], "id": "d4d650a6-0693-4625-ac11-0e1603dfc6a7", "name": "When clicking ‘Test workflow’" }, { "parameters": { "promptType": "define", "text": "=Führe eine Wetteranalyse durch und gib die Antwort in deutscher Sprache zurück.", "options": { "systemMessage": "=## Rolle\nDu bist ein intelligenter Wetterprognoseberatungsassistent, der Wetterberichte und Wetterprognosen analysieren und verarbeiten kann\n\n## Ziel\nBasierend auf dem Wetterbericht und der Wetterprognose analysierst du ob und wann und mit welchen Risiken eine Bewässerung von Beeten erforderlich ist \n\n## Tools\n'wetterprognose' Tool, liefert die Wetterprognose für die nächsten 5 Tage\n'wetterbericht' Tool, liefert den aktuellen Wetterbericht\n\n## Regeln\n1. Rufe die Tools in der angegebenen Reihenfolge ab.\n2. Verwende exakt die Toolnamen.\n3. Warte auf das Ergebnis jedes Tool-Aufrufs.\n4. Analysiere, wenn sowohl wetterprognose als auch wetterbericht vorliegen.\n5. Antworte immer in deutscher Sprache\n\n## Aufgabe\nVerarbeite die Daten und gib eine fundierte Entscheidung zur Bewässerung zurück. Analysiere:\n- Aktuelles Wetter\n- Wettertrend\n- Niederschlag, Wind, Temperatur\n- Verdunstungsrisiken\n- optmimaler Zeitpunkt und Risiken der Bewässerung\n\n---\n\n## Abschluss\n\nFormuliere deine Entscheidung in natürlicher Sprache – sachlich und prägnant. Gib eine klare Empfehlung zur Bewässerung ab.\n\nZum Beispiel:\n\n\"Die aktuelle Wetterlage ist klar, laut Vorhersage ist mit leichter Bewölkung am Abend zu rechnen. Eine Bewässerung ist sinnvoll, idealerweise am späten Nachmittag. Zu beachten sind Wind und ein erhöhtes Verdunstungsrisiko.\"\n\nGib keine strukturierte JSON-Ausgabe zurück – das erfolgt im nächsten Schritt automatisch.\n\n### Abschließende Hinweise\nHier ist das aktuelle Datum/Uhrzeit: {{ $now }}\n\n" } }, "type": "@n8n/n8n-nodes-langchain.agent", "typeVersion": 1.9, "position": [ -1488, -944 ], "id": "a1cefec6-43a9-4dac-9014-5957c7f859c1", "name": "AI Agent Wetterbericht -prognose" }, { "parameters": { "operation": "query", "query": "=// Alle Messwerte der letzten 7 Tage (nach Tagen aggregiert)\ndaily = from(bucket: \"home_assistant\")\n |> range(start: -7d)\n |> filter(fn: (r) => \n r[\"entity_id\"] == \"innenstation_regenmesser_niederschlag_heute\" and\n r[\"_field\"] == \"value\" and\n r[\"_measurement\"] == \"mm\" and\n r[\"domain\"] == \"sensor\"\n )\n |> aggregateWindow(every: 1d, fn: max, createEmpty: false)\n |> yield(name: \"daily_sum\")\n\n// Summe aller dieser Tageswerte\ntotal = daily\n |> sum(column: \"_value\")\n |> set(key: \"type\", value: \"7_day_total\")\n |> yield(name: \"max_daily_rain\")", "options": {} }, "type": "n8n-nodes-influxdb.influxDb", "typeVersion": 1, "position": [ -2176, -1392 ], "id": "063dbad3-ad10-435f-b22c-3796d1d947b6", "name": "InfluxDB Regen letzte 7 Tage mm", "credentials": { "influxDb": { "id": "mOdqZZz9pI98IduE", "name": "InfluxDB Node" } } }, { "parameters": { "jsCode": "// Code Node: Historische Regenanalyse für Bewässerungsentscheidung\n\nconst rainData = $input.all();\n\n// Abbruch, wenn keine Daten vorhanden\nif (rainData.length === 0) {\n return {\n error: \"Keine Regen-Daten vorhanden.\",\n processedAt: new Date().toISOString()\n };\n}\n\n// Separiere 24h-Wert (type === 'rain_last_24h_precise') und Zeit-basierte Daten\nconst rain24hItem = rainData.find(item => item.json?.type === \"rain_last_24h_precise\");\nconst rain24hValue = parseFloat(rain24hItem?.json?._value || 0);\nconst dailyRainData = rainData.filter(item => item.json?._time);\n\n// Initialisierung\nlet totalRainfall = 0;\nlet rainEvents = [];\nlet dailyRainfall = {};\nlet lastRainEvent = null;\n\n// Verarbeite alle Tagesdaten mit Zeitstempel\ndailyRainData.forEach(item => {\n const t = new Date(item.json._time);\n const v = parseFloat(item.json._value || 0);\n\n totalRainfall += v;\n\n const dayKey = t.toISOString().split(\"T\")[0];\n dailyRainfall[dayKey] = (dailyRainfall[dayKey] || 0) + v;\n\n if (v > 0.1) {\n rainEvents.push({\n timestamp: t.toISOString(),\n amount: v,\n hour: t.getHours(),\n dayOfWeek: t.getDay()\n });\n lastRainEvent = t;\n }\n});\n\n// Zeit seit letztem Regenereignis\nconst now = new Date();\nconst hoursSinceLastRain = lastRainEvent\n ? Math.floor((now - lastRainEvent) / (1000 * 60 * 60))\n : 168; // Default = 7 Tage\n\n// Vereinfachte Verdunstungsabschätzung\nconst month = now.getMonth(); // 0 = Jan\nconst isGrowingSeason = month >= 3 && month <= 9;\nconst dailyEvaporation = isGrowingSeason ? 3.5 : 1.5;\nconst estimatedEvaporation = dailyEvaporation * 7;\n\n// Effektive Bodenfeuchtigkeit (vereinfacht)\nconst effectiveMoisture = totalRainfall - estimatedEvaporation;\nconst roundedMoisture = Math.round(effectiveMoisture * 10) / 10;\nconst moistureStatus =\n effectiveMoisture > 10 ? \"feucht\" :\n effectiveMoisture > 0 ? \"mäßig\" :\n \"trocken\";\n\n// Harmonisierte Bewertung auf Basis effektiver Feuchte\nconst rainAssessmentStatus =\n effectiveMoisture < 0\n ? (hoursSinceLastRain > 72 ? \"kritisch_trocken\" : \"trocken\")\n : effectiveMoisture > 15\n ? \"sehr_feucht\"\n : \"normal\";\n\nconst recommendationText =\n hoursSinceLastRain > 72\n ? \"Lange Trockenperiode – auch unbewässerte Bereiche zeigen Trockenheit\"\n : \"Normale Bedingungen für unbewässerte Bereiche\";\n\n// Analyseobjekt zusammenbauen\nconst analysis = {\n totalRainfall_7d: Math.round(totalRainfall * 10) / 10,\n rain_last_24h: Math.round(rain24hValue * 10) / 10,\n hoursSinceLastRain,\n rainEvents: rainEvents.length,\n estimatedEvaporation_7d: estimatedEvaporation,\n effectiveMoisture: roundedMoisture,\n dailyAverageRainfall: Math.round((totalRainfall / 7) * 10) / 10,\n maxDailyRainfall: Math.max(...Object.values(dailyRainfall), 0),\n daysWithRain: Object.keys(dailyRainfall).length,\n daysWithoutRain: 7 - Object.keys(dailyRainfall).length,\n moistureStatus,\n sensorNote: \"WICHTIG: Der Bodenfeuchtesensor steht NICHT in den bewässerten Beeten. \" +\n \"Er zeigt die natürliche Bodenfeuchtigkeit ohne Bewässerung. \" +\n \"Bewässerte Beete haben typischerweise 20-50% höhere Feuchtigkeit.\",\n naturalMoistureAssessment: {\n status: rainAssessmentStatus,\n recommendation: recommendationText\n },\n rainPattern: {\n lastRainAmount: rainEvents.length > 0 ? rainEvents[rainEvents.length - 1].amount : 0,\n lastRainTime: lastRainEvent ? lastRainEvent.toISOString() : null,\n typicalRainHours: [...new Set(rainEvents.map(e => e.hour))].sort(),\n heavyRainEvents: rainEvents.filter(e => e.amount > 5).length\n }\n};\n\n// Empfehlung für weitere Sensoren\nconst sensorRecommendations = {\n message: \"Empfohlene zusätzliche historische Daten:\",\n sensors: [\n {\n name: \"Außentemperatur\",\n reason: \"Für Verdunstungsberechnung und Frostschutz\",\n query: \"Durchschnitts-, Min- und Max-Temperatur der letzten 7 Tage\"\n },\n {\n name: \"Windgeschwindigkeit\",\n reason: \"Wind erhöht Verdunstung um bis zu 50%\",\n query: \"Durchschnittliche Windgeschwindigkeit, besonders 10–18 Uhr\"\n },\n {\n name: \"Sonneneinstrahlung / Helligkeit\",\n reason: \"Direkte Korrelation mit Verdunstungsrate\",\n query: \"Sonnenstunden pro Tag, maximale Helligkeit\"\n },\n {\n name: \"Luftfeuchtigkeit\",\n reason: \"Niedrige Luftfeuchtigkeit = höhere Verdunstung\",\n query: \"Durchschnittliche Luftfeuchtigkeit tagsüber\"\n }\n ],\n criticalNote: \"Da der Bodenfeuchtesensor nicht in den Beeten steht, sind Wetterdaten \" +\n \"für die Verdunstungsschätzung besonders wichtig!\"\n};\n\n// Zeitbereich mit Zeitstempel-Daten berechnen\nconst entriesWithTime = dailyRainData.filter(item => !!item.json._time);\n\n// Rückgabe\nreturn {\n historicalAnalysis: analysis,\n recommendations: sensorRecommendations,\n metadata: {\n dataPoints: rainData.length,\n timeRange: {\n start: entriesWithTime[0]?.json._time || null,\n end: entriesWithTime[entriesWithTime.length - 1]?.json._time || null\n },\n processedAt: new Date().toISOString()\n }\n};" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ -1872, -1296 ], "id": "a5a0cd84-0b9a-4e0d-9d71-c5f4d011be31", "name": "Code", "notesInFlow": true, "notes": "📊 **Code Node: Historische Regenanalyse für Bewässerungsentscheidung**\n\nDiese Node analysiert vergangene Regenereignisse der letzten 7 Tage und berechnet daraus eine vereinfachte Bodenfeuchteabschätzung. \n\n### 🔍 Hauptfunktionen:\n1. **Separate 24h-Regenmenge (präzise):**\n - Extrahiert gezielt den `rain_last_24h_precise`-Wert für aktuelle Betrachtung.\n2. **Historische Regenmengen:**\n - Addiert alle Tageswerte\n - Identifiziert signifikante Regenereignisse (>0.1 mm)\n - Bestimmt typische Regenstunden\n3. **Abgeleitete Kennzahlen:**\n - `hoursSinceLastRain` (seit letztem Niederschlag)\n - `estimatedEvaporation_7d` basierend auf Jahreszeit\n - `effectiveMoisture` als Netto-Niederschlag nach Verdunstung\n - Klassifizierung: `moistureStatus` und `rainAssessmentStatus`\n4. **Zusätzliche Empfehlungen:**\n - Empfohlene Wettersensoren zur besseren Einschätzung der Verdunstung\n - Warnung, dass Bodenfeuchtesensor *nicht* im bewässerten Bereich steht\n5. **Zeitbereichs-Metadaten:**\n - Liefert Start- und Endzeitpunkt der historischen Zeitreihe\n - Timestamp der Verarbeitung\n### 🧠 Hinweis:\nWird als zentrale Analysebasis für die Bewässerungslogik genutzt – kann später mit aktuellen Sensorwerten kombiniert und per Redis gepuffert werden." }, { "parameters": { "topics": "n8n/trigger/bewaesserung", "options": {} }, "type": "n8n-nodes-base.mqttTrigger", "typeVersion": 1, "position": [ -2656, -1424 ], "id": "bba21d3e-c6ee-460d-b4f6-ceade58d5ac2", "name": "MQTT Trigger", "credentials": { "mqtt": { "id": "iTGdMrvNdq6GfJ45", "name": "MQTT account" } } }, { "parameters": { "resource": "state", "entityId": "=sensor.bewasserung_zone_1" }, "type": "n8n-nodes-base.homeAssistant", "typeVersion": 1, "position": [ -2160, -1584 ], "id": "bc4144c6-7c39-4fd4-bbd9-d1a7f6ee59eb", "name": "Bewässerung Zone 1", "credentials": { "homeAssistantApi": { "id": "CASmA2MyiLWSS3RF", "name": "Home Assistant account" } } }, { "parameters": { "resource": "state", "entityId": "=sensor.bewasserung_zone_2" }, "type": "n8n-nodes-base.homeAssistant", "typeVersion": 1, "position": [ -1920, -1584 ], "id": "ba1d43a8-f34a-48ce-accf-4b824863ed01", "name": "Bewässerung Zone 2", "credentials": { "homeAssistantApi": { "id": "CASmA2MyiLWSS3RF", "name": "Home Assistant account" } } }, { "parameters": { "resource": "state", "entityId": "=sensor.bewasserung_zone_3" }, "type": "n8n-nodes-base.homeAssistant", "typeVersion": 1, "position": [ -1680, -1584 ], "id": "56f2add9-17a6-493c-92b8-3a398c3a36da", "name": "Bewässerung Zone 3", "credentials": { "homeAssistantApi": { "id": "CASmA2MyiLWSS3RF", "name": "Home Assistant account" } } }, { "parameters": { "resource": "state", "entityId": "=sensor.bewasserung_zone_4" }, "type": "n8n-nodes-base.homeAssistant", "typeVersion": 1, "position": [ -1488, -1584 ], "id": "5959cd5c-4321-43b3-be41-dce37e506ba4", "name": "Bewässerung Zone 4", "credentials": { "homeAssistantApi": { "id": "CASmA2MyiLWSS3RF", "name": "Home Assistant account" } } }, { "parameters": { "numberInputs": 3 }, "type": "n8n-nodes-base.merge", "typeVersion": 3.2, "position": [ -272, -1312 ], "id": "d4f2da45-a26a-42f7-995b-a5441717f0dc", "name": "Merge" }, { "parameters": { "jsCode": "// Hole das Zonen-Objekt (erstes Item aus dem Input)\nconst input = $input.first().json;\n\n// Extrahiere alle Zonen anhand der Keys (z. B. Pizzaofen, Laubengang, ...)\nconst zones = Object.entries(input).flatMap(([zoneName, zoneArray], index) => {\n const zone = zoneArray?.[0]; // nimm das erste Element aus dem Array\n const attr = zone?.attributes;\n\n if (!attr || !attr.name) return []; // überspringe, wenn keine gültigen Attribute\n\n return [{\n json: {\n zone_id: `zone_${index + 1}`,\n name: attr.name,\n area: attr.area,\n flow_rate: attr.flow_rate,\n soil_factor: attr.soil_factor,\n plant_type: attr.plant_type,\n sun_exposure: attr.sun_exposure,\n base_water_need: attr.base_water_need,\n }\n }];\n});\n\nreturn zones;" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ -128, -1296 ], "id": "dcea9283-8482-4016-a8d8-d94b5e8f6138", "name": "Code1", "notesInFlow": true, "notes": "🔁 **Zonen-Vorverarbeitung**\n\n1. Filtert nur Zonen mit gültigem `attributes.name`\n2. Extrahiert: `flow_rate`, `area`, `plant_type`, etc.\n3. Vergibt interne IDs wie `zone_1`, `zone_2`, …\n4. Gibt sauberes JSON zurück → ideal für Merge/Analyse" }, { "parameters": { "options": {} }, "type": "n8n-nodes-base.splitInBatches", "typeVersion": 3, "position": [ 112, -1280 ], "id": "0ade0bc6-62b0-44d0-99e5-0f2c5a2f08ce", "name": "Loop Over Items" }, { "parameters": { "jsCode": "// Eingabedaten vom Agent\nconst input = $input.item.json;\n\n// Wetterdaten (Text) aus Node \"Get wetterprognose\"\nconst wettertext = $items(\"Get wetterprognose\")[0]?.json?.daten || \"Keine Wetterprognose verfügbar\";\n\n// Regenanalyse aus Node \"Get regenanalyse\"\nconst regenanalyse = $items(\"Get regenanalyse\")[0]?.json?.daten || {};\n\n// Basiswerte aus der Zone\nconst baseWaterNeed = input.base_water_need || 25; // l/m²/Woche\nconst area = input.area || 0; // m²\nconst soilFactor = input.soil_factor || 1;\nconst flowRate = input.flow_rate || 1; // l/h\n\n// Wetterdaten extrahieren\nconst regen7d = regenanalyse.totalRainfall_7d || 0;\nconst regen24h = regenanalyse.rain_last_24h || 0;\nconst evapotranspiration = regenanalyse.estimatedEvaporation_7d || 3.5;\nconst effectiveMoisture = regenanalyse.effectiveMoisture || 0;\nconst moistureStatus = regenanalyse.moistureStatus || \"unbekannt\";\nconst hoursSinceLastRain = regenanalyse.hoursSinceLastRain || 0;\n\n// Effektiver Regenwert: konservativ – 70 % des 7-Tage-Werts\nconst effektiverRegen = Math.round(regen7d * 0.7);\n\n// Nettowasserbedarf (l) = (Bedarf - Regen + Verdunstung) * Fläche * Bodenfaktor\nconst netWaterPerSqm = Math.max((baseWaterNeed - effektiverRegen + evapotranspiration), 0);\nconst totalWaterNeed = netWaterPerSqm * area * soilFactor;\n\n// Gießzeit in Minuten\nconst wateringTime = (totalWaterNeed / flowRate) * 60;\n\n// Empfehlung zur Aufteilung\nlet gaben = 1;\nif (wateringTime > 15) gaben = 2;\nconst timePerGabe = wateringTime / gaben;\n\n// Zeitfenster anhand Sonnenlage\nlet zeitraum = '06:00-09:00';\nif (input.sun_exposure === 'Volle Sonne') zeitraum = '05:00-08:00 & 19:00-21:00';\nelse if (input.sun_exposure === 'Halbschatten') zeitraum = '06:30-09:00 & 18:00-20:00';\n\n// Aktuelles Datum\nconst datum = new Date().toISOString();\n\n// Rückgabe\nreturn [\n {\n json: {\n datum,\n zone_id: input.zone_id,\n zone_name: input.name,\n wasserbedarf_l: Math.round(totalWaterNeed),\n giesszeit_min: Math.round(wateringTime),\n gaben,\n minuten_pro_gabe: Math.round(timePerGabe),\n zeitempfehlung: zeitraum,\n wettertext, // aus Get wetterprognose\n wetterdaten_berücksichtigt: {\n effectiveMoisture,\n moistureStatus,\n regen_letzte_7tage_mm: regen7d,\n regen_letzte_24h_mm: regen24h,\n effektiver_regen_mm: effektiverRegen,\n evapotranspiration,\n hoursSinceLastRain\n },\n basisdaten: {\n flaeche_m2: area,\n bodenfaktor: soilFactor,\n durchfluss_lph: flowRate,\n basisbedarf_l_pro_m2_woche: baseWaterNeed\n }\n }\n }\n];" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 656, -1264 ], "id": "3e9d46ed-b676-4b1c-a005-cee492db6ebe", "name": "Code2", "notesInFlow": true, "onError": "continueRegularOutput", "notes": "Berechnet den individuellen Wasserbedarf einer Bewässerungszone basierend auf Eingabedaten vom Agenten (z. B. Fläche, Bodentyp, Sonnenlage) sowie aktuellen Wetter- und Regenanalysen.\nDer Code berücksichtigt:\n\t•\tBasiswasserbedarf pro m²\n\t•\teffektiven Niederschlag der letzten 7 Tage (konservativ berechnet)\n\t•\tEvapotranspiration (Verdunstung)\n\t•\tBodenfaktor & Flächenangabe\n\t•\tDurchflussrate des Bewässerungssystems\n\nErgebnis ist eine empfohlene Gesamtgießzeit (in Minuten), aufgeteilt in sinnvolle Gaben und Tageszeiten – je nach Sonneneinstrahlung.\n\n" }, { "parameters": { "mode": "combine", "combineBy": "combineByPosition", "numberInputs": 3, "options": { "includeUnpaired": false } }, "type": "n8n-nodes-base.merge", "typeVersion": 3.2, "position": [ 496, -1280 ], "id": "d0a5db61-43ce-4ff0-9052-e53a23c0b9cc", "name": "Merge1" }, { "parameters": { "assignments": { "assignments": [ { "id": "61bdb158-47a9-4e0f-ab7e-7d488f730348", "name": "=entity_id", "value": "={{ (\"timer.bewasserungsdauer_\" + $json.zone_name.toLowerCase().replace(\" \", \"_\") + \"_morgens\").trim() }}", "type": "string" }, { "id": "0cf8d754-b038-423c-9492-a832d57362bc", "name": "duration", "value": "={{ \"00:\" + $json.minuten_pro_gabe.toString().padStart(2, '0') + \":00\" }}", "type": "string" } ] }, "options": {} }, "type": "n8n-nodes-base.set", "typeVersion": 3.4, "position": [ 848, -1568 ], "id": "a9a078a8-62eb-44f1-b2d9-72ee359b228d", "name": "Dauer Morgens" }, { "parameters": { "assignments": { "assignments": [ { "id": "61bdb158-47a9-4e0f-ab7e-7d488f730348", "name": "=entity_id", "value": "={{ (\"timer.bewasserungsdauer_\" + $json.zone_name.toLowerCase().replace(\" \", \"_\") + \"_nachmittags\").trim() }}", "type": "string" }, { "id": "0cf8d754-b038-423c-9492-a832d57362bc", "name": "duration", "value": "={{ \"00:\" + $json.minuten_pro_gabe.toString().padStart(2, '0') + \":00\" }}", "type": "string" } ] }, "options": {} }, "type": "n8n-nodes-base.set", "typeVersion": 3.4, "position": [ 848, -896 ], "id": "2feca04d-efd6-4408-8a8e-406911f444d5", "name": "Dauer Nachmittags" }, { "parameters": { "numberInputs": 3 }, "type": "n8n-nodes-base.merge", "typeVersion": 3.2, "position": [ 1424, -1280 ], "id": "bc61f7b3-a02e-4fd1-8b14-ed5813e1f868", "name": "Merge2" }, { "parameters": { "numberInputs": 3 }, "type": "n8n-nodes-base.merge", "typeVersion": 3.2, "position": [ 1984, -1296 ], "id": "060af981-cd78-4d5c-bd95-1849b5e61c7c", "name": "Merge3", "alwaysOutputData": true, "executeOnce": true, "onError": "continueRegularOutput" }, { "parameters": { "authentication": "nocoDbApiToken", "operation": "create", "projectId": "p5q5s1uvravppht", "table": "mxd8gvxkjnb55m4", "fieldsUi": { "fieldValues": [ { "fieldName": "datum", "fieldValue": "={{ $now.toFormat(\"yyyy-MM-dd'T'HH:mm:ss\") }}" }, { "fieldName": "zone", "fieldValue": "={{ $json.zone_name }}" }, { "fieldName": "wasserbedarf_l", "fieldValue": "={{ $json.wasserbedarf_l }}" }, { "fieldName": "gaben", "fieldValue": "={{ $json.gaben }}" }, { "fieldName": "minuten_pro_gabe", "fieldValue": "={{ $json.minuten_pro_gabe }}" }, { "fieldName": "zeitempfehlung", "fieldValue": "={{ $json.zeitempfehlung }}" }, { "fieldName": "regen_letzte_7tage_mm", "fieldValue": "={{ $json['wetterdaten_berücksichtigt'].regen_letzte_7tage_mm }}" }, { "fieldName": "evapotranspiration", "fieldValue": "={{ $json['wetterdaten_berücksichtigt'].evapotranspiration }}" }, { "fieldName": "flaeche_m2", "fieldValue": "={{ $json.basisdaten.flaeche_m2 }}" }, { "fieldName": "durchfluss_lph", "fieldValue": "={{ $json.basisdaten.durchfluss_lph }}" }, { "fieldName": "basisbedarf_l_pro_m2_woche", "fieldValue": "={{ $json.basisdaten.basisbedarf_l_pro_m2_woche }}" } ] } }, "type": "n8n-nodes-base.nocoDb", "typeVersion": 3, "position": [ 848, -1264 ], "id": "ad2e03bd-aadf-4282-99c5-766c02687d06", "name": "Create a row", "credentials": { "nocoDbApiToken": { "id": "hZudrbNwsvPaabda", "name": "NocoDB Token account" } } }, { "parameters": { "resource": "Chatting", "operation": "Send Text", "session": "=default", "chatId": "@c.us", "reply_to": "@c.us", "text": "=💧 *Bewässerung Zusammenfassung*:\n{{ $('Merge3').item.json.daten.zusammenfassung }}\n📌 *Empfehlung zur Bewässerung*:\n{{ $('Merge3').item.json.daten.empfohlener_zeitpunkt }}\n⚠️ *Wichtige Hinweise*:\n{{ $('Merge3').item.json.daten.begruendung }}\n\n{{ \n $items(\"historie\").map((entry, i) => `\n🌱 *Zone ${i + 1} – ${entry.json.zone}* \nGaben/Tag: ${entry.json.gaben} \nMinuten/Gabe: ${entry.json.minuten_pro_gabe} \nLiter pro Tag: ${entry.json.wasserbedarf_l}\n`).join('\\n\\n') \n}}", "requestOptions": {} }, "type": "n8n-nodes-waha.WAHA", "typeVersion": 202411, "position": [ 2160, -1280 ], "id": "5ff6a514-9522-4204-ad6c-5ebaadb6c0d7", "name": "Send a text message", "executeOnce": true, "credentials": { "wahaApi": { "id": "rUnKrUCOHZhlg7TJ", "name": "WAHA account" } } }, { "parameters": { "rules": { "values": [ { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "leftValue": "={{ $json.entity_id }}", "rightValue": "timer.bewasserungsdauer_scheune_nachmittags", "operator": { "type": "string", "operation": "equals" }, "id": "6101c79f-fd80-4715-b216-e90f961b3535" } ], "combinator": "and" }, "renameOutput": true, "outputKey": "Scheune" }, { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "id": "44885373-ab16-4dda-ba47-54d8e086fa7a", "leftValue": "={{ $json.entity_id }}", "rightValue": "timer.bewasserungsdauer_laubengang_nachmittags", "operator": { "type": "string", "operation": "equals", "name": "filter.operator.equals" } } ], "combinator": "and" }, "renameOutput": true, "outputKey": "Laubengang" }, { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "id": "4f88ffc7-69d5-43a8-93c2-962958384e1b", "leftValue": "={{ $json.entity_id }}", "rightValue": "timer.bewasserungsdauer_pizzaofen_nachmittags", "operator": { "type": "string", "operation": "equals", "name": "filter.operator.equals" } } ], "combinator": "and" }, "renameOutput": true, "outputKey": "Pizzaofen" }, { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "id": "726287d5-e788-48be-8598-2b2b40e6d4b9", "leftValue": "={{ $json.entity_id }}", "rightValue": "timer.bewasserungsdauer_troege_nachmittags", "operator": { "type": "string", "operation": "equals", "name": "filter.operator.equals" } } ], "combinator": "and" }, "renameOutput": true, "outputKey": "Troege" } ] }, "options": {} }, "type": "n8n-nodes-base.switch", "typeVersion": 3.2, "position": [ 1008, -928 ], "id": "e299d57f-fb06-4b05-b242-2daa0472859f", "name": "Switch1" }, { "parameters": { "resource": "service", "operation": "call", "domain": "timer", "service": "set_duration", "serviceAttributes": { "attributes": [ { "name": "entity_id", "value": "timer.bewasserungsdauer_laubengang_morgens" }, { "name": "duration", "value": "={{ $json.duration }}" } ] } }, "type": "n8n-nodes-base.homeAssistant", "typeVersion": 1, "position": [ 1216, -1648 ], "id": "400c7172-0449-434e-b1af-743f35d5ecf1", "name": "Dauer Laubengang morgens1", "alwaysOutputData": true, "credentials": { "homeAssistantApi": { "id": "CASmA2MyiLWSS3RF", "name": "Home Assistant account" } } }, { "parameters": { "resource": "service", "operation": "call", "domain": "timer", "service": "set_duration", "serviceAttributes": { "attributes": [ { "name": "entity_id", "value": "timer.bewasserungsdauer_scheune_morgens" }, { "name": "duration", "value": "={{ $json.duration }}" } ] } }, "type": "n8n-nodes-base.homeAssistant", "typeVersion": 1, "position": [ 1216, -1808 ], "id": "99910d9b-f202-42be-b642-4cb5d2f64731", "name": "Dauer Scheune morgens", "alwaysOutputData": true, "credentials": { "homeAssistantApi": { "id": "CASmA2MyiLWSS3RF", "name": "Home Assistant account" } } }, { "parameters": { "resource": "service", "operation": "call", "domain": "timer", "service": "set_duration", "serviceAttributes": { "attributes": [ { "name": "entity_id", "value": "timer.bewasserungsdauer_pizzaofen_morgens" }, { "name": "duration", "value": "={{ $json.duration }}" } ] } }, "type": "n8n-nodes-base.homeAssistant", "typeVersion": 1, "position": [ 1216, -1488 ], "id": "ca2f707f-53ab-49ef-ac65-ab55d904749f", "name": "Dauer Pizzaofen morgens2", "alwaysOutputData": true, "credentials": { "homeAssistantApi": { "id": "CASmA2MyiLWSS3RF", "name": "Home Assistant account" } } }, { "parameters": { "resource": "service", "operation": "call", "domain": "timer", "service": "set_duration", "serviceAttributes": { "attributes": [ { "name": "entity_id", "value": "timer.bewasserungsdauer_troege_morgens" }, { "name": "duration", "value": "={{ $json.duration }}" } ] } }, "type": "n8n-nodes-base.homeAssistant", "typeVersion": 1, "position": [ 1216, -1344 ], "id": "a409b7a7-0b7f-4183-8d2d-4deaed613e23", "name": "Dauer Tröge morgens3", "alwaysOutputData": true, "credentials": { "homeAssistantApi": { "id": "CASmA2MyiLWSS3RF", "name": "Home Assistant account" } } }, { "parameters": { "rules": { "values": [ { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "leftValue": "={{ $json.entity_id }}", "rightValue": "timer.bewasserungsdauer_scheune_morgens", "operator": { "type": "string", "operation": "equals" }, "id": "6101c79f-fd80-4715-b216-e90f961b3535" } ], "combinator": "and" }, "renameOutput": true, "outputKey": "Scheune" }, { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "id": "44885373-ab16-4dda-ba47-54d8e086fa7a", "leftValue": "={{ $json.entity_id }}", "rightValue": "timer.bewasserungsdauer_laubengang_morgens", "operator": { "type": "string", "operation": "equals", "name": "filter.operator.equals" } } ], "combinator": "and" }, "renameOutput": true, "outputKey": "Laubengang" }, { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "id": "4f88ffc7-69d5-43a8-93c2-962958384e1b", "leftValue": "={{ $json.entity_id }}", "rightValue": "timer.bewasserungsdauer_pizzaofen_morgens", "operator": { "type": "string", "operation": "equals", "name": "filter.operator.equals" } } ], "combinator": "and" }, "renameOutput": true, "outputKey": "Pizzaofen" }, { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "id": "726287d5-e788-48be-8598-2b2b40e6d4b9", "leftValue": "={{ $json.entity_id }}", "rightValue": "timer.bewasserungsdauer_troege_morgens", "operator": { "type": "string", "operation": "equals", "name": "filter.operator.equals" } } ], "combinator": "and" }, "renameOutput": true, "outputKey": "Troege" } ] }, "options": {} }, "type": "n8n-nodes-base.switch", "typeVersion": 3.2, "position": [ 1008, -1600 ], "id": "cb659e89-8522-4669-98f1-6da0935dc319", "name": "Switch morgens" }, { "parameters": { "resource": "service", "operation": "call", "domain": "timer", "service": "set_duration", "serviceAttributes": { "attributes": [ { "name": "entity_id", "value": "timer.bewasserungsdauer_scheune_nachmittags" }, { "name": "duration", "value": "={{ $json.duration }}" } ] } }, "type": "n8n-nodes-base.homeAssistant", "typeVersion": 1, "position": [ 1216, -1200 ], "id": "4877ad31-f6cb-4cfb-8815-7c5ffbca2c20", "name": "Dauer Scheune Nachmittags", "alwaysOutputData": true, "credentials": { "homeAssistantApi": { "id": "CASmA2MyiLWSS3RF", "name": "Home Assistant account" } } }, { "parameters": { "resource": "service", "operation": "call", "domain": "timer", "service": "set_duration", "serviceAttributes": { "attributes": [ { "name": "entity_id", "value": "timer.bewasserungsdauer_laubengang_nachmittags" }, { "name": "duration", "value": "={{ $json.duration }}" } ] } }, "type": "n8n-nodes-base.homeAssistant", "typeVersion": 1, "position": [ 1216, -1024 ], "id": "c367a5fc-ec82-475a-8ba8-de4e75010e60", "name": "Dauer Laubengang Nachmittags1", "alwaysOutputData": true, "credentials": { "homeAssistantApi": { "id": "CASmA2MyiLWSS3RF", "name": "Home Assistant account" } } }, { "parameters": { "resource": "service", "operation": "call", "domain": "timer", "service": "set_duration", "serviceAttributes": { "attributes": [ { "name": "entity_id", "value": "timer.bewasserungsdauer_troege_nachmittags" }, { "name": "duration", "value": "={{ $json.duration }}" } ] } }, "type": "n8n-nodes-base.homeAssistant", "typeVersion": 1, "position": [ 1216, -672 ], "id": "ce770cc8-2563-4cc0-947c-41d59bffce93", "name": "Dauer Tröge Nachmittags3", "alwaysOutputData": true, "credentials": { "homeAssistantApi": { "id": "CASmA2MyiLWSS3RF", "name": "Home Assistant account" } } }, { "parameters": { "resource": "service", "operation": "call", "domain": "timer", "service": "set_duration", "serviceAttributes": { "attributes": [ { "name": "entity_id", "value": "timer.bewasserungsdauer_pizzaofen_nachmittags" }, { "name": "duration", "value": "={{ $json.duration }}" } ] } }, "type": "n8n-nodes-base.homeAssistant", "typeVersion": 1, "position": [ 1216, -848 ], "id": "0c1749f3-b0da-4875-a1dd-0c002923bc9f", "name": "Dauer Pizzaofen Nachmittags2", "alwaysOutputData": true, "credentials": { "homeAssistantApi": { "id": "CASmA2MyiLWSS3RF", "name": "Home Assistant account" } } }, { "parameters": { "descriptionType": "manual", "toolDescription": "=Das \"wetterprognose\"-Tool liefert die 5-Tage-Wettervorhersage von OpenWeatherMap für den definierten Standort. \nDieses Tool ruft die Prognosedaten über die OpenWeatherMap API ab. \nname: owm_wetterprognose \ndescription: OpenWeatherMap 5-Tage-Wettervorhersage \nAttributes:\n state: JSON Wetterdaten\n forecast_range: \"5 days\"\n update_frequency: \"hourly\"\n location: \"51.66505556, 7.30528333\"\n language: \"de\"\n units: \"metric\"\n use_cases: [\"weather_planning\", \"irrigation_control\", \"pv_forecast\", \"outdoor_activities\"] \nDatenstruktur: \n • Temperatur (°C) \n • Luftfeuchtigkeit (%) \n • Niederschlagswahrscheinlichkeit (%) \n • Niederschlagsmenge (mm) \n • Bewölkung (%) \n • Windgeschwindigkeit (m/s) \n • Wetterkonditionen (Text) \nAnwendungskontexte: \nBewässerungsplanung: \n • Vorausschauende Bewässerungssteuerung \n • Niederschlagsprognosen \n • Verdunstungsvorhersage \nPV-Prognose: \n • Wetterbasierte Ertragsvorhersage \n • Bewölkungsvorhersage \n • Temperaturprognosen \nAllgemeine Planung: \n • 5-Tage-Aktivitätenplanung \n • Wetterabhängige Automatisierungen \n • Langfristige Strategien \nOperation: get \nAnweisungen für die Nutzung: \nAllgemein: \n • Stündliche Aktualisierung \n • Metrische Einheiten \n • Deutsche Sprachausgabe \n • Koordinatenbasierte Lokalisierung \nPrognosenutzung: \n • Kurzfrist (24h): Hohe Genauigkeit \n • Mittelfrist (2-3 Tage): Moderate Genauigkeit \n • Langfrist (4-5 Tage): Tendenzielle Aussagen \nBesondere Hinweise: \n • API-Limitierungen beachten \n • Kostenbasierter Service \n • Genauigkeit nimmt mit Prognosedauer ab \n", "operation": "5DayForecast", "locationSelection": "coordinates", "latitude": "51.66505556", "longitude": "7.30528333", "language": "de" }, "type": "n8n-nodes-base.openWeatherMapTool", "typeVersion": 1, "position": [ -1376, -768 ], "id": "cdb2015c-62ef-4b24-93da-77ae1a06a5c2", "name": "wetterprognose", "credentials": { "openWeatherMapApi": { "id": "ho62x3mzrnzigq4T", "name": "OpenWeatherMap account" } } }, { "parameters": { "descriptionType": "manual", "toolDescription": "=Das \"wetterbericht\"-Tool liefert die aktuellen Wetterdaten von OpenWeatherMap für den definierten Standort. \nDieses Tool ruft die Echtzeitwetterdaten über die OpenWeatherMap API ab. \nname: owm_wetterbericht \ndescription: OpenWeatherMap Aktuelle Wetterdaten \nAttributes:\n state: JSON Wetterdaten\n update_frequency: \"5 minutes\"\n location: \"51.66505556, 7.30528333\"\n language: \"de\"\n units: \"metric\"\n data_type: \"current_weather\"\n use_cases: [\"weather_monitoring\", \"sensor_validation\", \"immediate_decisions\"] \nDatenstruktur: \n • Aktuelle Temperatur (°C) \n • Gefühlte Temperatur (°C) \n • Luftfeuchtigkeit (%) \n • Luftdruck (hPa) \n • Windgeschwindigkeit (m/s) \n • Windrichtung (°) \n • Bewölkung (%) \n • Wetterzustand (Text) \n • Niederschlag letzte Stunde (mm) \nAnwendungskontexte: \nSensor-Validierung: \n • Vergleich mit lokalen Sensoren \n • Plausibilitätsprüfung \n • Kalibrierungsreferenz \nSofortige Entscheidungen: \n • Bewässerungsfreigabe \n • PV-Leistungsabschätzung \n • Außenaktivitäten \nWetterdokumentation: \n • Aktuelle Bedingungen \n • Kurzfristige Trends \n • Lokale Mikroklima-Analyse \nOperation: get \nAnweisungen für die Nutzung: \nAllgemein: \n • Regelmäßige Aktualisierung (5 Min) \n • Metrische Einheiten \n • Deutsche Wetterberichte \n • Standortspezifische Daten \nDatenqualität: \n • Hohe Aktualität \n • Moderate lokale Präzision \n • Gut für Trendabschätzung \n • Als Ergänzung zu lokalen Sensoren \nBesondere Hinweise: \n • API-Zugriffslimits beachten \n • Kostenpflichtiger Service \n • Verzögerung möglich \n\n", "locationSelection": "coordinates", "latitude": "51.66505556", "longitude": "7.30528333", "language": "de" }, "type": "n8n-nodes-base.openWeatherMapTool", "typeVersion": 1, "position": [ -1232, -768 ], "id": "4141ebdc-c847-454f-8822-5c2d7f545059", "name": "wetterbericht", "credentials": { "openWeatherMapApi": { "id": "ho62x3mzrnzigq4T", "name": "OpenWeatherMap account" } } }, { "parameters": {}, "type": "n8n-nodes-base.merge", "typeVersion": 3.2, "position": [ -2016, -1296 ], "id": "beb79b83-14e5-44ec-957f-878305638c13", "name": "Merge4" }, { "parameters": { "operation": "query", "query": "=// Quelle: InfluxDB Bucket mit Home Assistant Daten\ndata = from(bucket: \"home_assistant\")\n |> range(start: -24h)\n |> filter(fn: (r) =>\n r[\"entity_id\"] == \"sensor.innenstation_regenmesser_niederschlag_letzte_stunde\" and\n r[\"_field\"] == \"value\"\n )\n |> filter(fn: (r) => r[\"_measurement\"] == \"mm\") // optional, nur wenn vorhanden\n\n// Bestimme minimalen und maximalen Messwert\nmaxVal = data |> max(column: \"_value\")\nminVal = data |> min(column: \"_value\")\n\n// Ziehe Min von Max ab = Regenmenge in 24h\njoin(tables: {max: maxVal, min: minVal}, on: [\"entity_id\"])\n |> map(fn: (r) => ({\n _value: r._value_max - r._value_min,\n _field: \"value\",\n _measurement: \"precipitation\",\n result_type: \"rain_last_24h_precise\"\n }))\n |> yield(name: \"rain_last_24h_precise\")", "options": {} }, "type": "n8n-nodes-influxdb.influxDb", "typeVersion": 1, "position": [ -2176, -1200 ], "id": "f3a96767-f5dd-48cd-a0ed-cc647a721d48", "name": "InfluxDB Regen letzte 24 Stunden", "alwaysOutputData": true, "credentials": { "influxDb": { "id": "mOdqZZz9pI98IduE", "name": "InfluxDB Node" } }, "onError": "continueRegularOutput" }, { "parameters": { "text": "=Zusammenfassung:\n{{ $json.text }}\n", "schemaType": "fromJson", "jsonSchemaExample": "{\n \"bewässerung_empfohlen\": \"false\",\n \"empfohlener_zeitpunkt\": \"vermeiden\",\n \"begründung\": \"Die Bodenfeuchtigkeit liegt bei 27.300 Pa...\",\n \"zusammenfassung\": \"Keine Bewässerung erforderlich...\",\n \"status\": \"normal\",\n \"warnung\": \"\",\n \"bodenfeuchtigkeit_pa\": \"27300\",\n \"bodentemperatur_c\": \"20.6\",\n \"aussentemperatur_c\": \"20.9\",\n \"helligkeit_wqm\": \"141.7\",\n \"windgeschwindigkeit_kmh\": \"8\",\n \"windstaerke_kmh\": \"7.74\",\n \"bewertungsgrundlage\": \"Die Bodenfeuchtigkeit liegt bei 27.300 Pa...\"\n}", "options": { "systemPromptTemplate": "=Extrahiere aus dem folgenden Text die strukturierte JSON-Antwort nach folgendem Format. Achte auf:\n- Zahlen bitte als Float mit Punkt, nicht als String mit Komma\n- `true` / `false` als echte Booleans\n- Keine `\"type\"`-Felder verwenden\n\n" } }, "type": "@n8n/n8n-nodes-langchain.informationExtractor", "typeVersion": 1.2, "position": [ -1168, -1296 ], "id": "1a14e749-efcf-4059-92b9-240c39bb9030", "name": "Information Extractor1", "alwaysOutputData": true, "retryOnFail": true, "onError": "continueRegularOutput" }, { "parameters": { "mode": "combine", "combineBy": "combineByPosition", "options": {} }, "type": "n8n-nodes-base.merge", "typeVersion": 3.2, "position": [ -832, -1296 ], "id": "d356d088-8db7-456d-a8a2-24a7088027c7", "name": "Merge5" }, { "parameters": { "assignments": { "assignments": [ { "id": "7573c93e-ecbf-4919-8fea-399f8f6571b3", "name": "totalRainfall_7d", "value": "={{ $json.historicalAnalysis.totalRainfall_7d }}", "type": "number" }, { "id": "acd115b8-06eb-4bb3-aa59-d84470dfa31d", "name": "rain_last_24h", "value": "={{ $json.historicalAnalysis.rain_last_24h }}", "type": "number" }, { "id": "29cfb0df-ea49-4b7f-af61-62c640eb93fe", "name": "hoursSinceLastRain", "value": "={{ $json.historicalAnalysis.hoursSinceLastRain }}", "type": "number" }, { "id": "ffa1d02a-14be-4aec-9ef1-ecc512a786a5", "name": "rainEvents", "value": "={{ $json.historicalAnalysis.rainEvents }}", "type": "number" }, { "id": "f35f5865-3d3a-44d6-b252-132bb5409b92", "name": "estimatedEvaporation_7d", "value": "={{ $json.historicalAnalysis.estimatedEvaporation_7d }}", "type": "number" }, { "id": "069b01e2-36e2-4fa1-b9d0-742d07acc96c", "name": "effectiveMoisture", "value": "={{ $json.historicalAnalysis.effectiveMoisture }}", "type": "number" }, { "id": "b021c447-2cd6-4cf3-ba4d-a48bd73adc8b", "name": "dailyAverageRainfall", "value": "={{ $json.historicalAnalysis.dailyAverageRainfall }}", "type": "number" }, { "id": "860cee74-d5be-48b8-8126-729c7a9ebb9d", "name": "maxDailyRainfall", "value": "={{ $json.historicalAnalysis.maxDailyRainfall }}", "type": "number" }, { "id": "234bba45-bcc9-4707-bda5-949a74223650", "name": "daysWithRain", "value": "={{ $json.historicalAnalysis.daysWithRain }}", "type": "number" }, { "id": "26563f40-62cc-47fd-9071-f47b3e5f77c9", "name": "daysWithoutRain", "value": "={{ $json.historicalAnalysis.daysWithoutRain }}", "type": "number" }, { "id": "bdec7861-1626-4a4c-ac25-cdf0e657daa6", "name": "moistureStatus", "value": "={{ $json.historicalAnalysis.moistureStatus }}", "type": "string" }, { "id": "a5056a8d-868e-4415-8778-1410a1bb9e92", "name": "lastRainAmount", "value": "={{ $json.historicalAnalysis.rainPattern.lastRainAmount }}", "type": "number" }, { "id": "37f1d45b-46ff-45ac-89d0-0a26a4178fbb", "name": "lastRainTime", "value": "={{ $json.historicalAnalysis.rainPattern.lastRainTime }}", "type": "string" }, { "id": "9925f924-0a24-4bef-bb4d-e956f083660b", "name": "typicalRainHours", "value": "={{ $json.historicalAnalysis.rainPattern.typicalRainHours[0] }}", "type": "number" }, { "id": "123032fc-27f1-4deb-a016-97708f89131a", "name": "heavyRainEvents", "value": "={{ $json.historicalAnalysis.rainPattern.heavyRainEvents }}", "type": "number" }, { "id": "9580b8d2-d54e-4440-b1c5-6f365888441b", "name": "bewaesserung_empfohlen", "value": "={{ $json.output['bewässerung_empfohlen'] }}", "type": "string" }, { "id": "bd6da5d5-c97b-4ade-b41f-a0f72c8914d7", "name": "empfohlener_zeitpunkt", "value": "={{ $json.output.empfohlener_zeitpunkt }}", "type": "string" }, { "id": "a0a9d4db-1761-4718-83ae-e6731b6d3219", "name": "begruendung", "value": "={{ $json.output['begründung'] }}", "type": "string" }, { "id": "a9128706-49c3-4eed-ab09-974222c6c8a4", "name": "zusammenfassung", "value": "={{ $json.output.zusammenfassung }}", "type": "string" }, { "id": "a381acc4-1e42-44b9-acff-92a669664c4f", "name": "warnung", "value": "={{ $json.output.warnung }}", "type": "string" }, { "id": "6e465d5d-4c69-4e0a-93de-f6ef2f0c85fc", "name": "bodenfeuchtigkeit_pa", "value": "={{ parseFloat($json.output.bodenfeuchtigkeit_pa.replace('.', '').replace(',', '.')) }}", "type": "number" }, { "id": "ad0e9396-350e-4857-896f-4451690cc450", "name": "bodentemperatur_c", "value": "={{ parseFloat($json.output.bodentemperatur_c.replace(',', '.')) }}", "type": "number" }, { "id": "d1fa64b6-e423-4c25-86a7-f9c588bea104", "name": "aussentemperatur_c", "value": "={{ parseFloat($json.output.aussentemperatur_c.replace(',', '.')) }}", "type": "number" }, { "id": "97f7f36f-7fef-4a27-bfc4-2be1c38ba9ae", "name": "windgeschwindigkeit_kmh", "value": "= {{ parseFloat($json.output.windgeschwindigkeit_kmh.replace(',', '.')) }}", "type": "number" } ] }, "options": {} }, "type": "n8n-nodes-base.set", "typeVersion": 3.4, "position": [ -720, -1296 ], "id": "ec5069eb-cede-4056-8030-a413e1825b6d", "name": "Edit Fields", "alwaysOutputData": true, "onError": "continueRegularOutput" }, { "parameters": { "authentication": "nocoDbApiToken", "operation": "getAll", "projectId": "p5q5s1uvravppht", "table": "mxd8gvxkjnb55m4", "limit": "={{ 4 }}", "options": { "sort": { "property": [ { "field": "Id", "direction": "desc" } ] } } }, "type": "n8n-nodes-base.nocoDb", "typeVersion": 3, "position": [ 1776, -1280 ], "id": "bdaeb5aa-9013-48b9-ae21-cf60c4d4a630", "name": "historie", "executeOnce": true, "credentials": { "nocoDbApiToken": { "id": "hZudrbNwsvPaabda", "name": "NocoDB Token account" } } }, { "parameters": { "tableId": "regenanalyse", "fieldsUi": { "fieldValues": [ { "fieldId": "daten", "fieldValue": "={{ $json }}" } ] } }, "type": "n8n-nodes-base.supabase", "typeVersion": 1, "position": [ -592, -1296 ], "id": "8340cc98-bef8-4223-bf5f-2b7d12c2859c", "name": "Create regenanalyse", "credentials": { "supabaseApi": { "id": "hb1AHPrp7WwzAW4Z", "name": "Supabase account" } } }, { "parameters": { "tableId": "wetterprognose", "fieldsUi": { "fieldValues": [ { "fieldId": "daten", "fieldValue": "={{ $json.output }}" } ] } }, "type": "n8n-nodes-base.supabase", "typeVersion": 1, "position": [ -592, -944 ], "id": "0fa2c7a2-4169-4d97-897b-cfeff1f3b16c", "name": "Create wetterprognose", "credentials": { "supabaseApi": { "id": "hb1AHPrp7WwzAW4Z", "name": "Supabase account" } } }, { "parameters": { "operation": "getAll", "tableId": "wetterprognose", "limit": 1, "filterType": "string", "filterString": "=order=created_at.desc&limit=1" }, "type": "n8n-nodes-base.supabase", "typeVersion": 1, "position": [ 320, -1184 ], "id": "4dd0821f-12b1-4ac0-a3c0-8ec89e60a8ad", "name": "Get wetterprognose", "alwaysOutputData": false, "executeOnce": false, "credentials": { "supabaseApi": { "id": "hb1AHPrp7WwzAW4Z", "name": "Supabase account" } } }, { "parameters": { "operation": "getAll", "tableId": "regenanalyse", "limit": 1, "filterType": "string", "filterString": "order=created_at.desc&limit=1" }, "type": "n8n-nodes-base.supabase", "typeVersion": 1, "position": [ 320, -1360 ], "id": "1881f51d-a31c-46bb-8f26-de08a44f46f3", "name": "Get regenanalyse", "credentials": { "supabaseApi": { "id": "hb1AHPrp7WwzAW4Z", "name": "Supabase account" } } }, { "parameters": { "operation": "getAll", "tableId": "regenanalyse", "limit": 1, "filterType": "string", "filterString": "order=created_at.desc&limit=1" }, "type": "n8n-nodes-base.supabase", "typeVersion": 1, "position": [ 1776, -1456 ], "id": "5db1c7ea-a59e-4a52-8e6e-a1379bd7c169", "name": "Get regenanalyse2", "credentials": { "supabaseApi": { "id": "hb1AHPrp7WwzAW4Z", "name": "Supabase account" } } }, { "parameters": { "operation": "getAll", "tableId": "wetterprognose", "limit": 1, "filterType": "string", "filterString": "order=created_at.desc&limit=1" }, "type": "n8n-nodes-base.supabase", "typeVersion": 1, "position": [ 1776, -1120 ], "id": "5b94a5a7-8bf5-494e-b5a3-4539bf3312eb", "name": "Get wetterprognose2", "credentials": { "supabaseApi": { "id": "hb1AHPrp7WwzAW4Z", "name": "Supabase account" } } }, { "parameters": { "promptType": "define", "text": "=Aktuelle Wetterdaten aus Sensoren:\nWindgeschwindikeit:\n{{ $json.Sensordaten[0].windgeschwindigkeit }} km/h\nBodenfeuchtigkeit:\n{{ $json.Sensordaten[1].bodenfeuchtigkeit }} Pa\nRegen letze Stunde:\n{{ $json.Sensordaten[2].regen_letzte_stunde }} mm\nRegen heute:\n{{ $json.Sensordaten[4].regen_heute }} mm\nRegen aktuell:\n{{ $json.Sensordaten[8].regen_aktuell }} mm\nBodentemperatur:\n{{ $json.Sensordaten[3].bodentemperatur }} °C\nAussentemperatur:\n{{ $json.Sensordaten[5].aussentemperatur }} °C\n\nHistorische Daten der letzten 7 Tage:\nRegen insgesamt während der letzten 7 Tage (mm):\n{{ $('Code').item.json.historicalAnalysis.totalRainfall_7d }}\nRegen während der letzten 24 Stunden (mm):\n{{ $('Code').item.json.historicalAnalysis.rain_last_24h }}\nStunden seit letzten Regen (h):\n{{ $('Code').item.json.historicalAnalysis.hoursSinceLastRain }}\nAnzahl Regenereignisse:\n{{ $('Code').item.json.historicalAnalysis.rainEvents }}\nangenommene Evaporation (mm):\n{{ $('Code').item.json.historicalAnalysis.estimatedEvaporation_7d }}\nEffektive Feuchtigkeit: \n{{ $('Code').item.json.historicalAnalysis.effectiveMoisture }}\nDurchschnittliche Regenmenge pro Tag (mm/Tag):\n{{ $('Code').item.json.historicalAnalysis.dailyAverageRainfall }}\nMaximale tägliche Regenmenge (mm):\n{{ $('Code').item.json.historicalAnalysis.maxDailyRainfall }}\nTage mit Regen:\n{{ $('Code').item.json.historicalAnalysis.daysWithRain }}\nTage ohne Regen:\n{{ $('Code').item.json.historicalAnalysis.daysWithoutRain }}\nFeuchtigkeitsstatus: \n{{ $('Code').item.json.historicalAnalysis.moistureStatus }}\nAnmerkungen zum Bodenfeuchtesensor:\n{{ $('Code').item.json.historicalAnalysis.sensorNote }}{{ $('Code').item.json.recommendations.criticalNote }}\n\n\n", "needsFallback": true, "messages": { "messageValues": [ { "message": "=## Rolle\nDu bist ein intelligenter Bewässerungsberater. Der auf Basis aktueller Wetterdaten eine Empfehlung gibt, ob und wann bewässert werden soll. \n\n## Ziel \nDu ermittelst den aktuellen Feuchtigkeitszustand der zu bewässernden Beete und gibst eine Empfehlung zur Bewässerung.\n\n## Regeln\n- Der Sensor `aussentemperatur` misst die aktuelle Außentemperatur in °C. Werte über 25 °C erhöhen die Verdunstungsrate deutlich. \n- Der Sensor `bodenfeuchtigkeit` gibt die Bodenfeuchte in Pascal an. Werte über 20.000 Pa deuten auf Trockenheit hin und machen eine Bewässerung erforderlich. \n- Der Sensor `bodentemperatur` misst die Temperatur im Boden. Werte unter 8 °C hemmen das Pflanzenwachstum. \n- Der Sensor `helligkeit` misst die Sonneneinstrahlung in W/m². Hohe Werte erhöhen die Verdunstung. Ist der Wert 0 ist es Nacht. \n- Der Sensor `regen_aktuell` liefert die aktuelle Regenintensität in mm/h. Bei Werten > 0 ist sofortige Bewässerung zu vermeiden. \n- Der Sensor `regen_heute` zeigt die Tagesniederschlagsmenge in mm. Wichtig zur Abschätzung des Wasserbedarfs. \n- Der Sensor `regen_letzte_Stunde` gibt die Regenmenge der letzten 60 Minuten an. \n- Der Sensor `windgeschwindigkeit` misst die aktuelle Windgeschwindigkeit in km/h. \n- Du antwortest immer in deutscher Sprache\n\n---\n\n## Aufgabe\nAnalysiere die Daten und gibt eine fundierte Entscheidung zur Bewässerung ab. Berücksichtige:\n\n- Bodenfeuchte und Bodentemperatur \n- Niederschlagswerte (aktuell und historisch) \n- Windgeschwindigkeit\n- Temperatur \n- Helligkeit \n- Verdunstungsrisiko basierend auf Sonnenstrahlung, Temperatur und Wind \n\n---\n\n## Ausgabe\nFormuliere deine Empfehlung die auch **alle** Wetterdaten aus den Sensoren enthält **immer in deutscher Sprache** und **in natürlichem Fließtext**, z. B.:\n\n> „Die Bodensensoren zeigen eine geringe Feuchtigkeit bei milden Temperaturen. Aufgrund ausbleibender Niederschläge und leichtem Wind ist eine Bewässerung empfehlenswert – optimalerweise in den frühen Morgenstunden.“\n\n### Abschließende Hinweise\nHier ist das aktuelle Datum/Uhrzeit: {{ $now }}" } ] }, "batching": {} }, "type": "@n8n/n8n-nodes-langchain.chainLlm", "typeVersion": 1.7, "position": [ -1472, -1296 ], "id": "4043aca1-0412-4d1c-ab4a-419f39e48a67", "name": "Basic LLM Chain1", "executeOnce": true, "alwaysOutputData": true, "onError": "continueRegularOutput" }, { "parameters": { "workflowId": { "__rl": true, "value": "dNpVtNV0nq7vx03d", "mode": "list", "cachedResultName": "HA Wettersensoren" }, "workflowInputs": { "mappingMode": "defineBelow", "value": {}, "matchingColumns": [], "schema": [], "attemptToConvertTypes": false, "convertFieldsToString": true }, "options": {} }, "type": "n8n-nodes-base.executeWorkflow", "typeVersion": 1.2, "position": [ -1728, -1296 ], "id": "afe6eb90-7cad-4d83-ac5c-ccc12ccf6606", "name": "Execute Workflow" }, { "parameters": { "assignments": { "assignments": [ { "id": "47d16652-a839-4e28-9200-73e007612d2e", "name": "Sensordaten", "value": "=[\n {\n \"windgeschwindigkeit\": 3,\n \"Einheit\": \"km/h\",\n \"Name\": \"Innenstation Windmesser Windgeschwindigkeit\"\n },\n {\n \"bodenfeuchtigkeit\": 50257.92,\n \"Einheit\": \"Pa\",\n \"Name\": \"Bodenfeuchtigkeit\"\n },\n {\n \"regen_letzte_stunde\": 0,\n \"Einheit\": \"mm\",\n \"Name\": \"Innenstation Regenmesser Niederschlagsmenge letzte Stunde\"\n },\n {\n \"bodentemperatur\": 23.5,\n \"Einheit\": \"°C\",\n \"Name\": \"Bodentemperatur\"\n },\n {\n \"regen_heute\": 0,\n \"Einheit\": \"mm\",\n \"Name\": \"Innenstation Regenmesser Niederschlagsmenge heute\"\n },\n {\n \"aussentemperatur\": 29.2,\n \"Einheit\": \"°C\",\n \"Name\": \"Hof-Aussentemperatur\"\n },\n {\n \"helligkeit\": 139.173480662983,\n \"Einheit\": \"W/m2\",\n \"Name\": \"Helligkeit W/m2\"\n },\n {\n \"windstaerke\": 2.376,\n \"Einheit\": \"km/h\",\n \"Name\": \"Windstärke\"\n },\n {\n \"regen_aktuell\": 0,\n \"Einheit\": \"mm\",\n \"Name\": \"Niederschlagsmenge aktuell\"\n }\n]", "type": "array" } ] }, "options": {} }, "type": "n8n-nodes-base.set", "typeVersion": 3.4, "position": [ -1600, -1296 ], "id": "da84d353-32a9-4b0a-873f-dc7643347cdb", "name": "Edit Fields2" }, { "parameters": { "model": "magistral:latest", "options": { "temperature": 0.2, "topK": 3, "frequencyPenalty": 0.1, "numBatch": 512 } }, "type": "@n8n/n8n-nodes-langchain.lmChatOllama", "typeVersion": 1, "position": [ -1552, -768 ], "id": "23c3d304-04ba-46d8-a2e4-2297e0f09771", "name": "magistral", "credentials": { "ollamaApi": { "id": "cSpvUQabv4bffpzC", "name": "Ollama account" } } }, { "parameters": { "assignments": { "assignments": [ { "id": "c74f3f8a-e5bc-435b-af1f-b7209574d1cb", "name": "Pizzaofen", "value": "=[\n {\n \"entity_id\": \"sensor.bewasserung_zone_1\",\n \"state\": \"2025-07-18T21:06:00.241197+02:00\",\n \"attributes\": {\n \"name\": \"Pizzaofen\",\n \"area\": 5,\n \"flow_rate\": 200,\n \"soil_factor\": 1,\n \"plant_type\": \"Rosen/Stauden\",\n \"sun_exposure\": \"Volle Sonne\",\n \"base_water_need\": 48.8,\n \"friendly_name\": \"Bewässerung Zone 1\"\n },\n \"last_changed\": \"2025-07-18T19:06:00.241467+00:00\",\n \"last_reported\": \"2025-07-18T19:06:00.241467+00:00\",\n \"last_updated\": \"2025-07-18T19:06:00.241467+00:00\",\n \"context\": {\n \"id\": \"01K0FEVNNHM4VWYV9ATHEYQR3E\",\n \"parent_id\": null,\n \"user_id\": null\n }\n }\n]", "type": "array" }, { "id": "8a0a608e-5086-454b-adfa-d58b16b5174f", "name": "Laubengang", "value": "=[\n {\n \"entity_id\": \"sensor.bewasserung_zone_2\",\n \"state\": \"2025-07-18T21:06:00.160299+02:00\",\n \"attributes\": {\n \"name\": \"Laubengang\",\n \"area\": 10,\n \"flow_rate\": 250,\n \"soil_factor\": 1.3,\n \"plant_type\": \"Rosen/Stauden\",\n \"sun_exposure\": \"Volle Sonne\",\n \"base_water_need\": 63.4,\n \"friendly_name\": \"Bewässerung Zone 2\"\n },\n \"last_changed\": \"2025-07-18T19:06:00.160567+00:00\",\n \"last_reported\": \"2025-07-18T19:06:00.160567+00:00\",\n \"last_updated\": \"2025-07-18T19:06:00.160567+00:00\",\n \"context\": {\n \"id\": \"01K0FEVNK0AM5M8F43KZJ0C60A\",\n \"parent_id\": null,\n \"user_id\": null\n }\n }\n]", "type": "array" }, { "id": "f9f72fcd-ee98-4a29-af4b-01fc30e73634", "name": "Scheune", "value": "=[\n {\n \"entity_id\": \"sensor.bewasserung_zone_3\",\n \"state\": \"2025-07-18T21:06:00.292321+02:00\",\n \"attributes\": {\n \"name\": \"Scheune\",\n \"area\": 5,\n \"flow_rate\": 200,\n \"soil_factor\": 1,\n \"plant_type\": \"Rosen\",\n \"sun_exposure\": \"Volle Sonne\",\n \"base_water_need\": 48.8,\n \"friendly_name\": \"Bewässerung Zone 3\"\n },\n \"last_changed\": \"2025-07-18T19:06:00.292611+00:00\",\n \"last_reported\": \"2025-07-18T19:06:00.292611+00:00\",\n \"last_updated\": \"2025-07-18T19:06:00.292611+00:00\",\n \"context\": {\n \"id\": \"01K0FEVNQ45Z5ZNCKCSE1ES0BS\",\n \"parent_id\": null,\n \"user_id\": null\n }\n }\n]", "type": "array" }, { "id": "621e16ad-07a4-444e-95c1-2a3c6df94e7b", "name": "Troege", "value": "=[\n {\n \"entity_id\": \"sensor.bewasserung_zone_4\",\n \"state\": \"2025-07-18T21:06:00.224592+02:00\",\n \"attributes\": {\n \"name\": \"Troege\",\n \"area\": 3.5,\n \"flow_rate\": 200,\n \"soil_factor\": 1,\n \"plant_type\": \"Blumen\",\n \"sun_exposure\": \"Volle Sonne\",\n \"base_water_need\": 42.2,\n \"friendly_name\": \"Bewässerung Zone 4\"\n },\n \"last_changed\": \"2025-07-18T19:06:00.224807+00:00\",\n \"last_reported\": \"2025-07-18T19:06:00.224807+00:00\",\n \"last_updated\": \"2025-07-18T19:06:00.224807+00:00\",\n \"context\": {\n \"id\": \"01K0FEVNN06Z4DANRPGG819HBV\",\n \"parent_id\": null,\n \"user_id\": null\n }\n }\n]", "type": "array" } ] }, "options": {} }, "type": "n8n-nodes-base.set", "typeVersion": 3.4, "position": [ -592, -1584 ], "id": "e68420aa-66aa-4cd9-8e01-acc07c159577", "name": "Edit Fields1" }, { "parameters": { "model": "mistralai/mistral-small-3.1-24b-instruct", "options": {} }, "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter", "typeVersion": 1, "position": [ -1312, -1152 ], "id": "4b05ac18-6b72-416c-bd5d-8863a04b10d6", "name": "OpenRouter Chat Model", "credentials": { "openRouterApi": { "id": "psWYtItqvuL8brJO", "name": "OpenRouter account" } } }, { "parameters": { "model": "mistral-small3.1:24b-instruct-2503-q8_0", "options": {} }, "type": "@n8n/n8n-nodes-langchain.lmOllama", "typeVersion": 1, "position": [ -1056, -1152 ], "id": "ae908a67-219b-4714-8e2e-df2bd5c2dfaa", "name": "mistral-small3.1", "credentials": { "ollamaApi": { "id": "cSpvUQabv4bffpzC", "name": "Ollama account" } } }, { "parameters": { "model": "magistral:latest", "options": {} }, "type": "@n8n/n8n-nodes-langchain.lmOllama", "typeVersion": 1, "position": [ -1488, -1152 ], "id": "277e6cf4-15c9-44af-a635-eb2cb9145b58", "name": "magistral1", "credentials": { "ollamaApi": { "id": "cSpvUQabv4bffpzC", "name": "Ollama account" } } }, { "parameters": { "content": "## KI-Bewässerungsmanager\n**KI Workflow zum steuerun der Bewässerung von Beeten, der Workflow liest Sensoren aus Homeassistant aus, holt eine Wetterprognose ein und errechnet auf Basis der vorgegeben Parameter (Fläche, Bodengüte, Pflanzenart , Sonnenlage) den Wasserbedarf pro Beet und die daraus resultierende Bewässerungszeit und übertärgt die Daten an Homeassistant**", "height": 128, "width": 1024, "color": 5 }, "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [ -2704, -1792 ], "id": "f934842e-6b93-4c03-8f48-e17db62cc005", "name": "Sticky Note" }, { "parameters": { "content": "## Starttrigger \n**Der workflow wird täglich 1 Stunden und 30 Minuten vor Sunrise aus Homeassistant heraus getriggert, Übertragung von Homeassistant per MQTT** ", "height": 992, "color": 3 }, "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [ -2704, -1632 ], "id": "005096e8-ad9d-4fa0-a8f5-a77c5d014651", "name": "Sticky Note1" }, { "parameters": { "content": "## Abruf Bewässerungszonen\n**pro Zone:\n- Fläche\n- Bodengüte\n- Sonnelage\n- Pflanzenart u.a.** ", "height": 192, "width": 2016, "color": 2 }, "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [ -2432, -1632 ], "id": "e3630abb-fe7f-445a-ad9b-096c458eb94e", "name": "Sticky Note2" }, { "parameters": { "content": "## Regenanalyse \n**Abruf Regendaten\n- aktuelle Sensordaten aus HA\n- Histrische Regendaten (7Tage aus \nInfluxDB)** ", "height": 384, "width": 2016, "color": 5 }, "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [ -2432, -1408 ], "id": "214a27fb-209a-44db-adb2-c15513eb658f", "name": "Sticky Note3" }, { "parameters": { "content": "## Wetterbericht und Wetterprgnose \n*Abruf von Wetterbericht und Wetterprognose\nfür die nächsten 48 Stunden aus Openweathermap\nAnalyse und Zusammenfassung von Bericht und \nin Bezug auf Bewässerungsanforderungen**", "height": 352, "width": 2016, "color": 4 }, "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [ -2432, -992 ], "id": "62636462-ad6c-4694-b312-9966304b71e8", "name": "Sticky Note4" }, { "parameters": { "content": "## 🔁 **Zonen-Vorverarbeitung**\n**1. Filtert nur Zonen mit gültigem `attributes.name`\n2. Extrahiert: `flow_rate`, `area`, `plant_type`, etc.\n3. Vergibt interne IDs wie `zone_1`, `zone_2`, …\n4. Gibt sauberes JSON zurück → ideal für Merge/Analyse** ", "height": 992, "width": 336 }, "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [ -336, -1632 ], "id": "8abbc0df-3c11-4032-b641-44fc40bd99eb", "name": "Sticky Note5" }, { "parameters": { "content": "## Ermittlung Wasserbedarf pro Zone \"Loop über Zonen\"\n**Berechnet den individuellen Wasserbedarf einer Bewässerungszone basierend auf Eingabedaten vom Agenten (z. B. Fläche, Bodentyp, Sonnenlage) sowie aktuellen Wetter- und Regenanalysen.\nDer Code berücksichtigt:\n\t•\tBasiswasserbedarf pro m²\n\t•\teffektiven Niederschlag der letzten 7 Tage (konservativ berechnet)\n\t•\tEvapotranspiration (Verdunstung)\n\t•\tBodenfaktor & Flächenangabe\n\t•\tDurchflussrate des Bewässerungssystems\n\nErgebnis ist eine empfohlene Gesamtgießzeit (in Minuten), aufgeteilt in sinnvolle Gaben und Tageszeiten – je nach Sonneneinstrahlung.** ", "height": 1472, "width": 1616, "color": 3 }, "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [ 32, -1904 ], "id": "871e0d36-3244-46b9-a17d-9c879556b7de", "name": "Sticky Note6" }, { "parameters": { "content": "## Ergebnisversand per WhatsApp\n**Abruf der gesammelten Daten und Versendung per Whatts app* ", "height": 752, "width": 608, "color": 4 }, "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [ 1696, -1616 ], "id": "e7597efc-bd84-458e-ba83-da0d3a907bcc", "name": "Sticky Note7" } ], "pinData": {}, "connections": { "When clicking ‘Test workflow’": { "main": [ [ { "node": "Bewässerung Zone 1", "type": "main", "index": 0 }, { "node": "Get HA Sensors", "type": "main", "index": 0 }, { "node": "AI Agent Wetterbericht -prognose", "type": "main", "index": 0 } ] ] }, "AI Agent Wetterbericht -prognose": { "main": [ [ { "node": "Create wetterprognose", "type": "main", "index": 0 } ] ] }, "Get HA Sensors": { "main": [ [ { "node": "InfluxDB Regen letzte 7 Tage mm", "type": "main", "index": 0 }, { "node": "InfluxDB Regen letzte 24 Stunden", "type": "main", "index": 0 } ] ] }, "InfluxDB Regen letzte 7 Tage mm": { "main": [ [ { "node": "Merge4", "type": "main", "index": 0 } ] ] }, "Code": { "main": [ [ { "node": "Execute Workflow", "type": "main", "index": 0 }, { "node": "Merge5", "type": "main", "index": 0 } ] ] }, "MQTT Trigger": { "main": [ [ { "node": "Bewässerung Zone 1", "type": "main", "index": 0 }, { "node": "Get HA Sensors", "type": "main", "index": 0 }, { "node": "AI Agent Wetterbericht -prognose", "type": "main", "index": 0 } ] ] }, "Bewässerung Zone 1": { "main": [ [ { "node": "Bewässerung Zone 2", "type": "main", "index": 0 } ] ] }, "Bewässerung Zone 2": { "main": [ [ { "node": "Bewässerung Zone 3", "type": "main", "index": 0 } ] ] }, "Bewässerung Zone 3": { "main": [ [ { "node": "Bewässerung Zone 4", "type": "main", "index": 0 } ] ] }, "Bewässerung Zone 4": { "main": [ [ { "node": "Edit Fields1", "type": "main", "index": 0 } ] ] }, "Merge": { "main": [ [ { "node": "Code1", "type": "main", "index": 0 } ] ] }, "Code1": { "main": [ [ { "node": "Loop Over Items", "type": "main", "index": 0 } ] ] }, "Loop Over Items": { "main": [ [], [ { "node": "Get wetterprognose", "type": "main", "index": 0 }, { "node": "Get regenanalyse", "type": "main", "index": 0 }, { "node": "Merge1", "type": "main", "index": 1 } ] ] }, "Code2": { "main": [ [ { "node": "Dauer Morgens", "type": "main", "index": 0 }, { "node": "Dauer Nachmittags", "type": "main", "index": 0 }, { "node": "Create a row", "type": "main", "index": 0 } ] ] }, "Merge1": { "main": [ [ { "node": "Code2", "type": "main", "index": 0 } ] ] }, "Dauer Morgens": { "main": [ [ { "node": "Switch morgens", "type": "main", "index": 0 } ] ] }, "Dauer Nachmittags": { "main": [ [ { "node": "Switch1", "type": "main", "index": 0 } ] ] }, "Merge2": { "main": [ [ { "node": "Loop Over Items", "type": "main", "index": 0 }, { "node": "Get wetterprognose2", "type": "main", "index": 0 }, { "node": "Get regenanalyse2", "type": "main", "index": 0 }, { "node": "historie", "type": "main", "index": 0 } ] ] }, "Create a row": { "main": [ [ { "node": "Merge2", "type": "main", "index": 1 } ] ] }, "Merge3": { "main": [ [ { "node": "Send a text message", "type": "main", "index": 0 } ] ] }, "Switch1": { "main": [ [ { "node": "Dauer Scheune Nachmittags", "type": "main", "index": 0 } ], [ { "node": "Dauer Laubengang Nachmittags1", "type": "main", "index": 0 } ], [ { "node": "Dauer Pizzaofen Nachmittags2", "type": "main", "index": 0 } ], [ { "node": "Dauer Tröge Nachmittags3", "type": "main", "index": 0 } ] ] }, "Dauer Laubengang morgens1": { "main": [ [ { "node": "Merge2", "type": "main", "index": 0 } ] ] }, "Dauer Scheune morgens": { "main": [ [ { "node": "Merge2", "type": "main", "index": 0 } ] ] }, "Dauer Pizzaofen morgens2": { "main": [ [ { "node": "Merge2", "type": "main", "index": 0 } ] ] }, "Dauer Tröge morgens3": { "main": [ [ { "node": "Merge2", "type": "main", "index": 0 } ] ] }, "Switch morgens": { "main": [ [ { "node": "Dauer Scheune morgens", "type": "main", "index": 0 } ], [ { "node": "Dauer Laubengang morgens1", "type": "main", "index": 0 } ], [ { "node": "Dauer Pizzaofen morgens2", "type": "main", "index": 0 } ], [ { "node": "Dauer Tröge morgens3", "type": "main", "index": 0 } ] ] }, "Dauer Scheune Nachmittags": { "main": [ [ { "node": "Merge2", "type": "main", "index": 2 } ] ] }, "Dauer Laubengang Nachmittags1": { "main": [ [ { "node": "Merge2", "type": "main", "index": 2 } ] ] }, "Dauer Tröge Nachmittags3": { "main": [ [ { "node": "Merge2", "type": "main", "index": 2 } ] ] }, "Dauer Pizzaofen Nachmittags2": { "main": [ [ { "node": "Merge2", "type": "main", "index": 2 } ] ] }, "wetterprognose": { "ai_tool": [ [ { "node": "AI Agent Wetterbericht -prognose", "type": "ai_tool", "index": 0 } ] ] }, "wetterbericht": { "ai_tool": [ [ { "node": "AI Agent Wetterbericht -prognose", "type": "ai_tool", "index": 0 } ] ] }, "Merge4": { "main": [ [ { "node": "Code", "type": "main", "index": 0 } ] ] }, "InfluxDB Regen letzte 24 Stunden": { "main": [ [ { "node": "Merge4", "type": "main", "index": 1 } ] ] }, "Information Extractor1": { "main": [ [ { "node": "Merge5", "type": "main", "index": 1 } ] ] }, "Merge5": { "main": [ [ { "node": "Edit Fields", "type": "main", "index": 0 } ] ] }, "Edit Fields": { "main": [ [ { "node": "Create regenanalyse", "type": "main", "index": 0 } ] ] }, "historie": { "main": [ [ { "node": "Merge3", "type": "main", "index": 1 } ] ] }, "Create regenanalyse": { "main": [ [ { "node": "Merge", "type": "main", "index": 1 } ] ] }, "Create wetterprognose": { "main": [ [ { "node": "Merge", "type": "main", "index": 2 } ] ] }, "Get wetterprognose": { "main": [ [ { "node": "Merge1", "type": "main", "index": 2 } ] ] }, "Get regenanalyse": { "main": [ [ { "node": "Merge1", "type": "main", "index": 0 } ] ] }, "Get regenanalyse2": { "main": [ [ { "node": "Merge3", "type": "main", "index": 0 } ] ] }, "Get wetterprognose2": { "main": [ [ { "node": "Merge3", "type": "main", "index": 2 } ] ] }, "Basic LLM Chain1": { "main": [ [ { "node": "Information Extractor1", "type": "main", "index": 0 } ] ] }, "Execute Workflow": { "main": [ [ { "node": "Edit Fields2", "type": "main", "index": 0 } ] ] }, "Edit Fields2": { "main": [ [ { "node": "Basic LLM Chain1", "type": "main", "index": 0 } ] ] }, "magistral": { "ai_languageModel": [ [ { "node": "AI Agent Wetterbericht -prognose", "type": "ai_languageModel", "index": 0 } ] ] }, "Edit Fields1": { "main": [ [ { "node": "Merge", "type": "main", "index": 0 } ] ] }, "OpenRouter Chat Model": { "ai_languageModel": [ [ { "node": "Basic LLM Chain1", "type": "ai_languageModel", "index": 1 } ] ] }, "mistral-small3.1": { "ai_languageModel": [ [ { "node": "Information Extractor1", "type": "ai_languageModel", "index": 0 } ] ] }, "magistral1": { "ai_languageModel": [ [ { "node": "Basic LLM Chain1", "type": "ai_languageModel", "index": 0 } ] ] } }, "active": true, "settings": { "executionOrder": "v1", "timezone": "Europe/Berlin", "callerPolicy": "workflowsFromSameOwner" }, "versionId": "6921fac5-8523-4e76-b83e-f6106ba5c473", "meta": { "templateCredsSetupCompleted": true, "instanceId": "6946cc975d9f4262be37097670ed7d701ec6e91be1d76b57203e1d14dc0d53f8" }, "id": "7fM4UA7g4BBRlbo1", "tags": [] }