Neues Modul PID20 - Der PID-Regler

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

Vorheriges Thema - Nächstes Thema

Shadow3561

Danke, das Prinzip der Group-id war mir bereits bekannt.
Dieses hat jedoch nur Einfluss auf das Reading desiredTemperature.
Beim pid20 ist dieses jedoch immer auf on gestellt und es wird nur über MaxValvePosition geregelt. Hierauf hat die groupId leider keinen Einfluss.
Trotzdem danke für deine Mühe

Fritz Muster

Dann ist vielleicht das erhöhen von pidActorInterval des PID20 eine Option um die Funklast zu verringern.
RasPi 3B+, Stretch, Fhem 5.9, DBlog SQLite
HMLAN, mapleCUN MAX/WMBus, mapleSduino 868/433/868
HM Sensoren/Aktoren ,Technoline TX 29 DTH-IT, TFA 30.3155WD, MAX!
Hour Counter, Astro, EletricityCounter, Statistics, Charting Frontend, TabletUI, Modbus

Fritz Muster

Hab gerade noch eine Idee bzgl. Verringerung der Funklast. Den desired Wert vom PID20 in einen dummy schreiben und den Dummy Wert dann rollierend im sagen wir mal 10 Minuten Takt an jeweils einen MAX Thermostaten senden.
RasPi 3B+, Stretch, Fhem 5.9, DBlog SQLite
HMLAN, mapleCUN MAX/WMBus, mapleSduino 868/433/868
HM Sensoren/Aktoren ,Technoline TX 29 DTH-IT, TFA 30.3155WD, MAX!
Hour Counter, Astro, EletricityCounter, Statistics, Charting Frontend, TabletUI, Modbus

JoeALLb

Zitat von: frank am 07 Juli 2016, 11:27:53
but needs your valve all the blue zero's?

Do you know
attr pidActorValueDecPlaces??
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

Shadow3561

Hat es schon jemand geschafft das Modul mit Tablet-Ui und dem Themostat Widget zum laufen zu bekommen?

Mfg

Fritz Muster

Zitat von: Shadow3561 am 02 Dezember 2016, 19:15:11
Hat es schon jemand geschafft das Modul mit Tablet-Ui und dem Themostat Widget zum laufen zu bekommen?

Mfg

Ja, ich! Wobei ich korrekter Weise sagen muss, das ich nicht das Thermostat Widget nutzte, sondern eine Kombination aus Spinner/Label und Symbol Widgets.
RasPi 3B+, Stretch, Fhem 5.9, DBlog SQLite
HMLAN, mapleCUN MAX/WMBus, mapleSduino 868/433/868
HM Sensoren/Aktoren ,Technoline TX 29 DTH-IT, TFA 30.3155WD, MAX!
Hour Counter, Astro, EletricityCounter, Statistics, Charting Frontend, TabletUI, Modbus

Shadow3561

#336
Kannst du evtl ein Screenshot einstellen oder den Quellcode?
Ich habe es jetzt mit dem Volume Widget und Label gemacht, mir gefällt es mit dem Thermostat Widget aber besser, da dort die aktuelle Temperatur direkt angezeigt wird .
Meins sieht aus wie im Screenshot.(Wohnzimmer und Bad mit Volume-Widget und PID20, Schlafzimmer mit Thermostat-Widget und MAX!) das Thermostat-Widget finde ich optisch schöner.

Mfg

Fritz Muster

Klar, gerne doch, komme aber erst morgen dazu. Bin gerade unterwegs!
RasPi 3B+, Stretch, Fhem 5.9, DBlog SQLite
HMLAN, mapleCUN MAX/WMBus, mapleSduino 868/433/868
HM Sensoren/Aktoren ,Technoline TX 29 DTH-IT, TFA 30.3155WD, MAX!
Hour Counter, Astro, EletricityCounter, Statistics, Charting Frontend, TabletUI, Modbus

Fritz Muster

@Shadow3561

<li data-row="1" data-col="6" data-sizex="4" data-sizey="3">
<header>Gast WC</header>
<div class="">
             <div class="row" style="padding-top:7px;">
               <div data-type="label" class="inline col-1-4">Raumtemp.
               </div>
               <div
                   class="inline col-1-4 big"
                   data-type="label"
                   data-device="EgThermpidBad"
                   data-get="measured"
                   data-unit="°">
               </div>
               <div data-type="symbol"
                 class="inline medium col-1-4"
                 data-device="EgSenTempBad"
                 data-get="battery"
                 data-get-on='["ok","low"]'
                   data-icons='["fa-battery-full fa-rotate-270","fa-battery-1 fa-rotate-270"]'
                   data-on-colors='["SeaGreen","IndianRed"]'>
             </div>
             </div>
               <div class="row" style="padding-top:7px;">
               <div data-type="label" class="inline col-1-4">Ventilpos.
               </div>
               <div
                   class="inline col-1-4 big"
                   data-type="label"
                   data-device="EgThermpidBad"
                   data-get="actuation"
                   data-unit="%">
               </div>
                <div data-type="symbol"
                 class="inline medium col-1-4"
                 data-device="EgAktVentilBad"
                 data-get="battery"
                 data-get-on='["ok","low"]'
                   data-icons='["fa-battery-full fa-rotate-270","fa-battery-1 fa-rotate-270"]'
                   data-on-colors='["SeaGreen","IndianRed"]'>
             </div>
             </div>
             <div class="row" style="padding-top:7px;"">
               <div data-type="label" class="inline col-1-4">Luftfeuchte
               </div>
               <div
                   class="inline col-1-4 big"
                   data-type="label"
                   data-device="EgSenTempBad"
                   data-get="humidity"
                   data-unit="%">
               </div>
<div class="autohide top-space inline col-1-4">
               </div>
             </div>
</div>
<div>
             <div data-type="spinner"
                   data-device="EgThermpidBad"
                   data-get="desired"
                   data-set="desired"
                   data-step="0.5"
                   data-min="10"
                   data-max="30"
                   data-unit="°"
                   class="top-space centered valueonly"
                   >
               </div>
               <div>
               <div data-type="symbol" class="top-space inline col-1-4"
                       data-device="EgSenFkMxBad" data-get="onoff" data-get-on='["0","1"]'
                       data-on-colors='["SeaGreen","IndianRed"]'>
               </div>
               <div class="autohide top-space inline col-1-4">
               </div>
               <div class="autohide top-space inline col-1-4">
               </div>
             </div>
<div>
               <div data-type="symbol" class="medium inline col-1-4"
                       data-device="EgSenFkMxBad" data-get="battery" data-get-on='["ok","low"]'
                       data-on-colors='["SeaGreen","IndianRed"]'
                       data-icons='["fa-battery-full","fa-battery-1"]'>
               </div>
               <div class="autohide top-space inline col-1-4">
               </div>
               <div class="autohide top-space inline col-1-4">
               </div>
             </div>
<div class="row top-space">
<div class="autohide top-space inline col-1-4">
               </div>
  <div class="autohide top-space inline col-1-4">
               </div>
  <div data-type="popup" data-width="800px" data-height="400px"
class="medium inline col-1-4">
                 <div class="medium inline col-1-4"
                      data-type="symbol"
                      data-icon="fa-line-chart">
                   </div>
                 <div class="dialog">
                 <header>Gast WC Raumtemperatur Luftfeuchte Ventilposition</font></header>
                       <div class="nobuttons"
                         data-type="chart"
                         data-device="myDblog"
                         data-logdevice='["myDbLog","myDbLog","myDbLog"]'
                        data-logfile='["HISTORY","HISTORY","HISTORY"]'
                         data-columnspec='["EgThermpidBad:actuation","EgSenTempBad:humidity","EgSenTempBad:temperature"]'
                         data-style='["ftui l2","ftui l6","ftui l3"]'
                         data-ptype='["lines","lines","lines"]'
                         data-uaxis='["primary","primary","secondary"]'
                         data-legend='["Ventilposition","Luftfeuchte","Raumtemperatur"]'
                         data-yunit="%"
                         data-yunit_sec="°C"
                         data-ytext="Luftfeuchte / Ventilposition"
                         data-ytext_sec="Raumtemperatur"
                         data-minvalue="0"
                         data-minvalue_sec="auto"
                         data-maxvalue_sec="auto"
                         data-maxvalue="100"
                         data-yticks="auto"
                         data-daysago="0"
                         data-caption="Temp."
                         data-height="350px"
                         data-width="700px"
                         data-showlegend="true">
                       </div>
                 </div>
             </div>
</div>


Der Code ist leider etwas unsauber formatiert, aber vielleicht kannst Du ja trotzdem was brauchbares  für Dich "rausziehen".

Grüße Fritz
RasPi 3B+, Stretch, Fhem 5.9, DBlog SQLite
HMLAN, mapleCUN MAX/WMBus, mapleSduino 868/433/868
HM Sensoren/Aktoren ,Technoline TX 29 DTH-IT, TFA 30.3155WD, MAX!
Hour Counter, Astro, EletricityCounter, Statistics, Charting Frontend, TabletUI, Modbus

Elektrofreak

#339
Hallo zusammen,

ich habe seitdem ich mehrere PID-Regler verwende die Befürchtung, dass FHEM dadurch extrem langsam geworden ist.

Ich vermute, dass das Problem die Verschachtlung mehrerer PID-Regler und UserReadings ist, sodass unnötigerweise irgendwelche internen Notifys getriggert werden.

Von der Funktionsweise her habe ich es zur Erklärung so  gemacht:


  • An einem Heizkörper befinden sich zwei Temperatursensoren: zum Einen ein Heizkörpertemperatursensor und ein Raumtemperatursensor
  • Beide DS18B20-Temperatur-Sensoren sind per 1-Wire an einem ESP8266 angeschlossen, der die ESPEasy-Firmware verwendet
  • Auf dem FHEM-Host läuft das ESPEasy-Modul zum Empfangen der Daten
  • Des Weiteren ist ein Thermoelektrisches Heizungsthermostat am ESP angeschlossen. Dieser steuert per Longpulse die Ventilposition (PWM ist nicht gut genug wegen des thermischen positiven Feedbacks)
  • Zusätzlich sind Lüfter in den Heizkörper integriert um den Raum schneller auf Temperatur zu bekommen
  • Insg. werden drei Regelschleifen verwendet:

    • Raumtemperatur
    • Heizkörperleistung
    • Lüfterdrehzahl
  • Die Raumtemperatur wird auf einen Sollwert geregelt (äußere Regelschleife). Dazu wird die Soll-Leistung des Heizkörpers gesteuert
  • Die Heizleistung des Heizkörpers errechnet sich auf der Temperaturdifferenz zwischen Heizkörper und Raum multipliziert mit einem Faktor, der von der Lüfterdrehzahl abhängt und somit den Einfluss der natürlichen Konvektion und der erzwungenen Konvektion zusammenfasst
  • Die Heizleistung des Heizkörpers wird über die Ventilposition geregelt
  • Die Lüfterdrehzahl wird abhängig von der Heizkörpertemperatur und den Bedürfnissen der Bewohner geregelt

Wie man sieht sind da sehr viele verschachtelte PID-Schleifen und UserReadings vorhanden. Nachfolgend sind die wichtigsten Code-Abschnitte angefügt. Dabei verwende ich folgende Bezeichnungen:


  • eth: Thermostat
  • heat: Heizung
  • room: Raum
  • fan: Lüfter
  • temp: Raumtemperatur
  • power: Heizleistung des Heizkörpers
  • powerCharged: Heizleistung des HEizkörpers, die vom Wärmemengenzähler gemessen wird
  • forcedConvectionFactor: Angleichfaktor zur Berechnung der Heizleistung durch die Verwendung der Lüfter
Anmerkung: fan = 1000: aus, fan = 0: 100% an


define esp_wz_hz_temp_heat ESPEasy 192.168.***.*** 80 esp_bridge esp_wz_hz_temp_heat
attr esp_wz_hz_temp_heat IODev esp_bridge
attr esp_wz_hz_temp_heat Interval 60
attr esp_wz_hz_temp_heat eventMap /pwm 2:pwm_fan/pwm 3:pwm_eth/longpulse 3 1:longpulse_eth/gpio 4 on:on_sup/gpio 4 off:off_sup/gpio 5 on:on_fan/gpio 5 off:off_fan/
attr esp_wz_hz_temp_heat userReadings powerCharged:Temperature.* {return 0 if (ReadingsVal("$name","Temperature","0") < ReadingsVal("esp_wz_hz_temp_room","Temperature",0)+2);;;; return (ReadingsVal("$name","Temperature",0)-ReadingsVal("esp_wz_hz_temp_room","Temperature",0))*1400/30}, power:powerCharged.* {ReadingsVal("$name","powerCharged",0)*(ReadingsVal("$name","forcedConvectionFactor",0)+1)}, energy:power.* integral {ReadingsVal("$name","power",0)/3600/1000*(ReadingsVal("$name","forcedConvectionFactor",0)+1)}, energyCharged:powerCharged.* integral {ReadingsVal("$name","powerCharged",0)/3600/1000}, forcedConvectionFactor:powerCharged.* {(1-ReadingsVal("pid_wz_hz_fan","actuation",1000)/1000)*0.9}

define esp_wz_hz_temp_room ESPEasy 192.168.***.*** 80 esp_bridge esp_wz_hz_temp_room
attr esp_wz_hz_temp_room IODev esp_bridge
attr esp_wz_hz_temp_room Interval 60
attr esp_wz_hz_temp_room userReadings temperatureChange:Temperature.* differential { ReadingsVal("$name","Temperature",0)*60;; }


define pid_wz_hz_eth PID20 esp_wz_hz_temp_heat:power esp_wz_hz_temp_heat:longpulse_eth
attr pid_wz_hz_eth pidActorInterval 60
attr pid_wz_hz_eth pidActorKeepAlive 60
attr pid_wz_hz_eth pidActorLimitLower 0
attr pid_wz_hz_eth pidActorLimitUpper 59
attr pid_wz_hz_eth pidCalcInterval 60

define pid_wz_hz_fan PID20 esp_wz_hz_temp_heat:Temperature esp_wz_hz_temp_heat:pwm_fan
attr pid_wz_hz_fan pidActorInterval 15
attr pid_wz_hz_fan pidActorKeepAlive 15
attr pid_wz_hz_fan pidActorLimitLower 0
attr pid_wz_hz_fan pidActorLimitUpper 750
attr pid_wz_hz_fan pidCalcInterval 15
attr pid_wz_hz_fan verbose 5

define pid_wz_hz_temp PID20 esp_wz_hz_temp_room:Temperature pid_wz_hz_eth:desired
attr pid_wz_hz_temp pidActorInterval 60
attr pid_wz_hz_temp pidActorLimitLower -100
attr pid_wz_hz_temp pidActorLimitUpper 3000
attr pid_wz_hz_temp pidCalcInterval 60


Ich habe mal testweise das verbose-Level vom fan-pid hoch gedreht. Es kommen dann z.B. folgende Einträge im Event Monitor für ein 30-Sekunden-Fenster:

Zitat
2016.12.13 09:40:43 4 : PID20 pid_wz_hz_fan: Notify.240 check 2 readings for Temperature
2016.12.13 09:40:43 5 : PID20 pid_wz_hz_fan: Notify.248 check event:<presence: absent>
2016.12.13 09:40:43 5 : PID20 pid_wz_hz_fan: Notify.248 check event:<absent>
2016.12.13 09:40:46 4 : PID20 pid_wz_hz_fan: Notify.240 check 2 readings for Temperature
2016.12.13 09:40:46 5 : PID20 pid_wz_hz_fan: Notify.248 check event:<presence: absent>
2016.12.13 09:40:46 5 : PID20 pid_wz_hz_fan: Notify.248 check event:<absent>
2016.12.13 09:40:49 4 : PID20 pid_wz_hz_fan: Notify.240 check 2 readings for Temperature
2016.12.13 09:40:49 5 : PID20 pid_wz_hz_fan: Notify.248 check event:<presence: absent>
2016.12.13 09:40:49 5 : PID20 pid_wz_hz_fan: Notify.248 check event:<absent>
2016.12.13 09:41:03 4 : PID20 pid_wz_hz_fan: Notify.240 check 2 readings for Temperature
2016.12.13 09:41:03 5 : PID20 pid_wz_hz_fan: Notify.248 check event:<presence: absent>
2016.12.13 09:41:03 5 : PID20 pid_wz_hz_fan: Notify.248 check event:<absent>
2016.12.13 09:41:03 1 : Perfmon: possible freeze starting at 09:40:50, delay is 13.671
2016-12-13 09:41:04 PID20 pid_wz_hz_fan stopped
2016-12-13 09:41:04 PID20 pid_wz_hz_fan voltage_actuation: 0
2016-12-13 09:41:04 PID20 pid_wz_hz_fan voltage_p_p: -0.9456
2016-12-13 09:41:04 PID20 pid_wz_hz_fan voltage_p_i: 3.858
2016-12-13 09:41:04 PID20 pid_wz_hz_fan voltage_p_d: 0
2016.12.13 09:41:04 5 : PID20 pid_wz_hz_fan: RestartTimer.138 name:pid_wz_hz_fan seconds:1
2016.12.13 09:41:04 3 : PID20 pid_wz_hz_fan: Set.383 set pid_wz_hz_fan restart 750
2016-12-13 09:41:04 PID20 pid_wz_hz_fan restart 750
2016.12.13 09:41:04 5 : PID20 pid_wz_hz_fan: RestartTimer.138 name:pid_wz_hz_fan seconds:1
2016-12-13 09:41:04 PID20 pid_wz_hz_fan stop
2016-12-13 09:41:04 PID20 pid_wz_hz_fan actuation: 1000
2016-12-13 09:41:04 PID20 pid_wz_hz_fan voltage_actuation: 0
2016-12-13 09:41:04 PID20 pid_wz_hz_fan voltage_p_p: -0.9456
2016-12-13 09:41:04 PID20 pid_wz_hz_fan voltage_p_i: 3.858
2016-12-13 09:41:04 PID20 pid_wz_hz_fan voltage_p_d: 0
2016.12.13 09:41:04 4 : PID20 pid_wz_hz_fan: Notify.240 check 1 readings for Temperature
2016.12.13 09:41:04 5 : PID20 pid_wz_hz_fan: Notify.248 check event:<off_fan>
2016.12.13 09:41:04 4 : PID20 pid_wz_hz_fan: Notify.240 check 1 readings for Temperature
2016.12.13 09:41:04 5 : PID20 pid_wz_hz_fan: Notify.248 check event:<pwm_fan 1000>
2016.12.13 09:41:05 2 : sys_nanoCUL IT_set: it_kz_window off
2016.12.13 09:41:05 2 : sys_nanoCUL IT_set: it_kc_window off
2016.12.13 09:41:06 4 : PID20 pid_wz_hz_fan: Notify.240 check 1 readings for Temperature
2016.12.13 09:41:06 5 : PID20 pid_wz_hz_fan: Notify.248 check event:<off_sup>
2016.12.13 09:41:06 1 : Perfmon: possible freeze starting at 09:41:04, delay is 2.505
2016-12-13 09:41:06 PID20 pid_wz_hz_fan stopped
2016-12-13 09:41:06 PID20 pid_wz_hz_fan voltage_actuation: 0
2016-12-13 09:41:06 PID20 pid_wz_hz_fan voltage_p_p: -0.9456
2016-12-13 09:41:06 PID20 pid_wz_hz_fan voltage_p_i: 3.858
2016-12-13 09:41:06 PID20 pid_wz_hz_fan voltage_p_d: 0
2016.12.13 09:41:06 4 : PID20 pid_wz_hz_fan: Notify.240 check 2 readings for Temperature
2016.12.13 09:41:06 5 : PID20 pid_wz_hz_fan: Notify.248 check event:<presence: absent>
2016.12.13 09:41:06 5 : PID20 pid_wz_hz_fan: Notify.248 check event:<absent>
2016.12.13 09:41:09 4 : PID20 pid_wz_hz_fan: Notify.240 check 2 readings for Temperature
2016.12.13 09:41:09 5 : PID20 pid_wz_hz_fan: Notify.248 check event:<presence: absent>
2016.12.13 09:41:09 5 : PID20 pid_wz_hz_fan: Notify.248 check event:<absent>
2016.12.13 09:41:12 4 : PID20 pid_wz_hz_fan: Notify.240 check 2 readings for Temperature
2016.12.13 09:41:12 5 : PID20 pid_wz_hz_fan: Notify.248 check event:<presence: absent>
2016.12.13 09:41:12 5 : PID20 pid_wz_hz_fan: Notify.248 check event:<absent>
2016.12.13 09:41:15 4 : PID20 pid_wz_hz_fan: Notify.240 check 1 readings for Temperature
2016.12.13 09:41:15 5 : PID20 pid_wz_hz_fan: Notify.248 check event:<longpulse_eth 0>
2016.12.13 09:41:29 4 : PID20 pid_wz_hz_fan: Notify.240 check 2 readings for Temperature
2016.12.13 09:41:29 5 : PID20 pid_wz_hz_fan: Notify.248 check event:<presence: absent>
2016.12.13 09:41:29 5 : PID20 pid_wz_hz_fan: Notify.248 check event:<absent>
2016.12.13 09:41:29 1 : Perfmon: possible freeze starting at 09:41:16, delay is 13.319

