Steuerung von Raumthermostaten mit Temperaturverlauf

Begonnen von Damian, 22 Dezember 2024, 12:05:22

Vorheriges Thema - Nächstes Thema

Damian

Mit folgender Definition lassen sich Raumthermostate zentral per GUI steuern. Sowohl die Temperaturverläufe der Zimmer als auch die Zustände der Ventile (offen/geschlossen) werden zeitlich visualisiert.

Voraussetzung sind Thermostate, die die Raumtemperatur messen und durch Vorgabe der Solltemperatur Heizungsventile öffnen bzw. schließen.

In der Definition wird nach Werktagen und Wochenende/Feiertagen unterschieden. Pro Tag sind zwei Heizperioden vordefiniert. Es können weitere Heizperioden pro Tag hinzugefügt werden oder die Anzahl der Heizperioden auf eine pro Tag reduziert werden. Pro Heizperiode wird die Solltemperatur des Raumes angegeben. Außerhalb der Heizzeiten gilt die Absenktemperatur (voreingestellt ist 1 Grad Absenkung).

Die Steuerung lässt sich pro Raum aktivieren bzw. deaktivieren. Ebenfalls lässt sich die aktuelle Solltemperatur pro Raum manuell einstellen.

Ich nutze die Definition in Verbindung mit einer Fußbodenheizung. Die Raumthermostate werden in den push-Zeilen definiert. Die Vorgabe der Temperatur wird per set ... desired-temp vorgenommen. Die Codezeile muss ggf. für eigene Thermostate angepasst werden.

Ergebnis der Definition siehe Screenshot.

