Fussbodenheizung mit PWM steuern

Begonnen von jamesgo, 24 September 2015, 08:28:49

Vorheriges Thema - Nächstes Thema

Kornelius777

#870
Kurz nochmal ausholen:

Ich habe jetzt den OverallHeatingSwitch per setreading hinzugefügt.
Bedeutet: Er steht jetzt zwar unter "Readings", nicht jedoch unter "Internals".

Ist das so richtig? Oder wie bekomme ich den nachträglich hinzugefügt?

EDIT: Habe ihn jetzt einfach mit defmod hinzugenommen. Aber wie bekomme ich OverallHeatingSwitchWaitBeforeOn bzw OverallHeatingSwitchWaitUntilOff rein?
Ich hätte gerne
OverallHeatingSwitchWaitBeforeOn=150
OverallHeatingSwitchWaitUntilOff=960

Bin ich richtig, wenn ich sage:
60 900 120 1 99,99 0,0,0 ESPEasy_ESP_Easy_HzgHauptschalter_HeizungHauptschalter,0,960,on,150


EDIT2:

AH!   8)
Ich stelle fest: Es klappt!
OverallHeatingSwitchWaitBeforeOn und OverallHeatingSwitchWaitUntilOff sind also ERRECHNETE ZEITANGABEN!
Verstehe!

jamesgo

Hallo Kornelius,
schick doch mal die Ausgabe von
- list ESPEasy_ESP_Easy_SW3_WoZi
- den define von ESPEasy_ESP_Easy_SW3_WoZi

Bei mir sind alle Aktoren vom Typ "RBRelais". ESPEasy hab ich noch nicht im Einsatz gesehen.

Danke
Andreas

Zitat von: Kornelius777 am 08 November 2021, 17:15:36
Mein Aktor ist jeweils ein Sonoff-Switch (modifiziert mit ESPEasy)
Die sehen alle gleich aus - bis auf die verschiedenen GPIOs
Hier z.B. der Schalter vom Wohnzimmer:

defmod ESPEasy_ESP_Easy_SW3_WoZi ESPEasy 192.168.150.220 80 espbridge ESP_Easy_SW3_WoZi
attr ESPEasy_ESP_Easy_SW3_WoZi DbLogExclude .*
attr ESPEasy_ESP_Easy_SW3_WoZi DbLogInclude Relay,RelayPlot
attr ESPEasy_ESP_Easy_SW3_WoZi Interval 300
attr ESPEasy_ESP_Easy_SW3_WoZi eventMap /gpio 12 on:on/gpio 12 off:off/gpio 12 gpio:off/gpio 12 output:off/
attr ESPEasy_ESP_Easy_SW3_WoZi group ESPEasy Device
attr ESPEasy_ESP_Easy_SW3_WoZi presenceCheck 1
attr ESPEasy_ESP_Easy_SW3_WoZi readingSwitchText 1
attr ESPEasy_ESP_Easy_SW3_WoZi room ESPEasy,Wohnzimmer
attr ESPEasy_ESP_Easy_SW3_WoZi setState 3
attr ESPEasy_ESP_Easy_SW3_WoZi userReadings RelayPlot {ReadingsVal("ESPEasy_ESP_Easy_SW3_WoZi","Relay",0) eq "on"?1:0}

setstate ESPEasy_ESP_Easy_SW3_WoZi Rel: on
setstate ESPEasy_ESP_Easy_SW3_WoZi 2021-11-08 05:12:01 IODev espbridge
setstate ESPEasy_ESP_Easy_SW3_WoZi 2021-11-08 17:12:09 Relay on
setstate ESPEasy_ESP_Easy_SW3_WoZi 2021-11-08 17:12:48 RelayPlot 1
setstate ESPEasy_ESP_Easy_SW3_WoZi 2021-11-08 17:12:48 presence present
setstate ESPEasy_ESP_Easy_SW3_WoZi 2021-11-08 17:12:48 state Rel: on



jamesgo

ja, die "Internals" sind die lesbare Variante der Definition und die Reading sind die "Hilfsvariablen" die für die Berechnung verwendet werden. Wenn eine Berechnung abgeschalten ist braucht man die entsprechenden Variablen nicht und umgekehrt. Attribute erweitern den Funktionsumfang, sie verändern auch die "Internals".

Zitat von: Kornelius777 am 08 November 2021, 17:19:00
Kurz nochmal ausholen:

Ich habe jetzt den OverallHeatingSwitch per setreading hinzugefügt.
Bedeutet: Er steht jetzt zwar unter "Readings", nicht jedoch unter "Internals".

