docs: Architektur korrigiert – Router kabelgebunden, WLAN via CAPsMAN-AP
This commit is contained in:
@@ -1,31 +1,79 @@
|
||||
# 🏠 HomeMatic Anwesenheitserkennung via MikroTik
|
||||
|
||||
Automatische Anwesenheitserkennung für 2 iPhones im Heimnetz **Ebesch** (192.168.252.0/24).
|
||||
Ein Python-Script läuft minütlich auf `ebesch-docker` und fragt den MikroTik-Router per REST-API ab — sind die iPhones im WLAN eingebucht, werden die HomeMatic-Systemvariablen auf *„zu Hause"* gesetzt.
|
||||
Ein Python-Script läuft minütlich auf `ebesch-docker` und fragt den MikroTik-Router per REST-API
|
||||
nach verbundenen WLAN-Clients — werden die iPhones erkannt, setzt es die HomeMatic-Systemvariablen
|
||||
auf *„zu Hause"*.
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ Architektur
|
||||
|
||||
```
|
||||
┌─────────────────┐ REST API ┌──────────────────────────┐
|
||||
│ ebesch-docker │ ────────────────► │ MikroTik RB5009 │
|
||||
│ 192.168.252.10 │ /caps-man/ │ 192.168.252.254 │
|
||||
│ (Cronjob 1min) │ registration- │ CAPsMAN → AP .253 │
|
||||
│ │ table │ SSID: Aironet │
|
||||
└────────┬────────┘ └──────────────────────────┘
|
||||
│ ▲
|
||||
│ statechange.cgi │ WiFi
|
||||
▼ │
|
||||
┌─────────────────┐ ┌──────────┴───────────────┐
|
||||
│ HomeMatic CCU2 │ │ 📱 RP iPhone │
|
||||
│ 192.168.252.12 │ │ 📱 Kerstins iPhone │
|
||||
│ │ └──────────────────────────┘
|
||||
│ Systemvariablen│
|
||||
│ • Zone RPiPhone (1828)
|
||||
│ • Zone Kerstins iPhone (4730)
|
||||
│ • Anwesenheit (950)
|
||||
└─────────────────┘
|
||||
┌─────────────────────────────────────┐
|
||||
│ MikroTik RB5009UPr+S+ │
|
||||
│ 192.168.252.254 │
|
||||
│ Kabelrouter + CAPsMAN-Controller │
|
||||
│ (kein eigenes WLAN) │
|
||||
└────────────┬────────────────────────┘
|
||||
│ CAPsMAN (kabelgebunden)
|
||||
│ Registration Table hier
|
||||
▼
|
||||
┌────────────────────────────┐
|
||||
│ MikroTik RBcAPGi-5acD2nD │
|
||||
│ 192.168.252.253 │
|
||||
│ WLAN-Accesspoint │
|
||||
│ SSID: Aironet (2,4+5 GHz) │
|
||||
└──────┬─────────────────┬───┘
|
||||
│ WiFi │ WiFi
|
||||
▼ ▼
|
||||
📱 RP iPhone 📱 Kerstins iPhone
|
||||
|
||||
|
||||
┌─────────────────┐ REST API /interface/wifi/ ┌──────────────────┐
|
||||
│ ebesch-docker │ ──────────registration-table──►│ Router .254 │
|
||||
│ 192.168.252.10 │ ◄─────────────────────────────│ (CAPsMAN ctrl.) │
|
||||
│ Cronjob 1 min │ └──────────────────┘
|
||||
└────────┬────────┘
|
||||
│ statechange.cgi (XML-API)
|
||||
▼
|
||||
┌─────────────────────────┐
|
||||
│ HomeMatic CCU2 │
|
||||
│ 192.168.252.12 │
|
||||
│ │
|
||||
│ Zone RPiPhone (1828)│
|
||||
│ Zone K. iPhone (4730)│
|
||||
│ Anwesenheit (950)│
|
||||
└─────────────────────────┘
|
||||
```
|
||||
|
||||
> **Hinweis:** Der Router selbst hat kein WLAN. Die WLAN-Clients verbinden sich mit dem
|
||||
> separaten AP (.253). Der Router agiert als **CAPsMAN-Controller** und kennt über die
|
||||
> Registration Table alle am AP eingebuchten Geräte.
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Erkennungslogik
|
||||
|
||||
### 1. WiFi Registration Table (primär)
|
||||
`GET /rest/interface/wifi/registration-table` — ROS 7.x (neues WiFi-System)
|
||||
Zeigt alle **aktuell aktiv verbundenen** WLAN-Clients des CAPsMAN-APs.
|
||||
|
||||
### 2. CAPsMAN Registration Table (Fallback API)
|
||||
`GET /rest/caps-man/registration-table` — ROS 6 / frühe ROS-7-Versionen
|
||||
Automatischer Fallback falls der neue Pfad keine Daten liefert.
|
||||
|
||||
### 3. ARP-Tabelle (letzter Fallback)
|
||||
`GET /rest/ip/arp` — enthält zuletzt gesehene MAC/IP-Zuordnungen.
|
||||
Hilft wenn das iPhone kurz vom WLAN getrennt ist (Display aus / Sleepmode).
|
||||
|
||||
### iOS MAC-Randomisierung (iOS 14+)
|
||||
iPhones nutzen **pro SSID eine stabile private MAC-Adresse**.
|
||||
Diese bleibt für dieselbe SSID konstant — wir tragen genau diese ein.
|
||||
|
||||
**MAC-Adresse ablesen:**
|
||||
```
|
||||
iPhone → Einstellungen → WLAN → ⓘ neben "Aironet" → WLAN-Adresse
|
||||
```
|
||||
|
||||
---
|
||||
@@ -35,35 +83,11 @@ Ein Python-Script läuft minütlich auf `ebesch-docker` und fragt den MikroTik-R
|
||||
| Komponente | Gerät | IP |
|
||||
|---|---|---|
|
||||
| Script-Host | ebesch-docker | 192.168.252.10 |
|
||||
| Router | MikroTik RB5009UPr+S+ | 192.168.252.254 |
|
||||
| WLAN-AP | MikroTik RBcAPGi-5acD2nD (CAPsMAN) | 192.168.252.253 |
|
||||
| Router (CAPsMAN-Ctrl.) | MikroTik RB5009UPr+S+ | 192.168.252.254 |
|
||||
| WLAN-AP | MikroTik RBcAPGi-5acD2nD | 192.168.252.253 |
|
||||
| HomeMatic | CCU2 | 192.168.252.12 |
|
||||
|
||||
**Software auf ebesch-docker:**
|
||||
- Python 3.8+
|
||||
- `requests` Bibliothek (via pip/venv)
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Erkennung
|
||||
|
||||
### Primär: CAPsMAN Registration Table
|
||||
Zeigt alle **aktuell aktiv verbundenen** WLAN-Clients des APs.
|
||||
→ Zuverlässigste Methode, da in Echtzeit.
|
||||
|
||||
### Fallback: ARP-Tabelle
|
||||
Enthält zuletzt gesehene MAC/IP-Zuordnungen.
|
||||
→ Greift wenn das iPhone kurz vom WLAN getrennt ist (Sleepmode).
|
||||
|
||||
### iOS MAC-Randomisierung (iOS 14+)
|
||||
iPhones nutzen **pro SSID eine stabile private MAC-Adresse** (nicht die echte Hardware-MAC).
|
||||
Diese bleibt für dieselbe SSID konstant, ist aber netzwerkspezifisch.
|
||||
|
||||
**MAC-Adresse herausfinden:**
|
||||
```
|
||||
iPhone → Einstellungen → WLAN → ⓘ neben "Aironet" → WLAN-Adresse
|
||||
```
|
||||
Diese Adresse in `config.ini` eintragen.
|
||||
**Software auf ebesch-docker:** Python 3.8+, `requests` (via pip/venv)
|
||||
|
||||
---
|
||||
|
||||
@@ -78,12 +102,12 @@ git clone https://git.rwolff.homelinux.net/rpwolff/homematic-anwesenheit.git
|
||||
cd homematic-anwesenheit
|
||||
```
|
||||
|
||||
### 2. MAC-Adressen eintragen
|
||||
### 2. config.ini anlegen und MACs eintragen
|
||||
|
||||
```bash
|
||||
cp config.ini.example config.ini
|
||||
nano config.ini
|
||||
# [device.rp_iphone] → mac = XX:XX:XX:XX:XX:XX
|
||||
# [device.kerstin_iphone] → mac = XX:XX:XX:XX:XX:XX
|
||||
# mac = XX:XX:XX:XX:XX:XX ← private WLAN-MAC je iPhone eintragen
|
||||
```
|
||||
|
||||
### 3. Installation ausführen
|
||||
@@ -92,17 +116,13 @@ nano config.ini
|
||||
bash install.sh
|
||||
```
|
||||
|
||||
Das Script:
|
||||
- Legt `/opt/homematic-presence/` an
|
||||
- Erstellt ein Python-venv mit `requests`
|
||||
- Installiert einen Cronjob (`/etc/cron.d/homematic-presence`)
|
||||
- Konfiguriert Log-Rotation
|
||||
Richtet Python-venv, Cronjob und Log-Rotation ein.
|
||||
|
||||
### 4. Testen
|
||||
|
||||
```bash
|
||||
/opt/homematic-presence/venv/bin/python3 /opt/homematic-presence/presence_check.py \
|
||||
--dry-run --verbose
|
||||
/opt/homematic-presence/venv/bin/python3 \
|
||||
/opt/homematic-presence/presence_check.py --dry-run --verbose
|
||||
```
|
||||
|
||||
### 5. Log beobachten
|
||||
@@ -115,66 +135,13 @@ tail -f /var/log/homematic-presence.log
|
||||
|
||||
## 📊 HomeMatic Systemvariablen
|
||||
|
||||
| Variable | ISE-ID | Typ | `false` | `true` |
|
||||
|---|---|---|---|---|
|
||||
| Zone RPiPhone | 1828 | LOGIC | außer Haus | zu Hause |
|
||||
| Zone Kerstins iPhone | 4730 | LOGIC | außer Haus | zu Hause |
|
||||
| Anwesenheit | 950 | LOGIC | nicht anwesend | anwesend |
|
||||
| Variable | ISE-ID | `false` | `true` |
|
||||
|---|---|---|---|
|
||||
| Zone RPiPhone | **1828** | außer Haus | zu Hause |
|
||||
| Zone Kerstins iPhone | **4730** | außer Haus | zu Hause |
|
||||
| Anwesenheit | **950** | nicht anwesend | anwesend |
|
||||
|
||||
Die Variable **Anwesenheit** wird auf `true` gesetzt wenn mindestens eine Person zuhause ist.
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Konfiguration (`config.ini`)
|
||||
|
||||
```ini
|
||||
[mikrotik]
|
||||
host = 192.168.252.254
|
||||
user = admin
|
||||
password = <siehe Bitwarden / Obsidian>
|
||||
|
||||
[homematic]
|
||||
host = 192.168.252.12
|
||||
combined_ise_id = 950 # Kombinierte Anwesenheit
|
||||
|
||||
[device.rp_iphone]
|
||||
mac = XX:XX:XX:XX:XX:XX # Private WLAN-MAC für SSID "Aironet"
|
||||
ise_id = 1828
|
||||
label = RP iPhone
|
||||
|
||||
[device.kerstin_iphone]
|
||||
mac = XX:XX:XX:XX:XX:XX # Private WLAN-MAC für SSID "Aironet"
|
||||
ise_id = 4730
|
||||
label = Kerstins iPhone
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Troubleshooting
|
||||
|
||||
**CAPsMAN zeigt 0 Clients obwohl Gerät verbunden:**
|
||||
```bash
|
||||
# Router-Seite prüfen:
|
||||
curl -u admin:<pw> http://192.168.252.254/rest/caps-man/registration-table
|
||||
```
|
||||
|
||||
**HomeMatic-Variable ändert sich nicht:**
|
||||
```bash
|
||||
# XML-API direkt testen:
|
||||
curl "http://192.168.252.12/config/xmlapi/statechange.cgi?ise_id=1828&new_val=true"
|
||||
```
|
||||
|
||||
**Script manuell ausführen:**
|
||||
```bash
|
||||
/opt/homematic-presence/venv/bin/python3 \
|
||||
/opt/homematic-presence/presence_check.py --verbose
|
||||
```
|
||||
|
||||
**Cronjob-Status:**
|
||||
```bash
|
||||
systemctl status cron
|
||||
grep homematic /var/log/syslog | tail -20
|
||||
```
|
||||
`Anwesenheit` wird `true` wenn mindestens eine Person zuhause ist.
|
||||
|
||||
---
|
||||
|
||||
@@ -182,27 +149,37 @@ grep homematic /var/log/syslog | tail -20
|
||||
|
||||
| Datei | Beschreibung |
|
||||
|---|---|
|
||||
| `presence_check.py` | Hauptscript: Router abfragen → HomeMatic setzen |
|
||||
| `config.ini` | Konfiguration (MACs, IPs, Credentials) |
|
||||
| `presence_check.py` | Hauptscript |
|
||||
| `config.ini.example` | Konfigurationsvorlage (ohne Passwörter, im Repo) |
|
||||
| `config.ini` | Aktive Konfiguration (in `.gitignore`, nicht im Repo) |
|
||||
| `install.sh` | Einmalige Installation auf ebesch-docker |
|
||||
| `README.md` | Diese Dokumentation |
|
||||
|
||||
---
|
||||
|
||||
## 🔒 Sicherheitshinweise
|
||||
## 🔍 Troubleshooting
|
||||
|
||||
- `config.ini` enthält Passwörter → **nicht öffentlich committen**
|
||||
- Das Repo ist öffentlich — `config.ini` ist in `.gitignore`
|
||||
- Passwörter liegen in Bitwarden / Obsidian Firma
|
||||
```bash
|
||||
# WiFi-Clients direkt abfragen:
|
||||
curl -u admin:<pw> http://192.168.252.254/rest/interface/wifi/registration-table
|
||||
|
||||
# HomeMatic-Variable manuell setzen:
|
||||
curl "http://192.168.252.12/config/xmlapi/statechange.cgi?ise_id=1828&new_val=true"
|
||||
|
||||
# Cronjob-Log:
|
||||
tail -50 /var/log/homematic-presence.log
|
||||
|
||||
# Systemd / Cron status:
|
||||
systemctl status cron
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📅 Wartung
|
||||
## 🔒 Sicherheit
|
||||
|
||||
- RouterOS-Updates können CAPsMAN-API-Pfade ändern → Script ggf. anpassen
|
||||
- iOS-Updates können MAC-Randomisierung beeinflussen → MACs ggf. neu auslesen
|
||||
- HomeMatic-Firmware-Updates: ISE-IDs bleiben stabil
|
||||
- `config.ini` enthält Passwörter → in `.gitignore`, **nicht committen**
|
||||
- Credentials liegen in Bitwarden / Obsidian Firma
|
||||
|
||||
---
|
||||
|
||||
*Netz: Ebesch · 192.168.252.0/24 · SSID: Aironet · Repo: [git.rwolff.homelinux.net/rpwolff/homematic-anwesenheit](https://git.rwolff.homelinux.net/rpwolff/homematic-anwesenheit)*
|
||||
*Netz: Ebesch · 192.168.252.0/24 · SSID: Aironet · RouterOS: 7.20.6*
|
||||
*Repo: [git.rwolff.homelinux.net/rpwolff/homematic-anwesenheit](https://git.rwolff.homelinux.net/rpwolff/homematic-anwesenheit)*
|
||||
|
||||
Reference in New Issue
Block a user