Docs: Documented successful Notion DB setup and Puma M20 import; Added setup and import scripts.
This commit is contained in:
@@ -132,14 +132,27 @@ Während der initialen Prototyping-Phase wurden kritische technische Hürden ide
|
||||
* **Erkenntnis:** Notion-Integrationen benötigen explizite Freigaben pro Seite. Wenn eine Datenbank gelöscht und neu erstellt wird, muss die Verbindung in der Notion-UI oft **manuell neu autorisiert** werden, auch wenn die übergeordnete Seite bereits freigegeben war.
|
||||
* **Lösung:** Bei jedem neuen Deployment-Lauf in der Notion-UI prüfen, ob die „RoboPlanet GTM Engine“ unter den `Connections` der Zielseite gelistet ist.
|
||||
|
||||
### 8.7 Initial Database IDs (Stand 08. Jan. 2026)
|
||||
Die folgenden IDs wurden bei der initialen Erstellung der Datenbanken generiert und sollten für die weitere Entwicklung verwendet werden, um Suchindex-Verzögerungen zu vermeiden:
|
||||
* **Product Master:** `2e288f42-8544-81d8-96f5-c231f84f719a`
|
||||
* **Sector & Persona Master:** `2e288f42-8544-8113-b878-ec99c8a02a6b`
|
||||
* **Messaging Matrix:** `2e288f42-8544-81b0-83d4-c16623cc32d1`
|
||||
* **Competitive Radar:** `2e288f42-8544-814a-a2ad-eee8a181a3cc`
|
||||
* **Enrichment Factory & RevOps:** `2e288f42-8544-8172-a3a7-f5101b6ac0f0`
|
||||
* **The Brain:** `2e288f42-8544-810f-8e7d-e9a2a3100779`
|
||||
* **GTM Workspace:** `2e288f42-8544-81cc-b167-f9dffe9c7bde`
|
||||
|
||||
---
|
||||
|
||||
### Checkliste für den Neustart mit Gemini CLI:
|
||||
1. [ ] **Requests statt SDK:** Nutze die native HTTP-Library für alle Notion-Calls.
|
||||
2. [ ] **ID-Persistence:** Speichere IDs in einer lokalen JSON-Variable während des Laufs.
|
||||
2. [ ] **ID-Persistence:** Speichere IDs in einer lokalen JSON-Variable während des Laufs. (Nun fest in Doku hinterlegt)
|
||||
3. [ ] **Schema-Validation:** Nutze einen `database.retrieve` Call vor dem ersten Daten-Push, um die Existenz der Spaltennamen zu verifizieren.
|
||||
4. [ ] **Error-Logging:** Implementiere detailliertes Logging der API-Response-Bodys, da Notion dort sehr präzise Hinweise gibt (z.B. `property_not_found`).
|
||||
|
||||
---
|
||||
**Status:** Blueprint Finalisiert.
|
||||
**Nächster Schritt:** Umsetzung der Datenbank-Properties und API-Endpunkte gemäß diesem Dokument.
|
||||
|
||||
### 8.8 Erfolgreicher Datenimport (08. Jan. 2026)
|
||||
Der Produkt-Datensatz "Puma M20" wurde erfolgreich mithilfe des `import_product.py`-Skripts und der Quelldatei `Puma_m20_2026-01-08.md` in die Notion-Datenbanken "Product Master", "Sector & Persona Master" und "Messaging Matrix" importiert.
|
||||
216
Puma_m20_2026-01-08.md
Normal file
216
Puma_m20_2026-01-08.md
Normal file
@@ -0,0 +1,216 @@
|
||||
# GTM STRATEGY REPORT
|
||||
|
||||
## 1. Executive Summary
|
||||
Dieser Go-to-Market (GTM)-Strategiebericht umreißt den Ansatz für die erfolgreiche Markteinführung des PUMA M20 Roboters. Der Fokus liegt auf drei Schlüsselindustrien: Chemieparks/Petrochemische Anlagen, Energieversorgungsunternehmen (Wind- und Solarparks) und Logistikzentren/Großflächenlager. Durch die Kombination der fortschrittlichen Technologie des PUMA M20 mit den etablierten Dienstleistungen der Wackler Group schaffen wir ein einzigartiges Wertversprechen. Die Strategie basiert auf der "Dynamic Hybrid Service" Logik, die die Stärken von Robotern und menschlichen Arbeitskräften kombiniert, um optimale Ergebnisse zu erzielen.
|
||||
|
||||
## 2. Product Analysis
|
||||
Der PUMA M20 ist ein geländegängiger, wetterfester Roboter, der für anspruchsvolle Umgebungen konzipiert wurde.
|
||||
|
||||
**Key Features:**
|
||||
* Geländegängige Mobilität: Bewältigt Treppen, Schotter, Schlamm und Stahlgitter.
|
||||
* Wetterfester Schutz: IP66-Zertifizierung für Staub- und Wasserdichtigkeit.
|
||||
* Kompakte Bauweise: Rucksackgröße, passt durch 50 cm breite Gänge.
|
||||
* Hohe Ausdauer: Hot-Swap-fähige Batterien für lange Einsatzzeiten.
|
||||
* Autonome Navigation: SLAM-Navigation für autonome Missionen und Rückkehr zur Basis.
|
||||
* Umfassende Umfelderkennung: Duale LiDAR-Systeme und Weitwinkelkameras für 360°-Sicht.
|
||||
* Nachtsichtfähigkeit: Optionen für Nacht- und Wärmebildkameras.
|
||||
* Flottenmanagement und API-Integrationen: Für Datenexport und zentrale Steuerung.
|
||||
* Leistungsstarke Rechenleistung: Duale Octa-Core 64-Bit Industrieprozessoren.
|
||||
* Hohe Nutzlastkapazität: Bis zu 50 kg maximale Traglast.
|
||||
* Anpassungsfähigkeit: Großer Betriebstemperaturbereich von -20°C bis 55°C.
|
||||
* Intuitive Steuerung: 360° Punktwolkenansicht mit Single-Click-Zielauswahl.
|
||||
|
||||
**Constraints:**
|
||||
* Maximale Schritt Höhe: 25 cm
|
||||
* Maximale Steigung: 45°
|
||||
* Minimale Durchgangsbreite: 50 cm
|
||||
* Maximale Geschwindigkeit: 5 m/s
|
||||
* Betriebstemperatur: -20°C bis 55°C
|
||||
* Schutzart: IP66
|
||||
* Gewicht: 33 kg
|
||||
* Maximale externe Leistungsabgabe: 300W
|
||||
|
||||
## 3. Target Audience
|
||||
Die ausgewählten Ideal Customer Profiles (ICPs) sind:
|
||||
|
||||
* **Chemieparks/Petrochemische Anlagen:** Anlagen dieser Art haben ausgedehnte Gelände, komplexe Infrastruktur und hohe Sicherheitsanforderungen. Der PUMA M20 kann für Inspektionen, Überwachung und die Erkennung von Gefahrenstoffen eingesetzt werden, wodurch die Sicherheit erhöht und die Effizienz gesteigert wird.
|
||||
* **Energieversorgungsunternehmen (z.B. Windparks, Solarparks):** Diese Anlagen erstrecken sich oft über große, schwer zugängliche Gebiete. Der PUMA M20 kann Inspektionen von Anlagen, die Überwachung von Zäunen und die Sicherheitspatrouille durchführen, wodurch die Betriebskosten gesenkt und die Reaktionszeiten verbessert werden.
|
||||
* **Logistikzentren/Großflächenlager:** Große Lagerflächen und komplexe Logistikprozesse erfordern eine ständige Überwachung und Inspektion. Der PUMA M20 kann für die Bestandsaufnahme, die Überwachung von Sicherheitsbereichen und die Unterstützung von Logistikprozessen eingesetzt werden, wodurch die Effizienz gesteigert und Verluste reduziert werden.
|
||||
|
||||
## 4. Target Accounts
|
||||
Die Top-Unternehmen (Whales) in den Zielindustrien sind:
|
||||
|
||||
* **Chemieparks/Petrochemische Anlagen:** BASF, Bayer, Evonik, Lanxess
|
||||
* **Energieversorgungsunternehmen (z.B. Windparks, Solarparks):** E.ON, RWE, EnBW, Iberdrola, Vattenfall
|
||||
* **Logistikzentren/Großflächenlager:** DHL, Amazon, DB Schenker, Kühne + Nagel, XPO Logistics
|
||||
|
||||
## 5. Strategy Matrix
|
||||
|
||||
| Segment | Pain Point | Angle | Differentiation |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| Chemieparks/Petrochemische Anlagen | Umfangreiche Gelände erfordern ständige Sicherheits- und Inspektionsrundgänge, oft unter gefährlichen Bedingungen. Personalmangel und hohe Kosten für manuelle Inspektionen. | Der Roboter sieht die Gefahr, Wackler beseitigt sie. (Automated Perimeter Protection). Autonome Patrouillen, die auch schwer zugängliche Bereiche (Treppen, Schotter) abdecken und rund um die Uhr für Sicherheit sorgen. Wackler Security übernimmt die Bewertung der Alarme (NSL) und die Intervention (Revierwachdienst). | Geländegängigkeit, Wetterfestigkeit, Nachtsichtfähigkeit kombiniert mit der Interventionskraft von Wackler Security. |
|
||||
| Energieversorgungsunternehmen (z.B. Windparks, Solarparks) | Weitläufige Anlagen in oft unwegsamem Gelände. Schwierige und teure Inspektion von Solarmodulen oder Windkraftanlagen. Anfälligkeit für Vandalismus und Diebstahl. | Der Roboter sieht die Gefahr, Wackler beseitigt sie. (Automated Perimeter Protection). Autonome Inspektion und Überwachung von Anlagen, auch bei Nacht und schlechtem Wetter. Der Roboter erkennt Schäden frühzeitig und schreckt Eindringlinge ab. Wackler Security sichert die Anlagen durch Alarmaufschaltung (NSL) und Intervention. | Autonome Navigation in unwegsamem Gelände, kombiniert mit der Reaktionsgeschwindigkeit und Expertise von Wackler Security. |
|
||||
| Logistikzentren/Großflächenlager | Hohe Anforderungen an Sicherheit und Ordnung in großen Lagerhallen und auf weitläufigen Geländen. Ineffiziente manuelle Reinigung großer Flächen. Gefahr von Unfällen durch herumliegende Gegenstände. | 100% Sauberkeit durch Maschine + Mensch. Der Roboter sorgt für die monotone Flächenleistung (80%), Wackler Cleaning übernimmt die Kantenreinigung, Sonderreinigung und den Winterdienst (20%). | Kompakte Bauweise für enge Gänge, hohe Nutzlast für den Transport von Reinigungsequipment, kombiniert mit der Flexibilität und dem Know-how von Wackler Cleaning. |
|
||||
|
||||
## 6. Next Steps
|
||||
|
||||
1. **Leadgenerierung:** Gezielte Marketingkampagnen für die identifizierten Zielkonten.
|
||||
2. **Proof of Concept (POC):** Durchführung von POCs bei ausgewählten Kunden, um den Wert des PUMA M20 in Kombination mit den Wackler Services zu demonstrieren.
|
||||
3. **Vertriebsschulung:** Schulung des Vertriebsteams auf die spezifischen Anwendungsfälle und Vorteile des PUMA M20 in den Zielindustrien. Fokus auf die "Dynamic Hybrid Service" Logik.
|
||||
4. **Partnerschaften:** Aufbau strategischer Partnerschaften mit Technologieanbietern und Branchenverbänden.
|
||||
5. **Content-Erstellung:** Entwicklung von relevanten Inhalten (Fallstudien, Whitepaper, Blog-Posts) zur Stärkung der Marktpositionierung.
|
||||
|
||||
## 7. Hybrid Service Logic
|
||||
|
||||
Die "Dynamic Hybrid Service" Logik ist das Herzstück unserer GTM-Strategie. Sie basiert auf der Erkenntnis, dass die Kombination von Robotern und menschlichen Arbeitskräften zu optimalen Ergebnissen führt.
|
||||
|
||||
* **Sicherheits- und Inspektionsroboter (Chemieparks/Petrochemische Anlagen, Energieversorgungsunternehmen):** Der Roboter übernimmt die "Detektion & Präsenz". Er patrouilliert, nutzt Wärmebild/Sensoren und geht in Gefahrenbereiche. Wackler Security übernimmt die "Bewertung & Intervention". Die NSL bewertet den Video-Feed des Roboters bei Alarm, und der Revierwachdienst fährt zur Intervention, wenn der Roboter einen Eindringling oder Schaden meldet.
|
||||
* **Reinigungsroboter (Logistikzentren/Großflächenlager):** Der Roboter übernimmt die monotone Flächenleistung (80%). Wackler Cleaning übernimmt die Kantenreinigung, Sonderreinigung und den Winterdienst (20%).
|
||||
|
||||
Dieser Ansatz ermöglicht es uns, ein umfassendes und effizientes Dienstleistungspaket anzubieten, das die spezifischen Bedürfnisse unserer Kunden erfüllt.
|
||||
|
||||
# SALES ENABLEMENT & VISUALS (PHASE 6)
|
||||
|
||||
## Kill-Critique Battlecards
|
||||
|
||||
### Persona: Head of Security / Werkschutzleiter
|
||||
> **Objection:** "Wir haben bereits ein umfassendes Sicherheitssystem. Warum sollten wir in einen Roboter investieren?"
|
||||
|
||||
**Response:** Ihr bestehendes System ist wichtig, aber der Roboter ergänzt es ideal. Er patrouilliert autonom, erkennt Gefahren auch in unzugänglichen Bereichen und bei schlechten Sichtverhältnissen. In Kombination mit der Wackler Security (NSL und Revierwachdienst) erhalten Sie eine lückenlose Überwachung und schnelle Intervention – ein deutliches Plus an Sicherheit und Effizienz. Der Roboter sieht die Gefahr, Wackler beseitigt sie. (Automated Perimeter Protection).
|
||||
|
||||
---
|
||||
|
||||
### Persona: Head of Security / Werkschutzleiter
|
||||
> **Objection:** "Die Kosten für den Roboter und die Integration in unsere bestehende Infrastruktur sind zu hoch."
|
||||
|
||||
**Response:** Betrachten Sie die Gesamtkosten: Reduzierung von Personalkosten für Patrouillen, frühzeitige Erkennung von Schäden, Vermeidung von Produktionsausfällen durch schnelle Intervention. Der Roboter arbeitet rund um die Uhr, ohne Pausen oder Ausfallzeiten. Die Investition rechnet sich durch erhöhte Sicherheit, Effizienz und Risikominimierung. Zudem bieten wir flexible Finanzierungsmodelle an, die auf Ihre Bedürfnisse zugeschnitten sind. Wackler Security bietet Ihnen ein Komplettpaket aus Technologie und Service.
|
||||
|
||||
---
|
||||
|
||||
### Persona: Leiter Instandhaltung / Betriebsleiter
|
||||
> **Objection:** "Wir haben Bedenken hinsichtlich der Zuverlässigkeit und Wartung des Roboters in unserem anspruchsvollen Umfeld."
|
||||
|
||||
**Response:** Der Roboter ist für den Einsatz in anspruchsvollen Umgebungen konzipiert: geländegängig, wetterfest und robust. Durch die Integration in die Wackler Gruppe können wir Ihnen ein umfassendes Service- und Wartungspaket anbieten, das die Ausfallzeiten minimiert und die Lebensdauer des Roboters maximiert. Wir kümmern uns um die Wartung, Reparatur und den Austausch von Verschleißteilen, damit Sie sich auf Ihr Kerngeschäft konzentrieren können.
|
||||
|
||||
---
|
||||
|
||||
### Persona: Geschäftsführer/Vorstand
|
||||
> **Objection:** "Wir sind unsicher, ob der Roboter tatsächlich einen Mehrwert für unser Unternehmen bringt."
|
||||
|
||||
**Response:** Der Roboter bietet einen klaren Mehrwert: Erhöhte Sicherheit, verbesserte Effizienz, Risikominimierung und Kosteneinsparungen. Durch die Kombination aus modernster Technologie und den Dienstleistungen der Wackler Group schaffen wir eine einzigartige Lösung, die auf Ihre spezifischen Bedürfnisse zugeschnitten ist. Wir bieten Ihnen die Möglichkeit, den Roboter in Ihrem Betrieb zu testen und sich selbst von den Vorteilen zu überzeugen. Wir garantieren Ihnen: Der Roboter sieht die Gefahr, Wackler beseitigt sie. (Automated Perimeter Protection).
|
||||
|
||||
---
|
||||
|
||||
### Persona: Leiter Instandhaltung / Betriebsleiter
|
||||
> **Objection:** "Die Integration des Roboters in unsere bestehenden Systeme ist zu kompliziert."
|
||||
|
||||
**Response:** Der Roboter bietet flexible API-Integrationen für einen einfachen Datenaustausch und eine zentrale Steuerung. Wir unterstützen Sie bei der Integration in Ihre bestehenden Systeme und sorgen für einen reibungslosen Ablauf. Unser Team von Experten steht Ihnen jederzeit zur Verfügung, um Fragen zu beantworten und Unterstützung zu leisten.
|
||||
|
||||
---
|
||||
|
||||
## Visual Briefings (Prompts)
|
||||
|
||||
### Sicherheitsroboter in einem Chemiepark
|
||||
*Context: Darstellung des Roboters bei der autonomen Patrouille in einem Chemiepark.*
|
||||
|
||||
```
|
||||
Erstelle ein Foto-realistisches Bild eines geländegängigen Roboters, der autonom in einem Chemiepark patrouilliert. Der Roboter sollte mit Sensoren und Kameras ausgestattet sein. Im Hintergrund sind Rohrleitungen, Tanks und Produktionsanlagen zu sehen. Die Szene sollte die Sicherheit und Effizienz des Roboters in einer potenziell gefährlichen Umgebung hervorheben. Der Roboter sollte Treppen überwinden und auf Schotterwegen fahren. Füge im Hintergrund einen Wackler Security Interventionswagen hinzu.
|
||||
```
|
||||
|
||||
### Inspektion eines Windparks
|
||||
*Context: Darstellung des Roboters bei der Inspektion eines Windparks bei Nacht.*
|
||||
|
||||
```
|
||||
Erstelle ein Foto-realistisches Bild eines geländegängigen Roboters, der nachts einen Windpark inspiziert. Der Roboter sollte mit einer Wärmebildkamera ausgestattet sein, die Schäden an den Windkraftanlagen erkennt. Im Hintergrund sind die beleuchteten Windräder zu sehen. Die Szene sollte die Fähigkeit des Roboters zur autonomen Inspektion und Überwachung von Anlagen in unwegsamem Gelände und bei schlechten Sichtverhältnissen hervorheben. Im Vordergrund ist ein Wackler Security Mitarbeiter zu sehen, der die Daten des Roboters auswertet.
|
||||
```
|
||||
|
||||
### Reinigung eines Logistikzentrums
|
||||
*Context: Darstellung des Roboters bei der autonomen Reinigung eines Logistikzentrums.*
|
||||
|
||||
```
|
||||
Erstelle ein Foto-realistisches Bild eines Roboters, der autonom ein Logistikzentrum reinigt. Der Roboter sollte mit einer Kehrmaschine ausgestattet sein und durch enge Gänge fahren. Im Hintergrund sind Regale mit Waren und Gabelstapler zu sehen. Die Szene sollte die Fähigkeit des Roboters zur effizienten und autonomen Reinigung großer Flächen hervorheben. Ein Wackler Cleaning Mitarbeiter führt die Kantenreinigung durch.
|
||||
```
|
||||
|
||||
|
||||
|
||||
# VERTICAL LANDING PAGES (PHASE 7)
|
||||
|
||||
## Chemieparks/Petrochemische Anlagen
|
||||
**Headline:** Maximale Sicherheit für Ihr Werksgelände: PUMA M20 + Wackler Security
|
||||
|
||||
**Subline:** Autonome Roboterpatrouillen, die Gefahren erkennen, bevor sie entstehen – und Wackler Security, die sofort eingreift.
|
||||
|
||||
**Benefits:**
|
||||
- Reduzieren Sie Sicherheitsrisiken durch lückenlose Überwachung, auch in schwer zugänglichen Bereichen.
|
||||
- Sparen Sie Kosten durch effiziente, robotergestützte Inspektionen rund um die Uhr.
|
||||
- Profitieren Sie von der schnellen Intervention von Wackler Security bei Alarmfällen.
|
||||
- Erfüllen Sie höchste Sicherheitsstandards mit unserer integrierten Lösung.
|
||||
|
||||
**CTA:** Jetzt Sicherheitskonzept anfordern
|
||||
|
||||
---
|
||||
|
||||
## Energieversorgungsunternehmen (z.B. Windparks, Solarparks)
|
||||
**Headline:** Schützen Sie Ihre Energieanlagen mit dem PUMA M20 und Wackler Security
|
||||
|
||||
**Subline:** Autonome Inspektion und Überwachung, die Schäden frühzeitig erkennt und Eindringlinge abschreckt – mit der Sicherheit von Wackler im Hintergrund.
|
||||
|
||||
**Benefits:**
|
||||
- Minimieren Sie Ausfallzeiten durch frühzeitige Erkennung von Schäden an Solarmodulen oder Windkraftanlagen.
|
||||
- Verhindern Sie Vandalismus und Diebstahl durch proaktive Überwachung.
|
||||
- Senken Sie Inspektionskosten durch den Einsatz von Robotern in unwegsamem Gelände.
|
||||
- Sichern Sie Ihre Anlagen mit der schnellen Reaktionsfähigkeit von Wackler Security.
|
||||
|
||||
**CTA:** Jetzt Anlagenüberwachung optimieren
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
# BUSINESS CASE & ROI (PHASE 8)
|
||||
|
||||
## Chemieparks/Petrochemische Anlagen
|
||||
**Cost Driver:** Hohe Kosten für manuelle Inspektionen und Sicherheitsüberwachung großer, komplexer Anlagen. Zusätzliche Kosten durch potenzielle Sicherheitsrisiken und Produktionsausfälle.
|
||||
|
||||
**Efficiency Gain:** Reduzierung der Personalkosten durch autonome Inspektionen und Überwachung. Früherkennung von Gefahrenstoffen und potenziellen Problemen, was Ausfallzeiten minimiert und die Produktionseffizienz steigert. Verbesserte Datenerfassung und -analyse für fundierte Entscheidungen.
|
||||
|
||||
**Risk Argument:** Minimierung von Sicherheitsrisiken für Mitarbeiter durch den Einsatz des Roboters in gefährlichen Umgebungen. Reduzierung des Risikos von Produktionsausfällen durch frühzeitige Erkennung von Problemen. Einhaltung von Sicherheitsvorschriften und -standards.
|
||||
|
||||
---
|
||||
|
||||
## Energieversorgungsunternehmen (z.B. Windparks, Solarparks)
|
||||
**Cost Driver:** Hohe Kosten für die Inspektion und Wartung von Anlagen in schwer zugänglichen Gebieten. Kosten für Sicherheitsmaßnahmen und Überwachung großer Areale.
|
||||
|
||||
**Efficiency Gain:** Reduzierung der Inspektionskosten durch autonome Überwachung von Anlagen und Zäunen. Schnellere Reaktionszeiten bei Sicherheitsvorfällen. Optimierung der Wartungsplanung durch kontinuierliche Datenerfassung und -analyse. Reduzierung der Kosten für manuelle Patrouillen.
|
||||
|
||||
**Risk Argument:** Verbesserte Sicherheit durch kontinuierliche Überwachung und schnelle Reaktion auf Sicherheitsvorfälle. Reduzierung des Risikos von Anlagenbeschädigungen durch frühzeitige Erkennung von Problemen. Schutz vor unbefugtem Zugriff und Vandalismus.
|
||||
|
||||
---
|
||||
|
||||
## Logistikzentren/Großflächenlager
|
||||
**Cost Driver:** Hohe Kosten für Bestandsaufnahme, Sicherheitsüberwachung und Verlustprävention in großen Lagerflächen. Ineffiziente Logistikprozesse und hohe Fehlerquoten.
|
||||
|
||||
**Efficiency Gain:** Effizientere Bestandsaufnahme durch autonome Erfassung von Lagerbeständen. Reduzierung von Verlusten durch Überwachung von Sicherheitsbereichen und frühzeitige Erkennung von Diebstahl. Optimierung von Logistikprozessen durch verbesserte Datenerfassung und -analyse. Reduzierung der Personalkosten für Überwachung und Inventur.
|
||||
|
||||
**Risk Argument:** Reduzierung von Verlusten durch Diebstahl und Beschädigung. Verbesserung der Sicherheit für Mitarbeiter durch Überwachung von Gefahrenbereichen. Optimierung der Lagerverwaltung und Reduzierung von Fehlbeständen.
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
# FEATURE-TO-VALUE TRANSLATOR (PHASE 9)
|
||||
|
||||
| Feature | The Story (Benefit) | Headline |
|
||||
| :--- | :--- | :--- |
|
||||
| Geländegängige Mobilität: Bewältigt Treppen, Schotter, Schlamm und Stahlgitter. | Der Roboter kommt überall hin, egal wie unwegsam das Gelände ist. Das bedeutet, er kann Inspektionen und Sicherheitsrundgänge auch an schwer zugänglichen Orten durchführen. So können Sie sich ein umfassendes Bild von Ihrer Anlage machen, ohne Mitarbeiter in Gefahr zu bringen. | Sicherheit und Inspektion ohne Grenzen: Der Roboter erreicht jeden Winkel Ihres Geländes. |
|
||||
| Wetterfester Schutz: IP66-Zertifizierung für Staub- und Wasserdichtigkeit. | Der Roboter ist gegen Staub und Wasser geschützt. Das bedeutet, er kann auch bei schlechtem Wetter und in anspruchsvollen Umgebungen eingesetzt werden. So sind Ihre Inspektionen und Sicherheitsrundgänge jederzeit gewährleistet, unabhängig von den äußeren Bedingungen. | Funktionsfähig bei jedem Wetter: Zuverlässige Inspektion und Sicherheit, egal was kommt. |
|
||||
| Kompakte Bauweise: Rucksackgröße, passt durch 50 cm breite Gänge. | Der Roboter ist klein und wendig. Das bedeutet, er kann auch in engen Gängen und schwer zugänglichen Bereichen eingesetzt werden. So entgeht ihm kein Detail, und Sie erhalten ein vollständiges Bild Ihrer Anlage. | Kommt überall durch: Inspektion und Sicherheit auch in den kleinsten Ecken. |
|
||||
| Hohe Ausdauer: Hot-Swap-fähige Batterien für lange Einsatzzeiten. | Der Roboter kann lange im Einsatz sein, ohne dass die Batterien gewechselt werden müssen. Durch den Hot-Swap können die Batterien im laufenden Betrieb gewechselt werden. Das bedeutet, er kann kontinuierlich Inspektionen und Sicherheitsrundgänge durchführen, ohne dass es zu Ausfallzeiten kommt. So sparen Sie Zeit und Geld. | Dauerläufer für Ihre Sicherheit: Kontinuierliche Inspektion ohne Ausfallzeiten. |
|
||||
| Autonome Navigation: SLAM-Navigation für autonome Missionen und Rückkehr zur Basis. | Der Roboter navigiert selbstständig und findet seinen Weg zurück zur Basis. Das bedeutet, er kann Inspektionen und Sicherheitsrundgänge autonom durchführen, ohne dass ein menschlicher Bediener erforderlich ist. So sparen Sie Personalkosten und erhöhen die Effizienz. | Autonom unterwegs für Ihre Sicherheit: Effiziente Inspektion ohne Personalaufwand. |
|
||||
| Umfassende Umfelderkennung: Duale LiDAR-Systeme und Weitwinkelkameras für 360°-Sicht. | Der Roboter hat eine umfassende Sicht auf seine Umgebung. Das bedeutet, er kann Hindernisse und Gefahren frühzeitig erkennen und vermeiden. So sind Ihre Mitarbeiter und Ihre Anlage optimal geschützt. | Alles im Blick: Umfassende Sicherheit durch 360°-Rundumsicht. |
|
||||
| Nachtsichtfähigkeit: Optionen für Nacht- und Wärmebildkameras. | Der Roboter kann auch bei Dunkelheit und schlechten Sichtverhältnissen eingesetzt werden. Das bedeutet, er kann Inspektionen und Sicherheitsrundgänge auch nachts oder in dunklen Umgebungen durchführen. So ist Ihre Anlage rund um die Uhr geschützt. | Sicherheit rund um die Uhr: Inspektion auch bei Nacht und schlechten Sichtverhältnissen. |
|
||||
| Flottenmanagement und API-Integrationen: Für Datenexport und zentrale Steuerung. | Der Roboter kann in bestehende Systeme integriert und zentral gesteuert werden. Das bedeutet, Sie haben jederzeit die volle Kontrolle über Ihre Roboterflotte und können die gesammelten Daten einfach auswerten. So optimieren Sie Ihre Prozesse und treffen fundierte Entscheidungen. | Volle Kontrolle: Zentrale Steuerung und einfache Datenanalyse für optimale Sicherheit. |
|
||||
| Leistungsstarke Rechenleistung: Duale Octa-Core 64-Bit Industrieprozessoren. | Der Roboter verfügt über eine hohe Rechenleistung. Das bedeutet, er kann komplexe Aufgaben schnell und effizient erledigen. So sind Ihre Inspektionen und Sicherheitsrundgänge jederzeit zuverlässig und präzise. | Leistungsstark und zuverlässig: Präzise Inspektion dank hoher Rechenleistung. |
|
||||
| Hohe Nutzlastkapazität: Bis zu 50 kg maximale Traglast. | Der Roboter kann schwere Lasten transportieren. Das bedeutet, er kann zusätzliche Ausrüstung oder Sensoren mitführen, um seine Funktionalität zu erweitern. So ist er flexibel einsetzbar und kann an Ihre individuellen Bedürfnisse angepasst werden. | Flexibel und vielseitig: Hohe Traglast für zusätzliche Ausrüstung und Sensoren. |
|
||||
| Anpassungsfähigkeit: Großer Betriebstemperaturbereich von -20°C bis 55°C. | Der Roboter kann in einem breiten Temperaturbereich eingesetzt werden. Das bedeutet, er kann auch in extremen Umgebungen zuverlässig arbeiten. So sind Ihre Inspektionen und Sicherheitsrundgänge jederzeit gewährleistet, unabhängig von den klimatischen Bedingungen. | Einsatzbereit in jeder Umgebung: Zuverlässige Inspektion auch bei extremen Temperaturen. |
|
||||
| Intuitive Steuerung: 360° Punktwolkenansicht mit Single-Click-Zielauswahl. | Der Roboter lässt sich einfach und intuitiv bedienen. Das bedeutet, er kann schnell und einfach in Betrieb genommen werden. So sparen Sie Zeit und Geld. | Einfache Bedienung: Schnelle Inbetriebnahme und intuitive Steuerung. |
|
||||
166
import_product.py
Normal file
166
import_product.py
Normal file
@@ -0,0 +1,166 @@
|
||||
# import_product.py
|
||||
import requests
|
||||
import json
|
||||
import re
|
||||
|
||||
# --- Configuration ---
|
||||
NOTION_TOKEN = "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" # This will be replaced by the user's actual token.
|
||||
NOTION_VERSION = "2022-06-28"
|
||||
NOTION_API_BASE_URL = "https://api.notion.com/v1"
|
||||
|
||||
HEADERS = {
|
||||
"Authorization": f"Bearer {NOTION_TOKEN}",
|
||||
"Notion-Version": NOTION_VERSION,
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
|
||||
# --- Database IDs (from Notion_Dashboard.md) ---
|
||||
DB_IDS = {
|
||||
"Product Master": "2e288f42-8544-81d8-96f5-c231f84f719a",
|
||||
"Sector & Persona Master": "2e288f42-8544-8113-b878-ec99c8a02a6b",
|
||||
"Messaging Matrix": "2e288f42-8544-81b0-83d4-c16623cc32d1",
|
||||
}
|
||||
|
||||
# --- Helper Functions ---
|
||||
|
||||
def create_notion_page(database_id, properties):
|
||||
"""Creates a new page in a Notion database."""
|
||||
url = f"{NOTION_API_BASE_URL}/pages"
|
||||
payload = {
|
||||
"parent": {"database_id": database_id},
|
||||
"properties": properties,
|
||||
}
|
||||
try:
|
||||
response = requests.post(url, headers=HEADERS, json=payload)
|
||||
response.raise_for_status()
|
||||
print(f"Successfully created page in DB {database_id}.")
|
||||
return response.json()
|
||||
except requests.exceptions.HTTPError as e:
|
||||
print(f"HTTP Error creating page in DB {database_id}: {e}")
|
||||
print(f"Response content: {response.text}")
|
||||
return None
|
||||
except Exception as e:
|
||||
print(f"An unexpected error occurred while creating a page: {e}")
|
||||
return None
|
||||
|
||||
def format_rich_text(text):
|
||||
"""Formats a string into Notion's rich text structure."""
|
||||
return {"rich_text": [{"type": "text", "text": {"content": text}}]}
|
||||
|
||||
def format_title(text):
|
||||
"""Formats a string into Notion's title structure."""
|
||||
return {"title": [{"type": "text", "text": {"content": text}}]}
|
||||
|
||||
def format_relation(page_ids):
|
||||
"""Formats a list of page IDs into Notion's relation structure."""
|
||||
if not isinstance(page_ids, list):
|
||||
page_ids = [page_ids] # Ensure it's a list
|
||||
return {"relation": [{"id": page_id} for page_id in page_ids]}
|
||||
|
||||
def extract_section(content, title):
|
||||
"""Extracts a section from markdown content based on a ## title."""
|
||||
pattern = re.compile(rf"## {re.escape(title)}\n(.*?)(?=\n## |\Z)", re.S)
|
||||
match = pattern.search(content)
|
||||
return match.group(1).strip() if match else ""
|
||||
|
||||
# --- Main Import Logic ---
|
||||
|
||||
def main():
|
||||
if NOTION_TOKEN == "YOUR_NOTION_TOKEN":
|
||||
print("ERROR: Please replace 'YOUR_NOTION_TOKEN' in the script with your actual Notion token.")
|
||||
return
|
||||
|
||||
# 1. Read the markdown file
|
||||
try:
|
||||
with open("Puma_m20_2026-01-08.md", "r", encoding="utf-8") as f:
|
||||
md_content = f.read()
|
||||
except FileNotFoundError:
|
||||
print("ERROR: 'Puma_m20_2026-01-08.md' not found. Please make sure the file is in the same directory.")
|
||||
return
|
||||
|
||||
# --- Phase 1: Create Product in Product Master ---
|
||||
print("--- Phase 1: Creating Product ---")
|
||||
product_analysis = extract_section(md_content, "2. Product Analysis")
|
||||
key_features = re.search(r"\*\*Key Features:\*\*(.*?)\*\*Constraints:\*\*", product_analysis, re.S).group(1).strip()
|
||||
constraints = re.search(r"\*\*Constraints:\*\*(.*)", product_analysis, re.S).group(1).strip()
|
||||
|
||||
product_properties = {
|
||||
"Name": format_title("Puma M20"),
|
||||
"Beschreibung": format_rich_text("Ein geländegängiger, wetterfester Roboter, der für anspruchsvolle Umgebungen konzipiert wurde."),
|
||||
"Spezifikationen": format_rich_text(f"Key Features:\n{key_features}\n\nConstraints:\n{constraints}"),
|
||||
"Layer": {"multi_select": [{"name": "Security"}, {"name": "Service"}]}
|
||||
}
|
||||
|
||||
product_page = create_notion_page(DB_IDS["Product Master"], product_properties)
|
||||
if not product_page:
|
||||
print("Failed to create product page. Aborting.")
|
||||
return
|
||||
product_page_id = product_page["id"]
|
||||
print(f"Created Product 'Puma M20' with ID: {product_page_id}")
|
||||
|
||||
|
||||
# --- Phase 2: Create Sectors in Sector & Persona Master ---
|
||||
print("\n--- Phase 2: Creating Sectors ---")
|
||||
sector_pages = {}
|
||||
sectors = {
|
||||
"Chemieparks/Petrochemische Anlagen": {
|
||||
"definition": "Anlagen dieser Art haben ausgedehnte Gelände, komplexe Infrastruktur und hohe Sicherheitsanforderungen...",
|
||||
"pains": "Umfangreiche Gelände erfordern ständige Sicherheits- und Inspektionsrundgänge, oft unter gefährlichen Bedingungen. Personalmangel und hohe Kosten für manuelle Inspektionen.",
|
||||
"personas": ["Head of Security", "Werkschutzleiter", "Geschäftsführer/Vorstand", "Leiter Instandhaltung / Betriebsleiter"]
|
||||
},
|
||||
"Energieversorgungsunternehmen (z.B. Windparks, Solarparks)": {
|
||||
"definition": "Diese Anlagen erstrecken sich oft über große, schwer zugängliche Gebiete...",
|
||||
"pains": "Weitläufige Anlagen in oft unwegsamem Gelände. Schwierige und teure Inspektion von Solarmodulen oder Windkraftanlagen. Anfälligkeit für Vandalismus und Diebstahl.",
|
||||
"personas": ["Head of Security", "Geschäftsführer/Vorstand", "Leiter Instandhaltung / Betriebsleiter"]
|
||||
},
|
||||
"Logistikzentren/Großflächenlager": {
|
||||
"definition": "Große Lagerflächen und komplexe Logistikprozesse erfordern eine ständige Überwachung und Inspektion.",
|
||||
"pains": "Hohe Anforderungen an Sicherheit und Ordnung in großen Lagerhallen... Ineffiziente manuelle Reinigung großer Flächen. Gefahr von Unfällen...",
|
||||
"personas": ["Leiter Instandhaltung / Betriebsleiter", "Geschäftsführer/Vorstand", "Head of Security"]
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
for name, data in sectors.items():
|
||||
sector_properties = {
|
||||
"Name": format_title(name),
|
||||
"RoboPlanet-Definition": format_rich_text(data["definition"]),
|
||||
"Pains": format_rich_text(data["pains"]),
|
||||
"Personas": {"multi_select": [{"name": p} for p in data["personas"]]}
|
||||
}
|
||||
sector_page = create_notion_page(DB_IDS["Sector & Persona Master"], sector_properties)
|
||||
if sector_page:
|
||||
sector_pages[name] = sector_page["id"]
|
||||
print(f"Created Sector '{name}' with ID: {sector_page['id']}")
|
||||
else:
|
||||
print(f"Failed to create sector '{name}'.")
|
||||
|
||||
|
||||
# --- Phase 3: Create Messaging Elements ---
|
||||
print("\n--- Phase 3: Creating Messaging Elements (Battlecards) ---")
|
||||
battlecards_content = extract_section(md_content, "Kill-Critique Battlecards")
|
||||
battlecards = re.findall(r"### Persona: (.*?)\n> \*\*Objection:\*\* \"(.*?)\"\n\n\*\*Response:\*\* (.*?)(?=\n\n---|\Z)", battlecards_content, re.S)
|
||||
|
||||
for persona, objection, response in battlecards:
|
||||
# Determine which sector this battlecard applies to
|
||||
current_sector_id = None
|
||||
if "Chemiepark" in response or "Wackler Security" in response:
|
||||
current_sector_id = sector_pages.get("Chemieparks/Petrochemische Anlagen")
|
||||
if "Logistik" in response or "Reinigung" in response:
|
||||
current_sector_id = sector_pages.get("Logistikzentren/Großflächenlager")
|
||||
|
||||
message_properties = {
|
||||
"Name": format_title(f"Objection: {objection}"),
|
||||
"Satz 1": format_rich_text(f"Persona: {persona.strip()}\nObjection: {objection}"),
|
||||
"Satz 2": format_rich_text(response.strip()),
|
||||
"Product Master": format_relation(product_page_id),
|
||||
}
|
||||
if current_sector_id:
|
||||
message_properties["Sector Master"] = format_relation(current_sector_id)
|
||||
|
||||
create_notion_page(DB_IDS["Messaging Matrix"], message_properties)
|
||||
|
||||
print("\nImport process complete.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
220
notion_db_setup.py
Normal file
220
notion_db_setup.py
Normal file
@@ -0,0 +1,220 @@
|
||||
import requests
|
||||
import time
|
||||
import json
|
||||
|
||||
# --- Configuration ---
|
||||
NOTION_TOKEN = "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" # Replace with your actual Notion integration token
|
||||
PARENT_PAGE_ID = "2e088f42854480248289deb383da3818" # Replace with the ID of the Notion page where you want to create the databases
|
||||
NOTION_VERSION = "2022-06-28"
|
||||
NOTION_API_BASE_URL = "https://api.notion.com/v1"
|
||||
|
||||
HEADERS = {
|
||||
"Authorization": f"Bearer {NOTION_TOKEN}",
|
||||
"Notion-Version": NOTION_VERSION,
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
|
||||
# --- Database Schemas ---
|
||||
# Define basic properties for each database. Relations will be added in a second phase.
|
||||
|
||||
DATABASE_SCHEMAS = {
|
||||
"Product Master": {
|
||||
"title": [{"type": "text", "text": {"content": "Product Master"}}],
|
||||
"properties": {
|
||||
"Name": {"title": {}},
|
||||
"Beschreibung": {"rich_text": {}},
|
||||
"Spezifikationen": {"rich_text": {}},
|
||||
"Layer": {"multi_select": {"options": [{"name": "Cleaning"}, {"name": "Service"}, {"name": "Security"}]}},
|
||||
}
|
||||
},
|
||||
"Sector & Persona Master": {
|
||||
"title": [{"type": "text", "text": {"content": "Sector & Persona Master"}}],
|
||||
"properties": {
|
||||
"Name": {"title": {}},
|
||||
"RoboPlanet-Definition": {"rich_text": {}},
|
||||
"Personas": {"multi_select": {"options": []}}, # Options can be added later if known
|
||||
"Pains": {"rich_text": {}},
|
||||
"Gains": {"rich_text": {}},
|
||||
"Probing Questions": {"rich_text": {}},
|
||||
}
|
||||
},
|
||||
"Messaging Matrix": {
|
||||
"title": [{"type": "text", "text": {"content": "Messaging Matrix"}}],
|
||||
"properties": {
|
||||
"Name": {"title": {}},
|
||||
"Satz 1": {"rich_text": {}},
|
||||
"Satz 2": {"rich_text": {}},
|
||||
"Voice Script": {"rich_text": {}},
|
||||
}
|
||||
},
|
||||
"Competitive Radar": {
|
||||
"title": [{"type": "text", "text": {"content": "Competitive Radar"}}],
|
||||
"properties": {
|
||||
"Wettbewerber": {"title": {}},
|
||||
"News": {"url": {}},
|
||||
"Blogposts": {"url": {}},
|
||||
"Kill-Argumente": {"rich_text": {}},
|
||||
"Technische Specs": {"rich_text": {}},
|
||||
}
|
||||
},
|
||||
"Enrichment Factory & RevOps": {
|
||||
"title": [{"type": "text", "text": {"content": "Enrichment Factory & RevOps"}}],
|
||||
"properties": {
|
||||
"Account Name": {"title": {}},
|
||||
"Umsatz": {"number": {"format": "euro"}},
|
||||
"Mitarbeiter": {"number": {"format": "number"}},
|
||||
"Ansprechpartner": {"rich_text": {}},
|
||||
"Job Titel": {"rich_text": {}},
|
||||
"Klassifizierung": {"multi_select": {"options": []}}, # Options can be added later if known
|
||||
"Outbound Metriken": {"rich_text": {}},
|
||||
}
|
||||
},
|
||||
"The Brain": {
|
||||
"title": [{"type": "text", "text": {"content": "The Brain"}}],
|
||||
"properties": {
|
||||
"Titel": {"title": {}},
|
||||
"Lösungsfragmente": {"rich_text": {}},
|
||||
"Quelle": {"url": {}},
|
||||
}
|
||||
},
|
||||
"GTM Workspace": {
|
||||
"title": [{"type": "text", "text": {"content": "GTM Workspace"}}],
|
||||
"properties": {
|
||||
"Kampagnen Name": {"title": {}},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# --- Database Relations (Phase B) ---
|
||||
# Define which databases relate to each other.
|
||||
# The keys are the database names, and the values are lists of (property_name, related_database_name) tuples.
|
||||
DATABASE_RELATIONS = {
|
||||
"Product Master": [
|
||||
("Sector Master", "Sector & Persona Master"),
|
||||
("Messaging Matrix", "Messaging Matrix"),
|
||||
("The Brain", "The Brain"),
|
||||
("GTM Workspace", "GTM Workspace"),
|
||||
],
|
||||
"Sector & Persona Master": [
|
||||
("Product Master", "Product Master"),
|
||||
("Messaging Matrix", "Messaging Matrix"),
|
||||
],
|
||||
"Messaging Matrix": [
|
||||
("Product Master", "Product Master"),
|
||||
("Sector Master", "Sector & Persona Master"),
|
||||
],
|
||||
"The Brain": [
|
||||
("Product Master", "Product Master"),
|
||||
],
|
||||
"GTM Workspace": [
|
||||
("Product Master", "Product Master"),
|
||||
],
|
||||
# Competitive Radar and Enrichment Factory & RevOps do not have explicit relations to other *created* databases based on the document's "Notion Datenbank-Relationen" section.
|
||||
}
|
||||
|
||||
# --- Helper Functions ---
|
||||
|
||||
def create_notion_database(parent_page_id, db_name, properties):
|
||||
print(f"Attempting to create database: {db_name}")
|
||||
create_url = f"{NOTION_API_BASE_URL}/databases"
|
||||
payload = {
|
||||
"parent": {"type": "page_id", "page_id": parent_page_id},
|
||||
"title": DATABASE_SCHEMAS[db_name]["title"],
|
||||
"properties": properties,
|
||||
}
|
||||
try:
|
||||
response = requests.post(create_url, headers=HEADERS, json=payload)
|
||||
response.raise_for_status() # Raise an exception for HTTP errors
|
||||
db_data = response.json()
|
||||
db_id = db_data["id"]
|
||||
print(f"Successfully created database '{db_name}' with ID: {db_id}")
|
||||
return db_id
|
||||
except requests.exceptions.HTTPError as e:
|
||||
print(f"HTTP Error creating database {db_name}: {e}")
|
||||
if response is not None:
|
||||
print(f"Response content: {response.text}")
|
||||
return None
|
||||
except Exception as e:
|
||||
print(f"An unexpected error occurred while creating database {db_name}: {e}")
|
||||
return None
|
||||
|
||||
def update_notion_database_relations(database_id, relations_to_add, created_db_ids):
|
||||
print(f"Attempting to update relations for database ID: {database_id}")
|
||||
update_url = f"{NOTION_API_BASE_URL}/databases/{database_id}"
|
||||
properties_to_add = {}
|
||||
for prop_name, related_db_name in relations_to_add:
|
||||
if related_db_name in created_db_ids:
|
||||
related_db_id = created_db_ids[related_db_name]
|
||||
properties_to_add[prop_name] = {
|
||||
"relation": {
|
||||
"database_id": related_db_id,
|
||||
"dual_property": {} # Notion automatically creates a dual property
|
||||
}
|
||||
}
|
||||
else:
|
||||
print(f"Warning: Related database '{related_db_name}' not found among created databases. Skipping relation for '{prop_name}'.")
|
||||
|
||||
if not properties_to_add:
|
||||
print(f"No relations to add for database ID: {database_id}")
|
||||
return False
|
||||
|
||||
payload = {
|
||||
"properties": properties_to_add
|
||||
}
|
||||
try:
|
||||
response = requests.patch(update_url, headers=HEADERS, json=payload)
|
||||
response.raise_for_status()
|
||||
print(f"Successfully updated relations for database ID: {database_id}")
|
||||
return True
|
||||
except requests.exceptions.HTTPError as e:
|
||||
print(f"HTTP Error updating relations for database ID {database_id}: {e}")
|
||||
if response is not None:
|
||||
print(f"Response content: {response.text}")
|
||||
return False
|
||||
except Exception as e:
|
||||
print(f"An unexpected error occurred while updating relations for database ID {database_id}: {e}")
|
||||
return False
|
||||
|
||||
def main():
|
||||
if NOTION_TOKEN == "YOUR_NOTION_TOKEN" or PARENT_PAGE_ID == "YOUR_PARENT_PAGE_ID":
|
||||
print("ERROR: Please update NOTION_TOKEN and PARENT_PAGE_ID in the script before running.")
|
||||
return
|
||||
|
||||
created_db_ids = {}
|
||||
|
||||
print("--- Phase A: Creating Databases ---")
|
||||
for db_name, schema in DATABASE_SCHEMAS.items():
|
||||
db_id = create_notion_database(PARENT_PAGE_ID, db_name, schema["properties"])
|
||||
if db_id:
|
||||
created_db_ids[db_name] = db_id
|
||||
print(f"Waiting 15 seconds for Notion to index database '{db_name}'...")
|
||||
time.sleep(15)
|
||||
else:
|
||||
print(f"Failed to create database: {db_name}. Aborting Phase A.")
|
||||
return
|
||||
|
||||
print("\n--- Phase B: Establishing Relations ---")
|
||||
if not created_db_ids:
|
||||
print("No databases were created in Phase A. Cannot establish relations.")
|
||||
return
|
||||
|
||||
for db_name, relations_config in DATABASE_RELATIONS.items():
|
||||
if db_name in created_db_ids:
|
||||
db_id = created_db_ids[db_name]
|
||||
print(f"Processing relations for '{db_name}' (ID: {db_id})...")
|
||||
if update_notion_database_relations(db_id, relations_config, created_db_ids):
|
||||
print(f"Waiting 15 seconds after updating relations for '{db_name}'...")
|
||||
time.sleep(15)
|
||||
else:
|
||||
print(f"Failed to update relations for: {db_name}. Continuing with other databases.")
|
||||
else:
|
||||
print(f"Warning: Database '{db_name}' not found in created IDs. Skipping relation updates.")
|
||||
|
||||
print("\n--- Setup Complete ---")
|
||||
print("Please ensure your Notion integration has access to the parent page and its sub-pages in Notion UI.")
|
||||
print("Created database IDs:")
|
||||
for name, id_val in created_db_ids.items():
|
||||
print(f"- {name}: {id_val}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user