Mir kommt es vor, als ob zu viele event checks durchgeführt werden. Kann man das irgendwie begrenzen? Bei den UserReadsings habe ich das schon versucht, so gut wie möglich zu machen. Aber trotzdem gibt es noch recht viele "possible freezes", die immer während der PID-Aktivität auftreten...

Zusatzinfo: Falls jemand ähnliche Probleme hat: Es hilft, die UserReadings nur auf bestimmte Events triggern zu lassen (siehe oben).

Edit: Meine Frage ist, wieso der auf die absent-Meldung vom Temperatursensor triggert und ob man dem PID20-Modul irgendwie sagen kann, dass der nur auf Änderungen des Temperature-Readings reagieren soll (weil es wird nur das absent-Reading im esp-device aktualisiert, nicht das Temperature-Reading)

frank

ich würde erst einmal die events reduzieren => "attr <dev> event-on-change-reading .*"
dann muss pid20 nicht alle 3sec checken.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

Elektrofreak

Hallo

Zitat von: frank am 14 Dezember 2016, 13:08:54
ich würde erst einmal die events reduzieren => "attr <dev> event-on-change-reading .*"
dann muss pid20 nicht alle 3sec checken.

Danke für die Antwort. Das habe ich jetzt gemacht. Ich meine, dass es recht viel gebracht hat. Ich habe aber parallel die Datenbank von MySQL auf SQLite umgestellt und arbeite jetzt mit dem log-Verzeichnis und der Datenbank auf einer zyklisch gesicherten RAM-Disk, da MySQL die SD-Karte durch zu viele Schreibzugriffe zerstört hat.

Trotzdem nochmal zurück zur Frage: Kann man den PID20-Regler nur auf den Sensor-Wert triggern lassen anstatt auf alle Events vom Sensor-Device?

Noch zwei weitere Fragne (ggf. sogar Feature Request):
Kann man das Modul seine calculations und das Setzen des Aktuators genau dann machen, wenn der Sensor-Wert geliefert wird (und vielleicht ein max-Interval für fehlende Sensoren)? Das würde bei mir die Regelschleife etwas schneller machen und die Anzahl der Berechnungen auf das nötigste Reduzieren. Es reicht ja normalerweise, wenn der Aktuator auf das reagiert, was der Sensor gerade gemessen hat. Zur Zeit muss ich etwa 2-4 Calculations bzw. Aktuator-Sets pro Sensor-Reading durchführen, damit die Verzögerung durch den PID-Regler nicht zu groß wird...

Könnte es eingestellt werden, dass der integrierende Anteil in einem definierten Bereich aus dem Aktuatorlimits heraus laufen darf? Das würde bei einer meiner Regelungen den Vorteil haben, dass die Langzeit-Abweichung geringer werden würde. Aktuell kann desshalb der Integrator in Fall einer "anti-windup-Begrenzung" den statischen Regelfehler nicht herausregeln...


Vielen Dank für eure Bemühungen und eure Rückmeldung ;)

sunred

Hallo ich habe da mal eine Frage,  möchte Konstantlichtregelung mit Hilfe des Helligkeitssensors EnOcean-FBH65S und dem Dimmer Eltako-FUD61 realisieren, weiß allerdings nicht genau wie. Wäre das mit dem PID20-Modul möglich oder sollte man da besser auf if bzw. DOIF zurückgreifen?

Danke im Voraus

frank

Zitat von: sunred am 02 Januar 2017, 21:20:26
Hallo ich habe da mal eine Frage,  möchte Konstantlichtregelung mit Hilfe des Helligkeitssensors EnOcean-FBH65S und dem Dimmer Eltako-FUD61 realisieren, weiß allerdings nicht genau wie. Wäre das mit dem PID20-Modul möglich oder sollte man da besser auf if bzw. DOIF zurückgreifen?

Danke im Voraus
ich kenne deine hardware nicht, aber ich würde es einfach mal probieren.
das wiki kennst du?
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

