Neues Modul PID20 - Der PID-Regler

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

Vorheriges Thema - Nächstes Thema

betateilchen

Hallo John,

Zitat von: John am 26 Februar 2014, 19:45:31
Ich finde es ungemein erleichternd bei der Analyse von Problemen, wenn

  • man die Instanz erkennen kann
  • man die auslösende Position im Code sofort ansteuern kann

Das eine schließt das andere nicht aus.

Normalerweise loggt man ja so, dass nach dem TimeStamp und dem Loglevel der Modultyp und der Devicename kommen.

2014.02.26 00:15:29 2: PID20 ku_PID20: Calc.701 readings updated

würde also Deine Wünsche und meine Wünsche vollständig und ohne großen Änderungsaufwand erfüllen. Außerdem wäre das dann auch DbLog-kompatibel (was im Moment definitiv nicht der Fall ist!)

Wobei solche von Dir nachvollziehbar gewünschten, ausführlichen Debugging/Evaluierungs-Meldungen eher in Loglevel 4 oder 5 gehören - dort kann man so ausführlich werden wie man möchte. Aber für Level 1-3 sollte man sich schon an den Entwicklungsrichtlinien (auch wenn sie kein Gesetz sind) orientieren, das vermeidet einige Probleme an anderen Stellen in fhem. Und man muss hinterher in seinem Modul nichts mehr am Logging ändern ;)

Viele Grüße
Udo
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Achja, was ich noch sagen wollte: Ist ja ein ganz prima Modul geworden inzwischen!
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

John

#167
Hallo Udo,
ich habe versucht die neuen Anforderungen einzubringen.
Anbei die Version 1.00.h


Somit ist dies nun die aktuelle Version mit folgenden Änderungen:

- diverse kleine Fixes
- bei pidDeltaTreshold kann auch ein float zugewiesen werden
- die Berechnung des i-Anteils ist nun unabhängig von pidCalcInterval
  ( Achtung: dies betrifft alle, die den default-Wert von pidCalcInterval verändert haben)


John

PS: Dateianhang gelöscht, da Modul in FHEM integriert ist
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

betateilchen

Hallo John,

danke, ich werde es testen und berichten.

Viele Grüße
Udo
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Spontan würde ich sagen "sieht gut aus" (bis auf den fehlenden Namen in der Initialize-Meldung)



2014.02.26 21:19:04 0: PID20 PID20: Initialize.111 Init Done with Version V 1.00.h - 26.02.14 - john
2014.02.26 21:19:37 3: PID20 ku_PID20: Set.345 set ku_PID20 desired 16
2014.02.26 21:22:40 3: PID20 ku_PID20: Set.345 set ku_PID20 desired 16

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

cwagner

Hallo Steve,

das "Aktor-Modul" ist ein Notify, das auf den Dummy FBH_Stellwert "horcht". durch Vergleich mit dem vorherigen Stellwert (zwischengespeichert in Alt_Stellwert) findet das Notify heraus, welches der beiden Relais (Funkschalter) er ansteuern und für welche Zeit (was in meinem Fall für 100 % 95 Sekunden sind.

FH_Stellwert {
  my $alt_stellwert = ReadingsVal("FBH_Stellwert","Alt_Stellwert",0);
  fhem ("setreading FBH_Stellwert Alt_Stellwert $EVENT");
  my $delta=($EVENT-$alt_stellwert)*.95;
  if ($delta > 0) {fhem("set FBH_Mischer_mehr on-for-timer $delta");}
  if ($delta < 0){$delta = -$delta; fhem("set FBH_Mischer_weniger on-for-timer $delta")};
  if (abs($delta) >30) {$delta = abs($delta)-30; sleep $delta}
}

Das ist es eigentlich schon.

Herzliche Grüße

Christian
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

John

@Udo
Wenn du unter "Namen" den Instanz-Namen verstehst, kann ich deine Anmerkung nicht nachvollziehen.

Initialize ist nicht instanzbezogen, sondern modulbezogen, oder ?

Also kann ich auch keinen Instanz-Namen angeben.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Steve

@Christian,

bis zum FBH-Stellwert funktioniert es super. Doch die Ansteuerung der Relais geht noch nicht.

Du schreibst das der "Alt_Stellwert" zwischengespeichert wird. Geschieht das mit dem Aktor-Modul
oder muß noch zusätzlich etwas erstellt werden?

Steve

cwagner

Hi Steve,

in der zweiten Zeile wird der Wert des Notifys zwischengespeichert:
fhem ("setreading FBH_Stellwert Alt_Stellwert $EVENT");

$EVENT beinhaltet den Wert des jeweils durch Veränderung auslösenden Stellwertes...

Herzliche Grüße

Christian
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

John

An alle Anwender von PID20.

Die aktuelle Version 1.00.h findet sich hier
http://forum.fhem.de/index.php?topic=17067.msg143065#msg143065
mit Anmerkungen.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

betateilchen

Hallo John,

Tipp: In der aktuellen Forumsoftware kannst Du auch alte Beiträge editieren, Du kannst also die aktuelle Modulversion immer in den ersten Beitrag hier im Thread ablegen. Dann kannst Du auch die Zwischenversionen, die im Verlauf der Entwicklung entstanden sind, hier wieder rausnehmen und eine Einheitlichkeit bei allen Anwendern herstellen.

Viele Grüße
Udo
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Steve

Hallo Christian,

bei mir wollen die Relais nicht zucken.
Bis zum FBH_Stellwert funktioniert alles.

Habe jetzt noch ein Dummy erstellt als "Alt_Stellwert".
Dort steht im Reading nur ein Fragezeichen. Sollte  nicht ein letzter  Meßwert  angezeigt werden? 

VG Steve

cwagner

Hi Steve,

ich versuche mal aus der Ferne mich Deinem Problem Schritt für Schritt anzunähern:

1. PID20 hast Du mit Johns Hilfe eingerichtet und in dem Dummy FBH_Stellwert hast Du nun stets drin stehen, welchen Prozentwert Dein Mischer haben sollte. Sobald PID20 diesen Stellwert verändert, springt das Notify an. Nehmen wir an, PID20 will 60
2. Das Notify ist definiert
define FBH_Notify FBH_Stellwert {
  my $alt_stellwert = ReadingsVal("FBH_Stellwert","Alt_Stellwert",0);
  fhem ("set  Alt_Stellwert $EVENT");
  my $delta=($EVENT-$alt_stellwert)*.95;
  if ($delta > 0) {fhem("set FBH_Mischer_mehr on-for-timer $delta");}
  if ($delta < 0){$delta = -$delta; fhem("set FBH_Mischer_weniger on-for-timer $delta")};
  if (abs($delta) >30) {$delta = abs($delta)-30; sleep $delta}
}
3. Sobald also erstmals eine Änderung des FBH_Stellwertes stattfand, sollte im Dummy Alt_Stellwert derselbe Wert stehen, nämlich 60
4. Damit ist das Delta für diese Runde 0 und Deine Relais zucken nicht.
5. PID20 fordert 65
6. Notify springt an und das Delta ist 5, mein Aktor FBH_MIscher-mehr bewegt sich um 5*0.95    (dieser Korrekturfaktor entsteht, weil bei mir der Mischer von 0 bis 100 eben nur 95 Sekunden braucht.
7. Im Alt_Stellwert steht nun 65

Hilft Dir das zum Umsetzen - für jedes der Relais brauchst Du in meiner Konstruktion also einen Aktor.

Herzliche Grüße

Christian
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Steve

Hallo Christian,

der "Alt_Stellwert" ändert sich nicht und somit gehen die Stellglieder(Relais)auch nicht.

Kannst du mal bitte schauen wo der Fehler ist.

Ich habe schon alles mögliche geändert aber ohne Erfolg

Danke Steve



#--------------------------------------------------------------------------
#                        PID_ Sensor+ Ausgabe
#-----------------------------------------------------------------------------
define FB_VL ECMDDevice ONEWIRE 107a7d90020800f5
attr FB_VL room Heizung
define 1Wire_FB_VL at +*00:01 set FB_VL messen;; sleep 1;; get FB_VL temperature
define Log_FB_VL FileLog /opt/fhem/log/Temperatur-%Y.log FB_VL:(temp).*
attr Log_FB_VL logtype text
#----------------------------------------------------------------------------
#                           PID Steuerung
#------------------------------------------------------------------------
define PID.Test PID20 FB_VL:temperature FBH_Stellwert
attr PID.Test pidActorInterval 3
attr PID.Test pidActorTreshold 5
attr PID.Test pidActorValueDecPlaces 0
attr PID.Test pidFactor_I 0.2
attr PID.Test pidFactor_P 10
#------------------------------------------------------------------------------
define PID.Test.File FileLog /opt/fhem/log/PID.PID-%Y.log FBH_Mischer_mehr:.*|FBH_Mischer_weniger:.*|FBH_Stellwert:.*|FB_VL:.*|PID.PID|PID.Test:actuation:.*|PID.Test:actuationCalc:.*|PID.Test:delta:.*|PID.Test:desired:.*|PID.Test:measured:.*|PID.Test:p_p:.*
attr PID.Test.File logtype text
#-------------------------------------------------------------------------
define SVG_PID.Test.File_1 SVG PID.Test.File:SVG_PID.Test.File_1:CURRENT
#-------------------------------------------------------------------------------
define Alt_Stellwert dummy
define FBH_Stellwert dummy
#---------------------------------------------------------------------------
#                     PID Steuerglieder
#--------------------------------------------------------------------------
#define FBH_Mischer_weniger ECMDDevice RELAIS 01
#define FBH_Mischer_mehr ECMDDevice RELAIS 02
define FBH_Mischer_weniger dummy
define FBH_Mischer_mehr dummy
#------------------------------------------------------------------------------
define Mischer notify FH_Stellwert {\
  my $alt_stellwert = ReadingsVal("FBH_Stellwert","Alt_Stellwert",0);;\
  fhem ("setreading FBH_Stellwert Alt_Stellwert $EVENT");;\
  my $delta=($EVENT-$alt_stellwert)*.95;;\
  if ($delta > 0) {fhem("set FBH_Mischer_mehr on-for-timer $delta");;}\
  if ($delta < 0){$delta = -$delta;; fhem("set FBH_Mischer_weniger on-for-timer $delta")};;\
  if (abs($delta) >30) {$delta = abs($delta)-30;; sleep $delta}\
}