-
Autor
Hallo zusammen
Ich habe einen Lüfter welcher mit der Heizung aus- und eingeschalten wird. Nun möchte ich einem Benutzer ermöglichen, dass er den Lüfter auf Dauerbetrieb schalten kann. Mein Shelly ist Passwortgeschützt, das sollte auch so bleiben, leider kann ich mit HTTPServer.registerEndpoint nicht einstellen, dass die Seite ohne Anmeldung aufgerufen werden kann. Habt Ihr mir einen Tipp?
HTML
let newEndpoint = HTTPServer.registerEndpoint,
localIP = Shelly.getComponentStatus('wifi').sta_ip,
shellyIP = "http://" + localIP,
lockMode = false, // Sperrt manuelles Ausschalten
htmlBody = '<!DOCTYPE html>' +
'<html>' +
'<head>' +
'<title>Dauerbetrieb</title>' +
'<style>' +
'body { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100vh; background-color: black; }' +
'.circle { width: 200px; height: 200px; border-radius: 50%; background-color: red; display: flex; justify-content: center; align-items: center; color: white; font-size: 24px; font-weight: bold; }' +
'.button { margin-top: 20px; padding: 15px 30px; font-size: 20px; background-color: red; color: white; border: none; border-radius: 10px; cursor: pointer; }' +
'</style>' +
'</head>' +
'<body>' +
'<div class="circle">AUS</div>' +
'<button class="button" onclick="toggleShelly()">Schalten</button>' +
'<script>' +
'function toggleShelly() {' +
' fetch("' + shellyIP + '/relay/0?turn=toggle")' +
' .then(response => response.json())' +
' .then(data => {' +
' let circle = document.querySelector(".circle");' +
' if (data.ison) {' +
' circle.style.backgroundColor = "green";' +
' circle.innerText = "EIN";' +
' fetch("' + shellyIP + '/script/0?code=lockMode=true");' + // Lock aktivieren
' } else {' +
' circle.style.backgroundColor = "red";' +
' circle.innerText = "AUS";' +
' fetch("' + shellyIP + '/script/0?code=lockMode=false");' + // Lock deaktivieren
' }' +
' })' +
' .catch(error => console.error("Fehler:", error));' +
'}' +
'</script>' +
'</body>' +
'</html>';
function Dauerbetrieb(request, response) {
print('Dauerbetrieb-Seite geöffnet');
response.code = 200;
response.headers = [["Content-Type", "text/html"]];
response.body = htmlBody;
response.send();
}
// Ignoriert externe "AUS"-Befehle, wenn Lock aktiv ist
function FilterRequest(request, response) {
let params = request.query;
if (params.turn === "off" && lockMode) {
print("Ausschalt-Befehl ignoriert (Lock aktiv)");
response.code = 403;
response.body = "Schalten gesperrt!";
response.send();
return;
}
print("Weiterleitung an das Relais...");
Shelly.call("Switch.Set", { id: 0, on: params.turn === "on" }, null);
response.code = 200;
response.body = "OK";
response.send();
}
// Automatischer Ausschalt-Timer um 18:00 Uhr
function AutoOff() {
let now = new Date();
let hours = now.getHours();
let minutes = now.getMinutes();
if (hours === 18 && minutes === 0) { // 18:00 Uhr
print("Automatisches Ausschalten um 18:00 Uhr");
lockMode = false; // Lock aufheben
Shelly.call("Switch.Set", { id: 0, on: false }, null);
}
}
// Timer alle 60 Sekunden ausführen
Timer.set(60000, true, AutoOff);
// Endpunkte registrieren (auth: false entfernt die Passwortabfrage!)
HTTPServer.registerEndpoint("Dauerbetrieb", Dauerbetrieb, { auth: false }); // Authentifizierung für diesen Endpunkt deaktiviert
print('Dauerbetrieb-Seite erreichbar unter: http://' + localIP + '/Dauerbetrieb');
print('Filter aktiv für: http://' + localIP + newEndpoint('relay/0', FilterRequest));
Alles anzeigen