abc2006

Hi,
ich setze seit etwa einem Jahr das PID20-Modul ein, um mit einem 5-Wege-Mischer die Vorlauftemperatur meiner Fußbodenheizung zu regeln.
Nachdem ich erstmal die Grundlagen verstanden hatte, habe ich die Funktion immer weiter optimiert. Bin sehr zufrieden.
Vielen Dank für die viele Arbeit, die ganzen Features und Anpassungen, die du immer wieder vornimmst.

Ich habe heute ebenfalls ein paar Features zusammengetragen, die das Handling in meinem Fall erleichtern würden:

Erstmal ganz trivial ein Frontend-Feature:
pidActorCallBeforeSetting und pidIPortionCallBeforeSetting als (ich glaube) text-Long formatieren (dann klappts mit dem Codemirror)


Das andere ist etwas komplexer, ich hoffe ich krieg das um diese Uhrzeit noch vernünftig rüber:

Momentan ist es so vorgesehen, dass PID den Stellwert direkt an das Device übergibt. Im Falle von HK-Stellmotoren auch absolut sinnvoll.
Ich hingegen muss (möchte) den Wert erst noch weiterverarbeiten, bevor mein Mischer irgendwas tut.
D.h. ich bräuchte einen (zusätzlichen) Dummy, ein zusätzliches notify, um eine Perl-Funktion zu triggern, die dann ihrerseits entscheidet, welches Relais wie lange anzieht (abhängig von z.B. Problemen, Sicherung gegen Übertemperatur, Unterdrückung von Schaltbefehlen, wenn die Pumpe eh nicht läuft usw).
Bis jetzt habe ich das so gelöst, dass ich ein notify auf actuation getriggert habe.
Damit ist der ActorInterval für mich nutzlos, aber einen dummy brauche ich trotzdem, da PID sonst meckert.
<- blöde Idee ...  8) :P

Heute habe ich versucht, mit der pidActorCallBeforeSetting direkt meine Funktion aufzurufen - entweder funktioniert es nicht, oder ich hab nen Knoten im Hirn. (kann die Zeilen gerade nicht kopieren, ist auf einem Testsystem ohne Internet)
WUNSCH: kann man das Modul so erweitern, dass anstatt einem Device auch eine perl-Funktion aus der MyUtils aufgerufen werden kann?


Dann sind mir noch zwei Sachen aufgefallen:
Erstens:
Das reading actuationCalc wird ja alle pidCalcInterval Sekunden neu berechnet und aktualisiert. Das reading actuation erzeugt dabei ebenfalls ein Event. Da der Wert von actuation aber nur geändert wird, wenn pidActorInterval Sekunden abgelaufen sind, bin ich der Meinung, es wäre sinnvoll, auch (nur) dann ein entsprechendes Event für dieses reading zu erzeugen.

Zweitens: event-min-interval.
Im Wiki (und auch mehrfach in diesem Thread) steht:
ZitatEvents feuern, wenn sich über lange Zeit ein Reading nicht ändert: wenn sich z.B. desired über Stunden nicht ändert, so wird kein einziger Event gefeuert. Mit nachfolgender Einstellung erreicht man, dass ein Event auch dann erzeugt wird, wenn sich das Reading nach einer festgelegten Zeit nicht ändert(sinnvoll für Charts, hier z.B. alle 30 Minuten)
Ich habe es gerade noch einmal probiert und muss hier leider protestieren:(Auszug aus der commandref)
event-min-interval
Dieses Attribut enthält eine durch Kommata getrennte Liste von "readings:minInterval" Paare. readings kann ein regexp sein. Ein Event wird nur dann generiert, falls seit dem letzten Auftreten des gleichen Events mindestens minInterval Sekunden vergangen sind.

Soll heissen: wenn event-min-interval auf 30 Sekunden gesetzt ist, und ActorInterval auf 120, ist event-min-Intervall sinnlos, da zwischen den Events generell mehr als 30 Sekunden vergehen (nämlich 120). Wenn allerdings ActorInterval auf 30 und event-min-interval auf 120 Sekunden stehen, wird auch nur alle 120 Sekunden ein Event erzeugt.

Falls die Wahrheit anders liegt, lasse ich mich gerne überzeugen - aber meine Tests bestätigen eigentlich die commandref ...

Viele Grüße
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX