Beschreibung des Shelly Plus Uni Skripts
Zweck des Skripts
Das Skript dient zur Überwachung des digitalen Eingangs IN1 an einem Shelly Plus Uni. Es analysiert über einen bestimmten Zeitraum, ob der Eingang aktiv ist (z. B. geschlossen) oder nicht. Falls die Bedingung erfüllt ist (mindestens 75 % der Messwerte sind „true“), wird ein Relais für eine definierte Zeit eingeschaltet.
Anwendungsfall
Das Skript eignet sich z. B. für die Steuerung einer Heizungssperre in Abhängigkeit von der Leistung eines Wechselrichters.
- Sobald der Wechselrichter eine bestimmte Leistung überschreitet, aktiviert er den potenzialfreien Kontakt, wodurch IN1 am Shelly ein Signal erhält.
- Falls das Signal über mindestens 75 % der letzten 10 Minuten aktiv bleibt, wird das Relais eingeschaltet (z. B. um eine Heizung zu sperren).
- Wenn die Leistung wieder unter den Grenzwert fällt und die Bedingung nicht mehr erfüllt ist, bleibt das Relais ausgeschaltet.
Funktionalität im Detail
1️⃣ Initialisierung der Konfiguration (CONFIG)
Die Konfigurationswerte werden in einem CONFIG-Objekt definiert:
- checkInterval: Zeitintervall für die Abfrage von IN1 (in Sekunden). Standard: 10 Sekunden.
- maxEntries: Maximale Anzahl gespeicherter Werte (Standard: 60 Einträge → 10 Minuten Verlauf).
- evaluationInterval: Intervall für die Auswertung (Standard: 30 Überprüfungen → 5 Minuten).
- threshold: Prozentuale Grenze für das Aktivieren des Relais (Standard: 75 % müssen „true“ sein).
- relayIP: IP-Adresse des Geräts, das das Relais steuert (z. B. localhost für Shelly selbst).
- relayNR: Nummer des Relais, das gesteuert werden soll (1 für Relais 1).
- inputID: Nummer des Eingangs (1 für IN1).
- debug: Falls true, werden Debug-Nachrichten in der Konsole ausgegeben.
2️⃣ Speicherung der letzten 60 Werte (SETUP.inputHistory)
Ein Ringpuffer (FIFO-Speicher) speichert die letzten 60 Abfragen von IN1 (entspricht 10 Minuten).
- Falls die maximale Anzahl erreicht ist, wird der älteste Wert überschrieben.
- Das sorgt dafür, dass immer ein gleitender Verlauf ausgewertet wird.
3️⃣ Überprüfung von IN1 (checkInputLoop)
Ein Timer wird gestartet, um alle 10 Sekunden den Status von IN1 abzufragen:
Das Skript sendet eine HTTP-GET-Anfrage an:
Code
- Falls der Eingang geschlossen (true) oder offen (false) ist, wird der Wert gespeichert.
- Debugging-Info: Es wird in der Konsole ausgegeben, ob IN1 gerade aktiv oder inaktiv ist.
4️⃣ Speicherung der Werte (sevedData)
Jede neue Messung wird im Ringpuffer gespeichert.
- Falls 60 Einträge erreicht sind, wird der älteste überschrieben.
- Nach jeder Speicherung wird überprüft, ob eine 5-Minuten-Analyse fällig ist.
5️⃣ Analyse der letzten 5 Minuten (evaluateHistory)
Alle 5 Minuten wird überprüft, ob mindestens 75 % der letzten 60 Werte „true“ waren.
- Falls ≥ 75 % → Relais EIN
- Falls < 75 % → Relais AUS
💡 Debugging-Info:
- Die Konsole gibt aus, wie hoch der Anteil der „true“-Werte ist (z. B. 82,3 %).
- Falls der Grenzwert überschritten wurde, wird das Relais eingeschaltet.
- Falls nicht, bleibt das Relais ausgeschaltet.
Das Einschalten erfolgt über einen HTTP-Call:
Code
(Das Relais bleibt 301 Sekunden an, dann wird erneut geprüft.)
Falls die Bedingung nicht erfüllt ist, bleibt das Relais aus.
Zusätzliche Features
✅ Fehlertoleranz: Falls die Shelly-API nicht erreichbar ist, stürzt das Skript nicht ab, sondern gibt eine Fehlermeldung aus.
✅ Keine schnellen Schaltvorgänge: Dank des 10-Minuten-Speichers wird verhindert, dass das Relais durch Sonnen-Wolken-Schwankungen ständig an/aus geht.
✅ Energieoptimierung: Das Skript prüft nur alle 10 Sekunden statt in Dauerschleife