BMKG-Wetterüberwachung und Telegram-Alarmssystem

Fortgeschritten

Dies ist ein Automatisierungsworkflow mit 14 Nodes. Hauptsächlich werden If, Code, Telegram, HttpRequest, ManualTrigger und andere Nodes verwendet. Automatische Versand von Wetterwarnungen für Indonesien mit BMKG-Daten und Telegram-Benachrichtigungen

Voraussetzungen
  • Telegram Bot Token
  • Möglicherweise sind Ziel-API-Anmeldedaten erforderlich

Kategorie

-
Workflow-Vorschau
Visualisierung der Node-Verbindungen, mit Zoom und Pan
Workflow exportieren
Kopieren Sie die folgende JSON-Konfiguration und importieren Sie sie in n8n
{
  "id": "oezF9oCv3tPecrSv",
  "meta": {
    "instanceId": "b14f5dd921befc4584084cc386aea593f73c7c2b00b50933075d7967a4d1c502",
    "templateCredsSetupCompleted": true
  },
  "name": "BMKG Weather Monitoring & Telegram Alert System",
  "tags": [
    {
      "id": "5elPMuYGw7BLPyD5",
      "name": "Weather Monitoring EN",
      "createdAt": "2025-10-15T00:58:29.022Z",
      "updatedAt": "2025-10-15T00:58:29.022Z"
    }
  ],
  "nodes": [
    {
      "id": "a7760673-0f36-4693-b0e2-b12ec5319247",
      "name": "Zeitplan-Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -448,
        -16
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 6
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "bf292408-48a2-4fb8-baf5-38c7b5f36862",
      "name": "BMKG-Wetterdaten abrufen",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        112,
        192
      ],
      "parameters": {
        "url": "https://api.bmkg.go.id/publik/prakiraan-cuaca",
        "options": {}
      },
      "typeVersion": 4.1
    },
    {
      "id": "af473f94-7a67-4023-94b5-3bdf8015280a",
      "name": "Wetterdaten verarbeiten",
      "type": "n8n-nodes-base.code",
      "position": [
        304,
        0
      ],
      "parameters": {
        "jsCode": "// Process BMKG weather data\nconst inputData = $input.all();\nconst weatherData = inputData[0].json;\n\n// Check if data exists\nif (!weatherData || !weatherData.data || !weatherData.data[0] || !weatherData.data[0].cuaca) {\n    return [{\n        json: {\n            success: false,\n            error: 'Weather data not available from BMKG API',\n            timestamp: new Date().toISOString()\n        }\n    }];\n}\n\n// Extract location information\nconst location = weatherData.lokasi || {};\nconst cuacaData = weatherData.data[0].cuaca;\n\n// Process current and upcoming weather\nlet processedData = {\n    success: true,\n    timestamp: new Date().toISOString(),\n    location: {\n        desa: location.desa || 'Unknown',\n        kecamatan: location.kecamatan || 'Unknown',\n        kotkab: location.kotkab || 'Unknown',\n        provinsi: location.provinsi || 'Unknown',\n        lat: location.lat || 0,\n        lon: location.lon || 0,\n        timezone: location.timezone || 'Asia/Jakarta'\n    },\n    current_weather: {},\n    forecast_24hour: [],\n    summary: {\n        avg_temperature: 0,\n        avg_humidity: 0,\n        dominant_condition: '',\n        warnings: []\n    }\n};\n\n// Process current weather (first data point)\nif (cuacaData[0] && cuacaData[0][0]) {\n    const current = cuacaData[0][0];\n    processedData.current_weather = {\n        time: current.local_datetime || current.datetime,\n        temperature: current.t || 0,\n        humidity: current.hu || 0,\n        condition: current.weather_desc || current.weather_desc_en || 'Unknown',\n        wind_speed: current.ws || 0,\n        wind_direction: current.wd || 'N/A',\n        visibility: current.vs_text || 'N/A',\n        cloud_cover: current.tcc || 0,\n        rain_probability: current.tp || 0,\n        icon_url: current.image || ''\n    };\n}\n\n// Process 24-hour forecast\nlet totalTemperature = 0;\nlet totalHumidity = 0;\nlet count = 0;\nlet conditionCount = {};\n\n// Collect data from first day (today)\nif (cuacaData[0]) {\n    cuacaData[0].forEach(jam => {\n        if (jam && jam.t !== undefined) {\n            processedData.forecast_24hour.push({\n                time: jam.local_datetime || jam.datetime,\n                temperature: jam.t,\n                humidity: jam.hu || 0,\n                condition: jam.weather_desc || jam.weather_desc_en || 'Unknown',\n                wind_speed: jam.ws || 0,\n                wind_direction: jam.wd || 'N/A',\n                rain_probability: jam.tp || 0,\n                icon_url: jam.image || ''\n            });\n            \n            totalTemperature += jam.t;\n            totalHumidity += jam.hu || 0;\n            count++;\n            \n            const condition = jam.weather_desc || jam.weather_desc_en || 'Unknown';\n            conditionCount[condition] = (conditionCount[condition] || 0) + 1;\n        }\n    });\n}\n\n// Calculate averages and dominant condition\nif (count > 0) {\n    processedData.summary.avg_temperature = Math.round(totalTemperature / count * 10) / 10;\n    processedData.summary.avg_humidity = Math.round(totalHumidity / count);\n}\n\n// Find dominant weather condition\nlet maxCount = 0;\nfor (const [condition, conditionNum] of Object.entries(conditionCount)) {\n    if (conditionNum > maxCount) {\n        maxCount = conditionNum;\n        processedData.summary.dominant_condition = condition;\n    }\n}\n\n// Generate warnings\nconst warnings = [];\nif (processedData.summary.avg_temperature > 35) {\n    warnings.push('⚠️ Very hot temperature, avoid outdoor activities');\n}\nif (processedData.summary.avg_temperature < 20) {\n    warnings.push('🧥 Cold temperature, wear warm clothes');\n}\n\n// Check for rain probability\nconst avgRainProb = processedData.forecast_24hour.reduce((sum, item) => sum + (item.rain_probability || 0), 0) / processedData.forecast_24hour.length;\nif (avgRainProb > 60) {\n    warnings.push('☔ High rain probability, bring umbrella or raincoat');\n}\nif (avgRainProb > 30 && avgRainProb <= 60) {\n    warnings.push('🌦️ Possible rain, prepare rain gear');\n}\n\nprocessedData.summary.warnings = warnings;\n\nreturn [{ json: processedData }];"
      },
      "typeVersion": 2
    },
    {
      "id": "1ef3b9f1-5837-4ca4-90e6-b39bc37b778d",
      "name": "Telegram-Nachricht formatieren",
      "type": "n8n-nodes-base.code",
      "position": [
        608,
        16
      ],
      "parameters": {
        "jsCode": "// Format weather data for Telegram message\nconst data = $input.all()[0].json;\n\nif (!data.success) {\n    return [{\n        json: {\n            telegram_message: `❌ *BMKG Weather Monitoring Error*\\n\\n${data.error}\\n\\nTime: ${data.timestamp}\\n\\n_Powered by BMKG API & n8n_`,\n            parse_mode: 'Markdown'\n        }\n    }];\n}\n\n// Create beautiful Telegram message\nlet message = `🌤️ *BMKG Weather Report*\\n`;\nmessage += `📍 *${data.location.desa}, ${data.location.kecamatan}*\\n`;\nmessage += `🏙️ ${data.location.kotkab}, ${data.location.provinsi}\\n\\n`;\n\n// Current weather\nmessage += `🌡️ *Current Weather*\\n`;\nmessage += `• Temperature: *${data.current_weather.temperature}°C*\\n`;\nmessage += `• Condition: ${data.current_weather.condition}\\n`;\nmessage += `• Humidity: ${data.current_weather.humidity}%\\n`;\nmessage += `• Wind: ${data.current_weather.wind_speed} km/h from ${data.current_weather.wind_direction}\\n`;\nmessage += `• Visibility: ${data.current_weather.visibility}\\n`;\n\nif (data.current_weather.rain_probability > 0) {\n    message += `• Rain Prob.: ${data.current_weather.rain_probability}%\\n`;\n}\nmessage += `\\n`;\n\n// Summary\nmessage += `📊 *24 Hour Summary*\\n`;\nmessage += `• Average Temperature: *${data.summary.avg_temperature}°C*\\n`;\nmessage += `• Average Humidity: ${data.summary.avg_humidity}%\\n`;\nmessage += `• Dominant Condition: ${data.summary.dominant_condition}\\n\\n`;\n\n// Warnings\nif (data.summary.warnings.length > 0) {\n    message += `⚠️ *Warnings & Suggestions:*\\n`;\n    data.summary.warnings.forEach(warning => {\n        message += `• ${warning}\\n`;\n    });\n    message += `\\n`;\n}\n\n// Next few hours forecast (first 6 hours)\nmessage += `⏰ *6 Hour Forecast:*\\n`;\nconst nextHours = data.forecast_24hour.slice(0, 6);\nnextHours.forEach((forecast, index) => {\n    const time = new Date(forecast.time).toLocaleTimeString('en-US', { \n        hour: '2-digit', \n        minute: '2-digit',\n        timeZone: data.location.timezone \n    });\n    message += `• ${time}: ${forecast.temperature}°C, ${forecast.condition}`;\n    if (forecast.rain_probability > 30) {\n        message += ` (☔${forecast.rain_probability}%)`;\n    }\n    message += `\\n`;\n});\n\nmessage += `\\n📅 Updated: ${new Date(data.timestamp).toLocaleString('en-US', {\n    timeZone: data.location.timezone,\n    year: 'numeric',\n    month: 'long',\n    day: 'numeric',\n    hour: '2-digit',\n    minute: '2-digit'\n})} ${data.location.timezone}`;\n\nmessage += `\\n\\n_🤖 Automated by n8n | 📡 Data: BMKG_`;\n\nreturn [{\n    json: {\n        telegram_message: message,\n        parse_mode: 'Markdown',\n        weather_data: data\n    }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "ddc33a20-96a8-40bc-9788-6e12f40f88ef",
      "name": "Wetterbericht senden",
      "type": "n8n-nodes-base.telegram",
      "position": [
        1264,
        400
      ],
      "webhookId": "594b5594-af4a-4dfd-8a93-15a5683919cd",
      "parameters": {
        "text": "={{ $json.telegram_message }}",
        "chatId": "{{TELEGRAM_CHAT_ID}}",
        "additionalFields": {
          "parse_mode": "Markdown"
        }
      },
      "credentials": {
        "telegramApi": {
          "id": "5UNbimarOaH1QxRo",
          "name": "Telegram account 2"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "fdd12bf7-a818-41ef-9c94-65638fd9dac4",
      "name": "Manueller Test",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -480,
        240
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "3d011775-063e-4a17-ae84-c6c45bc5f3f1",
      "name": "Erfolg prüfen",
      "type": "n8n-nodes-base.if",
      "position": [
        368,
        224
      ],
      "parameters": {
        "conditions": {
          "boolean": [
            {
              "value1": "={{ $json.success }}",
              "value2": true
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "bfd54738-c07c-4f0e-9acf-e96971e21210",
      "name": "Fehlerbehandlung",
      "type": "n8n-nodes-base.code",
      "position": [
        624,
        224
      ],
      "parameters": {
        "jsCode": "// Log error details\nconst inputData = $input.all()[0].json;\n\nconsole.error('Weather monitoring error:', inputData);\n\nlet errorMessage = `❌ *Weather Monitoring System Error*\\n\\n`;\nerrorMessage += `🕐 Time: ${new Date().toLocaleString('en-US')}\\n`;\nerrorMessage += `❗ Details: ${inputData.error || 'Unknown error'}\\n\\n`;\nerrorMessage += `_System will try again on next schedule_`;\n\nreturn [{\n    json: {\n        telegram_message: errorMessage,\n        parse_mode: 'Markdown',\n        error_logged: true\n    }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "c80c80f8-6f09-4112-8928-9552b6a6ee04",
      "name": "Fehleralarm senden",
      "type": "n8n-nodes-base.telegram",
      "position": [
        864,
        400
      ],
      "webhookId": "ed4ebdc5-39cf-4d7c-9c52-1a3b9008b28c",
      "parameters": {
        "text": "={{ $json.telegram_message }}",
        "chatId": "{{TELEGRAM_CHAT_ID}}",
        "additionalFields": {
          "parse_mode": "Markdown"
        }
      },
      "credentials": {
        "telegramApi": {
          "id": "5UNbimarOaH1QxRo",
          "name": "Telegram account 2"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "c84af71c-e6b8-465e-b968-9f7eda7f4eaf",
      "name": "Haftnotiz",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1312,
        -64
      ],
      "parameters": {
        "width": 432,
        "height": 416,
        "content": "## 🎓 **LEARNING RESOURCES**\n\n### **n8n Documentation:**\n- **Official Docs**: https://docs.n8n.io\n- **Node Reference**: https://docs.n8n.io/integrations/\n- **Workflow Examples**: https://n8n.io/workflows/\n\n### **BMKG API Information:**\n- **API Documentation**: https://api.bmkg.go.id\n- **Region Codes**: Available in API response\n- **Data Format**: JSON structure documentation\n\n### **Telegram Bot API:**\n- **Bot Creation**: https://core.telegram.org/bots\n- **API Reference**: https://core.telegram.org/bots/api\n\n***\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "2581be27-b445-43ba-bc5d-534febc19d38",
      "name": "Haftnotiz1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        48,
        -160
      ],
      "parameters": {
        "width": 784,
        "height": 80,
        "content": "## 🌤️ **BMKG WEATHER MONITORING & TELEGRAM ALERT SYSTEM**"
      },
      "typeVersion": 1
    },
    {
      "id": "889ea56c-10e2-4901-9889-868ed741bf48",
      "name": "Haftnotiz2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        848,
        -64
      ],
      "parameters": {
        "width": 512,
        "height": 560,
        "content": "### **Create Your Bot**\n- Open Telegram and find @BotFather\n\n- Start a chat and send /newbot\n\n- Follow instructions to set bot name and username\n\n- Copy the Bot Token provided (format: 123456789:ABCdef...)\n\n- Save the token securely for configuration\n\n### **Get Your Chat ID**\n- Start a chat with your new bot and send any message\n\n- Visit https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates in a browser (replace <YOUR_BOT_TOKEN> with your bot token)\n\n- Find the Chat ID number in the JSON response under \"chat\": {\"id\": 123456789, ...}\n\n- Copy the Chat ID for use in your workflow or configuration"
      },
      "typeVersion": 1
    },
    {
      "id": "f496550d-b5ea-4d73-bf9b-a38ea9ec3027",
      "name": "Haftnotiz3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -864,
        -64
      ],
      "parameters": {
        "width": 528,
        "height": 288,
        "content": "\n### **Enable Automatic Mode:**\n1. **Click workflow name** at top of canvas\n2. **Toggle \"Active\" switch** to ON position\n3. **Workflow status** should show \"Active\"\n4. **Schedule Trigger** will run every 6 hours automatically\n\n### **Schedule Settings:**\n- **Default**: Every 6 hours (4 reports per day)\n- **Modify timing**: Edit \"Schedule Trigger\" node\n- **Options**: 1, 3, 6, 12, or 24 hours\n- **Peak times**: 6AM, 12PM, 6PM, 12AM (with 6-hour interval)"
      },
      "typeVersion": 1
    },
    {
      "id": "13d5c622-9b20-46b6-861a-36cb9babcb1c",
      "name": "Haftnotiz4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -304,
        -64
      ],
      "parameters": {
        "width": 528,
        "height": 368,
        "content": "### **Update Chat IDs**\nReplace {{TELEGRAM_CHAT_ID}} with your actual Chat ID in both \"Send Weather Report\" and \"Send Error Alert\" nodes (e.g., 123456789).\n\n### **Link Telegram Credentials**\n**Select your saved Telegram credential in the \"Credential\" dropdown of both \"Send Weather Report\" and \"Send Error Alert\" nodes.**\n\n### **Configure Location (Optional)**\n**In \"Get BMKG Weather Data\" node, add a Query parameter named adm4 with your BMKG region code (e.g., 31.71.03.1001).**"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "c83de10d-8b0b-48ed-bb16-f095f85580fe",
  "connections": {
    "fdd12bf7-a818-41ef-9c94-65638fd9dac4": {
      "main": [
        [
          {
            "node": "bf292408-48a2-4fb8-baf5-38c7b5f36862",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3d011775-063e-4a17-ae84-c6c45bc5f3f1": {
      "main": [
        [
          {
            "node": "1ef3b9f1-5837-4ca4-90e6-b39bc37b778d",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "bfd54738-c07c-4f0e-9acf-e96971e21210",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "bfd54738-c07c-4f0e-9acf-e96971e21210": {
      "main": [
        [
          {
            "node": "c80c80f8-6f09-4112-8928-9552b6a6ee04",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a7760673-0f36-4693-b0e2-b12ec5319247": {
      "main": [
        [
          {
            "node": "bf292408-48a2-4fb8-baf5-38c7b5f36862",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "af473f94-7a67-4023-94b5-3bdf8015280a": {
      "main": [
        [
          {
            "node": "3d011775-063e-4a17-ae84-c6c45bc5f3f1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "bf292408-48a2-4fb8-baf5-38c7b5f36862": {
      "main": [
        [
          {
            "node": "af473f94-7a67-4023-94b5-3bdf8015280a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1ef3b9f1-5837-4ca4-90e6-b39bc37b778d": {
      "main": [
        [
          {
            "node": "ddc33a20-96a8-40bc-9788-6e12f40f88ef",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Häufig gestellte Fragen

Wie verwende ich diesen Workflow?

Kopieren Sie den obigen JSON-Code, erstellen Sie einen neuen Workflow in Ihrer n8n-Instanz und wählen Sie "Aus JSON importieren". Fügen Sie die Konfiguration ein und passen Sie die Anmeldedaten nach Bedarf an.

Für welche Szenarien ist dieser Workflow geeignet?

Fortgeschritten

Ist es kostenpflichtig?

Dieser Workflow ist völlig kostenlos. Beachten Sie jedoch, dass Drittanbieterdienste (wie OpenAI API), die im Workflow verwendet werden, möglicherweise kostenpflichtig sind.

Workflow-Informationen
Schwierigkeitsgrad
Fortgeschritten
Anzahl der Nodes14
Kategorie-
Node-Typen7
Schwierigkeitsbeschreibung

Für erfahrene Benutzer, mittelkomplexe Workflows mit 6-15 Nodes

Autor
Tegar karunia ilham

Tegar karunia ilham

@tegarkaruniailham

Developer | Flowgrammer | Promt Engineering | Helping business owners & marketers automate their processes with n8n. Specialist in custom workflows, API integrations, and template development.

Externe Links
Auf n8n.io ansehen

Diesen Workflow teilen

Kategorien

Kategorien: 34