From d4a5bf7c0a7352bb4f4b1f67f3739afe905ab0a1 Mon Sep 17 00:00:00 2001 From: Joachim Hummel Date: Fri, 14 Nov 2025 10:06:27 +0000 Subject: [PATCH] Add NocoDB-based workflow and example data MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add tracker-db.json: NocoDB version of location tracker workflow - Replaces file-based storage with NocoDB database - Unlimited storage instead of 100-entry limit - Includes CREATE and READ operations for locations table - Add locations-example.csv: Sample location data for NocoDB import - 8 example entries with Munich coordinates - Demonstrates expected data structure 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- locations-example.csv | 9 + tracker-db.json | 490 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 499 insertions(+) create mode 100644 locations-example.csv create mode 100644 tracker-db.json diff --git a/locations-example.csv b/locations-example.csv new file mode 100644 index 0000000..1c2188b --- /dev/null +++ b/locations-example.csv @@ -0,0 +1,9 @@ +latitude,longitude,timestamp,user_id,first_name,last_name,username,marker_label,display_time,chat_id +48.1351,11.5820,2025-01-15T10:30:00.000Z,123456789,Max,Mustermann,maxmustermann,Max Mustermann,"15.1.2025, 11:30:00",987654321 +48.1375,11.5750,2025-01-15T11:45:00.000Z,123456789,Max,Mustermann,maxmustermann,Max Mustermann,"15.1.2025, 12:45:00",987654321 +48.1400,11.5680,2025-01-15T13:15:00.000Z,123456789,Max,Mustermann,maxmustermann,Max Mustermann,"15.1.2025, 14:15:00",987654321 +48.1425,11.5610,2025-01-15T14:30:00.000Z,123456789,Max,Mustermann,maxmustermann,Max Mustermann,"15.1.2025, 15:30:00",987654321 +48.1450,11.5540,2025-01-15T15:45:00.000Z,123456789,Max,Mustermann,maxmustermann,Max Mustermann,"15.1.2025, 16:45:00",987654321 +48.1475,11.5470,2025-01-15T17:00:00.000Z,987654321,Anna,Schmidt,annaschmidt,Anna Schmidt,"15.1.2025, 18:00:00",123456789 +48.1500,11.5400,2025-01-15T18:15:00.000Z,987654321,Anna,Schmidt,annaschmidt,Anna Schmidt,"15.1.2025, 19:15:00",123456789 +48.1525,11.5330,2025-01-15T19:30:00.000Z,987654321,Anna,Schmidt,annaschmidt,Anna Schmidt,"15.1.2025, 20:30:00",123456789 diff --git a/tracker-db.json b/tracker-db.json new file mode 100644 index 0000000..f7a4633 --- /dev/null +++ b/tracker-db.json @@ -0,0 +1,490 @@ +{ + "name": "Telegram Location Tracker - NocoDB", + "nodes": [ + { + "parameters": { + "updates": [ + "message" + ], + "additionalFields": {} + }, + "id": "b7769320-830c-4a76-9086-ea4067969ad7", + "name": "Telegram Trigger", + "type": "n8n-nodes-base.telegramTrigger", + "typeVersion": 1.1, + "position": [ + 0, + 16 + ], + "webhookId": "telegram-location-webhook", + "credentials": { + "telegramApi": { + "id": "dRHgVQKqowQHIait", + "name": "Telegram account n8n-munich-bot" + } + } + }, + { + "parameters": { + "conditions": { + "string": [ + { + "value1": "={{ $json.message.location }}", + "operation": "isNotEmpty" + } + ] + } + }, + "id": "57f03b50-3184-4d1e-9d33-f628f93f466b", + "name": "Hat Location?", + "type": "n8n-nodes-base.if", + "typeVersion": 1, + "position": [ + 224, + 16 + ] + }, + { + "parameters": { + "jsCode": "// Extrahiere Location-Daten für NocoDB\nconst items = $input.all();\nconst results = [];\n\nfor (const item of items) {\n const location = item.json.message.location;\n const from = item.json.message.from;\n const messageDate = item.json.message.date;\n \n const timestamp = new Date(messageDate * 1000).toISOString();\n const displayTime = new Date(messageDate * 1000).toLocaleString('de-DE');\n \n results.push({\n json: {\n latitude: location.latitude,\n longitude: location.longitude,\n timestamp: timestamp,\n user_id: from.id,\n first_name: from.first_name || '',\n last_name: from.last_name || '',\n username: from.username || '',\n marker_label: `${from.first_name || ''} ${from.last_name || ''}`.trim(),\n display_time: displayTime,\n chat_id: item.json.message.chat.id\n }\n });\n}\n\nreturn results;" + }, + "id": "dafcade6-0563-47b9-bd0d-dff0f61d1dbb", + "name": "Location verarbeiten", + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 448, + 0 + ] + }, + { + "parameters": { + "operation": "create", + "projectId": { + "__rl": true, + "value": "YOUR_PROJECT_ID", + "mode": "list", + "cachedResultName": "YOUR_PROJECT_NAME" + }, + "tableId": { + "__rl": true, + "value": "YOUR_TABLE_ID", + "mode": "list", + "cachedResultName": "locations" + }, + "fieldsUi": { + "fieldValues": [ + { + "fieldName": "latitude", + "fieldValue": "={{ $json.latitude }}" + }, + { + "fieldName": "longitude", + "fieldValue": "={{ $json.longitude }}" + }, + { + "fieldName": "timestamp", + "fieldValue": "={{ $json.timestamp }}" + }, + { + "fieldName": "user_id", + "fieldValue": "={{ $json.user_id }}" + }, + { + "fieldName": "first_name", + "fieldValue": "={{ $json.first_name }}" + }, + { + "fieldName": "last_name", + "fieldValue": "={{ $json.last_name }}" + }, + { + "fieldName": "username", + "fieldValue": "={{ $json.username }}" + }, + { + "fieldName": "marker_label", + "fieldValue": "={{ $json.marker_label }}" + }, + { + "fieldName": "display_time", + "fieldValue": "={{ $json.display_time }}" + }, + { + "fieldName": "chat_id", + "fieldValue": "={{ $json.chat_id }}" + } + ] + } + }, + "id": "c519118b-0626-4ace-befc-ee9859d73504", + "name": "Speichere in NocoDB", + "type": "n8n-nodes-base.nocoDb", + "typeVersion": 2, + "position": [ + 672, + 0 + ], + "credentials": { + "nocoDbApiToken": { + "id": "YOUR_NOCODB_CREDENTIALS_ID", + "name": "NocoDB API Token" + } + } + }, + { + "parameters": { + "operation": "getAll", + "projectId": { + "__rl": true, + "value": "YOUR_PROJECT_ID", + "mode": "list", + "cachedResultName": "YOUR_PROJECT_NAME" + }, + "tableId": { + "__rl": true, + "value": "YOUR_TABLE_ID", + "mode": "list", + "cachedResultName": "locations" + }, + "returnAll": false, + "limit": 1, + "options": { + "sort": [ + { + "field": "timestamp", + "direction": "desc" + } + ] + } + }, + "id": "9a8b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d", + "name": "Hole letzten Eintrag", + "type": "n8n-nodes-base.nocoDb", + "typeVersion": 2, + "position": [ + 896, + 0 + ], + "credentials": { + "nocoDbApiToken": { + "id": "YOUR_NOCODB_CREDENTIALS_ID", + "name": "NocoDB API Token" + } + } + }, + { + "parameters": { + "operation": "getAll", + "projectId": { + "__rl": true, + "value": "YOUR_PROJECT_ID", + "mode": "list", + "cachedResultName": "YOUR_PROJECT_NAME" + }, + "tableId": { + "__rl": true, + "value": "YOUR_TABLE_ID", + "mode": "list", + "cachedResultName": "locations" + }, + "returnAll": true, + "options": {} + }, + "id": "8b7a6c5d-4e3f-2a1b-0c9d-8e7f6a5b4c3d", + "name": "Zähle Einträge", + "type": "n8n-nodes-base.nocoDb", + "typeVersion": 2, + "position": [ + 896, + 120 + ], + "credentials": { + "nocoDbApiToken": { + "id": "YOUR_NOCODB_CREDENTIALS_ID", + "name": "NocoDB API Token" + } + } + }, + { + "parameters": { + "jsCode": "// Kombiniere Daten für Telegram-Bestätigung\nconst lastEntry = $('Hole letzten Eintrag').all();\nconst allEntries = $('Zähle Einträge').all();\nconst originalData = $('Location verarbeiten').first().json;\n\nreturn [{\n json: {\n latitude: originalData.latitude,\n longitude: originalData.longitude,\n display_time: originalData.display_time,\n chat_id: originalData.chat_id,\n total: allEntries.length\n }\n}];" + }, + "id": "7c6b5a4d-3e2f-1a0b-9c8d-7e6f5a4b3c2d", + "name": "Bereite Bestätigung vor", + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 1120, + 0 + ] + }, + { + "parameters": { + "chatId": "={{ $json.chat_id }}", + "text": "=✅ Standort gespeichert!\n\n📍 Koordinaten:\nLat: {{ $json.latitude }}\nLon: {{ $json.longitude }}\n\n🕐 Zeit: {{ $json.display_time }}\n\n🗺️ Karte:\nhttps://web.unixweb.home64.de/tracker/index.html\n\n📊 Gespeicherte Punkte: {{ $json.total }}", + "additionalFields": {} + }, + "id": "aa023c84-7664-4641-b3fc-cd30b9f69941", + "name": "Telegram Bestätigung", + "type": "n8n-nodes-base.telegram", + "typeVersion": 1.1, + "position": [ + 1344, + 0 + ], + "webhookId": "9df3ad7d-315d-4782-b4ec-4fb154c0b46d", + "credentials": { + "telegramApi": { + "id": "dRHgVQKqowQHIait", + "name": "Telegram account n8n-munich-bot" + } + } + }, + { + "parameters": { + "path": "location", + "responseMode": "lastNode", + "options": { + "allowedOrigins": "*" + } + }, + "id": "b47e8370-3276-4f49-a2c5-25ef07b83ce8", + "name": "Webhook - Location API", + "type": "n8n-nodes-base.webhook", + "typeVersion": 1.1, + "position": [ + 0, + 304 + ], + "webhookId": "location-api-endpoint" + }, + { + "parameters": { + "operation": "getAll", + "projectId": { + "__rl": true, + "value": "YOUR_PROJECT_ID", + "mode": "list", + "cachedResultName": "YOUR_PROJECT_NAME" + }, + "tableId": { + "__rl": true, + "value": "YOUR_TABLE_ID", + "mode": "list", + "cachedResultName": "locations" + }, + "returnAll": true, + "options": { + "sort": [ + { + "field": "timestamp", + "direction": "desc" + } + ] + } + }, + "id": "200dbfff-2932-4e92-9e47-181ff706c0de", + "name": "Lade Daten aus NocoDB", + "type": "n8n-nodes-base.nocoDb", + "typeVersion": 2, + "position": [ + 224, + 304 + ], + "credentials": { + "nocoDbApiToken": { + "id": "YOUR_NOCODB_CREDENTIALS_ID", + "name": "NocoDB API Token" + } + } + }, + { + "parameters": { + "jsCode": "// Baue API Response aus NocoDB-Daten\nconst locations = $input.all().map(item => item.json);\n\nconst current = locations.length > 0 ? locations[0] : null;\n\nreturn [{\n json: {\n success: true,\n current: current,\n history: locations,\n total_points: locations.length,\n last_updated: current ? current.timestamp : null\n }\n}];" + }, + "id": "7c56b850-f1dd-4c51-ac8d-4313e199e6e7", + "name": "Format API Response", + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 448, + 304 + ] + }, + { + "parameters": { + "respondWith": "json", + "responseBody": "={{ $json }}", + "options": { + "responseHeaders": { + "entries": [ + { + "name": "Access-Control-Allow-Origin", + "value": "*" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + } + } + }, + "id": "9b720b0b-b4f8-4599-9e2f-d6e8f67819ab", + "name": "JSON Response", + "type": "n8n-nodes-base.respondToWebhook", + "typeVersion": 1, + "position": [ + 672, + 304 + ] + }, + { + "parameters": { + "height": 544, + "width": 1632, + "color": 4 + }, + "type": "n8n-nodes-base.stickyNote", + "position": [ + -80, + -112 + ], + "typeVersion": 1, + "id": "29506fa4-6cb3-403f-bd64-6a2f49a2eb85", + "name": "Sticky Note" + } + ], + "pinData": {}, + "connections": { + "Telegram Trigger": { + "main": [ + [ + { + "node": "Hat Location?", + "type": "main", + "index": 0 + } + ] + ] + }, + "Hat Location?": { + "main": [ + [ + { + "node": "Location verarbeiten", + "type": "main", + "index": 0 + } + ] + ] + }, + "Location verarbeiten": { + "main": [ + [ + { + "node": "Speichere in NocoDB", + "type": "main", + "index": 0 + } + ] + ] + }, + "Speichere in NocoDB": { + "main": [ + [ + { + "node": "Hole letzten Eintrag", + "type": "main", + "index": 0 + }, + { + "node": "Zähle Einträge", + "type": "main", + "index": 0 + } + ] + ] + }, + "Hole letzten Eintrag": { + "main": [ + [ + { + "node": "Bereite Bestätigung vor", + "type": "main", + "index": 0 + } + ] + ] + }, + "Zähle Einträge": { + "main": [ + [ + { + "node": "Bereite Bestätigung vor", + "type": "main", + "index": 0 + } + ] + ] + }, + "Bereite Bestätigung vor": { + "main": [ + [ + { + "node": "Telegram Bestätigung", + "type": "main", + "index": 0 + } + ] + ] + }, + "Webhook - Location API": { + "main": [ + [ + { + "node": "Lade Daten aus NocoDB", + "type": "main", + "index": 0 + } + ] + ] + }, + "Lade Daten aus NocoDB": { + "main": [ + [ + { + "node": "Format API Response", + "type": "main", + "index": 0 + } + ] + ] + }, + "Format API Response": { + "main": [ + [ + { + "node": "JSON Response", + "type": "main", + "index": 0 + } + ] + ] + } + }, + "active": true, + "settings": { + "executionOrder": "v1", + "callerPolicy": "workflowsFromSameOwner", + "availableInMCP": false, + "errorWorkflow": "PhwIkaqyXRasTXDH" + }, + "versionId": "b87a412a-4833-4f0d-aa33-0ba9074238d9", + "meta": { + "instanceId": "12d864c68e4fb5dfd100dc0c683b95f43cd55af7e9efa82e25407fac5a3824a5" + }, + "id": "5dUTiJE61r7opoul", + "tags": [] +}