Beiträge von Leonardo.zwei
VPN/Proxy erkannt
Es scheint, dass Sie einen VPN- oder Proxy-Dienst verwenden. Bitte beachten Sie, dass die Nutzung eines solchen Dienstes die Funktionalität dieser Webseite einschränken kann.
-
-
Hi, eine interessante Anwendung. Sowas ähnliche habe ich auch vor, nur mein Shelly-Zähler ist noch in der Verpackung

Daher hier ein ungetester Entwurf ... gerade die Werte der API konnte ich nicht genau aus der Dokumentation heraus ziehen.
Code
Alles anzeigen// Konfiguration let Regelzeit = 10000; // z.B. relekt alle 10 Sekunden nach const REGLER_URL = "http://<ip>/rpc/"; // interne globale Variablen let LetzteLast = 0; // aktuelle Heizlast // Reglerlogik function updatePower(P_ist) { let Last = 0; let url = ""; // // die aktuelle Heizlast abrechnen um die teoretische Einspeiung zu berechnen // let P_netto = P_ist - LetzteLast; if (p_netto > 0) { // Verbrauch ist zu hoch ==> Heizstab aus Last = 0; url = REGLER_URL+"Light.Set?id=0&on=false"; } else { Last = -P_netto; Last = Math.min(Math.max(0, Last), Last_Max); let Stellglied = Last * 10 / Last_Max; // evtl. runden mit Math.round() je nachdem was der Dimmer für Werte erwartet url = REGLER_URL+"Light.Set?id=0&on=true&brightness="+Stellglied; } // Nur ein Steuerbefehl absetzen, wenn sich wirklich was geändert hat if (LetzteLast != Last) { print("sende:"+url ); Shelly.call("HTTP.GET", { url: url }, function (res, error_code, error_msg, ud) { if (error_code == 0) { print("Regler ist angepasst."); } else { print(error_code+" "+error_msg); } }, null); } LetzteLast = Last; } // Einbindung in das System // UpdatePower wird jedesmal getriggert, wenn sich die Gesamtleistung ändert Shelly.addStatusHandler( function (event, ud) { if (event.component=="em:0") { if (event.delta.hasOwnProperty("total_act_power")) { updatePower(event.delta.total_act_power); } } } );wie gesagt: ungetestet, da ich meine Hardware noch in am Netz habe.
Grüße Leonardo
P.s.: Die Regelung geht davon aus dass die Ansteuerung der Last Liniar ist. Falls das nicht so ist neigt diese Reglung zum Schwingen! Da währe dann eine PID-Regelung besser.
-
Hi,
Wenn es sich nicht mit Aktions realisieren lässt würde ich ein Javascript dazu programmieren:
vieleicht hilft dir das weiter:
Code
Alles anzeigen// Konfiguratinsteil const URL_LUEFTER = "http://<ip>/rpc/"; let Nachlaufzeit = 30; // in Sekunden let Vorlaufzeit = 180; // in Sekunden // Zeitraum in der die Nachlaufschaltung aktiv ist let Startzeit = 8; // Volle Stunden let Endzeit = 21; // Volle Stunden /* * Hinweis: * - in diesem Skript wird davon aus gegangen dass es auf dem Shelly für das Licht läuft * - es ist der Relais-Kanal 0 hart kodiert... das sollte für die meisten Fälle reichen * - Der Shelly für den Lüfter muss eine Feste IP haben, die im Konfigurationsteil eingetragen wird * * Ansonsten ist diese Skript so wie es ist und ohne Gewähr. * Insbesondere ist mein Setup im allgemeinen nicht dein Setup. */ // Interne globale Variablen let MyTimer = null; let NachlaufAktiv = false; // Routine, die gestartet ird wenn das Licht eingeschaltet wird function handleLichtAn() { MyTimer = Timer.set(Vorlaufzeit*1000, false, function (ud) { let urlCmd = URL_LUEFTER + "switch.set?id=0&on=true&toggle_after=3600"; print("sende:"+urlCmd); NachlaufAktiv = true; Shelly.call("HTTP.GET", { url: urlCmd }, function (res, error_code, error_msg, ud) { if (error_code == 0) { NachlaufAktiv = true; print("Lüfter ist gestartet"); } else { print(error_code+" "+error_msg); } }, null); }, ); }; // Routine, die gestartet ird wenn das Licht ausgeschaltet wird function handleListAus() { // der Timer wird nur für die Einschaltverzögerung gebraucht // daher kann er hier wieder gelöscht werden if (MyTimer) { Timer.clear(MyTimer); MyTimer = null; } // Die Nachlaufzeit wird nur dann aktiviert, wenn die Vorlaufzeit abgelaufen war. if (NachlaufAktiv) { let urlCmd = URL_LUEFTER + "switch.set?id=0&on=true&toggle_after="+Nachlaufzeit; print("sende:"+urlCmd); Shelly.call("HTTP.GET", { url: urlCmd }, function (res, error_code, error_msg, ud) { if (error_code == 0) { print("Nachlaufzeit des Lüfters erfolgreich gesetzt"); } else { print(error_code+" "+error_msg); }; }, null); NachlaufAktiv = false; }; } // Einbindung in die Statusbenachrichtigungen Shelly.addStatusHandler( function (event, ud) { if (event.component=="switch:0") { if (event.delta.output === true) { NachlaufAktiv = false; // Hier nochmal setzen um bei gewissen Laufzeitbedingungen den Lüfter nicht zu triggern let jetzt = new Date(); let stunde = jetzt.getHours(); if ((stunde >= Startzeit) && (stunde < Endzeit)) { print("Licht ist an"); handleLichtAn(); } else { // soll der Lüfer bei Nacht komplett aus bleiben ? } } else if (event.delta.output === false) { print("Licht ist aus"); handleListAus(); } } } );Die IP muss noch angepasst werden... dsanach sollte es so laufen wie du oben beschrieben hast...
Leonardo
-
-
Hallo Forum,
Ich habe eine Lichtschaltung mit einem Shelly umgesetzt, bei dem das Licht in abhängigkeit von 2 Bewegungsmeldern und einem Endlagentaster realisiert wird. Die gesamte Logik ist in Javascript geschrieben ind auf den Selly1Gen4 abgelegt.
Es fehlt noch die Funktion, dass das Licht Tagsüber nicht angeht. Kann ich vom Javascript aus auf die Werte für sunset und sunrise zugreifen ?
währe Toll wenn jemand mir hier in den Sattel helfen könnte

Leonardo