Hallo Zusammen
ich bin gerade an einer neuen Idee: Gartenkalender in SmartHome zu integrieren. Das scheint noch ein grösseres Projekt zu sein, vor allem mit mehreren Pflanzen... Jedenfalls habe ich schon mal einen Teil, die Integration in den Kalender von MS365 fertigstellen können.
Da es vielleicht auch noch praktisch für andere Sachen ist, denke ich könnte dieser Artikel den einten oder anderen Interessieren.
1. MS 365 Umgebung vorbereiten:
✅ Voraussetzungen:
- Microsoft-Konto (am besten MS365 geschäftlich oder schulisch)
- Zugriff auf https://portal.azure.com
1. Öffne das Azure-Portal
- Gehe zu: https://portal.azure.com
2. Navigiere zu „Azure Active Directory“
- Im linken Menü: „Azure Active Directory“
- Oder suche oben nach „Azure Active Directory“
3. App-Registrierung starten
- Links im Menü: „App-Registrierungen“
- Klicke auf „+ Neue Registrierung“
4. App registrieren
- Fülle aus:
| Feld | Wert |
|---|---|
| Name | z. B. OpenHAB Kalenderzugriff |
| Unterstützte Kontotypen | „Nur Konten in diesem Organisationsverzeichnis“ oder „Persönliche Microsoft-Konten“ |
| Umleitungs-URI | (leer lassen für jetzt oder z. B. http://localhost) |
- Dann auf „Registrieren“ klicken.
5. App-ID & Verzeichnis-ID notieren
- Nach der Registrierung landest du auf der App-Übersicht:
- Anwendungs-ID (Client-ID) → merken
- Verzeichnis-ID (Tenant-ID) → merken
6. API-Berechtigungen hinzufügen
- Im linken Menü: „API-Berechtigungen“
- Klicke auf „Berechtigung hinzufügen“
- Wähle: Microsoft Graph
- → Delegierte Berechtigungen (wenn du dich als Benutzer anmeldest)
oder
→ Anwendungberechtigungen (wenn das ohne Benutzerlogin laufen soll, z. B. in openHAB)
📌 Für Kalendereinträge:
- Suche nach: Calendars.ReadWrite
- Wähle es aus
- Klicke auf Berechtigungen hinzufügen
❗ Danach:
- Bei Anwendungberechtigungen: „Administratorzustimmung erteilen“ klicken
7. Client-Secret erzeugen
- Gehe zu: „Zertifikate & Geheimnisse“
- Klicke auf „Neues Geheimnis“
- Name: z. B. OpenHAB Zugriff
- Ablauf: z. B. 6 Monate oder 12 Monate
- Klicke auf Hinzufügen
WICHTIG:
Den erzeugten Geheimnis-Wert (Secret Value) sofort kopieren! Er wird nur einmal angezeigt.
📦 Du hast jetzt:
| Name | Verwendung |
|---|---|
| Client-ID | Zur Authentifizierung der App |
| Tenant-ID | Dein Azure-Verzeichnis |
| Client-Secret | Passwort für deine App |
2. OPENHAB Vorbereiten:
1. Verzeichnisstruktur (Vorschlag)
Speichere alles in z. B.:
2. Script: setup_env.sh (einmal ausführen)
bashKopierenBearbeiten#!/bin/bash # Erstelle und konfiguriere die virtuelle Umgebung
echo "📦 Installiere venv-Modul (falls nötig)..."
sudo apt update
sudo apt install -y python3-venv
echo "🧪 Erstelle virtuelle Umgebung..."
python3 -m venv /etc/openhab/scripts/ms365/env
echo "📦 Installiere benötigte Pakete..."
/etc/openhab/scripts/ms365/env/bin/pip install requests msal
echo "✅ Umgebung ist bereit."
Alles anzeigen
Speichern als /etc/openhab/scripts/ms365/setup_env.sh, dann ausführen:
📝 3. Script: create_event.py
#!/usr/bin/env python3
from msal import ConfidentialClientApplication
import requests
import json
# ==== KONFIGURATION ====
CLIENT_ID = "ClientID"
CLIENT_SECRET = "ClientSecret"
TENANT_ID = "TenantID"
TIMEZONE = "Europe/Zurich"
USER_EMAIL = "email@adresse.ch"
MINIGARTEN_CALENDAR_ID = "KalenderID"
# === Beispiel-Daten ===
SUBJECT = "🌱 Licht umgestellt"
BODY = "Das Pflanzenlicht wurde auf Blütephase umgestellt."
START_TIME = "2025-08-10T10:00:00"
END_TIME = "2025-08-10T10:30:00"
# === MSAL Authentifizierung ===
app = ConfidentialClientApplication(
CLIENT_ID,
authority=f"https://login.microsoftonline.com/{TENANT_ID}",
client_credential=CLIENT_SECRET
)
result = app.acquire_token_for_client(scopes=["https://graph.microsoft.com/.default"])
if "access_token" not in result:
print("❌ Authentifizierung fehlgeschlagen:")
print(result.get("error_description"))
exit(1)
headers = {
"Authorization": f"Bearer {result['access_token']}",
"Content-Type": "application/json"
}
event = {
"subject": SUBJECT,
"body": {
"contentType": "HTML",
"content": BODY
},
"start": {
"dateTime": START_TIME,
"timeZone": TIMEZONE
},
"end": {
"dateTime": END_TIME,
"timeZone": TIMEZONE
}
}
# 📋 Alle Kalender auflisten -> diese Zeilen beim ersten mal auskommentieren, um die ID vom Kalender / Unterkalender ausfindig zu machen
#calendars_url = f"https://graph.microsoft.com/v1.0/users/{USER_EMAIL}/calendars"
#cal_response = requests.get(calendars_url, headers=headers)
#if cal_response.status_code == 200:
# calendars = cal_response.json().get("value", [])
# for cal in calendars:
# print(f"📅 Kalendername: {cal['name']}, ID: {cal['id']}")
#else:
# print(f"❌ Fehler beim Abrufen der Kalender ({cal_response.status_code}):")
# print(cal_response.text)
# exit(1)
# === Anfrage senden ===
#url = f"https://graph.microsoft.com/v1.0/users/{USER_EMAIL}/calendar/events"
url = f"https://graph.microsoft.com/v1.0/users/{USER_EMAIL}/calendars/{MINIGARTEN_CALENDAR_ID}/events"
response = requests.post(url, headers=headers, data=json.dumps(event))
#response = requests.post("https://graph.microsoft.com/v1.0/me/events", headers=headers, data=json.dumps(event))
if response.status_code == 201:
print("✅ Termin erfolgreich erstellt.")
else:
print(f"❌ Fehler ({response.status_code}):")
print(response.text)
Alles anzeigen
Speichern als /etc/openhab/scripts/ms365/create_event.py.
4. Test per Kommandozeile
bashKopierenBearbeiten/etc/openhab/scripts/ms365/env/bin/python3 /etc/openhab/scripts/ms365/create_event.py
Wenn alles klappt, siehst du:
✅ Termin erfolgreich erstellt.
5. Integration in openHAB (optional)
In einer Regel oder einem Widget kannst du das Script z. B. mit executeCommandLine starten: