@Umluft schrieb: Ich setze nur Niveau. Die Steilheit spielt (in weiten Grenzen) keine Rolle. Das Niveau berechne ich so: def calcLevel(aussenT,raumT,sollT): x = 0.580 * aussenT - 7.880 x = (raumT - sollT) * 10.0 * x return (round(min(max(x,-14.0),15.0),0)) Danke, ich konnte die Dateien herunterladen. Wenn ich das richtig sehe (vereinfacht) liest Du die Raumtemperatur raumT und die Aussentemperatur aussenT aus Deinen externen Datenquellen und die Soll-Raumtemperatur sollT aus der Anlage (= entweder MixerTwoCircuitCurrentTemperatureSetpoint oder MixerTwoCircuitRoomTemperatureSetpoint, je nach Zustand der Anlage). Dann berechnest Du Level (=Niveau) der Heizkurve Level = calcLevel(aussenT,raumT,sollT): (0.580 * aussenT - 7.880) * (raumT - sollT) * 10.0 (Das Ergebnis wird dann begrenzt auf Wertbereich von -14 bis +15) und prüfst dann, ob das aktuell in der Anlage eingestellte Niveau "MixerTwoCircuitCentralHeatingCurve/Level" damit übereinstimmt und falls nein, setzt Du den Anlagenwert auf Deinen errechneten Wert. Was ich jetzt nicht verstehe, wo die eigentliche Feedback-Regelschleife ist, also die sich selbst optimierende "Heizkurve". Ich verstehe zwar, dass calcLevel von Betrag her größer wird, je größer die Abweichungen, und das dann iterativ nachgeregelt wird, bis Soll und Ist übereinstimmen und damit calcLevel irgendwann 0 wäre. Aber mal als Rechenbeispiel angenommen bei einer Heizkurvensteilheit von 1,1 und einem Niveau von 6 wären bei mir bei einer Aussentemperatur von 10 Grad perfekte (d.h. soll=ist) 22 Grad Raumtemperatur. Und dann aktiviere ich die "calcLevel-Steuerung": Dann würde calcLevel 0 errechnen und das Niveau von 6 auf 0 heruntersetzen, wodurch es dann bei mir zur kalt würde. Im nächste Regelzyklus wäre die Raumtemperatur z.B. um 0,1 Grad gefallen, dann wäre calcLevel = (5,8 - 7,880) * (-0,1) * 10 = 2,088 -> 2 Immer noch zu wenig, es würde weiter kälter werden. In den nächsten Regelzyklen würden die calcLevel dann zwar immer größer werden, bis das Niveau/calcLevel irgendwann so groß wird, dass es dann wieder wärmer wird. Wodurch die calcLevel-Werte dann aber wieder kleiner werden. Aber z.B. bei nur noch 0,1 Grad zu kalt wäre calcLevel dann wieder auf 2 und es würde wieder zu kalt. Das System würde also zwischen verschiedenen Extrema Oszillieren oder sich auf einen Raumtemperatur-Wert einschwingen, der aber nicht 22 Grad (die gewünschte Temperatur) ist, sondern niedriger wäre. Wie hast Du die Werte in calcLevel() ermittelt? Ich vermute, die sind an Deine Anlage/Haus angepasst? Etwas anderes wäre es, wenn die Funktion den Wert von calcLevel() nicht als neuen Anlagen-Wert setzten würde, sondern den bestehenden Anlagenwert jedesmal auslesen und ihm dann (quasi als Arbeitspunktverschiebung) calcLevel() hinzuaddieren würde und die Summe dann als neuen Anlagenwert-Wert Level setzen würde. Aber das scheinst Du in tweakHeatingCurve() nicht zu machen, oder? Keine Kritik, ich möchte es nur verstehen. Danke.
... Mehr anzeigen