Ist das so richtig? Oder wie bekomme ich den nachträglich hinzugefügt?

EDIT: Habe ihn jetzt einfach mit defmod hinzugenommen. Aber wie bekomme ich OverallHeatingSwitchWaitBeforeOn bzw OverallHeatingSwitchWaitUntilOff rein?
Ich hätte gerne
OverallHeatingSwitchWaitBeforeOn=150
OverallHeatingSwitchWaitUntilOff=960

Bin ich richtig, wenn ich sage:
60 900 120 1 99,99 0,0,0 ESPEasy_ESP_Easy_HzgHauptschalter_HeizungHauptschalter,0,960,on,150


EDIT2:

AH!   8)
Ich stelle fest: Es klappt!
OverallHeatingSwitchWaitBeforeOn und OverallHeatingSwitchWaitUntilOff sind also ERRECHNETE ZEITANGABEN!
Verstehe!

Kornelius777

#873
okay...
hier kommt das "list":

Internals:
   DEF        192.168.150.220 80 espbridge ESP_Easy_SW3_WoZi
   ESP_BUILD  20115
   ESP_BUILD_GIT pygit2_not_installed
   ESP_BUILD_NOTES  - Mega
   ESP_NODE_TYPE_ID ESP Easy Mega
   ESP_SLEEP  0
   ESP_UNIT   0
   ESP_VERSION 2
   FUUID      6186af49-f33f-f563-6068-3fabf1c495ba0c4a
   HOST       192.168.150.220
   IDENT      ESP_Easy_SW3_WoZi
   INTERVAL   300
   IODev      espbridge
   LASTInputDev espbridge
   MAX_CMD_DURATION 1
   MSGCNT     177
   NAME       ESPEasy_ESP_Easy_SW3_WoZi
   NOTIFYDEV  global
   NR         162
   NTFY_ORDER 50-ESPEasy_ESP_Easy_SW3_WoZi
   PORT       80
   STATE      Rel: on
   SUBTYPE    device
   TYPE       ESPEasy
   VERSION    2.18
   espbridge_MSGCNT 177
   espbridge_TIME 2021-11-08 19:32:09
   Helper:
     DBLOG:
       Relay:
         DBLogging:
           TIME       1636396329.19406
           VALUE      on
       RelayPlot:
         DBLogging:
           TIME       1636396456.89576
           VALUE      1
   READINGS:
     2021-11-08 05:12:01   IODev           espbridge
     2021-11-08 19:32:09   Relay           on
     2021-11-08 19:34:16   RelayPlot       1
     2021-11-08 19:34:16   presence        present
     2021-11-08 19:34:16   state           Rel: on
   helper:
     fpc        1636344740
     pm:
       Encode     1
       JSON       1
     received:
       Relay      1636396329
   sec:
     admpwd     
Attributes:
   DbLogExclude .*
   DbLogInclude Relay,RelayPlot
   Interval   300
   eventMap   /gpio 12 on:on/gpio 12 off:off/gpio 12 gpio:off/gpio 12 output:off/
   group      ESPEasy Device
   presenceCheck 1
   readingSwitchText 1
   room       ESPEasy,Wohnzimmer
   setState   3
   userReadings RelayPlot {ReadingsVal("ESPEasy_ESP_Easy_SW3_WoZi","Relay",0) eq "on"?1:0}


...und hier die Definition:

defmod ESPEasy_ESP_Easy_SW3_WoZi ESPEasy 192.168.150.220 80 espbridge ESP_Easy_SW3_WoZi
attr ESPEasy_ESP_Easy_SW3_WoZi DbLogExclude .*
attr ESPEasy_ESP_Easy_SW3_WoZi DbLogInclude Relay,RelayPlot
attr ESPEasy_ESP_Easy_SW3_WoZi Interval 300
attr ESPEasy_ESP_Easy_SW3_WoZi eventMap /gpio 12 on:on/gpio 12 off:off/gpio 12 gpio:off/gpio 12 output:off/
attr ESPEasy_ESP_Easy_SW3_WoZi group ESPEasy Device
attr ESPEasy_ESP_Easy_SW3_WoZi presenceCheck 1
attr ESPEasy_ESP_Easy_SW3_WoZi readingSwitchText 1
attr ESPEasy_ESP_Easy_SW3_WoZi room ESPEasy,Wohnzimmer
attr ESPEasy_ESP_Easy_SW3_WoZi setState 3
attr ESPEasy_ESP_Easy_SW3_WoZi userReadings RelayPlot {ReadingsVal("ESPEasy_ESP_Easy_SW3_WoZi","Relay",0) eq "on"?1:0}

setstate ESPEasy_ESP_Easy_SW3_WoZi Rel: on
setstate ESPEasy_ESP_Easy_SW3_WoZi 2021-11-08 05:12:01 IODev espbridge
setstate ESPEasy_ESP_Easy_SW3_WoZi 2021-11-08 19:37:09 Relay on
setstate ESPEasy_ESP_Easy_SW3_WoZi 2021-11-08 19:37:09 RelayPlot 1
setstate ESPEasy_ESP_Easy_SW3_WoZi 2021-11-08 19:34:16 presence present
setstate ESPEasy_ESP_Easy_SW3_WoZi 2021-11-08 19:37:09 state Rel: on




Wunderbar: alles an...

ABER:
Sag mal....
kann es sein, dass du zwar bei "maxOffTime 4:00,D,1:00,2.0" die Heizkreise anschaltest, aber der OverallHeatingSwitch off bleibt?
Bei mir ist das gerade so.

...nicht gut...

...ich schalte die Heizung mal lieber manuell wieder an...

jamesgo

Der STATE von dem ESPEasy Aktor ist "Rel: on" und nicht  "on". Das bedeutet du musst den regexp dafür anpassen. Beim PWMR an den Aktor noch ":.*on" anhängen, dann kann er beim starten auch den Status richtig auslesen.

maxOffTime setzt einen Raum auf "on" und den puls auf MaxPulse. Dh. das fliesst in die Berechnung des OverallHeatingSwitch ein. Bitte nochmal den OverallHeatingSwitch kontrollieren. Die OverallHeatingSwitch_delayTimeOn wird natürlich eingehalten. D.h. es wird nicht sofort eingeschaltet.

Evtl. nochmal die Definition des PWM posten.

Kornelius777

Herzlichen Dank!
Ich glaube, dieses letzte Detail hat es komplett gemacht.
Jetzt muss ich nur noch ein bisschen an den Temperaturen schrauben.

Nochmal vielen Dank für die tolle Implementierung!

Grüße!

Kornelius

Kornelius777

@jamesgo:

Ich nutze für PWM "verbose=2". Mein Log wird allerdings geflutet mit Nachrichten
PWM_Calculate: FBHzg: OverallHeatingSwitch wait for followUpTime before switching off
Kannst du diese Nachricht in die verbose-Stufe "3" packen?

Dankeschön!

Grüße!

Kornelius

jamesgo

#877
Hallo Kornelius,
ja, da hast du recht. Ich werde das bei Gelegenheit ändern. Habe das geändert und hochgeladen. Ab morgen steht es dann mit "update" zur Verfügung.

Viele Grüße
Andreas

Kornelius777


sash.sc

Hallo zusammen.

Wollte mal fragen ob es möglich ist mit den pwm einen Dimmer zu steuern?
Wollte einen thermischen Antrieb über einen dimmer steuern.
Oder wäre da ein pid Regler besser?

Gruß Sascha
Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

jamesgo

Hallo Sascha,

ich verstehe dein Problem bzw. deinen Lösungsansatz nicht wirklich.

Die thermischen Stellantriebe einer Fussbodenheizung kennen nur an oder aus und sind sehr träge. Ein aus/an Zyklus kann dann schon mal 180 Sekunden dauern. PWM bedeutet in diesem Zusammenhang dass ein errechneter Puls von 30 Prozent auf einer default Zeitspanne von 15 Minuten zu 5 Minuten an und 10 Minuten aus führt. (Bei Heizkörpern würde man die Durchflussmenge auf 30% regulieren).

Der verwendete Algorithmus für die Regelung der Temperatur bzw. die Berechnung des Pulses ist PID. Die Neuberechnung des Pulses passiert normalerweise alle 60 Sekunden.

Ein Dimmer (z.B. für Beleuchtung) würde nach meinem Verständnis Pulse kleiner als 60 Herz (60/Sekunde) verwenden - das passt nicht zur Steuerung einer Heizung.

Viele Grüße
Andreas

Kornelius777

Sag mal, Andreas....

hast Du etwas an maxOffTime geändert?
Gestern hat es noch geklappt, aber heute lief es nicht mehr.
Mein maxOffTime ist "4:00,D,0:15,2.0", aber in keinem einzigen Raum wurde es heute angesteuert...

Viele Grüße!

Kornelius

jamesgo

