Dateien nach "/" hochladen
This commit is contained in:
1 parent
816b4fc549
commit
c049570ab5
4 files changed
+163
No files matched your search
+21
@@ -0,0 +1,21 @@
|
|||||||
|
FROM python:3.12-alpine
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Runtime deps only
|
||||||
|
RUN apk add --no-cache tini
|
||||||
|
|
||||||
|
COPY requirements.txt .
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
COPY app/ ./
|
||||||
|
|
||||||
|
# Non-root
|
||||||
|
RUN adduser -D -u 1000 animator
|
||||||
|
USER animator
|
||||||
|
|
||||||
|
ENV PYTHONUNBUFFERED=1 \
|
||||||
|
LOG_LEVEL=INFO
|
||||||
|
|
||||||
|
ENTRYPOINT ["/sbin/tini", "--"]
|
||||||
|
CMD ["python", "main.py"]
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
# Shelly RGBW2 Animator
|
||||||
|
|
||||||
|
Leichter Python-Dienst, der Animationen direkt am Shelly RGBW2 (Gen1) abspielt.
|
||||||
|
openHAB sendet nur noch den gewünschten Modus per MQTT – der Pi wird dadurch
|
||||||
|
deutlich entlastet.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Direkte HTTP-Ansteuerung des Shelly (kein openHAB-Event-Bus)
|
||||||
|
- Steuerung per MQTT (`shelly-animator/set`)
|
||||||
|
- Einfach neue Animationen hinzufügen
|
||||||
|
- Läuft als Docker-Container **oder** systemd-Service
|
||||||
|
|
||||||
|
## Schnellstart (Docker – empfohlen)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd shelly-animator
|
||||||
|
docker compose up -d --build
|
||||||
|
```
|
||||||
|
|
||||||
|
Logs:
|
||||||
|
```bash
|
||||||
|
docker logs -f shelly-animator
|
||||||
|
```
|
||||||
|
|
||||||
|
## Alternative: systemd (ohne Docker)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo mkdir -p /opt/shelly-animator
|
||||||
|
sudo cp -r app requirements.txt /opt/shelly-animator/
|
||||||
|
cd /opt/shelly-animator
|
||||||
|
python3 -m venv venv
|
||||||
|
./venv/bin/pip install -r requirements.txt
|
||||||
|
|
||||||
|
sudo cp systemd/shelly-animator.service /etc/systemd/system/
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl enable --now shelly-animator
|
||||||
|
```
|
||||||
|
|
||||||
|
## MQTT-Steuerung
|
||||||
|
|
||||||
|
| Topic | Richtung | Payload |
|
||||||
|
|--------------------------|----------|----------------------------------|
|
||||||
|
| `shelly-animator/set` | write | `chill` / `party` / `gaming` / `stop` |
|
||||||
|
| `shelly-animator/state` | read | aktueller Modus oder `off` |
|
||||||
|
|
||||||
|
Beispiele:
|
||||||
|
```bash
|
||||||
|
mosquitto_pub -h localhost -p 1884 -t shelly-animator/set -m "party"
|
||||||
|
mosquitto_pub -h localhost -p 1884 -t shelly-animator/set -m "stop"
|
||||||
|
```
|
||||||
|
|
||||||
|
## openHAB Anbindung
|
||||||
|
|
||||||
|
Ersetze die drei JS-Animation-Rules durch **eine** einfache Rule:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Rule: Status → Shelly Animator (MQTT)
|
||||||
|
const { items, actions } = require('openhab');
|
||||||
|
|
||||||
|
const status = items.getItem('Status').state.toString();
|
||||||
|
const mqtt = actions.get('mqtt', 'mqtt:broker:72a3b87ef9'); // ggf. anpassen
|
||||||
|
|
||||||
|
const map = {
|
||||||
|
'Chillmode': 'chill',
|
||||||
|
'Partymode': 'party',
|
||||||
|
'Gamingmode': 'gaming',
|
||||||
|
};
|
||||||
|
|
||||||
|
const anim = map[status] || 'stop';
|
||||||
|
mqtt.publishMQTT('shelly-animator/set', anim);
|
||||||
|
```
|
||||||
|
|
||||||
|
Trigger: `Status` Item State Change.
|
||||||
|
|
||||||
|
## Neue Animation hinzufügen
|
||||||
|
|
||||||
|
1. Datei anlegen: `app/animations/meine_anim.py`
|
||||||
|
|
||||||
|
```python
|
||||||
|
from .base import Animation
|
||||||
|
import colorsys
|
||||||
|
|
||||||
|
class MeineAnimation(Animation):
|
||||||
|
name = "meine"
|
||||||
|
interval = 0.15 # Sekunden zwischen Ticks
|
||||||
|
|
||||||
|
def on_start(self):
|
||||||
|
super().on_start()
|
||||||
|
self._t = 0
|
||||||
|
|
||||||
|
def tick(self):
|
||||||
|
self._t += 0.05
|
||||||
|
# ... Farbe berechnen ...
|
||||||
|
r, g, b = 255, 0, 128
|
||||||
|
self.shelly.set_color(r, g, b, gain=60)
|
||||||
|
```
|
||||||
|
|
||||||
|
2. In `app/animations/__init__.py` registrieren:
|
||||||
|
|
||||||
|
```python
|
||||||
|
from .meine_anim import MeineAnimation
|
||||||
|
|
||||||
|
REGISTRY = {
|
||||||
|
...
|
||||||
|
"meine": MeineAnimation,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Container neu bauen / Service neu starten.
|
||||||
|
|
||||||
|
## Umgebungsvariablen
|
||||||
|
|
||||||
|
| Variable | Default | Beschreibung |
|
||||||
|
|----------------|--------------------------|---------------------------|
|
||||||
|
| `SHELLY_HOST` | `192.168.178.151` | IP des Shelly |
|
||||||
|
| `SHELLY_USER` | `shelly@till.immers.ch` | Digest-Auth User |
|
||||||
|
| `SHELLY_PASS` | `...` | Digest-Auth Passwort |
|
||||||
|
| `MQTT_HOST` | `localhost` | MQTT Broker |
|
||||||
|
| `MQTT_PORT` | `1884` | MQTT Port |
|
||||||
|
| `MQTT_PREFIX` | `shelly-animator` | Topic-Prefix |
|
||||||
|
| `LOG_LEVEL` | `INFO` | DEBUG / INFO / WARNING |
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
services:
|
||||||
|
shelly-animator:
|
||||||
|
build: .
|
||||||
|
container_name: shelly-animator
|
||||||
|
restart: unless-stopped
|
||||||
|
network_mode: host # needed to reach Shelly + local MQTT on Pi
|
||||||
|
environment:
|
||||||
|
SHELLY_HOST: "192.168.178.151"
|
||||||
|
SHELLY_USER: "shelly@till.immers.ch"
|
||||||
|
SHELLY_PASS: "sh3llyTi33*"
|
||||||
|
MQTT_HOST: "localhost"
|
||||||
|
MQTT_PORT: "1884"
|
||||||
|
MQTT_PREFIX: "shelly-animator"
|
||||||
|
LOG_LEVEL: "INFO"
|
||||||
|
# If your MQTT broker requires auth, add:
|
||||||
|
# MQTT_USER: "..."
|
||||||
|
# MQTT_PASS: "..."
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
paho-mqtt==2.1.0
|
||||||
|
requests==2.32.3
|
||||||
|
PyYAML==6.0.2
|
||||||
Reference in new issue
Block a user