Die Variante mit den Uhrzeiten klappt. Hab es letzte Nacht bestätigen können. Hab die Zeit jetzt auf 5 Min. runter gesetzt und belasse den Zeitraum von 22 Uhr bis 5 Uhr morgens. Das entspricht in etwa Sonnenaufgang/untergang zur Sommersonnenwende (längster Tag). Das passt dann soweit. Danke nochmal an alle, ihr seit Super!
Beiträge von Wvalley
-
-
Das wäre die angepasste Variante von ChatGPT. Hab den Timer auf 15 Min gesetzt. Hab das jetzt aber noch nicht gecheckt ob es angenommen wird .... Vielen Dank euch an euch alle, super wie hier geholfen wird!
Code
Alles anzeigenlet THRESHOLD_WATT = 5; let DURATION_MS = 15 * 60 * 1000; let startTime = null; let sunriseTime = null; let sunsetTime = null; function fetchSunTimes() { Shelly.call( "HTTP.GET", { url: "https://api.open-meteo.com/v1/forecast?latitude=51.297716&longitude=7.234480&daily=sunrise,sunset&timezone=Europe%2FBerlin&forecast_days=1" }, function (result, error_code, error_message) { if (error_code === 0) { let response = JSON.parse(result.body); sunriseTime = response.daily.sunrise[0].split("T")[1]; sunsetTime = response.daily.sunset[0].split("T")[1]; } } ); } fetchSunTimes(); Timer.set(12 * 60 * 60 * 1000, true, fetchSunTimes); Timer.set(60 * 1000, true, function () { if (sunriseTime === null || sunsetTime === null) return; let now = new Date(); let currentTime = now.getHours() * 60 + now.getMinutes(); let sunriseParts = sunriseTime.split(":"); let sunsetParts = sunsetTime.split(":"); let sunriseMinutes = parseInt(sunriseParts[0]) * 60 + parseInt(sunriseParts[1]); let sunsetMinutes = parseInt(sunsetParts[0]) * 60 + parseInt(sunsetParts[1]); if (currentTime >= sunsetMinutes || currentTime < sunriseMinutes) { let power = Shelly.getComponentStatus("switch:0").apower; if (power > THRESHOLD_WATT) { if (startTime === null) { startTime = Date.now(); } else if ((Date.now() - startTime) >= DURATION_MS) { Shelly.call("Switch.Set", { id: 0, on: false }); startTime = null; } } else { startTime = null; } } else { startTime = null; } });
-
-
Vielen Dank nochmal. Es scheint aber jetzt mit der letzten Variante und den Uhrzeiten zu laufen. Mal sehen ob es wirklich auch so heute Nacht durchläuft. Ewig her das ich mich mal mit Programmierzeilen beschäftigt hab ... ein bisschen QBasic in den 90ern und n bisschen html in den frühen 2000ern ... das wars ...
-
Vielen Dank für die schnelle Hilfe. Ich lasse dann einfach das ganze Sonnenauf/untergang Thema weg und er soll das skript nur zwischen 22 Uhr abends bis 5 Uhr morgens ausführen. Mal sehen ob das so funktioniert.
Code
Alles anzeigenlet THRESHOLD_WATT = 5; let DURATION_MS = 20 * 60 * 1000; let startTime = null; Timer.set(60 * 1000, true, function () { let hour = (new Date()).getHours(); if (hour >= 22 || hour < 5) { let power = Shelly.getComponentStatus("switch:0").apower; if (power > THRESHOLD_WATT) { if (startTime === null) { startTime = Date.now(); } else if ((Date.now() - startTime) >= DURATION_MS) { Shelly.call("Switch.Set", { id: 0, on: false }); startTime = null; } } else { startTime = null; } } else { startTime = null; } });
-
Hallo,
bin neu und kenne mich leider mit mit Java oder Programmierung gar nicht aus. Ich hatte ChatGPT ein Skript erstellen lassen das von Sonnenuntergang bis Sonnenaufgang bei mehr als 5 Watt Verbrauch nach 20 Min abschalten soll. Ist ein Shelly Outdoor Plug mit aktueller Firmware. Per Zeitplan (unabhängig vom Skript) soll 15 Min vor Sonnenaufgang wieder eingeschaltet werden. Hintergrund ist das ich den Netzbezug meiner Balkonkraftwerkspeichers nachts kappen will (Anker Solix Solarbank 2 E1600 AC). Dieser zieht halt im Leerlauf (Speicher leer) knapp 15 Watt und im Geräteschlaf immer noch knapp 9 Watt. Da hab ich keinen Bock drauf. Wenn der Speicher sich ggf. nachts leert und solange negativer Verbrauch da ist und Strom eingespeist wird ist alles gut aber wenn dieser nachts anfängt Strom zu verbrauchen zwinge ich den dem Skript das aus ihrer eigenen internen Reserve zu machen.
Leider läuft das Skript einfach nicht. Ich klicke auf den Play Botton und nach kurzer zeit ist der wieder aktivierbar. hab es zig mal versucht. hier das Skript
Code
Alles anzeigenlet wattThreshold = 5; let durationThreshold = 20 * 60; let checkInterval = 30; let highPowerStart = null; let timer = null; function isNight() { let now = new Date(); let sunrise = Shelly.getComponentStatus("sys").sunrise; let sunset = Shelly.getComponentStatus("sys").sunset; return now < new Date(sunrise) || now > new Date(sunset); } function checkPower() { Shelly.call("EM.GetStatus", { id: 0 }, function (res) { let power = res.apower; if (isNight()) { if (power > wattThreshold) { if (highPowerStart === null) { highPowerStart = Timer.now(); } else if ((Timer.now() - highPowerStart) > durationThreshold) { Shelly.call("Switch.Set", { id: 0, on: false }); highPowerStart = null; } } else { highPowerStart = null; } } }); } if (timer !== null) { Timer.clear(timer); } timer = Timer.set(checkInterval * 1000, true, checkPower);
Kann mir da jemand Helfen?
vielen Dank