Add files via upload

This commit is contained in:
Sinned
2026-04-27 06:01:00 +02:00
committed by GitHub
parent 867742782c
commit f4a2db5896
11 changed files with 1616 additions and 19 deletions

141
README.md
View File

@@ -1,26 +1,129 @@
# tgbbz-dillingen-smart-mirror
# Smart Mirror · Arduino USB Monitor v3
Eine Sammlung an Python und Arduino-Skripten zur Umsetzung eines kleinen "SmartMirrors", der im Rahmen eines Berufsschulprojektes am TGBBZ Dillingen (saar) entstanden ist.
## Projektstruktur
## Repostruktur
```
- raspi/
raspi/Notification.py
Behandelt E-Mail-Benachrichtigungen und fungiert als SMTP-Client
raspi/Dashboard.py
Stellt das eigentliche Dashboard des MagicMirrors zur Verfügung, basiert im wesentlichen
auf dem Web Application Framework Flask und der Template Engine Jinja
raspi/ReadUSB.py
Liest über die entsprechende Grätedatei (z.B. /dev/ACM0) den USB-Input des Arduinos aus und reicht die Informationen
an Dashboard.py zur Anzeige bzw. an Notification.py zur Benachrichtigung weiter
- arduino
arduino/ReadData.ino
Liest Sensordaten von angeschlossenen Senoren aus, bringt sie in ein einheitliches Format (JSON) und überträgt sie per USB an den
angeschlossenen Raspberry Pi
usb_monitor_v3/
├── settings.json ← zentrale Konfiguration
├── USBRead.py ← serielle Leseschicht + Parser
├── Notification.py ← SMTP- + WhatsApp-Alerting
├── Dashboard.py ← Flask App Factory
├── gunicorn.conf.py ← Gunicorn-Konfiguration
├── requirements.txt
├── templates/
├── base.html ← Jinja2 Basis-Layout
│ └── dashboard.html ← Smart-Mirror-Dashboard
└── static/
├── css/
│ └── mirror.css ← Smart-Mirror-Stylesheet
└── js/
└── dashboard.js ← Polling, Chart, Uhr, Sensor-Tiles
```
## Übersicht
![logischer aufbau](https://raw.githubusercontent.com/Sinned50/tgbbz-dillingen-magic-mirror/refs/heads/main/Logischer%20Aufbau%20-%20SmartMirror%20(Lucidchart).png?token=GHSAT0AAAAAAD3QF5YYY2GQAOTGUZYORHHK2POACEA)
---
## Installation
```bash
pip install -r requirements.txt
# Nur bei whatsapp.provider = "twilio":
pip install twilio
```
---
## Starten
```bash
# Gunicorn (Produktion, Port 80 → sudo nötig)
sudo gunicorn -c gunicorn.conf.py "Dashboard:create_app()"
# Ohne Root (Port in settings.json auf z.B. 8080 setzen)
gunicorn -c gunicorn.conf.py "Dashboard:create_app()"
# Flask direkt (Entwicklung)
python Dashboard.py
```
---
## settings.json — Referenz
### `usb`
| Schlüssel | Beschreibung |
|----------------------|--------------------------------------------------|
| `port` | Gerätepfad, z.B. `/dev/ttyACM0` |
| `baud_rate` | Baudrate |
| `reconnect_delay_s` | Sekunden bis Reconnect-Versuch |
| `buffer_size` | Maximale Einträge im Ring-Buffer |
### `dashboard`
| Schlüssel | Beschreibung |
|----------------------|--------------------------------------------------|
| `host` | Bind-Adresse (`0.0.0.0` = alle Interfaces) |
| `port` | HTTP-Port |
| `poll_interval_ms` | Browser-Polling-Intervall in ms |
| `title` | Titel im Header und Browser-Tab |
### `smtp`
| Schlüssel | Beschreibung |
|----------------------|--------------------------------------------------|
| `enabled` | `true` / `false` — Kanal an/aus |
| `host` | SMTP-Hostname |
| `port` | SMTP-Port (587 STARTTLS, 465 SSL) |
| `use_tls` | `true` → STARTTLS, `false` → direktes SSL |
| `username` | Login |
| `password` | Passwort |
| `from_address` | Absender |
| `to_addresses` | Empfänger-Array |
| `cooldown_s` | Mindestabstand zwischen Alerts (pro Sensor) |
### `whatsapp`
| Schlüssel | Beschreibung |
|----------------------|--------------------------------------------------|
| `enabled` | `true` / `false` |
| `provider` | `"twilio"` oder `"callmebot"` |
| `cooldown_s` | Mindestabstand WhatsApp-Alerts (pro Sensor) |
**Twilio** (`whatsapp.twilio`):
- Account SID + Auth Token aus der Twilio Console
- `from_number`: `"whatsapp:+14155238886"` (Sandbox) oder eigene Nummer
- `to_numbers`: Array mit `"whatsapp:+49..."`
- Einmalige Sandbox-Aktivierung: https://www.twilio.com/console/sms/whatsapp/sandbox
**CallMeBot** (`whatsapp.callmebot`) — kostenlos, kein Account:
- API-Key einmalig aktivieren: https://www.callmebot.com/blog/free-api-whatsapp-messages/
- `to_numbers`: Array mit Rufnummern im Format `"+49151..."`
### `sensors`
Jeder Eintrag im Array beschreibt einen Messkanal:
| Schlüssel | Beschreibung |
|--------------------|-------------------------------------------------------|
| `name` | Anzeigename |
| `field_index` | Index im `values`-Array (0-basiert) |
| `unit` | Einheit (Anzeige), z.B. `"°C"` |
| `threshold_high` | Oberer Grenzwert (`null` = kein) |
| `threshold_low` | Unterer Grenzwert (`null` = kein) |
| `notify_on_high` | E-Mail + WA senden bei Überschreitung |
| `notify_on_low` | E-Mail + WA senden bei Unterschreitung |
---
## Arduino-Ausgabeformate (automatisch erkannt)
| Format | Beispiel |
|--------------|--------------------------------|
| Numerisch | `23.5 67.1 4.92` |
| Key=Value | `temp=23.5,hum=67.1,volt=4.92` |
| JSON | `{"temp":23.5,"hum":67.1}` |
---
## Smart Mirror Betrieb
Für den Einsatz als Smart Mirror empfiehlt sich:
- Chromium im Kiosk-Modus: `chromium-browser --kiosk http://localhost`
- Bildschirm-Timeout deaktivieren: `xset s off && xset -dpms`
- Autostart via `/etc/rc.local` oder systemd (siehe README v2)