Neues Modul PID20 - Der PID-Regler

Begonnen von John, 02 Dezember 2013, 22:03:40

Vorheriges Thema - Nächstes Thema

bartman121

Nein, aber du könntest ActuationCalc direkt ins Thermostat ins maxvalvesetting senden.

MarvinLu

Zitat von: bartman121 am 05 März 2019, 13:57:18
Hallo,

grundsätzlich scheint etwas Verständnis für den Regler zu fehlen, mal ganz grob beschrieben:

Proportional-Anteil (P) ... Jede Temperaturdifferenz erzeugt eine Ventilöffnung nach dieser Formel: deltaT*pidFactor_P
Beispiel: Soll: 20°C,IST:18°C,pidFactor_P=10 --> Ventilöffnung=20%
Beispiel 2: Soll: 20°C,IST:21°C,pidFactor_P=10 --> Ventilöffnung= -10%
Integraler Anteil (I) ... dieser Wert ist ein "gelernter Wert" aus der Vergangenheit, er beschreibt im Grunde genommen wie weit das Ventil geöffnet sein muss um eine Temperatur zu "halten". Denn bei deltaT=0K wäre der P-Anteil 0%, da aber Räume auch "nachgeheizt" werden müssen, benötigt man einen I-Anteil.

Zu jedem Zeitpunkt ergibt sich die tatsächliche Ventilöffnung als Summe aus I-Anteil + P-Anteil.

Dein Regler hat irgendwann mal gelernt (vermutlich hattest du das Attribut pidFactor_I irgendwann mal viel zu hoch), dass zum Halten der Temperatur etwa 50%Ventilöffnung nötig sind. Darum sinkt die Temperatur beim Absenken der Soll-Temperatur in der Nacht auch nicht ab.

dein I-Anteil ist, warum auch immer, viel zu hoch.

Als erstes würde ich empfehlen:
pidFactor_I 0.05
pidFactor_P 10

Danach den PID-Regler "resetten":
Danach rantasten Regler-Einstellungen --> empirische Dimensionierung

Vielen Dank für deine Antwort!

Ich komme anscheinend mit dem resetten des Reglers nicht ganz klar. Wenn ich die beiden Attribute angepasst habe und dann

set PID_SZM restart 10

in die Konsole eingebe, erhalte ich folgendes:

Internals:
   DEF        DHT22_SZ1:temperature MAX_HT_SZM:maxValveSetting
   FUUID      5c78ef90-f33f-dc26-6d02-37db176740e3f88c
   NAME       PID_SZM
   NR         106
   NTFY_ORDER 50-PID_SZM
   STATE      processing
   TYPE       PID20
   VERSION    1.0.0.9
   READINGS:
     2019-03-08 11:32:23   actuation       9
     2019-03-08 11:32:23   actuationCalc   10
     2019-03-08 11:32:23   delta           -1.9
     2019-03-08 11:32:23   desired         17.0
     2019-03-08 11:32:23   measured        18.9
     2019-03-08 11:32:23   p_d             0
     2019-03-08 11:32:23   p_i             29
     2019-03-08 11:32:23   p_p             -19
     2019-03-08 11:32:23   state           processing
   helper:
     actor      MAX_HT_SZM
     actorCommand maxValveSetting
     actorErrorAction freeze
     actorErrorPos 0
     actorInterval 180
     actorKeepAlive 1800
     actorLimitLower 0
     actorLimitUpper 100
     actorThreshold 1
     actorTimestamp 2019-03-08 11:30:50
     actorValueDecPlaces 0
     adjust     
     calcInterval 60
     deltaGradient 0
     deltaOld   -1.9
     deltaOldTS 2019-03-08 11:32:32
     deltaTreshold 0
     desiredName desired
     disable    0
     factor_D   0
     factor_I   0.05
     factor_P   10
     isWindUP   
     measuredName measured
     reading    temperature
     regexp     ^([\+,\-]?\d+\.?\d*$)
     reverseAction 0
     sensor     DHT22_SZ1
     sensorTimeout 3600
     stopped    0
     updateInterval 600
Attributes:
   group      PID
   pidActorValueDecPlaces 0
   pidFactor_I 0.05
   pidFactor_P 10
   pidReverseAction 0
   room       2_SZ_Marvin


Ist das korrekt so? Der P-Anteil stimmt ja so mit dem Wert -19. Jedoch bekomme ich den I-Anteil nicht gesenkt.. Wie wird dieses Reading aus dem Attribut bestimmt?

Noch eine andere Frage:
Ich hatte vor dem Einrichten des PID-Reglers den Max-Scanner und feste Wochenprogramme definiert.
Muss ich davon eins löschen, wenn der Regler arbeitet?

Liebe Grüße,
Marvin

bartman121

Der I-Anteil wird integriert, das heißt grob folgendes:
deltaT*pidFactor_I*Zeit, es gibt da noch ein paar andere Sachen (Anti-Wind-Up usw.) ist aber egal ...

Um den PID zu resetten musst du die Summe aus p_p und P_d nutzen, da p_d 0 ist ...

um den PID zu resetten (dein Beispiel):
set PID_SZM restart -19

Danach ist der I-Anteil bei 0

Die Wochenprogramme sind egal, solange das HT auf "manual" steht. Wichtig ist auch dass die Thermostate desired "on" haben.



MarvinLu

#393
Zitat von: bartman121 am 08 März 2019, 11:58:30
Der I-Anteil wird integriert, das heißt grob folgendes:
deltaT*pidFactor_I*Zeit, es gibt da noch ein paar andere Sachen (Anti-Wind-Up usw.) ist aber egal ...

Um den PID zu resetten musst du die Summe aus p_p und P_d nutzen, da p_d 0 ist ...

um den PID zu resetten (dein Beispiel):
set PID_SZM restart -19

Danach ist der I-Anteil bei 0


Ach, klar. Ich hatte fälschlicherweise die Werte aus den Attributen für den Neustart herangezogen. Jetzt sind die Anteile korrekt.

Zitat von: bartman121 am 08 März 2019, 11:58:30
Die Wochenprogramme sind egal, solange das HT auf "manual" steht. Wichtig ist auch dass die Thermostate desired "on" haben.

Okay, dann habe ich scheinbar irgendetwas noch nicht verstanden.
Ich sende mit einem Notify die desired Temperatur des Heizungsthermostates an den Regler.
Internals:
   DEF        MAX_HT_SZM:desiredTemperature:.*  { fhem ("set PID_SZM desired $EVTPART1");}
   FUUID      5c78fb93-f33f-dc26-bc2c-721239c9c7831de4
   NAME       not_PID_SZM
   NOTIFYDEV  MAX_HT_SZM
   NR         107
   NTFY_ORDER 50-not_PID_SZM
   REGEXP     MAX_HT_SZM:desiredTemperature:.*
   STATE      2019-03-08 12:04:19
   TRIGGERTIME 1552043059.35188
   TYPE       notify
   READINGS:
     2019-03-07 22:50:44   state           active
Attributes:


Wenn ich jetzt das Thermostat auf Manuell stelle, werden die Wochenprogramme nicht herangezogen.
Jedoch übergebe ich doch dann den "on"-Wert an den Regler?
Dementsprechend steht jetzt im Log folgendes:
2019.03.08 12:04:19 3: set PID_SZM desired on : value on is not a number
2019.03.08 12:04:19 3: not_PID_SZM return value: value on is not a number


Ein Wandthermostat verwende ich allerdings garnicht. Kann es sein, dass ich für mein Vorhaben garkeinen Regler verwenden kann?!  :D

Ich meine ich weiß, dass der Regler über die maxValveSetting agiert und ich dafür die interne Regelung des MAX-Systems umgehen muss.
Nur woher bekomme ich dann meinen Soll-Wert? Aus einem externen Notify ohne Bezug zum HT? Bzw. dann am besten aus einem at..

Liebe Grüße, Marvin

bartman121

Das HT muss auf on stehen, sonst regelt das Thermostat mit dem eingebauten Mechanismus. Bei "on" fährt das Thermostat immer mit maximaler Ventiöffnung (begrenzt durch maxValveSetting). Genau das ist es was der PID20 "will". Eigentlich will der PID20 die Ventilöffnung vorgeben, das funktioniert aber nicht direkt, sondern über den "workaround".