Hallo Kornelius,
Nein, da wurde nichts geändert.
Wie war denn die Temperatur? Mehr als 2 Grad über dem Soll?
Beim PWM gibt es auch noch zwei Parameter. Hast du daran gedreht?
Grüße Andreas

Kornelius777

#883
Hallo Andreas,

ich stelle gerade ein Verhalten der Steuerung fest, das ich mir nicht erklären kann.

Ausgangspunkt: Um die Stellantriebe zumindest ein bisschen zu schonen, bin ich dazu übergegangen, im PWM-Modul die Cycletime auf 3600 (also eine Stunde) einzustellen:

Internals:
   CYCLETIME  3600
   DEF        60 3600 240 1 99,99 0,0,0 HeizungHauptschalter,0,15000,on,150
   FUUID      6186287f-f33f-f563-f596-eedcb2a2866e34f9
   INTERVAL   60
   MINONOFFTIME 240
   MaxPulse   1
   MaxSwitchOffPerCycle 99
   MaxSwitchOnPerCycle 99
   NAME       FBHzg
   NR         150
   NoRoomsToStayOff 0
   NoRoomsToStayOn 0
   NoRoomsToStayOnThreshold 0
   OverallHeatingSwitch HeizungHauptschalter
   OverallHeatingSwitch_delayTimeOn 150
   OverallHeatingSwitch_followUpTime 15000
   OverallHeatingSwitch_regexp_on on
   OverallHeatingSwitch_roomBased on
   OverallHeatingSwitch_threshold 0
   STATE      lastrun: 2021-11-16 06:49:53
   TYPE       PWM
   c_maxOffTimeCalculation on
   c_maxOffTimeMode 3
   p_cycletime 3600
   p_interval 60
   p_maxPulse 1
   p_minOnOfftime 240
   p_overallHeatingSwitch HeizungHauptschalter,0,15000,on,150
   p_roomsMinOnOffThreshold 0,0,0
   READINGS:
     2021-11-15 17:28:50   OverallHeatingSwitch on
     2021-11-16 06:49:53   OverallHeatingSwitchWaitBeforeOn
     2021-11-16 06:49:53   OverallHeatingSwitchWaitUntilOff
     2021-11-16 06:49:53   avgPulseRoomsOff 0.12
     2021-11-16 06:49:53   avgPulseRoomsOn 0.29
     2021-11-16 06:49:53   lastrun         calculating
     2021-11-16 06:49:53   pulseAvg        0.17
     2021-11-16 06:49:53   pulseAvg2       0.31
     2021-11-16 06:49:53   pulseAvg3       0.25
     2021-11-16 06:49:53   pulseMax        0.47
     2021-11-16 06:49:53   pulseSum        1.18
     2021-11-16 06:49:53   roomsActive     7
     2021-11-16 06:49:53   roomsOff        5
     2021-11-16 06:49:53   roomsOn         2
     2021-11-16 06:49:53   roomsToStayOn   0
     2021-11-16 06:49:53   roomsToStayOnList
     2021-11-16 06:49:53   state           lastrun: 2021-11-16 06:49:53
   helper:
     pulses:
       FBHzg_ArbZi 0.11 / 0
       FBHzg_EssZi 0.15 / 0
       FBHzg_GaesteZi 0.11 / 0
       FBHzg_Kueche 0.47 / 0
       FBHzg_SchlafZi 0.11 / 0
       FBHzg_Studio 0.11 / 0
       FBHzg_WoZi 0.12 / 0
Attributes:
   DbLogExclude .*
   maxOffTimeCalculation on
   maxOffTimeMode 3
   room       Heizungsraum
   verbose    1


Seit der Veränderung der Cycletime zeigt sich allerdings dieses Verhalten:
Obwohl in einigen Räumen die Soll-Temperatur schon längst erreicht ist, wird die Fußbodenheizung pro Zyklus für mehrere Minuten eingeschaltet.
Ich hänge mal ein Bild zur Verdeutlichung an.

Das PWMR-Modul für das Studio sieht bei mir so aus:

