-
Autor
Unser 1. Projekt, welches wir Dank einiger Hilfe aus diesem Board erfolgreich umsetzen konnten.
Unsere Alte Klingel, welches nur ein unscheinbares Ding Dong hervorbringt, musste unbedingt vom
Bastelfreudigen Herrn des Hauses smart gemacht werden.
Also ran ans Werk. Was sollte umgesetzt werden?
- Klingelbeleuchtung über Sonnenstand schalten
- Ding Dong deaktivierbar
- Akustische Mitteilung
Also den Shelly Uni bestellt und angefangen. Einbau: Problemlos. Erfolg? Nicht wirklich.
Mit Hilfe von hier haben sich folgende Probleme Herauskristallisiert:
- Signal kam nur sporadisch an dem Digitalen Input des Uni an
- Bei angeklemmten Gong hat der Uni kein Signal mehr erkannt. Spannung zusammen gebrochen.
Verbaut war nur ein 8V Trafo mit einer Leistung von 1A. Hat nicht gereicht. Also neuen Trafo gekauft: 12V bei 2A. Hat ebenfalls nicht gereicht. Auch wenn ich unterschiedliche Meinungen gelesen haben kann ich versichern: 2A reichen nicht aus und führt zu einem Zusammenbruch der Spannung. Also habe ich auf Empfehlung einen Mean Well HDR-60-12 Trafo bestellt. Dieser liefert bei 12V kräftige 4,5A und DC, was dazu führt, das keine Diode am Input des Shelly Uni mehr von Nöten ist.
Danach war alles nur noch ein Kinderspiel. Über ein Potentialfreies Relais schalte ich nun meine Klingelbeleuchtung nachts ein. Gleichzeitig erkennt der uni nun wenn jemand klingelt und gibt entsprechend eine Mitteilung über App und Alexa ab.
Weiter Vorteil: Das Ding Dong ist dank 12V sogar etwas lauter geworden.
Punkt 2 ist ab heute auch realisiert. Mit Hilfe eines 1Kanal Optokopplers lässt sich nun der Gong über den Uni steuern. Sprich, ich kann einen Zeitraum definieren, indem es Klingeln darf und wann nicht. Aktuell ist das leider nur über 2 Scenen möglich, da Zeitliche Einstellungen über URL (noch) nicht möglich sind.
Update:
Heute wurde es endlich mal Zeit "mit der Zeit" zu gehen. Da der Uni doch ständig die Verbindung verloren hat, habe ich ihn kurzer Hand durch den Shelly Plus Uni ersetzt.
Austausch lief problemlos.
Da Punkt zwei doch nicht wirklich realisierbar war, ist dies nun problemlos möglich. Über ein Script wird der Taster Eingang deaktiviert. Mit Hilfe von Forum und KI haben wir auch das Script so angelegt, dass eine zeitliche Steuerung möglich ist und parallel über einen alten Shelly Button 1 kann die Klingel auch manuell eingeschaltet werden.
Edit: Schema korrigiert
Skript:
// Script 1 – Klingelsteuerung mit Zeitfenstern + Button-Override + Push-Szenen
// ---------- KONFIG: CLOUD & SZENEN ----------
// HIER anpassen:
const CLOUD = {
server: 'https://shelly-X-eu.shelly.cloud', // xx & Region anpassen
auth_key: 'x-x-x',
};
// Push-Szenen: 0 = AUS, 1 = EIN
const Scene = [
{ id: 1770235321840, msg: "input disabled" }, // AUS
{ id: 1770235253976, msg: "input enabled" }, // EIN
];
let SceneEn = true;
// ---------- ZEITFENSTER ----------
// Minuten seit Mitternacht
// Fenster 1: 12:00–15:00
// Fenster 2: 20:00–24:00 + 00:00–06:00
let TIME_WINDOWS = [
[12 * 60, 15 * 60], // 12:00–15:00
[20 * 60, 06 * 60], // 20:00–24:00
[0, 6 * 60] // 00:00–06:00
];
function getMinutes() {
let d = new Date();
return d.getHours() * 60 + d.getMinutes();
}
function isInTimeWindow() {
let m = getMinutes();
for (let i = 0; i < TIME_WINDOWS.length; i++) {
let start = TIME_WINDOWS[i][0];
let end = TIME_WINDOWS[i][1];
if (m >= start && m < end) return true;
}
return false;
}
// ---------- INPUT-STEUERUNG ----------
function toggleInpEn(id) {
Shelly.call("Input.GetConfig", { id: id },
function (res, errc, errm, id) {
if (errc) { console.log(errc, errm); return; }
Shelly.call("Input.SetConfig", { id: id, config: { enable: !res.enable } });
}, id
);
}
function enableInput() {
Shelly.call("Input.SetConfig", { id: 0, config: { enable: true } });
}
function disableInput() {
Shelly.call("Input.SetConfig", { id: 0, config: { enable: false } });
}
// ---------- PUSH-SZENEN AUSLÖSEN ----------
function sceneTrigger(i) {
if (!Scene[i]) return;
let url = CLOUD.server +
'/scene/manual_run&auth_key=' +
CLOUD.auth_key + '&id=' + Scene[i].id;
Shelly.call('HTTP.GET', { url: url },
function (resp, err, msg) {
if (err !== 0) {
print('Szene error: ', err, msg);
return;
}
let ok = JSON.parse(resp.body).isok;
print(Scene[i].msg + ", Szene wurde " + (ok ? "" : "nicht ") + "ausgelöst");
}
);
}
// ---------- EVENT-HANDLER: INPUT-ÄNDERUNGEN ----------
function inpEn(ev) {
if (ev.name !== "input") return;
if (ev.info.event !== "config_changed" || !SceneEn) return;
Shelly.call("Input.GetConfig", { id: ev.id },
function (res, errc, errm) {
if (errc) { console.log(errc, errm); return; }
sceneTrigger(res.enable ? 1 : 0);
}
);
}
Shelly.addEventHandler(inpEn);
// ---------- TIMER: ZEITFENSTER-STEUERUNG ----------
function checkTime() {
let inWindow = isInTimeWindow();
Shelly.call("Input.GetConfig", { id: 0 }, function (st) {
let enabled = st.enable;
if (inWindow && enabled) {
disableInput();
} else if (!inWindow && !enabled) {
enableInput();
}
});
}
// alle 60 Sekunden prüfen
Timer.set(60 * 1000, true, checkTime);
// einmal kurz nach Start prüfen
Timer.set(3000, false, checkTime);
print("Script 1 gestartet");
Alles anzeigen