defmod di_Therm DOIF subs  {\
## Voreinstellung der Schaltzeitpunkte, die Liste kann angepasst werden bzw. durch Hinzufügen weiterer Spalten erweitert werden\
@{$_day}= qw(vormittags nachmittags);;\
@{$_Timer_default_at_on} = qw(04:30 12:00);;\
@{$_Timer_default_at_off} = qw(09:00 23:00);;\
@{$_Timer_default_we_on} = qw(05:30 12:00);;\
@{$_Timer_default_we_off} = qw(10:00 00:00);;\
\
$_temp_default_at=19;; ## Wunschtemperaturvorgabe für Arbeitstage\
$_temp_default_we=20;; ## Wunschtemperaturvorgabe fürs Wochenende\
$_temp_default_diff=1;; ## Reduzierung der Wunschtemperatur außerhalb der Heizzeiten um X-Grad\
set_Reading("corr",0);;\
\
delete $_sc;;\
## Angaben: Raumbezeichnung, Thermostat, Schalter/Stellantrieb;; Angaben werden zeilenweise pro Raum hinzugefügt\
push (@{$_sc},[qw(Bad TH_Bad_HM H_Bad)]);;\
push (@{$_sc},[qw(Dachgeschoss TH_DG_HM H_DG)]);;\
push (@{$_sc},[qw(Kueche TH_Kueche_HM H_Kueche)]);;\
push (@{$_sc},[qw(Kinder_ost TH_Kz_o_HM H_Kz_o)]);;\
push (@{$_sc},[qw(Kinder_west TH_Kz_w_HM H_Kz_w)]);;\
push (@{$_sc},[qw(Wohnzimmer TH_WZ_HM H_WZ)]);;\
push (@{$_sc},[qw(Schlafzimmer TH_Keller_HM H_Keller)]);;\
push (@{$_sc},[qw(Bad_Kl TH_Bad_Keller_HM H_Bad_Keller)]);;\
push (@{$_sc},[qw(Keller TH_AKeller_HM H_AKeller)]);;\
\
## Bei Initialisierung oder Änderung der Definition werden Timer-Readings und Temperatur-Readings erstellt und vorbelegt\
if ($::init_done) {\
    fhem("deletereading $SELF .*");;   ## Lösche alle Readings\
for (my $j=0;;$j<@{$_day};;$j++)  { ## Für alle Timer\
  set_Reading("$_day[$j]_AT_on",$_Timer_default_at_on[$j]);; ## Vorbelegung der on Zeit für Arbeitstage\
  set_Reading("$_day[$j]_AT_off",$_Timer_default_at_off[$j]);; ## Vorbelegung der off Zeit für Arbeitstage\
  set_Reading("$_day[$j]_WE_on",$_Timer_default_we_on[$j]);; ## Vorbelegung der on Zeit für Wochenende\
  set_Reading("$_day[$j]_WE_off",$_Timer_default_we_off[$j]);; ## Vorbelegung der off Zeit für Wochenende\
      for (my $i=0;;$i < @{$_sc};;$i++)  { ## Vorbelegung der Wunschtemperaturen für alle Räume\
     set_Reading("$_sc[$i][0]_mode","auto");;\
     set_Reading("$_sc[$i][0]_temp_$_day[$j]_AT",$_temp_default_at);;\
set_Reading("$_sc[$i][0]_temp_$_day[$j]_WE",$_temp_default_we);;\
  }\
}\
}\
\
sub temp_set { ## Routine zum Setzen der Wunschtemperaturen aller Räume für einen Zeitpunkt\
  my ($day,$ATWE,$onoff)=@_;;\
  for (my $i=0;;$i< @{$_sc};;$i++)  {\
fhem_set("$_sc[$i][1] desired-temp ".(get_Reading ("$_sc[$i][0]_temp_".$day."_$ATWE")-($onoff eq "on" ? 0:1))) if (get_Reading("$_sc[$i][0]_mode") eq "auto");;\
  }\
}\
} ## subs\
\
DEF TPL_set_temp ( ## Definition des Templates namens TPL_set_temp zum Setzen der Thermostat-Vorgabetemperatur\
Timer_$1_$2_$3 {[[$SELF:$1_$2_$3]|$2];;temp_set("$1","$2","$3")}  ## Block zum Setzen der Wunschtemperatur, Parameter: $1: Schaltzeitpunkt, $2:Wochentag, $3: on/off\
) ## TPL_set_temp\
\
## Generierung der Steuerung pro Raum mit Hilfe des obigen Templates\
FOR(@{$_day},TPL_set_temp($1,AT,on))\
FOR(@{$_day},TPL_set_temp($1,AT,off))\
FOR(@{$_day},TPL_set_temp($1,WE,on))\
FOR(@{$_day},TPL_set_temp($1,WE,off))
attr di_Therm uiTable {\
  package ui_Table;;\
  $TABLE='text-align:right;;';;\
  $TD{0}{2..6} = "align='center'";;\
  $TC{0}="align='left'";;\
  \
  sub onoff_hue {\
    my($redblue)=@_;;\
    return ($redblue == 0 ? 240 : 0);;  \
  }\
}\
\
|""|FOR (@{$_day},"$1"|)""\
""|"Arbeitstage on"|FOR (@{$_day},WID([$SELF:$1_AT_on],"time")|)""\
""|"off"|FOR (@{$_day},WID([$SELF:$1_AT_off],"time")|)""\
""|"Wochenende on"|FOR (@{$_day},WID([$SELF:$1_WE_on],"time")|)""\
""|"off"|FOR (@{$_day},WID([$SELF:$1_WE_off],"time")|)""\
FOR (@{$_sc},\
  ( card([$1$2:measured-temp:col1d],undef,\
         [$1$3:state] eq "off" ? "sani_floor_heating_neutral\@silver" : "sani_floor_heating\@red" ,15,25,\
         undef,undef,"°C",\&temp_hue,"1,,fill:silver","130,1,1,1,1,,200",\
         undef,undef,[$1$3:state:col1d:$_ eq "on" ? 1:0],0,5,0,0,"I-O",\&onoff_hue,"0,,fill:silver")|\
style("$1$1","white").":",,"Modus:".widget([$SELF:$1$1_mode],"select,auto,off"),"aktuell:".widget([$1$2:desired-temp],"selectnumbers,17,0.5,22,1,lin","set")|\
    FOR(@{$_day},\
      ("",,"AT: ".widget([$SELF:$1$1_temp_$2_AT],"selectnumbers,17,0.5,22,1,lin"),"WE: ".widget([$SELF:$1$1_temp_$2_WE],"selectnumbers,17,0.5,22,1,lin")|))\
    ""\
  )\
)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF