NEWS
Temperatur Hysterese bei If Verschachtelung
-
Hallo zusammen, ich baue mein Skript zur Zeit um und will meine Akku Ladesteuerung in Abhängigkeit der Puffertempereratur (Heizstab Ohmpilot) steuern. Das ganze ist Prognosebasierend über den PV Forecast.
Ich habe mich schon etwas versucht,
es sollen 5 Grad Schalthysterese zwischen den else if Bedingungen sein.
Aktuell ist es so, wenn der Puffer z.B. 52 Grad hat, wäre keine Bedingung erfüllt,
wie löse ich das am besten?if (FC >= 80) { // netzdienlich // 5 ,6, 7, 8, 9,10,11, 12, 13, 14, 15, 16 17, 18 Uhr if (SOC < 25) { Laden_Mit = [0, 0, 0, 6, 6, 6, 6, 12, 12, 24, 24, 30, 36, 100]; } else { Laden_Mit = [0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 30, 36, 100]; } } else if (FC >=40 && PufferTemp >55) { // verteilen Laden_Mit = [0, 0, 0, 6, 12, 12, 12, 12, 12, 18, 18, 24, 36, 100]; } else if (FC >=40 && PufferTemp <50) { Laden_Mit = [0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 30, 36, 100]; } else if (FC <40 && PufferTemp >55) { // Hamstern Laden_Mit = [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100]; } else if (FC <40 && PufferTemp <50){ // Pufferspeicher laden Laden_Mit = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; }
Danke für die Hilfe!
-
@diamand2k22 said in Temperatur Hysterese bei If Verschachtelung:
if (SOC < 25) {
Laden_Mit = [0, 0, 0, 6, 6, 6, 6, 12, 12, 24, 24, 30, 36, 100];
} else {
Laden_Mit = [0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 30, 36, 100];
}nach diesem <else> ist Ende, die weiter <else if> werden nicht mehr bearbeitet.
-
Aber nur wenn obere IF Bedingung FC >= 80 erfüllt ist oder?
-
als erstes ist es dringend notwendig richtig einzurücken, so das solche verschachtelten Bedingungen auch lesbar sind.
anstatt der kombinierten Prüfungen, würde ich die einzeln aufschreiben ungefähr wie folgtif (FC >= 80) { if (SOC < 25) { } else { } } if (FC >= 40 && FC <80) { if (Puffertemp > 55) { } if (Puffertemp < 55) { } } if (FC <40) { if (Puffertemp > 55) { } if (Puffertemp < 55) { } }
-
let istAn = getState('heizung oder was auch immer').val if (FC >= 80) { // netzdienlich // 5 ,6, 7, 8, 9,10,11, 12, 13, 14, 15, 16 17, 18 Uhr if (SOC < 25) { Laden_Mit = [0, 0, 0, 6, 6, 6, 6, 12, 12, 24, 24, 30, 36, 100]; } else {// hier ist in deinem Skript ein Fehler die else greift immer Laden_Mit = [0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 30, 36, 100]; } // hier hab ich das else deshalb entfernt if (FC >= 40 && PufferTemp > (istAn ? 50 : 55) ) { istAn = true // verteilen Laden_Mit = [0, 0, 0, 6, 12, 12, 12, 12, 12, 18, 18, 24, 36, 100]; } else if (FC >= 40 && PufferTemp < (!istAn ? 50 : 55)) { istAn = false Laden_Mit = [0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 30, 36, 100]; } else if (FC < 40 && PufferTemp > (istAn ? 50 : 55)) { istAn = true // Hamstern Laden_Mit = [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100]; } else if (FC < 40 && PufferTemp < (!istAn ? 50 : 55)) { // Pufferspeicher laden istAn = false Laden_Mit = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; } } // hier dann heizung schalten oder datenpunkt setzten der beim nächsten durchlauf gelesen wird.
Ich verstehe es aber nicht ganz. Was schaltet da die Heizung an?
-
@ticaki
ist ja eigentlich egal, was es da schaltet.
das Problem hier ist, das vor lauter Bedingungen die Übersicht verloren gegangen ist, so das das schlecht wartbar ist und evtl. Fehler, die nicht unbedingt Laufzeitfehler sein müssen, das erwartete Ergebnis verhindern. -
-
@ticaki said in Temperatur Hysterese bei If Verschachtelung:
let istAn = getState('heizung oder was auch immer').val if (FC >= 80) { // netzdienlich // 5 ,6, 7, 8, 9,10,11, 12, 13, 14, 15, 16 17, 18 Uhr if (SOC < 25) { Laden_Mit = [0, 0, 0, 6, 6, 6, 6, 12, 12, 24, 24, 30, 36, 100]; } else {// hier ist in deinem Skript ein Fehler die else greift immer Laden_Mit = [0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 30, 36, 100]; } // hier hab ich das else deshalb entfernt if (FC >= 40 && PufferTemp > (istAn ? 50 : 55) ) { istAn = true // verteilen Laden_Mit = [0, 0, 0, 6, 12, 12, 12, 12, 12, 18, 18, 24, 36, 100]; } else if (FC >= 40 && PufferTemp < (!istAn ? 50 : 55)) { istAn = false Laden_Mit = [0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 30, 36, 100]; } else if (FC < 40 && PufferTemp > (istAn ? 50 : 55)) { istAn = true // Hamstern Laden_Mit = [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100]; } else if (FC < 40 && PufferTemp < (!istAn ? 50 : 55)) { // Pufferspeicher laden istAn = false Laden_Mit = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; } } // hier dann heizung schalten oder datenpunkt setzten der beim nächsten durchlauf gelesen wird.
Ich verstehe es aber nicht ganz. Was schaltet da die Heizung an?
die Heizung ist kein separater Datenpunkt! Es wird im Skript einfach die Ladeleistung des Akkus herabgesetzt (in den Klammern [...] und somit zieht der Heizstab den PV Überschuss weg. Leider gibt es bei dem Gen24 Wechelrichter keinen Datenpunkt in der Modbus Schnittstelle um die Priorisierung zu ändern, somit muss ich die Ladeleistung des Akkus drosseln, damit der Heizstab (hängt am Ohmpilot) mehr Überschuss bekommt!