initial
This commit is contained in:
@@ -0,0 +1,303 @@
|
||||
# openclaw-mailbox-cal
|
||||
|
||||
**OpenClaw Skill-Repository** — mailbox.org Kalender und Aufgaben auf dem Raspberry Pi
|
||||
Telegram-Bot-Befehle für Kalendertermine (khal), Tasks (todoman) und automatischen CalDAV-Sync (vdirsyncer).
|
||||
|
||||
---
|
||||
|
||||
## Schnellstart
|
||||
|
||||
```bash
|
||||
# 1. .env befüllen
|
||||
cp assets/.env.example .env && nano .env
|
||||
|
||||
# 2. Installation
|
||||
chmod +x scripts/install.sh && bash scripts/install.sh
|
||||
|
||||
# 3. Selbsttest
|
||||
bash scripts/test_setup.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Projektstruktur
|
||||
|
||||
```
|
||||
openclaw-mailbox-cal/
|
||||
├── SKILL.md ← OpenClaw Skill-Definition
|
||||
├── README.md ← Diese Datei
|
||||
├── assets/
|
||||
│ └── .env.example ← Umgebungsvariablen-Vorlage
|
||||
├── config/
|
||||
│ ├── vdirsyncer.conf ← vdirsyncer CalDAV-Konfiguration
|
||||
│ ├── khal.conf ← khal Kalender-Konfiguration
|
||||
│ └── todoman.conf ← todoman Aufgaben-Konfiguration
|
||||
├── scripts/
|
||||
│ ├── install.sh ← Installations-Script (Raspi)
|
||||
│ ├── test_setup.sh ← Selbsttest aller Komponenten
|
||||
│ └── openclaw_skill.py ← OpenClaw/Telegram Bot Handler
|
||||
└── systemd/
|
||||
├── vdirsyncer-sync.service ← systemd Service Unit
|
||||
├── vdirsyncer-sync.timer ← systemd Timer (alle 15 Min.)
|
||||
└── vdirsyncer-sync.env ← Umgebungsvariablen für systemd
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Setup-Schritte (detailliert)
|
||||
|
||||
### Schritt 1 — Voraussetzungen
|
||||
|
||||
- Raspberry Pi mit Raspberry Pi OS Bookworm (64-bit empfohlen) oder Ubuntu 22.04+ ARM
|
||||
- mailbox.org-Konto
|
||||
- App-Passwort in mailbox.org anlegen:
|
||||
`Einstellungen → Sicherheit → App-Passwörter → Neu erstellen`
|
||||
- OpenClaw installiert: [openclaw.dev](https://openclaw.dev)
|
||||
- Telegram Bot-Token via [@BotFather](https://t.me/BotFather)
|
||||
|
||||
### Schritt 2 — .env konfigurieren
|
||||
|
||||
```bash
|
||||
cp assets/.env.example .env
|
||||
nano .env
|
||||
```
|
||||
|
||||
Mindestens diese Werte setzen:
|
||||
|
||||
```dotenv
|
||||
MAILBOX_USER=vorname.nachname@mailbox.org
|
||||
MAILBOX_PASS=app-passwort-xyz
|
||||
```
|
||||
|
||||
### Schritt 3 — install.sh ausführen
|
||||
|
||||
```bash
|
||||
chmod +x scripts/install.sh
|
||||
bash scripts/install.sh
|
||||
```
|
||||
|
||||
Das Script installiert automatisch:
|
||||
- `vdirsyncer` — CalDAV-Sync-Tool
|
||||
- `khal` — CLI-Kalender
|
||||
- `todoman` — CLI-Aufgabenverwaltung
|
||||
- `pass` — GNU Password Store
|
||||
- `python3-keyring` — Python-Keyring-Integration
|
||||
- `gettext-base` — envsubst für Konfigurationen
|
||||
|
||||
Anschließend:
|
||||
- Alle Konfigurationsdateien werden deployed
|
||||
- systemd User-Timer wird aktiviert
|
||||
- Initialer Sync wird durchgeführt
|
||||
|
||||
### Schritt 4 — OpenClaw Skill registrieren
|
||||
|
||||
OpenClaw erkennt Skills **automatisch** wenn sie in einem der Skill-Verzeichnisse liegen.
|
||||
Kein manueller Eintrag in `openclaw.json` nötig — das `install.sh` legt bereits einen Symlink an.
|
||||
|
||||
```bash
|
||||
# Manuell (falls install.sh den Symlink nicht angelegt hat):
|
||||
mkdir -p ~/.openclaw/skills
|
||||
ln -s ~/mailbox-cal ~/.openclaw/skills/mailbox-cal
|
||||
```
|
||||
|
||||
Optional — Zugangsdaten direkt in `~/.openclaw/openclaw.json` hinterlegen
|
||||
(Alternative zur `.env`-Datei). **Immer zuerst Backup anlegen:**
|
||||
|
||||
```bash
|
||||
cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak
|
||||
```
|
||||
|
||||
Dann im `"skills"`-Block den `"entries"`-Unterblock ergänzen:
|
||||
|
||||
```json
|
||||
"skills": {
|
||||
"install": {
|
||||
"nodeManager": "npm"
|
||||
},
|
||||
"entries": {
|
||||
"mailbox-cal": {
|
||||
"enabled": true,
|
||||
"env": {
|
||||
"MAILBOX_USER": "dein.name@mailbox.org",
|
||||
"MAILBOX_PASS": "app-passwort-xyz"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Nach jeder Änderung an `openclaw.json` validieren und Gateway neu starten:
|
||||
|
||||
```bash
|
||||
openclaw doctor --fix
|
||||
openclaw gateway restart
|
||||
```
|
||||
|
||||
### Schritt 5 — Telegram testen
|
||||
|
||||
Sende an deinen Bot:
|
||||
```
|
||||
/termine
|
||||
/aufgaben
|
||||
/sync
|
||||
/status
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Test-Befehle
|
||||
|
||||
### Vollständiger Selbsttest
|
||||
```bash
|
||||
bash scripts/test_setup.sh
|
||||
```
|
||||
|
||||
### vdirsyncer
|
||||
```bash
|
||||
# Verbindung testen und Sammlungen entdecken
|
||||
vdirsyncer discover calendars
|
||||
vdirsyncer discover tasks
|
||||
|
||||
# Synchronisation manuell starten
|
||||
vdirsyncer sync
|
||||
|
||||
# Nur Kalender synchronisieren
|
||||
vdirsyncer sync calendars
|
||||
|
||||
# Verbose-Ausgabe
|
||||
vdirsyncer -v DEBUG sync
|
||||
```
|
||||
|
||||
### khal
|
||||
```bash
|
||||
# Termine heute
|
||||
khal list
|
||||
|
||||
# Termine nächste 7 Tage
|
||||
khal list today 7d
|
||||
|
||||
# Agenda-Ansicht
|
||||
khal agenda
|
||||
|
||||
# Interaktiver Kalender
|
||||
ikhal
|
||||
|
||||
# Ereignis hinzufügen (interaktiv)
|
||||
khal new
|
||||
|
||||
# Ereignis direkt anlegen
|
||||
khal new 2025-06-15 14:00 15:00 "Arzttermin" --calendar mailbox_kalender
|
||||
|
||||
# Cache neu aufbauen
|
||||
khal rebuild-cache
|
||||
|
||||
# Konfiguration anzeigen
|
||||
khal printformats
|
||||
```
|
||||
|
||||
### todoman
|
||||
```bash
|
||||
# Alle offenen Aufgaben
|
||||
todo list
|
||||
|
||||
# Alle Aufgaben inkl. erledigt
|
||||
todo list --all
|
||||
|
||||
# Neue Aufgabe
|
||||
todo new "Bericht schreiben"
|
||||
|
||||
# Aufgabe mit Fälligkeitsdatum
|
||||
todo new --due 2025-06-30 "Bericht abgeben"
|
||||
|
||||
# Aufgabe mit Priorität (1=hoch, 9=niedrig)
|
||||
todo new --priority 1 "Dringend: Server patchen"
|
||||
|
||||
# Aufgabe als erledigt markieren (ID aus 'todo list')
|
||||
todo done 1
|
||||
|
||||
# Aufgabe löschen
|
||||
todo delete 2
|
||||
|
||||
# Aufgaben-Listen anzeigen
|
||||
todo lists
|
||||
```
|
||||
|
||||
### systemd
|
||||
```bash
|
||||
# Timer-Status
|
||||
systemctl --user status vdirsyncer-sync.timer
|
||||
|
||||
# Service manuell starten (einmaliger Sync)
|
||||
systemctl --user start vdirsyncer-sync.service
|
||||
|
||||
# Alle User-Timer anzeigen
|
||||
systemctl --user list-timers
|
||||
|
||||
# Live-Log verfolgen
|
||||
journalctl --user -u vdirsyncer-sync.service -f
|
||||
|
||||
# Log der letzten 50 Zeilen
|
||||
journalctl --user -u vdirsyncer-sync.service -n 50
|
||||
|
||||
# Timer deaktivieren
|
||||
systemctl --user disable --now vdirsyncer-sync.timer
|
||||
```
|
||||
|
||||
### Python-Skill direkt testen
|
||||
```bash
|
||||
python3 scripts/openclaw_skill.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## mailbox.org CalDAV-Endpunkte
|
||||
|
||||
| Zweck | URL |
|
||||
|---|---|
|
||||
| CalDAV-Basis | `https://dav.mailbox.org/caldav/<USER>/` |
|
||||
| Kalender-Sammlung | `https://dav.mailbox.org/caldav/<USER>/Kalender/` |
|
||||
| Aufgaben-Sammlung | `https://dav.mailbox.org/caldav/<USER>/Aufgaben/` |
|
||||
| CardDAV (Kontakte) | `https://dav.mailbox.org/carddav/<USER>/` |
|
||||
|
||||
Entdeckung aller Sammlungen:
|
||||
```bash
|
||||
curl -u "USER:PASS" -X PROPFIND https://dav.mailbox.org/caldav/ \
|
||||
-H "Depth: 1" -H "Content-Type: application/xml"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Sicherheit
|
||||
|
||||
| Maßnahme | Status |
|
||||
|---|---|
|
||||
| App-Passwort statt Hauptpasswort | ✅ Empfohlen |
|
||||
| vdirsyncer-Config: chmod 600 | ✅ Automatisch via install.sh |
|
||||
| .env nicht in Git | ✅ In .gitignore eingetragen |
|
||||
| HTTPS für CalDAV | ✅ dav.mailbox.org erzwingt TLS |
|
||||
| pass(1)-Integration | Optional via `pass` + `python3-keyring` |
|
||||
|
||||
---
|
||||
|
||||
## Fehlerbehebung
|
||||
|
||||
**vdirsyncer: `[Errno 111] Connection refused`**
|
||||
→ Netzwerkverbindung prüfen: `ping dav.mailbox.org`
|
||||
|
||||
**vdirsyncer: `Conflict!`**
|
||||
→ Beide Seiten wurden geändert. Konflikt manuell lösen oder `conflict_resolution = "b wins"` in vdirsyncer.conf setzen.
|
||||
|
||||
**khal: `No calendars configured`**
|
||||
→ `khal rebuild-cache` ausführen; Pfad in `~/.config/khal/config` prüfen.
|
||||
|
||||
**todoman: `Error: No lists found`**
|
||||
→ `path`-Eintrag in `~/.config/todoman/config.cfg` prüfen; Verzeichnis `~/.local/share/vdirsyncer/tasks/` muss existieren und `.ics`-Dateien enthalten.
|
||||
|
||||
**systemd-Timer läuft nach Reboot nicht**
|
||||
→ `sudo loginctl enable-linger $USER` ausführen (User-Session ohne Login).
|
||||
|
||||
---
|
||||
|
||||
## Lizenz
|
||||
|
||||
MIT — Freie Nutzung, Veränderung und Weitergabe.
|
||||
@@ -0,0 +1,226 @@
|
||||
---
|
||||
name: mailbox-cal
|
||||
description: "OpenClaw Telegram-Bot-Skill für mailbox.org Kalender und Aufgaben auf dem Raspberry Pi. Synchronisiert CalDAV-Kalender und VTODO-Aufgaben via vdirsyncer, zeigt Termine mit khal und verwaltet Tasks mit todoman. Befehle: /termine, /aufgaben, /neu_aufgabe, /sync, /status. Lade diesen Skill wenn: der Nutzer Kalender-Einträge oder Aufgaben aus mailbox.org per Telegram abfragen, anlegen oder synchronisieren möchte."
|
||||
license: MIT
|
||||
compatibility: "Raspberry Pi OS Bookworm / Ubuntu 22.04+ ARM. Benötigt: vdirsyncer >= 0.19, khal >= 0.11, todoman >= 4.3, python3 >= 3.10. mailbox.org CalDAV-Zugang erforderlich."
|
||||
metadata:
|
||||
author: lonely.wolf.64
|
||||
version: '1.0'
|
||||
platform: Raspberry Pi
|
||||
caldav_server: mailbox.org
|
||||
---
|
||||
|
||||
# mailbox.org Kalender + Aufgaben Skill
|
||||
|
||||
## Übersicht
|
||||
|
||||
Dieser OpenClaw-Skill synchronisiert deinen mailbox.org-Kalender und deine Aufgaben über CalDAV auf einen Raspberry Pi und stellt sie über Telegram-Bot-Befehle bereit. Die Synchronisation läuft automatisch alle 15 Minuten via systemd-Timer.
|
||||
|
||||
**Architektur:**
|
||||
```
|
||||
mailbox.org (CalDAV)
|
||||
│
|
||||
vdirsyncer (Sync)
|
||||
│
|
||||
┌───┴───────────┐
|
||||
│ │
|
||||
khal todoman
|
||||
(Kalender) (Aufgaben)
|
||||
│ │
|
||||
└───────┬───────┘
|
||||
│
|
||||
openclaw_skill.py
|
||||
│
|
||||
Telegram Bot
|
||||
```
|
||||
|
||||
## Unterstützte Befehle
|
||||
|
||||
| Telegram-Befehl | Beschreibung | Beispiel |
|
||||
|---|---|---|
|
||||
| `/termine` | Heutige Termine | `/termine heute` |
|
||||
| `/termine morgen` | Morgige Termine | `/termine morgen` |
|
||||
| `/termine woche` | Termine nächste 7 Tage | `/termine woche` |
|
||||
| `/aufgaben` | Offene Aufgaben | `/aufgaben` |
|
||||
| `/aufgaben alle` | Alle Aufgaben inkl. erledigt | `/aufgaben alle` |
|
||||
| `/neu_aufgabe` | Neue Aufgabe anlegen | `/neu_aufgabe Arzt anrufen` |
|
||||
| `/sync` | Manuellen Sync auslösen | `/sync` |
|
||||
| `/status` | Sync-Timer-Status | `/status` |
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
- Raspberry Pi mit Raspberry Pi OS Bookworm oder Ubuntu 22.04+ ARM
|
||||
- mailbox.org-Konto mit CalDAV-Zugang
|
||||
- OpenClaw installiert und konfiguriert
|
||||
- Telegram Bot-Token (via @BotFather)
|
||||
- Internetverbindung vom Raspberry Pi
|
||||
|
||||
## Installation
|
||||
|
||||
### 1. Repository klonen
|
||||
|
||||
```bash
|
||||
git clone https://github.com/DEIN_USER/openclaw-mailbox-cal.git
|
||||
cd openclaw-mailbox-cal
|
||||
```
|
||||
|
||||
### 2. .env befüllen
|
||||
|
||||
```bash
|
||||
cp assets/.env.example .env
|
||||
nano .env
|
||||
# MAILBOX_USER und MAILBOX_PASS setzen
|
||||
```
|
||||
|
||||
**Empfehlung:** Lege in mailbox.org ein App-Passwort an:
|
||||
Einstellungen → Sicherheit → App-Passwörter → Neu erstellen
|
||||
|
||||
### 3. Installation ausführen
|
||||
|
||||
```bash
|
||||
chmod +x scripts/install.sh
|
||||
bash scripts/install.sh
|
||||
```
|
||||
|
||||
Das Script führt folgende Schritte aus:
|
||||
1. Pakete installieren: `vdirsyncer khal todoman pass python3-keyring gettext-base`
|
||||
2. Konfigurationsdateien deployen (mit envsubst)
|
||||
3. systemd User-Timer aktivieren
|
||||
4. Initialen Sync durchführen
|
||||
5. khal-Datenbank aufbauen
|
||||
6. OpenClaw Skill verknüpfen
|
||||
|
||||
### 4. Skill in OpenClaw registrieren
|
||||
|
||||
OpenClaw erkennt Skills automatisch aus diesen Verzeichnissen (höchste Priorität zuerst):
|
||||
- `<workspace>/skills/`
|
||||
- `~/.openclaw/skills/`
|
||||
- bundled skills
|
||||
|
||||
Skill-Verzeichnis ins OpenClaw-Skills-Verzeichnis kopieren oder verlinken:
|
||||
|
||||
```bash
|
||||
# Option A: Symlink (empfohlen — Updates wirken sofort)
|
||||
mkdir -p ~/.openclaw/skills
|
||||
ln -s ~/mailbox-cal ~/.openclaw/skills/mailbox-cal
|
||||
|
||||
# Option B: Kopieren
|
||||
cp -r ~/mailbox-cal ~/.openclaw/skills/mailbox-cal
|
||||
```
|
||||
|
||||
Optional: Skill in `~/.openclaw/openclaw.json` aktivieren/konfigurieren
|
||||
(nur nötig für env-Variablen oder explizites enable/disable):
|
||||
|
||||
```json
|
||||
"skills": {
|
||||
"install": {
|
||||
"nodeManager": "npm"
|
||||
},
|
||||
"entries": {
|
||||
"mailbox-cal": {
|
||||
"enabled": true,
|
||||
"env": {
|
||||
"MAILBOX_USER": "dein.name@mailbox.org",
|
||||
"MAILBOX_PASS": "app-passwort-xyz"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Wichtig:** Unbekannte Keys lassen den OpenClaw-Gateway nicht starten.
|
||||
Vor dem Bearbeiten immer ein Backup anlegen:
|
||||
```bash
|
||||
cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak
|
||||
# Nach der Bearbeitung validieren:
|
||||
openclaw doctor --fix
|
||||
```
|
||||
|
||||
Danach Gateway neu starten:
|
||||
```bash
|
||||
openclaw gateway restart
|
||||
```
|
||||
|
||||
## Test-Befehle
|
||||
|
||||
Nach der Installation Setup validieren:
|
||||
|
||||
```bash
|
||||
# Vollständiger Selbsttest
|
||||
bash scripts/test_setup.sh
|
||||
|
||||
# Einzeltests
|
||||
vdirsyncer sync # Sync testen
|
||||
khal list today tomorrow # Termine heute + morgen
|
||||
khal list --format "{start} {title}" 2025-01-01 2025-12-31 # Jahresübersicht
|
||||
todo list # Aufgaben anzeigen
|
||||
todo list --all # Alle inkl. erledigt
|
||||
todo new "Test-Aufgabe" # Aufgabe anlegen
|
||||
|
||||
# systemd Timer
|
||||
systemctl --user status vdirsyncer-sync.timer # Timer-Status
|
||||
systemctl --user list-timers # Alle Timer
|
||||
journalctl --user -u vdirsyncer-sync.service -f # Live-Log
|
||||
|
||||
# Python-Skill direkt testen (ohne OpenClaw/Telegram)
|
||||
python3 scripts/openclaw_skill.py
|
||||
```
|
||||
|
||||
## Konfigurationsdateien
|
||||
|
||||
| Datei | Ziel-Pfad | Beschreibung |
|
||||
|---|---|---|
|
||||
| `config/vdirsyncer.conf` | `~/.config/vdirsyncer/config` | CalDAV-Sync-Konfiguration |
|
||||
| `config/khal.conf` | `~/.config/khal/config` | Kalender-Anzeige-Konfiguration |
|
||||
| `config/todoman.conf` | `~/.config/todoman/config.cfg` | Aufgaben-Konfiguration |
|
||||
| `systemd/vdirsyncer-sync.service` | `~/.config/systemd/user/` | Sync-Service Unit |
|
||||
| `systemd/vdirsyncer-sync.timer` | `~/.config/systemd/user/` | 15-Minuten-Timer |
|
||||
| `scripts/openclaw_skill.py` | (in-place) | OpenClaw/Telegram-Integration |
|
||||
|
||||
## Sicherheitshinweise
|
||||
|
||||
- Die vdirsyncer-Config (`~/.config/vdirsyncer/config`) enthält das Passwort — Berechtigungen sind `chmod 600`
|
||||
- Verwende ein mailbox.org App-Passwort statt des Hauptpassworts
|
||||
- Für produktive Umgebungen: `pass`-Integration (GNU Password Store) via `pass` + `python3-keyring`
|
||||
- `.env`-Datei niemals in Git committen (ist in `.gitignore` eingetragen)
|
||||
|
||||
## Fehlerbehebung
|
||||
|
||||
### vdirsyncer discover schlägt fehl
|
||||
```bash
|
||||
# Verbindung testen
|
||||
curl -u "USER:PASS" https://dav.mailbox.org/caldav/
|
||||
# SSL-Zertifikate prüfen
|
||||
openssl s_client -connect dav.mailbox.org:443
|
||||
```
|
||||
|
||||
### khal zeigt keine Termine
|
||||
```bash
|
||||
# Cache neu aufbauen
|
||||
khal rebuild-cache
|
||||
# Config validieren
|
||||
khal printformats
|
||||
```
|
||||
|
||||
### systemd-Timer läuft nicht
|
||||
```bash
|
||||
# Lingering aktivieren (damit User-Units ohne Login laufen)
|
||||
sudo loginctl enable-linger pi
|
||||
# Timer manuell starten
|
||||
systemctl --user start vdirsyncer-sync.service
|
||||
```
|
||||
|
||||
### Todoman findet keine Aufgaben
|
||||
```bash
|
||||
# Pfad in config prüfen
|
||||
cat ~/.config/todoman/config.cfg
|
||||
# Verzeichnis prüfen
|
||||
ls ~/.local/share/vdirsyncer/tasks/
|
||||
```
|
||||
|
||||
## Erweiterungen
|
||||
|
||||
- **Mehrere Kalender:** Weitere `[[kalender_name]]`-Sektionen in `khal.conf` hinzufügen
|
||||
- **Push-Sync:** mailbox.org unterstützt CalDAV-Push — XMPP-Trigger via `vdirsyncer`
|
||||
- **Erinnerungen:** Integration mit `khal-remind` oder `at`-Daemon
|
||||
- **Verschlüsselung:** `.env` via `gpg-agent` verschlüsseln
|
||||
Reference in New Issue
Block a user