Internals:
   ACTOR      ESPEasy_ESP_Easy_SW1_Studio:.*on
   DEF        FBHzg 1,0.11 ESPEasy_ESP_Easy_Studio_Temperatur_Studio:temperature ESPEasy_ESP_Easy_SW1_Studio:.*on
   FUUID      61866979-f33f-f563-b0f4-415216d57b36b72f
   INTERVAL   300
   IODev      FBHzg
   NAME       FBHzg_Studio
   NR         151
   STATE      Calculating
   TEMPSENSOR ESPEasy_ESP_Easy_Studio_Temperatur_Studio:temperature
   TYPE       PWMR
   WINDOW     
   a_regexp_on .*on
   actor      ESPEasy_ESP_Easy_SW1_Studio
   c_PID_useit 0
   c_autoCalcTemp 1
   c_desiredTempFrom
   c_factor   1
   c_foffset  0.11
   c_frostProtect 0
   c_tempC    22
   c_tempD    20
   c_tempE    19
   c_tempFrostProtect 6
   c_tempN    16
   c_tempRule1 1-0 0000,D
   c_tempRule2
   c_tempRule3
   c_tempRule4
   c_tempRule5
   c_tempRuleS D
   p_actor    ESPEasy_ESP_Easy_SW1_Studio:.*on
   p_factor   1,0.11
   p_maxOffTime 240
   p_maxOffTimePeriod 20
   p_maxOffTimeSelector D
   p_maxOffTimeTempLimit 1.0
   p_pid     
   p_tsensor  ESPEasy_ESP_Easy_Studio_Temperatur_Studio:temperature
   p_window   
   t_reading  temperature
   t_regexp   ([\d\.]+)
   t_sensor   ESPEasy_ESP_Easy_Studio_Temperatur_Studio
   w_regexp   .*[Oo]pen.*
   windows   
   READINGS:
     2021-11-16 06:54:53   PWMOnTime       06:36
     2021-11-16 06:54:53   PWMPulse        11
     2021-11-16 06:48:53   actorState      off
     2021-11-16 06:55:09   desired-temp    20.0
     2021-11-06 13:40:47   desired-temp-until no
     2021-11-16 06:54:53   desired-temp-used 20.0
     2021-11-16 06:54:53   energyused      000000000000000011111110000000
     2021-11-16 06:54:53   energyusedp     23.3
     2021-11-16 06:48:53   lastswitch      1637041733
     2021-11-06 13:36:33   manualTempDuration 0
     2021-11-16 06:54:53   oldpulse        0.11
     2021-11-16 06:55:09   state           Calculating
     2021-11-16 06:54:53   temperature     21.7
     2021-11-12 13:55:47   timer1_Mo       00:00-23:59,D,20
     2021-11-12 13:55:47   timer2_Di       00:00-23:59,D,20
     2021-11-12 13:55:47   timer3_Mi       00:00-23:59,D,20
     2021-11-12 13:55:47   timer4_Do       00:00-23:59,D,20
     2021-11-12 13:55:47   timer5_Fr       00:00-23:59,D,20
     2021-11-12 13:55:47   timer6_Sa       00:00-23:59,D,20
     2021-11-12 13:55:47   timer7_So       00:00-23:59,D,20
   helper:
Attributes:
   DbLogExclude .*
   maxOffTime 4:00,D,0:20,1.0
   room       Heizungsraum,Studio
   tempRule1  Mo-So 0:00,D
   verbose    2


Woran kann das liegen, dass hier - trotz Überschreitung des Soll-Wertes - weiterhin geheizt wird?

Danke dir für deine Hilfe!

Grüße!

Kornelius

jamesgo

#884
Hallo Kornelius,

bei thermodynamischen Stellantrieben, wie sie bei Fußbodenheizungen verwendet werden, gibt es im Prinzip keinen Verschleiß, da die Bewegung durch Federspannung und dem Erhitzen bzw. Abkühlen eines Mediums erfolgt. Über den Energiebedarf pro Stellvorgang kann man sich natürlich Gedanken machen aber diese Antriebe halten sehr lange durch.

Der Offset von 0.11 in der Berechnung in Verbindung mit der Zykluszeit von 3600 führt dazu dass ein "Bedarf" von 0.11*3600 = 396 errechnet wird und das ist mehr als die Minimale Schaltzeit von 240. D.h. einmal pro Zyklus für 396 Sekunden "on". Konfiguriert - Berechnet - Geschalten ...

Was mir auffällt ist dass du nicht den PID Regler verwendest, sondern die reine Temperaturdifferenz. Das war meine erste Implementierung und sie neigt zu kleinen Pulsen - was dich vermutlich gestört und dazu gebracht hat die Zykluszeit zu erhöhen.

Stelle doch auf PID um indem du bei dem PWMR folgendes anhängst "dummy 1:0.8:0.3,22:0.5,10". Diese Berechnungsmethode funktioniert besser als die reine P-Regelung (und der Offset findet dort keine Verwendung)

Viele Grüße
Andreas