Hier nun die Schaltlogik für den PRO2PM
Es gibt 2 Anschlüssel
Das Script ruft den Componet des PRO3EM ab
und prüft mit einer Kette von “If” Abfragen alle 15min ob einer der beiden Lasten zu oder aufgeschaltet werden soll.
Ziel dabei ist es nur den Überschuss abzufangen aber den Kompressor zu schonen.
Dabei wird davon ausgegagen, dass der erste Ausgang weniger Last hat als der zweite.
Nach jedem Einschaltvorgang wird die Last neu bestimmt.
// Konfiguration
let V = {
// IP des Shelly Pro3EM
Pro3EM: "84.84.84.232",
// Ab welchem Überschuss soll die Anschaltlogik gestartet werden? (Den kleinensten Wert eintragen. Entweder P_0 oder P_1 - P_0)
MIN_ON: -5,
// Vergleichwert für die Abschaltlogik
MIN_OFF: 0,
// Ab welchem Bezug soll die Abschaltlogik gestartet werden
MAX_OFF: 100,
// Leistungs_Durschnitt übermittelt vom PRO3EM
P_D: 0,
// Leistung am ersten Ausgang: Start Wert 5
P_0: 5,
// Leistung am zweiten Ausgang: Start Wert 10
P_1: 10,
// 5Sekunden warten = 5000ms
WAIT: 5000,
// Alles 15 Minuten Loopen = 900000ms
LOOP: 900000,
// Status switch 0 ersten Ausgang:
SW_0: false,
// Status switch 1 zweiten Ausgang
SW_1: false
};
//###################################################################
// Fragt die Components TYP Number, id 200 des Shelly Pro 3EM mit der hinter V.Pro3EM hinterlegten IP
function DREIemABFRAGE(){
Shelly.call(
"HTTP.GET",
{ url: "http://" + V.Pro3EM + "/rpc/Number.GetStatus?id=200"},
function(result, error_code, error_message) {
if (error_code === 0 && result !== null) {
let data = JSON.parse(result.body);
V.P_D = data.value;
print("Aktuelle Leistung:", V.P_D);
Timer.set(V.WAIT, false, schalten);
} else {
print("Fehler beim Abruf:", error_message);
} //if (error_code === 0 && result !== null)
} //function(result, error_code, error_message)
); //Shelly.call
}// function DREIemABFRAGE
//###################################################################
function schalten(){
//Status Ausgang 1
V.SW_0 = Shelly.getComponentStatus("switch:0").output;
console.log("SW_0:", V.SW_0);
//Status Ausgang 2
V.SW_1 = Shelly.getComponentStatus("switch:1").output;
console.log("SW_1:", V.SW_1);
// Haben wir einen Überschuss?
if (V.P_D <= V.MIN_ON){
// Läuft das erste Gerät schon?
if (V.SW_0 === true){
//Läuft das zweite Gerät schon?
if (V.SW_1 === true){
// Wir haben überschuss aber nichts mehr zum zuschalten, fertig
return;
} else {
// Das zweite Gerät läuft noch nicht haben wir genug Überschuss um es zu zu schalten
if (V.P_D + V.P_1 <= V.MIN_ON){
Shelly.call("Switch.Set", { id: 1, on: true });
Timer.set(V.WAIT,false,SET_P_1);
return; //Zugeschaltet und fertig
} else {
// Bei mir ist die zweite Leistung größer als die erste also schau ich jetzt ob ich sie STATT der ersten einschalten kann ohne in BEZUG zu kommen
if (V.P_D + V.P_1 - V.P_0 <= V.MIN_ON){
Shelly.call("Switch.Set", { id: 0, on: false });
Shelly.call("Switch.Set", { id: 1, on: true });
Timer.set(V.WAIT,false,SET_P_1);
return; // erste aus, zweite an, fertig
} else {
return; //wir können die Last werder tauschen noch Zuschalten, fertig
} //if (V.P_D + V.P_1 - V.P_0 <= V.MIN_ON)
} // if (V.P_D + V.P_1 <= V.MIN_ON)
} // if (V.SW_1 === true)
} else {
// Ist die Last vom ersten Ausgang kleiner aus der Überschuss?
if (V.P_D + V.P_0 <= V.MIN_ON){
// Ist der Zweite Ausgang AN?
if (V.SW_1 === true){
Shelly.call("Switch.Set", { id: 0, on: true });
Timer.set(V.WAIT,false,SET_P_0);
return; // Schalte den ersten Ausgang ein, fertig
} else {
// Ist die Last vom zweiten Ausgang kleiner aus der Überschuss?
if (V.P_D + V.P_1 <= V.MIN_ON){
Shelly.call("Switch.Set", { id: 1, on: true });
Timer.set(V.WAIT,false,SET_P_1);
return; // Schalte den zweiten Ausgang ein, fertig
} else {
Shelly.call("Switch.Set", { id: 0, on: true });
Timer.set(V.WAIT,false,SET_P_0);
return; // Schalten den ersten Ausgang ein, fertig
} //if (V.P_D + V.P_1 <= V.MIN_ON)
} //if (V.SW_1 === true)
} else {
return; // Die Last vom ersten Ausgang ist größer als der Überschuss, mach nix, fertig
} //if (V.P_D + V.P_0 <= V.MIN_ON)
} // if (V.SW_0 === true)
} else {
// Wir haben einen Bezug definiert der beidem wir Anfangen Lasten abzuschalten
if (V.P_D >= V.MAX_OFF){
// Ist der erste Ausgang geschaltet?
if (V.SW_0 === true){
// Ist der zweite Ausgang geschaltet?
if (V.SW_1 === true){
// Wenn wir nur Ausgang 1 ausschalten haben wir immer noch Netzbezug?
if (V.P_D - V.P_0 >= V.MIN_OFF){
// Wenn wir nur Ausgang 2 ausschalten haben wir immer noch Netzbezug?
if (V.P_D - V.P_1 >= V.MIN_OFF){
Shelly.call("Switch.Set", { id: 0, on: false });
Shelly.call("Switch.Set", { id: 1, on: false });
return; // Da Ausgang 2 bei mir viel mehr Leistung hat als 1 schaltet ich an dieser stelle bei aus um aus dem Netzbezug zu kommen, fertig
} else{
Shelly.call("Switch.Set", { id: 1, on: false });
return; //Schalte Ausgang 2 aus, fertig
} //if (V.P_D - V.P_1 >= V.MIN_OFF)
} else {
Shelly.call("Switch.Set", { id: 0, on: false });
return; //Schalte Ausgang 1 aus,fertig
} //if (V.P_D - V.P_0 >= V.MIN_OFF)
}else {
Shelly.call("Switch.Set", { id: 0, on: false });
return; // Da Ausgang 2 schon aus ist, schalte Ausgang 1 aus , ferig
} //if (V.SW_1 === true)
} else {
//Ausgang 1 ist aus, trotzdem gibt es noch netzbezug ist Ausgang 2 geschaltet?
if (V.SW_1 === true){
Shelly.call("Switch.Set", { id: 1, on: false });
return; //Schalte Ausgang 2 aus, fertig
} else {
return;// Beide Ausgänge sind schon aus es gibt nichts mehr zum ausschalten, fertig
} //if (V.SW_1 === true)
} //if (V.SW_0 === true)
} //if (V.P_D >= V.MAX_OFF)
} //if (V.P_D <= V.MIN_ON)
} // function schalten
//###################################################################
// Abfrage Leitsung von Ausgang 1
function SET_P_0(){
let stat = Shelly.getComponentStatus("switch:0");
if (stat) V.P_0 = stat.apower;
console.log("P_0:", V.P_0,"Watt")
}
//###################################################################
// Abfrage Leistung von Ausgang 2
function SET_P_1(){
let stat = Shelly.getComponentStatus("switch:1");
if (stat) V.P_1 = stat.apower;
console.log("P_1:", V.P_1,"Watt")
}
//###################################################################
DREIemABFRAGE(); // Sofortiger Start beim Speichern/Reboot
Timer.set(V.LOOP, true, DREIemABFRAGE); // Dann in schleife alle X Minuten je nach der "LOOP" definierung
Bis jetzt siehts gut aus.
Danke an alle.
Und für die, die das hier lesen und denken “nett, passt für mich aber nicht”.
Ich hatte auch keine Ahnung von Shelly script.
Das schreiben hat mit Gemini ca 5. Stunden gedauert.
Beste Grüße