Die Sollwertvorgabe musst du woanders hernehmen, ich habe dazu einen Dummy. Wochenprofile kannst du dann nicht mehr verwenden, du musst die Werte beispielsweise per AT anpassen.

MarvinLu

#395
Völlig einleuchtend.. Danke für deine Hilfe :)

EDIT: Der MAX-Scanner kann dann ja weg, richtig? Oder stört der nicht, wenn der im ModeChange-Modus nebenher läuft?

bartman121


MarvinLu

Zitat von: bartman121 am 08 März 2019, 13:31:42
Der muss weg...

Dachte ich mir schon. Ist weg!

Zitat von: bartman121 am 08 März 2019, 12:17:29
Die Sollwertvorgabe musst du woanders hernehmen, ich habe dazu einen Dummy. Wochenprofile kannst du dann nicht mehr verwenden, du musst die Werte beispielsweise per AT anpassen.

Also machst du AT -> Dummy -> Notify -> PID?
Ich habe jetzt einfach meinen Wochenplan in ein DOIF gepackt und gehe direkt von DOIF -> PID.
Hat es einen speziellen Grund, dass du über den Dummy gehst?

Liebe Grüße, Marvin

bartman121

Das ist historisch gewachsen, es gibt dafür keinen echten Grund..

MarvinLu

Alles klar, dann lasse ich es so! :-)

Vielen Dank für deine Hilfe!

Liebe Grüße und schönes Wochenende,
Marvin

MarvinLu

#400
Hallöchen,

mir kam noch eine Idee und ich würde gerne wissen was ihr davon haltet:
Mein jetziger Regler funktioniert mit dem Temperaturwert meines Dht22-Mysensors-Thermometers. Ich würde gerne eine Sicherung einbauen, sollte dieser aus welchen Gründen auch immer einmal streiken.
Die Idee ist folgende: Einfach einen zweiten Regler einrichten, der auf das interne Thermostat des MAX Heizungsthermostates zurückgreift. Sobald ein Reading älter als zb. 10 Minuten ist, soll Regler A den Betrieb einstellen und Regler B den Betrieb aufnehmen. Das ist ja über simple Anweisungen einfach zu bewerkstelligen. Auf diesem Wege hätte ich zwei Regler, die ich unabhängig voneinander Parametrieren kann.

Was haltet ihr davon? Ich meine rein praktisch gesehen, wäre es egal, ob jetzt mal 2 Grad mehr oder weniger in einem Raum sind. Aber die Komponenten sind alle da, also warum nicht?

Liebe Grüße, Marvin

Maui

Moin zusammen, ich nutze das Modul für meine MAX-Thermostate.
Im offenen Wohnzimmer habe ich 3 HKs und somit auch 3 HTs.
Ich habe mir jetzt mal angeschaut, ab welcher Ventilstellung die HTs Wasser durchlassen. Sagen wir einfach mal bei 10,20 und 40 Prozent Stellung.
Ich nutze logischerweise für den Raum 1 Temp-Sensor, welcher auf 3 PID-Regler der 3 HTs einwirkt.
Nun habe ich pidActorLimitLower auf jeweils 10,20 und 40 gesetzt.
Allerdings sorgt das ja nur dafür, dass die HTs immer mindestens auf den Werten stehen. Sagen wir der errechnete Wert ist jetzt bei den 3 PIDs auf 15.
Dann ist nur 1 HK an und die anderen beiden sind noch "aus" auf 20 und 40.
Schön wäre eine Art Nullpunkt-Verschiebung, aber die habe ich nicht gefunden im Modul.
Ich habe nur pidActorCallBeforeSetting gesehen, womit ich das vermutlich händisch hinbiegen könnte. Aber geht es auch schöner?

Gruß und Danke
Maui

Shadow3561

Du kannst doch ein offset bei jedem TH-Ventil einstellen. Damit sollte es dann klappen.

Maui

Was meinst du genau mit offset? Steh grad auf dem Schlauch

Shadow3561

Aus der MAX Commandref

valveOffset <value>
Nur für Heizkörperthermostate. Schreibt den angegebenen offset Wert der Ventilstellung in den Speicher des Gerätes Der Heizkörperthermostat wird diesen Wert während der Regelung zu den berechneten Ventilstellungen hinzuaddieren.


Das sollte bei deinem Vorhaben doch funktionieren.